Move downloader and socket input parsing to xpc services (#675)

* XPC updater POC

* WIP

* obo

* WIP

* Working

* .

* .

* .

* Cleanup

* Cleanup

* Throw restrict

* Remove dead protocol.

* .

* Fix ECDSA test.

* Scripts
This commit is contained in:
Max Goedjen
2025-09-06 23:16:23 -07:00
committed by GitHub
parent cf5ae49ebc
commit 63b42bd9df
24 changed files with 995 additions and 188 deletions

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>XPCService</key>
<dict>
<key>ServiceType</key>
<string>Application</string>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,55 @@
import XPC
import SecretAgentKit
import OSLog
private let logger = Logger(subsystem: "com.maxgoedjen.secretive.secretagent.AgentRequestParser", category: "Parser")
func handleRequest(_ request: XPCListener.IncomingSessionRequest) -> XPCListener.IncomingSessionRequest.Decision {
logger.log("Parser received inbound request")
return request.accept { xpcMessage in
xpcMessage.handoffReply(to: .global(qos: .userInteractive)) {
logger.log("Parser accepted inbound request")
handle(with: xpcMessage)
}
}
}
func handle(with xpcMessage: XPCReceivedMessage) {
do {
let parser = SSHAgentInputParser()
let result = try parser.parse(data: xpcMessage.wrappedDecode())
logger.log("Parser parsed message as type \(result.debugDescription)")
xpcMessage.reply(result)
} catch {
logger.error("Parser failed with error \(error)")
xpcMessage.reply(error)
}
}
extension XPCReceivedMessage {
func wrappedDecode() throws(SSHAgentInputParser.AgentParsingError) -> Data {
do {
return try decode(as: Data.self)
} catch {
throw SSHAgentInputParser.AgentParsingError.invalidData
}
}
}
do {
if #available(macOS 26.0, *) {
_ = try XPCListener(
service: "com.maxgoedjen.Secretive.AgentRequestParser",
requirement: .isFromSameTeam(),
incomingSessionHandler: handleRequest(_:)
)
} else {
_ = try XPCListener(service: "com.maxgoedjen.Secretive.AgentRequestParser", incomingSessionHandler: handleRequest(_:))
}
logger.log("Parser initialized")
dispatchMain()
} catch {
logger.error("Failed to create parser, error: \(error)")
}