Commit Graph
16 Commits
Author SHA1 Message Date
kriss a8d612f745 fix: resolve real-device blockers for vault open, biometrics, and AutoFill
- FileBookmarkService: hold a security scope while creating the bookmark,
  fixing "file doesn't exist" on iCloud Drive-backed vaults (NSCocoaErrorDomain
  Code=4), which only surfaced on a real device since the Simulator strips
  entitlements needed to reproduce this.
- Fix Keychain access group missing the Team ID prefix, which silently broke
  saving the master password so Face ID was never offered after backgrounding.
- Add the autofill-credential-provider entitlement to the main app target
  (previously only on the extension) and declare ProvidesPasswords in the
  extension's Info.plist, so MyPass now registers as a selectable AutoFill
  Passwords provider.
- CredentialMatcher: fall back to a scheme-prefixed re-parse when extracting a
  host, since KDBX entries commonly store bare domains (e.g. "allocine.fr")
  that URL(string:).host can't parse without an authority component. Fixes
  AutoFill suggestions being unranked/wrong for such entries.
2026-09-20 12:39:45 +02:00
krissandClaude Haiku 4.5 62835dcd38 feat: add GroupSelection subtree select/deselect logic
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 16:57:49 +02:00
krissandClaude Haiku 4.5 5ca42a4e2a feat: add flattenEntries/flattenGroups tree-flattening helpers
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 16:55:41 +02:00
krissandClaude Haiku 4.5 dc287cff3d feat: add KeePassIconMapper (iconIndex -> SF Symbol)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 16:53:49 +02:00
krissandClaude Sonnet 5 ee350c4c02 feat: add password reveal toggle, friendlier KDBX4 wrong-password message
Adds an eye-icon toggle to the master password field (UnlockView) so
users can verify what they typed before submitting.

Also maps KDBX4's ERROR_HEADER_HASH_VERIFICATION_FAILED -- surfaced
via the header HMAC check, which is password-derived -- to
KDBXError.invalidPassword alongside the existing
passwordAndOrKeyfileWrong check. KeePassKit uses this same error code
for both a wrong password/keyfile and genuine file corruption (it
doesn't distinguish the two), so the message hedges: "Incorrect
password, or this vault file is corrupted." Found while testing
against a real KDBX4 vault, which was surfacing this as a raw,
unreadable NSError string before the previous commit's LocalizedError
fix, and as *no* friendly message at all before this one (the error
code wasn't in the recognized set yet).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 16:17:17 +02:00
krissandClaude Sonnet 5 82cc800415 fix: don't attempt unlock with an empty password on first file pick
UnlockViewModel.openFile(url:) called unlockWithPassword() immediately
after saving the bookmark, but the first-open UI (openFileSection) has
no password field yet -- password is still "" at that point, so every
first file pick failed before the user could type anything. Picking a
file now only saves the bookmark; the view naturally switches to the
password-entry state for the user to unlock explicitly.

Also makes KDBXError conform to LocalizedError with readable messages
per case, so any error path that reaches the generic catch clause
shows something useful instead of the default
"The operation couldn't be completed (MyPassCore.KDBXError error N)".

Found while testing the Phase 4 UI against a real KDBX file in the
simulator.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 16:14:10 +02:00
krissandClaude Sonnet 5 a97c3c6f53 fix: get MyPassCore/KeePassKit building via SwiftPM
The KeePassKit package never actually compiled: its Package.swift
didn't declare KissXML, the nested Argon2 submodule, or the in-tree
ChaCha20/TwoFish ciphers as dependencies, and its umbrella header's
framework-style <KeePassKit/...> imports don't resolve under SwiftPM's
non-framework header layout. Vendors KissXML locally (same issue as
KeePassKit) and fixes the resulting Swift-side API mismatches in
KDBXMapper/KDBXDocument (NSUUID bridges to UUID automatically,
KPKKey is abstract so KPKPasswordKey must be used directly, and a
few KeePassKit selectors were renamed by Swift's importer). Also
untracks MyPassCore/.build, which had been accidentally committed.

`swift test` now builds and passes all 18 tests.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WYqycDFsynHH9VnnK7LNSf
2026-09-19 15:33:36 +02:00
kriss 838e078304 feat: add VaultSession (vault lifecycle and entry CRUD) 2026-05-22 14:56:53 +02:00
kriss 33b670510c feat: add CredentialMatcher for AutoFill URL matching 2026-05-22 14:50:36 +02:00
kriss 7e62c954c4 feat: add KeychainStore 2026-05-22 14:49:38 +02:00
kriss 3af6c9ad31 feat: add TOTPGenerator (RFC 6238) 2026-05-22 14:44:50 +02:00
kriss 3b71a92089 fix: correct encrypt method name, remove tags, preserve UUIDs in KDBXMapper 2026-05-22 14:29:24 +02:00
kriss a7d9c65dfb fix: add reserved keys filter and TOTP reverse mapping in KDBXMapper 2026-05-22 14:22:21 +02:00
krissandClaude Sonnet 4.6 9bb506c5e0 feat: add KDBXDocument with KeePassKit-backed KDBX parsing
Implements KDBXError, KDBXMapper, and KDBXDocument for reading and writing KDBX files using KeePassKit.
Adds KDBXDocumentTests with fixture from KeePassKit's own test suite (Test_Password_1234.kdbx, password "1234").
Fixes KeePassKit Package.swift to include defaultLocalization for SPM compatibility.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 14:11:14 +02:00
kriss 45d7441636 feat: add core KDBX data models 2026-05-22 14:03:13 +02:00
kriss 12908df31a feat: add ProtectedString with XOR obfuscation 2026-05-22 14:01:14 +02:00