cuonztech-privacy-chaos-gate 0.2.1 → 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/README.md +12 -7
- package/action.yml +2 -2
- package/dist/{chunk-WOGRBCGS.js → chunk-42D7PLVP.js} +13 -3
- package/dist/cli.js +2 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -210,7 +210,7 @@ Erwartet: Gate **BLOCKED**, Szenarien «auffällig» — exakt dieselben Zahlen
|
|
|
210
210
|
## GitHub Action
|
|
211
211
|
|
|
212
212
|
```yaml
|
|
213
|
-
- uses: cuonztech/privacy-chaos-gate@v1
|
|
213
|
+
- uses: cuonztech/privacy-chaos-gate-action@v1
|
|
214
214
|
id: cpcg
|
|
215
215
|
with:
|
|
216
216
|
staging-url: ${{ vars.STAGING_URL }}
|
|
@@ -221,8 +221,7 @@ Erwartet: Gate **BLOCKED**, Szenarien «auffällig» — exakt dieselben Zahlen
|
|
|
221
221
|
|
|
222
222
|
Die Action installiert das veröffentlichte Paket `cuonztech-privacy-chaos-gate` in der Version, die in `action.yml`
|
|
223
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`).
|
|
225
|
-
etwa im CI dieses Repos, wird dieser verwendet. Kennt die installierte CLI eine angeforderte Option nicht, gibt die Action
|
|
224
|
+
Chromium (`playwright install --with-deps chromium`). Kennt die installierte CLI eine angeforderte Option nicht, gibt die Action
|
|
226
225
|
eine Warnung aus, statt sie still wegzulassen.
|
|
227
226
|
|
|
228
227
|
Scan und Konsolen-Gate laufen ohne Lizenz. `report-pdf`, `client-name`, `git-commit` und `create-pr` brauchen eine gültige Lizenz;
|
|
@@ -238,6 +237,8 @@ ohne sie werden sie mit Hinweis übersprungen.
|
|
|
238
237
|
| `ignore` | leer | Befunde ausnehmen (Tracker-Name oder Host-Muster, eine Angabe je Zeile oder kommagetrennt) |
|
|
239
238
|
| `accept-selector`, `reject-selector`, `settings-selector` | leer | Eigene CSS-Selektoren der Banner-Buttons (eine Angabe je Zeile) |
|
|
240
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) |
|
|
241
242
|
| `auto-fix` | `false` | Patches auf dem Runner erzeugen und anwenden; ein Gate ändert Dateien nicht stillschweigend |
|
|
242
243
|
| `create-pr` | `false` | Fix als Pull Request öffnen (braucht `auto-fix: true`, `github-token` und eine Lizenz) |
|
|
243
244
|
| `github-token` | leer | Token für `create-pr` (`contents: write`, `pull-requests: write`) |
|
|
@@ -248,8 +249,6 @@ ohne sie werden sie mit Hinweis übersprungen.
|
|
|
248
249
|
| `jurisdiction` | `CH` | Rechtsraum |
|
|
249
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 |
|
|
250
251
|
|
|
251
|
-
`--max-subpages` und `--banner-wait` sind noch keine Inputs der Action. Bis dahin lassen sie sich im Job über `env:` setzen (`CPCG_MAX_SUBPAGES`, `CPCG_BANNER_WAIT`); als Inputs wären die Namen `max-subpages` und `banner-wait` (Werte wie beim CLI) vorgesehen.
|
|
252
|
-
|
|
253
252
|
Beispiel mit Pull Request als Ergebnis:
|
|
254
253
|
|
|
255
254
|
```yaml
|
|
@@ -258,7 +257,7 @@ permissions:
|
|
|
258
257
|
pull-requests: write
|
|
259
258
|
steps:
|
|
260
259
|
- uses: actions/checkout@v4
|
|
261
|
-
- uses: cuonztech/privacy-chaos-gate@v1
|
|
260
|
+
- uses: cuonztech/privacy-chaos-gate-action@v1
|
|
262
261
|
with:
|
|
263
262
|
staging-url: ${{ vars.STAGING_URL }}
|
|
264
263
|
license: ${{ secrets.CPCG_LICENSE }}
|
|
@@ -273,7 +272,13 @@ Beispiel: `if: steps.cpcg.outputs.gate_state == 'blocked'`.
|
|
|
273
272
|
|
|
274
273
|
## Jurisdiktion
|
|
275
274
|
|
|
276
|
-
`--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
|
+
|
|
277
282
|
|
|
278
283
|
- **EU:** Opt-In-Pflicht für nicht-essenzielle Tracker. Ein beobachteter Request ist ein
|
|
279
284
|
schwerwiegender Hinweis — die Einstufung als Verstoß erfordert die Prüfung von Zweck,
|
package/action.yml
CHANGED
|
@@ -139,7 +139,7 @@ runs:
|
|
|
139
139
|
using: "composite"
|
|
140
140
|
steps:
|
|
141
141
|
- name: Setup Node.js
|
|
142
|
-
uses: actions/setup-node@v4
|
|
142
|
+
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
|
143
143
|
with:
|
|
144
144
|
node-version: "20"
|
|
145
145
|
|
|
@@ -149,7 +149,7 @@ runs:
|
|
|
149
149
|
shell: bash
|
|
150
150
|
env:
|
|
151
151
|
ACTION_PATH: ${{ github.action_path }}
|
|
152
|
-
CPCG_PINNED_VERSION: "0.2.
|
|
152
|
+
CPCG_PINNED_VERSION: "0.2.2" # = package.json version; bei jedem Release mit anheben (tests/action-pin.test.ts prüft das)
|
|
153
153
|
run: |
|
|
154
154
|
set -euo pipefail
|
|
155
155
|
|
|
@@ -4257,6 +4257,16 @@ var ChaosScanner = class {
|
|
|
4257
4257
|
});
|
|
4258
4258
|
}
|
|
4259
4259
|
}
|
|
4260
|
+
/** Seite, auf der ein Request ausgelöst wurde (für Befunde auf Unterseiten); leer, wenn nicht ermittelbar. */
|
|
4261
|
+
pageHint(req) {
|
|
4262
|
+
try {
|
|
4263
|
+
const u = new URL(req.frame()?.url() ?? "");
|
|
4264
|
+
if (u.protocol !== "http:" && u.protocol !== "https:") return "";
|
|
4265
|
+
return ` (Seite: ${u.pathname}${u.search ? "?\u2026" : ""})`;
|
|
4266
|
+
} catch {
|
|
4267
|
+
return "";
|
|
4268
|
+
}
|
|
4269
|
+
}
|
|
4260
4270
|
/**
|
|
4261
4271
|
* Unterseiten & SPA: echte, auf der Startseite verlinkte Same-Origin-Pfade (HTTP-Status geprüft)
|
|
4262
4272
|
* als Direkteinstieg, danach clientseitige Navigation (Link-Klick ohne Dokument-Reload,
|
|
@@ -4285,7 +4295,7 @@ var ChaosScanner = class {
|
|
|
4285
4295
|
requestUrl: req.url(),
|
|
4286
4296
|
method: req.method(),
|
|
4287
4297
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
4288
|
-
description: `${hit.name} feuert auf Unterseite/SPA-Navigation ohne Consent.`
|
|
4298
|
+
description: `${hit.name} feuert auf Unterseite/SPA-Navigation ohne Consent${this.pageHint(req)}.`
|
|
4289
4299
|
});
|
|
4290
4300
|
}
|
|
4291
4301
|
});
|
|
@@ -7054,7 +7064,7 @@ function buildEvidenceMarkdown(report, title = "Evidence Report", options = {})
|
|
|
7054
7064
|
if (!e.screenshots?.length && !e.screenshotPath) continue;
|
|
7055
7065
|
lines.push(`### ${escapeMarkdownText(e.scenario)}`, "");
|
|
7056
7066
|
for (const s of e.screenshots ?? []) {
|
|
7057
|
-
lines.push(`- **${escapeMarkdownText(s.label)}** (${escapeMarkdownText(s.at)}): \`evidence/${escapeCell(path5.basename(s.path))}\``);
|
|
7067
|
+
lines.push(`- **${escapeMarkdownText(s.label)}** (${escapeMarkdownText(s.at)}): \`evidence/${escapeCell(path5.win32.basename(s.path))}\``);
|
|
7058
7068
|
}
|
|
7059
7069
|
if (e.storageAfter?.cookies?.length) {
|
|
7060
7070
|
lines.push(`- Cookies nachher: ${escapeMarkdownText(e.storageAfter.cookies.slice(0, 8).join(", "))}`);
|
|
@@ -7226,7 +7236,7 @@ function buildEvidenceHtml(report, title = "Evidence Report", options = {}) {
|
|
|
7226
7236
|
const shots = e.screenshots ?? (e.screenshotPath ? [{ label: "Screenshot", path: e.screenshotPath, at: e.checkedAt }] : []);
|
|
7227
7237
|
const gallery = shots.length ? `<div class="shots">${shots.map((s) => {
|
|
7228
7238
|
const src = shotSrc(s.path, options.shotSources);
|
|
7229
|
-
const media = src ? `<img class="shot" src="${src}" alt="${esc2(s.label)}" loading="lazy">` : `<code class="shot-path">evidence/${esc2(path5.basename(s.path))}</code>`;
|
|
7239
|
+
const media = src ? `<img class="shot" src="${src}" alt="${esc2(s.label)}" loading="lazy">` : `<code class="shot-path">evidence/${esc2(path5.win32.basename(s.path))}</code>`;
|
|
7230
7240
|
return `<figure>
|
|
7231
7241
|
<figcaption><span class="shot-label">${esc2(s.label)}</span>
|
|
7232
7242
|
<span class="ts">${esc2(fmtTime(s.at))}</span></figcaption>
|
package/dist/cli.js
CHANGED
|
@@ -11,12 +11,12 @@ import {
|
|
|
11
11
|
resolveEntitlement,
|
|
12
12
|
resolveGateConfig,
|
|
13
13
|
resolveJurisdiction
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-42D7PLVP.js";
|
|
15
15
|
|
|
16
16
|
// src/cli.ts
|
|
17
17
|
import { Command, CommanderError } from "commander";
|
|
18
18
|
import pc from "picocolors";
|
|
19
|
-
var VERSION = true ? "0.2.
|
|
19
|
+
var VERSION = true ? "0.2.2" : "dev";
|
|
20
20
|
loadProjectEnv();
|
|
21
21
|
function finish(code) {
|
|
22
22
|
process.exitCode = code;
|
package/dist/index.d.ts
CHANGED
|
@@ -1829,6 +1829,8 @@ declare class ChaosScanner implements ChaosScannerInterface {
|
|
|
1829
1829
|
* dann «not-checkable» statt «passed».
|
|
1830
1830
|
*/
|
|
1831
1831
|
private runCmpFailureScenario;
|
|
1832
|
+
/** Seite, auf der ein Request ausgelöst wurde (für Befunde auf Unterseiten); leer, wenn nicht ermittelbar. */
|
|
1833
|
+
private pageHint;
|
|
1832
1834
|
/**
|
|
1833
1835
|
* Unterseiten & SPA: echte, auf der Startseite verlinkte Same-Origin-Pfade (HTTP-Status geprüft)
|
|
1834
1836
|
* als Direkteinstieg, danach clientseitige Navigation (Link-Klick ohne Dokument-Reload,
|
package/dist/index.js
CHANGED
package/package.json
CHANGED