- 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.
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
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