Commit 2e3cbd92 authored by Dustin Gawron's avatar Dustin Gawron

Update auf SecDoc v1.2

* Berechtigungsverwaltung
* TOM-Liste
* Einfacher Docker-Support
parent 133e7331
node_modules
bower_components
.htaccess
.htsslaccess
.htssoaccess
.svn
assets/vendor
FROM php:7.2-apache
COPY / /var/www/html/
RUN chmod -R 755 /var/www/html/
RUN chown -R www-data /var/www/html/
EXPOSE 80/tcp
# SecDoc - WWU Verzeichnis von Verarbeitungstätigkeiten (VVT)
Webinterface zur Dokumentation von (IT-)Verfahren an der WWU im Rahmen der EU-Datenschutzgrundverordnung (DSGVO).
Webinterface zur Erfassung von Verarbeitungstätigkeiten und IT-Verfahren an der WWU im Rahmen der EU-Datenschutzgrundverordnung (DSGVO).
* Produktivsystem: https://www.uni-muenster.de/ZIV.CERT/secdoc
* Entwicklungssystem: https://www.uni-muenster.de/ZIVtest/secdoc
......@@ -10,14 +10,15 @@ Webinterface zur Dokumentation von (IT-)Verfahren an der WWU im Rahmen der EU-Da
- Basiert auf Vorlage für das Verzeichnis von Verarbeitungstätigkeiten (VTT) von ZENDAS (https://www.zendas.de)
- Bietet integrierte Ausfüllhinweise
- Bietet integrierte Datenvorschläge aus Nutzerdatenbank (WWUben), Netzdatenbank (LANbase), sowie CPE-Verzeichnis des NIST
- Bietet automatische Speicherung und Verwaltung Ihrer Verfahren
- Verwendet Bootstrap Wizard für HTML-Formular
- Bietet Datenvorschläge aus vorhandenen Datenbanken (z.B. Nutzerdatenbank (WWUben), Netzdatenbank (LANbase), sowie CPE-Verzeichnis des NIST)
- Automatische Speicherung und einfache Verwaltung von Verarbeitungstätigkeiten
- Spätere Fortsetzung oder Bearbeitung möglich
- Erstellt abschließend eine PDF-Version des Verfahrens
- Speichert Daten in SQLite-Datenbank und als JSON zur externen Weiterverarbeitung
- Erstellt abschließend eine PDF-Version der Verarbeitungstätigkeit
- Verwendet Bootstrap Wizard für HTML-Formular
- Speichert Daten in SQLite-Datenbank und als JSON zur späteren evtl. externen Weiterverarbeitung
- Eingetragene Informationen können einfach ergänzend zur Datenschutzerklärung auf Webseiten eingebunden werden
- Bietet eine Übersicht aller gemeldeten Verfahren für Datenschutzbeauftragte (Einsicht, Kommentare und Bearbeitung möglich)
- Bietet eine Übersicht aller gemeldeten Verarbeitungstätigkeiten für Datenschutzbeauftragte (Einsicht, Kommentare und Bearbeitung möglich)
- Erzeugt das Verzeichnis von Verarbeitungstätigkeiten
## Abhängigkeiten
......@@ -38,7 +39,13 @@ Webinterface zur Dokumentation von (IT-)Verfahren an der WWU im Rahmen der EU-Da
- [MPDF 7](https://github.com/mpdf/mpdf) (Für die PDF-Erstellung genutzt)
## Verwendung
## Verwendung - Docker
Eine Demo-Version kann einfach mittels Docker gestartet werden über die Konfigurationsdatei [Dockerfile](Dockerfile). Hierfür kann mit `docker build -t secdoc . ` ein Image gebaut werden und mit `sudo docker run -d --name secdoc-app secdoc` der Container gestartet werden. Hierfür wird eine Demo-Datenbank geladen.
**Hinweis:** Aktuell unterstützt diese Methode nicht die PDF-Funktion, dies wird aber mit dem nächsten Update behoben.
## Verwendung - Normale Installation
### Voraussetzungen
......@@ -53,7 +60,7 @@ Beim ersten Aufruf der Anwendung wird automatisch eine neue Datenbank mit den no
Zur Nutzung der PDF-Ausgabe muss zusätzlich noch das MPDF Plugin installiert werden. Dies geschieht über [Composer](https://getcomposer.org/) mit der Konfigurationsdatei [composer.json](/assets/composer.json) (`php composer.phar install -d <Pfad zur composer.json>`). Das Backend erwartet den Autoloader `autoload.php` im Pfad [/assets/vendor](/assets/vendor). Sollte MPDF bereits vorhanden sein oder an einer anderen Stelle installiert werden, kann der Pfad über `$vendor_dir` in [config.inc.php](/assets/ajax/config.inc.php) angepasst werden.
**Achtung:** Das System bietet keinen allgemeinen Zugriffsschutz (z.B. durch Registrierung und Login-Mechanismus), sondern hat nur die Möglichkeit, die Anzeige von Verfahren zu unterbinden, wenn eine Nutzerkennung oder Nutzergruppen bereitsgestellt wurden, die überprüft werden können. Dies geschieht in unserem System mittels SSO-Mechanismus (Single Sign On) und einem externen Funktionsaufruf zum Erlangen der Nutzergruppen, die im PHP-Skript überprüft werden. Der allgemeine Zugriffsschutz wird über `.htaccess`-Dateien mit Nutzergruppeneinschränkungen realisiert.
**Achtung:** Das System bietet keinen allgemeinen Zugriffsschutz (z.B. durch Registrierung und Login-Mechanismus), sondern hat nur die Möglichkeit, die Anzeige von Verarbeitungstätigkeiten zu unterbinden, wenn eine Nutzerkennung oder Nutzergruppen bereitsgestellt wurden, die überprüft werden können. Dies geschieht in unserem System mittels SSO-Mechanismus (Single Sign On) und einem externen Funktionsaufruf zum Erlangen der Nutzergruppen, die im PHP-Skript überprüft werden. Der allgemeine Zugriffsschutz wird über `.htaccess`-Dateien mit Nutzergruppeneinschränkungen realisiert.
### Notwendige Anpassungen
......@@ -64,7 +71,7 @@ Um das System in der eigenen Umgebung zu nutzen, sind einige Anpassungen bzw. Da
1. **Aussehen und allgemeine Verfahrensangaben**
Die Logos, Links und das Hintergrundbild auf der Hauptseite sollten an die eigene Hochschule angepasst werden (siehe [index.html](index.html)).
Darüber hinaus werden dort auch die allgemeinen Informationen für Verfahren, wie z.B. Anschrift der Hochschule, Angaben zum Datenschutzbeauftragten, etc., festgelegt. Diese müssen auch angepasst werden und sind hier zu finden [index.html#L168-188](index.html#L168-188).
Darüber hinaus werden dort auch die allgemeinen Informationen für Verarbeitungstätigkeiten, wie z.B. Anschrift der Hochschule, Angaben zum Datenschutzbeauftragten, etc., festgelegt. Diese müssen auch angepasst werden und sind hier zu finden [index.html#L168-188](index.html#L168-188).
Die Logos in der PDF sollten ebenfalls angepasst werden. Dafür können zwei Logos (`logo1.png` und `logo2.png`) in [/assets/img](/assets/img) hinterlegt werden, die genutzt werden.
Alternativ können die Pfade angepasst werden in der Funktion `generatePDF()` in [/assets/ajax/verwaltung.php](/assets/ajax/verwaltung.php). Zu Beginn dieser Funktion können auch die PDF-Metadaten angepasst werden.
......@@ -79,14 +86,14 @@ Um das System in der eigenen Umgebung zu nutzen, sind einige Anpassungen bzw. Da
Das Backend benötigt einige Funktionen, die spezifisch zu unserem System sind und müssen angepasst werden. Diese sind in der Datei [Utils.class.php](/assets/ajax/Utils.class.php) zu finden.
Insbesondere zählen hierzu:
- `searchipdns($term)` Durchsucht die Netzdatenbank nach Servern (für Eingabehilfe im Formular der Systeme)
- `imapSendMimeMail($to, $cc, $bcc, $subject, $body, $attachments)` Verschickt eine signierte E-Mail mit Anhängen (für den Abschluss des Verfahrens)
- `getUserGroups($userId)` Fragt die aktuellen Nutzergruppen zu einer Kennung ab (zur Überprüfung von Berechtigungen beim Zugriff auf Verfahren)
- `getCurrentUserId()` Fragt die Nutzerkennung des aktuell eingeloggten Nutzers ab (zur Überprüfung von Berechtigungen beim Zugriff auf Verfahren und Logging von Bearbeitungen)
- `imapSendMimeMail($to, $cc, $bcc, $subject, $body, $attachments)` Verschickt eine signierte E-Mail mit Anhängen (für den Abschluss der Verarbeitungstätigkeit)
- `getUserGroups($userId)` Fragt die aktuellen Nutzergruppen zu einer Kennung ab (zur Überprüfung von Berechtigungen beim Zugriff auf eine Verarbeitungstätigkeit)
- `getCurrentUserId()` Fragt die Nutzerkennung des aktuell eingeloggten Nutzers ab (zur Überprüfung von Berechtigungen beim Zugriff auf eine Verarbeitungstätigkeit und Logging von Bearbeitungen)
- `getUserAnrede($userId)` Fragt die Anrede zu einer Nutzerkennung ab (für den E-Mail-Versand genutzt)
- `getUserAlias($userId)` Fragt den primären Alias-Namen des Nutzers ab (für den E-Mail-Versand genutzt)
3. **Datenimport**
Für einige Eingafelder stellt das Tool Vorschläge für den Nutzer zur Verfügung. Diese werden, bis auf die aktuellen Nutzergruppen und Systeme, alle aus der SQLite Datenbank ausgelesen.
Zu diesen Daten zählen Personen, Organisationseinheiten, IVVen und CPE-Einträge. Die benötigten Tabellen werden beim ersten Start der Anwendung angelegt und müssen nur befüllt werden.
Die Tabellendefinitionen können in [DBCon.class.php](/assets/ajax/DBCon.class.php) gefunden werden. Diese können dafür genutzt werden, um die Tabelle z.B. mittels einer SQL-Importdatei über das CLI von SQLite zu befüllen und regelmäßig aktuell zu halten.
......
This diff is collapsed.
......@@ -101,10 +101,11 @@
* @return string Aufstellungsort oder ein Platzhalter, falls kein Ort bekannt
*/
public static function getAufstellungsort($ip) {
if ($ip == '127.0.0.1') {
return "Mein Büro";
} elseif ($ip == '::1') {
return "ZIV, Raum 111, Einsteinstr. 60";
$netzDb = array('127.0.0.1' => "Mein Büro",
'::1' => "ZIV, Raum 111, Einsteinstr. 60"
);
if ($ort = $netzDb['$ip']) {
return $ort;
} else {
return "Kein Aufstellungsort in Netzdatenbank eingetragen.";
}
......@@ -127,8 +128,11 @@
* @return array Liste der Nutzergruppen
*/
public static function getUserGroups($userId) {
$userGroups = array('demogroup');
return $userGroups;
$userGroups = array('demouser' => array('demogroup', 'demogroup2', 'demogroup3'),
'demouser2' => array('demogroup', 'demogroup2'),
'demouser3' => array('demogroup')
);
return $userGroups[$userId];
}
/**
......@@ -140,7 +144,11 @@
*/
public static function getGroupName($groupId) {
#return get_name_from_group($groupId);
return 'Gruppe für SecDoc Demosystem';
$groupNames = array('demogroup' => 'Gruppe für SecDoc Demosystem',
'demogroup2' => 'Zweite Gruppe für SecDoc Demosystem',
'demogroup3' => 'Dritte Gruppe für SecDoc Demosystem'
);
return $groupNames[$groupId];
}
/**
......@@ -176,7 +184,7 @@
*/
public static function readUserPassword($userId) {
#return user_read_pass($userId);
return '';
return 'demopass';
}
}
?>
......@@ -3,14 +3,14 @@
* config.inc.php - Zentrale Konfigurations-Einstellungen für SecDoc
*
* @author Thorsten Küfer <thorsten.kuefer@uni-muenster.de>
* @copyright (c) 2018 Westfälische Wilhelms-Universität Münster
* @copyright (c) 2019 Westfälische Wilhelms-Universität Münster
* @license AGPL-3.0-or-later <https://www.gnu.org/licenses/agpl.html>
*
*/
# Globale Variablen
$prog_name = "SecDoc Demosystem";
$prog_version = "1.1 (2019.02.27)";
$prog_version = "1.2 (2019.05.29)";
$debug = isset($_REQUEST['debug']) ? filter_var($_REQUEST['debug'], FILTER_VALIDATE_BOOLEAN) : FALSE; # Für Live-System ausschalten, im Testsystem ist Debug-Modus standardmäßig an
$debugGroups = ['demogroup']; # Nutzergruppen, die Zugriff auf die Debug-Ausgaben haben
$GLOBALS['DEBUG'] = $debug;
......@@ -53,13 +53,13 @@
# Basispfad
$base_dir = dirname($_SERVER['DOCUMENT_ROOT']); # => "/www/data/ZIV.CERT"
$base_dir = $base_dir ? $base_dir : "/www/data/ZIVtest";
$ckusrgrp = "/www/bin/ckusrgrp -n";
#$ckusrgrp = "/www/bin/ckusrgrp -n";
$temp_dir = "$base_dir/temp"; # Hier landen temporäre Dateien
$sess_dir = "$base_dir/sessions"; # Hier landen die PHP sessions und Tickets von ticket.class.php
$secret_dir = "$base_dir/secret"; # Hier liegen Passwörter und Zertifikate
$font_dir = "$base_dir/fonts"; # Fonts für JpGraph (http://jpgraph.net/)
$db_dir = "$base_dir/secdoc"; # Hier liegt die SecDoc SQlite Datenbank
#$sess_dir = "$base_dir/sessions"; # Hier landen die PHP sessions und Tickets von ticket.class.php
#$secret_dir = "$base_dir/secret"; # Hier liegen Passwörter und Zertifikate
#$font_dir = "$base_dir/fonts"; # Fonts für JpGraph (http://jpgraph.net/)
$db_dir = ".."; # Hier liegt die SecDoc SQlite Datenbank
$includes_dir = "$temp_dir/htdocs/sys/secdoc"; # Hier liegen die HTML Include-Bausteine
$pdf_dir = "$temp_dir/secdoc/PDF"; # Hier liegen die PDF-Dateien (temporär für E-Mail-Versand)
$vendor_dir = '../vendor/autoload.php'; # Pfad zur Composer autoload.php für MPDF
......
......@@ -305,6 +305,23 @@ EOH;
# Liest alle Verfahren aus, auf die $userId Zugriff hat
case 'list': {
$list = $dbcon->listVerfahrenOwn($userId, $userGroups);
$list = array_merge($list, $dbcon->listVerfahrenShared($userId, $userGroups));
$count = count($list);
# Prüft, welche PDFs bereits existieren
$currPDFs = scandir($pdf_dir);
for($c = 0; $c < $count; $c++) {
$list[$c]['PDF'] = array_search($list[$c]['ID'] . '.pdf', $currPDFs) ? TRUE : FALSE;
}
$output['count'] = $count;
$output['data'] = $list;
break;
}
# Listet alle Verfahren auf, die einsehbar, aber nicht bearbeitbar sind
case 'listshared': {
$list = $dbcon->listVerfahrenShared($userId, $userGroups);
$count = count($list);
# Prüft, welche PDFs bereits existieren
......@@ -338,7 +355,7 @@ EOH;
break;
}
# Durchsucht die für den aktuellen Nutzer einsehbaren Verfahren
# Durchsucht die für den aktuellen Nutzer einsehbaren Verfahren (nur IT-Verfahren)
case 'searchverfahren': {
if($userIsDSB) {
$list = $dbcon->listVerfahrenDSB($search);
......@@ -350,7 +367,7 @@ EOH;
$result = array();
foreach($list as $entry) {
array_push($result, array('value' => $entry['ID'], 'label' => $entry['Bezeichnung'] . " [" . $entry['Fachabteilung'] . "]"));
if(intval($entry['Typ']) === 2) array_push($result, array('value' => $entry['ID'], 'label' => $entry['Bezeichnung'] . " [" . $entry['Fachabteilung'] . "]"));
}
$output['data'] = $result;
......@@ -392,6 +409,7 @@ EOH;
// Benötigte Parameter in $data überprüfen
$reqVars = array(
'allgemein_typ',
'allgemein_bezeichnung',
'allgemein_beschreibung',
'allgemein_abteilung',
......@@ -408,7 +426,35 @@ EOH;
# HTML Symbole ersetzen
$data = Utils::encodeHTMLArray($data);
$id = $dbcon->addVerfahren($userId, $newId, $data['allgemein_bezeichnung'], $data['allgemein_datum'], $data['allgemein_beschreibung'], $data['allgemein_abteilung'], $data['allgemein_ivv'], $data['allgemein_fachlich_kennung'], $data['allgemein_technisch_kennung'], $data['meta_bearbeiter_gruppe'], json_encode($data));
# Verfahren erstellen
$id = $dbcon->addVerfahren($userId, $newId, intval($data['allgemein_typ']), $data['allgemein_bezeichnung'], $data['allgemein_datum'], $data['allgemein_beschreibung'], intval($data['massnahmen_risiko']), $data['allgemein_abteilung'], $data['allgemein_ivv'], $data['allgemein_fachlich_kennung'], $data['allgemein_technisch_kennung'], json_encode($data));
# Berechtigungen eintragen (falls schon gegeben)
$newPermissions = [];
if(isset($data['meta_nutzer_kennung'])) {
for($c = 0; $c < count($data['meta_nutzer_kennung']); $c++) {
array_push($newPermissions, [
'id' => empty($data['meta_nutzer_kennung'][$c]) ? $data['meta_nutzer_name'][$c] : $data['meta_nutzer_kennung'][$c],
'isgroup' => FALSE,
'canedit' => intval($data['meta_nutzer_schreiben'][$c]) === 1 ? TRUE : FALSE
]);
}
}
if(isset($data['meta_gruppen_kennung'])) {
for($c = 0; $c < count($data['meta_gruppen_kennung']); $c++) {
array_push($newPermissions, [
'id' => empty($data['meta_gruppen_kennung'][$c]) ? $data['meta_gruppen_name'][$c] : $data['meta_gruppen_kennung'][$c],
'isgroup' => TRUE,
'canedit' => intval($data['meta_gruppen_schreiben'][$c]) === 1 ? TRUE : FALSE
]);
}
}
$setPermission = $dbcon->updatePermissions($id, $userId, $userGroups, $newPermissions);
if(!$setPermission) error_log("[SecDoc] verwaltung.php -> Konnte neue Berechtigungen für Verfahren #$id nicht setzen!");
$output['data'] = ['ID' => $id, 'Date' => date("Y-m-d H:i:s")];
$output['success'] = TRUE;
......@@ -426,6 +472,7 @@ EOH;
// Benötigte Parameter in $data überprüfen
$reqVars = array(
'allgemein_typ',
'allgemein_bezeichnung',
'allgemein_beschreibung',
'allgemein_abteilung',
......@@ -433,7 +480,7 @@ EOH;
'allgemein_fachlich_kennung',
'allgemein_technisch_kennung',
'meta_lastupdate',
'meta_bearbeiter_gruppe'
'massnahmen_risiko'
);
foreach($reqVars as $reqVar) {
if(!isset($data[$reqVar])) {
......@@ -452,7 +499,36 @@ EOH;
# HTML Symbole ersetzen
$data = Utils::encodeHTMLArray($data);
$success = $dbcon->updateVerfahren($verfahrensId, $userId, $userGroups, $data['allgemein_bezeichnung'], $data['allgemein_datum'], $data['allgemein_beschreibung'], $data['allgemein_abteilung'], $data['allgemein_ivv'], $data['allgemein_fachlich_kennung'], $data['allgemein_technisch_kennung'], isset($data['meta_sichtbarkeit']) ? $data['meta_sichtbarkeit'] : 0, $data['meta_bearbeiter_gruppe'], json_encode($data), $userIsDSB);
# Verfahren aktualisieren
$success = $dbcon->updateVerfahren($verfahrensId, $userId, $userGroups, intval($data['allgemein_typ']), $data['allgemein_bezeichnung'], $data['allgemein_datum'], $data['allgemein_beschreibung'], intval($data['massnahmen_risiko']), $data['allgemein_abteilung'], $data['allgemein_ivv'], $data['allgemein_fachlich_kennung'], $data['allgemein_technisch_kennung'], isset($data['meta_sichtbarkeit']) ? $data['meta_sichtbarkeit'] : 0, json_encode($data), $userIsDSB);
# Berechtigungen aktualisieren
$newPermissions = [];
if(isset($data['meta_nutzer_kennung'])) {
for($c = 0; $c < count($data['meta_nutzer_kennung']); $c++) {
array_push($newPermissions, [
'id' => empty($data['meta_nutzer_kennung'][$c]) ? $data['meta_nutzer_name'][$c] : $data['meta_nutzer_kennung'][$c],
'isgroup' => FALSE,
'canedit' => intval($data['meta_nutzer_schreiben'][$c]) === 1 ? TRUE : FALSE
]);
}
}
if(isset($data['meta_gruppen_kennung'])) {
for($c = 0; $c < count($data['meta_gruppen_kennung']); $c++) {
array_push($newPermissions, [
'id' => empty($data['meta_gruppen_kennung'][$c]) ? $data['meta_gruppen_name'][$c] : $data['meta_gruppen_kennung'][$c],
'isgroup' => TRUE,
'canedit' => intval($data['meta_gruppen_schreiben'][$c]) === 1 ? TRUE : FALSE
]);
}
}
$setPermission = $dbcon->updatePermissions($verfahrensId, $userId, $userGroups, $newPermissions);
if(!$setPermission) error_log("[SecDoc] verwaltung.php -> Konnte neue Berechtigungen für Verfahren #$verfahrensId nicht setzen!");
if($success && $dbcon->getStatus($verfahrensId, $userId, $userGroups, $userIsDSB) === 2) {
/**
......@@ -462,7 +538,7 @@ EOH;
* gestellt wurde.
*/
$output['gentxt'] = generateTXT($dbcon, $userId, $userGroups, $userIsDSB, $verfahrensId);
# Status zurücksetzen auf "In Bearbeitung", falls es zuvor als "In Betrieb" gekennzeichnet war
$dbcon->updateStatus($verfahrensId, $userId, $userGroups, 0, $userIsDSB);
}
......@@ -609,16 +685,6 @@ EOH;
break;
}
# Gibt die Rechtsgrundlagen zurück
case 'getlaws': {
$result = $dbcon->getRechtsgrundlagen();
$output['count'] = count($result);
$output['data'] = $result;
$output['success'] = TRUE;
break;
}
# Personensuche nach Name und Kennung
case 'searchperson': {
if(empty($search)) {
......@@ -628,7 +694,7 @@ EOH;
else {
$result = $dbcon->searchPerson($search);
}
$resultMod = [];
foreach($result as $val) {
array_push($resultMod, ['value' => $val['Kennung'], 'label' => $val['Name'], 'name' => $val['Name']]);
......@@ -732,6 +798,7 @@ EOH;
break;
}
# Gibt einige Statistiken aus
case 'getstats': {
if(!$userIsDSB) {
returnError('Sie haben keine Berechtigung diese Funktion aufzurufen!');
......@@ -742,9 +809,21 @@ EOH;
break;
}
case 'gettoms': {
$output['data'] = $dbcon->getTOMs();
$output['count'] = count($output['data']);
break;
}
case 'getsuggestions': {
$output['data'] = $dbcon->getSuggestions();
$output['count'] = count($output['data']);
break;
}
# Falls keine bekannte Aktion angegeben wurde
default: {
$output['error'] = 'Es wurde kein oder kein unterstützter Modus (list, listdsb, get, create, update, delete, finish, updatecomment, history, laws, searchperson, serachabteilung, searchivv, getusergroups, searchapp, searchos, searchipdns, getaufstellungsort, getstats) angegeben!';
$output['error'] = 'Es wurde kein oder kein unterstützter Modus (list, listdsb, get, create, update, delete, finish, updatecomment, history, searchperson, serachabteilung, searchivv, getusergroups, searchapp, searchos, searchipdns, getaufstellungsort, getstats, gettoms, getsuggestions) angegeben!';
break;
}
}
......
/*
* custom.css - WWU-Anpassungen sind hier zu finden
*
*
* Autor: Thorsten Küfer <thorsten.kuefer@uni-muenster.de>
* Copyright (c) 2018 Westfälische Wilhelms-Universität Münster
* Licensed under AGPL-3.0-or-later (https://www.gnu.org/licenses/agpl.html)
* Licensed under AGPL-3.0-or-later (https://www.gnu.org/licenses/agpl.html)
*/
/* Border Radius aus Paper Bootstrap Wizard auch auf Buttons in button-group-sm anwenden. */
......@@ -94,7 +94,7 @@ i[data-toggle="tooltip"] {
.dropdown-menu .inner .text {
white-space: normal;
margin: 5px 0px;
margin: 5px 0px;
}
/* Fix: Selectpicker Dropdown wird vom Footer überdeckt */
......@@ -113,7 +113,15 @@ i[data-toggle="tooltip"] {
}
/* Fix: Plus/Minus nicht mittig in DT-Tabellen mit ausklappbaren Kontrollelementen */
table.dataTable.dtr-column > tbody > tr > td.control::before,
table.dataTable.dtr-column > tbody > tr > td.control::before,
table.dataTable.dtr-column > tbody > tr > th.control::before {
font-family: inherit;
}
.wizard-card .tab-content .tab-content {
padding: 0px;
}
.modal-lg {
width: 65%;
}
File added
This diff is collapsed.
......@@ -24,30 +24,35 @@ console.time('Gesamte Vorbereitungszeit');
* @type {Boolean}
*/
var debug = (GetURLParameter('debug') === 'true' || GetURLParameter('debug') == 1) ? true : false;
/**
* Aktuelle Versions-Nummer
* @global
* @type {String}
*/
var version = '';
/**
* Angabe der Ziel-Unterseite
* @global
* @type {String}
*/
var page = ['dsbview'].includes(GetURLParameter('page')) ? GetURLParameter('page') : 'wizard';
/**
* Gibt an, ob der Nutzer ein Datenschutzbeauftragter ist
* @global
* @type {Boolean}
*/
var userIsDSB = false;
/**
* Relativer Pfad zur verwaltung.php
* @global
* @type {String}
*/
var backendPath = 'assets/ajax/verwaltung.php';
/**
* JQuery Object des Modal-Elements
* @global
......@@ -55,7 +60,6 @@ var backendPath = 'assets/ajax/verwaltung.php';
*/
var modal = $('#modalWindow'); // Modal-Fenster für Meldungen/Fehler
// Mappings
/**
* Mapping für die Stati von Verfahren
......
This diff is collapsed.
BEGIN TRANSACTION;
DELETE FROM suggestions;
INSERT INTO suggestions (Field, Entry) VALUES ("daten_grundlagen_bezeichnung", "Art. 6 (1) a) - Einwilligung");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_grundlagen_bezeichnung", "Art. 6 (1) b) - Vertragserfüllung");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_grundlagen_bezeichnung", "Art. 6 (1) c) - Rechtliche Verpflichtung");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_grundlagen_bezeichnung", "Art. 6 (1) d) - Lebenswichtige Interessen");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_grundlagen_bezeichnung", "Art. 6 (1) e) - Öffentliches Interesse");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_grundlagen_bezeichnung", "Art. 6 (1) f) - Berechtigte Interessen");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_kategorien_beschreibung", "Name");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_kategorien_beschreibung", "E-Mail");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_kategorien_beschreibung", "Kennung");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_kategorien_beschreibung", "Anschrift");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Rektorat");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Hochschulrat");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Dekane");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Professoren");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Juniorprofessoren");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Wissenschaftliche Mitarbeiter");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Künstlerische Mitarbeiter");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Mitarbeiter");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Nebenberufliche Professoren");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Entpflichtete Professoren");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Privatdozenten");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Studierende");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Wissenschaftliche Hilfskräfte");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Ehrenbürger");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Ehrensenatoren");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Zweithörer");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Gasthörer");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Alumni");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Studienbewerber");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Bewerber um eine Beschäftigung");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Ausgeschiedene Mitglieder");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Ausgeschiedene Angehörige");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Förderer, Fördergesellschaften");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Kooperationen");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Sonstige");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Ausgründungen");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "An-Institute,");
INSERT INTO suggestions (Field, Entry) VALUES ("daten_personen_betroffene", "Geschäftspartner, Kunden, Lieferanten");
END TRANSACTION;
This diff is collapsed.
This diff is collapsed.
#!/usr/local/bin/php
<?php
/**
* db-update.php - SQLite-DB (secdoc.db) mit Personen- und Organisationseinheitdaten zur schnelleren AJAX-Abfrage befüllen
*
* TK, 18.07.2018 - Erste Version
*
* @author Thorsten Küfer <thorsten.kuefer@uni-muenster.de>
* @copyright (c) 2018 Westfälische Wilhelms-Universität Münster
* @license AGPL-3.0-or-later <https://www.gnu.org/licenses/agpl.html>
*/
# Allgemeine Einstellungen
require_once('../ajax/config.inc.php');
require_once('../ajax/func.inc.php');
# Skript-Einstellungen
set_time_limit(0);
header('Content-type: text/plain; charset=utf-8');
ob_end_flush();
# Verbindungen mit WBDB herstellen
$oci_handle = ocidb_connect();
# SQL-Statements für SQLite-DB erzeugen
print "DELETE FROM PERSONEN;\n";
print "DELETE FROM ORGANISATIONSEINHEITEN;\n";
print "DELETE FROM IVVEN;\n";
print "BEGIN TRANSACTION;\n";
sql_personen_table();
sql_organisationseinheiten_table();
sql_ivven_table();
print "END TRANSACTION;\n";
/**
* Personen-Tabelle mit Mitarbeitern und Stud. Hilfskräften füllen.
*
*/
function sql_personen_table()
{
sql_mitarbeiter_table();
sql_studhilfskraefte_table();
}
/**
* Liste der Mitarbeiter sowie Adresse, Tel. und E-Mail holen.
*
*/
function sql_mitarbeiter_table()
{
$nids = array_unique(array_merge(get_nids_from_group('u0mitarb'), get_nids_from_group('e0mitwwu')));
# Anzeigename für Einträge in Kennungs-Liste holen
if (count($nids)>0)
{
foreach ($nids as $nid)
{
$info = get_info_from_nid($nid);
$label = "$info[0], $info[1]";
# Werte 2-4 sind optional
if ($info[2])
{
$label .= ", $info[2]";
}
if ($info[3])
{
$label .= ", $info[3]";
}
if ($info[4])
{
$label .= ", Tel.: $info[4]";
}
if ($info[7])
{
$label .= ", E-Mail: $info[7]";
}
print "INSERT INTO PERSONEN VALUES('$nid', '$info[0]', '$label', '$info[8]');\n";
}
}
}
/**
* Liste der Stud. Mitarbeiter mit Name holen.
*
*/
function sql_studhilfskraefte_table()
{
$nids = array_unique(get_nids_from_group('u0shk'));
# Anzeigename für Einträge in Kennungs-Liste holen
if (count($nids)>0)
{
foreach ($nids as $nid)
{
$name = get_name_from_nid($nid);
print "INSERT INTO PERSONEN VALUES('$nid', '$name', NULL, NULL);\n";
}
}
}
/**
* Liste der IVVen holen (Tabelle V_NETZ).
*
* @global type $oci_handle Globaler Datenbank-Handle
*/
function sql_ivven_table()
{
global $oci_handle;
# Suche über Feld IVV
$sql = "SELECT DISTINCT Trim(ivv) as ivv FROM wb_cert.v_netz ORDER BY ivv";
if ($GLOBALS['DEBUG'])
{ print '<p class="debug"><b>Notice</b>: oci_execute(): ' . htmlspecialchars($sql) . '</p>'; }
$stmt = oci_parse($oci_handle, $sql);
oci_execute($stmt);
if ($e = oci_error($stmt))
{ err($e['code'] . ": " . htmlspecialchars($e['message'])); }
$num = oci_fetch_all($stmt, $rows);
if($num > 0)
{
foreach ($rows['IVV'] as $ivv)
{
if ($ivv !== '-- LEER --')
{
print "INSERT INTO IVVEN VALUES('$ivv');\n";
}
}
}
}
/**
* Liste der Organisationseinheiten mit Adresse holen (Tabelle WWUBEN.INSTITUTS_ADRESSEN).
*
* @global type $oci_handle Gloabler Datenbank-Handle
*/
function sql_organisationseinheiten_table()
{
global $oci_handle;
$sql = "SELECT Trim(Institut) as Id, Name || ', ' || Str || ', ' || Ort as Name FROM wwuben.instituts_adressen WHERE Status='A' ORDER BY institut";
if ($GLOBALS['DEBUG'])
{ print '<p class="debug"><b>Notice</b>: oci_execute(): ' . htmlspecialchars($sql) . '</p>'; }
$stmt = oci_parse($oci_handle, $sql);
oci_execute($stmt);
if ($e = oci_error($stmt))
{ err($e['code'] . ": " . htmlspecialchars($e['message'])); }
$num = oci_fetch_all($stmt, $rows, 0, -1, OCI_FETCHSTATEMENT_BY_ROW);
if($num > 0)
{
foreach ($rows as $row)
{
if (preg_match('/^\w/', $row['ID']) && preg_match('/^\w/', $row['NAME']))
{
print "INSERT INTO ORGANISATIONSEINHEITEN VALUES('$row[ID]', '$row[NAME]');\n";
}
}
}
}
/**
* Liste der Organisationseinheiten mit Adresse holen (Tabelle ALT_INSTITUTE/PROJEKTE).
*
* @global type $oci_handle Globaler Datenbank-Handle
*/
function sql_organisationseinheiten_table2()
{
global $oci_handle;
# Suche über Feld INSTITUT
$sql = "SELECT Name || ', ' || Str || ', ' || Ort as Institut FROM wb_cert.alt_institute WHERE Institut in (SELECT Institut from wb_cert.projekte where Status='A') ORDER BY institut";
if ($GLOBALS['DEBUG'])
{ print '<p class="debug"><b>Notice</b>: oci_execute(): ' . htmlspecialchars($sql) . '</p>'; }
$stmt = oci_parse($oci_handle, $sql);
oci_execute($stmt);
if ($e = oci_error($stmt))
{ err($e['code'] . ": " . htmlspecialchars($e['message'])); }
$num = oci_fetch_all($stmt, $rows);
if($num > 0)
{
foreach ($rows['INSTITUT'] as $org)
{
print "INSERT INTO ORGANISATIONSEINHEITEN VALUES('$org');\n";
}
}
}
/**
* Liste der Organisationseinheiten holen (Tabelle V_NETZ).
*
* @global type $oci_handle Globaler Datenbank-Handle
*/
function sql_organisationseinheiten_table3()
{
global $oci_handle;