harden: key remembered site permissions by full origin (closes #402)
allowedSites and deniedSites held the bare hostname, so a grant to https://dapp.example also authorised http://dapp.example and every port on that host, and the connection, transaction and signature prompts named only the hostname. Both lists now store and match the full origin (scheme://host[:port]), the key the connections approved without Remember already used. The prompts, the Settings site lists and AUTISTMASK_REMOVE_SITE use the origin too. Entries saved by hostname are not migrated (pre-1.0): they match no site. Model: opus-5-5
This commit was merged in pull request #431.
This commit is contained in:
@@ -140,8 +140,14 @@ function load() {
|
||||
state.selectedWallet = 0;
|
||||
state.selectedAddress = 0;
|
||||
state.activeAddress = A0;
|
||||
state.allowedSites = { [A0]: ["a.example"], [B0]: ["b.example"] };
|
||||
state.deniedSites = { [B0]: ["c.example"], [C0]: ["d.example"] };
|
||||
state.allowedSites = {
|
||||
[A0]: ["https://a.example"],
|
||||
[B0]: ["https://b.example"],
|
||||
};
|
||||
state.deniedSites = {
|
||||
[B0]: ["https://c.example"],
|
||||
[C0]: ["https://d.example"],
|
||||
};
|
||||
state.viewStack = ["main", "settings"];
|
||||
state.currentView = "settings";
|
||||
|
||||
@@ -388,8 +394,8 @@ describe("deleting without the password", () => {
|
||||
await click("btn-delete-wallet-lost-confirm");
|
||||
|
||||
const saved = (await storage.get("autistmask")).autistmask;
|
||||
expect(saved.allowedSites).toEqual({ [A0]: ["a.example"] });
|
||||
expect(saved.deniedSites).toEqual({ [C0]: ["d.example"] });
|
||||
expect(saved.allowedSites).toEqual({ [A0]: ["https://a.example"] });
|
||||
expect(saved.deniedSites).toEqual({ [C0]: ["https://d.example"] });
|
||||
});
|
||||
|
||||
// The route shares finishDelete() with the password route, so the
|
||||
@@ -437,7 +443,7 @@ describe("deleting without the password", () => {
|
||||
test("deleting the last wallet lands on Welcome with nothing left", async () => {
|
||||
const { deleteWallet, state, storage } = load();
|
||||
state.wallets = [wallet("Wallet 1", "secret-one", [A0])];
|
||||
state.allowedSites = { [A0]: ["a.example"] };
|
||||
state.allowedSites = { [A0]: ["https://a.example"] };
|
||||
state.deniedSites = {};
|
||||
|
||||
await openLostPassword(deleteWallet, 0);
|
||||
|
||||
Reference in New Issue
Block a user