cuonztech-privacy-chaos-gate 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +97 -0
- package/README.md +197 -30
- package/action.yml +187 -26
- package/dist/chunk-42D7PLVP.js +9146 -0
- package/dist/cli.js +96 -93
- package/dist/index.d.ts +710 -88
- package/dist/index.js +41 -12
- package/docs/BRAND-PILOT-EVIDENCE.md +41 -49
- package/package.json +6 -5
- package/dist/chunk-FN3QUFUZ.js +0 -36
- package/dist/chunk-FN3QUFUZ.js.map +0 -1
- package/dist/chunk-T5D6BUAC.js +0 -4514
- package/dist/chunk-T5D6BUAC.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/resolveGrant-6U6VG3DM.js +0 -230
- package/dist/resolveGrant-6U6VG3DM.js.map +0 -1
- package/docs/LIZENZ-KAUFFLUSS.md +0 -105
- package/docs/PREISMODELL.md +0 -63
package/LICENSE
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
CuonzTech Privacy Chaos Gate (CPCG) — Lizenz / License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 CuonzTech · Carlo Cuonz. Alle Rechte vorbehalten. / All rights reserved.
|
|
4
|
+
|
|
5
|
+
Source-available, proprietär. Der Quelltext ist einsehbar, aber nicht frei im Sinne einer
|
|
6
|
+
Open-Source-Lizenz. Gilt ab Version 0.2.1.
|
|
7
|
+
Fassung vom 2026-10-23 (Revision 2). / Revision of 2026-10-23 (revision 2).
|
|
8
|
+
|
|
9
|
+
HINWEIS ZU FRÜHEREN VERSIONEN
|
|
10
|
+
Die bereits auf npm veröffentlichten Versionen 0.1.0 und 0.2.0 wurden unter der MIT-Lizenz
|
|
11
|
+
veröffentlicht. Für Empfänger dieser Versionen bleiben sie unter MIT. Diese Lizenz gilt für
|
|
12
|
+
Version 0.2.1 und alle späteren Versionen.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
================================================================================
|
|
16
|
+
DEUTSCH
|
|
17
|
+
================================================================================
|
|
18
|
+
|
|
19
|
+
1. Was ohne Lizenzschlüssel erlaubt ist
|
|
20
|
+
Sie dürfen die Software herunterladen, installieren und ausführen, um Websites zu
|
|
21
|
+
scannen und das Konsolen-Gate (Ergebnis in der Konsole, Exit-Code, JSON-Report) in der
|
|
22
|
+
CI zu verwenden. Das gilt auch für kommerzielle und interne Zwecke. Ziele auf dem
|
|
23
|
+
eigenen Rechner (localhost, Loopback) sind immer frei. Frei ist ebenso der lokale
|
|
24
|
+
Auto-Fix: Patches erzeugen und im eigenen Arbeitsverzeichnis anwenden, ohne Commit und
|
|
25
|
+
ohne Pull Request.
|
|
26
|
+
|
|
27
|
+
2. Was eine gültige Lizenz von CuonzTech erfordert
|
|
28
|
+
a) Erzeugen eines PDF-Reports sowie eines Kundenreports (HTML/Markdown mit --client),
|
|
29
|
+
b) Auto-Fix als Commit oder Pull Request (Code-Patches in ein Repository schreiben,
|
|
30
|
+
nicht das lokale Anwenden im Arbeitsverzeichnis).
|
|
31
|
+
Eine Lizenz erhalten Sie über cuonztech.ch (Pilot, Pro, Agency). Der Umfang der Tarife
|
|
32
|
+
steht auf der Produktseite und in der Lizenzmail. Die Zahl der Domains je Tarif beruht
|
|
33
|
+
auf Vertrauen; die Software zählt sie nicht.
|
|
34
|
+
|
|
35
|
+
3. Was nicht erlaubt ist
|
|
36
|
+
- Die Software oder Teile davon zu kopieren, zu verkaufen, weiterzugeben,
|
|
37
|
+
unterzulizenzieren oder als eigenes Produkt oder als Dienstleistung anzubieten,
|
|
38
|
+
soweit dies über Ziffer 1 hinausgeht.
|
|
39
|
+
- Lizenzprüfungen, Lizenzschlüssel, Signaturprüfungen oder Hinweise auf diese Lizenz zu
|
|
40
|
+
entfernen, zu umgehen, zu deaktivieren oder zu fälschen.
|
|
41
|
+
- Lizenzschlüssel Dritten zugänglich zu machen oder zu veröffentlichen.
|
|
42
|
+
- Copyright- und Lizenzhinweise zu entfernen.
|
|
43
|
+
Die Einsicht in den Quelltext begründet kein Recht, ihn zu verändern oder
|
|
44
|
+
weiterzuverbreiten.
|
|
45
|
+
|
|
46
|
+
4. Keine Gewährleistung, keine Rechtsberatung
|
|
47
|
+
Die Software wird «wie besehen» geliefert, ohne Zusicherung der Eignung für einen
|
|
48
|
+
bestimmten Zweck, der Vollständigkeit der Befunde oder der Konformität einer Website mit
|
|
49
|
+
dem revDSG, der DSGVO oder anderem Recht. Sie ist ein technisches Hilfsmittel und
|
|
50
|
+
ersetzt keine Rechtsberatung. Die Haftung ist im gesetzlich zulässigen Rahmen
|
|
51
|
+
ausgeschlossen, insbesondere für indirekte Schäden und entgangenen Gewinn.
|
|
52
|
+
|
|
53
|
+
5. Drittkomponenten
|
|
54
|
+
Die Software verwendet Open-Source-Bibliotheken (zum Beispiel Playwright, Commander, Zod)
|
|
55
|
+
unter deren jeweiligen Lizenzen. Diese Lizenz ändert sie nicht.
|
|
56
|
+
|
|
57
|
+
6. Beendigung
|
|
58
|
+
Verstösse gegen Ziffer 3 beenden die Berechtigung nach Ziffer 1 und 2 ohne weitere
|
|
59
|
+
Mitteilung.
|
|
60
|
+
|
|
61
|
+
7. Anwendbares Recht
|
|
62
|
+
Schweizer Recht. Gerichtsstand ist der Sitz von CuonzTech, soweit zwingendes Recht nichts
|
|
63
|
+
anderes vorsieht.
|
|
64
|
+
|
|
65
|
+
8. Kontakt
|
|
66
|
+
support@cuonztech.ch · https://cuonztech.ch
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
================================================================================
|
|
70
|
+
ENGLISH (short version; the German text above governs in case of doubt)
|
|
71
|
+
================================================================================
|
|
72
|
+
|
|
73
|
+
Copyright (c) 2026 CuonzTech · Carlo Cuonz. All rights reserved. Source-available,
|
|
74
|
+
proprietary, from version 0.2.1.
|
|
75
|
+
|
|
76
|
+
Versions 0.1.0 and 0.2.0 were published on npm under the MIT License and remain under MIT
|
|
77
|
+
for their recipients. This license applies to version 0.2.1 and later.
|
|
78
|
+
|
|
79
|
+
Without a license key you may install and run the software to scan websites and use the
|
|
80
|
+
console gate (console output, exit code, JSON report) in CI, including for commercial and
|
|
81
|
+
internal use. Local targets (localhost, loopback) are always free. Local auto-fix (creating
|
|
82
|
+
and applying patches in your own working directory, without a commit or pull request) is free
|
|
83
|
+
as well.
|
|
84
|
+
|
|
85
|
+
A valid license from CuonzTech is required for: the PDF report and customer reports (HTML,
|
|
86
|
+
Markdown with --client) and auto-fix as a commit or pull request (writing patches into a repository).
|
|
87
|
+
The number of domains per plan is based on trust and is not counted by the software.
|
|
88
|
+
|
|
89
|
+
You may not copy, sell, redistribute or sublicense the software, offer it as your own
|
|
90
|
+
product or service, or remove, bypass, disable or forge license checks, license keys or
|
|
91
|
+
license notices. Viewing the source code grants no right to modify or redistribute it.
|
|
92
|
+
|
|
93
|
+
The software is provided "as is", without warranty of any kind. It is a technical aid, not
|
|
94
|
+
legal advice, and does not guarantee compliance with the Swiss revFADP, the GDPR or any
|
|
95
|
+
other law. Liability is excluded to the extent permitted by law.
|
|
96
|
+
|
|
97
|
+
Swiss law applies. Contact: support@cuonztech.ch
|
package/README.md
CHANGED
|
@@ -9,22 +9,55 @@ läuft erlaubtes Tracking nach dem Akzeptieren korrekt an?
|
|
|
9
9
|
|
|
10
10
|
## Installieren
|
|
11
11
|
|
|
12
|
+
Voraussetzung: Node.js 20 oder neuer.
|
|
13
|
+
|
|
12
14
|
```bash
|
|
13
|
-
|
|
14
|
-
# oder
|
|
15
|
-
|
|
15
|
+
# 1. CLI installieren (Befehl: cpcg)
|
|
16
|
+
npm install -g cuonztech-privacy-chaos-gate # oder im Projekt: npm install -D cuonztech-privacy-chaos-gate
|
|
17
|
+
|
|
18
|
+
# 2. Prüf-Browser installieren (einmalig pro Rechner)
|
|
19
|
+
npx playwright install chromium
|
|
20
|
+
|
|
21
|
+
# 3. Ersten Scan starten (Scan und Konsolen-Gate brauchen keine Lizenz)
|
|
22
|
+
cpcg --url https://staging.example.com
|
|
16
23
|
```
|
|
17
24
|
|
|
18
|
-
|
|
25
|
+
Ohne Installation: `npx cuonztech-privacy-chaos-gate --url https://staging.example.com`
|
|
26
|
+
(der Browser aus Schritt 2 muss trotzdem vorhanden sein; auf Linux-CI zusätzlich mit Systembibliotheken:
|
|
27
|
+
`npx playwright install --with-deps chromium`). Fehlt der Browser, meldet das CLI das und beendet sich mit Exit 3.
|
|
28
|
+
|
|
29
|
+
Das CLI hat keine Subcommands: alle Angaben sind Optionen von `cpcg`.
|
|
19
30
|
|
|
31
|
+
## Lizenz und Preise
|
|
32
|
+
|
|
33
|
+
Das Paket ist proprietär und source-available (Datei `LICENSE`, ab 0.2.1; die Versionen 0.1.0 und 0.2.0 wurden unter MIT veröffentlicht und bleiben es).
|
|
20
34
|
Online-Kauf → Code per Mail.
|
|
21
35
|
|
|
22
36
|
```bash
|
|
23
|
-
export CPCG_LICENSE="CPCG-…"
|
|
24
|
-
cpcg
|
|
37
|
+
export CPCG_LICENSE="CPCG-…" # Lizenzcode (Pilot/Einmal) oder Kunden-Key CPCG-K-… (Abo)
|
|
38
|
+
cpcg --url https://staging.example.com --jurisdiction CH
|
|
25
39
|
```
|
|
26
40
|
|
|
27
|
-
|
|
41
|
+
In CI die Lizenz als Secret setzen und per Umgebungsvariable `CPCG_LICENSE` übergeben, nicht als Argument.
|
|
42
|
+
|
|
43
|
+
**Frei, ohne Lizenz** (auch kommerziell und intern, auch gegen Produktiv-URLs): Scan, Konsolen-Gate (Exit-Code, JSON-Report, neutraler Evidence-Report ohne Kundenbezug), lokales `--auto-fix` ohne Commit/PR. Ziele auf `localhost`, `127.0.0.1` und `::1` sind immer frei.
|
|
44
|
+
|
|
45
|
+
**Nur mit gültiger Lizenz:**
|
|
46
|
+
|
|
47
|
+
| Funktion | Option |
|
|
48
|
+
|----------|--------|
|
|
49
|
+
| PDF-Report sowie Kundenreport (HTML/Markdown mit `--client`) | `--report-pdf`, `--client` |
|
|
50
|
+
| Auto-Fix als Commit oder Pull Request | `--git-commit`, `--create-pr` |
|
|
51
|
+
|
|
52
|
+
Ohne Lizenz werden diese Funktionen mit einem Hinweis übersprungen; der Exit-Code bleibt der des Gates. Exit 2 gibt es nur bei einer **ungültigen, abgelaufenen oder gesperrten** Lizenz, nicht bei fehlender Lizenz und nicht bei einem nicht erreichbaren Lizenzserver.
|
|
53
|
+
|
|
54
|
+
| Plan | Preis (netto, CHF) | Umfang |
|
|
55
|
+
|------|--------------------|--------|
|
|
56
|
+
| Pilot / Evidence | 890 einmalig | Kundenreport, Auto-Fix-PR, 1 Domain, 90 Tage |
|
|
57
|
+
| Pro | 69 je Domain und Monat | Kundenreport, Auto-Fix-PR, GitHub Action und CLI-Lizenz |
|
|
58
|
+
| Agency | 349 je Monat | Pro für bis zu 10 Domains |
|
|
59
|
+
|
|
60
|
+
Die Domain-Anzahl beruht auf Vertrauen: das CLI zählt Domains nicht. Scans werden nicht gezählt. Monatlich kündbar. Kauf und Fragen: `support@cuonztech.ch`.
|
|
28
61
|
|
|
29
62
|
## Was das Tool prüft
|
|
30
63
|
|
|
@@ -61,32 +94,104 @@ JustRelate, Didomi, Axeptio, Sourcepoint, Consentmanager, Borlabs, Klaro.
|
|
|
61
94
|
Jeder Scan schreibt ein Evidence-Paket:
|
|
62
95
|
|
|
63
96
|
```
|
|
64
|
-
report.json
|
|
65
|
-
report-evidence.md
|
|
66
|
-
report-evidence.html
|
|
67
|
-
|
|
68
|
-
|
|
97
|
+
reports/privacy-chaos-report.json LeakReport (maschinenlesbar), Pfad per --report-output
|
|
98
|
+
reports/privacy-chaos-report-evidence.md Evidence-Report (Markdown); mit Lizenz und --client als Kundenreport
|
|
99
|
+
reports/privacy-chaos-report-evidence.html Evidence-Report (HTML, CuonzTech-Brand); mit Lizenz und --client als Kundenreport
|
|
100
|
+
reports/privacy-chaos-report-deluxe.pdf Deluxe-PDF mit Deckblatt (mit --report-pdf, nur mit Lizenz)
|
|
101
|
+
reports/evidence/ Screenshots (portabel, relative Pfade)
|
|
69
102
|
```
|
|
70
103
|
|
|
71
|
-
|
|
104
|
+
Die Dateinamen richten sich nach dem JSON-Pfad: `<name>.json` ergibt `<name>-evidence.md`, `<name>-evidence.html`
|
|
105
|
+
und `<name>-deluxe.pdf` im selben Ordner, die Screenshots liegen in `evidence/` daneben. Standard ist
|
|
106
|
+
`reports/privacy-chaos-report.json`; mit `--report-output reports/scan.json` heissen die Dateien `reports/scan-evidence.md` usw.
|
|
107
|
+
|
|
108
|
+
Der Report führt **Befunde** (Regelverstösse), **Hinweise** und **beobachtete Requests**
|
|
72
109
|
(Timelines) getrennt — und ordnet jedes Ergebnis mehreren Rechtsräumen zu
|
|
73
110
|
(CH, EU, UK, US-CA, BR, ROW). Keine globale Compliance-Aussage.
|
|
74
111
|
|
|
112
|
+
**Hinweise sind kein Blocker.** Rein funktionale Drittanbieter (etwa Google Fonts) erscheinen
|
|
113
|
+
als Hinweis und blockieren das Gate nicht. Mit `--strict` blockieren auch Hinweise.
|
|
114
|
+
Bekannte, bewusst akzeptierte Befunde lassen sich mit `--ignore` ausnehmen; sie stehen im Report weiterhin
|
|
115
|
+
als «ignoriert».
|
|
116
|
+
|
|
75
117
|
## Flags
|
|
76
118
|
|
|
77
119
|
```bash
|
|
78
|
-
cpcg
|
|
79
|
-
--
|
|
80
|
-
--
|
|
81
|
-
--
|
|
82
|
-
--client "Firma AG" # Kundenname fürs Deckblatt
|
|
83
|
-
--demo # Report als synthetische Testdaten kennzeichnen
|
|
84
|
-
--jurisdiction CH # CH | EU | UK | US-CA | BR | ROW
|
|
85
|
-
--auto-fix true # Auto-Fix generieren
|
|
86
|
-
--fail-on-leak true # Exit 1 bei Leaks (CI-Gate)
|
|
120
|
+
cpcg --url https://staging.example.com \
|
|
121
|
+
--report-pdf \
|
|
122
|
+
--client "Firma AG" \
|
|
123
|
+
--jurisdiction CH \
|
|
87
124
|
--report-output reports/scan.json
|
|
88
125
|
```
|
|
89
126
|
|
|
127
|
+
| Option | Wirkung |
|
|
128
|
+
|--------|---------|
|
|
129
|
+
| `--url <url>` | Ziel (Pflicht) |
|
|
130
|
+
| `--license <code>` | Lizenzcode oder Kunden-Key; besser per Env `CPCG_LICENSE` |
|
|
131
|
+
| `--jurisdiction <code>` | `CH`, `EU`, `UK`, `US-CA`, `BR` oder `ROW` |
|
|
132
|
+
| `--report-output <pfad>` | JSON-Report (weitere Dateien daneben) |
|
|
133
|
+
| `--report-pdf [boolean]` | Deluxe-PDF (Deckblatt + Evidence) — Lizenz erforderlich |
|
|
134
|
+
| `--client <name>` | Kundenname für Kundenreport und Deckblatt — Lizenz erforderlich |
|
|
135
|
+
| `--demo [boolean]` | Report als synthetische Testdaten kennzeichnen |
|
|
136
|
+
| `--fail-on-leak [boolean]` | Exit 1 bei Leaks (CI-Gate, Standard `true`) |
|
|
137
|
+
| `--fail-on-uncheckable [boolean]` | Exit 4, wenn Kernszenarien nicht prüfbar sind (Standard `true`); bei `false` Exit 0, das Ergebnis bleibt als unvollständig markiert |
|
|
138
|
+
| `--strict [boolean]` | Auch Hinweise (z. B. Google Fonts) blockieren das Gate (Standard `false`) |
|
|
139
|
+
| `--ignore <liste>` | Befunde ausnehmen: Tracker-Name oder Host-Muster, kommagetrennt oder mehrfach (`fonts.googleapis.com,*.hotjar.com`); im Report als «ignoriert». `*`/`**` und nackte TLDs (`com`, `ch`) werden **immer** abgelehnt, auch mit `--allow-broad-ignore` (zum Abschalten der Blockierung dient `--fail-on-leak false`); ganze Zonen (`*.com`, `.ch`) nur mit `--allow-broad-ignore`. Die Konsole nennt, wie viele Befunde ausgenommen wurden; ein Szenario, dessen Befunde alle ausgenommen sind, steht als «bestanden (Befunde ignoriert)» |
|
|
140
|
+
| `--allow-broad-ignore [boolean]` | Ganze Zonen als `--ignore`-Muster (`*.com`, `*.co.uk`, `.ch`) bewusst zulassen; sie erscheinen in Konsole und Report als Warnung. `*` und nackte TLDs bleiben abgelehnt (Standard `false`) |
|
|
141
|
+
| `--accept-selector <css>` | Eigener Selektor des Akzeptieren-Buttons, wenn die Erkennung ihn nicht findet (mehrfach oder kommagetrennt) |
|
|
142
|
+
| `--reject-selector <css>` | Eigener Selektor des Ablehnen-Buttons |
|
|
143
|
+
| `--settings-selector <css>` | Eigener Selektor des Einstellungen-Buttons |
|
|
144
|
+
| `--banner-frame <teilstring>` | Teil der URL des iframes, in dem der Banner liegt (CMP im Frame); findet der Scan keinen solchen Frame, warnt er |
|
|
145
|
+
| `--banner-wait <sekunden>` | Wartefenster auf einen spät erscheinenden Banner, 1 bis 60 (Standard 8; Umgebung `CPCG_BANNER_WAIT`). Mit Angabe wird das Fenster ausgeschöpft, ebenso bei `--accept-selector`/`--reject-selector`; die Schlussprüfung wartet zusätzlich eine Nachfrist |
|
|
146
|
+
| `--max-subpages <n>` | Obergrenze der Unterseiten-Stichprobe (Szenario `subpage-spa`), 1 bis 40 (Standard 12; Umgebung `CPCG_MAX_SUBPAGES`); das Zeitbudget wächst moderat mit (45 s bis 12, 90 s bis 24, sonst 120 s) |
|
|
147
|
+
| `--auto-fix [boolean]` | Patches erzeugen und im Quellverzeichnis anwenden (Standard `true` nur mit ausdrücklichem `--source-dir`) |
|
|
148
|
+
| `--source-dir <dir>` | Quellcode für Auto-Fix; ein nicht vorhandenes Verzeichnis ist ein Fehler (Exit 3). Für `--git-commit`/`--create-pr` gilt das Git-Repository, in dem es liegt (nicht das Arbeitsverzeichnis) |
|
|
149
|
+
| `--git-commit [boolean]` | Fix in den Git-Branch committen — Lizenz erforderlich |
|
|
150
|
+
| `--create-pr [boolean]` | Fix als Pull Request öffnen (Token in Env `GITHUB_TOKEN`, ersatzweise `--github-token`) — Lizenz erforderlich; hat Vorrang vor `--git-commit` |
|
|
151
|
+
| `--base-branch <branch>`, `--branch-prefix <prefix>` | Basisbranch und Branch-Präfix des Fix-PRs |
|
|
152
|
+
| `--llm-remediation [boolean]` | Opt-in: Quellcode darf an den LLM-Anbieter gesendet werden (Standard `false`) |
|
|
153
|
+
| `--llm-provider`, `--llm-model`, `--api-key` | Nur `openai` ist umgesetzt; andere Anbieter fallen auf die Regel-Engine zurück |
|
|
154
|
+
| `--headless [boolean]`, `--timeout-ms <ms>` | Browser-Modus und Timeout je Szenario-Navigation |
|
|
155
|
+
|
|
156
|
+
Alle Optionen und Standardwerte: `cpcg --help`.
|
|
157
|
+
|
|
158
|
+
**Exit-Codes** (für CI): `0` ok · `1` Leaks gefunden (auch wenn ein Fix nur vorgeschlagen, aber nicht verifiziert ist) ·
|
|
159
|
+
`2` Lizenz **ungültig, abgelaufen oder gesperrt** (eine fehlende Lizenz oder ein nicht erreichbarer Lizenzserver ist kein Exit 2) ·
|
|
160
|
+
`3` Fehler (Ziel unerreichbar oder HTTP 4xx/5xx, Konfiguration, Browser fehlt, falsche Argumente) ·
|
|
161
|
+
`4` unvollständig, Kernszenarien nicht prüfbar.
|
|
162
|
+
Ein Lauf, der nichts abschliessend prüfen konnte, ist nie grün: `--fail-on-uncheckable` (Standard) macht daraus Exit 4.
|
|
163
|
+
|
|
164
|
+
### Unterseiten-Stichprobe
|
|
165
|
+
|
|
166
|
+
Das Szenario `subpage-spa` prüft höchstens `--max-subpages` verlinkte Unterseiten (verschiedene erste Pfadsegmente zuerst, Impressum und Datenschutz zuletzt). Sind mehr Unterseiten verlinkt als geprüft wurden, steht das nicht nur im Report: Die Konsole meldet «Unterseiten: X von Y geprüft — nicht geprüfte Routen können Verstösse enthalten; --max-subpages erhöhen», `report.json` führt es unter `gate.sampling`, die Step-Summary und der Report-Kopf zeigen «PASS, aber Stichprobe», und `gate.incomplete` ist `true`. Der Exit-Code bleibt bei PASS `0` (nicht `4`).
|
|
167
|
+
|
|
168
|
+
### Banner nicht gefunden: Selektoren und Frames
|
|
169
|
+
|
|
170
|
+
Findet die Erkennung den Banner oder einen Button nicht, wird das Szenario «nicht prüfbar» (nie grün). Dann helfen die Overrides:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
cpcg --url https://staging.example.com \
|
|
174
|
+
--accept-selector "#meine-zustimmung" \
|
|
175
|
+
--reject-selector "button[data-consent=reject]" \
|
|
176
|
+
--settings-selector ".cookie-einstellungen" \
|
|
177
|
+
--banner-frame "consent.mein-cmp.example"
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Erscheint der Banner erst spät, verlängert `--banner-wait <sekunden>` das Wartefenster (Standard 8 s). Der Scan behauptet «kein Banner» nur, wenn die Seite stabil lud und die Schlussprüfung das Fenster samt Nachfrist ohne Banner-Hinweis durchlief. Sonst steht eine eigene Meldung: «Banner erschien nach dem Wartefenster — mit --banner-wait erhöhen», «Banner vorhanden, aber nicht über Ablehnen/Akzeptieren bedienbar» (zum Beispiel nur ein Schliessen-Kreuz) oder «Seite instabil (Reload-Schleife) — Banner nicht auswertbar».
|
|
181
|
+
|
|
182
|
+
## Auto-Fix: Grenzen und Consent-Anbindung
|
|
183
|
+
|
|
184
|
+
`--auto-fix` verschiebt Tracker-Skripte hinter die Einwilligung. Das Ergebnis ist ein Vorschlag, den die Review-Stufe prüft;
|
|
185
|
+
ein nicht verifizierter Fix macht das Gate nicht grün.
|
|
186
|
+
|
|
187
|
+
- **OneTrust und Cookiebot** werden automatisch gelesen (Kategorien Statistik und Marketing); ein Hook ist nicht nötig. OneTrust wird auch ohne CDN-Marker erkannt, etwa bei selbst gehostetem SDK (`Optanon…`-Symbole, `OptanonConsent`-Cookie).
|
|
188
|
+
- **Eigene Banner** melden die Einwilligung an die eingefügte Runtime, zum Beispiel `window.cpcgGrantConsent("analytics")` (Statistik) oder `window.cpcgGrantConsent("marketing")`, ohne Argument alle Kategorien. Der Report nennt die passenden Hooks. Ohne dieses Signal startet kein Tracker; «Ablehnen» ruft nichts auf.
|
|
189
|
+
- **Andere Consent-Plattformen** (zum Beispiel Usercentrics, Sourcepoint, Didomi, iubenda) sind **nicht automatisch behebbar**: der Auto-Fix kann ihre Kategorie-Einwilligung nicht sicher lesen und erzeugt keinen Patch, sondern eine Anleitung zur manuellen Behebung.
|
|
190
|
+
- **Tracker, die nicht im Quelltext stehen** (über Tag Manager, Server, CMS oder Drittanbieter geladen) bleiben «manuell zu beheben».
|
|
191
|
+
- **LLM-gestützte Patches** sind ein Opt-in (`--llm-remediation`), nur mit OpenAI umgesetzt, und senden den Quellcode an den Anbieter. Ein API-Key allein genügt nicht und sendet nichts.
|
|
192
|
+
- **Commit und Pull Request** (`--git-commit`, `--create-pr`) brauchen eine Lizenz; das lokale Anwenden der Patches nicht. Git läuft im Repository, in dem `--source-dir` liegt; liegt es in keinem, bleibt der Fix lokal und der Lauf meldet das ausdrücklich.
|
|
193
|
+
- **Teilfix:** Bleiben gemeldete Tracker offen, zählt das Gate nur diese als «ungepatcht»; Score und «Passed» des Review-Agenten gelten dann ausdrücklich nur für den gepatchten Teil.
|
|
194
|
+
|
|
90
195
|
## Demo-Portal
|
|
91
196
|
|
|
92
197
|
Reproduzierbare Testseite mit fünf absichtlichen Consent-Leaks
|
|
@@ -94,16 +199,19 @@ Reproduzierbare Testseite mit fünf absichtlichen Consent-Leaks
|
|
|
94
199
|
|
|
95
200
|
```bash
|
|
96
201
|
node demo-portal/server.mjs # http://127.0.0.1:8787
|
|
97
|
-
|
|
98
|
-
|
|
202
|
+
npx tsx scripts/scan-demo-portal.mts # voller Scan + Report
|
|
203
|
+
npx tsx scripts/make-deluxe-report.mts # Deluxe-PDF daraus
|
|
99
204
|
```
|
|
100
205
|
|
|
206
|
+
Die Skripte in `scripts/` sind TypeScript: `node scripts/x.mts` scheitert an den Importen, deshalb `npx tsx`.
|
|
207
|
+
|
|
101
208
|
Erwartet: Gate **BLOCKED**, Szenarien «auffällig» — exakt dieselben Zahlen bei jedem Lauf.
|
|
102
209
|
|
|
103
210
|
## GitHub Action
|
|
104
211
|
|
|
105
212
|
```yaml
|
|
106
|
-
- uses: cuonztech/privacy-chaos-gate@v1
|
|
213
|
+
- uses: cuonztech/privacy-chaos-gate-action@v1
|
|
214
|
+
id: cpcg
|
|
107
215
|
with:
|
|
108
216
|
staging-url: ${{ vars.STAGING_URL }}
|
|
109
217
|
license: ${{ secrets.CPCG_LICENSE }}
|
|
@@ -111,11 +219,66 @@ Erwartet: Gate **BLOCKED**, Szenarien «auffällig» — exakt dieselben Zahlen
|
|
|
111
219
|
client-name: "Firma AG"
|
|
112
220
|
```
|
|
113
221
|
|
|
114
|
-
Die Action
|
|
222
|
+
Die Action installiert das veröffentlichte Paket `cuonztech-privacy-chaos-gate` in der Version, die in `action.yml`
|
|
223
|
+
fest eingetragen ist (`npm install --ignore-scripts`, ohne Secrets in der Umgebung dieses Schritts), samt dem passenden
|
|
224
|
+
Chromium (`playwright install --with-deps chromium`). Kennt die installierte CLI eine angeforderte Option nicht, gibt die Action
|
|
225
|
+
eine Warnung aus, statt sie still wegzulassen.
|
|
226
|
+
|
|
227
|
+
Scan und Konsolen-Gate laufen ohne Lizenz. `report-pdf`, `client-name`, `git-commit` und `create-pr` brauchen eine gültige Lizenz;
|
|
228
|
+
ohne sie werden sie mit Hinweis übersprungen.
|
|
229
|
+
|
|
230
|
+
| Input | Standard | Bedeutung |
|
|
231
|
+
|-------|----------|-----------|
|
|
232
|
+
| `staging-url` | Pflicht | Zu prüfende URL |
|
|
233
|
+
| `license` | leer | Lizenzcode oder Kunden-Key; wird nur per Umgebungsvariable `CPCG_LICENSE` übergeben |
|
|
234
|
+
| `fail-on-leak` | `true` | Build blockieren (Exit 1), wenn Leaks bleiben |
|
|
235
|
+
| `fail-on-uncheckable` | `true` | Build blockieren (Exit 4), wenn Kernszenarien nicht prüfbar sind |
|
|
236
|
+
| `strict` | `false` | Auch Hinweise (z. B. Google Fonts) blockieren das Gate |
|
|
237
|
+
| `ignore` | leer | Befunde ausnehmen (Tracker-Name oder Host-Muster, eine Angabe je Zeile oder kommagetrennt) |
|
|
238
|
+
| `accept-selector`, `reject-selector`, `settings-selector` | leer | Eigene CSS-Selektoren der Banner-Buttons (eine Angabe je Zeile) |
|
|
239
|
+
| `banner-frame` | leer | Teil der URL des iframes mit dem Banner |
|
|
240
|
+
| `max-subpages` | leer (CLI: 12) | Höchstzahl verlinkter Unterseiten, die auf Tracker geprüft werden (max. 40; mehr dauert länger) |
|
|
241
|
+
| `banner-wait` | leer (CLI-Standard) | Sekunden, die auf ein spät erscheinendes Banner gewartet wird (1–60) |
|
|
242
|
+
| `auto-fix` | `false` | Patches auf dem Runner erzeugen und anwenden; ein Gate ändert Dateien nicht stillschweigend |
|
|
243
|
+
| `create-pr` | `false` | Fix als Pull Request öffnen (braucht `auto-fix: true`, `github-token` und eine Lizenz) |
|
|
244
|
+
| `github-token` | leer | Token für `create-pr` (`contents: write`, `pull-requests: write`) |
|
|
245
|
+
| `git-commit` | `false` | Fix in den ausgecheckten Branch committen (braucht `auto-fix: true` und eine Lizenz) |
|
|
246
|
+
| `target-source-dir` | `.` | Quellcode-Verzeichnis für Auto-Fix |
|
|
247
|
+
| `report-output` | `reports/privacy-chaos-report.json` | Pfad des JSON-Reports |
|
|
248
|
+
| `report-pdf`, `client-name` | `false`, leer | Deluxe-PDF und Kundenname (Lizenz erforderlich) |
|
|
249
|
+
| `jurisdiction` | `CH` | Rechtsraum |
|
|
250
|
+
| `llm-remediation`, `api-key`, `llm-provider`, `llm-model` | `false`, leer, `openai`, `gpt-4o` | Optional: LLM-gestützte Patches. Nur OpenAI ist umgesetzt; der Quellcode wird dann an den Anbieter gesendet; ohne `llm-remediation: true` wirkt der Key nicht |
|
|
251
|
+
|
|
252
|
+
Beispiel mit Pull Request als Ergebnis:
|
|
253
|
+
|
|
254
|
+
```yaml
|
|
255
|
+
permissions:
|
|
256
|
+
contents: write
|
|
257
|
+
pull-requests: write
|
|
258
|
+
steps:
|
|
259
|
+
- uses: actions/checkout@v4
|
|
260
|
+
- uses: cuonztech/privacy-chaos-gate-action@v1
|
|
261
|
+
with:
|
|
262
|
+
staging-url: ${{ vars.STAGING_URL }}
|
|
263
|
+
license: ${{ secrets.CPCG_LICENSE }}
|
|
264
|
+
auto-fix: true
|
|
265
|
+
create-pr: true
|
|
266
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Outputs: `leaks-found`, `leaks-count`, `patch-applied`, `report-path` sowie `gate_state`, `incomplete`, `uncheckable_count`,
|
|
270
|
+
`leak_requests` und `exit_code` (geschrieben vom CLI nach `GITHUB_OUTPUT`; leer, wenn die installierte CLI sie nicht kennt).
|
|
271
|
+
Beispiel: `if: steps.cpcg.outputs.gate_state == 'blocked'`.
|
|
115
272
|
|
|
116
273
|
## Jurisdiktion
|
|
117
274
|
|
|
118
|
-
`--jurisdiction CH|EU|UK|US-CA|BR|ROW` — gleicher Befund, unterschiedliche Einordnung
|
|
275
|
+
`--jurisdiction CH|EU|UK|US-CA|BR|ROW` — gleicher Befund, unterschiedliche Einordnung.
|
|
276
|
+
|
|
277
|
+
> **Wichtig:** Das Gate selbst prüft in jedem Rechtsraum nach der strengen **Opt-in-Linie (EU)**: Jeder nicht-essenzielle
|
|
278
|
+
> Tracker vor einer Einwilligung blockiert (Exit 1). Das Profil ändert nur Schweregrad und Begleittext im Bericht, nicht das
|
|
279
|
+
> Ergebnis. Für eine reine Schweizer Seite mit Opt-out-Modell ist das Gate damit strenger als das Recht; ein «BLOCKED» ist
|
|
280
|
+
> dort nicht automatisch ein Rechtsverstoss. Eine Bewertung nach Rechtsraum (CH und US-CA als Opt-out) ist für 0.3 geplant.
|
|
281
|
+
|
|
119
282
|
|
|
120
283
|
- **EU:** Opt-In-Pflicht für nicht-essenzielle Tracker. Ein beobachteter Request ist ein
|
|
121
284
|
schwerwiegender Hinweis — die Einstufung als Verstoß erfordert die Prüfung von Zweck,
|
|
@@ -131,13 +294,17 @@ Die Action nutzt `dist/cli.js` aus dem Action-Path; erst bei fehlendem Build gre
|
|
|
131
294
|
|
|
132
295
|
```bash
|
|
133
296
|
pnpm install
|
|
134
|
-
pnpm test
|
|
297
|
+
pnpm test # Vitest-Suite (inkl. PHP-Lizenzdienst, falls Docker läuft; action.yml-Pin und Optionsweitergabe)
|
|
135
298
|
pnpm build
|
|
136
|
-
pnpm
|
|
299
|
+
pnpm typecheck:all # src + tests + scripts
|
|
300
|
+
npx tsx scripts/e2e-cli-deluxe.mts # E2E: echte CLI gegen Demo-Portal
|
|
137
301
|
```
|
|
138
302
|
|
|
303
|
+
Der Lizenzdienst liegt in `server/license-api/` (eigene README mit Deploy-Checkliste und Betrieb)
|
|
304
|
+
und gehört nicht zum veröffentlichten Paket.
|
|
305
|
+
|
|
139
306
|
Secrets (Stripe, Lizenz-Secret) nur über Env/KeePass — nie im Repo.
|
|
140
307
|
|
|
141
308
|
---
|
|
142
309
|
|
|
143
|
-
© CuonzTech · Carlo Cuonz · [cuonztech.ch](https://cuonztech.ch)
|
|
310
|
+
© CuonzTech · Carlo Cuonz · [cuonztech.ch](https://cuonztech.ch) · Lizenz: siehe [LICENSE](LICENSE)
|