Skip to content

Release v1.0.4 — Full Disk Access UI fix#25

Merged
hanselstner merged 10 commits into
mainfrom
release/v1.0.4
May 16, 2026
Merged

Release v1.0.4 — Full Disk Access UI fix#25
hanselstner merged 10 commits into
mainfrom
release/v1.0.4

Conversation

@hanselstner
Copy link
Copy Markdown
Owner

Release v1.0.4 — Full Disk Access UI fix

Fixes the macOS Tahoe FDA-pane visibility issue where the app was registered in TCC.db but invisible in System Settings → Privacy & Security → Full Disk Access.

Fixed

  • Bundle Info.plist now declares the full standard set of NS*UsageDescription keys (Desktop, Documents, Downloads, RemovableVolumes, NetworkVolumes, SystemAdministration). Without these the FDA pane refuses to render an entry even when TCC.db is correctly populated.
  • Added an early TCC-attribution probe (open(2) against ~/Library/Safari/Bookmarks.plist + fallbacks) that runs in the bundle process before any subprocess. Guarantees the TCC record is staged against the bundle identity, not the parent terminal.

Build

  • Replaced naked-hdiutil DMG with proper drag-to-Applications installer using dmgbuild (App + /Applications symlink + builtin-arrow background).
  • Added dmgbuild as dev dependency.

Tests

  • 266 tests passing (3 new mocked tests for the FDA probe).

Notarization

  • Signed (Team 9MK4SNL8ZA), notarized (Submission 7602a587-e99c-4beb-89de-4bc82b49cf37, Accepted), stapled, spctl accepted. Hardened runtime intact.

Intent and others added 10 commits May 15, 2026 18:43
- pyproject.toml, icloudphotonator/__init__.py, ui/app.py: 1.0.2 → 1.0.3
- CHANGELOG.md: add [1.0.3] — 2026-05-15 entry consolidating
  Unreleased items (log-tail in FullDiskAccessDialog, RELEASE_ID
  auto-detect) plus the production-stability fixes (importer success
  accounting, subprocess killpg, volume watchdog + caffeinate, DMG/
  translocation detection, Photos.app warm-up 600s, PyInstaller
  --run-osxphotos dispatch, osxphotos>=0.75.6 pin).
- tests/test_basic.py, tests/test_cli.py: update pinned version strings.
- uv.lock: project version synced.

Tests: 263 passed.
Step 8 (cleanup) previously deleted the DMG unconditionally, even on
--skip-upload runs intended for local testing. Now skips cleanup when
SKIP_UPLOAD=1 so the signed DMG remains in dist/ for smoke-testing.
Spec was still on 1.0.2, causing built .app bundle Info.plist to
report the wrong CFBundleShortVersionString/CFBundleVersion. Other
1.0.3 bumps (pyproject.toml, __init__.py) landed in bf887ea but
the PyInstaller spec was missed.
- Add 6 NS*UsageDescription keys to Info.plist so System Settings →
  Privacy & Security → Full Disk Access can render an entry for the
  bundle on macOS Tahoe (matches FDA-visible reference apps).
- Add _early_fda_registration_probe() that performs an os.open(2) on
  TCC-protected paths (~/Library/Safari/Bookmarks.plist + fallbacks)
  before any subprocess or AppleEvent is launched. This stages the TCC
  record against com.hanselstner.icloudphotonator instead of any parent
  terminal during dev launches.
- Probe is gated to skip when sys.argv[0] == 'osxphotos' (defensive,
  since the argv-marker block at the top of __main__.py already calls
  sys.exit before reaching __main__).
- Add 3 mocked unit tests covering: permission-error skip, first-success
  short-circuit, all-paths-missing clean return.

Agent-Id: agent-fb906285-3d20-4d80-95de-941334ca805f
Bumps APP_VERSION (spec), project version (pyproject), and adds a
1.0.4 entry to CHANGELOG.md covering the FDA UI registration fix
(NS*UsageDescription keys + early TCC attribution probe).

Agent-Id: agent-fb906285-3d20-4d80-95de-941334ca805f
Agent-Id: agent-fb906285-3d20-4d80-95de-941334ca805f
Linked-Note-Id: 94cdaa1d-0275-4ba2-943d-d50abd230c0b
Replace hdiutil-only DMG creation with dmgbuild for a proper macOS
installer layout: Finder window shows the app icon on the left, an
Applications symlink on the right, and dmgbuild's builtin-arrow
background between them.

Changes:
- pyproject.toml + uv.lock: add dmgbuild>=1.6.7 as dev dependency
  (pulls in ds-store transitively).
- scripts/dmg_settings.py: dmgbuild settings file with icon_locations,
  window_rect, builtin-arrow background, /Applications symlink.
  Volume name is supplied via CLI arg (not hardcoded).
- scripts/build_release.sh Step 5: replace
  with . Signing/notarize/staple steps unchanged.

Verified for v1.0.4:
- Notarization Submission ID 7602a587-e99c-4beb-89de-4bc82b49cf37 Accepted
- xcrun stapler validate: worked
- spctl --assess: accepted (Notarized Developer ID)
- Mount shows iCloudPhotonator.app + Applications -> /Applications,
  .DS_Store (16388 B), .background.tiff (26264 B), .VolumeIcon.icns

Agent-Id: agent-779be147-a582-4586-8790-1580551f324f
Required by scripts/dmg_settings.py / scripts/build_release.sh Step 5.
uv add --dev dmgbuild → dmgbuild 1.6.7 (+ ds-store 1.3.2 transitively).

Agent-Id: agent-779be147-a582-4586-8790-1580551f324f
Agent-Id: agent-779be147-a582-4586-8790-1580551f324f
@hanselstner hanselstner merged commit d4b40d7 into main May 16, 2026
2 checks passed
@hanselstner hanselstner deleted the release/v1.0.4 branch May 16, 2026 11:55
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