feat: 8 cookie banner legal checks (Playwright)
1. Impressum link accessible from banner (§5 TMG, LG Rostock) 2. DSE link in banner (Art. 13 DSGVO, informierte Einwilligung) 3. Wrong wording: "Zustimmung zur DSE" — DSE is Art. 13 obligation, not consent. Correct: "zur Kenntnis genommen" 4. Reject button visible (§25 TDDDG, no hidden reject) 5. Pre-ticked checkboxes detected (EuGH C-673/17 Planet49) 6. Dark Pattern: button size comparison — accept vs reject area ratio >2.5x or font size ratio >1.5x = dark pattern 7. Cookie Wall detection (Phase B — site blocked after reject) 8. Re-access to settings (Art. 7(3) — revocation as easy as consent) All checks run via Playwright on the actual rendered banner. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -42,6 +42,7 @@ class ScanResponse(BaseModel):
|
||||
summary: dict
|
||||
scanned_at: str
|
||||
category_tests: list = []
|
||||
banner_checks: dict = {}
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
@@ -81,11 +82,17 @@ async def scan_consent(req: ScanRequest):
|
||||
},
|
||||
summary={
|
||||
"critical": sum(1 for v in result.reject_violations if v.severity == "CRITICAL"),
|
||||
"high": len(result.before_violations),
|
||||
"high": len(result.before_violations) + sum(1 for v in result.banner_text_violations if v.severity == "HIGH"),
|
||||
"undocumented": len(result.accept_undocumented),
|
||||
"total_violations": len(result.before_violations) + len(result.reject_violations),
|
||||
"total_violations": len(result.before_violations) + len(result.reject_violations) + len(result.banner_text_violations),
|
||||
"category_violations": sum(len(ct.violations) for ct in result.category_tests),
|
||||
"categories_tested": len(result.category_tests),
|
||||
"banner_text_issues": len(result.banner_text_violations),
|
||||
},
|
||||
banner_checks={
|
||||
"has_impressum_link": result.banner_has_impressum_link,
|
||||
"has_dse_link": result.banner_has_dse_link,
|
||||
"violations": [v.__dict__ for v in result.banner_text_violations],
|
||||
},
|
||||
scanned_at=datetime.now(timezone.utc).isoformat(),
|
||||
category_tests=[{
|
||||
|
||||
Reference in New Issue
Block a user