@freedomofpress/webcat 0.0.0-stage → 3.0.1

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 (82) hide show
  1. package/Readme.md +45 -0
  2. package/data/block.json +101 -0
  3. package/data/list.json +80 -0
  4. package/dist/hooks/content.js +1 -0
  5. package/dist/lib/browser/chrome.d.ts +86 -0
  6. package/dist/lib/browser/chrome.js +138 -0
  7. package/dist/lib/browser/kvstore.d.ts +70 -0
  8. package/dist/lib/browser/kvstore.js +241 -0
  9. package/dist/lib/browser/permissions.d.ts +113 -0
  10. package/dist/lib/browser/permissions.js +182 -0
  11. package/dist/lib/browser/requests.d.ts +145 -0
  12. package/dist/lib/browser/requests.js +292 -0
  13. package/dist/lib/browser/scripting.d.ts +19 -0
  14. package/dist/lib/browser/scripting.js +92 -0
  15. package/dist/lib/browser/sync.d.ts +68 -0
  16. package/dist/lib/browser/sync.js +114 -0
  17. package/dist/lib/browser/utils.d.ts +5 -0
  18. package/dist/lib/browser/utils.js +11 -0
  19. package/dist/lib/config.d.ts +45 -0
  20. package/dist/lib/config.js +45 -0
  21. package/dist/lib/validator_set.d.ts +4 -0
  22. package/dist/lib/validator_set.js +20 -0
  23. package/dist/lib/webcat/cache.d.ts +200 -0
  24. package/dist/lib/webcat/cache.js +308 -0
  25. package/dist/lib/webcat/canonicalize.d.ts +1 -0
  26. package/dist/lib/webcat/canonicalize.js +58 -0
  27. package/dist/lib/webcat/db.d.ts +30 -0
  28. package/dist/lib/webcat/db.js +131 -0
  29. package/dist/lib/webcat/encoding.d.ts +8 -0
  30. package/dist/lib/webcat/encoding.js +57 -0
  31. package/dist/lib/webcat/handler.d.ts +26 -0
  32. package/dist/lib/webcat/handler.js +419 -0
  33. package/dist/lib/webcat/hookbuilder.d.ts +47 -0
  34. package/dist/lib/webcat/hookbuilder.js +170 -0
  35. package/dist/lib/webcat/interfaces/bundle.d.ts +46 -0
  36. package/dist/lib/webcat/interfaces/bundle.js +8 -0
  37. package/dist/lib/webcat/interfaces/database.d.ts +68 -0
  38. package/dist/lib/webcat/interfaces/database.js +1 -0
  39. package/dist/lib/webcat/interfaces/errors.d.ts +451 -0
  40. package/dist/lib/webcat/interfaces/errors.js +109 -0
  41. package/dist/lib/webcat/interfaces/log.d.ts +14 -0
  42. package/dist/lib/webcat/interfaces/log.js +10 -0
  43. package/dist/lib/webcat/interfaces/originstate.d.ts +40 -0
  44. package/dist/lib/webcat/interfaces/originstate.js +1 -0
  45. package/dist/lib/webcat/interfaces/requeststate.d.ts +10 -0
  46. package/dist/lib/webcat/interfaces/requeststate.js +1 -0
  47. package/dist/lib/webcat/logger.d.ts +64 -0
  48. package/dist/lib/webcat/logger.js +112 -0
  49. package/dist/lib/webcat/originstate.d.ts +45 -0
  50. package/dist/lib/webcat/originstate.js +302 -0
  51. package/dist/lib/webcat/parsers.d.ts +21 -0
  52. package/dist/lib/webcat/parsers.js +36 -0
  53. package/dist/lib/webcat/request.d.ts +11 -0
  54. package/dist/lib/webcat/request.js +78 -0
  55. package/dist/lib/webcat/resources.d.ts +3 -0
  56. package/dist/lib/webcat/resources.js +41 -0
  57. package/dist/lib/webcat/response.d.ts +39 -0
  58. package/dist/lib/webcat/response.js +394 -0
  59. package/dist/lib/webcat/ui.d.ts +70 -0
  60. package/dist/lib/webcat/ui.js +282 -0
  61. package/dist/lib/webcat/updater.d.ts +115 -0
  62. package/dist/lib/webcat/updater.js +296 -0
  63. package/dist/lib/webcat/utils.d.ts +8 -0
  64. package/dist/lib/webcat/utils.js +74 -0
  65. package/dist/lib/webcat/validators.d.ts +16 -0
  66. package/dist/lib/webcat/validators.js +457 -0
  67. package/dist/lib/webcat.d.ts +11 -0
  68. package/dist/lib/webcat.js +130 -0
  69. package/icons/dark/webcat-error.SVG +1 -0
  70. package/icons/dark/webcat-ok.SVG +1 -0
  71. package/icons/dark/webcat.SVG +1 -0
  72. package/icons/light/webcat-error.SVG +1 -0
  73. package/icons/light/webcat-ok.SVG +1 -0
  74. package/icons/light/webcat.SVG +1 -0
  75. package/package.json +72 -4
  76. package/pages/error.css +9 -0
  77. package/pages/error.html +70 -0
  78. package/pages/error.js +51 -0
  79. package/pages/popup.css +16 -0
  80. package/pages/popup.html +14 -0
  81. package/pages/popup.js +48 -0
  82. package/README.md +0 -3
@@ -0,0 +1 @@
1
+ <svg version="1.0" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" viewBox="160 160.18 703.5 704.23"> <g transform="translate(0.000000,1024.000000) scale(0.100000,-0.100000)" fill="" stroke="none"> <circle cx="5120" cy="5120" r="3300" fill="#ff0081"></circle> <path d="M4905 8633 c-91 -6 -318 -34 -440 -54 -506 -83 -1133 -362 -1539 -686 -413 -329 -765 -787 -1002 -1303 -86 -189 -123 -290 -183 -512 -94 -344 -141 -669 -141 -978 0 -681 197 -1345 562 -1895 218 -329 430 -575 663 -770 374 -312 709 -502 1135 -645 228 -77 330 -103 552 -139 305 -50 361 -55 628 -55 267 0 343 7 650 60 409 70 863 242 1200 455 299 188 620 464 830 714 169 201 348 484 480 760 159 331 245 619 312 1035 21 130 23 178 23 470 0 355 -4 397 -70 725 -129 649 -415 1213 -876 1730 -179 202 -347 345 -594 510 -505 336 -1060 524 -1699 575 -119 9 -372 11 -491 3z m615 -339 c667 -75 1309 -371 1779 -819 297 -284 520 -595 712 -995 142 -295 241 -649 286 -1015 20 -168 23 -500 5 -660 -70 -624 -225 -1044 -577 -1562 -108 -160 -201 -269 -385 -454 -166 -166 -263 -246 -430 -354 -279 -181 -534 -301 -854 -401 -288 -91 -489 -123 -809 -131 l-228 -6 7 29 c8 35 110 308 154 414 82 197 232 447 328 547 31 32 116 109 187 171 185 160 265 196 661 296 342 86 514 196 704 448 171 226 303 528 361 821 24 125 24 188 0 235 -11 20 -59 80 -106 132 -122 134 -248 304 -310 418 -200 368 -334 543 -536 697 -215 165 -469 298 -739 388 -145 48 -261 72 -435 90 l-109 12 -7 40 c-11 65 -29 353 -39 615 -10 276 -20 332 -71 374 -65 55 -159 27 -345 -105 -125 -88 -387 -313 -524 -449 -136 -135 -411 -445 -514 -580 -301 -393 -532 -860 -611 -1238 -18 -87 -58 -151 -232 -366 -65 -80 -164 -203 -220 -273 -56 -70 -144 -180 -195 -244 -51 -64 -140 -178 -198 -253 -57 -74 -107 -132 -111 -128 -8 10 -63 189 -89 291 -60 236 -89 455 -97 721 -6 229 7 449 38 635 26 154 101 464 129 535 12 30 27 71 32 90 30 110 225 498 316 630 25 36 53 76 63 90 9 14 34 51 54 83 53 81 238 289 353 396 330 308 690 522 1167 694 191 69 471 126 720 146 72 6 148 13 170 15 76 8 411 -4 545 -20z m813 -2658 c65 -33 160 -127 182 -180 8 -20 15 -64 15 -99 0 -119 -86 -249 -199 -300 -67 -31 -168 -29 -241 5 -110 50 -199 179 -208 301 -6 81 12 135 69 207 62 79 115 100 239 97 72 -2 94 -7 143 -31z" fill="#fff"></path> <path d="M6204 7530 c-44 -10 -147 -68 -256 -143 -106 -73 -433 -331 -496 -391 -51 -48 -78 -94 -64 -108 5 -5 61 -20 123 -34 63 -13 132 -30 154 -38 22 -8 74 -24 115 -36 131 -38 414 -161 515 -225 28 -17 56 -35 64 -39 11 -7 13 64 9 450 -4 453 -4 460 -26 506 -30 61 -66 76 -138 58z" fill="#fff"></path> </g> </svg>
@@ -0,0 +1 @@
1
+ <svg version="1.0" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" viewBox="160 160.18 703.5 704.23"> <g transform="translate(0.000000,1024.000000) scale(0.100000,-0.100000)" fill="" stroke="none"> <circle cx="5120" cy="5120" r="3300" fill="#008100"></circle> <path d="M4905 8633 c-91 -6 -318 -34 -440 -54 -506 -83 -1133 -362 -1539 -686 -413 -329 -765 -787 -1002 -1303 -86 -189 -123 -290 -183 -512 -94 -344 -141 -669 -141 -978 0 -681 197 -1345 562 -1895 218 -329 430 -575 663 -770 374 -312 709 -502 1135 -645 228 -77 330 -103 552 -139 305 -50 361 -55 628 -55 267 0 343 7 650 60 409 70 863 242 1200 455 299 188 620 464 830 714 169 201 348 484 480 760 159 331 245 619 312 1035 21 130 23 178 23 470 0 355 -4 397 -70 725 -129 649 -415 1213 -876 1730 -179 202 -347 345 -594 510 -505 336 -1060 524 -1699 575 -119 9 -372 11 -491 3z m615 -339 c667 -75 1309 -371 1779 -819 297 -284 520 -595 712 -995 142 -295 241 -649 286 -1015 20 -168 23 -500 5 -660 -70 -624 -225 -1044 -577 -1562 -108 -160 -201 -269 -385 -454 -166 -166 -263 -246 -430 -354 -279 -181 -534 -301 -854 -401 -288 -91 -489 -123 -809 -131 l-228 -6 7 29 c8 35 110 308 154 414 82 197 232 447 328 547 31 32 116 109 187 171 185 160 265 196 661 296 342 86 514 196 704 448 171 226 303 528 361 821 24 125 24 188 0 235 -11 20 -59 80 -106 132 -122 134 -248 304 -310 418 -200 368 -334 543 -536 697 -215 165 -469 298 -739 388 -145 48 -261 72 -435 90 l-109 12 -7 40 c-11 65 -29 353 -39 615 -10 276 -20 332 -71 374 -65 55 -159 27 -345 -105 -125 -88 -387 -313 -524 -449 -136 -135 -411 -445 -514 -580 -301 -393 -532 -860 -611 -1238 -18 -87 -58 -151 -232 -366 -65 -80 -164 -203 -220 -273 -56 -70 -144 -180 -195 -244 -51 -64 -140 -178 -198 -253 -57 -74 -107 -132 -111 -128 -8 10 -63 189 -89 291 -60 236 -89 455 -97 721 -6 229 7 449 38 635 26 154 101 464 129 535 12 30 27 71 32 90 30 110 225 498 316 630 25 36 53 76 63 90 9 14 34 51 54 83 53 81 238 289 353 396 330 308 690 522 1167 694 191 69 471 126 720 146 72 6 148 13 170 15 76 8 411 -4 545 -20z m813 -2658 c65 -33 160 -127 182 -180 8 -20 15 -64 15 -99 0 -119 -86 -249 -199 -300 -67 -31 -168 -29 -241 5 -110 50 -199 179 -208 301 -6 81 12 135 69 207 62 79 115 100 239 97 72 -2 94 -7 143 -31z" fill="#fff"></path> <path d="M6204 7530 c-44 -10 -147 -68 -256 -143 -106 -73 -433 -331 -496 -391 -51 -48 -78 -94 -64 -108 5 -5 61 -20 123 -34 63 -13 132 -30 154 -38 22 -8 74 -24 115 -36 131 -38 414 -161 515 -225 28 -17 56 -35 64 -39 11 -7 13 64 9 450 -4 453 -4 460 -26 506 -30 61 -66 76 -138 58z" fill="#fff"></path> </g> </svg>
@@ -0,0 +1 @@
1
+ <svg version="1.0" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" viewBox="160 160.18 703.5 704.23"> <g transform="translate(0.000000,1024.000000) scale(0.100000,-0.100000)" fill="" stroke="none"> <path d="M4905 8633 c-91 -6 -318 -34 -440 -54 -506 -83 -1133 -362 -1539 -686 -413 -329 -765 -787 -1002 -1303 -86 -189 -123 -290 -183 -512 -94 -344 -141 -669 -141 -978 0 -681 197 -1345 562 -1895 218 -329 430 -575 663 -770 374 -312 709 -502 1135 -645 228 -77 330 -103 552 -139 305 -50 361 -55 628 -55 267 0 343 7 650 60 409 70 863 242 1200 455 299 188 620 464 830 714 169 201 348 484 480 760 159 331 245 619 312 1035 21 130 23 178 23 470 0 355 -4 397 -70 725 -129 649 -415 1213 -876 1730 -179 202 -347 345 -594 510 -505 336 -1060 524 -1699 575 -119 9 -372 11 -491 3z m615 -339 c667 -75 1309 -371 1779 -819 297 -284 520 -595 712 -995 142 -295 241 -649 286 -1015 20 -168 23 -500 5 -660 -70 -624 -225 -1044 -577 -1562 -108 -160 -201 -269 -385 -454 -166 -166 -263 -246 -430 -354 -279 -181 -534 -301 -854 -401 -288 -91 -489 -123 -809 -131 l-228 -6 7 29 c8 35 110 308 154 414 82 197 232 447 328 547 31 32 116 109 187 171 185 160 265 196 661 296 342 86 514 196 704 448 171 226 303 528 361 821 24 125 24 188 0 235 -11 20 -59 80 -106 132 -122 134 -248 304 -310 418 -200 368 -334 543 -536 697 -215 165 -469 298 -739 388 -145 48 -261 72 -435 90 l-109 12 -7 40 c-11 65 -29 353 -39 615 -10 276 -20 332 -71 374 -65 55 -159 27 -345 -105 -125 -88 -387 -313 -524 -449 -136 -135 -411 -445 -514 -580 -301 -393 -532 -860 -611 -1238 -18 -87 -58 -151 -232 -366 -65 -80 -164 -203 -220 -273 -56 -70 -144 -180 -195 -244 -51 -64 -140 -178 -198 -253 -57 -74 -107 -132 -111 -128 -8 10 -63 189 -89 291 -60 236 -89 455 -97 721 -6 229 7 449 38 635 26 154 101 464 129 535 12 30 27 71 32 90 30 110 225 498 316 630 25 36 53 76 63 90 9 14 34 51 54 83 53 81 238 289 353 396 330 308 690 522 1167 694 191 69 471 126 720 146 72 6 148 13 170 15 76 8 411 -4 545 -20z m813 -2658 c65 -33 160 -127 182 -180 8 -20 15 -64 15 -99 0 -119 -86 -249 -199 -300 -67 -31 -168 -29 -241 5 -110 50 -199 179 -208 301 -6 81 12 135 69 207 62 79 115 100 239 97 72 -2 94 -7 143 -31z" fill="#fff"></path> <path d="M6204 7530 c-44 -10 -147 -68 -256 -143 -106 -73 -433 -331 -496 -391 -51 -48 -78 -94 -64 -108 5 -5 61 -20 123 -34 63 -13 132 -30 154 -38 22 -8 74 -24 115 -36 131 -38 414 -161 515 -225 28 -17 56 -35 64 -39 11 -7 13 64 9 450 -4 453 -4 460 -26 506 -30 61 -66 76 -138 58z" fill="#fff"></path> </g> </svg>
@@ -0,0 +1 @@
1
+ <svg version="1.0" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" viewBox="160 160.18 703.5 704.23"> <g transform="translate(0.000000,1024.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none"> <circle cx="5120" cy="5120" r="3300" fill="#ff0081"></circle> <path d="M4905 8633 c-91 -6 -318 -34 -440 -54 -506 -83 -1133 -362 -1539 -686 -413 -329 -765 -787 -1002 -1303 -86 -189 -123 -290 -183 -512 -94 -344 -141 -669 -141 -978 0 -681 197 -1345 562 -1895 218 -329 430 -575 663 -770 374 -312 709 -502 1135 -645 228 -77 330 -103 552 -139 305 -50 361 -55 628 -55 267 0 343 7 650 60 409 70 863 242 1200 455 299 188 620 464 830 714 169 201 348 484 480 760 159 331 245 619 312 1035 21 130 23 178 23 470 0 355 -4 397 -70 725 -129 649 -415 1213 -876 1730 -179 202 -347 345 -594 510 -505 336 -1060 524 -1699 575 -119 9 -372 11 -491 3z m615 -339 c667 -75 1309 -371 1779 -819 297 -284 520 -595 712 -995 142 -295 241 -649 286 -1015 20 -168 23 -500 5 -660 -70 -624 -225 -1044 -577 -1562 -108 -160 -201 -269 -385 -454 -166 -166 -263 -246 -430 -354 -279 -181 -534 -301 -854 -401 -288 -91 -489 -123 -809 -131 l-228 -6 7 29 c8 35 110 308 154 414 82 197 232 447 328 547 31 32 116 109 187 171 185 160 265 196 661 296 342 86 514 196 704 448 171 226 303 528 361 821 24 125 24 188 0 235 -11 20 -59 80 -106 132 -122 134 -248 304 -310 418 -200 368 -334 543 -536 697 -215 165 -469 298 -739 388 -145 48 -261 72 -435 90 l-109 12 -7 40 c-11 65 -29 353 -39 615 -10 276 -20 332 -71 374 -65 55 -159 27 -345 -105 -125 -88 -387 -313 -524 -449 -136 -135 -411 -445 -514 -580 -301 -393 -532 -860 -611 -1238 -18 -87 -58 -151 -232 -366 -65 -80 -164 -203 -220 -273 -56 -70 -144 -180 -195 -244 -51 -64 -140 -178 -198 -253 -57 -74 -107 -132 -111 -128 -8 10 -63 189 -89 291 -60 236 -89 455 -97 721 -6 229 7 449 38 635 26 154 101 464 129 535 12 30 27 71 32 90 30 110 225 498 316 630 25 36 53 76 63 90 9 14 34 51 54 83 53 81 238 289 353 396 330 308 690 522 1167 694 191 69 471 126 720 146 72 6 148 13 170 15 76 8 411 -4 545 -20z m813 -2658 c65 -33 160 -127 182 -180 8 -20 15 -64 15 -99 0 -119 -86 -249 -199 -300 -67 -31 -168 -29 -241 5 -110 50 -199 179 -208 301 -6 81 12 135 69 207 62 79 115 100 239 97 72 -2 94 -7 143 -31z"></path> <path d="M6204 7530 c-44 -10 -147 -68 -256 -143 -106 -73 -433 -331 -496 -391 -51 -48 -78 -94 -64 -108 5 -5 61 -20 123 -34 63 -13 132 -30 154 -38 22 -8 74 -24 115 -36 131 -38 414 -161 515 -225 28 -17 56 -35 64 -39 11 -7 13 64 9 450 -4 453 -4 460 -26 506 -30 61 -66 76 -138 58z"></path> </g> </svg>
@@ -0,0 +1 @@
1
+ <svg version="1.0" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" viewBox="160 160.18 703.5 704.23"> <g transform="translate(0.000000,1024.000000) scale(0.100000,-0.100000)" fill="" stroke="none"> <circle cx="5120" cy="5120" r="3300" fill="#008100"></circle> <path d="M4905 8633 c-91 -6 -318 -34 -440 -54 -506 -83 -1133 -362 -1539 -686 -413 -329 -765 -787 -1002 -1303 -86 -189 -123 -290 -183 -512 -94 -344 -141 -669 -141 -978 0 -681 197 -1345 562 -1895 218 -329 430 -575 663 -770 374 -312 709 -502 1135 -645 228 -77 330 -103 552 -139 305 -50 361 -55 628 -55 267 0 343 7 650 60 409 70 863 242 1200 455 299 188 620 464 830 714 169 201 348 484 480 760 159 331 245 619 312 1035 21 130 23 178 23 470 0 355 -4 397 -70 725 -129 649 -415 1213 -876 1730 -179 202 -347 345 -594 510 -505 336 -1060 524 -1699 575 -119 9 -372 11 -491 3z m615 -339 c667 -75 1309 -371 1779 -819 297 -284 520 -595 712 -995 142 -295 241 -649 286 -1015 20 -168 23 -500 5 -660 -70 -624 -225 -1044 -577 -1562 -108 -160 -201 -269 -385 -454 -166 -166 -263 -246 -430 -354 -279 -181 -534 -301 -854 -401 -288 -91 -489 -123 -809 -131 l-228 -6 7 29 c8 35 110 308 154 414 82 197 232 447 328 547 31 32 116 109 187 171 185 160 265 196 661 296 342 86 514 196 704 448 171 226 303 528 361 821 24 125 24 188 0 235 -11 20 -59 80 -106 132 -122 134 -248 304 -310 418 -200 368 -334 543 -536 697 -215 165 -469 298 -739 388 -145 48 -261 72 -435 90 l-109 12 -7 40 c-11 65 -29 353 -39 615 -10 276 -20 332 -71 374 -65 55 -159 27 -345 -105 -125 -88 -387 -313 -524 -449 -136 -135 -411 -445 -514 -580 -301 -393 -532 -860 -611 -1238 -18 -87 -58 -151 -232 -366 -65 -80 -164 -203 -220 -273 -56 -70 -144 -180 -195 -244 -51 -64 -140 -178 -198 -253 -57 -74 -107 -132 -111 -128 -8 10 -63 189 -89 291 -60 236 -89 455 -97 721 -6 229 7 449 38 635 26 154 101 464 129 535 12 30 27 71 32 90 30 110 225 498 316 630 25 36 53 76 63 90 9 14 34 51 54 83 53 81 238 289 353 396 330 308 690 522 1167 694 191 69 471 126 720 146 72 6 148 13 170 15 76 8 411 -4 545 -20z m813 -2658 c65 -33 160 -127 182 -180 8 -20 15 -64 15 -99 0 -119 -86 -249 -199 -300 -67 -31 -168 -29 -241 5 -110 50 -199 179 -208 301 -6 81 12 135 69 207 62 79 115 100 239 97 72 -2 94 -7 143 -31z"></path> <path d="M6204 7530 c-44 -10 -147 -68 -256 -143 -106 -73 -433 -331 -496 -391 -51 -48 -78 -94 -64 -108 5 -5 61 -20 123 -34 63 -13 132 -30 154 -38 22 -8 74 -24 115 -36 131 -38 414 -161 515 -225 28 -17 56 -35 64 -39 11 -7 13 64 9 450 -4 453 -4 460 -26 506 -30 61 -66 76 -138 58z"></path> </g> </svg>
@@ -0,0 +1 @@
1
+ <svg version="1.0" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" viewBox="160 160.18 703.5 704.23"> <g transform="translate(0.000000,1024.000000) scale(0.100000,-0.100000)" fill="" stroke="none"> <path d="M4905 8633 c-91 -6 -318 -34 -440 -54 -506 -83 -1133 -362 -1539 -686 -413 -329 -765 -787 -1002 -1303 -86 -189 -123 -290 -183 -512 -94 -344 -141 -669 -141 -978 0 -681 197 -1345 562 -1895 218 -329 430 -575 663 -770 374 -312 709 -502 1135 -645 228 -77 330 -103 552 -139 305 -50 361 -55 628 -55 267 0 343 7 650 60 409 70 863 242 1200 455 299 188 620 464 830 714 169 201 348 484 480 760 159 331 245 619 312 1035 21 130 23 178 23 470 0 355 -4 397 -70 725 -129 649 -415 1213 -876 1730 -179 202 -347 345 -594 510 -505 336 -1060 524 -1699 575 -119 9 -372 11 -491 3z m615 -339 c667 -75 1309 -371 1779 -819 297 -284 520 -595 712 -995 142 -295 241 -649 286 -1015 20 -168 23 -500 5 -660 -70 -624 -225 -1044 -577 -1562 -108 -160 -201 -269 -385 -454 -166 -166 -263 -246 -430 -354 -279 -181 -534 -301 -854 -401 -288 -91 -489 -123 -809 -131 l-228 -6 7 29 c8 35 110 308 154 414 82 197 232 447 328 547 31 32 116 109 187 171 185 160 265 196 661 296 342 86 514 196 704 448 171 226 303 528 361 821 24 125 24 188 0 235 -11 20 -59 80 -106 132 -122 134 -248 304 -310 418 -200 368 -334 543 -536 697 -215 165 -469 298 -739 388 -145 48 -261 72 -435 90 l-109 12 -7 40 c-11 65 -29 353 -39 615 -10 276 -20 332 -71 374 -65 55 -159 27 -345 -105 -125 -88 -387 -313 -524 -449 -136 -135 -411 -445 -514 -580 -301 -393 -532 -860 -611 -1238 -18 -87 -58 -151 -232 -366 -65 -80 -164 -203 -220 -273 -56 -70 -144 -180 -195 -244 -51 -64 -140 -178 -198 -253 -57 -74 -107 -132 -111 -128 -8 10 -63 189 -89 291 -60 236 -89 455 -97 721 -6 229 7 449 38 635 26 154 101 464 129 535 12 30 27 71 32 90 30 110 225 498 316 630 25 36 53 76 63 90 9 14 34 51 54 83 53 81 238 289 353 396 330 308 690 522 1167 694 191 69 471 126 720 146 72 6 148 13 170 15 76 8 411 -4 545 -20z m813 -2658 c65 -33 160 -127 182 -180 8 -20 15 -64 15 -99 0 -119 -86 -249 -199 -300 -67 -31 -168 -29 -241 5 -110 50 -199 179 -208 301 -6 81 12 135 69 207 62 79 115 100 239 97 72 -2 94 -7 143 -31z"></path> <path d="M6204 7530 c-44 -10 -147 -68 -256 -143 -106 -73 -433 -331 -496 -391 -51 -48 -78 -94 -64 -108 5 -5 61 -20 123 -34 63 -13 132 -30 154 -38 22 -8 74 -24 115 -36 131 -38 414 -161 515 -225 28 -17 56 -35 64 -39 11 -7 13 64 9 450 -4 453 -4 460 -26 506 -30 61 -66 76 -138 58z"></path> </g> </svg>
package/package.json CHANGED
@@ -1,6 +1,74 @@
1
1
  {
2
2
  "name": "@freedomofpress/webcat",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "type": "module",
4
+ "version": "3.0.1",
5
+ "description": "WEBCAT web application integrity library, used by the WEBCAT browser extension and developer tooling.",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/freedomofpress/webcat",
9
+ "directory": "extension"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "files": [
15
+ "dist/lib",
16
+ "dist/hooks/content.js",
17
+ "data",
18
+ "icons",
19
+ "pages"
20
+ ],
21
+ "exports": {
22
+ ".": "./dist/lib/webcat.js",
23
+ "./config": "./dist/lib/config.js",
24
+ "./webcat/*": "./dist/lib/webcat/*.js",
25
+ "./hooks/*": "./dist/hooks/*",
26
+ "./browser/*": "./dist/lib/browser/*.js",
27
+ "./validator_set": "./dist/lib/validator_set.js",
28
+ "./data/*.json": "./data/*.json",
29
+ "./icons/light/*.SVG": "./icons/light/*.SVG",
30
+ "./icons/dark/*.SVG": "./icons/dark/*.SVG",
31
+ "./pages/*": "./pages/*"
32
+ },
33
+ "scripts": {
34
+ "build:hooks": "tsc -p tsconfig.hooks.json && vite build --config vite.config.hooks.page.ts && vite build --config vite.config.hooks.content.ts",
35
+ "build:lib": "npm run build:hooks && vite build --config vite.config.lib.ts && tsc -p tsconfig.lib.json && cp src/validator_set.d.ts dist/lib/validator_set.d.ts",
36
+ "build": "npm run build:hooks && tsc && vite build",
37
+ "prepack": "npm run build:lib",
38
+ "test": "npm run build:hooks && vitest",
39
+ "coverage": "npm run build:hooks && vitest --coverage",
40
+ "test:playwright": "vitest --config vite.config.playwright.ts",
41
+ "test:default": "vitest --config vite.config.ts",
42
+ "lint": "dpdm src/background.ts --no-warning --no-tree --exit-code circular:1 && npx eslint . --fix && npx prettier --write .",
43
+ "lint:check": "dpdm src/background.ts --no-warning --no-tree --exit-code circular:1 && npx eslint . && npx prettier --check ."
44
+ },
45
+ "author": "Giulio B",
46
+ "license": "MIT",
47
+ "devDependencies": {
48
+ "@eslint/js": "^10.0.1",
49
+ "@trivago/prettier-plugin-sort-imports": "^6.0.2",
50
+ "@types/firefox": "^0.0.34",
51
+ "@types/firefox-webext-browser": "^143.0.0",
52
+ "@types/node": "^26.1.2",
53
+ "@vitest/coverage-v8": "^4.1.8",
54
+ "dpdm": "^4.3.0",
55
+ "eslint": "^10.4.1",
56
+ "eslint-plugin-simple-import-sort": "^13.0.0",
57
+ "globals": "^17.6.0",
58
+ "playwright": "^1.54.1",
59
+ "prettier": "^3.6.2",
60
+ "typedoc": "^0.28.20",
61
+ "typescript": "^6.0.3",
62
+ "typescript-eslint": "^8.37.0",
63
+ "vite": "^6.3.5",
64
+ "vite-plugin-singlefile": "^2.3.0",
65
+ "vitest": "^4.1.8",
66
+ "yazl": "^3.3.1"
67
+ },
68
+ "dependencies": {
69
+ "@freedomofpress/cometbft": "^0.2.0",
70
+ "@freedomofpress/ics23": "^0.2.0",
71
+ "@freedomofpress/sigstore-browser": "^0.1.15",
72
+ "@freedomofpress/sigsum": "^0.4.0"
73
+ }
74
+ }
@@ -0,0 +1,9 @@
1
+ body.webcaterror .title {
2
+ background-image: url("../icons/light/webcat-error.SVG");
3
+ }
4
+
5
+ @media (prefers-color-scheme: dark) {
6
+ body.webcaterror .title {
7
+ background-image: url("../icons/dark/webcat-error.SVG");
8
+ }
9
+ }
@@ -0,0 +1,70 @@
1
+ <!doctype html>
2
+ <html class="in-content-page" lang="en-US">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta
6
+ http-equiv="Content-Security-Policy"
7
+ content="default-src chrome:; img-src chrome: 'self'; object-src 'none';"
8
+ />
9
+ <meta name="color-scheme" content="light dark" />
10
+ <link rel="icon" href="chrome://global/skin/icons/warning.svg" />
11
+ <link rel="stylesheet" href="chrome://global/skin/aboutNetError.css" />
12
+ <link rel="stylesheet" href="error.css" />
13
+ <script src="error.js"></script>
14
+ <title data-i18n="warningSecurityRisk">Warning: Security Risk</title>
15
+ </head>
16
+ <body class="certerror webcaterror">
17
+ <div class="container">
18
+ <div id="text-container">
19
+ <div class="title">
20
+ <h1 class="title-text" data-i18n="didNotVerify">Did not verify</h1>
21
+ </div>
22
+
23
+ <p id="errorShortDesc" data-i18n="errorShortDesc">
24
+ WEBCAT could not verify that the code served by
25
+ <span id="error-host" data-i18n="thisSite">this site</span> matches
26
+ its signed manifest, so the page was blocked.
27
+ </p>
28
+
29
+ <div class="button-container">
30
+ <button
31
+ id="advancedButton"
32
+ aria-expanded="false"
33
+ data-i18n="advanced"
34
+ >
35
+ Advanced
36
+ </button>
37
+ <button id="returnButton" class="primary" data-i18n="goBack">
38
+ Go back
39
+ </button>
40
+ </div>
41
+
42
+ <div id="errorDebugInformation" hidden="">
43
+ <p id="whatCanYouDo" data-i18n="whatYouCanDo">
44
+ The problem is with the site, not your connection. The code or the
45
+ environment it served do not match what its developers
46
+ cryptographically signed, so WEBCAT blocked the page to keep you
47
+ safe. You can let the site owner know, or if you believe this is a
48
+ bug open an issue in the
49
+ <a
50
+ href="https://github.com/freedomofpress/webcat"
51
+ data-i18n="webcatRepository"
52
+ >WEBCAT repository</a
53
+ >.
54
+ </p>
55
+ <p
56
+ class="error-detail"
57
+ id="debug-file-line"
58
+ hidden=""
59
+ data-i18n="file"
60
+ >
61
+ File: <span id="debug-file"></span>
62
+ </p>
63
+ <p id="errorCode" data-i18n="errorCode">
64
+ Error code: <span id="debug-code"></span>
65
+ </p>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ </body>
70
+ </html>
package/pages/error.js ADDED
@@ -0,0 +1,51 @@
1
+ document.addEventListener("DOMContentLoaded", () => {
2
+ function localize(container) {
3
+ container.querySelectorAll("[data-i18n]").forEach((el) => {
4
+ const substitutions = Array.from(el.children).map(
5
+ (child) => child.outerHTML,
6
+ );
7
+ const msg = browser.i18n.getMessage(
8
+ "WEBCAT_" + el.getAttribute("data-i18n"),
9
+ substitutions,
10
+ );
11
+ if (msg === "") {
12
+ return;
13
+ }
14
+ el.innerHTML = msg;
15
+ localize(el);
16
+ });
17
+ }
18
+ localize(document);
19
+
20
+ const params = new URLSearchParams(location.hash.slice(1));
21
+ const code = params.get("code") || "UNKNOWN";
22
+ const host = params.get("host") || "";
23
+ const file = params.get("file") || "";
24
+
25
+ setText("error-host", host || browser.i18n.getMessage("WEBCAT_thisSite"));
26
+ setText("debug-code", code);
27
+
28
+ if (file) {
29
+ setText("debug-file", file);
30
+ document.getElementById("debug-file-line").hidden = false;
31
+ }
32
+
33
+ const advancedButton = document.getElementById("advancedButton");
34
+ const advancedPanel = document.getElementById("errorDebugInformation");
35
+ advancedButton.addEventListener("click", () => {
36
+ advancedPanel.hidden = !advancedPanel.hidden;
37
+ advancedButton.setAttribute("aria-expanded", String(!advancedPanel.hidden));
38
+ advancedButton.textContent = advancedPanel.hidden
39
+ ? browser.i18n.getMessage("WEBCAT_advanced")
40
+ : browser.i18n.getMessage("WEBCAT_hideAdvanced");
41
+ });
42
+
43
+ // The error page took a history slot
44
+ document
45
+ .getElementById("returnButton")
46
+ .addEventListener("click", () => history.back());
47
+ });
48
+
49
+ function setText(id, text) {
50
+ document.getElementById(id).textContent = text;
51
+ }
@@ -0,0 +1,16 @@
1
+ .warning {
2
+ margin: 2px;
3
+ white-space: preserve-breaks;
4
+ background: #f8d7da;
5
+ border-radius: 7px;
6
+ border: solid 1px #dc3545;
7
+ color: #721c24;
8
+ padding: 0.5em 0.8em;
9
+ }
10
+
11
+ .warning button {
12
+ float: right;
13
+ color: #721c24;
14
+ margin-left: 2em;
15
+ min-width: 0;
16
+ }
@@ -0,0 +1,14 @@
1
+ <!doctype html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta
6
+ http-equiv="Content-Security-Policy"
7
+ content="default-src chrome:; img-src chrome: 'self'; object-src 'none';"
8
+ />
9
+ <link rel="stylesheet" href="chrome://global/skin/in-content/common.css" />
10
+ <link rel="stylesheet" href="popup.css" />
11
+ <script src="popup.js"></script>
12
+ </head>
13
+ <body></body>
14
+ </html>
package/pages/popup.js ADDED
@@ -0,0 +1,48 @@
1
+ const renderers = {
2
+ permissions: {
3
+ message(missing) {
4
+ return browser.i18n.getMessage(
5
+ "WEBCAT_missingPermissions",
6
+ Array.from(missing).join("\n"),
7
+ );
8
+ },
9
+ button(missing) {
10
+ const b = document.createElement("button");
11
+ b.textContent = browser.i18n.getMessage("WEBCAT_fix");
12
+ b.addEventListener("click", () => {
13
+ const [permissions, origins] = [[], []];
14
+ for (const permission of missing) {
15
+ if (permission.includes("://") || permission === "<all_urls>") {
16
+ origins.push(permission);
17
+ } else {
18
+ permissions.push(permission);
19
+ }
20
+ }
21
+ try {
22
+ browser.permissions.request({ permissions, origins });
23
+ window.close();
24
+ } catch {
25
+ // TODO: browser.permissions.request may throw. Fall back to opening
26
+ // a documentation page with guidance on resolving the issue manually
27
+ }
28
+ });
29
+ return b;
30
+ },
31
+ },
32
+ };
33
+
34
+ document.addEventListener("DOMContentLoaded", () => {
35
+ const params = new URLSearchParams(location.hash.slice(1));
36
+ const warnings = JSON.parse(params.get("warnings") ?? "{}");
37
+ for (const id in warnings) {
38
+ const warning = document.createElement("div");
39
+ warning.id = `warning-${id}`;
40
+ warning.classList.add("warning");
41
+ warning.textContent = renderers[id].message(...warnings[id]);
42
+ if (renderers[id].button) {
43
+ const button = renderers[id].button(...warnings[id]);
44
+ warning.prepend(button);
45
+ }
46
+ document.body.prepend(warning);
47
+ }
48
+ });
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.