feat(cookie): missing_retention — Vendor ohne Speicherdauer/Löschfrist

Vendor-Ebenen-Finding: greift, wenn ein Vendor eine Verarbeitung deklariert
(Kategorie/Zweck), aber KEINE Cookies gelistet sind UND keine persistence
angegeben ist (z.B. Nayoki GmbH — 'necessary' Auftragsverarbeiter ohne
Löschfrist). Die Pro-Cookie-Schleife sah solche Vendors nie (0 Cookies →
0 Findings). Remediation = Ticket-Text 'bitte Löschfrist festlegen'.
Art. 5 Abs. 1 lit. e + Art. 13 Abs. 2 lit. a → Control AUTH-2051-A03.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-11 10:02:59 +02:00
parent 32ba8d16b1
commit 7fa9968ce1
3 changed files with 53 additions and 0 deletions
@@ -112,6 +112,33 @@ def test_vague_duration_flagged_concrete_ok():
assert "Art. 5" in vd[0]["remediation"]
def test_missing_retention_vendor_without_cookies_or_duration():
# User-Beispiel Nayoki GmbH: als 'necessary' deklarierter Auftragsverarbeiter,
# KEINE Cookies gelistet, KEINE persistence → Speicherdauer/Löschfrist-Finding.
out = analyze_cookies([{
"name": "Nayoki GmbH — BMW Sport & Kultur Social Wall",
"category": "necessary", "persistence": "",
"purpose": "Verwaltung der Social Wall.",
"cookies": [],
}])
mr = [f for f in out["findings"] if f["type"] == "missing_retention"]
assert len(mr) == 1
assert "Nayoki" in mr[0]["vendor"]
assert "Löschfrist" in mr[0]["remediation"]
assert mr[0]["severity"] == "MEDIUM"
assert mr[0]["control"]["control_id"] == "AUTH-2051-A03"
assert "Art. 13 Abs. 2" in mr[0]["control"]["article"]
def test_no_missing_retention_when_vendor_has_cookies():
# Vendor MIT Cookies (konkrete Dauer) → kein missing_retention.
out = analyze_cookies([{
"name": "X", "category": "necessary", "persistence": "",
"cookies": [{"name": "sess", "purpose": "x", "expiry": "Session"}],
}])
assert not [f for f in out["findings"] if f["type"] == "missing_retention"]
def test_big_library_covers_cookie_not_in_rich_db():
# Cookie nicht in der 35er rich-DB, aber in der grossen 2287er (big_lib).
big = {"bmw_track_de": {