privalint 0.1.1 → 0.2.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 +89 -0
- package/README.md +29 -1
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -1
- package/dist/i18n.d.ts +5 -0
- package/dist/i18n.js +3 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/legal.d.ts +10 -0
- package/dist/legal.js +99 -0
- package/dist/legal.js.map +1 -0
- package/dist/reporters/markdown.js +14 -12
- package/dist/reporters/markdown.js.map +1 -1
- package/dist/reporters/messages.d.ts +21 -0
- package/dist/reporters/messages.js +62 -0
- package/dist/reporters/messages.js.map +1 -0
- package/dist/reporters/sarif.js +7 -1
- package/dist/reporters/sarif.js.map +1 -1
- package/dist/reporters/shared.d.ts +1 -3
- package/dist/reporters/shared.js +0 -17
- package/dist/reporters/shared.js.map +1 -1
- package/dist/reporters/text.js +17 -13
- package/dist/reporters/text.js.map +1 -1
- package/dist/rules/google-fonts.js +26 -9
- package/dist/rules/google-fonts.js.map +1 -1
- package/dist/rules/impressum-link.js +21 -8
- package/dist/rules/impressum-link.js.map +1 -1
- package/dist/rules/links.d.ts +2 -0
- package/dist/rules/links.js +2 -0
- package/dist/rules/links.js.map +1 -1
- package/dist/rules/pre-consent-trackers.js +20 -7
- package/dist/rules/pre-consent-trackers.js.map +1 -1
- package/dist/rules/privacy-policy-link.js +12 -5
- package/dist/rules/privacy-policy-link.js.map +1 -1
- package/dist/rules/reject-option.js +27 -7
- package/dist/rules/reject-option.js.map +1 -1
- package/dist/rules/third-party-cdns.js +10 -3
- package/dist/rules/third-party-cdns.js.map +1 -1
- package/dist/rules/third-party-embeds.js +10 -3
- package/dist/rules/third-party-embeds.js.map +1 -1
- package/dist/rules/tracker-hits.d.ts +4 -2
- package/dist/rules/tracker-hits.js +14 -3
- package/dist/rules/tracker-hits.js.map +1 -1
- package/dist/rules/trackers-after-reject.js +24 -12
- package/dist/rules/trackers-after-reject.js.map +1 -1
- package/dist/scanner.d.ts +6 -0
- package/dist/scanner.js +10 -2
- package/dist/scanner.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/package.json +11 -6
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { say } from '../i18n.js';
|
|
2
|
+
import { categoryLabel, findTrackerHits } from './tracker-hits.js';
|
|
2
3
|
const ID = 'trackers-after-reject';
|
|
3
4
|
export const trackersAfterReject = {
|
|
4
5
|
id: ID,
|
|
@@ -7,21 +8,32 @@ export const trackersAfterReject = {
|
|
|
7
8
|
'page and records what still loads. Anything on the tracker list that loads or sets new ' +
|
|
8
9
|
'cookies after that ignores the visitor’s explicit refusal.',
|
|
9
10
|
references: ['§ 25 Abs. 1 TDDDG', 'Art. 6(1)(a) GDPR', 'Art. 7(3) GDPR'],
|
|
10
|
-
check({ page }) {
|
|
11
|
+
check({ page, lang }) {
|
|
11
12
|
const after = page.consent?.afterReject;
|
|
12
13
|
if (after === undefined) {
|
|
13
14
|
return [];
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
const button = page.consent?.rejectLabel ?? say(lang, { en: 'reject', de: 'Ablehnen' });
|
|
17
|
+
return findTrackerHits(after.requests, after.cookies, lang).map(({ tracker, evidence }) => {
|
|
18
|
+
const { vendor } = tracker;
|
|
19
|
+
const category = categoryLabel(tracker.category, lang);
|
|
20
|
+
return {
|
|
21
|
+
ruleId: ID,
|
|
22
|
+
// Same reasoning as pre-consent-trackers: the container alone may be configured correctly.
|
|
23
|
+
severity: tracker.category === 'tag-manager' ? 'warning' : 'error',
|
|
24
|
+
message: say(lang, {
|
|
25
|
+
en: `${vendor} (${category}) still runs after clicking "${button}".`,
|
|
26
|
+
de: `${vendor} (${category}) läuft weiter, obwohl „${button}“ geklickt wurde.`,
|
|
27
|
+
}),
|
|
28
|
+
pageUrl: page.finalUrl,
|
|
29
|
+
subject: vendor,
|
|
30
|
+
evidence,
|
|
31
|
+
fix: say(lang, {
|
|
32
|
+
en: `Check that ${vendor} is assigned to a consent category in your consent manager and that the category is blocked when the visitor rejects.`,
|
|
33
|
+
de: `Prüfen, ob ${vendor} im Consent-Tool einer Kategorie zugeordnet ist und diese Kategorie beim Ablehnen blockiert wird.`,
|
|
34
|
+
}),
|
|
35
|
+
};
|
|
36
|
+
});
|
|
25
37
|
},
|
|
26
38
|
};
|
|
27
39
|
//# sourceMappingURL=trackers-after-reject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trackers-after-reject.js","sourceRoot":"","sources":["../../src/rules/trackers-after-reject.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"trackers-after-reject.js","sourceRoot":"","sources":["../../src/rules/trackers-after-reject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEnE,MAAM,EAAE,GAAG,uBAAuB,CAAC;AAEnC,MAAM,CAAC,MAAM,mBAAmB,GAAS;IACvC,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,8CAA8C;IACrD,WAAW,EACT,0FAA0F;QAC1F,yFAAyF;QACzF,4DAA4D;IAC9D,UAAU,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;IACxE,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACxF,OAAO,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAC7D,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAW,EAAE;YACjC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACvD,OAAO;gBACL,MAAM,EAAE,EAAE;gBACV,2FAA2F;gBAC3F,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;gBAClE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE;oBACjB,EAAE,EAAE,GAAG,MAAM,KAAK,QAAQ,gCAAgC,MAAM,IAAI;oBACpE,EAAE,EAAE,GAAG,MAAM,KAAK,QAAQ,2BAA2B,MAAM,mBAAmB;iBAC/E,CAAC;gBACF,OAAO,EAAE,IAAI,CAAC,QAAQ;gBACtB,OAAO,EAAE,MAAM;gBACf,QAAQ;gBACR,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;oBACb,EAAE,EAAE,cAAc,MAAM,uHAAuH;oBAC/I,EAAE,EAAE,cAAc,MAAM,mGAAmG;iBAC5H,CAAC;aACH,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;CACF,CAAC"}
|
package/dist/scanner.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Lang } from './i18n.js';
|
|
2
|
+
import { type Region } from './legal.js';
|
|
1
3
|
import type { PageSnapshot, Rule, ScanResult } from './types.js';
|
|
2
4
|
export interface ScanOptions {
|
|
3
5
|
/** Maximum number of pages on the same site to visit, starting with the given URL. */
|
|
@@ -7,6 +9,10 @@ export interface ScanOptions {
|
|
|
7
9
|
/** Navigation timeout per page. */
|
|
8
10
|
timeoutMs?: number | undefined;
|
|
9
11
|
locale?: string | undefined;
|
|
12
|
+
/** Language of messages and fixes in the findings. */
|
|
13
|
+
lang?: Lang | undefined;
|
|
14
|
+
/** Country whose law the findings are judged by. */
|
|
15
|
+
region?: Region | undefined;
|
|
10
16
|
rules?: readonly Rule[];
|
|
11
17
|
/**
|
|
12
18
|
* Answer every third-party request with an empty response instead of fetching it.
|
package/dist/scanner.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { chromium } from 'playwright';
|
|
2
2
|
import { observeConsent } from './consent.js';
|
|
3
|
+
import { applyRegion } from './legal.js';
|
|
3
4
|
import { defaultRules } from './rules/index.js';
|
|
4
5
|
import { crawlTarget, isFirstParty, withoutHash } from './url.js';
|
|
5
6
|
const DEFAULTS = {
|
|
@@ -7,11 +8,15 @@ const DEFAULTS = {
|
|
|
7
8
|
settleMs: 2_000,
|
|
8
9
|
timeoutMs: 30_000,
|
|
9
10
|
locale: 'de-DE',
|
|
11
|
+
lang: 'en',
|
|
12
|
+
region: 'de',
|
|
10
13
|
};
|
|
11
14
|
export async function scan(target, options = {}) {
|
|
12
15
|
const startedAt = Date.now();
|
|
13
16
|
const rules = options.rules ?? defaultRules;
|
|
14
17
|
const maxPages = Math.max(1, options.maxPages ?? DEFAULTS.maxPages);
|
|
18
|
+
const lang = options.lang ?? DEFAULTS.lang;
|
|
19
|
+
const region = options.region ?? DEFAULTS.region;
|
|
15
20
|
let siteUrl = new URL(target);
|
|
16
21
|
const browser = await chromium.launch({
|
|
17
22
|
headless: options.headed !== true,
|
|
@@ -51,13 +56,16 @@ export async function scan(target, options = {}) {
|
|
|
51
56
|
url = queue.shift();
|
|
52
57
|
}
|
|
53
58
|
// Pages that failed, returned an error status or redirected off-site are listed but not linted.
|
|
54
|
-
const
|
|
59
|
+
const observed = snapshots
|
|
55
60
|
.filter((page) => page.error === undefined &&
|
|
56
61
|
(page.status === null || page.status < 400) &&
|
|
57
62
|
isFirstParty(page.finalUrl, siteUrl))
|
|
58
|
-
.flatMap((page) => rules.flatMap((rule) => rule.check({ siteUrl, page })));
|
|
63
|
+
.flatMap((page) => rules.flatMap((rule) => rule.check({ siteUrl, page, lang })));
|
|
64
|
+
const findings = applyRegion(observed, region);
|
|
59
65
|
return {
|
|
60
66
|
siteUrl: siteUrl.href,
|
|
67
|
+
lang,
|
|
68
|
+
region,
|
|
61
69
|
scannedAt: new Date(startedAt).toISOString(),
|
|
62
70
|
durationMs: Date.now() - startedAt,
|
|
63
71
|
pages: snapshots.map((page) => ({
|
package/dist/scanner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Lang } from './i18n.js';
|
|
2
|
+
import type { Region } from './legal.js';
|
|
1
3
|
export type Severity = 'error' | 'warning' | 'info';
|
|
2
4
|
export interface RecordedRequest {
|
|
3
5
|
url: string;
|
|
@@ -63,10 +65,14 @@ export interface Finding {
|
|
|
63
65
|
fix?: string;
|
|
64
66
|
/** What the finding is about, e.g. a vendor. Keeps fingerprints stable across runs. */
|
|
65
67
|
subject?: string;
|
|
68
|
+
/** Legal basis in the country the scan was run for. */
|
|
69
|
+
references?: string[];
|
|
66
70
|
}
|
|
67
71
|
export interface RuleContext {
|
|
68
72
|
siteUrl: URL;
|
|
69
73
|
page: PageSnapshot;
|
|
74
|
+
/** Language for messages and fixes. */
|
|
75
|
+
lang: Lang;
|
|
70
76
|
}
|
|
71
77
|
export interface Rule {
|
|
72
78
|
id: string;
|
|
@@ -87,6 +93,8 @@ export interface PageSummary {
|
|
|
87
93
|
export type ConsentSummary = Omit<ConsentObservation, 'afterReject'>;
|
|
88
94
|
export interface ScanResult {
|
|
89
95
|
siteUrl: string;
|
|
96
|
+
lang: Lang;
|
|
97
|
+
region: Region;
|
|
90
98
|
scannedAt: string;
|
|
91
99
|
durationMs: number;
|
|
92
100
|
pages: PageSummary[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "privalint",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Lint your website for GDPR problems: trackers before consent and after reject, Google Fonts, embeds, missing Impressum. Real browser, CLI and GitHub Action.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
17
|
"files": [
|
|
18
|
-
"dist"
|
|
18
|
+
"dist",
|
|
19
|
+
"README.de.md"
|
|
19
20
|
],
|
|
20
21
|
"engines": {
|
|
21
22
|
"node": ">=20.12"
|
|
@@ -41,7 +42,11 @@
|
|
|
41
42
|
"impressum",
|
|
42
43
|
"lint",
|
|
43
44
|
"playwright",
|
|
44
|
-
"github-action"
|
|
45
|
+
"github-action",
|
|
46
|
+
"tdddg",
|
|
47
|
+
"dsg",
|
|
48
|
+
"oesterreich",
|
|
49
|
+
"schweiz"
|
|
45
50
|
],
|
|
46
51
|
"license": "MIT",
|
|
47
52
|
"dependencies": {
|
|
@@ -55,8 +60,8 @@
|
|
|
55
60
|
},
|
|
56
61
|
"repository": {
|
|
57
62
|
"type": "git",
|
|
58
|
-
"url": "git+https://github.com/
|
|
63
|
+
"url": "git+https://github.com/JExcellence/privalint.git"
|
|
59
64
|
},
|
|
60
|
-
"homepage": "https://github.com/
|
|
61
|
-
"bugs": "https://github.com/
|
|
65
|
+
"homepage": "https://github.com/JExcellence/privalint#readme",
|
|
66
|
+
"bugs": "https://github.com/JExcellence/privalint/issues"
|
|
62
67
|
}
|