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.
Files changed (75) hide show
  1. package/README.de.md +68 -2
  2. package/README.md +77 -13
  3. package/dist/assessment.d.ts +6 -0
  4. package/dist/assessment.js +115 -0
  5. package/dist/assessment.js.map +1 -0
  6. package/dist/capture.d.ts +5 -0
  7. package/dist/capture.js +162 -0
  8. package/dist/capture.js.map +1 -0
  9. package/dist/cli.js +48 -14
  10. package/dist/cli.js.map +1 -1
  11. package/dist/config.d.ts +21 -0
  12. package/dist/config.js +113 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/consent.d.ts +3 -0
  15. package/dist/consent.js +81 -12
  16. package/dist/consent.js.map +1 -1
  17. package/dist/coverage.d.ts +13 -0
  18. package/dist/coverage.js +86 -0
  19. package/dist/coverage.js.map +1 -0
  20. package/dist/data/third-parties.js +9 -0
  21. package/dist/data/third-parties.js.map +1 -1
  22. package/dist/diagnostics.d.ts +28 -0
  23. package/dist/diagnostics.js +202 -0
  24. package/dist/diagnostics.js.map +1 -0
  25. package/dist/index.d.ts +6 -0
  26. package/dist/index.js +6 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/network.d.ts +68 -0
  29. package/dist/network.js +237 -0
  30. package/dist/network.js.map +1 -0
  31. package/dist/observations.d.ts +3 -0
  32. package/dist/observations.js +4 -0
  33. package/dist/observations.js.map +1 -0
  34. package/dist/policy.d.ts +6 -0
  35. package/dist/policy.js +37 -0
  36. package/dist/policy.js.map +1 -0
  37. package/dist/report-contract.d.ts +13 -0
  38. package/dist/report-contract.js +16 -0
  39. package/dist/report-contract.js.map +1 -0
  40. package/dist/reporters/capture.d.ts +5 -0
  41. package/dist/reporters/capture.js +87 -0
  42. package/dist/reporters/capture.js.map +1 -0
  43. package/dist/reporters/markdown.js +13 -1
  44. package/dist/reporters/markdown.js.map +1 -1
  45. package/dist/reporters/messages.d.ts +1 -0
  46. package/dist/reporters/messages.js +18 -6
  47. package/dist/reporters/messages.js.map +1 -1
  48. package/dist/reporters/sarif.js +48 -10
  49. package/dist/reporters/sarif.js.map +1 -1
  50. package/dist/reporters/shared.js +3 -2
  51. package/dist/reporters/shared.js.map +1 -1
  52. package/dist/reporters/text.js +10 -2
  53. package/dist/reporters/text.js.map +1 -1
  54. package/dist/rules/google-fonts.js +2 -1
  55. package/dist/rules/google-fonts.js.map +1 -1
  56. package/dist/rules/reject-option.js +6 -4
  57. package/dist/rules/reject-option.js.map +1 -1
  58. package/dist/rules/third-party-embeds.js +2 -2
  59. package/dist/rules/third-party-embeds.js.map +1 -1
  60. package/dist/rules/third-party-hits.js +2 -1
  61. package/dist/rules/third-party-hits.js.map +1 -1
  62. package/dist/rules/tracker-hits.js +2 -1
  63. package/dist/rules/tracker-hits.js.map +1 -1
  64. package/dist/scan-options.d.ts +45 -0
  65. package/dist/scan-options.js +2 -0
  66. package/dist/scan-options.js.map +1 -0
  67. package/dist/scanner.d.ts +4 -38
  68. package/dist/scanner.js +177 -114
  69. package/dist/scanner.js.map +1 -1
  70. package/dist/types.d.ts +119 -0
  71. package/package.json +7 -1
  72. package/schemas/report-1.0.0.schema.json +813 -0
  73. package/schemas/report-1.1.0.schema.json +833 -0
  74. package/schemas/sarif-properties-1.0.0.schema.json +785 -0
  75. package/schemas/sarif-properties-1.1.0.schema.json +810 -0
@@ -0,0 +1,785 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/JExcellence/privalint/raw/refs/heads/main/schemas/sarif-properties-1.0.0.schema.json",
4
+ "title": "PrivaLint SARIF run properties 1.0.0",
5
+ "description": "Validates PrivaLint run.properties only, not the enclosing SARIF 2.1.0 standard.",
6
+ "type": "object",
7
+ "properties": {
8
+ "schemaVersion": {
9
+ "const": "1.0.0"
10
+ },
11
+ "scannerVersion": {
12
+ "type": "string"
13
+ },
14
+ "options": {
15
+ "$ref": "#/$defs/options"
16
+ },
17
+ "coverage": {
18
+ "type": "string",
19
+ "enum": [
20
+ "complete",
21
+ "partial"
22
+ ]
23
+ },
24
+ "observations": {
25
+ "type": "array",
26
+ "items": {
27
+ "type": "object",
28
+ "properties": {
29
+ "url": {
30
+ "type": "string"
31
+ },
32
+ "capture": {
33
+ "$ref": "#/$defs/capture"
34
+ },
35
+ "ruleEvaluations": {
36
+ "type": "array",
37
+ "items": {
38
+ "$ref": "#/$defs/evaluation"
39
+ }
40
+ }
41
+ },
42
+ "required": [
43
+ "url",
44
+ "capture",
45
+ "ruleEvaluations"
46
+ ]
47
+ }
48
+ },
49
+ "consent": {
50
+ "$ref": "#/$defs/consent"
51
+ }
52
+ },
53
+ "required": [
54
+ "schemaVersion",
55
+ "scannerVersion",
56
+ "options",
57
+ "coverage",
58
+ "observations"
59
+ ],
60
+ "$defs": {
61
+ "diagnostic": {
62
+ "type": "object",
63
+ "properties": {
64
+ "kind": {
65
+ "type": "string",
66
+ "enum": [
67
+ "security-blocked",
68
+ "unsupported-method",
69
+ "unsupported-protocol",
70
+ "dns",
71
+ "tls",
72
+ "connection",
73
+ "timeout",
74
+ "resource-limit",
75
+ "http-error",
76
+ "browser-failure",
77
+ "skipped",
78
+ "aborted"
79
+ ]
80
+ },
81
+ "phase": {
82
+ "type": "string",
83
+ "enum": [
84
+ "before-consent",
85
+ "after-reject"
86
+ ]
87
+ },
88
+ "url": {
89
+ "type": "string",
90
+ "pattern": "^(https?://[^/?#@\\s]+/\\[redacted\\]|\\[redacted\\])$"
91
+ },
92
+ "status": {
93
+ "type": "integer",
94
+ "minimum": 100,
95
+ "maximum": 599
96
+ },
97
+ "limit": {
98
+ "type": "string",
99
+ "enum": [
100
+ "requests",
101
+ "response-bytes",
102
+ "total-bytes",
103
+ "redirects"
104
+ ]
105
+ },
106
+ "skippedReason": {
107
+ "type": "string",
108
+ "enum": [
109
+ "beacon",
110
+ "unsupported-method",
111
+ "unsupported-protocol",
112
+ "policy"
113
+ ]
114
+ }
115
+ },
116
+ "required": [
117
+ "kind",
118
+ "phase",
119
+ "url"
120
+ ]
121
+ },
122
+ "diagnostics": {
123
+ "type": "object",
124
+ "properties": {
125
+ "requests": {
126
+ "type": "integer",
127
+ "minimum": 0
128
+ },
129
+ "omittedRequests": {
130
+ "type": "integer",
131
+ "minimum": 0
132
+ },
133
+ "responses": {
134
+ "type": "integer",
135
+ "minimum": 0
136
+ },
137
+ "finished": {
138
+ "type": "integer",
139
+ "minimum": 0
140
+ },
141
+ "failed": {
142
+ "type": "integer",
143
+ "minimum": 0
144
+ },
145
+ "blocked": {
146
+ "type": "integer",
147
+ "minimum": 0
148
+ },
149
+ "skippedRequests": {
150
+ "type": "integer",
151
+ "minimum": 0
152
+ },
153
+ "failedRequests": {
154
+ "type": "integer",
155
+ "minimum": 0
156
+ },
157
+ "securityBlockedRequests": {
158
+ "type": "integer",
159
+ "minimum": 0
160
+ },
161
+ "httpErrors": {
162
+ "type": "integer",
163
+ "minimum": 0
164
+ },
165
+ "bytes": {
166
+ "type": "integer",
167
+ "minimum": 0
168
+ },
169
+ "issueCount": {
170
+ "type": "integer",
171
+ "minimum": 0
172
+ },
173
+ "dropped": {
174
+ "type": "integer",
175
+ "minimum": 0
176
+ },
177
+ "issues": {
178
+ "type": "array",
179
+ "items": {
180
+ "$ref": "#/$defs/diagnostic"
181
+ }
182
+ }
183
+ },
184
+ "required": [
185
+ "requests",
186
+ "omittedRequests",
187
+ "responses",
188
+ "finished",
189
+ "failed",
190
+ "blocked",
191
+ "skippedRequests",
192
+ "failedRequests",
193
+ "securityBlockedRequests",
194
+ "httpErrors",
195
+ "bytes",
196
+ "issueCount",
197
+ "dropped",
198
+ "issues"
199
+ ]
200
+ },
201
+ "capture": {
202
+ "type": "object",
203
+ "properties": {
204
+ "complete": {
205
+ "type": "boolean"
206
+ },
207
+ "beforeConsentComplete": {
208
+ "type": "boolean"
209
+ },
210
+ "document": {
211
+ "type": "boolean"
212
+ },
213
+ "diagnostics": {
214
+ "$ref": "#/$defs/diagnostics"
215
+ }
216
+ },
217
+ "required": [
218
+ "complete",
219
+ "beforeConsentComplete",
220
+ "document",
221
+ "diagnostics"
222
+ ],
223
+ "allOf": [
224
+ {
225
+ "if": {
226
+ "properties": {
227
+ "complete": {
228
+ "const": true
229
+ }
230
+ },
231
+ "required": [
232
+ "complete"
233
+ ]
234
+ },
235
+ "then": {
236
+ "properties": {
237
+ "document": {
238
+ "const": true
239
+ },
240
+ "beforeConsentComplete": {
241
+ "const": true
242
+ },
243
+ "diagnostics": {
244
+ "type": "object",
245
+ "properties": {
246
+ "omittedRequests": {
247
+ "const": 0
248
+ },
249
+ "failed": {
250
+ "const": 0
251
+ },
252
+ "blocked": {
253
+ "const": 0
254
+ },
255
+ "skippedRequests": {
256
+ "const": 0
257
+ },
258
+ "failedRequests": {
259
+ "const": 0
260
+ },
261
+ "securityBlockedRequests": {
262
+ "const": 0
263
+ },
264
+ "httpErrors": {
265
+ "const": 0
266
+ },
267
+ "issueCount": {
268
+ "const": 0
269
+ },
270
+ "dropped": {
271
+ "const": 0
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }
277
+ }
278
+ ]
279
+ },
280
+ "evaluation": {
281
+ "type": "object",
282
+ "properties": {
283
+ "ruleId": {
284
+ "type": "string"
285
+ },
286
+ "status": {
287
+ "type": "string",
288
+ "enum": [
289
+ "executed",
290
+ "skipped",
291
+ "not-evaluable"
292
+ ]
293
+ },
294
+ "reason": {
295
+ "type": "string",
296
+ "enum": [
297
+ "disabled",
298
+ "consent-disabled",
299
+ "not-start-page",
300
+ "missing-observation"
301
+ ]
302
+ },
303
+ "partial": {
304
+ "type": "boolean"
305
+ },
306
+ "outcome": {
307
+ "type": "string",
308
+ "enum": [
309
+ "checked-no-finding",
310
+ "finding-detected",
311
+ "not-evaluable"
312
+ ]
313
+ },
314
+ "explanation": {
315
+ "type": "string",
316
+ "enum": [
317
+ "disabled",
318
+ "not-start-page",
319
+ "consent-disabled",
320
+ "missing-reject-observation",
321
+ "missing-consent-observation",
322
+ "incomplete-document",
323
+ "positive-evidence",
324
+ "incomplete-observation",
325
+ "required-observations-available",
326
+ "no-supported-banner",
327
+ "no-supported-reject-control",
328
+ "unsupported-banner-markup",
329
+ "browser-interaction-failed",
330
+ "reject-clicked-and-reloaded"
331
+ ]
332
+ },
333
+ "findingCount": {
334
+ "type": "integer",
335
+ "minimum": 0
336
+ }
337
+ },
338
+ "required": [
339
+ "ruleId",
340
+ "status",
341
+ "partial",
342
+ "outcome",
343
+ "explanation",
344
+ "findingCount"
345
+ ],
346
+ "allOf": [
347
+ {
348
+ "if": {
349
+ "properties": {
350
+ "outcome": {
351
+ "const": "checked-no-finding"
352
+ }
353
+ },
354
+ "required": [
355
+ "outcome"
356
+ ]
357
+ },
358
+ "then": {
359
+ "properties": {
360
+ "findingCount": {
361
+ "const": 0
362
+ },
363
+ "partial": {
364
+ "const": false
365
+ },
366
+ "status": {
367
+ "const": "executed"
368
+ }
369
+ }
370
+ }
371
+ },
372
+ {
373
+ "if": {
374
+ "properties": {
375
+ "outcome": {
376
+ "const": "finding-detected"
377
+ }
378
+ },
379
+ "required": [
380
+ "outcome"
381
+ ]
382
+ },
383
+ "then": {
384
+ "properties": {
385
+ "findingCount": {
386
+ "type": "integer",
387
+ "minimum": 1
388
+ },
389
+ "status": {
390
+ "const": "executed"
391
+ }
392
+ }
393
+ }
394
+ }
395
+ ]
396
+ },
397
+ "page": {
398
+ "type": "object",
399
+ "properties": {
400
+ "url": {
401
+ "type": "string"
402
+ },
403
+ "finalUrl": {
404
+ "type": "string"
405
+ },
406
+ "status": {
407
+ "anyOf": [
408
+ {
409
+ "type": "integer",
410
+ "minimum": 100,
411
+ "maximum": 599
412
+ },
413
+ {
414
+ "type": "null"
415
+ }
416
+ ]
417
+ },
418
+ "requestCount": {
419
+ "type": "integer",
420
+ "minimum": 0
421
+ },
422
+ "cookieCount": {
423
+ "type": "integer",
424
+ "minimum": 0
425
+ },
426
+ "error": {
427
+ "type": "string"
428
+ },
429
+ "capture": {
430
+ "$ref": "#/$defs/capture"
431
+ },
432
+ "ruleEvaluations": {
433
+ "type": "array",
434
+ "items": {
435
+ "$ref": "#/$defs/evaluation"
436
+ }
437
+ }
438
+ },
439
+ "required": [
440
+ "url",
441
+ "finalUrl",
442
+ "status",
443
+ "requestCount",
444
+ "cookieCount",
445
+ "capture",
446
+ "ruleEvaluations"
447
+ ]
448
+ },
449
+ "finding": {
450
+ "type": "object",
451
+ "properties": {
452
+ "ruleId": {
453
+ "type": "string"
454
+ },
455
+ "severity": {
456
+ "type": "string",
457
+ "enum": [
458
+ "error",
459
+ "warning",
460
+ "info"
461
+ ]
462
+ },
463
+ "message": {
464
+ "type": "string"
465
+ },
466
+ "pageUrl": {
467
+ "type": "string"
468
+ },
469
+ "evidence": {
470
+ "type": "array",
471
+ "items": {
472
+ "type": "string"
473
+ }
474
+ },
475
+ "fix": {
476
+ "type": "string"
477
+ },
478
+ "subject": {
479
+ "type": "string"
480
+ },
481
+ "references": {
482
+ "type": "array",
483
+ "items": {
484
+ "type": "string"
485
+ }
486
+ },
487
+ "policy": {
488
+ "type": "object",
489
+ "properties": {
490
+ "allowed": {
491
+ "type": "boolean"
492
+ },
493
+ "originalSeverity": {
494
+ "type": "string",
495
+ "enum": [
496
+ "error",
497
+ "warning",
498
+ "info"
499
+ ]
500
+ }
501
+ },
502
+ "required": [
503
+ "allowed",
504
+ "originalSeverity"
505
+ ]
506
+ }
507
+ },
508
+ "required": [
509
+ "ruleId",
510
+ "severity",
511
+ "message",
512
+ "pageUrl",
513
+ "evidence"
514
+ ]
515
+ },
516
+ "consent": {
517
+ "type": "object",
518
+ "properties": {
519
+ "bannerFound": {
520
+ "type": "boolean"
521
+ },
522
+ "rejected": {
523
+ "type": "boolean"
524
+ },
525
+ "state": {
526
+ "type": "string",
527
+ "enum": [
528
+ "not-detected",
529
+ "reject-unavailable",
530
+ "interaction-failed",
531
+ "reject-tested"
532
+ ]
533
+ },
534
+ "outcome": {
535
+ "type": "string",
536
+ "enum": [
537
+ "no-banner-detected",
538
+ "unsupported-banner",
539
+ "interaction-failed",
540
+ "reject-succeeded"
541
+ ]
542
+ },
543
+ "reason": {
544
+ "type": "string",
545
+ "enum": [
546
+ "no-supported-banner",
547
+ "no-supported-reject-control",
548
+ "unsupported-banner-markup",
549
+ "browser-interaction-failed",
550
+ "reject-clicked-and-reloaded"
551
+ ]
552
+ },
553
+ "cmp": {
554
+ "type": "string"
555
+ },
556
+ "acceptLabel": {
557
+ "type": "string"
558
+ },
559
+ "rejectLabel": {
560
+ "type": "string"
561
+ },
562
+ "payOrOk": {
563
+ "type": "boolean"
564
+ },
565
+ "afterRejectComplete": {
566
+ "type": "boolean"
567
+ },
568
+ "error": {
569
+ "type": "string"
570
+ }
571
+ },
572
+ "required": [
573
+ "bannerFound",
574
+ "rejected",
575
+ "state",
576
+ "outcome",
577
+ "reason"
578
+ ]
579
+ },
580
+ "rule": {
581
+ "type": "object",
582
+ "properties": {
583
+ "id": {
584
+ "type": "string"
585
+ },
586
+ "title": {
587
+ "type": "string"
588
+ },
589
+ "description": {
590
+ "type": "string"
591
+ },
592
+ "references": {
593
+ "type": "array",
594
+ "items": {
595
+ "type": "string"
596
+ }
597
+ },
598
+ "requires": {
599
+ "type": "array",
600
+ "items": {
601
+ "type": "string",
602
+ "enum": [
603
+ "document",
604
+ "network",
605
+ "consent",
606
+ "after-reject"
607
+ ]
608
+ }
609
+ }
610
+ },
611
+ "required": [
612
+ "id",
613
+ "title",
614
+ "description",
615
+ "references"
616
+ ]
617
+ },
618
+ "networkLimits": {
619
+ "type": "object",
620
+ "properties": {
621
+ "concurrency": {
622
+ "type": "integer",
623
+ "minimum": 1
624
+ },
625
+ "maxRequests": {
626
+ "type": "integer",
627
+ "minimum": 1
628
+ },
629
+ "maxResponseBytes": {
630
+ "type": "integer",
631
+ "minimum": 1
632
+ },
633
+ "maxTotalBytes": {
634
+ "type": "integer",
635
+ "minimum": 1
636
+ },
637
+ "maxRedirects": {
638
+ "type": "integer",
639
+ "minimum": 0
640
+ },
641
+ "requestTimeoutMs": {
642
+ "type": "integer",
643
+ "minimum": 1
644
+ }
645
+ },
646
+ "required": [
647
+ "concurrency",
648
+ "maxRequests",
649
+ "maxResponseBytes",
650
+ "maxTotalBytes",
651
+ "maxRedirects",
652
+ "requestTimeoutMs"
653
+ ]
654
+ },
655
+ "options": {
656
+ "type": "object",
657
+ "properties": {
658
+ "maxPages": {
659
+ "type": "integer",
660
+ "minimum": 1
661
+ },
662
+ "settleMs": {
663
+ "type": "integer",
664
+ "minimum": 0
665
+ },
666
+ "timeoutMs": {
667
+ "type": "integer",
668
+ "minimum": 1
669
+ },
670
+ "locale": {
671
+ "type": "string"
672
+ },
673
+ "lang": {
674
+ "type": "string",
675
+ "enum": [
676
+ "en",
677
+ "de"
678
+ ]
679
+ },
680
+ "region": {
681
+ "type": "string",
682
+ "enum": [
683
+ "de",
684
+ "at",
685
+ "ch",
686
+ "eu"
687
+ ]
688
+ },
689
+ "consentCheck": {
690
+ "type": "boolean"
691
+ },
692
+ "headed": {
693
+ "type": "boolean"
694
+ },
695
+ "channel": {
696
+ "type": "string"
697
+ },
698
+ "captureTimeoutMs": {
699
+ "anyOf": [
700
+ {
701
+ "type": "integer",
702
+ "minimum": 1
703
+ },
704
+ {
705
+ "type": "null"
706
+ }
707
+ ]
708
+ },
709
+ "maxDiagnostics": {
710
+ "type": "integer",
711
+ "minimum": 0
712
+ },
713
+ "failureMode": {
714
+ "type": "string",
715
+ "enum": [
716
+ "throw",
717
+ "report"
718
+ ]
719
+ },
720
+ "captureMode": {
721
+ "type": "string",
722
+ "enum": [
723
+ "native",
724
+ "adapter",
725
+ "offline-fixture"
726
+ ]
727
+ },
728
+ "networkLimits": {
729
+ "anyOf": [
730
+ {
731
+ "$ref": "#/$defs/networkLimits"
732
+ },
733
+ {
734
+ "type": "null"
735
+ }
736
+ ]
737
+ },
738
+ "selectedRules": {
739
+ "type": "array",
740
+ "items": {
741
+ "type": "string"
742
+ },
743
+ "uniqueItems": true
744
+ },
745
+ "ruleSettings": {
746
+ "type": "object",
747
+ "additionalProperties": {
748
+ "type": "string",
749
+ "enum": [
750
+ "error",
751
+ "warning",
752
+ "info",
753
+ "off"
754
+ ]
755
+ }
756
+ },
757
+ "allowedVendors": {
758
+ "type": "array",
759
+ "items": {
760
+ "type": "string"
761
+ }
762
+ }
763
+ },
764
+ "required": [
765
+ "maxPages",
766
+ "settleMs",
767
+ "timeoutMs",
768
+ "locale",
769
+ "lang",
770
+ "region",
771
+ "consentCheck",
772
+ "headed",
773
+ "channel",
774
+ "captureTimeoutMs",
775
+ "maxDiagnostics",
776
+ "failureMode",
777
+ "captureMode",
778
+ "networkLimits",
779
+ "selectedRules",
780
+ "ruleSettings",
781
+ "allowedVendors"
782
+ ]
783
+ }
784
+ }
785
+ }