Skip to content

Commit a4b58e5

Browse files
committed
renames
1 parent 90b701a commit a4b58e5

File tree

11 files changed

+127
-129
lines changed

11 files changed

+127
-129
lines changed

Coder-Desktop/Coder-Desktop/XPCInterface.swift renamed to Coder-Desktop/Coder-Desktop/AppHelperXPCClient.swift

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ import NetworkExtension
33
import os
44
import VPNLib
55

6-
@objc final class AppXPCListener: NSObject, AppXPCInterface, @unchecked Sendable {
6+
// This is the client for the app to communicate with the privileged helper.
7+
@objc final class HelperXPCClient: NSObject, @unchecked Sendable {
78
private var svc: CoderVPNService
8-
private let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "AppXPCListener")
9+
private let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "HelperXPCClient")
910
private var connection: NSXPCConnection?
1011

1112
init(vpn: CoderVPNService) {
@@ -41,25 +42,7 @@ import VPNLib
4142
return connection
4243
}
4344

44-
func onPeerUpdate(_ diff: Data, reply: @escaping () -> Void) {
45-
let reply = CompletionWrapper(reply)
46-
Task { @MainActor in
47-
svc.onExtensionPeerUpdate(diff)
48-
reply()
49-
}
50-
}
51-
52-
func onProgress(stage: ProgressStage, downloadProgress: DownloadProgress?, reply: @escaping () -> Void) {
53-
let reply = CompletionWrapper(reply)
54-
Task { @MainActor in
55-
svc.onProgress(stage: stage, downloadProgress: downloadProgress)
56-
reply()
57-
}
58-
}
59-
}
60-
61-
// These methods are called to request updatess from the Helper.
62-
extension AppXPCListener {
45+
// Establishes a connection to the Helper, so it can send messages back.
6346
func ping() async throws {
6447
let conn = connect()
6548
return try await withCheckedThrowingContinuation { continuation in
@@ -98,3 +81,22 @@ extension AppXPCListener {
9881
}
9982
}
10083
}
84+
85+
// These methods are called by the Helper over XPC
86+
extension HelperXPCClient: AppXPCInterface {
87+
func onPeerUpdate(_ diff: Data, reply: @escaping () -> Void) {
88+
let reply = CompletionWrapper(reply)
89+
Task { @MainActor in
90+
svc.onExtensionPeerUpdate(diff)
91+
reply()
92+
}
93+
}
94+
95+
func onProgress(stage: ProgressStage, downloadProgress: DownloadProgress?, reply: @escaping () -> Void) {
96+
let reply = CompletionWrapper(reply)
97+
Task { @MainActor in
98+
svc.onProgress(stage: stage, downloadProgress: downloadProgress)
99+
reply()
100+
}
101+
}
102+
}

Coder-Desktop/Coder-Desktop/VPN/VPNService.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ enum VPNServiceError: Error, Equatable {
5454
@MainActor
5555
final class CoderVPNService: NSObject, VPNService {
5656
var logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "vpn")
57-
lazy var xpc: AppXPCListener = .init(vpn: self)
57+
lazy var xpc: HelperXPCClient = .init(vpn: self)
5858

5959
@Published var tunnelState: VPNServiceState = .disabled {
6060
didSet {

Coder-Desktop/Coder-Desktop/Views/LoginForm.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ struct LoginForm: View {
9090
return
9191
}
9292
// x.compare(y) is .orderedDescending if x > y
93-
guard SignatureValidator.minimumCoderVersion.compare(semver, options: .numeric) != .orderedDescending else {
93+
guard Validator.minimumCoderVersion.compare(semver, options: .numeric) != .orderedDescending else {
9494
loginError = .outdatedCoderVersion
9595
return
9696
}
@@ -221,7 +221,7 @@ enum LoginError: Error {
221221
"Invalid URL"
222222
case .outdatedCoderVersion:
223223
"""
224-
The Coder deployment must be version \(SignatureValidator.minimumCoderVersion)
224+
The Coder deployment must be version \(Validator.minimumCoderVersion)
225225
or higher to use Coder Desktop.
226226
"""
227227
case let .failedAuth(err):

Coder-Desktop/Coder-DesktopHelper/HelperXPCListeners.swift

Lines changed: 56 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import VPNLib
55

66
// This listener handles XPC connections from the Coder Desktop System Network
77
// Extension (`com.coder.Coder-Desktop.VPN`).
8-
class HelperNEXPCListener: NSObject, NSXPCListenerDelegate, HelperNEXPCInterface, @unchecked Sendable {
9-
private var logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "HelperNEXPCListener")
8+
class HelperNEXPCServer: NSObject, NSXPCListenerDelegate, @unchecked Sendable {
9+
private var logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "HelperNEXPCServer")
1010
private var conns: [NSXPCConnection] = []
1111

1212
// Hold a reference to the tun file handle
@@ -37,6 +37,43 @@ class HelperNEXPCListener: NSObject, NSXPCListenerDelegate, HelperNEXPCInterface
3737
return true
3838
}
3939

40+
func cancelProvider(error: Error?) async throws {
41+
try await withCheckedThrowingContinuation { continuation in
42+
guard let proxy = conns.last?.remoteObjectProxyWithErrorHandler({ err in
43+
self.logger.error("failed to connect to HelperNEXPC \(err.localizedDescription, privacy: .public)")
44+
continuation.resume(throwing: err)
45+
}) as? NEXPCInterface else {
46+
self.logger.error("failed to get proxy for HelperNEXPCInterface")
47+
continuation.resume(throwing: XPCError.wrongProxyType)
48+
return
49+
}
50+
proxy.cancelProvider(error: error) {
51+
self.logger.info("provider cancelled")
52+
continuation.resume()
53+
}
54+
} as Void
55+
}
56+
57+
func applyTunnelNetworkSettings(diff: Vpn_NetworkSettingsRequest) async throws {
58+
let bytes = try diff.serializedData()
59+
return try await withCheckedThrowingContinuation { continuation in
60+
guard let proxy = conns.last?.remoteObjectProxyWithErrorHandler({ err in
61+
self.logger.error("failed to connect to HelperNEXPC \(err.localizedDescription, privacy: .public)")
62+
continuation.resume(throwing: err)
63+
}) as? NEXPCInterface else {
64+
self.logger.error("failed to get proxy for HelperNEXPCInterface")
65+
continuation.resume(throwing: XPCError.wrongProxyType)
66+
return
67+
}
68+
proxy.applyTunnelNetworkSettings(diff: bytes) {
69+
self.logger.info("applied tunnel network setting")
70+
continuation.resume()
71+
}
72+
}
73+
}
74+
}
75+
76+
extension HelperNEXPCServer: HelperNEXPCInterface {
4077
func startDaemon(
4178
accessURL: URL,
4279
token: String,
@@ -88,49 +125,10 @@ class HelperNEXPCListener: NSObject, NSXPCListenerDelegate, HelperNEXPCInterface
88125
}
89126
}
90127

91-
// These methods are called to send updates to the Coder Desktop System Network
92-
// Extension.
93-
extension HelperNEXPCListener {
94-
func cancelProvider(error: Error?) async throws {
95-
try await withCheckedThrowingContinuation { continuation in
96-
guard let proxy = conns.last?.remoteObjectProxyWithErrorHandler({ err in
97-
self.logger.error("failed to connect to HelperNEXPC \(err.localizedDescription, privacy: .public)")
98-
continuation.resume(throwing: err)
99-
}) as? NEXPCInterface else {
100-
self.logger.error("failed to get proxy for HelperNEXPCInterface")
101-
continuation.resume(throwing: XPCError.wrongProxyType)
102-
return
103-
}
104-
proxy.cancelProvider(error: error) {
105-
self.logger.info("provider cancelled")
106-
continuation.resume()
107-
}
108-
} as Void
109-
}
110-
111-
func applyTunnelNetworkSettings(diff: Vpn_NetworkSettingsRequest) async throws {
112-
let bytes = try diff.serializedData()
113-
return try await withCheckedThrowingContinuation { continuation in
114-
guard let proxy = conns.last?.remoteObjectProxyWithErrorHandler({ err in
115-
self.logger.error("failed to connect to HelperNEXPC \(err.localizedDescription, privacy: .public)")
116-
continuation.resume(throwing: err)
117-
}) as? NEXPCInterface else {
118-
self.logger.error("failed to get proxy for HelperNEXPCInterface")
119-
continuation.resume(throwing: XPCError.wrongProxyType)
120-
return
121-
}
122-
proxy.applyTunnelNetworkSettings(diff: bytes) {
123-
self.logger.info("applied tunnel network setting")
124-
continuation.resume()
125-
}
126-
}
127-
}
128-
}
129-
130128
// This listener handles XPC connections from the Coder Desktop App
131129
// (`com.coder.Coder-Desktop`).
132-
class HelperAppXPCListener: NSObject, NSXPCListenerDelegate, HelperAppXPCInterface, @unchecked Sendable {
133-
private var logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "HelperAppXPCListener")
130+
class HelperAppXPCServer: NSObject, NSXPCListenerDelegate, @unchecked Sendable {
131+
private var logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "HelperAppXPCServer")
134132
private var conns: [NSXPCConnection] = []
135133

136134
override init() {
@@ -152,22 +150,6 @@ class HelperAppXPCListener: NSObject, NSXPCListenerDelegate, HelperAppXPCInterfa
152150
return true
153151
}
154152

155-
func getPeerState(with reply: @escaping (Data?) -> Void) {
156-
logger.info("getPeerState called")
157-
let reply = CallbackWrapper(reply)
158-
Task { @MainActor in
159-
let data = try? await globalManager?.getPeerState().serializedData()
160-
reply(data)
161-
}
162-
}
163-
164-
func ping(reply: @escaping () -> Void) {
165-
reply()
166-
}
167-
}
168-
169-
// These methods are called to send updates to the Coder Desktop App.
170-
extension HelperAppXPCListener {
171153
func onPeerUpdate(update: Vpn_PeerUpdate) async throws {
172154
let bytes = try update.serializedData()
173155
return try await withCheckedThrowingContinuation { continuation in
@@ -203,3 +185,18 @@ extension HelperAppXPCListener {
203185
} as Void
204186
}
205187
}
188+
189+
extension HelperAppXPCServer: HelperAppXPCInterface {
190+
func getPeerState(with reply: @escaping (Data?) -> Void) {
191+
logger.info("getPeerState called")
192+
let reply = CallbackWrapper(reply)
193+
Task { @MainActor in
194+
let data = try? await globalManager?.getPeerState().serializedData()
195+
reply(data)
196+
}
197+
}
198+
199+
func ping(reply: @escaping () -> Void) {
200+
reply()
201+
}
202+
}

Coder-Desktop/Coder-DesktopHelper/Manager.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ actor Manager {
5656
throw .serverInfo("invalid version: \(buildInfo.version)")
5757
}
5858
do {
59-
try SignatureValidator.validate(path: dest, expectedVersion: semver)
59+
try Validator.validate(path: dest, expectedVersion: semver)
6060
} catch {
6161
throw .validation(error)
6262
}
@@ -100,14 +100,14 @@ actor Manager {
100100
} catch {
101101
logger.error("tunnel read loop failed: \(error.localizedDescription, privacy: .public)")
102102
try await tunnelHandle.close()
103-
try await NEXPCListenerDelegate.cancelProvider(error:
103+
try await NEXPCServerDelegate.cancelProvider(error:
104104
makeNSError(suffix: "Manager", desc: "Tunnel read loop failed: \(error.localizedDescription)")
105105
)
106106
return
107107
}
108108
logger.info("tunnel read loop exited")
109109
try await tunnelHandle.close()
110-
try await NEXPCListenerDelegate.cancelProvider(error: nil)
110+
try await NEXPCServerDelegate.cancelProvider(error: nil)
111111
}
112112

113113
func handleMessage(_ msg: Vpn_TunnelMessage) {
@@ -117,7 +117,7 @@ actor Manager {
117117
}
118118
switch msgType {
119119
case .peerUpdate:
120-
Task { try? await appXPCListenerDelegate.onPeerUpdate(update: msg.peerUpdate) }
120+
Task { try? await appXPCServerDelegate.onPeerUpdate(update: msg.peerUpdate) }
121121
case let .log(logMsg):
122122
writeVpnLog(logMsg)
123123
case .networkSettings, .start, .stop:
@@ -133,7 +133,7 @@ actor Manager {
133133
switch msgType {
134134
case let .networkSettings(ns):
135135
do {
136-
try await NEXPCListenerDelegate.applyTunnelNetworkSettings(diff: ns)
136+
try await NEXPCServerDelegate.applyTunnelNetworkSettings(diff: ns)
137137
try? await rpc.sendReply(.with { resp in
138138
resp.networkSettings = .with { settings in
139139
settings.success = true
@@ -227,7 +227,7 @@ actor Manager {
227227
}
228228

229229
func pushProgress(stage: ProgressStage, downloadProgress: DownloadProgress? = nil) {
230-
Task { try? await appXPCListenerDelegate.onProgress(stage: stage, downloadProgress: downloadProgress) }
230+
Task { try? await appXPCServerDelegate.onProgress(stage: stage, downloadProgress: downloadProgress) }
231231
}
232232

233233
struct ManagerConfig {

Coder-Desktop/Coder-DesktopHelper/main.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import VPNLib
55

66
var globalManager: Manager?
77

8-
let NEXPCListenerDelegate = HelperNEXPCListener()
9-
let NEXPCListener = NSXPCListener(machServiceName: helperNEMachServiceName)
10-
NEXPCListener.delegate = NEXPCListenerDelegate
11-
NEXPCListener.resume()
8+
let NEXPCServerDelegate = HelperNEXPCServer()
9+
let NEXPCServer = NSXPCListener(machServiceName: helperNEMachServiceName)
10+
NEXPCServer.delegate = NEXPCServerDelegate
11+
NEXPCServer.resume()
1212

13-
let appXPCListenerDelegate = HelperAppXPCListener()
14-
let appXPCListener = NSXPCListener(machServiceName: helperAppMachServiceName)
15-
appXPCListener.delegate = appXPCListenerDelegate
16-
appXPCListener.resume()
13+
let appXPCServerDelegate = HelperAppXPCServer()
14+
let appXPCServer = NSXPCListener(machServiceName: helperAppMachServiceName)
15+
appXPCServer.delegate = appXPCServerDelegate
16+
appXPCServer.resume()
1717

1818
RunLoop.main.run()

Coder-Desktop/VPN/HelperXPCSpeaker.swift renamed to Coder-Desktop/VPN/NEHelperXPCClient.swift

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Foundation
22
import os
33
import VPNLib
44

5-
final class HelperXPCSpeaker: NEXPCInterface, @unchecked Sendable {
5+
final class HelperXPCClient: @unchecked Sendable {
66
var ptp: PacketTunnelProvider?
77
private var logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "HelperXPCSpeaker")
88
private var connection: NSXPCConnection?
@@ -34,29 +34,6 @@ final class HelperXPCSpeaker: NEXPCInterface, @unchecked Sendable {
3434
return connection
3535
}
3636

37-
func applyTunnelNetworkSettings(diff: Data, reply: @escaping () -> Void) {
38-
let reply = CompletionWrapper(reply)
39-
guard let diff = try? Vpn_NetworkSettingsRequest(serializedBytes: diff) else {
40-
reply()
41-
return
42-
}
43-
Task {
44-
try? await ptp?.applyTunnelNetworkSettings(diff)
45-
reply()
46-
}
47-
}
48-
49-
func cancelProvider(error: Error?, reply: @escaping () -> Void) {
50-
let reply = CompletionWrapper(reply)
51-
Task {
52-
ptp?.cancelTunnelWithError(error)
53-
reply()
54-
}
55-
}
56-
}
57-
58-
// These methods are called to start and stop the daemon run by the Helper.
59-
extension HelperXPCSpeaker {
6037
func startDaemon(accessURL: URL, token: String, tun: FileHandle, headers: Data?) async throws {
6138
let conn = connect()
6239
return try await withCheckedThrowingContinuation { continuation in
@@ -103,3 +80,26 @@ extension HelperXPCSpeaker {
10380
}
10481
}
10582
}
83+
84+
// These methods are called over XPC by the helper.
85+
extension HelperXPCClient: NEXPCInterface {
86+
func applyTunnelNetworkSettings(diff: Data, reply: @escaping () -> Void) {
87+
let reply = CompletionWrapper(reply)
88+
guard let diff = try? Vpn_NetworkSettingsRequest(serializedBytes: diff) else {
89+
reply()
90+
return
91+
}
92+
Task {
93+
try? await ptp?.applyTunnelNetworkSettings(diff)
94+
reply()
95+
}
96+
}
97+
98+
func cancelProvider(error: Error?, reply: @escaping () -> Void) {
99+
let reply = CompletionWrapper(reply)
100+
Task {
101+
ptp?.cancelTunnelWithError(error)
102+
reply()
103+
}
104+
}
105+
}

0 commit comments

Comments
 (0)