privalint 0.2.0 → 0.4.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 +68 -2
- package/README.md +77 -13
- package/dist/assessment.d.ts +6 -0
- package/dist/assessment.js +115 -0
- package/dist/assessment.js.map +1 -0
- package/dist/capture.d.ts +5 -0
- package/dist/capture.js +162 -0
- package/dist/capture.js.map +1 -0
- package/dist/cli.js +48 -14
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +21 -0
- package/dist/config.js +113 -0
- package/dist/config.js.map +1 -0
- package/dist/consent.d.ts +3 -0
- package/dist/consent.js +81 -12
- package/dist/consent.js.map +1 -1
- package/dist/coverage.d.ts +13 -0
- package/dist/coverage.js +86 -0
- package/dist/coverage.js.map +1 -0
- package/dist/data/third-parties.js +9 -0
- package/dist/data/third-parties.js.map +1 -1
- package/dist/diagnostics.d.ts +28 -0
- package/dist/diagnostics.js +202 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/network.d.ts +68 -0
- package/dist/network.js +237 -0
- package/dist/network.js.map +1 -0
- package/dist/observations.d.ts +3 -0
- package/dist/observations.js +4 -0
- package/dist/observations.js.map +1 -0
- package/dist/policy.d.ts +6 -0
- package/dist/policy.js +37 -0
- package/dist/policy.js.map +1 -0
- package/dist/report-contract.d.ts +13 -0
- package/dist/report-contract.js +16 -0
- package/dist/report-contract.js.map +1 -0
- package/dist/reporters/capture.d.ts +5 -0
- package/dist/reporters/capture.js +87 -0
- package/dist/reporters/capture.js.map +1 -0
- package/dist/reporters/markdown.js +13 -1
- package/dist/reporters/markdown.js.map +1 -1
- package/dist/reporters/messages.d.ts +1 -0
- package/dist/reporters/messages.js +18 -6
- package/dist/reporters/messages.js.map +1 -1
- package/dist/reporters/sarif.js +48 -10
- package/dist/reporters/sarif.js.map +1 -1
- package/dist/reporters/shared.js +3 -2
- package/dist/reporters/shared.js.map +1 -1
- package/dist/reporters/text.js +10 -2
- package/dist/reporters/text.js.map +1 -1
- package/dist/rules/google-fonts.js +2 -1
- package/dist/rules/google-fonts.js.map +1 -1
- package/dist/rules/reject-option.js +6 -4
- package/dist/rules/reject-option.js.map +1 -1
- package/dist/rules/third-party-embeds.js +2 -2
- package/dist/rules/third-party-embeds.js.map +1 -1
- package/dist/rules/third-party-hits.js +2 -1
- package/dist/rules/third-party-hits.js.map +1 -1
- package/dist/rules/tracker-hits.js +2 -1
- package/dist/rules/tracker-hits.js.map +1 -1
- package/dist/scan-options.d.ts +45 -0
- package/dist/scan-options.js +2 -0
- package/dist/scan-options.js.map +1 -0
- package/dist/scanner.d.ts +4 -38
- package/dist/scanner.js +177 -114
- package/dist/scanner.js.map +1 -1
- package/dist/types.d.ts +119 -0
- package/package.json +7 -1
- package/schemas/report-1.0.0.schema.json +813 -0
- package/schemas/report-1.1.0.schema.json +833 -0
- package/schemas/sarif-properties-1.0.0.schema.json +785 -0
- package/schemas/sarif-properties-1.1.0.schema.json +810 -0
package/dist/policy.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export function validateRuleSettings(settings, rules) {
|
|
2
|
+
if (typeof settings !== 'object' || settings === null || Array.isArray(settings)) {
|
|
3
|
+
throw new TypeError('Rule settings must be an object.');
|
|
4
|
+
}
|
|
5
|
+
for (const [id, value] of Object.entries(settings)) {
|
|
6
|
+
if (!rules.some((rule) => rule.id === id) ||
|
|
7
|
+
!['off', 'error', 'warning', 'info'].includes(value)) {
|
|
8
|
+
throw new TypeError('Invalid rule setting; use a known rule ID and off/error/warning/info.');
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Inherited properties such as constructor must never become severity overrides. */
|
|
13
|
+
export function ruleSetting(settings, ruleId) {
|
|
14
|
+
return settings !== undefined && Object.hasOwn(settings, ruleId) ? settings[ruleId] : undefined;
|
|
15
|
+
}
|
|
16
|
+
/** Apply local policy after region classification. Allowed vendors stay visible as info. */
|
|
17
|
+
export function applyPolicy(findings, settings = {}, allowedVendors = []) {
|
|
18
|
+
return findings
|
|
19
|
+
.filter((finding) => ruleSetting(settings, finding.ruleId) !== 'off')
|
|
20
|
+
.map((finding) => {
|
|
21
|
+
const setting = ruleSetting(settings, finding.ruleId);
|
|
22
|
+
const allowed = finding.subject !== undefined && allowedVendors.includes(finding.subject);
|
|
23
|
+
const severity = allowed
|
|
24
|
+
? 'info'
|
|
25
|
+
: setting === undefined || setting === 'off'
|
|
26
|
+
? finding.severity
|
|
27
|
+
: setting;
|
|
28
|
+
return {
|
|
29
|
+
...finding,
|
|
30
|
+
severity,
|
|
31
|
+
...(allowed || setting !== undefined
|
|
32
|
+
? { policy: { allowed, originalSeverity: finding.severity } }
|
|
33
|
+
: {}),
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,QAAsB,EAAE,KAAsB;IACjF,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjF,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAC1D,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,IACE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;YACrC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EACpD,CAAC;YACD,MAAM,IAAI,SAAS,CAAC,uEAAuE,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,WAAW,CACzB,QAAkC,EAClC,MAAc;IAEd,OAAO,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClG,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CACzB,QAA4B,EAC5B,QAAQ,GAAiB,EAAE,EAC3B,cAAc,GAAsB,EAAE;IAEtC,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC;SACpE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1F,MAAM,QAAQ,GAAG,OAAO;YACtB,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK;gBAC1C,CAAC,CAAC,OAAO,CAAC,QAAQ;gBAClB,CAAC,CAAC,OAAO,CAAC;QACd,OAAO;YACL,GAAG,OAAO;YACV,QAAQ;YACR,GAAG,CAAC,OAAO,IAAI,OAAO,KAAK,SAAS;gBAClC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE;gBAC7D,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const REPORT_SCHEMA_VERSION = "1.1.0";
|
|
2
|
+
export declare const SUPPORTED_REPORT_SCHEMAS: readonly ['1.0.0', "1.1.0"];
|
|
3
|
+
export type ReportSchemaIdentity = {
|
|
4
|
+
kind: 'legacy';
|
|
5
|
+
} | {
|
|
6
|
+
kind: 'supported';
|
|
7
|
+
version: string;
|
|
8
|
+
} | {
|
|
9
|
+
kind: 'unsupported';
|
|
10
|
+
version?: string;
|
|
11
|
+
};
|
|
12
|
+
/** Classification only, not structural validation. Never upgrades legacy data to success. */
|
|
13
|
+
export declare function identifyReportSchema(value: unknown): ReportSchemaIdentity;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const REPORT_SCHEMA_VERSION = '1.1.0';
|
|
2
|
+
export const SUPPORTED_REPORT_SCHEMAS = ['1.0.0', REPORT_SCHEMA_VERSION];
|
|
3
|
+
/** Classification only, not structural validation. Never upgrades legacy data to success. */
|
|
4
|
+
export function identifyReportSchema(value) {
|
|
5
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
6
|
+
return { kind: 'unsupported' };
|
|
7
|
+
if (!Object.hasOwn(value, 'schemaVersion'))
|
|
8
|
+
return { kind: 'legacy' };
|
|
9
|
+
const version = Reflect.get(value, 'schemaVersion');
|
|
10
|
+
if (typeof version !== 'string')
|
|
11
|
+
return { kind: 'unsupported' };
|
|
12
|
+
return SUPPORTED_REPORT_SCHEMAS.some((supported) => supported === version)
|
|
13
|
+
? { kind: 'supported', version }
|
|
14
|
+
: { kind: 'unsupported', version };
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=report-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-contract.js","sourceRoot":"","sources":["../src/report-contract.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAC7C,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,OAAO,EAAE,qBAAqB,CAAU,CAAC;AAOlF,6FAA6F;AAC7F,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IACpD,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAChE,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,OAAO,CAAC;QACxE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE;QAChC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ScanResult } from '../types.js';
|
|
2
|
+
export declare function isPartial(result: ScanResult): boolean;
|
|
3
|
+
export declare function coverageMessage(result: ScanResult): string;
|
|
4
|
+
/** Technical observations are reported separately from privacy findings. */
|
|
5
|
+
export declare function captureLines(result: ScanResult): string[];
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export function isPartial(result) {
|
|
2
|
+
return (result.coverage === 'partial' ||
|
|
3
|
+
result.pages.some((page) => page.error !== undefined ||
|
|
4
|
+
page.capture?.complete === false ||
|
|
5
|
+
(page.status !== null && page.status >= 400)));
|
|
6
|
+
}
|
|
7
|
+
export function coverageMessage(result) {
|
|
8
|
+
return result.lang === 'de'
|
|
9
|
+
? 'Erfassung unvollständig. Keine Befunde bedeutet hier keine vollständige Prüfung; der Ablehnen-Pfad kann ungeprüft sein.'
|
|
10
|
+
: 'Observation incomplete. No findings does not mean a complete check; the reject path may be untested.';
|
|
11
|
+
}
|
|
12
|
+
/** Technical observations are reported separately from privacy findings. */
|
|
13
|
+
export function captureLines(result) {
|
|
14
|
+
const german = result.lang === 'de';
|
|
15
|
+
const lines = [];
|
|
16
|
+
for (const page of result.pages) {
|
|
17
|
+
const data = page.capture?.diagnostics;
|
|
18
|
+
if (data !== undefined) {
|
|
19
|
+
lines.push(`${german ? 'Erfassung' : 'Capture'} ${page.url}${page.pageId ? ` [${page.pageId}]` : ''}: ` +
|
|
20
|
+
`${data.requests} ${german ? 'Anfragen' : 'requests'}, ${data.responses} ${german ? 'Antworten' : 'responses'}, ` +
|
|
21
|
+
`${data.failedRequests ?? data.failed} ${german ? 'Ladefehler' : 'load failures'}, ` +
|
|
22
|
+
`${data.skippedRequests ?? 0} ${german ? 'ausgelassen' : 'skipped'}, ` +
|
|
23
|
+
`${data.securityBlockedRequests ?? data.blocked} ${german ? 'Sicherheitsblockaden' : 'security blocks'}, ` +
|
|
24
|
+
`${data.httpErrors} HTTP ${german ? 'Fehlerantworten' : 'errors'}.`);
|
|
25
|
+
for (const issue of data.issues) {
|
|
26
|
+
lines.push(` ${issue.phase}: ${issue.kind}${issue.skippedReason ? ` (${issue.skippedReason})` : ''}${issue.limit ? ` (${issue.limit})` : ''}${issue.status ? ` HTTP ${issue.status}` : ''} ${issue.url}`);
|
|
27
|
+
}
|
|
28
|
+
if (data.dropped)
|
|
29
|
+
lines.push(` ${data.dropped} ${german ? 'weitere Diagnosen nicht gespeichert' : 'additional issue details omitted'}.`);
|
|
30
|
+
}
|
|
31
|
+
for (const evaluation of page.ruleEvaluations ?? []) {
|
|
32
|
+
lines.push(` ${evaluation.ruleId}: ${evaluation.outcome ? outcomeLabel(evaluation.outcome, german) : evaluation.status} (${evaluation.explanation ? explanationLabel(evaluation.explanation, german) : (evaluation.reason ?? 'legacy-report')})${evaluation.partial ? (german ? ' [eingeschränkt]' : ' [partial]') : ''}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return lines;
|
|
36
|
+
}
|
|
37
|
+
function outcomeLabel(outcome, german) {
|
|
38
|
+
if (outcome === 'finding-detected')
|
|
39
|
+
return german ? 'Befund erkannt' : 'Finding detected';
|
|
40
|
+
if (outcome === 'checked-no-finding')
|
|
41
|
+
return german ? 'Geprüft, kein Befund' : 'Checked, no finding';
|
|
42
|
+
return german ? 'Nicht prüfbar' : 'Not evaluable';
|
|
43
|
+
}
|
|
44
|
+
const EXPLANATIONS = {
|
|
45
|
+
'unsupported-banner-markup': [
|
|
46
|
+
'Consent UI detected, controls unsupported',
|
|
47
|
+
'Consent-Oberfläche erkannt, Steuerung nicht unterstützt',
|
|
48
|
+
],
|
|
49
|
+
disabled: ['Rule disabled', 'Regel deaktiviert'],
|
|
50
|
+
'not-start-page': [
|
|
51
|
+
'Consent tested only on the start page',
|
|
52
|
+
'Consent wird nur auf der Startseite geprüft',
|
|
53
|
+
],
|
|
54
|
+
'consent-disabled': ['Consent check disabled', 'Consent-Prüfung ausgeschaltet'],
|
|
55
|
+
'missing-reject-observation': ['Reject path not observed', 'Ablehnen-Pfad nicht beobachtet'],
|
|
56
|
+
'missing-consent-observation': ['Consent not observed', 'Consent nicht beobachtet'],
|
|
57
|
+
'incomplete-document': [
|
|
58
|
+
'Document observation incomplete',
|
|
59
|
+
'Dokument nicht vollständig beobachtet',
|
|
60
|
+
],
|
|
61
|
+
'positive-evidence': ['Positive evidence observed', 'Positive Evidenz beobachtet'],
|
|
62
|
+
'incomplete-observation': [
|
|
63
|
+
'Observation incomplete; absence cannot be established',
|
|
64
|
+
'Beobachtung unvollständig; Abwesenheit nicht feststellbar',
|
|
65
|
+
],
|
|
66
|
+
'required-observations-available': [
|
|
67
|
+
'Required observations available',
|
|
68
|
+
'Erforderliche Beobachtungen vorhanden',
|
|
69
|
+
],
|
|
70
|
+
'no-supported-banner': ['No banner detected', 'Kein Banner erkannt'],
|
|
71
|
+
'no-supported-reject-control': [
|
|
72
|
+
'No supported reject control detected',
|
|
73
|
+
'Keine unterstützte Ablehnen-Steuerung erkannt',
|
|
74
|
+
],
|
|
75
|
+
'browser-interaction-failed': [
|
|
76
|
+
'Consent interaction failed',
|
|
77
|
+
'Consent-Interaktion fehlgeschlagen',
|
|
78
|
+
],
|
|
79
|
+
'reject-clicked-and-reloaded': [
|
|
80
|
+
'Reject clicked and page reloaded',
|
|
81
|
+
'Ablehnen geklickt und Seite neu geladen',
|
|
82
|
+
],
|
|
83
|
+
};
|
|
84
|
+
function explanationLabel(reason, german) {
|
|
85
|
+
return EXPLANATIONS[reason][german ? 1 : 0];
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/reporters/capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { captureLines, coverageMessage, isPartial } from './capture.js';
|
|
1
2
|
import { messagesFor } from './messages.js';
|
|
2
3
|
import { countBySeverity, groupByPage } from './shared.js';
|
|
3
4
|
const ICONS = { error: '🔴', warning: '🟡', info: '🔵' };
|
|
@@ -16,13 +17,24 @@ export function formatMarkdown(result) {
|
|
|
16
17
|
'',
|
|
17
18
|
`${m.errors(counts.error)} · ${m.warnings(counts.warning)} · ${m.scanned(m.pages(result.pages.length))}`,
|
|
18
19
|
];
|
|
20
|
+
if (result.scannerVersion)
|
|
21
|
+
lines.push('', `privalint ${result.scannerVersion} · schema ${result.schemaVersion}`);
|
|
19
22
|
if (result.consent !== undefined) {
|
|
20
23
|
lines.push('', escapeText(m.consent(result.consent)));
|
|
21
24
|
}
|
|
25
|
+
if (isPartial(result))
|
|
26
|
+
lines.push('', escapeText(coverageMessage(result)));
|
|
27
|
+
const observations = captureLines(result);
|
|
28
|
+
if (observations.length > 0) {
|
|
29
|
+
lines.push('', ...observations.map((line) => `- ${escapeText(line)}`));
|
|
30
|
+
}
|
|
22
31
|
for (const [pageUrl, findings] of groupByPage(result.findings)) {
|
|
23
32
|
lines.push('', `#### ${code(pageUrl)}`, '', `| | ${m.rule} | ${m.finding} |`, '|---|---|---|');
|
|
24
33
|
for (const finding of findings) {
|
|
25
|
-
|
|
34
|
+
const policy = finding.policy
|
|
35
|
+
? ` [${m.policy(finding.policy.allowed, finding.policy.originalSeverity)}]`
|
|
36
|
+
: '';
|
|
37
|
+
lines.push(`| ${ICONS[finding.severity]} | \`${finding.ruleId}\` | ${escapeText(finding.message + policy)} |`);
|
|
26
38
|
}
|
|
27
39
|
}
|
|
28
40
|
const failed = result.pages.filter((page) => page.error !== undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/reporters/markdown.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,KAAK,GAA6B,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAEnF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,MAAkB;IAC/C,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG;QACZ,kBAAkB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QACxC,EAAE;QACF,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE;KACzG,CAAC;IACF,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,IAAI,EAAE,eAAe,CAAC,CAAC;QAC/F,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,OAAO,CAAC,MAAM,QAAQ,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/reporters/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ export interface ReportMessages {
|
|
|
16
16
|
finding: string;
|
|
17
17
|
howToFix: string;
|
|
18
18
|
disclaimer: string;
|
|
19
|
+
policy(allowed: boolean, originalSeverity: string): string;
|
|
19
20
|
consent(consent: ConsentSummary): string;
|
|
20
21
|
}
|
|
21
22
|
export declare const messagesFor: (lang: Lang) => ReportMessages;
|
|
@@ -14,18 +14,24 @@ const en = {
|
|
|
14
14
|
finding: 'Finding',
|
|
15
15
|
howToFix: 'How to fix',
|
|
16
16
|
disclaimer: 'Automated checks only. A clean result is not proof of GDPR compliance.',
|
|
17
|
+
policy: (allowed, severity) => allowed
|
|
18
|
+
? 'Local policy: vendor allowed; retained as info. Not legal approval.'
|
|
19
|
+
: `Local policy: severity override (original: ${severity}).`,
|
|
17
20
|
consent(consent) {
|
|
21
|
+
if (consent.state === 'interaction-failed') {
|
|
22
|
+
return `Consent check: interaction failed (${consent.error ?? 'browser-failure'}); reject path untested`;
|
|
23
|
+
}
|
|
18
24
|
if (!consent.bannerFound) {
|
|
19
|
-
return 'Consent banner: none
|
|
25
|
+
return 'Consent banner: none detected; reject path untested (not a privacy finding)';
|
|
20
26
|
}
|
|
21
27
|
const vendor = consent.cmp === undefined ? '' : ` (${consent.cmp})`;
|
|
22
28
|
if (consent.error !== undefined) {
|
|
23
29
|
return `Consent banner${vendor}: found, but rejecting failed: ${consent.error}`;
|
|
24
30
|
}
|
|
25
31
|
if (consent.rejected) {
|
|
26
|
-
return `Consent banner${vendor}: clicked "${consent.rejectLabel}" and reloaded`;
|
|
32
|
+
return `Consent banner${vendor}: clicked "${consent.rejectLabel}" and reloaded${consent.afterRejectComplete === false ? '; observation incomplete' : ''}`;
|
|
27
33
|
}
|
|
28
|
-
return `Consent banner${vendor}: found, no reject
|
|
34
|
+
return `Consent banner${vendor}: found, no supported reject option; reject path untested`;
|
|
29
35
|
},
|
|
30
36
|
};
|
|
31
37
|
const de = {
|
|
@@ -43,18 +49,24 @@ const de = {
|
|
|
43
49
|
finding: 'Befund',
|
|
44
50
|
howToFix: 'So beheben Sie es',
|
|
45
51
|
disclaimer: 'Nur automatisierte Prüfungen. Ein sauberes Ergebnis ist kein Nachweis der DSGVO-Konformität.',
|
|
52
|
+
policy: (allowed, severity) => allowed
|
|
53
|
+
? 'Lokale Policy: Anbieter freigegeben; als Hinweis beibehalten. Keine rechtliche Freigabe.'
|
|
54
|
+
: `Lokale Policy: Schweregrad angepasst (ursprünglich: ${severity}).`,
|
|
46
55
|
consent(consent) {
|
|
56
|
+
if (consent.state === 'interaction-failed') {
|
|
57
|
+
return `Consent-Prüfung: Interaktion fehlgeschlagen (${consent.error ?? 'browser-failure'}); Ablehnen-Pfad ungeprüft`;
|
|
58
|
+
}
|
|
47
59
|
if (!consent.bannerFound) {
|
|
48
|
-
return 'Cookie-Banner: keines
|
|
60
|
+
return 'Cookie-Banner: keines erkannt; Ablehnen-Pfad ungeprüft (kein Datenschutzbefund)';
|
|
49
61
|
}
|
|
50
62
|
const vendor = consent.cmp === undefined ? '' : ` (${consent.cmp})`;
|
|
51
63
|
if (consent.error !== undefined) {
|
|
52
64
|
return `Cookie-Banner${vendor}: gefunden, aber Ablehnen ist fehlgeschlagen: ${consent.error}`;
|
|
53
65
|
}
|
|
54
66
|
if (consent.rejected) {
|
|
55
|
-
return `Cookie-Banner${vendor}: „${consent.rejectLabel}“ geklickt und neu geladen`;
|
|
67
|
+
return `Cookie-Banner${vendor}: „${consent.rejectLabel}“ geklickt und neu geladen${consent.afterRejectComplete === false ? '; Erfassung unvollständig' : ''}`;
|
|
56
68
|
}
|
|
57
|
-
return `Cookie-Banner${vendor}: gefunden,
|
|
69
|
+
return `Cookie-Banner${vendor}: gefunden, keine unterstützte Ablehnen-Möglichkeit; Ablehnen-Pfad ungeprüft`;
|
|
58
70
|
},
|
|
59
71
|
};
|
|
60
72
|
const MESSAGES = { en, de };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/reporters/messages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/reporters/messages.ts"],"names":[],"mappings":"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"}
|
package/dist/reporters/sarif.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
2
|
import { REPOSITORY_URL, ruleDocsUrl, VERSION } from '../meta.js';
|
|
3
|
+
import { coverageMessage, isPartial } from './capture.js';
|
|
3
4
|
const LEVELS = {
|
|
4
5
|
error: 'error',
|
|
5
6
|
warning: 'warning',
|
|
@@ -22,7 +23,7 @@ export function formatSarif(result) {
|
|
|
22
23
|
tool: {
|
|
23
24
|
driver: {
|
|
24
25
|
name: 'privalint',
|
|
25
|
-
semanticVersion: VERSION,
|
|
26
|
+
semanticVersion: result.scannerVersion ?? VERSION,
|
|
26
27
|
informationUri: REPOSITORY_URL,
|
|
27
28
|
rules: result.rules.map((rule) => ({
|
|
28
29
|
id: rule.id,
|
|
@@ -38,16 +39,45 @@ export function formatSarif(result) {
|
|
|
38
39
|
})),
|
|
39
40
|
},
|
|
40
41
|
},
|
|
41
|
-
results: result.findings.map(toResult),
|
|
42
|
+
results: result.findings.map((finding) => toResult(finding, result.options?.captureMode === 'adapter')),
|
|
43
|
+
invocations: [
|
|
44
|
+
{
|
|
45
|
+
executionSuccessful: !isPartial(result),
|
|
46
|
+
toolExecutionNotifications: isPartial(result)
|
|
47
|
+
? [
|
|
48
|
+
{
|
|
49
|
+
descriptor: { id: 'incomplete-observation' },
|
|
50
|
+
level: 'warning',
|
|
51
|
+
message: { text: coverageMessage(result) },
|
|
52
|
+
},
|
|
53
|
+
]
|
|
54
|
+
: [],
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
properties: {
|
|
58
|
+
schemaVersion: result.schemaVersion,
|
|
59
|
+
scanId: result.scanId,
|
|
60
|
+
scannerVersion: result.scannerVersion,
|
|
61
|
+
options: result.options,
|
|
62
|
+
coverage: result.coverage,
|
|
63
|
+
observations: result.pages.map(({ pageId, url, capture, ruleEvaluations }) => ({
|
|
64
|
+
pageId,
|
|
65
|
+
url,
|
|
66
|
+
capture,
|
|
67
|
+
ruleEvaluations,
|
|
68
|
+
})),
|
|
69
|
+
consent: result.consent,
|
|
70
|
+
},
|
|
42
71
|
},
|
|
43
72
|
],
|
|
44
73
|
};
|
|
45
74
|
return `${JSON.stringify(sarif, null, 2)}\n`;
|
|
46
75
|
}
|
|
47
|
-
function toResult(finding) {
|
|
76
|
+
function toResult(finding, redacted) {
|
|
48
77
|
const evidence = finding.evidence.map((item) => `- ${item}`).join('\n');
|
|
49
78
|
return {
|
|
50
79
|
ruleId: finding.ruleId,
|
|
80
|
+
properties: { pageId: finding.pageId, policy: finding.policy },
|
|
51
81
|
level: LEVELS[finding.severity],
|
|
52
82
|
message: {
|
|
53
83
|
text: [
|
|
@@ -63,17 +93,25 @@ function toResult(finding) {
|
|
|
63
93
|
locations: [
|
|
64
94
|
{
|
|
65
95
|
physicalLocation: {
|
|
66
|
-
artifactLocation: {
|
|
96
|
+
artifactLocation: {
|
|
97
|
+
uri: redacted && finding.pageId
|
|
98
|
+
? `privalint/${new URL(finding.pageUrl).host}/pages/${finding.pageId}`
|
|
99
|
+
: pseudoPath(finding.pageUrl),
|
|
100
|
+
},
|
|
67
101
|
region: { startLine: 1 },
|
|
68
102
|
},
|
|
69
103
|
},
|
|
70
104
|
],
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
105
|
+
...(redacted
|
|
106
|
+
? {}
|
|
107
|
+
: {
|
|
108
|
+
partialFingerprints: {
|
|
109
|
+
primaryLocationLineHash: createHash('sha256')
|
|
110
|
+
.update(`${finding.ruleId}\n${finding.pageUrl}\n${finding.subject ?? ''}`)
|
|
111
|
+
.digest('hex')
|
|
112
|
+
.slice(0, 32),
|
|
113
|
+
},
|
|
114
|
+
}),
|
|
77
115
|
};
|
|
78
116
|
}
|
|
79
117
|
function pseudoPath(pageUrl) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../src/reporters/sarif.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../src/reporters/sarif.ts"],"names":[],"mappings":"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"}
|
package/dist/reporters/shared.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
export function groupByPage(findings) {
|
|
2
2
|
const pages = new Map();
|
|
3
3
|
for (const finding of findings) {
|
|
4
|
-
const
|
|
4
|
+
const key = finding.pageId === undefined ? finding.pageUrl : `${finding.pageUrl} [${finding.pageId}]`;
|
|
5
|
+
const list = pages.get(key) ?? [];
|
|
5
6
|
list.push(finding);
|
|
6
|
-
pages.set(
|
|
7
|
+
pages.set(key, list);
|
|
7
8
|
}
|
|
8
9
|
return pages;
|
|
9
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/reporters/shared.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,QAA4B;IACtD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/reporters/shared.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,QAA4B;IACtD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,GACP,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC;QAC5F,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAA4B;IAC1D,MAAM,MAAM,GAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/reporters/text.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { styleText } from 'node:util';
|
|
2
|
+
import { captureLines, coverageMessage, isPartial } from './capture.js';
|
|
2
3
|
import { messagesFor } from './messages.js';
|
|
3
4
|
import { countBySeverity, groupByPage } from './shared.js';
|
|
4
5
|
const MARKS = {
|
|
@@ -27,13 +28,18 @@ export function formatText(result, color = false) {
|
|
|
27
28
|
const pages = m.pages(result.pages.length);
|
|
28
29
|
const duration = m.duration(result.durationMs);
|
|
29
30
|
lines.push('');
|
|
31
|
+
if (result.scannerVersion)
|
|
32
|
+
lines.push(`privalint ${result.scannerVersion} · schema ${result.schemaVersion}`);
|
|
33
|
+
lines.push(...captureLines(result));
|
|
34
|
+
if (isPartial(result))
|
|
35
|
+
lines.push(paint('yellow', coverageMessage(result)));
|
|
30
36
|
if (result.consent !== undefined) {
|
|
31
37
|
lines.push(paint('dim', m.consent(result.consent)));
|
|
32
38
|
}
|
|
33
|
-
if (result.findings.length === 0) {
|
|
39
|
+
if (result.findings.length === 0 && !isPartial(result)) {
|
|
34
40
|
lines.push(paint('green', `✔ ${m.noProblems(pages, duration)}`));
|
|
35
41
|
}
|
|
36
|
-
else {
|
|
42
|
+
else if (result.findings.length > 0) {
|
|
37
43
|
lines.push(`${paint('red', m.errors(counts.error))}, ${paint('yellow', m.warnings(counts.warning))} ${m.on} ${pages} (${duration}).`);
|
|
38
44
|
}
|
|
39
45
|
lines.push(paint('dim', m.disclaimer));
|
|
@@ -42,6 +48,8 @@ export function formatText(result, color = false) {
|
|
|
42
48
|
function formatFinding(finding, paint, m) {
|
|
43
49
|
const [mark, style] = MARKS[finding.severity];
|
|
44
50
|
const lines = [` ${paint(style, mark)} ${finding.message} ${paint('dim', finding.ruleId)}`];
|
|
51
|
+
if (finding.policy)
|
|
52
|
+
lines.push(paint('dim', ` ${m.policy(finding.policy.allowed, finding.policy.originalSeverity)}`));
|
|
45
53
|
for (const item of finding.evidence) {
|
|
46
54
|
lines.push(paint('dim', ` ${item}`));
|
|
47
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/reporters/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAuB,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI3D,MAAM,KAAK,GAAsC;IAC/C,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC;IACnB,OAAO,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC;IACxB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,MAAkB,EAAE,KAAK,GAAG,KAAK;IAC1D,MAAM,KAAK,GAAG,CAAC,KAAY,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtF,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/D,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/reporters/text.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { say } from '../i18n.js';
|
|
2
|
+
import { observedRequests } from '../observations.js';
|
|
2
3
|
import { hostMatches, safeHost } from '../url.js';
|
|
3
4
|
const ID = 'google-fonts';
|
|
4
5
|
const GOOGLE_FONT_HOSTS = ['fonts.googleapis.com', 'fonts.gstatic.com'];
|
|
@@ -25,7 +26,7 @@ export const googleFonts = {
|
|
|
25
26
|
'consent. LG München I awarded a visitor damages for this in 2022.',
|
|
26
27
|
references: ['Art. 6(1) GDPR', 'LG München I, 20.01.2022, Az. 3 O 17493/20'],
|
|
27
28
|
check({ page, lang }) {
|
|
28
|
-
const requests = page.requests.filter((request) => isGoogleFontUrl(request.url));
|
|
29
|
+
const requests = observedRequests(page.requests).filter((request) => isGoogleFontUrl(request.url));
|
|
29
30
|
if (requests.length > 0) {
|
|
30
31
|
const count = requests.length;
|
|
31
32
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-fonts.js","sourceRoot":"","sources":["../../src/rules/google-fonts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAa,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"google-fonts.js","sourceRoot":"","sources":["../../src/rules/google-fonts.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { say } from '../i18n.js';
|
|
|
2
2
|
const ID = 'reject-option';
|
|
3
3
|
export const rejectOption = {
|
|
4
4
|
id: ID,
|
|
5
|
-
title: 'No
|
|
5
|
+
title: 'No supported reject control detected on the first layer of the banner',
|
|
6
6
|
description: 'Rejecting cookies must be as easy as accepting them. Most European regulators treat a banner ' +
|
|
7
7
|
'that offers "accept" on its first layer, but hides "reject" in the settings or behind a ' +
|
|
8
8
|
'link, as invalid consent.',
|
|
@@ -16,7 +16,9 @@ export const rejectOption = {
|
|
|
16
16
|
],
|
|
17
17
|
check({ page, lang }) {
|
|
18
18
|
const consent = page.consent;
|
|
19
|
-
if (consent?.bannerFound !== true ||
|
|
19
|
+
if (consent?.bannerFound !== true ||
|
|
20
|
+
consent.acceptLabel === undefined ||
|
|
21
|
+
consent.rejectLabel !== undefined) {
|
|
20
22
|
return [];
|
|
21
23
|
}
|
|
22
24
|
const vendor = consent.cmp === undefined ? '' : ` (${consent.cmp})`;
|
|
@@ -50,8 +52,8 @@ export const rejectOption = {
|
|
|
50
52
|
ruleId: ID,
|
|
51
53
|
severity: 'warning',
|
|
52
54
|
message: say(lang, {
|
|
53
|
-
en: `The consent banner${vendor} offers "${accept}"
|
|
54
|
-
de: `Das Cookie-Banner${vendor} bietet „${accept}
|
|
55
|
+
en: `The consent banner${vendor} offers "${accept}"; no supported first-layer reject control was detected. Verify the banner manually.`,
|
|
56
|
+
de: `Das Cookie-Banner${vendor} bietet „${accept}“; eine unterstützte Ablehnen-Steuerung auf der ersten Ebene wurde nicht erkannt. Das Banner manuell prüfen.`,
|
|
55
57
|
}),
|
|
56
58
|
pageUrl: page.finalUrl,
|
|
57
59
|
evidence,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reject-option.js","sourceRoot":"","sources":["../../src/rules/reject-option.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAGjC,MAAM,EAAE,GAAG,eAAe,CAAC;AAE3B,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"reject-option.js","sourceRoot":"","sources":["../../src/rules/reject-option.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAGjC,MAAM,EAAE,GAAG,eAAe,CAAC;AAE3B,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,uEAAuE;IAC9E,WAAW,EACT,+FAA+F;QAC/F,0FAA0F;QAC1F,2BAA2B;IAC7B,UAAU,EAAE;QACV,iDAAiD;QACjD,wEAAwE;QACxE,+CAA+C;QAC/C,iBAAiB;QACjB,gBAAgB;QAChB,mBAAmB;KACpB;IACD,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IACE,OAAO,EAAE,WAAW,KAAK,IAAI;YAC7B,OAAO,CAAC,WAAW,KAAK,SAAS;YACjC,OAAO,CAAC,WAAW,KAAK,SAAS,EACjC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,GAAG,GAAG,CAAC;QACpE,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QACnF,MAAM,QAAQ,GAAG;YACf,GAAG,CAAC,IAAI,EAAE;gBACR,EAAE,EAAE,kBAAkB,OAAO,CAAC,WAAW,IAAI,YAAY,EAAE;gBAC3D,EAAE,EAAE,qBAAqB,OAAO,CAAC,WAAW,IAAI,mBAAmB,EAAE;aACtE,CAAC;SACH,CAAC;QACF,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO;gBACL;oBACE,MAAM,EAAE,EAAE;oBACV,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE;wBACjB,EAAE,EAAE,qBAAqB,MAAM,YAAY,MAAM,+DAA+D;wBAChH,EAAE,EAAE,oBAAoB,MAAM,YAAY,MAAM,+DAA+D;qBAChH,CAAC;oBACF,OAAO,EAAE,IAAI,CAAC,QAAQ;oBACtB,QAAQ;oBACR,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;wBACb,EAAE,EAAE,sQAAsQ;wBAC1Q,EAAE,EAAE,0UAA0U;qBAC/U,CAAC;iBACH;aACF,CAAC;QACJ,CAAC;QACD,OAAO;YACL;gBACE,MAAM,EAAE,EAAE;gBACV,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE;oBACjB,EAAE,EAAE,qBAAqB,MAAM,YAAY,MAAM,sFAAsF;oBACvI,EAAE,EAAE,oBAAoB,MAAM,YAAY,MAAM,8GAA8G;iBAC/J,CAAC;gBACF,OAAO,EAAE,IAAI,CAAC,QAAQ;gBACtB,QAAQ;gBACR,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;oBACb,EAAE,EAAE,sIAAsI;oBAC1I,EAAE,EAAE,+IAA+I;iBACpJ,CAAC;aACH;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -21,8 +21,8 @@ export const thirdPartyEmbeds = {
|
|
|
21
21
|
subject: vendor,
|
|
22
22
|
evidence,
|
|
23
23
|
fix: say(lang, {
|
|
24
|
-
en: `
|
|
25
|
-
de: `
|
|
24
|
+
en: `Review the purpose and legal basis for ${vendor}. Where consent is required, use a click-to-load placeholder or block the resource until consent. Security widgets may need a separate necessity assessment.`,
|
|
25
|
+
de: `Zweck und Rechtsgrundlage für ${vendor} prüfen. Soweit Einwilligung erforderlich ist, einen Platzhalter verwenden oder bis zur Einwilligung blockieren. Sicherheits-Widgets benötigen gegebenenfalls eine gesonderte Erforderlichkeitsprüfung.`,
|
|
26
26
|
}),
|
|
27
27
|
}));
|
|
28
28
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"third-party-embeds.js","sourceRoot":"","sources":["../../src/rules/third-party-embeds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,EAAE,GAAG,oBAAoB,CAAC;AAEhC,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,uCAAuC;IAC9C,WAAW,EACT,6FAA6F;QAC7F,wFAAwF;QACxF,iEAAiE;IACnE,UAAU,EAAE,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;IACnD,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;QAClB,OAAO,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAC7D,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAW,EAAE,CAAC,CAAC;YAChC,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE;gBACjB,EAAE,EAAE,GAAG,MAAM,8CAA8C;gBAC3D,EAAE,EAAE,GAAG,MAAM,kDAAkD;aAChE,CAAC;YACF,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,OAAO,EAAE,MAAM;YACf,QAAQ;YACR,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;gBACb,EAAE,EAAE
|
|
1
|
+
{"version":3,"file":"third-party-embeds.js","sourceRoot":"","sources":["../../src/rules/third-party-embeds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,EAAE,GAAG,oBAAoB,CAAC;AAEhC,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,uCAAuC;IAC9C,WAAW,EACT,6FAA6F;QAC7F,wFAAwF;QACxF,iEAAiE;IACnE,UAAU,EAAE,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;IACnD,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;QAClB,OAAO,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAC7D,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAW,EAAE,CAAC,CAAC;YAChC,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE;gBACjB,EAAE,EAAE,GAAG,MAAM,8CAA8C;gBAC3D,EAAE,EAAE,GAAG,MAAM,kDAAkD;aAChE,CAAC;YACF,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,OAAO,EAAE,MAAM;YACf,QAAQ;YACR,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;gBACb,EAAE,EAAE,0CAA0C,MAAM,8JAA8J;gBAClN,EAAE,EAAE,iCAAiC,MAAM,yMAAyM;aACrP,CAAC;SACH,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { observedRequests } from '../observations.js';
|
|
1
2
|
const MAX_EVIDENCE = 5;
|
|
2
3
|
/** Groups requests by the vendor `find` resolves them to. */
|
|
3
4
|
export function groupRequestsByVendor(requests, find) {
|
|
4
5
|
const byVendor = new Map();
|
|
5
|
-
for (const request of requests) {
|
|
6
|
+
for (const request of observedRequests(requests)) {
|
|
6
7
|
const vendor = find(request.url)?.vendor;
|
|
7
8
|
if (vendor !== undefined) {
|
|
8
9
|
byVendor.set(vendor, (byVendor.get(vendor) ?? new Set()).add(request.url));
|