From 4642abba23276c052afb4a54c4c5b911b82cef1c Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Thu, 7 May 2026 11:17:16 +0200 Subject: [PATCH] feat: Expand Social Media (10 checks) + DSFA (8 checks) checklists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Art. 26 Joint Controller (10 checks, was 7): + Auflistung der genutzten Plattformen + Rechtsgrundlage (Art. 6) + Social Bookmarks vs. Plugins Hinweis Improved: broader patterns for joint parties, contact point, data types DSFA Art. 35 (8 checks, was 5): + Schwellwertanalyse / Auslösepruefung + Beruecksichtigung Landesbehörden-Richtlinie (LFDI) + Dokumentation der Ergebnisse Improved: IHK-specific patterns (Kanäle, systematische Beobachtung, geringer Umfang, sensitive Daten) Total: 40 → 47 Regex-Checks across all document types. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../services/dsi_document_checker.py | 77 ++++++++++++++----- 1 file changed, 59 insertions(+), 18 deletions(-) diff --git a/backend-compliance/compliance/services/dsi_document_checker.py b/backend-compliance/compliance/services/dsi_document_checker.py index c261f23..d934b26 100644 --- a/backend-compliance/compliance/services/dsi_document_checker.py +++ b/backend-compliance/compliance/services/dsi_document_checker.py @@ -200,52 +200,93 @@ COOKIE_CHECKLIST = [ JOINT_CONTROLLER_CHECKLIST = [ {"id": "joint_parties", "label": "Gemeinsam Verantwortliche benannt (Art. 26(1))", "patterns": [r"gemeinsam.*verantwortlich", r"joint.*controller", r"gemeinsame\s+verantwortlichkeit", - r"art\.\s*26", r"mitverantwortlich"]}, + r"art\.\s*26", r"mitverantwortlich", + r"wir.*(?:und|gemeinsam).*(?:betreiber|facebook|meta|google)", + r"(?:betreiber|netzwerk).*verantwortlich"]}, {"id": "arrangement", "label": "Vereinbarung nach Art. 26 DSGVO", "patterns": [r"vereinbarung.*art\.\s*26", r"art\.\s*26.*vereinbarung", r"page\s*controller", r"fanpage", r"insights", - r"gemeinsame.*verantwortung.*(?:vertrag|vereinbarung)"]}, + r"gemeinsame.*verantwortung.*(?:vertrag|vereinbarung)", + r"addendum|nachtrag|seiten.*insights"]}, {"id": "contact_point", "label": "Anlaufstelle fuer Betroffene (Art. 26(1) S.3)", "patterns": [r"anlaufstelle", r"kontaktstelle", r"ansprechpartner.*betroffene", r"rechte.*(?:gegenueber|gegenüber)\s+(?:uns|beiden)", - r"rechte.*(?:sowohl|grundsaetzlich|grundsätzlich).*(?:uns|als auch)"]}, + r"rechte.*(?:sowohl|grundsaetzlich|grundsätzlich).*(?:uns|als auch)", + r"rechte.*geltend\s+machen", r"wenden\s+sie\s+sich"]}, {"id": "processing_split", "label": "Verarbeitungsaufteilung (wer macht was)", "patterns": [r"(?:wir|betreiber).*(?:verarbeiten|erheben|nutzen).*(?:daten|informationen)", r"(?:facebook|meta|google|youtube|instagram|linkedin|twitter|x\.com).*(?:verarbeit|erhebt|nutzt|speichert)", - r"bei\s+besuch\s+(?:unserer|der)\s+(?:seite|fanpage|profil)"]}, + r"bei\s+besuch\s+(?:unserer|der)\s+(?:seite|fanpage|profil)", + r"(?:senden|ver(?:oe|ö)ffentlich|teilen).*(?:inhalte|beitr(?:ae|ä)ge)", + r"(?:nutzungsstatistik|statistik|insight).*(?:betreiber|netzwerk)"]}, {"id": "social_data_types", "label": "Kategorien verarbeiteter Daten", "patterns": [r"(?:nutzungsstatistik|insight|reichweite|interaktion|klick|aufruf)", - r"(?:ip.?adresse|standort|browser|geraet|alter|geschlecht).*(?:social|profil|seite|fanpage)", - r"(?:personenbezogen|daten).*(?:social|netzwerk|plattform)"]}, + r"(?:ip.?adresse|standort|browser|ger(?:ae|ä)t|alter|geschlecht)", + r"(?:personenbezogen|daten).*(?:social|netzwerk|plattform)", + r"(?:nutzername|beitr(?:ae|ä)g|profil|like|kommentar)", + r"(?:sensitive|besondere).*(?:daten|kategori)"]}, + {"id": "platforms", "label": "Auflistung der genutzten Plattformen", + "patterns": [r"(?:facebook|instagram|youtube|twitter|x\.com|linkedin|xing|tiktok)", + r"(?:kan(?:ae|ä)le|plattform|netzwerk|profil|account|auftritte).*(?:social|medien)", + r"social\s*media.*(?:angebot|pr(?:ae|ä)senz|auftritte)"]}, {"id": "third_country", "label": "Drittlandtransfer (USA bei Social Media)", - "patterns": [r"(?:usa|vereinigte\s+staaten|drittland|drittstaaten).*(?:social|facebook|meta|google)", - r"(?:social|facebook|meta|google).*(?:usa|drittland|drittstaaten)", + "patterns": [r"(?:usa|vereinigte\s+staaten|drittland|drittstaaten)", r"privacy\s+shield|data\s+privacy\s+framework|angemessenheitsbeschluss", - r"standardvertragsklausel|standard.*contractual"]}, + r"standardvertragsklausel|standard.*contractual", + r"(?:uebermittlung|übermittlung).*(?:usa|drittland|ausserhalb|außerhalb)"]}, + {"id": "legal_basis", "label": "Rechtsgrundlage (Art. 6 DSGVO)", + "patterns": [r"rechtsgrundlage", r"art\.\s*6", r"berechtigtes\s+interesse", + r"einwilligung.*art\.\s*6", r"lit\.\s*[a-f]"]}, {"id": "rights", "label": "Betroffenenrechte (Art. 15-21)", "patterns": [r"recht\s+auf\s+auskunft", r"recht\s+auf\s+l(?:oe|ö)schung", r"art\.\s*1[5-9]", r"betroffenenrecht", - r"ihre\s+rechte", r"rechte.*betroffene"]}, + r"ihre\s+rechte", r"rechte.*betroffene", r"widerspruchsrecht"]}, + {"id": "social_bookmarks", "label": "Hinweis auf Social Bookmarks vs. Plugins", + "patterns": [r"social\s*(?:bookmark|plugin|button|widget)", + r"(?:kein|keine).*(?:plugin|widget|button).*(?:gesetzt|eingebunden|geladen)", + r"(?:link|verweis|weiterleitung).*(?:dienst|anbieter|netzwerk)"]}, ] -# DSFA minimal checklist (Art. 35 DSGVO) — basic structure checks +# DSFA checklist (Art. 35 DSGVO) DSFA_CHECKLIST = [ + {"id": "trigger", "label": "Schwellwertanalyse / Ausloesepruefung (Art. 35(1))", + "patterns": [r"art\.\s*35\s*(?:abs|absatz)?\s*\.?\s*1", r"hohes\s+risiko", + r"voraussichtlich.*risiko", r"schwellwert", + r"folgen.*(?:verarbeitung|schutz).*personenbezogen"]}, {"id": "description", "label": "Beschreibung der Verarbeitungsvorgaenge (Art. 35(7)(a))", "patterns": [r"beschreibung.*verarbeitung", r"verarbeitungsvorg(?:ae|ä)ng", - r"systematische\s+beschreibung", r"gegenstand.*verarbeitung"]}, + r"systematische\s+beschreibung", r"gegenstand.*verarbeitung", + r"social\s*media.*(?:angebot|nutzung|besteht\s+aus)", + r"(?:kan(?:ae|ä)le|plattform).*(?:facebook|twitter|instagram|youtube|linkedin|xing)"]}, {"id": "necessity", "label": "Notwendigkeit und Verhaeltnismaessigkeit (Art. 35(7)(b))", "patterns": [r"notwendigkeit", r"verh(?:ae|ä)ltnism(?:ae|ä)ssigkeit", - r"erforderlichkeit", r"zweckbindung"]}, + r"erforderlichkeit", r"zweckbindung", + r"geringen?\s+umfang", r"nur\s+(?:die|sehr).*daten.*(?:verarbeitet|erhoben)", + r"freiwillig\s+angegeben"]}, {"id": "risks", "label": "Risikobewertung fuer Betroffene (Art. 35(7)(c))", - "patterns": [r"risiko.*(?:bewertung|analyse|einsch(?:ae|ä)tzung)", + "patterns": [r"risiko.*(?:bewertung|analyse|einsch(?:ae|ä)tzung|abw(?:ae|ä)gung)", r"risiken.*(?:rechte|freiheit)", r"eintrittswahrscheinlichkeit", - r"schwere.*(?:risiko|auswirkung)"]}, + r"schwere.*(?:risiko|auswirkung)", + r"hohes\s+risiko.*(?:rechte|freiheit)", + r"systematische\s+beobachtung", + r"(?:sensitiv|politisch|sexuell|gesundheit).*(?:daten|offenbar)"]}, {"id": "measures", "label": "Abhilfemassnahmen (Art. 35(7)(d))", - "patterns": [r"abhilfe", r"massnahmen.*risiko", r"schutzma(?:ss|ß)nahm", - r"(?:technisch|organisatorisch).*massnahm", r"tom"]}, + "patterns": [r"abhilfe", r"(?:ma(?:ss|ß)nahm).*(?:risiko|schutz|minderung)", + r"schutzma(?:ss|ß)nahm", r"(?:technisch|organisatorisch).*ma(?:ss|ß)nahm", + r"tom", r"risiko.*(?:minim|reduz|begrenzen)", + r"(?:einschr(?:ae|ä)nk|begrenz).*(?:verarbeitung|zugriff)"]}, + {"id": "lfdi", "label": "Beruecksichtigung Landesbehoerden-Richtlinie", + "patterns": [r"l(?:an)?fdi", r"landesbeauftragt.*datenschutz", + r"landes.?datenschutz", r"richtlinie.*(?:land|lfdi|landes)", + r"(?:aufsichtsbeh(?:oe|ö)rde|beh(?:oe|ö)rde).*(?:richtlinie|empfehlung|vorgabe)"]}, {"id": "stakeholders", "label": "Einbeziehung des DSB (Art. 35(2))", "patterns": [r"datenschutzbeauftragt.*(?:einbez|konsult|beteilig|rat)", - r"dsb.*(?:konsult|einbez|rat)", r"stellungnahme.*dsb"]}, + r"dsb.*(?:konsult|einbez|rat)", r"stellungnahme.*dsb", + r"(?:rat|empfehlung).*datenschutzbeauftragt"]}, + {"id": "documentation", "label": "Dokumentation der Ergebnisse", + "patterns": [r"(?:dokument|ergebnis|bericht).*(?:dsfa|folgenabsch(?:ae|ä)tzung)", + r"(?:ergebnis|schlussfolgerung|bewertung).*(?:risiko|verarbeitung)", + r"vorliegend.*(?:dsfa|analyse|bewertung|absch(?:ae|ä)tzung)"]}, ]