Files
breakpilot-compliance/consent-tester/services/cmp_library/didomi.py
T
Benjamin Admin 7e426c31f1 feat(consent-tester): Phase B — named CMP library + plugin architecture
cmp_extractor.py refactored to thin coordinator (123 LOC, was 223).
Discovers all CMP modules via cmp_library/_registry.py:load_all() at
import time. Restart consent-tester to pick up new modules.

New cmp_library/ folder:
- _registry.py: auto-discovers all modules with MATCHER + reconstruct()
- epaas.py:     BMW Group ePaaS (extracted from cmp_extractor)
- onetrust.py:  cdn.cookielaw.org Groups/Cookies schema
- cookiebot.py: consent.cookiebot.com Categories schema
- usercentrics.py: api.usercentrics.eu services schema
- didomi.py:    sdk.privacy-center.org notice + vendors + purposes
- trustarc.py:  consent.trustarc.com categories + vendors

Each module:
- MATCHER: re.Pattern matching the CMP JSON endpoint URL
- reconstruct(d: dict) -> str: builds German Markdown cookie-policy text

Phase E (self-improving) will write auto_*.py files into the same folder;
_registry already picks those up via pkgutil.iter_modules.
2026-05-16 22:59:48 +02:00

52 lines
1.5 KiB
Python

"""Didomi CMP.
URLs:
- sdk.privacy-center.org/<id>/notice/<lang>.json
- api.privacy-center.org/v1/notices/...
Schema: app.vendors[], app.purposes[], notice texts
"""
import re
MATCHER = re.compile(
r"(?:sdk|api)\.privacy-center\.org/.+/notice[s]?/.*\.json(?:\?|$)", re.I,
)
def reconstruct(d: dict) -> str:
parts: list[str] = ["# Cookie-Richtlinie (Didomi)"]
app = d.get("app", d) or {}
notice = d.get("notice", {}) or app.get("notice", {}) or {}
for key in ("content", "title", "subtitle"):
v = notice.get(key)
if v:
parts.append("")
parts.append(str(v))
purposes = app.get("purposes") or d.get("purposes") or []
if purposes:
parts.append("")
parts.append("## Zwecke")
for p in purposes:
name = p.get("name") or p.get("id") or ""
desc = p.get("description") or ""
parts.append(f"- {name}: {desc[:200]}")
vendors = app.get("vendors") or d.get("vendors") or []
if vendors:
parts.append("")
parts.append(f"## Anbieter ({len(vendors)})")
for v in vendors[:80]:
name = v.get("name") or ""
country = v.get("country") or ""
policy = v.get("policyUrl") or ""
line = f"- {name}"
if country:
line += f" — Sitz: {country}"
if policy:
line += f" — Datenschutz: {policy}"
parts.append(line)
return "\n".join(parts)