mirror of
https://github.com/maxgoedjen/secretive.git
synced 2026-03-06 17:57:23 +01:00
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:
11
Sources/AgentRequestParser/Info.plist
Normal file
11
Sources/AgentRequestParser/Info.plist
Normal 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>
|
||||
55
Sources/AgentRequestParser/main.swift
Normal file
55
Sources/AgentRequestParser/main.swift
Normal 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)")
|
||||
}
|
||||
Reference in New Issue
Block a user