bug#81526: 30.2; Emacs.app lacks class-based TCC usage-description keys, crashing subprocesses that touch privacy-gated frameworks
Boris <[email protected]> Sat, 01 Aug 2026 05:50:29 +0000
| Newsgroups | gmane.emacs.bugs |
|---|---|
| Message-ID | <T1YIyzC6xQfJVMa5NXyg8UVuF3f4gNLTRTLexiQWZoXRWZZr0I4DWpEeJIKIRXgatvMFvmsiBQEqA1XgmuykS99tWxXcY1NiNzHAd9lTY3Y=@d12frosted.io> |
Thanks for the CC. I am quite interested in solving this. Mark, thanks for the detailed report; the analysis is right, and I support adding these keys. Some background from emacs-plus: I have been injecting a subset of exactly these keys into Emacs.app there for years (camera since late 2022, microphone and speech recognition since 2024), for the reason described in this report: TCC attributes the privacy check to the responsible process, and for anything started from a shell inside Emacs that is Emacs.app. This caused no problems in practice. And declaring a key grants nothing by itself, it only turns SIGABRT into a normal allow/deny prompt. I attached a patch against master (with a NEWS entry). A few notes on how it differs from the proposed list: - AFAIK Not all services behave the same when the key is missing. Photos, camera, microphone, contacts, calendars, reminders, Bluetooth, and speech recognition are hard crashers: TCC kills the process. Location and local network are not: without a key the location request is silently ignored, and the local network prompt (macOS 15+) shows generic text. The patch declares them anyway so the prompt appears with a sensible message, but the crash argument only applies to the first group. - On macOS 14 and later EventKit consults new keys: NSCalendarsFullAccessUsageDescription, NSCalendarsWriteOnlyAccessUsageDescription, and NSRemindersFullAccessUsageDescription. The plain calendars and reminders keys still matter on macOS 13 and earlier, so the patch declares both generations. The write-only calendars key was not in the original list, but a process requesting write-only access crashes the same way, so I added it. - I left out NSSystemAdministrationUsageDescription. It is obscure and I am not aware of a crash path that consults it. Easy to add later if someone shows one. - Wording: for the new keys I used "An application in Emacs requires permission to ..." instead of "Emacs, or a program started from within Emacs, ...". Nothing in Emacs itself touches these frameworks, so the prompt is practically always about a subprocess or a third-party package; this is also the approach iTerm2 takes. For services Emacs itself can trigger, the "Emacs requires ..." voice makes more sense, and that is what the existing keys (folders, AppleEvents, speech recognition) already use, so I did not touch them. - Small branch note: emacs-31 already carries NSSpeechRecognitionUsageDescription, so the "emacs-30 only" remark about that key concerns a branch that is unlikely to get it at this point. Whether this patch should go to emacs-31 or just master is up to the maintainers. Cheers, [email protected] On Friday, 31 July 2026 at 20:55, Stéphane Marks <[email protected]> wrote: > On Fri, Jul 31, 2026 at 1:51 PM Mark Diekhans <[email protected]> wrote: > >> bug report developed with assistance of AI, suggest change tested by a human being >> ## Summary >> >> `nextstep/templates/Info.plist.in` declares usage-description keys for *file-access* TCC services >> (Desktop, Documents, Downloads, Removable Volumes) and for Apple Events, but none for the >> *class-based* services — Photos, Camera, Microphone, Contacts, Calendars, Reminders, Location, >> Speech Recognition, Bluetooth. >> >> Any command-line program spawned from a shell hosted inside Emacs (`M-x shell`, `M-x eshell`, >> `vterm`, `ansi-term`, `M-x compile`, org-babel, …) that touches one of those frameworks is killed >> with `SIGABRT` instead of getting the normal system permission dialog — even when the subprocess's >> own bundle correctly declares the usage description. macOS's TCC subsystem attributes the privacy >> check to the *responsible process* up the parent chain, which for anything launched from an >> Emacs-hosted shell is Emacs.app itself. >> >> This was discovered while running `osxphotos`/PyObjC scripts from a shell inside Emacs, but it is >> not Python-specific: it reproduces with a bundle-less C program that only touches >> `Photos.framework`. >> >> ## Environment >> >> - macOS 26.5.2 (build 25F84), Mac16,11 (Apple M4 Pro) >> - GNU Emacs 30.2 (build 2, aarch64-apple-darwin25.5.0, NS appkit-2685.60 Version 26.5.1) >> - Installed via MacPorts, port `emacs-app @30.2_14+nativecomp+rsvg+treesitter` >> - Bundle identifier `org.gnu.Emacs`; signature `adhoc`, `TeamIdentifier=not set` >> >> ## What Emacs.app declares today >> >> ``` >> $ plutil -p /Applications/MacPorts/Emacs.app/Contents/Info.plist | grep UsageDescription >> "NSAppleEventsUsageDescription" => "Emacs requires permission to send AppleEvents to other applications." >> "NSDesktopFolderUsageDescription" => "Emacs requires permission to access the Desktop folder." >> "NSDocumentsFolderUsageDescription" => "Emacs requires permission to access the Documents folder." >> "NSDownloadsFolderUsageDescription" => "Emacs requires permission to access the Downloads folder." >> "NSRemovableVolumesUsageDescription" => "Emacs requires permission to access files on Removable Volumes." >> ``` >> >> So the *class* of key is already accepted upstream — the class-based services are simply absent. >> >> ## Minimal test case (isolates this from Python entirely) >> >> `photo_probe.m` — bundle-less, no `Info.plist` of its own, so its own identity plays no role: >> >> ```objc >> // Build: clang -framework Photos -framework Foundation -o photo_probe photo_probe.m >> #import <Foundation/Foundation.h> >> #import <Photos/Photos.h> >> >> int main(int argc, const char *argv[]) { >> @autoreleasepool { >> NSLog(@"[photo_probe] pid=%d requesting Photos authorization...", getpid()); >> dispatch_semaphore_t sema = dispatch_semaphore_create(0); >> [PHPhotoLibrary requestAuthorizationForAccessLevel:PHAccessLevelReadWrite >> handler:^(PHAuthorizationStatus status) { >> NSLog(@"[photo_probe] authorization status: %ld", (long)status); >> dispatch_semaphore_signal(sema); >> }]; >> dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, 15 * NSEC_PER_SEC)); >> } >> return 0; >> } >> ``` >> >> ## Steps to reproduce >> >> 1. `clang -framework Photos -framework Foundation -o photo_probe photo_probe.m` >> 2. From inside Emacs (`M-x shell`, `M-x eshell`, `vterm`, …) run `./photo_probe`. >> 3. From Terminal.app or iTerm2 directly — *not* nested inside Emacs — run the same `./photo_probe`. >> >> ## Expected behavior >> >> In both cases macOS shows the system permission dialog, and the process prints the resulting >> `PHAuthorizationStatus` and exits 0. >> >> ## Actual behavior >> >> From a shell inside Emacs the process aborts immediately. Verified process ancestry >> (`bash` → `claude` → `Emacs`) and the resulting crash report: >> >> ``` >> procName => photo_probe >> parentProc => bash >> responsibleProc => Emacs >> coalitionName => org.gnu.Emacs >> exception => EXC_CRASH / SIGABRT (shell reports exit 134) >> termination => namespace TCC, code 0: >> "This app has crashed because it attempted to access privacy-sensitive data >> without a usage description. The app's Info.plist must contain an >> NSPhotoLibraryUsageDescription key with a string value explaining to the >> user how the app uses this data." >> ``` >> >> Note `responsibleProc => Emacs`: TCC has attributed the request to Emacs.app, not to >> `photo_probe`, which is why the probe's own (absent) bundle identity is irrelevant. >> >> From iTerm2 directly it behaves as expected. >> >> ## Root cause, and why the Terminal.app comparison is not the relevant one >> >> It is tempting to say "Terminal.app declares these keys and Emacs should too", but that is factually >> wrong — Terminal.app declares **zero** usage descriptions: >> >> ``` >> $ plutil -p /System/Applications/Utilities/Terminal.app/Contents/Info.plist | grep -c UsageDescription >> 0 >> ``` >> >> Terminal.app instead carries an Apple-**private** entitlement: >> >> ``` >> $ codesign -d --entitlements - /System/Applications/Utilities/Terminal.app >> com.apple.private.tcc.allow-prompting => [kTCCServiceAll] >> ``` >> >> That entitlement is not available to third-party applications, so it is not an option for Emacs. >> >> The relevant precedent is a third-party terminal emulator that faced exactly this problem and solved >> it the only way available — by declaring the keys. iTerm2 3.6.8 declares 14 of them, with wording >> that explicitly attributes the request to a child process: >> >> ``` >> $ plutil -p /Applications/iTerm.app/Contents/Info.plist | grep UsageDescription >> "NSAppleEventsUsageDescription" => "An application in iTerm2 wants to use AppleScript." >> "NSBluetoothAlwaysUsageDescription" => "An application in iTerm2 wants to use Bluetooth." >> "NSCalendarsUsageDescription" => "An application in iTerm2 wants to use Calendar data." >> "NSCameraUsageDescription" => "An application in iTerm2 wants to use the camera." >> "NSContactsUsageDescription" => "An application in iTerm2 wants to use your contacts." >> "NSLocalNetworkUsageDescription" => "An application in iTerm2 wants to access the local network." >> "NSMicrophoneUsageDescription" => "An application in iTerm2 wants to use your microphone." >> "NSPhotoLibraryUsageDescription" => "An application in iTerm2 wants to use the photo library." >> "NSRemindersUsageDescription" => "An application in iTerm2 wants to use your reminders." >> ... >> ``` >> >> Emacs is routinely used the same way — as a host for interactive shells, `M-x compile`, and >> org-babel code execution — so it hits the same class of problem, currently without the mitigation. >> >> ## Suggested fix >> >> Add the missing class-based usage-description keys to `nextstep/templates/Info.plist.in`, alongside >> the file-access keys already there. `NSAppleEventsUsageDescription` and the `*Folder*` / >> `*RemovableVolumes*` keys are already present and must not be duplicated; on master >> `NSSpeechRecognitionUsageDescription` is present too. Minimum useful set to add: >> >> - `NSPhotoLibraryUsageDescription`, `NSPhotoLibraryAddUsageDescription` >> - `NSCameraUsageDescription` >> - `NSMicrophoneUsageDescription` >> - `NSContactsUsageDescription` >> - `NSCalendarsUsageDescription`, `NSCalendarsFullAccessUsageDescription` >> - `NSRemindersUsageDescription`, `NSRemindersFullAccessUsageDescription` >> - `NSLocationUsageDescription`, `NSLocationWhenInUseUsageDescription` >> - `NSLocalNetworkUsageDescription` >> - `NSBluetoothAlwaysUsageDescription` >> - `NSSystemAdministrationUsageDescription` >> - `NSSpeechRecognitionUsageDescription` — **on the emacs-30 branch only**; master already has it >> >> That master already added `NSSpeechRecognitionUsageDescription` to this same template suggests the >> general approach is already considered acceptable upstream; this report just asks for the rest of the >> class-based services to be covered too. >> >> The `*FullAccess*` variants are the macOS 14+ replacements for the older Calendars/Reminders keys; >> declaring both keeps older systems working. >> >> Suggested wording, matching the voice already used in the file while making the child-process case >> explicit: >> >>> Emacs, or a program started from within Emacs, requires permission to access your photo library. >> >> Declaring a usage description does **not** grant access — it only allows macOS to *prompt* instead of >> aborting the process. Users who deny the prompt get a normal denial, and the subprocess sees a >> "denied" status rather than `SIGABRT`. >> >> ## Caveat worth noting >> >> For an ad-hoc signed Emacs.app (`Signature=adhoc`, as MacPorts produces), the bundle's cdhash changes >> on every rebuild, so TCC grants may not persist across upgrades and the user may be prompted again. >> That is a separate, pre-existing issue; it does not affect this fix, which only prevents the hard >> crash. >> >> In GNU Emacs 30.2 (build 2, aarch64-apple-darwin25.5.0, NS >> appkit-2685.60 Version 26.5.1 (Build 25F80)) of 2026-06-30 >> built on tahoea.local >> Windowing system distributor 'Apple', version 10.3.2685 >> System Description: macOS 26.5.2 >> >> Configured using: >> 'configure --prefix=/opt/local --disable-silent-rules >> --without-dbus --without-gconf --without-libotf >> --without-m17n-flt --with-libgmp --with-gnutls --with-xml2 >> --with-modules --with-sqlite3 --with-webp >> --with-native-compilation=aot --infodir >> /opt/local/share/info/emacs --disable-gc-mark-trace --with-ns >> --with-lcms2 --without-harfbuzz --without-imagemagick >> --without-xaw3d --with-rsvg --with-tree-sitter 'CFLAGS=-pipe >> -Os -Dts_language_version=ts_language_abi_version >> -Wno-attributes >> -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX26.sdk >> -arch arm64' 'CPPFLAGS=-isystem/opt/local/include >> -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX26.sdk' >> 'LDFLAGS=-L/opt/local/lib -Wl,-headerpad_max_install_names >> -Wl,-no_pie -Wl,-rpath /opt/local/lib/gcc15 -Wl,-rpath >> /opt/local/lib >> -Wl,-syslibroot,/Library/Developer/CommandLineTools/SDKs/MacOSX26.sdk >> -arch arm64'' >> >> Configured features: >> ACL GIF GLIB GMP GNUTLS JPEG LCMS2 LIBXML2 MODULES NATIVE_COMP >> NOTIFY KQUEUE NS PDUMPER PNG RSVG SQLITE3 THREADS TIFF >> TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM ZLIB >> >> Important settings: >> value of $LC_COLLATE: C >> value of $LC_CTYPE: en_US.UTF-8 >> value of $LC_MESSAGES: en_US.UTF-8 >> value of $LC_MONETARY: en_US.UTF-8 >> value of $LC_NUMERIC: C >> value of $LC_TIME: en_US.UTF-8 >> value of $LANG: en_US.UTF-8 >> locale-coding-system: utf-8-unix >> >> Major mode: Ghostel >> >> Minor modes in effect: >> global-git-commit-mode: t >> magit-auto-revert-mode: t >> server-mode: t >> TeX-PDF-mode: t >> override-global-mode: t >> delete-selection-mode: t >> display-time-mode: t >> desktop-save-mode: t >> cua-mode: t >> gcmh-mode: t >> url-handler-mode: t >> tooltip-mode: t >> global-eldoc-mode: t >> eldoc-mode: t >> show-paren-mode: t >> electric-indent-mode: t >> mouse-wheel-mode: t >> menu-bar-mode: t >> file-name-shadow-mode: t >> global-font-lock-mode: t >> minibuffer-regexp-mode: t >> line-number-mode: t >> transient-mark-mode: t >> auto-composition-mode: t >> auto-encryption-mode: t >> auto-compression-mode: t >> abbrev-mode: t >> >> Load-path shadows: >> /opt/local/share/emacs/site-lisp/site-start hides /Applications/MacPorts/Emacs.app/Contents/Resources/site-lisp/site-start >> /Users/markd/.emacs.d/elpa/transient-20260725.1105/transient hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/transient >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-exp hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-exp >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-emacs-lisp hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-emacs-lisp >> /Users/markd/.emacs.d/elpa/org-9.8.8/oc hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-css hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-css >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-lob hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-lob >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-irc hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-irc >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-forth hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-forth >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-macs hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-macs >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-version hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-version >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-scheme hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-scheme >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-C hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-C >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-capture hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-capture >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-ref hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-ref >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-clojure hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-clojure >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-mouse hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-mouse >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-persist hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-persist >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-ctags hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-ctags >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-entities hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-entities >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-archive hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-archive >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-screen hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-screen >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-bibtex hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-bibtex >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-haskell hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-haskell >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-loaddefs hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-loaddefs >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-table hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-table >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-eww hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-eww >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-man hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-man >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-org hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-org >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-num hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-num >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-plot hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-plot >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-rmail hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-rmail >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-awk hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-awk >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-groovy hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-groovy >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-octave hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-octave >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-faces hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-faces >> /Users/markd/.emacs.d/elpa/org-9.8.8/oc-biblatex hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-biblatex >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-colview hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-colview >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-R hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-R >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-refile hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-refile >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-timer hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-timer >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-mobile hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-mobile >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-fortran hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-fortran >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-shell hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-shell >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-perl hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-perl >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-sqlite hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-sqlite >> /Users/markd/.emacs.d/elpa/org-9.8.8/oc-basic hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-basic >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-sed hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-sed >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-list hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-list >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-ruby hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-ruby >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-eval hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-eval >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-habit hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-habit >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-clock hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-clock >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-goto hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-goto >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-html hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-html >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-src hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-src >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-lisp hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-lisp >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-eshell hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-eshell >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-ditaa hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-ditaa >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-pcomplete hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-pcomplete >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-lint hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-lint >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-latex hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-latex >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-sass hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-sass >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-tangle hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-tangle >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-calc hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-calc >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-java hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-java >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-icalendar hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-icalendar >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-mhe hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-mhe >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-attach-git hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-attach-git >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-md hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-md >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-beamer hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-beamer >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-element hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-element >> /Users/markd/.emacs.d/elpa/org-9.8.8/oc-natbib hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-natbib >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-protocol hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-protocol >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-gnuplot hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-gnuplot >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-tempo hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-tempo >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-latex hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-latex >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-w3m hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-w3m >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-id hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-id >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-man hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-man >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-doi hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-doi >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-feed hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-feed >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-fold-core hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-fold-core >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-julia hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-julia >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-lua hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-lua >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-table hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-table >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-ocaml hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-ocaml >> /Users/markd/.emacs.d/elpa/org-9.8.8/oc-csl hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-csl >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-gnus hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-gnus >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-indent hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-indent >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-lilypond hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-lilypond >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-matlab hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-matlab >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-datetree hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-datetree >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-docview hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-docview >> /Users/markd/.emacs.d/elpa/org-9.8.8/oc-bibtex hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-bibtex >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-python hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-python >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-makefile hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-makefile >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-duration hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-duration >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-agenda hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-agenda >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-dot hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-dot >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-js hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-js >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-publish hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-publish >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-inlinetask hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-inlinetask >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-org hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-org >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-keys hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-keys >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-core hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-core >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-compat hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-compat >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-odt hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-odt >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-info hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-info >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-plantuml hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-plantuml >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-eshell hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-eshell >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-ascii hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-ascii >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-koma-letter hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-koma-letter >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-maxima hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-maxima >> /Users/markd/.emacs.d/elpa/org-9.8.8/org hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org >> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-bbdb hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-bbdb >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-macro hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-macro >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-fold hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-fold >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-sql hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-sql >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-attach hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-attach >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-cycle hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-cycle >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-processing hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-processing >> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-texinfo hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-texinfo >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-crypt hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-crypt >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-footnote hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-footnote >> /Users/markd/.emacs.d/elpa/org-9.8.8/org-element-ast hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-element-ast >> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-comint hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-comint >> /Users/markd/.emacs.d/elpa/compat-31.0.0.2/compat hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/emacs-lisp/compat >> >> Features: >> (shadow emacsbug markdown-mode vc-hg vc-bzr vc-src vc-sccs >> vc-svn vc-cvs vc-rcs log-view bug-reference magit-extras >> mailalias utf-7 network-stream nsm qp vm-rfaddons vm-pine >> vm-postpone vm-edit bbdb-vm bbdb-mua cl dabbrev vc python >> misearch multi-isearch pcmpl-unix magit-bookmark magit-submodule >> magit-blame magit-stash magit-reflog magit-bisect magit-push >> magit-pull magit-fetch magit-clone magit-remote magit-commit >> magit-sequence magit-notes magit-worktree magit-tag magit-merge >> magit-branch magit-reset magit-files magit-refs magit-status >> magit magit-repos magit-apply magit-wip magit-log magit-diff >> which-func git-commit log-edit pcvs-util add-log magit-core >> magit-margin magit-transient spinner >> claude-code-ide-mcp-http-server web-server >> web-server-status-codes cus-edit cus-start ghostel >> ghostel-module ghostel-prompt ghostel-module-install >> ghostel-links ghostel-line-mode ghostel-kitty ghostel-faces >> claude-code-ide claude-code-ide-emacs-tools imenu xref >> claude-code-ide-transient claude-code-ide-mcp >> claude-code-ide-mcp-server claude-code-ide-mcp-handlers >> claude-code-ide-diagnostics ediff ediff-merg ediff-mult >> ediff-wind ediff-diff ediff-help ediff-init ediff-util websocket >> bindat claude-code-ide-debug consult magit-process with-editor >> magit-mode benchmark magit-git magit-base magit-section >> cursor-sensor magit-autorevert smerge-mode diff dired-aux >> autorevert vc-git diff-mode track-changes vc-dispatcher >> org-superstar flyspell ispell org-indent oc-basic ol-eww eww >> url-queue mm-url ol-rmail ol-mhe ol-irc ol-info ol-gnus nnselect >> gnus-art mm-uu mml2015 mm-view mml-smime gnus-sum shr pixel-fill >> kinsoku url-file svg dom gnus-group gnus-undo gnus-start >> gnus-dbus dbus xml gnus-cloud nnimap nnmail mail-source nnoo >> gnus-spec gnus-int gnus-range message yank-media rfc822 mml >> mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231 >> gmm-utils mailheader gnus-win gnus nnheader gnus-util range >> wid-edit ol-docview doc-view filenotify image-mode exif >> dired-quick-sort transient llama comp comp-cstr cond-let compat >> compat-31 savehist ls-lisp dired dired-loaddefs ol-bibtex bibtex >> ol-bbdb ol-w3m ol-doi org-link-doi epa-file epa derived epg >> rfc6068 epg-config server preview reporter latex latex-flymake >> flymake project warnings tex-ispell tex-style tex texmathp >> auctex cc-styles cc-align cc-engine cc-vars cc-defs flycheck >> org-tempo tempo org-vm org-med org-location-google-maps >> org-agenda org-element org-persist org-id avl-tree generator >> org-refile google-maps google-maps-static google-maps-geocode >> google-maps-base org ob ob-tangle ob-ref ob-lob ob-table ob-exp >> org-macro org-src sh-script smie treesit executable ob-comint >> org-element-ast inline org-pcomplete org-list org-footnote >> org-faces org-entities noutline outline ob-emacs-lisp ob-core >> ob-eval org-cycle org-table ol org-fold org-fold-core org-keys >> oc org-compat org-loaddefs thingatpt cal-menu calendar >> cal-loaddefs org-version org-macs mailrc vm-pcrisis vm-autoload >> vm-autoloads vm-imap utf7 vm-virtual vm-page vm-pop vm-crypto >> vm-delete vm-sort vm-motion vm-minibuf vm-mouse vm-menu vm-mime >> smime gnutls puny dig sendmail rfc2047 rfc2045 ietf-drums >> mm-util mail-prsvr mail-utils vm-reply vm-undo vm-summary >> vm-summary-faces vm-avirtual bbdb-com crm mailabbrev bbdb >> bbdb-site timezone vm-thread vm-folder vm-toolbar vm-window >> tapestry vm-misc vm-message vm-vars vm-macro vm >> comint-delim-fix.el vterm bookmark pp tramp trampver >> tramp-integration files-x tramp-message tramp-compat xdg >> parse-time iso8601 format-spec tramp-loaddefs face-remap term >> disp-table ehelp find-func vterm-module time-date compile >> text-property-search comp-run comp-common rx term/xterm xterm >> edmacro kmacro use-package-bind-key bind-key easy-mmode >> use-package-ensure exec-path-from-shell ssh medutil >> google-translate google-translate-default-ui >> google-translate-core-ui facemenu color google-translate-core >> google-translate-backend background shell pcomplete comint >> ansi-osc ansi-color ring jka-compr modus-operandi-theme >> modus-themes delsel xt-mouse time desktop frameset cua-base >> cus-load gcmh cl-extra help-mode use-package-core 2bit-autoloads >> bbdb-ext-autoloads bbdb-vcard-autoloads buttercup-autoloads >> charmap-autoloads claude-code-ide-autoloads consult-autoloads >> csv-mode-autoloads dired-quick-sort-autoloads ebib-autoloads >> ess-autoloads filladapt-autoloads find-file-in-project-autoloads >> flycheck-pycheckers-autoloads flycheck-autoloads flymd-autoloads >> gcmh-autoloads ghostel-autoloads google-c-style-autoloads >> google-this-autoloads google-translate-autoloads gptel-autoloads >> graphviz-dot-mode-autoloads groovy-mode-autoloads >> helm-bbdb-autoloads bbdb-autoloads helm-codesearch-autoloads >> helm-flyspell-autoloads helm-git-autoloads >> helm-git-grep-autoloads helm-google-autoloads >> helm-ispell-autoloads helm-make-autoloads helm-org-autoloads >> helm-easymenu helm-autoloads helm-core-autoloads >> hide-lines-autoloads json-navigator-autoloads >> languagetool-autoloads latex-table-wizard-autoloads >> auctex-autoloads tex-site list-unicode-display-autoloads >> ht-autoloads magit-git-toolbelt-autoloads magit-autoloads pcase >> magit-section-autoloads f-autoloads dash-autoloads >> async-autoloads markdown-mode-autoloads nose-autoloads >> org-modern-autoloads org-superstar-autoloads org-autoloads >> org-vcard-autoloads osx-dictionary-autoloads osx-plist-autoloads >> package-lint-autoloads paper-theme-autoloads parsebib-autoloads >> pcache-autoloads popup-autoloads pyvenv-autoloads s-autoloads >> snakemake-mode-autoloads spinner-autoloads >> string-inflection-autoloads transient-autoloads >> twilight-bright-theme-autoloads finder-inf >> unicode-emoticons-autoloads >> universal-emotions-emoticons-autoloads vcard-autoloads >> vterm-autoloads w3m-autoloads web-server-autoloads >> websocket-autoloads wfnames-autoloads with-editor-autoloads >> llama-autoloads cond-let-autoloads info compat-autoloads >> xkcd-autoloads package browse-url url url-proxy url-privacy >> url-expand url-methods url-history url-cookie generate-lisp-file >> url-domsuf url-util mailcap url-handlers url-parse auth-source >> cl-seq eieio eieio-core cl-macs icons password-cache json subr-x >> map byte-opt gv bytecomp byte-compile url-vars cl-loaddefs >> cl-lib rmc iso-transl tooltip cconv eldoc paren electric >> uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel >> term/ns-win ns-win ucs-normalize mule-util term/common-win >> tool-bar dnd fontset image regexp-opt fringe tabulated-list >> replace newcomment text-mode lisp-mode prog-mode register page >> tab-bar menu-bar rfn-eshadow isearch easymenu timer select >> scroll-bar mouse jit-lock font-lock syntax font-core >> term/tty-colors frame minibuffer nadvice seq simple cl-generic >> indonesian philippine cham georgian utf-8-lang misc-lang >> vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms >> cp51932 hebrew greek romanian slovak czech european ethiopic >> indian cyrillic chinese composite emoji-zwj charscript charprop >> case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure >> cl-preloaded button loaddefs theme-loaddefs faces cus-face >> macroexp files window text-properties overlay sha1 md5 base64 >> format env code-pages mule custom widget keymap >> hashtable-print-readable backquote threads kqueue cocoa ns lcms2 >> multi-tty make-network-process native-compile emacs) >> >> Memory information: >> ((conses 16 1515089 264889) (symbols 48 78587 4) (strings 32 458258 8292) >> (string-bytes 1 10921407) (vectors 16 215554) (vector-slots 8 3263335 142577) >> (floats 8 1361 1640) (intervals 56 76497 1952) (buffers 992 71)) > > Adding a few others who have macOS interest and expertise to opine.
0001-Add-usage-descriptions-for-class-based-TCC-privacy-s.patch
(application/octet-stream, 5 KB)
From 25bab4ac34b2dd7f808f2489432b68b670ea8384 Mon Sep 17 00:00:00 2001 From: Boris Buliga <[email protected]> Date: Sat, 1 Aug 2026 08:40:02 +0300 Subject: [PATCH] Add usage descriptions for class-based TCC privacy services (bug#81526) macOS attributes privacy checks for any process started from within Emacs (M-x shell, eshell, term, compile, ...) to Emacs.app. Without a matching usage-description key in Emacs.app's Info.plist, such a process is killed with SIGABRT as soon as it touches a privacy-gated framework; with the key, macOS shows the normal permission prompt. Declaring a key does not by itself grant access. * nextstep/templates/Info.plist.in: Declare usage-description keys for the photo library, camera, microphone, contacts, calendars, reminders, location, Bluetooth, and the local network. * etc/NEWS: Announce the change. --- etc/NEWS | 10 ++++++++ nextstep/templates/Info.plist.in | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 4e3f8508da4..8cd5d8b77e9 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -30,6 +30,16 @@ applies, and please also update docstrings as needed. * Changes in Emacs 32.1 +--- +** Emacs.app declares usage descriptions for more privacy services (macOS). +macOS attributes privacy checks for any process started from within +Emacs to Emacs.app. 'Info.plist' now declares usage-description keys +for the photo library, camera, microphone, contacts, calendars, +reminders, location, Bluetooth, and the local network, so a process +that touches one of these frameworks now triggers the normal system +permission prompt instead of being killed with SIGABRT. Declaring a +key does not by itself grant access. + --- ** Emacs no longer kills child processes after EPIPE. Previously, Emacs would immediately kill a child process and set its diff --git a/nextstep/templates/Info.plist.in b/nextstep/templates/Info.plist.in index a9f3325df67..3f02804dab4 100644 --- a/nextstep/templates/Info.plist.in +++ b/nextstep/templates/Info.plist.in @@ -695,6 +695,45 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. <string>Emacs requires permission to access files on Removable Volumes.</string> <key>NSSpeechRecognitionUsageDescription</key> <string>Emacs requires permission to handle any speech recognition.</string> + <!-- Class-based TCC privacy services. Emacs itself does not + use these frameworks, but macOS attributes privacy checks + for any process started from within Emacs (M-x shell, + eshell, term, compile, ...) to Emacs.app; without these + keys such a process is killed with SIGABRT when it touches + the corresponding framework. Declaring a key does not by + itself grant access; it only lets macOS show the normal + permission prompt. --> + <!-- Where Apple introduced replacement keys (calendars and + reminders on macOS 14, location on macOS 10.15), both + generations are declared so older systems keep working. --> + <key>NSBluetoothAlwaysUsageDescription</key> + <string>An application in Emacs requires permission to use Bluetooth.</string> + <key>NSCalendarsUsageDescription</key> + <string>An application in Emacs requires permission to access your calendars.</string> + <key>NSCalendarsFullAccessUsageDescription</key> + <string>An application in Emacs requires full access to your calendars.</string> + <key>NSCalendarsWriteOnlyAccessUsageDescription</key> + <string>An application in Emacs requires permission to add events to your calendars.</string> + <key>NSCameraUsageDescription</key> + <string>An application in Emacs requires permission to use the camera.</string> + <key>NSContactsUsageDescription</key> + <string>An application in Emacs requires permission to access your contacts.</string> + <key>NSLocalNetworkUsageDescription</key> + <string>An application in Emacs requires permission to access the local network.</string> + <key>NSLocationUsageDescription</key> + <string>An application in Emacs requires permission to access your location.</string> + <key>NSLocationWhenInUseUsageDescription</key> + <string>An application in Emacs requires permission to access your location.</string> + <key>NSMicrophoneUsageDescription</key> + <string>An application in Emacs requires permission to use the microphone.</string> + <key>NSPhotoLibraryUsageDescription</key> + <string>An application in Emacs requires permission to access your photo library.</string> + <key>NSPhotoLibraryAddUsageDescription</key> + <string>An application in Emacs requires permission to add photos to your photo library.</string> + <key>NSRemindersUsageDescription</key> + <string>An application in Emacs requires permission to access your reminders.</string> + <key>NSRemindersFullAccessUsageDescription</key> + <string>An application in Emacs requires full access to your reminders.</string> <!-- Prevent macOS 26 (Tahoe) and later from spawning an "AutoFill (Emacs)" helper process that heuristically scans text fields for one-time codes; Emacs never marks fields as -- 2.52.0