[GH-ISSUE #4303] [Feature] Map launchd, XPC, privileged-helper, login-item and system-extension relationships #1705

Open
opened 2026-10-16 21:09:17 +00:00 by bsakaguchi · 0 comments
Owner

Originally created by @coygeek on GitHub (Oct 16, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/4303

Before submitting

  • I searched the open and closed issues and pull requests for a related proposal.
  • I understand the contribution scope must be reviewed before integration; open questions are welcome here.
  • This request does not include credentials, private samples, or sensitive target data.

Area

Evidence, artifacts, or reconstruction

Current limitation

project_apple_application_graph should turn the background-execution declarations in a macOS app bundle into typed edges: launchd jobs and the executables and Mach services they declare, XPC services and their service names, SMJobBless helpers with the requirement strings in each direction, login items and system extensions with their bundle identifiers. Each edge cites the plist (or embedded plist) and key it came from, and each Apple naming rule linking the two ends is reported as matched, mismatched or unknown. Static only: nothing is launched, registered or evaluated.

An analyst assessing a macOS app needs to know what it runs in the background and who may talk to what: a launch daemon, a privileged helper and the requirement gating which clients may install it, the Mach services the bundle advertises. REA 6.5.0 (tag rea-agents-6.5.0, commit 3b79af28e80785afce9f5998d8f03289402a1847) locates these pieces by directory but never reads them.

The graph classifies a .plist directly in Contents/Library/LaunchAgents or LaunchDaemons as domain: agent or daemon, treats any file directly in Contents/Library/LaunchServices as a privileged helper, and gives nested .xpc, .systemextension, .dext and LoginItems/*.app bundles path-convention roles. The result has no relationship field; its limitations say "Bundle identifiers and signing claims require dedicated plist and CMS parsing; this projection reports only exact paths and hashes", and the documentation sends the agent to inspect_plist for SMPrivilegedExecutables and BundleProgram.

Observed with the release build on macOS 27.0.1 (26A434) arm64 and Node.js v26.10.0, on a self-built unsigned ./fixture/Host.app (details in Acceptance criteria) whose Contents/Library/LaunchAgents/com.example.agent.plist declares Label, BundleProgram = Contents/Resources/agentd, MachServices and AssociatedBundleIdentifiers, and whose Contents/Library/LaunchServices/com.example.host.helper embeds an Info.plist with SMAuthorizedClients and a launchd plist with Label:

npx -y rea-agents@6.5.0 inspect-artifact ./fixture/Host.app --format json > artifact.json
jq '{inventory_evidence: [.]}' artifact.json > graph-input.json
npx -y rea-agents@6.5.0 project-apple-application-graph ./graph-input.json --format json

The projection lists the agent plist as {"path": "Contents/Library/LaunchAgents/com.example.agent.plist", "format": "plist", "domain": "agent"}, lists Contents/Resources/agentd only as an executable with no link to that plist, lists the helper under privileged_helpers by path, and gives the XPC service, login item and system extension roles with role_basis: "path-convention" but no identifiers. Nothing connects the app's SMPrivilegedExecutables entry to the helper. The documented manual route does not reach the helper's own declarations either: inspect-plist on the helper Mach-O fails with capability_unavailable ("The target has no readable Contents/Info.plist at .../Contents/Library/LaunchServices/Contents/Info.plist"), because it decodes plist files with plutil and has no path to plists embedded in a Mach-O.

Use cases

No response

Desired outcome and success criteria

Where it surfaces: the project_apple_application_graph result (CLI project-apple-application-graph and MCP) gains relationship edges between existing bundle and component paths. Existing fields keep their current values.

  • Launchd job edges: for each plist directly in an application or nested bundle's Contents/Library/LaunchAgents or Contents/Library/LaunchDaemons, an edge from the owning bundle to the plist carrying the directory-derived kind (agent or daemon), Label, BundleProgram, Program, ProgramArguments and AssociatedBundleIdentifiers exactly as declared.
  • Program targets: BundleProgram is resolved relative to the owning bundle (Apple's documented form) to an inventoried component, or reported as missing from the inventory. An absolute Program or ProgramArguments path is reported as outside the inventory, not guessed.
  • Mach service edges: each MachServices key in a launchd plist (in-bundle or embedded in a helper) is reported as a service name advertised by that job.
  • XPC service edges: for each .xpc bundle, an edge from its enclosing bundle (app or framework) with the service name taken from its CFBundleIdentifier, and the XPCService dictionary's ServiceType, RunLoopType, JoinExistingSession and EnvironmentVariables key names as declared. A ServiceType value Apple does not list (only Application is documented) is reported as undocumented, not rejected.
  • SMJobBless edges: for each SMPrivilegedExecutables entry in an app's Info.plist, an edge from the app to Contents/Library/LaunchServices/<key> carrying the requirement string the helper is expected to satisfy, and the helper's embedded SMAuthorizedClients strings that the client is expected to satisfy, each verbatim. Two name checks are reported: a helper file exists under the key's name, and its embedded launchd Label equals its file name. A helper with no matching entry, and an entry with no helper file, are both reported.
  • Embedded plists: the helper's Info.plist and launchd plist are read from the Mach-O sections __TEXT,__info_plist and __TEXT,__launchd_plist. Apple's developer documentation does not name these sections, so the Evidence labels them as a toolchain convention (launchctl plist __TEXT,__launchd_plist <file> reads the same section on macOS 27.0.1). A missing section leaves the dependent fields and checks unknown. For a universal helper whose slices disagree, the edge reports per-slice values or unknown, never one slice as the whole file.
  • Login item edges: for each Contents/Library/LoginItems/*.app, an edge from the app carrying the helper's CFBundleIdentifier, the identifier SMAppService.loginItem(identifier:) expects.
  • System extension edges: for each bundle in Contents/Library/SystemExtensions, an edge from the app carrying its CFBundleIdentifier and a filename check (file name equals identifier plus the .systemextension or .dext extension) reported as matched, mismatched or unknown.
  • Requirement strings: reported verbatim, as text, with a limitation that they are neither syntax-checked nor evaluated against any signature. Decision: both checks belong with code-signing analysis, which already reads signatures; the edges need only the declared text.
  • Provenance: every edge field names its source path, key path and, for embedded plists, the Mach-O path, section and slice, and cites the inventoried digest of that file. Bytes that cannot be read or do not match the inventoried digest leave the edge's declared fields unknown.
  • Fail closed: a plist that does not decode, or a key with the wrong type, yields an edge marked malformed with the raw value where available, coverage partial, and a limitation naming the file. Other edges still appear.
  • Limitations stated in the Evidence: edges are declarations in the bundle, not observed launchd state, registration, user approval or connections.

Acceptance criteria

The fixture is an unsigned ./fixture/Host.app with Contents/Info.plist (CFBundleIdentifier = com.example.host, SMPrivilegedExecutables = {com.example.host.helper: 'identifier "com.example.host.helper" and anchor apple generic'}), Contents/Resources/agentd, the agent plist above (MachServices = {com.example.agent.xpc: true}), Contents/XPCServices/Worker.xpc (CFBundleIdentifier = com.example.host.worker, XPCService = {ServiceType: Application, RunLoopType: dispatch_main}), Contents/Library/LoginItems/Menu.app (com.example.host.menu), Contents/Library/SystemExtensions/com.example.host.filter.systemextension (com.example.host.filter), and a helper built with clang -o Host.app/Contents/Library/LaunchServices/com.example.host.helper main.c -Wl,-sectcreate,__TEXT,__info_plist,hinfo.plist -Wl,-sectcreate,__TEXT,__launchd_plist,hlaunchd.plist, where hinfo.plist holds SMAuthorizedClients = ['identifier "com.example.host" and anchor apple generic'] and hlaunchd.plist holds Label = com.example.host.helper and MachServices = {com.example.host.helper: true}.

  • The agent plist yields an agent job edge with Label com.example.agent, BundleProgram resolved to the inventoried Contents/Resources/agentd, AssociatedBundleIdentifiers [com.example.host], and a Mach service edge com.example.agent.xpc.
  • Changing BundleProgram to Contents/Resources/missing reports the program target as missing from the inventory; replacing it with Program = /usr/local/libexec/agentd reports that path verbatim as outside the inventory.
  • Worker.xpc yields an XPC service edge from the app with service name com.example.host.worker, ServiceType Application and RunLoopType dispatch_main; changing ServiceType to User reports it as undocumented, not invalid.
  • The helper yields one SMJobBless edge with both requirement strings verbatim, both name checks matched, and Mach service com.example.host.helper, each embedded field citing its section name with the not-Apple-documented label.
  • Renaming the helper file to com.example.other reports the SMPrivilegedExecutables entry with no helper file and the helper with no entry and a file-name-to-Label mismatch; rebuilding it without __launchd_plist reports the Label check as unknown.
  • The login item edge carries com.example.host.menu; the system extension edge carries com.example.host.filter with the filename check matched, and renaming the bundle to filter.systemextension reports it mismatched.
  • Replacing the agent plist with invalid XML reports that edge as malformed, sets coverage to partial with a limitation naming the file, and still reports all other edges.
  • On stock /System/Applications/Stickies.app, the projection reports no launchd, SMJobBless, login-item or system-extension edges, and coverage is unchanged from the release build.
  • The tool description and docs/apple-application-analysis.md describe the edges and no longer say the projection does not read plists.

Expected interaction with targets

Read existing files or captured data

Target and scope details (optional)

Affected area

project_apple_application_graph (CLI and MCP): result schema, limitations, tool description and documentation. The projection currently consumes only inventory Evidence (paths, formats and digests), so it must obtain the bytes of the plists and helper executables it reads from the inventoried artifact; how is open, but the digests must tie each edge to the inventoried file. The edge kinds stay in one issue because they share one graph contract (one relationship schema with the same provenance, digest and fail-closed rules) and one closure signal: the projection reports these edges and its documentation no longer says it does not read plists.

Non-goals

  • General Info.plist entry points and capabilities (URL types, document and type declarations, activity types, Services, background modes, usage descriptions, App Transport Security, extension point identifiers).
  • Privacy manifests and required-reason checks.
  • Runtime observation of launchd, XPC connections, SMAppService status, Background Task Management approval, or anything that launches or registers code.
  • Parsing requirement syntax or evaluating a requirement against a code signature.
  • Launchd keys other than those listed (for example KeepAlive, RunAtLoad, schedules, sockets, SpawnConstraint), and launchd plists outside the bundle.
  • Client-side edges from string literals passed to XPC connection APIs in binaries.
  • Accepting nested bundle directories as direct targets of other tools, and flagging Mach-O code outside documented code locations.
  • Fixing the agent or daemon classification bug tracked in #3353.

Verification available so far

I can suggest a sample or manual check

Verification details (optional)

No response

Alternatives considered

  • Agent composes inspect_plist per file (today's documented route): works for in-bundle plist files but cannot read the helper's embedded plists, and leaves the cross-file naming rules to the agent.
  • A separate relationship tool: duplicates the graph's bundle discovery and component identities. Chosen: extend the graph, because the edges connect paths the graph already owns and the item is about relationships between them.

Possible direction

No response

References

Apple documentation (corpus fetched 2026-09-30):

REA source at the release tag (all unchanged on main d52a488):

Related: open bug #3353 (fix in open PR #3504) is related, not a duplicate: it corrects which directory decides the agent or daemon label, while this request reads the plists' contents and links them to other bundle members. Merged PR #922 introduced the path-convention anatomy and listed plist semantics as not included. Searches for "launchd plist", "LaunchDaemons", "XPC service", "SMJobBless", "privileged helper", "login item", "SMAuthorizedClients", "MachServices" and "BundleProgram" found no request for these relationships.

Originally created by @coygeek on GitHub (Oct 16, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/4303 ### Before submitting - [X] I searched the open and closed issues and pull requests for a related proposal. - [X] I understand the [contribution scope](https://github.com/morluto/rea/blob/main/CONTRIBUTING.md#contribution-scope) must be reviewed before integration; open questions are welcome here. - [X] This request does not include credentials, private samples, or sensitive target data. ### Area Evidence, artifacts, or reconstruction ### Current limitation `project_apple_application_graph` should turn the background-execution declarations in a macOS app bundle into typed edges: launchd jobs and the executables and Mach services they declare, XPC services and their service names, SMJobBless helpers with the requirement strings in each direction, login items and system extensions with their bundle identifiers. Each edge cites the plist (or embedded plist) and key it came from, and each Apple naming rule linking the two ends is reported as matched, mismatched or unknown. Static only: nothing is launched, registered or evaluated. An analyst assessing a macOS app needs to know what it runs in the background and who may talk to what: a launch daemon, a privileged helper and the requirement gating which clients may install it, the Mach services the bundle advertises. REA 6.5.0 (tag `rea-agents-6.5.0`, commit `3b79af28e80785afce9f5998d8f03289402a1847`) locates these pieces by directory but never reads them. The graph classifies a `.plist` directly in `Contents/Library/LaunchAgents` or `LaunchDaemons` as `domain: agent` or `daemon`, treats any file directly in `Contents/Library/LaunchServices` as a privileged helper, and gives nested `.xpc`, `.systemextension`, `.dext` and `LoginItems/*.app` bundles path-convention roles. The result has no relationship field; its limitations say "Bundle identifiers and signing claims require dedicated plist and CMS parsing; this projection reports only exact paths and hashes", and the documentation sends the agent to `inspect_plist` for `SMPrivilegedExecutables` and `BundleProgram`. Observed with the release build on macOS 27.0.1 (26A434) arm64 and Node.js v26.10.0, on a self-built unsigned `./fixture/Host.app` (details in Acceptance criteria) whose `Contents/Library/LaunchAgents/com.example.agent.plist` declares `Label`, `BundleProgram = Contents/Resources/agentd`, `MachServices` and `AssociatedBundleIdentifiers`, and whose `Contents/Library/LaunchServices/com.example.host.helper` embeds an Info.plist with `SMAuthorizedClients` and a launchd plist with `Label`: ```sh npx -y rea-agents@6.5.0 inspect-artifact ./fixture/Host.app --format json > artifact.json jq '{inventory_evidence: [.]}' artifact.json > graph-input.json npx -y rea-agents@6.5.0 project-apple-application-graph ./graph-input.json --format json ``` The projection lists the agent plist as `{"path": "Contents/Library/LaunchAgents/com.example.agent.plist", "format": "plist", "domain": "agent"}`, lists `Contents/Resources/agentd` only as an executable with no link to that plist, lists the helper under `privileged_helpers` by path, and gives the XPC service, login item and system extension roles with `role_basis: "path-convention"` but no identifiers. Nothing connects the app's `SMPrivilegedExecutables` entry to the helper. The documented manual route does not reach the helper's own declarations either: `inspect-plist` on the helper Mach-O fails with `capability_unavailable` ("The target has no readable Contents/Info.plist at .../Contents/Library/LaunchServices/Contents/Info.plist"), because it decodes plist files with `plutil` and has no path to plists embedded in a Mach-O. ### Use cases _No response_ ### Desired outcome and success criteria Where it surfaces: the `project_apple_application_graph` result (CLI `project-apple-application-graph` and MCP) gains relationship edges between existing bundle and component paths. Existing fields keep their current values. - Launchd job edges: for each plist directly in an application or nested bundle's `Contents/Library/LaunchAgents` or `Contents/Library/LaunchDaemons`, an edge from the owning bundle to the plist carrying the directory-derived kind (agent or daemon), `Label`, `BundleProgram`, `Program`, `ProgramArguments` and `AssociatedBundleIdentifiers` exactly as declared. - Program targets: `BundleProgram` is resolved relative to the owning bundle (Apple's documented form) to an inventoried component, or reported as missing from the inventory. An absolute `Program` or `ProgramArguments` path is reported as outside the inventory, not guessed. - Mach service edges: each `MachServices` key in a launchd plist (in-bundle or embedded in a helper) is reported as a service name advertised by that job. - XPC service edges: for each `.xpc` bundle, an edge from its enclosing bundle (app or framework) with the service name taken from its `CFBundleIdentifier`, and the `XPCService` dictionary's `ServiceType`, `RunLoopType`, `JoinExistingSession` and `EnvironmentVariables` key names as declared. A `ServiceType` value Apple does not list (only `Application` is documented) is reported as undocumented, not rejected. - SMJobBless edges: for each `SMPrivilegedExecutables` entry in an app's Info.plist, an edge from the app to `Contents/Library/LaunchServices/<key>` carrying the requirement string the helper is expected to satisfy, and the helper's embedded `SMAuthorizedClients` strings that the client is expected to satisfy, each verbatim. Two name checks are reported: a helper file exists under the key's name, and its embedded launchd `Label` equals its file name. A helper with no matching entry, and an entry with no helper file, are both reported. - Embedded plists: the helper's Info.plist and launchd plist are read from the Mach-O sections `__TEXT,__info_plist` and `__TEXT,__launchd_plist`. Apple's developer documentation does not name these sections, so the Evidence labels them as a toolchain convention (`launchctl plist __TEXT,__launchd_plist <file>` reads the same section on macOS 27.0.1). A missing section leaves the dependent fields and checks unknown. For a universal helper whose slices disagree, the edge reports per-slice values or unknown, never one slice as the whole file. - Login item edges: for each `Contents/Library/LoginItems/*.app`, an edge from the app carrying the helper's `CFBundleIdentifier`, the identifier `SMAppService.loginItem(identifier:)` expects. - System extension edges: for each bundle in `Contents/Library/SystemExtensions`, an edge from the app carrying its `CFBundleIdentifier` and a filename check (file name equals identifier plus the `.systemextension` or `.dext` extension) reported as matched, mismatched or unknown. - Requirement strings: reported verbatim, as text, with a limitation that they are neither syntax-checked nor evaluated against any signature. Decision: both checks belong with code-signing analysis, which already reads signatures; the edges need only the declared text. - Provenance: every edge field names its source path, key path and, for embedded plists, the Mach-O path, section and slice, and cites the inventoried digest of that file. Bytes that cannot be read or do not match the inventoried digest leave the edge's declared fields unknown. - Fail closed: a plist that does not decode, or a key with the wrong type, yields an edge marked malformed with the raw value where available, coverage `partial`, and a limitation naming the file. Other edges still appear. - Limitations stated in the Evidence: edges are declarations in the bundle, not observed launchd state, registration, user approval or connections. **Acceptance criteria** The fixture is an unsigned `./fixture/Host.app` with `Contents/Info.plist` (`CFBundleIdentifier = com.example.host`, `SMPrivilegedExecutables = {com.example.host.helper: 'identifier "com.example.host.helper" and anchor apple generic'}`), `Contents/Resources/agentd`, the agent plist above (`MachServices = {com.example.agent.xpc: true}`), `Contents/XPCServices/Worker.xpc` (`CFBundleIdentifier = com.example.host.worker`, `XPCService = {ServiceType: Application, RunLoopType: dispatch_main}`), `Contents/Library/LoginItems/Menu.app` (`com.example.host.menu`), `Contents/Library/SystemExtensions/com.example.host.filter.systemextension` (`com.example.host.filter`), and a helper built with `clang -o Host.app/Contents/Library/LaunchServices/com.example.host.helper main.c -Wl,-sectcreate,__TEXT,__info_plist,hinfo.plist -Wl,-sectcreate,__TEXT,__launchd_plist,hlaunchd.plist`, where `hinfo.plist` holds `SMAuthorizedClients = ['identifier "com.example.host" and anchor apple generic']` and `hlaunchd.plist` holds `Label = com.example.host.helper` and `MachServices = {com.example.host.helper: true}`. - The agent plist yields an agent job edge with `Label` `com.example.agent`, `BundleProgram` resolved to the inventoried `Contents/Resources/agentd`, `AssociatedBundleIdentifiers` `[com.example.host]`, and a Mach service edge `com.example.agent.xpc`. - Changing `BundleProgram` to `Contents/Resources/missing` reports the program target as missing from the inventory; replacing it with `Program = /usr/local/libexec/agentd` reports that path verbatim as outside the inventory. - `Worker.xpc` yields an XPC service edge from the app with service name `com.example.host.worker`, `ServiceType` `Application` and `RunLoopType` `dispatch_main`; changing `ServiceType` to `User` reports it as undocumented, not invalid. - The helper yields one SMJobBless edge with both requirement strings verbatim, both name checks matched, and Mach service `com.example.host.helper`, each embedded field citing its section name with the not-Apple-documented label. - Renaming the helper file to `com.example.other` reports the `SMPrivilegedExecutables` entry with no helper file and the helper with no entry and a file-name-to-`Label` mismatch; rebuilding it without `__launchd_plist` reports the `Label` check as unknown. - The login item edge carries `com.example.host.menu`; the system extension edge carries `com.example.host.filter` with the filename check matched, and renaming the bundle to `filter.systemextension` reports it mismatched. - Replacing the agent plist with invalid XML reports that edge as malformed, sets coverage to `partial` with a limitation naming the file, and still reports all other edges. - On stock `/System/Applications/Stickies.app`, the projection reports no launchd, SMJobBless, login-item or system-extension edges, and coverage is unchanged from the release build. - The tool description and `docs/apple-application-analysis.md` describe the edges and no longer say the projection does not read plists. ### Expected interaction with targets Read existing files or captured data ### Target and scope details (optional) **Affected area** `project_apple_application_graph` (CLI and MCP): result schema, limitations, tool description and documentation. The projection currently consumes only inventory Evidence (paths, formats and digests), so it must obtain the bytes of the plists and helper executables it reads from the inventoried artifact; how is open, but the digests must tie each edge to the inventoried file. The edge kinds stay in one issue because they share one graph contract (one relationship schema with the same provenance, digest and fail-closed rules) and one closure signal: the projection reports these edges and its documentation no longer says it does not read plists. **Non-goals** - General Info.plist entry points and capabilities (URL types, document and type declarations, activity types, Services, background modes, usage descriptions, App Transport Security, extension point identifiers). - Privacy manifests and required-reason checks. - Runtime observation of launchd, XPC connections, `SMAppService` status, Background Task Management approval, or anything that launches or registers code. - Parsing requirement syntax or evaluating a requirement against a code signature. - Launchd keys other than those listed (for example `KeepAlive`, `RunAtLoad`, schedules, sockets, `SpawnConstraint`), and launchd plists outside the bundle. - Client-side edges from string literals passed to XPC connection APIs in binaries. - Accepting nested bundle directories as direct targets of other tools, and flagging Mach-O code outside documented code locations. - Fixing the agent or daemon classification bug tracked in #3353. ### Verification available so far I can suggest a sample or manual check ### Verification details (optional) _No response_ ### Alternatives considered - Agent composes `inspect_plist` per file (today's documented route): works for in-bundle plist files but cannot read the helper's embedded plists, and leaves the cross-file naming rules to the agent. - A separate relationship tool: duplicates the graph's bundle discovery and component identities. Chosen: extend the graph, because the edges connect paths the graph already owns and the item is about relationships between them. ### Possible direction _No response_ ### References Apple documentation (corpus fetched 2026-09-30): - Updating helper executables from earlier versions of macOS: "Install `LaunchAgent` property lists in the app bundle in `Contents/Library/LaunchAgents`", likewise LaunchDaemons; "replace the `Program` key with the `BundleProgram` key and make the path relative to the bundle"; `AssociatedBundleIdentifiers` "indicates which bundles the Login Items panel associates with the helper executable"; and, for login items, "The identifier must match the CFBundleIdentifier string in Info.plist." https://developer.apple.com/documentation/servicemanagement/updating-helper-executables-from-earlier-versions-of-macos - SMAppService `agent(plistName:)`: "The property list name must correspond to a property list in the calling app's `Contents/Library/LaunchAgents` directory." https://developer.apple.com/documentation/servicemanagement/smappservice/agent(plistname:) ; `daemon(plistName:)`: same, for `Contents/Library/LaunchDaemons`. https://developer.apple.com/documentation/servicemanagement/smappservice/daemon(plistname:) ; `loginItem(identifier:)`: "The bundle identifier of the helper application." https://developer.apple.com/documentation/servicemanagement/smappservice/loginitem(identifier:) - SMJobBless: the label "must be one of the keys found in the SMPrivilegedExecutables dictionary"; each value "is a textual representation of a code signing requirement the system uses to determine whether the app owns the privileged tool"; the helper's embedded `SMAuthorizedClients` strings describe "a client allowed to add and remove the tool"; its embedded launchd plist's "only required key ... is the `Label` key"; and it "must reside in the Contents/Library/LaunchServices directory inside the application bundle, and its name must be its launchd job label." https://developer.apple.com/documentation/servicemanagement/smjobbless(_:_:_:_:) . The page does not name the Mach-O sections holding the embedded plists. - Placing content in a bundle: XPC Service `Contents/XPCServices/`, privileged helper tool `Contents/Library/LaunchServices/`, Service Management login item `Contents/Library/LoginItems/`, system extension `Contents/Library/SystemExtensions/`. https://developer.apple.com/documentation/bundleresources/placing-content-in-a-bundle - XPCService key (dictionary) with subkeys EnvironmentVariables, JoinExistingSession, RunLoopType, ServiceType; ServiceType lists only `Application`, default `Application`. https://developer.apple.com/documentation/bundleresources/information-property-list/xpcservice - Creating XPC services: "For services in an app bundle or framework, the service name is the XPC service's bundle identifier." https://developer.apple.com/documentation/xpc/creating-xpc-services - Installing system extensions and drivers: "System extensions reside inside your app's `Contents/Library/SystemExtensions` folder." https://developer.apple.com/documentation/systemextensions/installing-system-extensions-and-drivers ; System Extensions: "The extension must match your bundle identifier, excluding file extension", for example `com.example.usbdriver.dext`. https://developer.apple.com/documentation/systemextensions - The `LAUNCH_JOBKEY_*` pages give macro names only. The archived Creating Launch Daemons and Agents defines `Label` as "a unique string that identifies your daemon to `launchd`" and says "You indicate whether it describes a daemon or agent by the directory you place it in." https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html ; archived TN2083 on `MachServices`: "`launchd` will create a Mach port and register it in the appropriate bootstrap namespace." https://developer.apple.com/library/archive/technotes/tn2083/_index.html REA source at the release tag (all unchanged on main `d52a488`): - Path-only helper and launchd plist classification: https://github.com/morluto/rea/blob/3b79af28e80785afce9f5998d8f03289402a1847/src/domain/apple/appleApplication.ts#L291-L316 - Result schema with no relationship field: https://github.com/morluto/rea/blob/3b79af28e80785afce9f5998d8f03289402a1847/src/domain/apple/appleApplication.ts#L45-L65 - Limitations stating plists are not parsed: https://github.com/morluto/rea/blob/3b79af28e80785afce9f5998d8f03289402a1847/src/domain/apple/appleApplication.ts#L448-L449 - Path-convention bundle roles: https://github.com/morluto/rea/blob/3b79af28e80785afce9f5998d8f03289402a1847/src/domain/apple/appleBundleAnatomy.ts#L244-L267 - Projection over inventory Evidence only: https://github.com/morluto/rea/blob/3b79af28e80785afce9f5998d8f03289402a1847/src/application/apple/AppleApplicationService.ts#L13-L27 - Documentation, "The projection does not read plists": https://github.com/morluto/rea/blob/3b79af28e80785afce9f5998d8f03289402a1847/docs/apple-application-analysis.md#L117-L141 - `inspect_plist` decodes a plist file with `plutil`: https://github.com/morluto/rea/blob/3b79af28e80785afce9f5998d8f03289402a1847/src/native/NativeMacOSProvider.ts#L777-L782 Related: open bug #3353 (fix in open PR #3504) is related, not a duplicate: it corrects which directory decides the agent or daemon label, while this request reads the plists' contents and links them to other bundle members. Merged PR #922 introduced the path-convention anatomy and listed plist semantics as not included. Searches for "launchd plist", "LaunchDaemons", "XPC service", "SMJobBless", "privileged helper", "login item", "SMAuthorizedClients", "MachServices" and "BundleProgram" found no request for these relationships.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#1705
No description provided.