Compare commits
base: sneak:next
sneak:main
sneak:next
sneak:chore/token-list-enrichment
sneak:feat/issue-131-transaction-view-layout
sneak:fix/116-timestamps-include-timezone
sneak:feature/expanded-warnings
sneak:fix/cross-wallet-duplicate-detection
sneak:feature/copy-flash-feedback
sneak:feature/issue-82-new-address-warning
sneak:feature/82-warn-new-address
sneak:issue-99-block-number-external-link
sneak:issue-99-block-number-styling
sneak:feature/82-zero-history-warning
sneak:fix/issue-99-block-number-link-copy
sneak:fix/99-block-number-clickable
sneak:fix/87-consistent-error-display-v2
sneak:fix/87-consistent-error-display
sneak:fix/consistent-error-display
sneak:fix/77-confirm-tx-persist
sneak:fix/issue-72-address-token-tx-history
sneak:fix/70-confirm-tx-contract-display
sneak:fix/issue-58-receive-address-consistency
sneak:fix/59-transaction-view-ui-policies
sneak:fix/55-swap-show-own-address
sneak:feature/show-private-key
sneak:feat/message-signing
..
compare: sneak:e587e58cb26cceb292ec369ccec1be72cc4cb5be
sneak:next
sneak:main
sneak:chore/token-list-enrichment
sneak:feat/issue-131-transaction-view-layout
sneak:fix/116-timestamps-include-timezone
sneak:feature/expanded-warnings
sneak:fix/cross-wallet-duplicate-detection
sneak:feature/copy-flash-feedback
sneak:feature/issue-82-new-address-warning
sneak:feature/82-warn-new-address
sneak:issue-99-block-number-external-link
sneak:issue-99-block-number-styling
sneak:feature/82-zero-history-warning
sneak:fix/issue-99-block-number-link-copy
sneak:fix/99-block-number-clickable
sneak:fix/87-consistent-error-display-v2
sneak:fix/87-consistent-error-display
sneak:fix/consistent-error-display
sneak:fix/77-confirm-tx-persist
sneak:fix/issue-72-address-token-tx-history
sneak:fix/70-confirm-tx-contract-display
sneak:fix/issue-58-receive-address-consistency
sneak:fix/59-transaction-view-ui-policies
sneak:fix/55-swap-show-own-address
sneak:feature/show-private-key
sneak:feat/message-signing
1 Commits
next
...
e587e58cb2
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
| e587e58cb2 |
feat: vendor and censor the phishing blocklist at build time (closes #219)
The blocklist URL in shipped code named a competitor and pointed at a moving ref, and the extension re-fetched from it every 24 hours, which also meant a third party decided what this wallet warns about. All of that is gone. script/vendor-blocklist fetches upstream at a pinned commit, verifies the sha256 of the bytes that commit serves, and writes src/shared/phishingBlocklist.json. It is build-time tooling, never shipped, and the one place in the repo that names the upstream project; a source reference nobody can verify is not a source reference. The artifact stores truncated sha256 digests rather than domain names. That is what censors it: the previous file contained the competitor's name 6,475 times, as phishing domains impersonating them, and not one of those domains is dropped. It also makes lookups a binary search over a fixed-width string, so nothing is built at module load — which matters on MV3, where the worker re-evaluates the module on every wake — and takes the file from 8.7 MB to 1.7 MB. script/check-censored enforces the rest: it reads the name out of the vendoring script rather than repeating it, and fails on any occurrence in the working tree or under dist/ that is not one of the three literals shipped code cannot avoid — two provider-shim identifiers in src/content/inpage.js and one ERC-20's on-chain name in src/shared/tokenList.js. Each is permitted only at the path that carries it, and at the emitted paths that path is bundled into, so a literal appearing anywhere else fails like any other occurrence. It runs in make check, which inspects dist/ when there is one and says loudly when there is not, and again with --require-dist at the end of every make build. Removing the runtime fetch retires the delta, the extension-storage persistence and the 24-hour alarm from #158. A retired alarm is now cleared rather than left waking the worker forever on installs that already have it. The e2e suite drives the warning end to end from a real blocklisted origin served as a real http(s) site, with a control asserting the banner stays hidden for one that is not listed. Its service-worker interception canary needed a new anchor, since the startup fetch it used to watch for no longer happens: it now wakes the worker with a message and asks it for one throwaway fetch. LICENSE no longer cites a repository that returns 404. eslint.config.js gains one block: script/lib/ holds node programs the shell entrypoints call, and without it they lint with no globals at all. |