release: produce a versioned per-browser artifact and pin the Chrome extension id (closes #310)
manifest/chrome.json now carries a fixed public key, so the extension id and the chrome.storage.local partition holding the wallet stay stable across checkout moves and re-clones instead of being derived from the absolute path. A release entrypoint produces a self-contained versioned artifact per browser, including the files that sit at dist/ root outside both browser directories. One version source of truth, enforced: the build fails naming the culprit when the two manifests and package.json disagree, and BUILD_COMMIT now marks a dirty tree as dirty. Firefox ships an unsigned XPI; the README states that release Firefox and ESR refuse it, that Developer Edition or Unbranded is required, and that Remove is irreversible except from the recovery phrase, which is asserted by test.
This commit was merged in pull request #347.
This commit is contained in:
34
TODO.md
34
TODO.md
@@ -84,6 +84,40 @@ but the review is broader than any of them.
|
||||
lists (`src/shared/transactions.js`) keep the unfloored rule, which is out of
|
||||
scope by the issue's definition of done. `README.md`'s Display Consistency
|
||||
section records the exception.
|
||||
- 2026-08-23: The extension can be installed once and kept
|
||||
([#310](https://git.eeqj.de/sneak/AutistMask/issues/310)). There was no
|
||||
packaging target anywhere, no artifact, and `manifest/chrome.json` carried no
|
||||
`key` — so an unpacked Chrome load derived its extension id, and therefore its
|
||||
`chrome.storage.local` partition, from the absolute checkout path: moving or
|
||||
re-cloning the checkout presented an empty wallet with no error. The manifest
|
||||
now carries a fixed `key` (public half only; the private half is a credential
|
||||
and is not in this repo, and no target generates one into the tree), pinning
|
||||
the id to `gipbhkogfopeahplcjhipkgpcimdpkip`. `make package` produces
|
||||
`release/autistmask-chrome-<version>.zip` and
|
||||
`release/autistmask-firefox-<version>.xpi` plus `SHA256SUMS`,
|
||||
deterministically and via `make build` so the archives can only be made from a
|
||||
`dist/` already verified against that build's receipt as a release build;
|
||||
every path the manifests and the popup HTML reference is resolved and required
|
||||
to be inside the archive, and the archive is read back off disk and compared
|
||||
member by member — `dist/styles.css` sits at the `dist/` root outside both
|
||||
browser directories and is reported as deliberately not shipped rather than
|
||||
dropped by a glob. One version: `script/lib/version.js` fails the build when
|
||||
`package.json` and the two manifests disagree, instead of reading from one of
|
||||
them. `BUILD_COMMIT` now carries `-dirty` when the working tree does not match
|
||||
`HEAD` (and `-unknown` when git cannot say), while the full hash behind the
|
||||
About screen's commit link stays clean so the link still resolves. Two real
|
||||
browser observations back it: `tests/e2e/storagePartition.js` loads the
|
||||
extension from two different paths in one Chrome profile with and without
|
||||
`key` and records what each does, and `tests/e2e/firefox/reinstall.js`
|
||||
installs the packaged XPI in a real Firefox, creates a wallet, restarts the
|
||||
browser on the same profile, adds the add-on again and decrypts the vault back
|
||||
to the original recovery phrase — and then observes that an explicit uninstall
|
||||
DESTROYS that storage, which is correct browser behaviour but means Remove is
|
||||
irreversible for a wallet, now stated in README.md. Deliberately not done: AMO
|
||||
signing, CRX packing, tagging and any upload — the Firefox artifact is
|
||||
UNSIGNED and README.md now states that release Firefox and ESR refuse it, that
|
||||
Developer Edition or an Unbranded build is required, and that a temporary
|
||||
add-on does not survive a browser restart.
|
||||
- 2026-08-20: A second extension page can no longer silently delete a wallet
|
||||
([#304](https://git.eeqj.de/sneak/AutistMask/issues/304)). `saveState()` wrote
|
||||
the entire state blob, and every extension page — the toolbar popup, a dApp
|
||||
|
||||
Reference in New Issue
Block a user