diff --git a/SecretAgent/AppDelegate.swift b/SecretAgent/AppDelegate.swift index 41ae78c..b6e8dcd 100644 --- a/SecretAgent/AppDelegate.swift +++ b/SecretAgent/AppDelegate.swift @@ -28,7 +28,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationDidFinishLaunching(_ aNotification: Notification) { os_log(.debug, "SecretAgent finished launching") DispatchQueue.main.async { - self.socketController.handler = self.agent.handle(fileHandle:) + self.socketController.handler = self.agent.handle(reader:writer:) } notifier.prompt() updateSink = updater.$update.sink { release in diff --git a/SecretAgentKit/Agent.swift b/SecretAgentKit/Agent.swift index 15bb6c5..c38b44d 100644 --- a/SecretAgentKit/Agent.swift +++ b/SecretAgentKit/Agent.swift @@ -21,18 +21,19 @@ public class Agent { extension Agent { - public func handle(fileHandle: FileHandle) { + public func handle(reader: FileHandleReader, writer: FileHandleWriter) { os_log(.debug, "Agent handling new data") - let data = fileHandle.availableData + let data = reader.availableData guard !data.isEmpty else { return } let requestTypeInt = data[4] guard let requestType = SSHAgent.RequestType(rawValue: requestTypeInt) else { return } os_log(.debug, "Agent handling request of type %@", requestType.debugDescription) let subData = Data(data[5...]) - handle(requestType: requestType, data: subData, fileHandle: fileHandle) + let response = handle(requestType: requestType, data: subData, reader: reader) + writer.write(response) } - func handle(requestType: SSHAgent.RequestType, data: Data, fileHandle: FileHandle) { + func handle(requestType: SSHAgent.RequestType, data: Data, reader: FileHandleReader) -> Data { var response = Data() do { switch requestType { @@ -42,7 +43,7 @@ extension Agent { os_log(.debug, "Agent returned %@", SSHAgent.ResponseType.agentIdentitiesAnswer.debugDescription) case .signRequest: response.append(SSHAgent.ResponseType.agentSignResponse.data) - response.append(try sign(data: data, from: fileHandle.fileDescriptor)) + response.append(try sign(data: data, from: reader.fileDescriptor)) os_log(.debug, "Agent returned %@", SSHAgent.ResponseType.agentSignResponse.debugDescription) } } catch { @@ -51,7 +52,7 @@ extension Agent { os_log(.debug, "Agent returned %@", SSHAgent.ResponseType.agentFailure.debugDescription) } let full = OpenSSHKeyWriter().lengthAndData(of: response) - fileHandle.write(full) + return full } } diff --git a/SecretAgentKit/FileHandleProtocols.swift b/SecretAgentKit/FileHandleProtocols.swift new file mode 100644 index 0000000..728268d --- /dev/null +++ b/SecretAgentKit/FileHandleProtocols.swift @@ -0,0 +1,16 @@ +import Foundation + +public protocol FileHandleReader { + + var availableData: Data { get } + var fileDescriptor: Int32 { get } + +} + +public protocol FileHandleWriter { + + func write(_ data: Data) + +} + +extension FileHandle: FileHandleReader, FileHandleWriter {} diff --git a/SecretAgentKit/SocketController.swift b/SecretAgentKit/SocketController.swift index ea82b16..1fc51d4 100644 --- a/SecretAgentKit/SocketController.swift +++ b/SecretAgentKit/SocketController.swift @@ -5,7 +5,7 @@ public class SocketController { fileprivate var fileHandle: FileHandle? fileprivate var port: SocketPort? - public var handler: ((FileHandle) -> Void)? + public var handler: ((FileHandleReader, FileHandleWriter) -> Void)? public init(path: String) { os_log(.debug, "Socket controller setting up at %@", path) @@ -52,7 +52,7 @@ public class SocketController { @objc func handleConnectionAccept(notification: Notification) { os_log(.debug, "Socket controller accepted connection") guard let new = notification.userInfo?[NSFileHandleNotificationFileHandleItem] as? FileHandle else { return } - handler?(new) + handler?(new, new) new.waitForDataInBackgroundAndNotify() fileHandle?.acceptConnectionInBackgroundAndNotify(forModes: [RunLoop.current.currentMode!]) } @@ -61,7 +61,7 @@ public class SocketController { os_log(.debug, "Socket controller has new data available") guard let new = notification.object as? FileHandle else { return } os_log(.debug, "Socket controller received new file handle") - handler?(new) + handler?(new, new) } } diff --git a/Secretive.xcodeproj/project.pbxproj b/Secretive.xcodeproj/project.pbxproj index 7b6986a..c79e7c6 100644 --- a/Secretive.xcodeproj/project.pbxproj +++ b/Secretive.xcodeproj/project.pbxproj @@ -45,6 +45,7 @@ 507CE4F02420A4C50029F750 /* SigningWitness.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507CE4EF2420A4C50029F750 /* SigningWitness.swift */; }; 507CE4F42420A8C10029F750 /* SigningRequestProvenance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507CE4F32420A8C10029F750 /* SigningRequestProvenance.swift */; }; 507CE4F62420A96F0029F750 /* SigningRequestTracer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507CE4F52420A96F0029F750 /* SigningRequestTracer.swift */; }; + 507EE34224281E12003C4FE3 /* FileHandleProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507EE34124281E12003C4FE3 /* FileHandleProtocols.swift */; }; 508A58AA241E06B40069DC07 /* PreviewUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508A58A9241E06B40069DC07 /* PreviewUpdater.swift */; }; 508A58B3241ED2180069DC07 /* AgentStatusChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508A58B2241ED2180069DC07 /* AgentStatusChecker.swift */; }; 508A58B5241ED48F0069DC07 /* PreviewAgentStatusChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508A58B4241ED48F0069DC07 /* PreviewAgentStatusChecker.swift */; }; @@ -238,6 +239,7 @@ 507CE4EF2420A4C50029F750 /* SigningWitness.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigningWitness.swift; sourceTree = ""; }; 507CE4F32420A8C10029F750 /* SigningRequestProvenance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigningRequestProvenance.swift; sourceTree = ""; }; 507CE4F52420A96F0029F750 /* SigningRequestTracer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigningRequestTracer.swift; sourceTree = ""; }; + 507EE34124281E12003C4FE3 /* FileHandleProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileHandleProtocols.swift; sourceTree = ""; }; 508A58A9241E06B40069DC07 /* PreviewUpdater.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewUpdater.swift; sourceTree = ""; }; 508A58AB241E121B0069DC07 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; 508A58B2241ED2180069DC07 /* AgentStatusChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentStatusChecker.swift; sourceTree = ""; }; @@ -529,6 +531,7 @@ 507CE4F32420A8C10029F750 /* SigningRequestProvenance.swift */, 507CE4F52420A96F0029F750 /* SigningRequestTracer.swift */, 50A3B79F24026B9900D209EA /* Agent.swift */, + 507EE34124281E12003C4FE3 /* FileHandleProtocols.swift */, 5099A06F240242BA0062B6F2 /* Info.plist */, ); path = SecretAgentKit; @@ -957,6 +960,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 507EE34224281E12003C4FE3 /* FileHandleProtocols.swift in Sources */, 507CE4EE2420A3CA0029F750 /* SocketController.swift in Sources */, 5099A08A240242C20062B6F2 /* SSHAgentProtocol.swift in Sources */, 507CE4ED2420A3C70029F750 /* Agent.swift in Sources */,