97e39579d5
#3 Storage-Filter: cookie-check exponiert per-Cookie-Speichertyp (storage_inventory.per_cookie); CookieResultView bekommt Filter-Chips (Cookie/Local Storage/Framework …) + eine Speicher-Spalte, Anbieter ohne passenden Treffer werden ausgeblendet, KPI zeigt gefilterte Zahl. A-Routing: legal_notice ist jetzt ein kanonischer Doc-Type. Eigene Discovery-Regel (legal-disclaimer/rechtlicher-hinweis) VOR impressum → die Disclaimer-Seite wird nicht mehr als Impressum substituiert (Ursache, dass die Cross-Doc-Reconciliation nie zündete). capture-only: als doc_entry für B persistiert, aber nicht einzeln gescort (keine 0%-Noise, da ohne eigene Checkliste). Im Scan-Form als Option auswählbar. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
108 lines
4.9 KiB
Python
108 lines
4.9 KiB
Python
"""Module-level constants + shared job state for the compliance-check
|
|
route.
|
|
|
|
`_compliance_check_jobs` is the SINGLE source of truth for in-flight
|
|
job progress. Other modules MUST import the same object — never
|
|
re-declare it — otherwise progress updates land in a detached dict.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
# Internal hostname of the consent-tester container.
|
|
CONSENT_TESTER_URL = "http://bp-compliance-consent-tester:8094"
|
|
|
|
# In-memory job registry. Keyed by check_id. Values:
|
|
# {"status": "running"|"completed"|"failed"|"skipped_tdm",
|
|
# "progress": str, "progress_pct": int, "result": dict, ...}
|
|
# Read/written by:
|
|
# - agent_compliance_check_routes (start/status/_run/_update)
|
|
# - saving_scan_routes (start)
|
|
# - agent_migration_routes (status mirror)
|
|
_compliance_check_jobs: dict[str, dict] = {}
|
|
|
|
|
|
# Canonical doc types in the same order the frontend
|
|
# ComplianceCheckTab renders them. The route pads `results` to always
|
|
# include an entry for each — missing rows are flagged as 'Nicht
|
|
# eingereicht' or 'Auf der Website nicht gefunden'.
|
|
#
|
|
# DSB-Kontakt is NOT canonical: per GDPR practice the DSB is named
|
|
# inside the DSI/datenschutz document (email or contact block), not as
|
|
# a separate page. We check 'DSB benannt' as a sub-check of the DSE.
|
|
_ALL_DOC_TYPES = [
|
|
"dse", "impressum", "social_media", "cookie",
|
|
"agb", "nutzungsbedingungen", "widerruf", "legal_notice",
|
|
]
|
|
|
|
|
|
# Capture-only doc types: erfasst + als doc_entry persistiert (für die
|
|
# Cross-Doc-Reconciliation B), aber NICHT einzeln gescort. Sie haben keine
|
|
# eigene Checkliste/MCs → _check_single würde nur eine irreführende 0%-Zeile
|
|
# erzeugen. 'legal_notice' (Footer-„Rechtlicher Hinweis"/Disclaimer) trägt oft
|
|
# VSBG/ODR-Aussagen, die Impressum-Pflichten erfüllen → wertvoll für B.
|
|
_CAPTURE_ONLY = {"legal_notice"}
|
|
|
|
|
|
# Human-readable labels per doc_type. Used in the report + emails.
|
|
_DOC_TYPE_LABELS = {
|
|
"dse": "Datenschutzerklaerung",
|
|
"datenschutz": "Datenschutzerklaerung",
|
|
"privacy": "Datenschutzerklaerung",
|
|
"impressum": "Impressum",
|
|
"agb": "AGB",
|
|
"widerruf": "Widerrufsbelehrung",
|
|
"cookie": "Cookie-Richtlinie",
|
|
"avv": "Auftragsverarbeitung",
|
|
"loeschkonzept": "Loeschkonzept",
|
|
"dsfa": "Datenschutz-Folgenabschaetzung",
|
|
"social_media": "Social Media Datenschutz",
|
|
"nutzungsbedingungen": "Nutzungsbedingungen",
|
|
"dsb": "DSB-Kontakt",
|
|
# P74: Legal-Notice / Rechtliche Hinweise (IP, Forward-Looking, Risiko)
|
|
"legal_notice": "Rechtliche Hinweise",
|
|
# P96: Digital Services Act-Pflichtangaben (Art. 12+17 DSA)
|
|
"dsa": "DSA-Pflichtangaben",
|
|
# P97: Lizenzhinweise Dritter (OSS-Compliance)
|
|
"lizenzhinweise": "Lizenzhinweise Dritter",
|
|
}
|
|
|
|
|
|
# Title/URL keywords → canonical doc_type. Order matters: most-specific first.
|
|
_DISCOVERY_RULES: list[tuple[str, tuple[str, ...]]] = [
|
|
("cookie", ("cookie", "kuche", "biscuit", "cookies-")),
|
|
("widerruf", ("widerruf", "rueckgabe", "rückgabe", "cancellation",
|
|
"right-of-withdrawal", "ruecktritts", "rücktritts")),
|
|
("social_media", ("social-media", "soziale-medien", "social_media",
|
|
"social-media-policy")),
|
|
# P23: 'terms-and-conditions' kann Allgemeine Geschaeftsbedingungen ODER
|
|
# Nutzungsbedingungen meinen. Discovery-Funktion klassifiziert spaeter
|
|
# praeziser per Titel + Inhalt. Hier nur Url-Hint:
|
|
("agb", ("/agb", "geschaeftsbedingungen", "geschäftsbedingungen",
|
|
"general-terms")),
|
|
("nutzungsbedingungen", ("nutzungsbedingung", "nutzungsbedingungen",
|
|
"terms-of-use", "terms-and-conditions",
|
|
"nutzungsordnung", "terms-of-service",
|
|
"allgemeine-nutzungsbedingungen")),
|
|
("dsb", ("datenschutzbeauftragt", "data-protection-officer",
|
|
"dpo-contact", "/dsb")),
|
|
# A: 'legal-disclaimer' (Footer-„Rechtlicher Hinweis") VOR impressum, damit
|
|
# die Disclaimer-Seite NICHT mehr als Impressum substituiert wird (war die
|
|
# Ursache, dass die Cross-Doc-Reconciliation nie zündete).
|
|
("legal_notice", ("legal-disclaimer", "legal-disclaimer-pool",
|
|
"rechtlicher-hinweis", "rechtliche-hinweise",
|
|
"haftungsausschluss")),
|
|
("impressum", ("impressum", "imprint", "legal-notice", "site-notice",
|
|
"anbieterkennzeichnung")),
|
|
("dse", ("data-privacy", "datenschutz", "data-protection",
|
|
"privacy-policy", "privacy-notice", "dsgvo",
|
|
"data_privacy", "datenschutzinformation")),
|
|
]
|
|
|
|
|
|
# Compound TLDs that count as 2 labels when extracting the second-level
|
|
# domain (e.g. shop.example.co.uk → 'example', not 'co').
|
|
_COMPOUND_TLDS = {
|
|
"co.uk", "co.jp", "co.nz", "co.kr", "co.za", "co.in",
|
|
"com.au", "com.br", "com.mx", "com.tr", "com.sg",
|
|
}
|