This commit is contained in:
Max Goedjen 2025-09-06 15:24:23 -07:00
parent 30bb29d153
commit 11074999ad
No known key found for this signature in database
4 changed files with 29 additions and 6 deletions

View File

@ -1,9 +1,21 @@
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 {
request.accept { message in
return try? SSHAgentInputParser().parse(data: message)
logger.log("Parser received inbound request")
return request.accept { message in
logger.log("Parser accepted inbound request")
do {
let result = try SSHAgentInputParser().parse(data: message)
logger.log("Parser parsed message as type \(result.debugDescription)")
return result
} catch {
logger.error("Parser failed with error \(error)")
return nil
}
}
}
@ -17,7 +29,8 @@ do {
} else {
_ = try XPCListener(service: "com.maxgoedjen.Secretive.AgentRequestParser", incomingSessionHandler: handleRequest(_:))
}
logger.log("Parser initialized")
dispatchMain()
} catch {
print("Failed to create listener, error: \(error)")
logger.error("Failed to create parser, error: \(error)")
}

View File

@ -93,7 +93,8 @@ extension Agent {
/// - Returns: An OpenSSH formatted Data payload containing the signed data response.
func sign(data: Data, keyBlob: Data, provenance: SigningRequestProvenance) async throws -> Data {
guard let (secret, store) = await secret(matching: keyBlob) else {
logger.debug("Agent did not have a key matching \(keyBlob as NSData)")
let keyBlobHex = keyBlob.compactMap { ("0" + String($0, radix: 16, uppercase: false)).suffix(2) }.joined()
logger.debug("Agent did not have a key matching \(keyBlobHex)")
throw NoMatchingKeyError()
}

View File

@ -35,6 +35,13 @@ class AppDelegate: NSObject, NSApplicationDelegate {
logger.debug("SecretAgent finished launching")
Task {
let inputParser = try XPCAgentInputParser()
Task {
try? await Task.sleep(for: .seconds(1))
var len = (5 as UInt32).littleEndian
var raw = SSHAgent.Request.requestIdentities.protocolID
let data = Data(bytes: &len, count: MemoryLayout<UInt32>.size) + Data(bytes: &raw, count: MemoryLayout<UInt8>.size)
print(try? await inputParser.parse(data: data))
}
for await session in socketController.sessions {
Task {
do {

View File

@ -4,13 +4,15 @@ import SecretAgentKit
public final class XPCAgentInputParser: SSHAgentInputParserProtocol {
private let session: XPCSession
private let queue = DispatchQueue(label: "com.maxgoedjen.Secretive.AgentRequestParser", qos: .userInteractive)
public init() throws {
if #available(macOS 26.0, *) {
session = try XPCSession(xpcService: "com.maxgoedjen.Secretive.AgentRequestParser", requirement: .isFromSameTeam())
session = try XPCSession(xpcService: "com.maxgoedjen.Secretive.AgentRequestParser", targetQueue: queue, options: .inactive, requirement: .isFromSameTeam())
} else {
session = try XPCSession(xpcService: "com.maxgoedjen.Secretive.AgentRequestParser")
session = try XPCSession(xpcService: "com.maxgoedjen.Secretive.AgentRequestParser", targetQueue: queue, options: .inactive)
}
try session.activate()
}
public func parse(data: Data) async throws -> SSHAgent.Request {