Some checks failed
check / check (push) Has been cancelled
A rejected password was reported three different ways depending on which screen you were on, including the fragment "Wrong password." which is not a sentence. All six decryptWithPassword call sites now show the same full sentence. Strings only -- a wrong password still fails closed on every screen and still resolves no pending approval. A test pins the invariant per call site: each decryptWithPassword call is walked out to its enclosing try and forward to that block's catch, and the prose shown there must equal the canonical sentence. Per-file matching was not enough, since a file with two call sites kept passing while one of them diverged.
117 lines
3.7 KiB
JavaScript
117 lines
3.7 KiB
JavaScript
const {
|
|
$,
|
|
showView,
|
|
showFlash,
|
|
goBack,
|
|
clearViewStack,
|
|
onViewLeave,
|
|
} = require("./helpers");
|
|
const { state, saveState } = require("../../shared/state");
|
|
const { decryptWithPassword } = require("../../shared/vault");
|
|
const {
|
|
removeWalletFromState,
|
|
broadcastActiveChanged,
|
|
} = require("../../shared/walletDelete");
|
|
|
|
let deleteWalletIndex = null;
|
|
let ctx = null;
|
|
|
|
// Drop the password from the DOM and the wallet selection from the
|
|
// closure. Registered as the view-leave handler as well as run on entry,
|
|
// so the typed password does not sit in the hidden view after the user
|
|
// navigates away by any route, including the Settings gear.
|
|
function clear() {
|
|
deleteWalletIndex = null;
|
|
$("delete-wallet-password").value = "";
|
|
$("delete-wallet-flash").textContent = "";
|
|
$("delete-wallet-flash").style.visibility = "hidden";
|
|
}
|
|
|
|
function show(walletIdx) {
|
|
clear();
|
|
deleteWalletIndex = walletIdx;
|
|
const wallet = state.wallets[walletIdx];
|
|
$("delete-wallet-name").textContent =
|
|
wallet.name || "Wallet " + (walletIdx + 1);
|
|
showView("delete-wallet-confirm");
|
|
}
|
|
|
|
function init(_ctx) {
|
|
ctx = _ctx;
|
|
|
|
onViewLeave("delete-wallet-confirm", clear);
|
|
|
|
// No wipe here: goBack() routes through showView(), which runs the
|
|
// leave hook.
|
|
$("btn-delete-wallet-back").addEventListener("click", () => {
|
|
goBack();
|
|
});
|
|
|
|
$("btn-delete-wallet-confirm").addEventListener("click", async () => {
|
|
const pw = $("delete-wallet-password").value;
|
|
if (!pw) {
|
|
$("delete-wallet-flash").textContent =
|
|
"Please enter your password.";
|
|
$("delete-wallet-flash").style.visibility = "visible";
|
|
return;
|
|
}
|
|
|
|
if (deleteWalletIndex === null) {
|
|
$("delete-wallet-flash").textContent =
|
|
"No wallet selected for deletion.";
|
|
$("delete-wallet-flash").style.visibility = "visible";
|
|
return;
|
|
}
|
|
|
|
const btn = $("btn-delete-wallet-confirm");
|
|
btn.disabled = true;
|
|
btn.classList.add("text-muted");
|
|
|
|
const walletIdx = deleteWalletIndex;
|
|
const wallet = state.wallets[walletIdx];
|
|
|
|
// Verify password against the wallet's encrypted data
|
|
try {
|
|
await decryptWithPassword(wallet.encryptedSecret, pw);
|
|
} catch (_e) {
|
|
$("delete-wallet-flash").textContent =
|
|
"That password is incorrect. Please try again.";
|
|
$("delete-wallet-flash").style.visibility = "visible";
|
|
btn.disabled = false;
|
|
btn.classList.remove("text-muted");
|
|
return;
|
|
}
|
|
|
|
// Remove the wallet and repair selection, permissions and hasWallet
|
|
const { activeAddressChanged } = removeWalletFromState(
|
|
state,
|
|
walletIdx,
|
|
);
|
|
|
|
deleteWalletIndex = null;
|
|
|
|
if (!state.hasWallet) {
|
|
clearViewStack();
|
|
await saveState();
|
|
// Save before broadcasting: the background reads the active
|
|
// address back out of storage to build accountsChanged.
|
|
if (activeAddressChanged) broadcastActiveChanged();
|
|
showView("welcome");
|
|
} else {
|
|
await saveState();
|
|
if (activeAddressChanged) broadcastActiveChanged();
|
|
// Reset stack to [main] so Settings back goes home.
|
|
// Use require() lazily to avoid circular dependency
|
|
// (settings.js requires deleteWallet.js).
|
|
clearViewStack();
|
|
state.viewStack.push("main");
|
|
ctx.renderWalletList();
|
|
const settings = require("./settings");
|
|
settings.show();
|
|
showFlash("Wallet deleted.");
|
|
}
|
|
});
|
|
}
|
|
|
|
module.exports = { init, show };
|