Skip to content

Narrow master-key keychain fallback + App Store config/manifest fixes#135

Merged
Considus merged 1 commit into
mainfrom
fix/keychain-narrowing-appstore-config
Jul 23, 2026
Merged

Narrow master-key keychain fallback + App Store config/manifest fixes#135
Considus merged 1 commit into
mainfrom
fix/keychain-narrowing-appstore-config

Conversation

@Considus

Copy link
Copy Markdown
Owner

Summary

Owner-approved follow-ups from the 2026-07-23 mid-point review:

  • Keychain: MasterKeyKeychain.upsertItem no longer deletes-then-adds on arbitrary update errors — only on errSecInteractionNotAllowed, mirroring the MnemonicKeychain narrowing (2026-07-01). Anything else now throws, so an unexpected keychain error during phrase-recovery re-keying can no longer leave the device with no master key.
  • Background sync unblocked: UIBackgroundModes: [fetch] — without the mode, BGTaskScheduler.submit failed with .unavailable and background sync never ran.
  • Upload hygiene: LSRequiresIPhoneOS: true; a per-bundle PrivacyInfo.xcprivacy for the widget extension (App-Group UserDefaults, 1C8F.1); app manifest reasons extended to 1C8F.1 (shared suite) and 3B52.1 (file dates in the user-picked sync folder).

Tests

  • Local simulator build of app + embedded widget: clean; verified the built appex bundles the manifest and the app Info.plist carries both new keys.
  • Keychain paths are device-only (Secure Enclave / access groups); CI compiles them, and the narrowed logic is line-for-line the pattern already proven in MnemonicKeychain.

🤖 Generated with Claude Code

- MasterKeyKeychain.upsertItem: delete-then-add now only fires on
  errSecInteractionNotAllowed (mirrors MnemonicKeychain's 2026-07-01
  narrowing); any other update failure throws instead of opening a
  master-key data-loss window on the recovery re-key path.
- UIBackgroundModes [fetch]: the permitted identifier alone was not enough —
  BGTaskScheduler.submit failed with .unavailable, so background sync never
  ran.
- LSRequiresIPhoneOS true (standard iOS-bundle marker this custom plist
  lacked).
- CatchlightWidgets gains its own PrivacyInfo.xcprivacy (App-Group
  UserDefaults via the shared capture intents, reason 1C8F.1) — missing
  per-bundle manifests raise ITMS-91053 at upload.
- App manifest: UserDefaults reasons now CA92.1 + 1C8F.1 (the App-Group
  suite is shared with the extension); FileTimestamp reasons now C617.1 +
  3B52.1 (modification dates read in the user-picked sync folder).

Verified in the built product: appex bundles the manifest; app Info.plist
carries both new keys.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Considus
Considus merged commit 8d0de52 into main Jul 23, 2026
4 checks passed
@Considus
Considus deleted the fix/keychain-narrowing-appstore-config branch July 23, 2026 18:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant