fix(core): transport-aware launch paths + writable-folder check (adversarial review)
BLOCKER fix, Core half: adds TransportSettings.resolvedAppSupportPaths(), the transport-aware equivalent of the AirDrop-only FolderSettings.resolvedAppSupportPaths() — launch code must use this one so the ReturnWatcher it feeds is never seeded with a stale AirDrop folder while OneDrive is the persisted transport. Both now share a single AppSupportPaths.standardRoot() helper for the ~/Library/Application Support/Shotdeck root, instead of computing it three separate times. MAJOR fix, Core half: adds OneDriveLocator.isWritableDirectory(at:) — exists + isDirectory is not enough; an existing-but-unwritable folder (permissions revoked) must be treated as unavailable, not silently attempted and surfaced as a generic PDF-composition failure. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012ZiTXPbPCSjzPVsfoweAbp
This commit is contained in:
@@ -70,15 +70,7 @@ public enum FolderSettings {
|
||||
defaults: UserDefaults = .standard,
|
||||
fileManager: FileManager = .default
|
||||
) throws -> AppSupportPaths {
|
||||
let resolvedRoot: URL
|
||||
if let root {
|
||||
resolvedRoot = root
|
||||
} else {
|
||||
let appSupportParent = try fileManager.url(
|
||||
for: .applicationSupportDirectory, in: .userDomainMask,
|
||||
appropriateFor: nil, create: true)
|
||||
resolvedRoot = appSupportParent.appendingPathComponent("Shotdeck", isDirectory: true)
|
||||
}
|
||||
let resolvedRoot = try root ?? AppSupportPaths.standardRoot(fileManager: fileManager)
|
||||
let folders = resolve(defaults: defaults, fileManager: fileManager)
|
||||
return try AppSupportPaths(root: resolvedRoot, outbox: folders.outbox, watchFolder: folders.watch)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user