









@@ -20,6 +20,47 @@ import UIKit
2020@MainActor
2121@Observable
2222final class GatewayConnectionController {
23+struct ManualAuthOverride: Equatable {
24+let token: String?
25+let bootstrapToken: String?
26+let password: String?
27+28+static func explicit(
29+ token: String?,
30+ bootstrapToken: String?,
31+ password: String?) -> ManualAuthOverride
32+{
33+let trimmedToken = token?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
34+let trimmedBootstrapToken = bootstrapToken?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
35+let trimmedPassword = password?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
36+return ManualAuthOverride(
37+ token: trimmedToken.isEmpty ? nil : trimmedToken,
38+ bootstrapToken: trimmedBootstrapToken.isEmpty ? nil : trimmedBootstrapToken,
39+ password: trimmedPassword.isEmpty ? nil : trimmedPassword)
40+}
41+42+static func normalized(
43+ token: String?,
44+ bootstrapToken: String?,
45+ password: String?) -> ManualAuthOverride?
46+{
47+let override = ManualAuthOverride.explicit(
48+ token: token,
49+ bootstrapToken: bootstrapToken,
50+ password: password)
51+guard override.token != nil || override.bootstrapToken != nil || override.password != nil
52+else { return nil }
53+return override
54+}
55+}
56+57+private struct PendingTrustConnect {
58+let url: URL
59+let stableID: String
60+let isManual: Bool
61+let authOverride: ManualAuthOverride?
62+}
63+2364struct TrustPrompt: Identifiable, Equatable {
2465let stableID: String
2566let gatewayName: String
@@ -42,7 +83,7 @@ final class GatewayConnectionController {
4283private weak var appModel: NodeAppModel?
4384private var didAutoConnect = false
4485private var pendingServiceResolvers: [String: GatewayServiceResolver] = [:]
45-private var pendingTrustConnect: (url: URL, stableID: String, isManual: Bool)?
86+private var pendingTrustConnect: PendingTrustConnect?
46874788init(appModel: NodeAppModel, startDiscovery: Bool = true) {
4889self.appModel = appModel
@@ -125,7 +166,11 @@ final class GatewayConnectionController {
125166guard let fp = await self.probeTLSFingerprint(url: url) else {
126167return "Failed to read TLS fingerprint from discovered gateway."
127168}
128-self.pendingTrustConnect = (url: url, stableID: stableID, isManual: false)
169+self.pendingTrustConnect = PendingTrustConnect(
170+ url: url,
171+ stableID: stableID,
172+ isManual: false,
173+ authOverride: nil)
129174self.pendingTrustPrompt = TrustPrompt(
130175 stableID: stableID,
131176 gatewayName: gateway.name,
@@ -162,12 +207,23 @@ final class GatewayConnectionController {
162207 _ = await self.connectWithDiagnostics(gateway)
163208}
164209165-func connectManual(host: String, port: Int, useTLS: Bool) async {
166-let instanceId = UserDefaults.standard.string(forKey: "node.instanceId")?
167-.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
168-let token = GatewaySettingsStore.loadGatewayToken(instanceId: instanceId)
169-let bootstrapToken = GatewaySettingsStore.loadGatewayBootstrapToken(instanceId: instanceId)
170-let password = GatewaySettingsStore.loadGatewayPassword(instanceId: instanceId)
210+func connectManual(
211+ host: String,
212+ port: Int,
213+ useTLS: Bool,
214+ authOverride: ManualAuthOverride? = nil) async
215+{
216+let instanceId = GatewaySettingsStore.currentInstanceID()
217+let token =
218+ authOverride.map(\.token) ?? GatewaySettingsStore.loadGatewayToken(instanceId: instanceId)
219+let bootstrapToken =
220+ authOverride.map(\.bootstrapToken) ?? GatewaySettingsStore.loadGatewayBootstrapToken(instanceId: instanceId)
221+let password =
222+ authOverride.map(\.password) ?? GatewaySettingsStore.loadGatewayPassword(instanceId: instanceId)
223+let pendingAuthOverride = authOverride ?? ManualAuthOverride.normalized(
224+ token: token,
225+ bootstrapToken: bootstrapToken,
226+ password: password)
171227let resolvedUseTLS = self.resolveManualUseTLS(host: host, useTLS: useTLS)
172228guard let resolvedPort = self.resolveManualPort(host: host, port: port, useTLS: resolvedUseTLS)
173229else { return }
@@ -181,7 +237,11 @@ final class GatewayConnectionController {
181237+ "Remote gateways must use HTTPS/WSS."
182238return
183239}
184-self.pendingTrustConnect = (url: url, stableID: stableID, isManual: true)
240+self.pendingTrustConnect = PendingTrustConnect(
241+ url: url,
242+ stableID: stableID,
243+ isManual: true,
244+ authOverride: pendingAuthOverride)
185245self.pendingTrustPrompt = TrustPrompt(
186246 stableID: stableID,
187247 gatewayName: "\(host):\(resolvedPort)",
@@ -269,11 +329,14 @@ final class GatewayConnectionController {
269329GatewaySettingsStore.saveLastGatewayConnectionDiscovered(stableID: pending.stableID, useTLS: true)
270330}
271331272-let instanceId = UserDefaults.standard.string(forKey: "node.instanceId")?
273-.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
274-let token = GatewaySettingsStore.loadGatewayToken(instanceId: instanceId)
275-let bootstrapToken = GatewaySettingsStore.loadGatewayBootstrapToken(instanceId: instanceId)
276-let password = GatewaySettingsStore.loadGatewayPassword(instanceId: instanceId)
332+let instanceId = GatewaySettingsStore.currentInstanceID()
333+let token =
334+ pending.authOverride.map(\.token) ?? GatewaySettingsStore.loadGatewayToken(instanceId: instanceId)
335+let bootstrapToken =
336+ pending.authOverride.map(\.bootstrapToken) ?? GatewaySettingsStore.loadGatewayBootstrapToken(
337+ instanceId: instanceId)
338+let password =
339+ pending.authOverride.map(\.password) ?? GatewaySettingsStore.loadGatewayPassword(instanceId: instanceId)
277340let tlsParams = GatewayTLSParams(
278341 required: true,
279342 expectedFingerprint: prompt.fingerprintSha256,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。