feat(ext/settings): settings-security.ts three-state recovery QR + devices component
- Add settings-security.ts with renderSecuritySection / teardownSecuritySection - Three states: amber warning (no QR), green status (QR set up), modal overlay (show/print SVG) - Device list with inline revoke; passphrase collected via prompt() - QR payload never written to chrome.storage; only recovery_qr_generated_at timestamp stored - Add generate_recovery_qr / unwrap_recovery_qr message types to messages.ts + POPUP_ONLY_TYPES - Add SW handlers in popup-only.ts delegating to wasm_generate_recovery_qr / wasm_unwrap_recovery_qr - Declare wasm_generate_recovery_qr and wasm_unwrap_recovery_qr in wasm.d.ts Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -574,6 +574,26 @@ export async function handle(
|
||||
}
|
||||
}
|
||||
|
||||
case 'generate_recovery_qr': {
|
||||
const handle = session.getCurrent();
|
||||
if (!handle) return { ok: false, error: 'vault_locked' };
|
||||
try {
|
||||
const svg: string = state.wasm.wasm_generate_recovery_qr(handle, msg.passphrase);
|
||||
return { ok: true, data: { svg } };
|
||||
} catch (e) {
|
||||
return { ok: false, error: (e as Error).message };
|
||||
}
|
||||
}
|
||||
|
||||
case 'unwrap_recovery_qr': {
|
||||
try {
|
||||
const imageSecretBytes: Uint8Array = state.wasm.wasm_unwrap_recovery_qr(msg.payload_b64, msg.passphrase);
|
||||
return { ok: true, data: { image_secret: Array.from(imageSecretBytes) } };
|
||||
} catch (e) {
|
||||
return { ok: false, error: (e as Error).message };
|
||||
}
|
||||
}
|
||||
|
||||
case 'import_lastpass_commit': {
|
||||
const handle = session.getCurrent();
|
||||
if (!handle || !state.gitHost || !state.manifest) return { ok: false, error: 'vault_locked' };
|
||||
|
||||
Reference in New Issue
Block a user