feat(audit): Phase 1 Quick-Wins (P81 + P85 + P70 + P83) + TCF DELETE/INSERT-Fix
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 / detect-changes (push) Successful in 11s
CI / branch-name (push) Has been skipped
CI / loc-budget (push) Failing after 16s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 15s
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 / test-python-dsms-gateway (push) Has been skipped
CI / test-go (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 / detect-changes (push) Successful in 11s
CI / branch-name (push) Has been skipped
CI / loc-budget (push) Failing after 16s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 15s
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 / test-python-dsms-gateway (push) Has been skipped
CI / test-go (push) Has been skipped
P81 — tests/fixtures/golden_truth/vw_de.json: GT-Fixture mit must_find_cookies (47 VW-Cookies) + expected_vendors (Google, Adobe, Trade Desk, ...). Basis fuer kuenftige Regression-Tests. P85 — banner_screenshot_block.py + consent_scanner.py + main.py: consent-tester macht beim Banner-Detect einen base64-PNG-Screenshot (< 1.5MB). Backend rendert ihn als <img src="data:..."> direkt nach dem GF-1-Pager. Visueller Beweis 'so sah das Banner aus' fuer Dispute mit Marketing/DSB. P70 — rag_provenance.py: classify_finding_provenance() klassifiziert ein Finding als 'rag' (Norm + Quelle), 'mixed' (Norm ohne Quelle) oder 'heuristic' (eigene Interpretation). provenance_badge_html() rendert kleine Badges (✓ RAG / NORM / ⚠ HEURISTIK). Modul ist generisch, kann bei jedem Finding-Renderer einklinkt werden. P83 — scripts/check-rebuild-needed.sh: Prueft ob die im Container deployten BUILD_SHA mit local HEAD uebereinstimmen. Bei Mismatch exit 1 mit 'REBUILD REQUIRED'-Hinweis. Verhindert das 'alter Code im Container'-Problem das uns mehrfach erwischt hat (Frontend-Tabs sichtbar, Backend ohne neuen Service). TCF-Fix — tcf_vendor_authority.py: cookie_library hat keinen UNIQUE-Index auf cookie_name → ON CONFLICT war unmoeglich. Loesung: vor Insert DELETE WHERE source_name='iab_tcf_v2'. Idempotent. + per-Vendor-Commit damit ein Fail die naechsten nicht blockt. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -77,6 +77,10 @@ class ConsentTestResult:
|
||||
# for behavior-validation in backend. Implicit declared_category:
|
||||
# before/reject phase = essential (site claims), accept = any.
|
||||
cookies_detailed: list = field(default_factory=list)
|
||||
# P85: base64-PNG-Screenshot des Banners vor dem ersten Klick.
|
||||
# Backend embedded das als <img> in der Mail — visueller Beweis
|
||||
# "so sah das Banner zum Audit-Zeitpunkt aus".
|
||||
banner_screenshot_b64: str = ""
|
||||
|
||||
|
||||
async def run_consent_test(
|
||||
@@ -196,6 +200,17 @@ async def run_consent_test(
|
||||
result.banner_text_violations = banner_violations["violations"]
|
||||
result.banner_has_impressum_link = banner_violations["has_impressum"]
|
||||
result.banner_has_dse_link = banner_violations["has_dse"]
|
||||
# P85 — visueller Beweis fuer die Mail.
|
||||
try:
|
||||
import base64 as _b64
|
||||
png = await page_a.screenshot(
|
||||
full_page=False, type="png", timeout=10000,
|
||||
)
|
||||
if png and len(png) < 1_500_000: # < 1.5 MB
|
||||
result.banner_screenshot_b64 = _b64.b64encode(png).decode("ascii")
|
||||
logger.info("P85: banner screenshot captured (%d bytes)", len(png))
|
||||
except Exception as _se:
|
||||
logger.warning("P85: banner screenshot failed: %s", _se)
|
||||
|
||||
await ctx_a.close()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user