Verified Commit 4b860dd0 authored by Dustin Gawron's avatar Dustin Gawron

Merge remote-tracking branch 'origin/kosmetik' into master

parents 1f31fe35 cb626d49
# Get apache with php 7.4 as base image
FROM php:7.4-apache
# Install needed tools and php extensions
RUN apt-get update && apt-get install -y libpng-dev git zip libonig-dev libldap2-dev nano
RUN apt-get update && apt-get install -y libpng-dev git zip libonig-dev libldap2-dev nano sqlite3
RUN docker-php-ext-install mbstring gd ldap
# Install composer
RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \
......@@ -13,9 +13,9 @@ RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \
# Copy SecDoc files and prepare folders
COPY / /var/www/html/
WORKDIR /var/www/
RUN rm html/install.php && mkdir secdoc && mv html/assets/demo.db secdoc/demo.db && mv html/assets/ajax/secdoc.conf.php secdoc/secdoc.conf.php
RUN rm html/install.php && mkdir secdoc temp && mv html/assets/demo.db secdoc/demo.db && mv html/assets/ajax/secdoc.conf.php secdoc/secdoc.conf.php
RUN mkdir secdoc/PDF secdoc/inc secdoc/sessions
RUN chmod -R 755 secdoc & chown -R www-data secdoc
RUN chmod -R 755 secdoc && chown -R www-data secdoc && chmod -R 755 temp && chown -R www-data temp
# Install dependencies with composer
WORKDIR /var/www/html/assets
RUN composer install
......
......@@ -123,5 +123,5 @@ Die Dokumentation des JS-Codes ist zu finden in [JSDoc](/docs/JSDoc) und die des
## Lizenz
Copyright (c) 2018 Westfälische Wilhelms-Universität Münster (https://www.uni-muenster.de)
Copyright (c) 2018-2020 Westfälische Wilhelms-Universität Münster (https://www.uni-muenster.de)
Licensed under AGPL-3.0-or-later (https://www.gnu.org/licenses/agpl.html)
This diff is collapsed.
......@@ -278,8 +278,6 @@
}
else
{
trigger_error('[SecDoc] Utils.class.php -> ldap_get_entries() Fehler: ' . ldap_error($ldap_handle));
error_log('[SecDoc] Utils.class.php ->ldap_get_entries() Fehler: ' . ldap_error($ldap_handle));
return [];
}
}
......@@ -319,8 +317,6 @@
}
else
{
trigger_error('[SecDoc] Utils.class.php -> ldap_get_entries() Fehler: ' . ldap_error($ldap_handle));
error_log('[SecDoc] Utils.class.php -> ldap_get_entries() Fehler: ' . ldap_error($ldap_handle));
return [];
}
}
......@@ -364,8 +360,6 @@
}
else
{
trigger_error('[SecDoc] Utils.class.php -> ldap_get_entries() Fehler: ' . ldap_error($ldap_handle));
error_log('[SecDoc] Utils.class.php ->ldap_get_entries() Fehler: ' . ldap_error($ldap_handle));
return [];
}
}
......@@ -399,8 +393,6 @@
}
else
{
trigger_error('[SecDoc] Utils.class.php -> ldap_get_entries() Fehler: ' . ldap_error($ldap_handle));
error_log('[SecDoc] Utils.class.php ->ldap_get_entries() Fehler: ' . ldap_error($ldap_handle));
return '';
}
}
......@@ -442,8 +434,6 @@
}
else
{
trigger_error('[SecDoc] Utils.class.php -> ldap_get_entries() Fehler: ' . ldap_error($ldap_handle));
error_log('[SecDoc] Utils.class.php ->ldap_get_entries() Fehler: ' . ldap_error($ldap_handle));
return FALSE;
}
}
......@@ -516,12 +506,19 @@
# Einträge suchen
$ldap_search = @ldap_search($ldap_handle, $base, $filter, $attributes);
if(!$ldap_search) {
if($ldap_search === FALSE) {
trigger_error('[SecDoc] Utils.class.php -> ldap_search() Fehler: ' . ldap_error($ldap_handle));
error_log('[SecDoc] Utils.class.php -> ldap_search() Fehler: ' . ldap_error($ldap_handle));
return [];
}
$result = @ldap_get_entries($ldap_handle, $ldap_search);
if($result === FALSE) {
trigger_error('[SecDoc] Utils.class.php -> ldap_get_entries() Fehler: ' . ldap_error($ldap_handle));
error_log('[SecDoc] Utils.class.php -> ldap_get_entries() Fehler: ' . ldap_error($ldap_handle));
return [];
}
return $result;
}
......
......@@ -21,6 +21,7 @@
require_once('DBCon.class.php');
require_once('Utils.class.php');
require_once('auth/Auth.class.php');
require_once('docmgmt/DocMGMT.class.php');
# ----------------------------------------
# Globale Konfiguration setzen
......@@ -76,6 +77,10 @@
# Zeitmessung starten
$timer = array(array('Skript-Start', microtime(TRUE)));
# Wartungsmodus
$maintenanceMode = FALSE;
$maintenanceMessage = 'Aktuell wird eine Wartung durchgeführt. Bitte probieren Sie es später nochmal.';
# ----------------------------------------
# E-Mail-Konfiguration
# ----------------------------------------
......@@ -165,11 +170,24 @@
'employee' => '(|(memberof=CN=u0mitarb,OU=Projekt-Gruppen,DC=wwu,DC=de)(memberof=CN=e0mitwwu,OU=Projekt-Gruppen,DC=wwu,DC=de))'
];
# ----------------------------------------
# Konfiguration der Dokumentenverwaltung
# ----------------------------------------
$docmgmt_method = 'local'; # Aktuell demo und local unterstützt
$docmgmt_maxAttachSize = 12 * 1024 * 1024; # Anhangsgröße in Bytes, ab wann eine Warnung angezeigt wird (Default: 12MB)
$docmgmt_class = $docmgmt_method . 'DocMGMT';
# ----------------------------------------
# Lokale Konfiguration laden
# ----------------------------------------
include_once("$secret_dir/secdoc.conf.php");
# ----------------------------------------
# Dokumentenverwaltungsklasse laden
# ----------------------------------------
if(!@require_once("docmgmt/{$docmgmt_class}.class.php")) throw new Exception("config.inc.php Fehler: Dokumentenverwaltungsklasse '{$docmgmt_class}.class.php' wurde nicht gefunden oder konnte nicht eingebunden werden!");
$docmgmtClass = new $docmgmt_class;
# ----------------------------------------
# Authentifizierungsklasse laden
# ----------------------------------------
......
<?php
/**
* Enthält eine abstrakte Implementierung der Klasse zur Dokumentenverwaltung.
*
* @author Dustin Gawron <dustin.gawron@uni-muenster.de>
* @copyright (c) 2020 Westfälische Wilhelms-Universität Münster
* @license AGPL-3.0-or-later <https://www.gnu.org/licenses/agpl.html>
*/
/**
* Abstrakte Klasse als Vorlage zur Dokumentenverwaltung.
*
* @abstract
*/
abstract class DocMGMT {
/**
* Holt den Inhalt eines Dokuments.
*
* @abstract
* @param int $processID ID der Dokumentation
* @param string $fileRef Dateireferenz
* @return string[] Dateiname und Dateiinhalt (base64 kodiert) (['fileName' => 'test.pdf', 'fileContent' => '...'])
*/
abstract public function getDocument($processID, $fileRef);
/**
* Fügt ein neues Dokument hinzu.
*
* @abstract
* @param int $processID ID der Dokumentation
* @param string $fileName Dateiname
* @param string $fileContent Dateiinhalt (base64 kodiert)
* @return string Referenz zum Dokument
*/
abstract public function addDocument($processID, $fileName, $fileContent);
/**
* Aktualisiert ein Dokument.
*
* @abstract
* @param int $processID ID der Dokumentation
* @param string $fileRef Dateireferenz
* @param string $fileName Dateiname
* @param string $fileContent Dateiinhalt (base64 kodiert)
* @return bool TRUE bei Erfolg, sonst FALSE
*/
abstract public function updateDocument($processID, $fileRef, $fileName, $fileContent);
/**
* Löscht ein Dokument.
*
* @abstract
* @param int $processID ID der Dokumentation
* @param string $fileRef Dateireferenz
* @return bool TRUE bei Erfolg, sonst FALSE
*/
abstract public function deleteDocument($processID, $fileRef);
}
?>
<?php
/**
* Implementierung einer Demo-Dateiverwaltung (ohne tatsächliche Speicherung der Dateien).
*
* @author Dustin Gawron <dustin.gawron@uni-muenster.de>
* @copyright (c) 2020 Westfälische Wilhelms-Universität Münster
* @license AGPL-3.0-or-later <https://www.gnu.org/licenses/agpl.html>
*/
/**
* Klasse zur Implementierung einer Demo-Dateiverwaltung (ohne tatsächliche Speicherung der Dateien).
* Erweitert die Grundklasse {@link DocMGMT}.
*/
class demoDocMGMT extends DocMGMT {
/**
* Holt den Inhalt eines Dokuments.
*
* @abstract
* @param int $processID ID der Dokumentation
* @param string $fileRef Dateireferenz
* @return string[] Dateiname und Dateiinhalt (base64 kodiert) (['fileName' => 'test.pdf', 'fileContent' => '...'])
* @throws Exception
*/
public function getDocument($processID, $fileRef) {
$returnVal = [
'fileName' => $fileRef,
'fileContent' => ''
];
return $returnVal;
}
/**
* Fügt ein neues Dokument hinzu.
*
* @abstract
* @param int $processID ID der Dokumentation
* @param string $fileName Dateiname
* @param string $fileContent Dateiinhalt (base64 kodiert)
* @return string Referenz zum Dokument
* @throws Exception
*/
public function addDocument($processID, $fileName, $fileContent) {
return $fileName;
}
/**
* Aktualisiert ein Dokument.
*
* @abstract
* @param int $processID ID der Dokumentation
* @param string $fileRef Dateireferenz
* @param string $fileName Dateiname
* @param string $fileContent Dateiinhalt (base64 kodiert)
* @return bool Neue Referenz zum Dokument
* @throws Exception
*/
public function updateDocument($processID, $fileRef, $fileName, $fileContent){
return $fileName;
}
/**
* Löscht ein Dokument.
*
* @abstract
* @param int $processID ID der Dokumentation
* @param string $fileRef Dateireferenz
* @return bool TRUE bei Erfolg, sonst FALSE
* @throws Exception
*/
public function deleteDocument($processID, $fileRef) {
return TRUE;
}
}
<?php
/**
* Implementierung einer lokalen Dateiverwaltung.
*
* @author Dustin Gawron <dustin.gawron@uni-muenster.de>
* @copyright (c) 2020 Westfälische Wilhelms-Universität Münster
* @license AGPL-3.0-or-later <https://www.gnu.org/licenses/agpl.html>
*/
/**
* Klasse zur Implementierung einer lokalen Dateiverwaltung.
* Erweitert die Grundklasse {@link DocMGMT}.
*/
class localDocMGMT extends DocMGMT {
/**
* Holt den Inhalt eines Dokuments.
*
* @abstract
* @param int $processID ID der Dokumentation
* @param string $fileRef Dateireferenz
* @return string[] Dateiname und Dateiinhalt (base64 kodiert) (['fileName' => 'test.pdf', 'fileContent' => '...'])
* @throws Exception
*/
public function getDocument($processID, $fileRef) {
global $pdf_dir;
$filePath = $pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . $fileRef;
$returnVal = [
'fileName' => $fileRef,
'fileContent' => ''
];
if(file_exists($filePath) && is_readable($filePath)) {
$returnVal['fileContent'] = base64_encode(file_get_contents($filePath));
}
else {
trigger_error("[SecDoc] localDocMGMT.php -> Datei '$filePath' konnte nicht gelesen werden");
error_log("[SecDoc] localDocMGMT.php -> Datei '$filePath' konnte nicht gelesen werden");
}
return $returnVal;
}
/**
* Fügt ein neues Dokument hinzu.
*
* @abstract
* @param int $processID ID der Dokumentation
* @param string $fileName Dateiname
* @param string $fileContent Dateiinhalt (base64 kodiert)
* @return string Referenz zum Dokument
* @throws Exception
*/
public function addDocument($processID, $fileName, $fileContent) {
global $pdf_dir;
if(!is_writable($pdf_dir)) throw new Exception("Fehlende Schreibberechtigung in '$pdf_dir'");
$processDir = $pdf_dir . DIRECTORY_SEPARATOR . $processID;
if(!file_exists($processDir)) {
if(!mkdir($processDir)) throw new Exception("Kann Verzeichnis '$processDir' nicht erstellen");
}
# Sonderzeichen entschärfen
$fileName = str_replace('.pdf', '', $fileName);
$fileName = preg_replace('/[^A-Za-z0-9_\-]/', '_', $fileName);
$fileName .= '.pdf';
$filePath = $pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . $fileName;
if(file_exists($filePath)) {
$fileName = time() . '_' . $fileName;
$filePath = $pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . $fileName;
}
if(file_put_contents($filePath, base64_decode($fileContent)) === FALSE) {
trigger_error("[SecDoc] localDocMGMT.php -> Datei '$filePath' konnte nicht geschrieben werden");
error_log("[SecDoc] localDocMGMT.php -> Datei '$filePath' konnte nicht geschrieben werden");
return '';
}
else {
return $fileName;
}
}
/**
* Aktualisiert ein Dokument.
*
* @abstract
* @param int $processID ID der Dokumentation
* @param string $fileRef Dateireferenz
* @param string $fileName Dateiname
* @param string $fileContent Dateiinhalt (base64 kodiert)
* @return bool Neue Referenz zum Dokument
* @throws Exception
*/
public function updateDocument($processID, $fileRef, $fileName, $fileContent){
global $pdf_dir;
if(!is_writable($pdf_dir)) throw new Exception("Fehlende Schreibberechtigung in '$pdf_dir'");
# Sonderzeichen entschärfen
$fileName = str_replace('.pdf', '', $fileName);
$fileName = preg_replace('/[^A-Za-z0-9_\-]/', '_', $fileName);
$fileName .= '.pdf';
$filePathOld = $pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . $fileRef;
$filePathNew = $pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . $fileName;
if($filePathOld !== $filePathNew && file_exists($filePathNew)) {
$fileName = time() . $fileName;
$filePathNew = $pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . $fileName;
}
if(file_put_contents($filePathNew, base64_decode($fileContent)) === FALSE) {
trigger_error("[SecDoc] localDocMGMT.php -> Datei '$filePathNew' konnte nicht geschrieben werden");
error_log("[SecDoc] localDocMGMT.php -> Datei '$filePathNew' konnte nicht geschrieben werden");
return '';
}
else {
if($filePathOld !== $filePathNew) {
if(!unlink($filePathOld)) {
trigger_error("[SecDoc] localDocMGMT.php -> Datei '$filePathOld' konnte nicht gelöscht werden");
error_log("[SecDoc] localDocMGMT.php -> Datei '$filePathOld' konnte nicht gelöscht werden");
}
}
return $fileName;
}
}
/**
* Löscht ein Dokument.
*
* @abstract
* @param int $processID ID der Dokumentation
* @param string $fileRef Dateireferenz
* @return bool TRUE bei Erfolg, sonst FALSE
* @throws Exception
*/
public function deleteDocument($processID, $fileRef) {
global $pdf_dir;
if(!is_writable($pdf_dir)) throw new Exception("Fehlende Schreibberechtigung in '$pdf_dir'");
$filePath = $pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . $fileRef;
if(unlink($filePath)) {
if(count(glob($pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . '*')) === 0) {
if(!rmdir($pdf_dir . DIRECTORY_SEPARATOR . $processID)) {
trigger_error("[SecDoc] localDocMGMT.php -> Leerer Ordner '" . $pdf_dir . DIRECTORY_SEPARATOR . $processID . "' konnte nicht gelöscht werden");
error_log("[SecDoc] localDocMGMT.php -> Leerer Ordner '" . $pdf_dir . DIRECTORY_SEPARATOR . $processID . "' konnte nicht gelöscht werden");
}
}
return TRUE;
}
else {
trigger_error("[SecDoc] localDocMGMT.php -> Datei '$filePath' konnte nicht gelöscht werden");
error_log("[SecDoc] localDocMGMT.php -> Datei '$filePath' konnte nicht gelöscht werden");
return FALSE;
}
}
}
......@@ -17,6 +17,10 @@
$prog_name = "SecDoc Demosystem";
$prog_url = 'http://localhost/';
# Wartungsmodus
$maintenanceMode = FALSE;
$maintenanceMessage = 'Aktuell wird eine Wartung durchgeführt. Bitte probieren Sie es später nochmal.';
# ----------------------------------------
# E-Mail-Konfiguration
# ----------------------------------------
......@@ -105,4 +109,11 @@
'active' => '(|(memberof=CN=u0shk,OU=Projekt-Gruppen,DC=wwu,DC=de)(memberof=CN=u0mitarb,OU=Projekt-Gruppen,DC=wwu,DC=de)(memberof=CN=e0mitwwu,OU=Projekt-Gruppen,DC=wwu,DC=de))(!(memberof=CN=y0msexma,OU=Projekt-Gruppen,DC=wwu,DC=de))',
'employee' => '(|(memberof=CN=u0mitarb,OU=Projekt-Gruppen,DC=wwu,DC=de)(memberof=CN=e0mitwwu,OU=Projekt-Gruppen,DC=wwu,DC=de))'
];
# ----------------------------------------
# Konfiguration der Dokumentenverwaltung
# ----------------------------------------
$docmgmt_method = 'local'; # Aktuell demo und local unterstützt
$docmgmt_maxAttachSize = 12 * 1024 * 1024; # Anhangsgröße in Bytes, ab wann eine Warnung angezeigt wird (Default: 12MB)
$docmgmt_class = $docmgmt_method . 'DocMGMT';
?>
This diff is collapsed.
......@@ -63,7 +63,7 @@
text-align: left;
}
i[data-toggle="tooltip"] {
i[data-toggle="tooltip"], .cursor-help {
cursor: help;
}
......@@ -168,10 +168,19 @@ input.customError {
margin-left: 5px !important;
}
.mx-10 {
margin-left: 10px !important;
margin-right: 10px !important;
}
.pointer {
cursor: pointer !important;
}
.cursor-progress {
cursor: progress !important;
}
.strong {
font-weight: 700 !important;
}
......
<h4 id="title" class="text-center">
<i class="fa fa-home"></i> Startseite
</h4>
<h4 class="text-center">
<small>Das SecDoc Dokumentationstool unterstützt Sie bei der Erstellung von Dokumentationen zur Erfüllung der Anforderungen aus Datenschutz und Informationssicherheit.</small>
</h4>
<div class="mx-auto">
<p class="text-center" style="padding:20px">Um eine personenbezogene Verarbeitung vollständig zu erfassen, hat es sich bewährt, drei verschiedene Ebenen der Darstellung wesentlicher Bestandteile zu unterscheiden: <em>Verarbeitungstätigkeit</em>, <em>Fachapplikation</em> und <em>IT-Verfahren</em>. Wesentlich ist das Verständnis, dass eine Verarbeitungstätigkeit bspw. nicht deckungsgleich mit der Verwendung einer bestimmten Technik oder eines bestimmten Fachprogramms ist. Dieser Ansatz folgt dem <a href="https://www.datenschutzkonferenz-online.de/media/ah/SDM-Methode_V20b.pdf" target="_blank"><em>Standard-Datenschutzmodell V2 (SDM-V2)</em></a> <i data-toggle="tooltip" title="Mit dem Standard-Datenschutzmodell (SDM) wird das Ziel verfolgt, Verarbeitungstätigkeiten rechtskonform auszugestalten. Dazu ist es erforderlich, die von der Datenschutz-Grundverordnung (DS-GVO) vorgegebenen datenschutzrechtlichen Anforderungen praktisch umzusetzen und somit sowohl die Risiken für die Rechte und Freiheiten natürlicher Personen zu mindern als auch die Sicherheit der Informationsverarbeitung zu gewährleisten. Das übergeordnete Ziel kann nur erreicht werden, wenn bezogen auf die Daten, Systeme und Dienste sowie Prozesse einer Verarbeitungstätigkeit mehrere Anforderungen – teils alternativ, teils kumulativ – durch technische und organisatorische Maßnahmen erfüllt werden. Aus den Vorgaben der DS-GVO ergeben sich unmittelbar die Komponenten Daten, Systeme und Dienste. Bei der konkreten Modellierung von Verarbeitungstätigkeiten mit Personenbezug ist es jedoch notwendig, die folgenden drei Komponenten zu betrachten:
<p class="text-center" style="padding:20px">Um eine personenbezogene Verarbeitung vollständig zu erfassen, hat es sich bewährt, drei verschiedene Ebenen der Darstellung wesentlicher Bestandteile zu unterscheiden: <em>Verarbeitungstätigkeit</em>, <em>Fachapplikation</em> und <em>IT-Verfahren</em>. Wesentlich ist das Verständnis, dass eine Verarbeitungstätigkeit bspw. nicht deckungsgleich mit der Verwendung einer bestimmten Technik oder eines bestimmten Fachprogramms ist. Dieser Ansatz basiert auf dem <a href="https://www.datenschutzkonferenz-online.de/media/ah/SDM-Methode_V20b.pdf" target="_blank"><i class="fa fa-external-link"></i> <em>Standard-Datenschutzmodell V2 (SDM-V2)</em></a> <i data-toggle="tooltip" title="Mit dem Standard-Datenschutzmodell (SDM) wird das Ziel verfolgt, Verarbeitungstätigkeiten rechtskonform auszugestalten. Dazu ist es erforderlich, die von der Datenschutz-Grundverordnung (DS-GVO) vorgegebenen datenschutzrechtlichen Anforderungen praktisch umzusetzen und somit sowohl die Risiken für die Rechte und Freiheiten natürlicher Personen zu mindern als auch die Sicherheit der Informationsverarbeitung zu gewährleisten. Das übergeordnete Ziel kann nur erreicht werden, wenn bezogen auf die Daten, Systeme und Dienste sowie Prozesse einer Verarbeitungstätigkeit mehrere Anforderungen – teils alternativ, teils kumulativ – durch technische und organisatorische Maßnahmen erfüllt werden. Aus den Vorgaben der DS-GVO ergeben sich unmittelbar die Komponenten Daten, Systeme und Dienste. Bei der konkreten Modellierung von Verarbeitungstätigkeiten mit Personenbezug ist es jedoch notwendig, die folgenden drei Komponenten zu betrachten:
<ol>
<li>die personenbezogenen Daten,</li>
<li>die beteiligten technischen Systeme und Dienste (Hardware, Software und Infrastruktur),</li>
<li>die technischen, organisatorischen und personellen Prozesse der Verarbeitung von Daten.</li>
</ol>
Der Ausdruck „Prozess“ ist in der DS-GVO nicht ausdrücklich enthalten. Jede Verarbeitungstätigkeit kann jedoch als Geschäftsprozess bzw. Fachverfahren modelliert werden. Das SDM steht in einer engen Beziehung zur Grundschutzmethodik des Bundesamtes für Sicherheit in der Informationstechnik (BSI). Um die Anwendung des SDM zu erleichtern, nutzt die SDM-Methodik vergleichbare Modellierungsmechanismen wie die Grundschutzmethodik. BSI-Grundschutz und SDM ergänzen sich somit in idealer Weise und liefern gemeinsam die Informationen, die erforderlich sind, um die Einhaltung der Grundsätze für die Verarbeitung personenbezogener Daten nachweisen zu können." class="fa fa-question-circle-o fa-lg"></i> und wurde von der <abbr title="Konferenz der Datenschutzbehörden des Bundes und der Länder">DSK</abbr> auf ihrer Sitzung am 17.04.2020 verabschiedet.
Der Ausdruck „Prozess“ ist in der DS-GVO nicht ausdrücklich enthalten. Jede Verarbeitungstätigkeit kann jedoch als Geschäftsprozess bzw. Fachverfahren modelliert werden. Das SDM steht in einer engen Beziehung zur Grundschutzmethodik des Bundesamtes für Sicherheit in der Informationstechnik (BSI). Um die Anwendung des SDM zu erleichtern, nutzt die SDM-Methodik vergleichbare Modellierungsmechanismen wie die Grundschutzmethodik. BSI-Grundschutz und SDM ergänzen sich somit in idealer Weise und liefern gemeinsam die Informationen, die erforderlich sind, um die Einhaltung der Grundsätze für die Verarbeitung personenbezogener Daten nachweisen zu können." class="fa fa-question-circle-o"></i>, das von der <abbr title="Konferenz der Datenschutzbehörden des Bundes und der Länder">DSK</abbr> verabschiedet wurde.
Auf jeder Ebene besteht die Möglichkeit, eine Liste von Sicherheitsanforderungen für die Beschreibung der technischen und organisatorischen Maßnahmen auf Basis des <a href="https://www.bsi.bund.de/DE/Themen/ITGrundschutz/ITGrundschutzKompendium/itgrundschutzKompendium_node.html" target="_blank"><i class="fa fa-external-link"></i> <em>IT-Grundschutz-Kompendiums</em></a> <i data-toggle="tooltip" title="Das IT-Grundschutz-Kompendium enthält für unterschiedliche Vorgehensweisen, Komponenten und IT-Systeme Erläuterungen zur Gefährdungslage, Sicherheitsanforderungen und weiterführende Informationen, die jeweils in einem Baustein zusammengefasst sind. Es ist aufgrund der Baustein-Struktur modular aufgebaut und legt einen Fokus auf die Darstellung der wesentlichen Sicherheitsanforderungen in den Bausteinen. Seine grundlegende Struktur unterteilt die Bausteine in prozess- und systemorientierte Bausteine, zudem sind sie nach Themen in ein Schichtenmodell einsortiert." class="fa fa-question-circle-o"></i> des <abbr title="Bundesamt für Sicherheit in der Informationstechnik">BSI</abbr> zu erstellen.
</p>
<hr>
<h5 class="text-center">Bitte wählen Sie eine Ebene aus</h5>
<p class="text-center">
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -40,7 +40,7 @@ function getCombinedPDF() {
pdfBuffer[i] = pdfData.charCodeAt(i);
}
let blob = new Blob([pdfBuffer], {type: "application/pdf"});
let lastUpdate = new Date(); // Safari benötigt das Format YYYY-MM-DDTHH:MM:SS (mit T)
let lastUpdate = new Date();
let fileTitle = 'SecDoc_VVT_' + lastUpdate.getFullYear() + ('0' + (lastUpdate.getMonth() + 1)).slice(-2) + ('0' + lastUpdate.getDate()).slice(-2) + ('0' + lastUpdate.getHours()).slice(-2) + ('0' + lastUpdate.getMinutes()).slice(-2) + '.pdf';
// PDF-Anzeige starten (Unterscheidung, ob Edge genutzt wird)
......@@ -84,7 +84,7 @@ function getCompletePDF(docId) {
pdfBuffer[i] = pdfData.charCodeAt(i);
}
let blob = new Blob([pdfBuffer], {type: "application/pdf"});
let lastUpdate = new Date(); // Safari benötigt das Format YYYY-MM-DDTHH:MM:SS (mit T)
let lastUpdate = new Date();
let typeName = {1: 'Verarbeitungstätigkeit', 2: 'IT-Verfahren', 3: 'Fachapplikation', 4: 'Übergreifende_Massnahme'};
let fileTitle = 'SecDoc_' + typeName[data['data']['type']] + '_(komplett)_' + docId + '_' + data['data']['title'].substr(0, 30) + '_' + lastUpdate.getFullYear() + ('0' + (lastUpdate.getMonth() + 1)).slice(-2) + ('0' + lastUpdate.getDate()).slice(-2) + ('0' + lastUpdate.getHours()).slice(-2) + ('0' + lastUpdate.getMinutes()).slice(-2);
fileTitle = fileTitle.replace(/[/\\?%*:|"<>\.,;=\s]/g, '_');
......@@ -132,6 +132,7 @@ function loadTables(tier) {
$('#inbearbeitung table').DataTable().destroy();
$('#abgeschlossen table').off();
$('#inbearbeitung table').off();
abgTable.empty();
inbTable.empty();
......@@ -140,6 +141,8 @@ function loadTables(tier) {
for(var c=0; c < data['count']; c++) {
if(parseInt(data['data'][c]['Typ']) !== tier) continue;
let lastUpdate = data['data'][c]['Aktualisierung'] ? formatDate(new Date(data['data'][c]['Aktualisierung'].replace(' ', 'T'))) : 'Unbekannt';
var newEntry = $('<tr></tr>');
newEntry.append('<td style="width: 16px;"></td>');
newEntry.append('<td>' + data['data'][c]['Bezeichnung'] + ' <i data-toggle="tooltip" class="fa fa-info-circle" title="' + data['data'][c]['Beschreibung'] + '"></i></td>');
......@@ -147,22 +150,21 @@ function loadTables(tier) {
newEntry.append('<td>' + (data['data'][c]['FachKontakt'] ? data['data'][c]['FachKontakt'] : '-- nicht angegeben --') + '</td>');
newEntry.append('<td>' + (data['data'][c]['TechKontakt'] ? data['data'][c]['TechKontakt'] : '-- nicht angegeben --') + '</td>');
newEntry.append('<td>' + data['data'][c]['Erstelldatum'] + '</td>');
newEntry.append('<td>' + data['data'][c]['Aktualisierung'] + '</td>');
newEntry.append('<td>' + lastUpdate + ' <i class="fa fa-history cursor-progress revisionload" data-id="' + data['data'][c]['ID'] + '"></i></td>');
newEntry.append('<td><textarea class="form-control comment" data-id="' + data['data'][c]['ID'] + '" style="resize: both;">' + htmlDecode(data['data'][c]['DSBKommentar']) + '</textarea></td>');
newEntry.append('<td><div class="btn-group inline"><a class="btn" href="?id=' + data['data'][c]['ID'] + (debug ? '&debug=true' : '') + '" target="_blank"><i class="fa fa-edit"></i> Bearbeiten</a><a class="btn" href="?copy=' + data['data'][c]['ID'] + (debug ? '&debug=true' : '') + '" target="_blank"><i class="fa fa-copy"></i> Kopieren</a><button type="button" class="btn pdfdownload" data-id="' + data['data'][c]['ID'] + '" ' + (data['data'][c]['PDF'] ? '' : 'disabled') + '><i class="fa fa-file-pdf-o"></i> PDF anzeigen</button></div> <button type="button" data-id="' + data['data'][c]['ID'] +'" data-name="' + data['data'][c]['Bezeichnung'] +'" class="btn del btn-danger"><i class="fa fa-minus"></i> Löschen</button></td>');
if(parseInt(data['data'][c]['Typ']) === 1 || parseInt(data['data'][c]['Typ']) === 3 || parseInt(data['data'][c]['Typ']) === 2) newEntry.find('.pdfdownload').closest('div').append('<button type="button" class="btn completepdf" data-id="' + data['data'][c]['ID'] + '" ' + (data['data'][c]['PDF'] ? '' : 'disabled') + '><i class="fa fa-file-pdf-o"></i> Vollständige PDF erzeugen</button>');
newEntry.append('<td><div class="btn-group inline"><a class="btn" href="?id=' + data['data'][c]['ID'] + (debug ? '&debug=true' : '') + '" target="_blank"><i class="fa fa-edit"></i> Bearbeiten</a><a class="btn" href="?copy=' + data['data'][c]['ID'] + (debug ? '&debug=true' : '') + '" target="_blank"><i class="fa fa-copy"></i> Kopieren</a><button type="button" class="btn pdfdownload" data-id="' + data['data'][c]['ID'] + '" ' + (data['data'][c]['PDF'] ? '' : 'disabled') + '><i class="fa fa-file-pdf-o"></i> ' + (parseInt(data['data'][c]['Status']) === 0 ? 'Letzte abgeschlossene PDF anzeigen' : 'PDF anzeigen') + '</button></div> <button type="button" data-id="' + data['data'][c]['ID'] +'" data-name="' + data['data'][c]['Bezeichnung'] +'" class="btn del btn-danger"><i class="fa fa-minus"></i> Löschen</button></td>');
if(parseInt(data['data'][c]['Status']) === 0) {
inbTable.append(newEntry);
}
else {
if(parseInt(data['data'][c]['Typ']) === 1 || parseInt(data['data'][c]['Typ']) === 3 || parseInt(data['data'][c]['Typ']) === 2) newEntry.find('.pdfdownload').closest('div').append('<button type="button" class="btn completepdf" data-id="' + data['data'][c]['ID'] + '" ' + (data['data'][c]['PDF'] ? '' : 'disabled') + '><i class="fa fa-file-pdf-o"></i> Vollständige PDF erzeugen</button>');
abgTable.append(newEntry);
}
}
// Event-Listener zum Speichern von Änderungen an den Kommentaren
$('#abgeschlossen table').on('input change', 'textarea.comment', function(event) {
$('#abgeschlossen table, #inbearbeitung table').on('input change', 'textarea.comment', function(event) {
let tar = $(event.target);
let timeout = 5000;
clearTimeout(tar.data('timer'));
......@@ -194,16 +196,16 @@ function loadTables(tier) {
});
// PDF-Download ermöglichen
$('#abgeschlossen table').on('click', 'button.pdfdownload', function(event) {
$('#abgeschlossen table, #inbearbeitung table').on('click', 'button.pdfdownload', function(event) {
getPDFFromServer($(event.target).data('id'));
});
$('#abgeschlossen table').on('click', 'button.completepdf', function(event) {
$('#abgeschlossen table, #inbearbeitung table').on('click', 'button.completepdf', function(event) {
getCompletePDF($(event.target).data('id'));
});
// Handler für das Löschen von Verfahren
$('#abgeschlossen table').on('click', 'button.del', function() {
$('#abgeschlossen table, #inbearbeitung table').on('click', 'button.del', function() {
var confirmed = confirm('Achtung: Von diesem Verfahren könnten andere Verfahren abhängen! Wollen Sie das Verfahren "' + $(this).data('name') + '" wirklich löschen?');
if(confirmed) {
deleteFromServer($(this).data('id'));
......@@ -325,8 +327,40 @@ function loadTables(tier) {
]
});
// Tooltips intialisieren
$('#content').find('[data-toggle="tooltip"]').tooltip({container: 'body'});
$('#content').find('i.revisionload').on('mouseover', (evt) => {
let evtTarget = $(evt.target);
if(!evtTarget.hasClass('revisionload')) return;
evtTarget.addClass('hover');
evtTarget.removeClass('revisionload');
$.get(backendPath, {'action': 'listrevisions', 'debug