privalint 0.4.1 → 0.6.0
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.de.md +37 -47
- package/README.md +51 -51
- package/dist/assessment.js +50 -8
- package/dist/assessment.js.map +1 -1
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/consent.js +80 -1
- package/dist/consent.js.map +1 -1
- package/dist/coverage.js +1 -1
- package/dist/coverage.js.map +1 -1
- package/dist/data/trackers.js +51 -0
- package/dist/data/trackers.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/legal.js +13 -0
- package/dist/legal.js.map +1 -1
- package/dist/reporters/capture.js +4 -0
- package/dist/reporters/capture.js.map +1 -1
- package/dist/rules/adobe-fonts.d.ts +2 -0
- package/dist/rules/adobe-fonts.js +71 -0
- package/dist/rules/adobe-fonts.js.map +1 -0
- package/dist/rules/consent-settings-link.d.ts +2 -0
- package/dist/rules/consent-settings-link.js +50 -0
- package/dist/rules/consent-settings-link.js.map +1 -0
- package/dist/rules/index.d.ts +3 -1
- package/dist/rules/index.js +5 -1
- package/dist/rules/index.js.map +1 -1
- package/dist/scan-options.d.ts +8 -0
- package/dist/scan-options.js +7 -1
- package/dist/scan-options.js.map +1 -1
- package/dist/scanner.js +58 -14
- package/dist/scanner.js.map +1 -1
- package/dist/types.d.ts +16 -2
- package/package.json +1 -1
- package/schemas/report-1.1.0.schema.json +25 -2
- package/schemas/sarif-properties-1.1.0.schema.json +25 -2
package/README.de.md
CHANGED
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
**English:** [README.md](README.md)
|
|
4
4
|
|
|
5
5
|
privalint prüft Websites auf die Datenschutzfehler, für die es Abmahnungen gibt: Tracker, die vor
|
|
6
|
-
der Einwilligung laden oder nach „Ablehnen“ weiterlaufen,
|
|
7
|
-
eingebundene Inhalte wie YouTube oder Google Maps
|
|
6
|
+
der Einwilligung laden oder nach „Ablehnen“ weiterlaufen, Schriften von Google- oder
|
|
7
|
+
Adobe-Servern, eingebundene Inhalte wie YouTube oder Google Maps, ein Cookie-Banner, das sich
|
|
8
|
+
nicht wieder öffnen lässt, und ein fehlendes Impressum.
|
|
8
9
|
|
|
9
10
|
privalint öffnet die Seite in einem echten Chromium-Browser ohne Cookies, wie beim ersten Besuch.
|
|
10
11
|
Es zeichnet auf, was geladen wird, bevor jemand das Cookie-Banner bedient, klickt dann auf
|
|
@@ -47,7 +48,9 @@ npx privalint https://ihre-seite.at --region at --lang de --max-pages 20
|
|
|
47
48
|
| `pre-consent-trackers` | Analyse-, Werbe- und Session-Replay-Tools, die vor der Einwilligung Anfragen senden oder Cookies setzen |
|
|
48
49
|
| `trackers-after-reject` | Tracker, die nach Klick auf „Ablehnen“ und Neuladen weiterlaufen |
|
|
49
50
|
| `reject-option` | Cookie-Banner mit „Zustimmen“, aber ohne „Ablehnen“ auf der ersten Ebene; Pur-Abo-Modelle als Hinweis |
|
|
51
|
+
| `consent-settings-link` | Kein sichtbarer Link oder Button, um die Cookie-Einstellungen nach dem Ablehnen wieder zu öffnen |
|
|
50
52
|
| `google-fonts` | Schriften von `fonts.googleapis.com` / `fonts.gstatic.com` |
|
|
53
|
+
| `adobe-fonts` | Schriften von Adobe Fonts (`use.typekit.net` / `p.typekit.net`) |
|
|
51
54
|
| `third-party-embeds` | YouTube, Vimeo, Google Maps, reCAPTCHA, Gravatar und Social-Media-Einbindungen vor der Einwilligung |
|
|
52
55
|
| `third-party-cdns` | Skripte und Styles von jsDelivr, unpkg, cdnjs und anderen öffentlichen CDNs (Hinweis) |
|
|
53
56
|
| `impressum-link` | Seiten ohne Link zum Impressum |
|
|
@@ -62,6 +65,7 @@ Details, Hintergründe und Lösungen stehen auf Englisch in [`docs/rules`](docs/
|
|
|
62
65
|
with:
|
|
63
66
|
url: https://ihre-seite.de
|
|
64
67
|
max-pages: 20
|
|
68
|
+
concurrency: 3
|
|
65
69
|
lang: de
|
|
66
70
|
region: de
|
|
67
71
|
```
|
|
@@ -74,7 +78,7 @@ Dafür benötigt der Job `pull-requests: write`. Bei Fork-PRs oder einem schreib
|
|
|
74
78
|
wird der Kommentar ohne Scanfehler ausgelassen. Befunde mit einem fehlgeschlagenen Scan-Schritt
|
|
75
79
|
verhindern den Kommentar nicht.
|
|
76
80
|
|
|
77
|
-
## Konfiguration
|
|
81
|
+
## Konfiguration und Berichte
|
|
78
82
|
|
|
79
83
|
Die CLI liest eine vorhandene `privalint.config.json`, alternativ `--config <datei>`.
|
|
80
84
|
CLI-Argumente haben Vorrang. JSON kann URL, Seitenlimit, Sprache, Länderprofil, Ladeoptionen,
|
|
@@ -94,46 +98,16 @@ Freigegebene Anbieter bleiben als Hinweise mit Policy-Kennzeichnung sichtbar. Ei
|
|
|
94
98
|
kein Nachweis von Einwilligung oder rechtlicher Zulässigkeit. Details stehen in der
|
|
95
99
|
[deutschen Anleitung](docs/configuration.de.md) und der [englischen Fassung](docs/configuration.md).
|
|
96
100
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
Regeln und Consent-Prüfungen sind ausgenommen. Details stehen im
|
|
108
|
-
[Berichtsvertrag](docs/report-contract.de.md) und seiner [englischen Fassung](docs/report-contract.md).
|
|
109
|
-
|
|
110
|
-
## Öffentliche Webscanner und kontrollierte Erfassung
|
|
111
|
-
|
|
112
|
-
`scan()` unterstützt einen `networkAdapter` und ein `AbortSignal`. Jeder HTTP-Hop einschließlich
|
|
113
|
-
Redirects durchläuft den Adapter. Er gibt eine Antwort zurück oder lehnt mit einem typisierten
|
|
114
|
-
`NetworkError` ab. Eine Warteschlange puffert Lastspitzen; Parallelität, Anfragemenge,
|
|
115
|
-
Antwortgrößen und Zeitlimits sind getrennt. Im Adapter-Modus gibt es keinen Browser-HTTP-Fallback.
|
|
116
|
-
|
|
117
|
-
PrivaLint erstellt und schließt Browser sowie frische Contexts selbst, auch bei Abbruch. Der
|
|
118
|
-
Aufrufer verwaltet gemeinsam genutzte Transport-Clients. Die bestehende Egress-Policy muss bei
|
|
119
|
-
jedem Hop DNS-Auflösung und tatsächliche Socket-Ziele kontrollieren und das Request-Signal beachten.
|
|
120
|
-
Die [Anleitung](docs/controlled-scanner.de.md) beschreibt den Vertrag und die Zähler. Ein
|
|
121
|
-
[typgeprüftes Beispiel](examples/controlled-scanner.ts) nutzt ausschließlich vom Betreiber
|
|
122
|
-
freigegebene Origins und festgelegte IP-Adressen.
|
|
123
|
-
|
|
124
|
-
`findings` enthält ausschließlich Regelbefunde. Technische Einschränkungen stehen getrennt unter
|
|
125
|
-
`pages[].capture.diagnostics`. Bei 48 Anfragen mit 21 blockierten oder fehlgeschlagenen Ressourcen
|
|
126
|
-
bleibt die Erfassung unvollständig, auch wenn keine Findings vorliegen. `ruleEvaluations` zeigt
|
|
127
|
-
pro Seite und Regel `executed`, `skipped` oder `not-evaluable`; `partial: true` kennzeichnet die
|
|
128
|
-
Auswertung verfügbarer positiver Evidenz bei eingeschränkter Beobachtung.
|
|
129
|
-
|
|
130
|
-
Consent-Zustände unterscheiden „kein Banner erkannt“, „keine unterstützte Ablehnen-Möglichkeit“,
|
|
131
|
-
„Interaktion fehlgeschlagen“ und „Ablehnen getestet“. Fehlende Erkennung allein ist kein
|
|
132
|
-
Datenschutzverstoß. Ein getesteter Klick sagt noch nichts über vollständige Ressourcen-Erfassung aus.
|
|
133
|
-
|
|
134
|
-
Bestehende CLI-, API- und Action-Aufrufe bleiben gültig. Startseiten-Ladefehler werfen weiterhin
|
|
135
|
-
einen Fehler; `failureMode: 'report'` liefert stattdessen einen strukturierten Bericht und ist im
|
|
136
|
-
Adapter-Modus die Vorgabe. Es werden keine Zusagen rechtlicher Konformität gemacht.
|
|
101
|
+
Jeder Bericht sagt pro Regel und Seite, ob geprüft wurde und nichts gefunden wurde, ob ein
|
|
102
|
+
Befund vorliegt oder ob die Regel nicht prüfbar war, und warum. So bleibt „nichts gefunden“ von
|
|
103
|
+
„nicht angesehen“ getrennt.
|
|
104
|
+
|
|
105
|
+
Weiterführend:
|
|
106
|
+
|
|
107
|
+
- [Berichtsvertrag und optionales Coverage-Gate](docs/report-contract.de.md): JSON-Schema,
|
|
108
|
+
Versionierung, Exit-Codes
|
|
109
|
+
- [privalint hinter einem öffentlichen Webformular betreiben](docs/controlled-scanner.de.md):
|
|
110
|
+
Netzwerk-Adapter, Limits und Abbruch, mit [typgeprüftem Beispiel](examples/controlled-scanner.ts)
|
|
137
111
|
|
|
138
112
|
## Grenzen
|
|
139
113
|
|
|
@@ -142,13 +116,29 @@ Adapter-Modus die Vorgabe. Es werden keine Zusagen rechtlicher Konformität gema
|
|
|
142
116
|
- Viele Consent-Tools entscheiden anhand der IP-Adresse, ob sie ein Banner zeigen. GitHub-Runner
|
|
143
117
|
haben US-Adressen und sehen deshalb unter Umständen etwas anderes als Besucher aus der EU.
|
|
144
118
|
- Serverseitiges Tracking ist im Browser nicht sichtbar.
|
|
119
|
+
- Chromium läuft standardmäßig ohne seine Sandbox, weil sie in vielen Containern nicht startet.
|
|
120
|
+
Wer fremde Seiten auf einem Rechner mit Zugangsdaten prüft, sollte `--sandbox` setzen.
|
|
145
121
|
|
|
146
122
|
## Mitmachen
|
|
147
123
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
124
|
+
privalint wird mit jedem Tracker, jedem Consent-Tool und jedem gemeldeten Fehlalarm besser. Die
|
|
125
|
+
meisten Beiträge sind ein paar Zeilen Daten plus ein Test, ohne dass man den ganzen Code kennen
|
|
126
|
+
muss. Gute Einstiege:
|
|
127
|
+
|
|
128
|
+
| Issue | Aufwand |
|
|
129
|
+
| -------------------------------------------------------------------------------------- | ---------------------------------------------------- |
|
|
130
|
+
| [#33](https://github.com/jexcellence/privalint/issues/33) Regel-Doku auf Deutsch | Eine Seite übersetzen |
|
|
131
|
+
| [#30](https://github.com/jexcellence/privalint/issues/30) Consent-Tools | Zwei Button-Selektoren auf einer echten Seite finden |
|
|
132
|
+
| [#31](https://github.com/jexcellence/privalint/issues/31) Session-Replay-Tools | Hosts aus der Anbieter-Doku eintragen, plus Test |
|
|
133
|
+
| [#32](https://github.com/jexcellence/privalint/issues/32) Chat- und Bewertungs-Widgets | Dasselbe für `third-party-embeds` |
|
|
134
|
+
| [#34](https://github.com/jexcellence/privalint/issues/34) Action-Input | Ein Input in `action.yml` |
|
|
135
|
+
|
|
136
|
+
Gerade Anbieter aus dem deutschsprachigen Raum fehlen noch. Fehlalarme und fehlende Tracker
|
|
137
|
+
lassen sich über die [Issue-Formulare](https://github.com/jexcellence/privalint/issues/new/choose)
|
|
138
|
+
melden; Einrichtung und Ablauf stehen in [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
139
|
+
|
|
140
|
+
Wenn privalint Ihnen eine Abmahnung oder eine Korrekturschleife erspart hat, hilft ein Stern
|
|
141
|
+
anderen, es zu finden.
|
|
152
142
|
|
|
153
143
|
## Lizenz
|
|
154
144
|
|
package/README.md
CHANGED
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/jexcellence/privalint/actions/workflows/ci.yml)
|
|
4
4
|
[](https://www.npmjs.com/package/privalint)
|
|
5
|
+
[](https://github.com/marketplace/actions/privalint)
|
|
5
6
|
[](LICENSE)
|
|
7
|
+
[](https://github.com/jexcellence/privalint/labels/good%20first%20issue)
|
|
6
8
|
|
|
7
9
|
**Deutsch:** [README.de.md](README.de.md)
|
|
8
10
|
|
|
9
11
|
Lint your website for the GDPR mistakes that get people warning letters: trackers that fire before
|
|
10
|
-
consent or keep running after "reject",
|
|
11
|
-
Impressum.
|
|
12
|
+
consent or keep running after "reject", fonts loaded from Google or Adobe, embeds before consent,
|
|
13
|
+
a banner you can't reopen, and a missing Impressum.
|
|
12
14
|
|
|
13
15
|
privalint opens your site in a real Chromium browser with no cookies or storage, like a first
|
|
14
16
|
visit. It records what loads before anyone touches the consent banner, then clicks "reject" and
|
|
@@ -36,14 +38,15 @@ shortened. Regenerate it with <code>npm run demo</code>.</sub>
|
|
|
36
38
|
| [`pre-consent-trackers`](docs/rules/pre-consent-trackers.md) | error | Analytics, ads and session-replay tools that send requests or set cookies before consent. A bare tag manager is a warning. |
|
|
37
39
|
| [`trackers-after-reject`](docs/rules/trackers-after-reject.md) | error | Trackers that still load after clicking "reject" on the consent banner and reloading. |
|
|
38
40
|
| [`reject-option`](docs/rules/reject-option.md) | warning | A banner with "accept" but no "reject" on its first layer. Pay-or-OK banners are noted as info. |
|
|
41
|
+
| [`consent-settings-link`](docs/rules/consent-settings-link.md) | warning | No visible link or button to reopen the cookie settings after rejecting. |
|
|
39
42
|
| [`google-fonts`](docs/rules/google-fonts.md) | error | Fonts fetched from `fonts.googleapis.com` / `fonts.gstatic.com`. Leftover preconnects are a warning. |
|
|
43
|
+
| [`adobe-fonts`](docs/rules/adobe-fonts.md) | error | Fonts fetched from Adobe Fonts (`use.typekit.net` / `p.typekit.net`). Leftover preconnects are a warning. |
|
|
40
44
|
| [`third-party-embeds`](docs/rules/third-party-embeds.md) | warning | YouTube, Vimeo, Google Maps, reCAPTCHA, Gravatar and social embeds loading before consent. |
|
|
41
45
|
| [`third-party-cdns`](docs/rules/third-party-cdns.md) | info | Scripts and styles from jsDelivr, unpkg, cdnjs and other public CDNs. |
|
|
42
46
|
| [`impressum-link`](docs/rules/impressum-link.md) | warning | Pages without a link to an Impressum. A contact link alone is noted as info. |
|
|
43
47
|
| [`privacy-policy-link`](docs/rules/privacy-policy-link.md) | warning | Pages without a link to a privacy policy. |
|
|
44
48
|
|
|
45
|
-
|
|
46
|
-
[CONTRIBUTING.md](CONTRIBUTING.md).
|
|
49
|
+
Each rule is a small file with tests. Missing a check? See [Contributing](#contributing).
|
|
47
50
|
|
|
48
51
|
## GitHub Action
|
|
49
52
|
|
|
@@ -66,6 +69,7 @@ jobs:
|
|
|
66
69
|
with:
|
|
67
70
|
url: https://your-site.de
|
|
68
71
|
max-pages: 20
|
|
72
|
+
concurrency: 3
|
|
69
73
|
|
|
70
74
|
- uses: github/codeql-action/upload-sarif@v4
|
|
71
75
|
if: always()
|
|
@@ -89,6 +93,7 @@ preview URL from your hosting provider's deployment event or action output as `u
|
|
|
89
93
|
| -------------------- | ----------------- | ----------------------------------------------------- |
|
|
90
94
|
| `url` | | Page to scan. Required. |
|
|
91
95
|
| `max-pages` | `1` | How many pages of the same site to crawl. |
|
|
96
|
+
| `concurrency` | `1` | Pages loaded at the same time; same report as with 1. |
|
|
92
97
|
| `fail-on` | `error` | `error`, `warning` or `never`. |
|
|
93
98
|
| `fail-on-incomplete` | `false` | Fail separately for incomplete required observations. |
|
|
94
99
|
| `disable` | | Comma-separated rule ids to skip. |
|
|
@@ -115,6 +120,8 @@ On self-hosted runners without it, add `actions/setup-node` before this step.
|
|
|
115
120
|
privalint <url> [options]
|
|
116
121
|
|
|
117
122
|
-p, --max-pages <n> Crawl up to n pages of the same site (default 1)
|
|
123
|
+
--concurrency <n> Load up to n pages at the same time (default 1).
|
|
124
|
+
The report is the same as with 1
|
|
118
125
|
-f, --format <format> text | json | markdown | sarif (default text)
|
|
119
126
|
-o, --output <file> Write the report to a file and print a text summary.
|
|
120
127
|
Repeatable; .sarif, .json and .md pick their format,
|
|
@@ -132,6 +139,8 @@ privalint <url> [options]
|
|
|
132
139
|
--skip-consent Don't click "reject" on the consent banner
|
|
133
140
|
--headed Open a visible browser window instead of running headless
|
|
134
141
|
--channel <name> Use an installed browser: chrome or msedge
|
|
142
|
+
--sandbox Run Chromium with its sandbox (recommended for untrusted
|
|
143
|
+
sites; may not start in containers)
|
|
135
144
|
--list-rules Print the available rules and exit
|
|
136
145
|
```
|
|
137
146
|
|
|
@@ -192,43 +201,16 @@ for (const finding of result.findings) {
|
|
|
192
201
|
}
|
|
193
202
|
```
|
|
194
203
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
distinguishes `checked-no-finding`, `finding-detected` and `not-evaluable`, always with a fixed
|
|
198
|
-
`explanation` code. `onProgress` emits real stages (`starting`, `loading-page`, `checking-consent`,
|
|
199
|
-
`evaluating-rules`, `completed`) with elapsed time and redacted page URLs; it does not invent a
|
|
200
|
-
percentage. The CLI and Action keep their existing finding-threshold exit policy.
|
|
204
|
+
Every report says for each rule and page whether it was checked with no finding, found something,
|
|
205
|
+
or could not be checked, and why. That keeps "nothing found" apart from "not looked at".
|
|
201
206
|
|
|
202
|
-
|
|
203
|
-
pages remain distinguishable. Standalone schemas and complete/partial/skip/policy fixtures are
|
|
204
|
-
included. The [report contract and optional CI gate](docs/report-contract.md)
|
|
205
|
-
([Deutsch](docs/report-contract.de.md)) explain validation and identity/exit-code semantics.
|
|
207
|
+
Going further:
|
|
206
208
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
There is no browser HTTP fallback in adapter mode.
|
|
213
|
-
|
|
214
|
-
The scanner owns its browser and fresh contexts and closes them on completion or cancellation.
|
|
215
|
-
The caller owns the adapter's shared clients. Keep your existing egress policy: validate and pin
|
|
216
|
-
DNS/socket destinations for **every** hop, and honour the provided per-request abort signal.
|
|
217
|
-
|
|
218
|
-
See the [controlled scanner guide](docs/controlled-scanner.md) and the type-checked
|
|
219
|
-
[pinned-transport example](examples/controlled-scanner.ts). The example denies origins absent
|
|
220
|
-
from a trusted deployment allowlist and pins socket addresses; the allowlist must not come from
|
|
221
|
-
the person submitting the scan.
|
|
222
|
-
|
|
223
|
-
Reports separate `findings` from `pages[].capture.diagnostics`. A page with 48 requests and 21
|
|
224
|
-
blocked/failed requests is marked incomplete even if no findings were produced. Per-page
|
|
225
|
-
`ruleEvaluations` distinguish `executed`, `skipped` and `not-evaluable`; positive evidence may
|
|
226
|
-
still be evaluated with `partial: true`. No banner detected is not itself a privacy finding,
|
|
227
|
-
and does not mean that the reject path was tested.
|
|
228
|
-
|
|
229
|
-
Existing CLI, API and GitHub Action calls still work. Start-page navigation failures retain the
|
|
230
|
-
legacy throw behaviour unless `failureMode: 'report'` is selected (the default with an adapter).
|
|
231
|
-
No report claims legal compliance.
|
|
209
|
+
- [Report contract and the optional coverage gate](docs/report-contract.md): JSON schema,
|
|
210
|
+
versioning, exit codes
|
|
211
|
+
- [Running privalint behind a public web form](docs/controlled-scanner.md): network adapter,
|
|
212
|
+
limits and cancellation, with a [type-checked example](examples/controlled-scanner.ts)
|
|
213
|
+
- [Configuration reference](docs/configuration.md)
|
|
232
214
|
|
|
233
215
|
## How it works
|
|
234
216
|
|
|
@@ -239,7 +221,8 @@ No report claims legal compliance.
|
|
|
239
221
|
3. It records every request, the final cookie jar, all links and `<link>` resource hints.
|
|
240
222
|
4. On the start page it looks for the consent banner, either by the selectors of common consent
|
|
241
223
|
managers (OneTrust, Cookiebot, Usercentrics, Borlabs, Complianz and others) or by button labels
|
|
242
|
-
in six languages. It clicks "reject", reloads
|
|
224
|
+
in six languages. It clicks "reject", reloads, records what still loads and checks that the
|
|
225
|
+
settings can be reopened.
|
|
243
226
|
5. Each rule looks at those snapshots and reports findings with evidence and a suggested fix.
|
|
244
227
|
6. With `--max-pages`, links to the same site are followed breadth-first. Query strings are
|
|
245
228
|
dropped, pages are deduplicated after redirects, and pages that fail to load (downloads,
|
|
@@ -264,23 +247,40 @@ No report claims legal compliance.
|
|
|
264
247
|
have US addresses, so some sites load trackers there that EU visitors never get, and the
|
|
265
248
|
result differs from what an EU visitor sees. Use a runner or proxy in the EU for results you
|
|
266
249
|
want to rely on.
|
|
267
|
-
- Chromium
|
|
268
|
-
scan sites you don't trust
|
|
250
|
+
- Chromium runs without its sandbox by default, like Playwright's own default, because the
|
|
251
|
+
sandbox often can't start in containers. Pass `--sandbox` when you scan sites you don't trust
|
|
252
|
+
on a machine that holds secrets. On Ubuntu 23.10 and later it needs unprivileged user
|
|
253
|
+
namespaces, which AppArmor restricts unless Chromium is allowed to use them.
|
|
269
254
|
|
|
270
255
|
## Roadmap
|
|
271
256
|
|
|
272
|
-
-
|
|
273
|
-
-
|
|
274
|
-
-
|
|
275
|
-
-
|
|
276
|
-
[
|
|
277
|
-
-
|
|
278
|
-
[Open Cookie Database](https://github.com/jkwakman/Open-Cookie-Database)
|
|
257
|
+
- Test the settings layer of banners, not only "reject" ([#38](https://github.com/jexcellence/privalint/issues/38))
|
|
258
|
+
- Don't count banner rules as incomplete when a site needs no banner ([#35](https://github.com/jexcellence/privalint/issues/35))
|
|
259
|
+
- First-party detection with the public suffix list ([#36](https://github.com/jexcellence/privalint/issues/36))
|
|
260
|
+
- Cookie trackers generated from the Apache-licensed
|
|
261
|
+
[Open Cookie Database](https://github.com/jkwakman/Open-Cookie-Database) ([#39](https://github.com/jexcellence/privalint/issues/39))
|
|
262
|
+
- Report comparison between two scans
|
|
279
263
|
|
|
280
264
|
## Contributing
|
|
281
265
|
|
|
282
|
-
|
|
283
|
-
|
|
266
|
+
privalint gets better with every tracker, consent manager and false positive someone reports.
|
|
267
|
+
Most contributions are a few lines of data plus a test, and you don't need to know the whole
|
|
268
|
+
codebase. Good places to start:
|
|
269
|
+
|
|
270
|
+
| Issue | What it takes |
|
|
271
|
+
| --------------------------------------------------------------------------------- | --------------------------------------------- |
|
|
272
|
+
| [#30](https://github.com/jexcellence/privalint/issues/30) Consent managers | Find two button selectors on a real site |
|
|
273
|
+
| [#31](https://github.com/jexcellence/privalint/issues/31) Session-replay tools | Add hosts from the vendor's docs, plus a test |
|
|
274
|
+
| [#32](https://github.com/jexcellence/privalint/issues/32) Chat and review widgets | Same, for `third-party-embeds` |
|
|
275
|
+
| [#33](https://github.com/jexcellence/privalint/issues/33) German rule docs | Translate one page |
|
|
276
|
+
| [#34](https://github.com/jexcellence/privalint/issues/34) Action input | One input in `action.yml` |
|
|
277
|
+
| [#37](https://github.com/jexcellence/privalint/issues/37) Sandbox on Linux/macOS | Run one command and report back |
|
|
278
|
+
|
|
279
|
+
Found a false positive or a tracker privalint missed? The
|
|
280
|
+
[issue forms](https://github.com/jexcellence/privalint/issues/new/choose) ask for exactly what's
|
|
281
|
+
needed. [CONTRIBUTING.md](CONTRIBUTING.md) covers setup, adding a tracker and writing a rule.
|
|
282
|
+
|
|
283
|
+
If privalint saved you a warning letter or a review round, a star helps others find it.
|
|
284
284
|
|
|
285
285
|
## License
|
|
286
286
|
|
package/dist/assessment.js
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
import { observedRequests } from './observations.js';
|
|
2
2
|
import { defaultRules } from './rules/index.js';
|
|
3
3
|
import { isFirstParty } from './url.js';
|
|
4
|
+
/**
|
|
5
|
+
* Rules whose clean, complete result shows that nothing needing consent loaded before a
|
|
6
|
+
* choice. Without a banner that is a good outcome, so the banner rules are skipped then.
|
|
7
|
+
*/
|
|
8
|
+
const CONSENT_TRIGGERS = ['pre-consent-trackers', 'third-party-embeds'];
|
|
4
9
|
const REQUIREMENTS = {
|
|
5
10
|
'pre-consent-trackers': ['network'],
|
|
6
11
|
'google-fonts': ['network'],
|
|
12
|
+
'adobe-fonts': ['network'],
|
|
7
13
|
'third-party-embeds': ['network'],
|
|
8
14
|
'third-party-cdns': ['network'],
|
|
9
15
|
'impressum-link': ['document'],
|
|
10
16
|
'privacy-policy-link': ['document'],
|
|
11
17
|
'reject-option': ['consent'],
|
|
12
18
|
'trackers-after-reject': ['after-reject'],
|
|
19
|
+
'consent-settings-link': ['after-reject'],
|
|
13
20
|
};
|
|
14
21
|
export function assessPage(page, rules, siteUrl, lang, isStart, consentEnabled, catalog = rules) {
|
|
15
22
|
const findings = [];
|
|
@@ -43,9 +50,12 @@ export function assessPage(page, rules, siteUrl, lang, isStart, consentEnabled,
|
|
|
43
50
|
},
|
|
44
51
|
}),
|
|
45
52
|
};
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
const requirementsOf = (rule) => rule.requires ?? REQUIREMENTS[rule.id] ?? ['document'];
|
|
54
|
+
const needsConsent = (rule) => requirementsOf(rule).some((kind) => kind === 'consent' || kind === 'after-reject');
|
|
55
|
+
const detectedBy = new Map();
|
|
56
|
+
const evaluate = (rule, noConsentNeeded) => {
|
|
57
|
+
const requirements = requirementsOf(rule);
|
|
58
|
+
const consentRule = needsConsent(rule);
|
|
49
59
|
if (!selected.has(rule.id)) {
|
|
50
60
|
return {
|
|
51
61
|
ruleId: rule.id,
|
|
@@ -68,6 +78,17 @@ export function assessPage(page, rules, siteUrl, lang, isStart, consentEnabled,
|
|
|
68
78
|
findingCount: 0,
|
|
69
79
|
};
|
|
70
80
|
}
|
|
81
|
+
if (noConsentNeeded && !requirements.every((kind) => available[kind])) {
|
|
82
|
+
return {
|
|
83
|
+
ruleId: rule.id,
|
|
84
|
+
status: 'skipped',
|
|
85
|
+
reason: 'no-consent-needed',
|
|
86
|
+
partial: false,
|
|
87
|
+
outcome: 'not-evaluable',
|
|
88
|
+
explanation: 'no-consent-needed',
|
|
89
|
+
findingCount: 0,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
71
92
|
if (!requirements.every((kind) => available[kind])) {
|
|
72
93
|
return {
|
|
73
94
|
ruleId: rule.id,
|
|
@@ -84,10 +105,7 @@ export function assessPage(page, rules, siteUrl, lang, isStart, consentEnabled,
|
|
|
84
105
|
};
|
|
85
106
|
}
|
|
86
107
|
const detected = rule.check({ page: input, siteUrl, lang });
|
|
87
|
-
|
|
88
|
-
...finding,
|
|
89
|
-
...(page.pageId === undefined ? {} : { pageId: page.pageId }),
|
|
90
|
-
})));
|
|
108
|
+
detectedBy.set(rule.id, detected);
|
|
91
109
|
const partial = requirements.includes('after-reject')
|
|
92
110
|
? page.consent?.afterRejectComplete === false
|
|
93
111
|
: !complete;
|
|
@@ -103,7 +121,31 @@ export function assessPage(page, rules, siteUrl, lang, isStart, consentEnabled,
|
|
|
103
121
|
: 'required-observations-available',
|
|
104
122
|
findingCount: detected.length,
|
|
105
123
|
};
|
|
106
|
-
}
|
|
124
|
+
};
|
|
125
|
+
// Banner rules come last: whether a banner is needed at all depends on the other rules.
|
|
126
|
+
const ordered = [...allRules.values()];
|
|
127
|
+
const results = new Map();
|
|
128
|
+
for (const rule of ordered.filter((rule) => !needsConsent(rule))) {
|
|
129
|
+
results.set(rule.id, evaluate(rule, false));
|
|
130
|
+
}
|
|
131
|
+
const noConsentNeeded = isStart &&
|
|
132
|
+
consentEnabled &&
|
|
133
|
+
page.consent?.bannerFound === false &&
|
|
134
|
+
page.consent.state === 'not-detected' &&
|
|
135
|
+
CONSENT_TRIGGERS.every((ruleId) => {
|
|
136
|
+
const evaluation = results.get(ruleId);
|
|
137
|
+
return evaluation?.outcome === 'checked-no-finding' && !evaluation.partial;
|
|
138
|
+
});
|
|
139
|
+
for (const rule of ordered.filter(needsConsent)) {
|
|
140
|
+
results.set(rule.id, evaluate(rule, noConsentNeeded));
|
|
141
|
+
}
|
|
142
|
+
const evaluations = ordered.map((rule) => results.get(rule.id));
|
|
143
|
+
for (const rule of ordered) {
|
|
144
|
+
findings.push(...(detectedBy.get(rule.id) ?? []).map((finding) => ({
|
|
145
|
+
...finding,
|
|
146
|
+
...(page.pageId === undefined ? {} : { pageId: page.pageId }),
|
|
147
|
+
})));
|
|
148
|
+
}
|
|
107
149
|
return {
|
|
108
150
|
findings,
|
|
109
151
|
evaluations: evaluations.map((evaluation) => ({
|
package/dist/assessment.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assessment.js","sourceRoot":"","sources":["../src/assessment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,YAAY,GAA+C;IAC/D,sBAAsB,EAAE,CAAC,SAAS,CAAC;IACnC,cAAc,EAAE,CAAC,SAAS,CAAC;IAC3B,oBAAoB,EAAE,CAAC,SAAS,CAAC;IACjC,kBAAkB,EAAE,CAAC,SAAS,CAAC;IAC/B,gBAAgB,EAAE,CAAC,UAAU,CAAC;IAC9B,qBAAqB,EAAE,CAAC,UAAU,CAAC;IACnC,eAAe,EAAE,CAAC,SAAS,CAAC;IAC5B,uBAAuB,EAAE,CAAC,cAAc,CAAC;CAC1C,CAAC;AAEF,MAAM,UAAU,UAAU,CACxB,IAAkB,EAClB,KAAsB,EACtB,OAAY,EACZ,IAAU,EACV,OAAgB,EAChB,cAAuB,EACvB,OAAO,GAAoB,KAAK;IAEhC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,QAAQ,GACZ,IAAI,CAAC,OAAO,EAAE,qBAAqB,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC;IAC5F,MAAM,SAAS,GACb,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;QAC7D,IAAI,CAAC,MAAM,KAAK,IAAI;QACpB,IAAI,CAAC,MAAM,GAAG,GAAG;QACjB,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,SAAS,GAAqC;QAClD,QAAQ,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC;QACnE,OAAO,EAAE,SAAS;QAClB,OAAO,EACL,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS;QAC3F,cAAc,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI;KAC7D,CAAC;IACF,MAAM,KAAK,GAAiB;QAC1B,GAAG,IAAI;QACP,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACzC,2FAA2F;QAC3F,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;QACjD,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS;YACzC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,OAAO,EAAE;oBACP,GAAG,IAAI,CAAC,OAAO;oBACf,WAAW,EAAE;wBACX,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW;wBAC3B,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;qBAC9D;iBACF;aACF,CAAC;KACP,CAAC;IACF,MAAM,
|
|
1
|
+
{"version":3,"file":"assessment.js","sourceRoot":"","sources":["../src/assessment.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -26,6 +26,8 @@ Usage
|
|
|
26
26
|
|
|
27
27
|
Options
|
|
28
28
|
-p, --max-pages <n> Crawl up to n pages of the same site (default 1)
|
|
29
|
+
--concurrency <n> Load up to n pages at the same time (default 1).
|
|
30
|
+
The report is the same as with 1
|
|
29
31
|
-f, --format <format> ${FORMATS.join(' | ')} (default text)
|
|
30
32
|
-o, --output <file> Write the report to a file and print a text summary.
|
|
31
33
|
Repeatable; .sarif, .json and .md pick their format,
|
|
@@ -44,6 +46,8 @@ Options
|
|
|
44
46
|
--consent Enable consent checking even if the JSON config disables it
|
|
45
47
|
--headed Open a visible browser window instead of running headless
|
|
46
48
|
--channel <name> Use an installed browser: chrome or msedge
|
|
49
|
+
--sandbox Run Chromium with its sandbox (recommended for untrusted
|
|
50
|
+
sites; may not start in containers)
|
|
47
51
|
--list-rules Print the available rules and exit
|
|
48
52
|
-h, --help Show this help
|
|
49
53
|
-v, --version Show the version
|
|
@@ -65,6 +69,7 @@ async function main(argv) {
|
|
|
65
69
|
allowPositionals: true,
|
|
66
70
|
options: {
|
|
67
71
|
'max-pages': { type: 'string', short: 'p' },
|
|
72
|
+
concurrency: { type: 'string' },
|
|
68
73
|
format: { type: 'string', short: 'f', default: 'text' },
|
|
69
74
|
output: { type: 'string', short: 'o', multiple: true },
|
|
70
75
|
'fail-on': { type: 'string', default: 'error' },
|
|
@@ -81,6 +86,7 @@ async function main(argv) {
|
|
|
81
86
|
consent: { type: 'boolean' },
|
|
82
87
|
headed: { type: 'boolean' },
|
|
83
88
|
channel: { type: 'string' },
|
|
89
|
+
sandbox: { type: 'boolean' },
|
|
84
90
|
'list-rules': { type: 'boolean' },
|
|
85
91
|
help: { type: 'boolean', short: 'h' },
|
|
86
92
|
version: { type: 'boolean', short: 'v' },
|
|
@@ -118,6 +124,7 @@ async function main(argv) {
|
|
|
118
124
|
...(config.rules === undefined ? {} : { ruleSettings: config.rules }),
|
|
119
125
|
...(config.allow === undefined ? {} : { allow: config.allow }),
|
|
120
126
|
maxPages: wholeNumber(values['max-pages'], '--max-pages', 1) ?? config.maxPages,
|
|
127
|
+
concurrency: wholeNumber(values.concurrency, '--concurrency', 1) ?? config.concurrency,
|
|
121
128
|
settleMs: wholeNumber(values.settle, '--settle', 0) ?? config.settleMs,
|
|
122
129
|
timeoutMs: wholeNumber(values.timeout, '--timeout', 1) ?? config.timeoutMs,
|
|
123
130
|
locale: values.locale ?? config.locale,
|
|
@@ -130,6 +137,7 @@ async function main(argv) {
|
|
|
130
137
|
: (config.consentCheck ?? true),
|
|
131
138
|
headed: values.headed === true,
|
|
132
139
|
channel: values.channel === undefined ? undefined : oneOf(values.channel, CHANNELS, '--channel'),
|
|
140
|
+
sandbox: values.sandbox === true,
|
|
133
141
|
onPage: (page) => process.stderr.write(page.error === undefined
|
|
134
142
|
? `scanned ${diagnosticUrl(page.finalUrl)}\n`
|
|
135
143
|
: `skipped ${diagnosticUrl(page.url)}: ${page.error}\n`),
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAe,MAAM,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AAC3D,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAG/C,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,IAAI,GAAG,aAAa,OAAO
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
package/dist/config.js
CHANGED
|
@@ -7,6 +7,7 @@ import { defaultRules } from './rules/index.js';
|
|
|
7
7
|
const KEYS = [
|
|
8
8
|
'url',
|
|
9
9
|
'maxPages',
|
|
10
|
+
'concurrency',
|
|
10
11
|
'settleMs',
|
|
11
12
|
'timeoutMs',
|
|
12
13
|
'locale',
|
|
@@ -42,7 +43,7 @@ export function parseConfig(value) {
|
|
|
42
43
|
if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password)
|
|
43
44
|
invalid();
|
|
44
45
|
}
|
|
45
|
-
for (const key of ['maxPages', 'settleMs', 'timeoutMs']) {
|
|
46
|
+
for (const key of ['maxPages', 'concurrency', 'settleMs', 'timeoutMs']) {
|
|
46
47
|
const number = value[key];
|
|
47
48
|
if (number !== undefined &&
|
|
48
49
|
(typeof number !== 'number' ||
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAa,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAe,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|