7 Commits

Author SHA1 Message Date
9758e80a02 Add TOTP (2FA) support to entries
- New src/lib/crypto/totp.js: native RFC 6238 TOTP using Web Crypto HMAC-SHA1
  (no external crypto). base32Decode, extractSecret (bare base32 or otpauth://
  URI), generateTotp, totpRemainingSeconds.
- Entries gain an optional encryptedTotpSecret, stored AES-GCM-encrypted like
  passwords. schema.js createEntry/updateEntry/docs updated.
- Export/import re-key the TOTP secret alongside passwords when sealing with a
  separate password, and decrypt/re-encrypt on import so TOTP survives moves.
- EntryForm: optional 'TOTP Secret (2FA)' field (base32 or otpauth:// URI).
- EntryDetail: live 6-digit TOTP display updating every second with a countdown
  and urgency indicator, plus copy; guarded cleanup timer on unmount.
- Tests: RFC 6238 SHA-1 vectors (6 & 8 digit), base32/extractSecret, remaining
  seconds, schema round-trip. 157 total pass.
2026-08-27 01:11:48 +00:00
b8e7ce75f7 Make passwords optional for entries
- validateEntry no longer requires encryptedPassword; only title is required
  (schema.js). encryptedPassword documented as optional.
- EntryForm: decrypt-guards empty password on edit; stores empty string (no
  encryption) when the password field is blank; label is 'Password' (no *).
- EntryDetail: only renders the Password field when the entry has one;
  decrypt guards empty.
- Tests: schema validation updated (password optional); 143 total pass.
2026-08-27 01:07:18 +00:00
fb8df00e91 Add tests and trim down inconsistencies in the code. 2026-05-17 22:08:36 +00:00
46c49655a7 Add "Trash" 2026-05-16 23:21:53 +00:00
7a930228fc Make username optional. Sometimes we just want to store passwords 2026-05-15 21:19:55 +00:00
87aed17092 Minor things that Gemma found with Qwen's code 2026-05-15 03:34:22 +00:00
742ba505c6 First pass 2026-05-11 22:32:05 +00:00