feat(audit-mail): P58/P59c/P60b/P61/P62 — Mercedes-Cycle Phase 1 abgeschlossen
CI / nodejs-build (push) Has been skipped
CI / test-go (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-backend (push) Successful in 38s
CI / test-python-document-crawler (push) Has been skipped
CI / detect-changes (push) Successful in 12s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 14s
CI / loc-budget (push) Failing after 15s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
CI / nodejs-build (push) Has been skipped
CI / test-go (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-backend (push) Successful in 38s
CI / test-python-document-crawler (push) Has been skipped
CI / detect-changes (push) Successful in 12s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 14s
CI / loc-budget (push) Failing after 15s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
P58 Anti-Audit-Detection robuster (script-domain + settings-spezifisch —
war bereits im Code, jetzt sauber als completed dokumentiert).
P59c DACH-Custom-Cookies in compliance.cookie_library: Borlabs,
etracker, Matomo/Piwik, Userlike, Cookiebot/Cookieyes/Usercentrics,
Akamai/Cloudflare/Datadome Bot-Manager + HubSpot. 21 neue Eintraege
(3 von 24 schon via Open-Cookie-Database vorhanden).
Script: backend-compliance/scripts/seed_dach_cookies.py.
P60b Vendor-Pattern-Dedupe mit Fuzzy-Match (Jaccard >= 0.7) statt exakter
Tuple-Equality. Vendors mit teilweise befuellten Feldern (z.B.
Sitzland eingetragen) fallen nicht mehr aus der globalen Notice —
Bug: Amazon/Psyma/Qualtrics hatten zuvor wiederholte per-row Actions.
P61 "Untergeschobene Cookies"-Erkennung — wenn ein deklarierter Vendor
(z.B. Google Tag Manager) automatisch weitere mitbringt (GA + GCL_AU
+ DoubleClick), werden diese als separater Mail-Block (gelb) mit
COOKIE/VENDOR-Badges + Quellen-Doku ausgewiesen. Neuer Service:
compliance.services.vendor_package_cookies (8 Primary-Vendors mit
je 2-4 implicit Cookies/Vendors).
P62 Marketing-Manager-Disclaimer "Was wir sehen / nicht sehen" als
blauer Box-Block direkt unter dem Critical-Findings-Block. Erklaert
Grenzen unseres Audits (Server-Side-Tracking, Vendor-interne
Datenweitergabe, Cross-Page-Banner) und Risiko des Falschvertrauens
in einen 100%-Score. Neuer Renderer: compliance.api.scope_disclaimer.
Architektur: VVT-Tabellen-Renderer aus agent_doc_check_extras.py (552
LOC -> 242 LOC) in compliance.api.vvt_table_renderer ausgelagert, um den
500-LOC-Hardcap einzuhalten.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -760,6 +760,36 @@ async def _run_compliance_check(check_id: str, req: ComplianceCheckRequest):
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# P61: "Untergeschobene Cookies" — wenn z.B. Google Tag Manager
|
||||
# deklariert ist, kommen GA + GCL_AU + DoubleClick automatisch mit.
|
||||
# Findings landen im banner_result fuer Mail-Render.
|
||||
if banner_result and cmp_vendors:
|
||||
try:
|
||||
from compliance.services.vendor_package_cookies import (
|
||||
detect_implicit_cookies,
|
||||
)
|
||||
declared = [v.get("name", "") for v in cmp_vendors if v.get("name")]
|
||||
actual_cookies: list[str] = []
|
||||
for phase_data in (banner_result.get("phases") or {}).values():
|
||||
if isinstance(phase_data, dict):
|
||||
for ck in (phase_data.get("cookies") or []):
|
||||
if isinstance(ck, dict) and ck.get("name"):
|
||||
actual_cookies.append(ck["name"])
|
||||
implicit_findings = detect_implicit_cookies(
|
||||
declared, actual_cookies_set=actual_cookies or None,
|
||||
)
|
||||
if implicit_findings:
|
||||
banner_result["implicit_vendor_findings"] = implicit_findings
|
||||
logger.info(
|
||||
"P61: %d implicit vendor-package items detected "
|
||||
"(%d cookies + %d vendors)",
|
||||
len(implicit_findings),
|
||||
sum(1 for f in implicit_findings if f["implicit"]["type"] == "cookie"),
|
||||
sum(1 for f in implicit_findings if f["implicit"]["type"] == "vendor"),
|
||||
)
|
||||
except Exception as p61_err:
|
||||
logger.warning("P61 implicit-vendor detection failed: %s", p61_err)
|
||||
|
||||
if cmp_vendors:
|
||||
logger.info("VVT: %d vendors extracted, validating links",
|
||||
len(cmp_vendors))
|
||||
@@ -932,9 +962,17 @@ async def _run_compliance_check(check_id: str, req: ComplianceCheckRequest):
|
||||
# 6) redundancy_html (Optimierungspotenzial — direkt nach Compliance-Score)
|
||||
# 7) providers_html + vvt_html (Vendor-Liste)
|
||||
# 8) report_html (Doc-Pruefung Details)
|
||||
# P62: Marketing-Manager-Disclaimer — was wir sehen vs nicht sehen
|
||||
scope_disclaimer_html = ""
|
||||
try:
|
||||
from .scope_disclaimer import build_scope_disclaimer_html
|
||||
scope_disclaimer_html = build_scope_disclaimer_html()
|
||||
except Exception as e:
|
||||
logger.warning("Scope-disclaimer block skipped: %s", e)
|
||||
|
||||
full_html = (
|
||||
critical_html + exec_summary_html + cookie_arch_html
|
||||
+ summary_html + scanned_html + profile_html
|
||||
critical_html + scope_disclaimer_html + exec_summary_html
|
||||
+ cookie_arch_html + summary_html + scanned_html + profile_html
|
||||
+ scorecard_html + redundancy_html
|
||||
+ providers_html + banner_deep_html + vvt_html + report_html
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user