refactor: centralize gateway parsing
This commit is contained in:
@@ -89,11 +89,10 @@ struct GatewayDiscoveryInlineList: View {
|
|||||||
let host = self.sanitizedTailnetHost(gateway.tailnetDns) ?? gateway.lanHost
|
let host = self.sanitizedTailnetHost(gateway.tailnetDns) ?? gateway.lanHost
|
||||||
guard let host else { return nil }
|
guard let host else { return nil }
|
||||||
let user = NSUserName()
|
let user = NSUserName()
|
||||||
var target = "\(user)@\(host)"
|
return GatewayDiscoveryModel.buildSSHTarget(
|
||||||
if gateway.sshPort != 22 {
|
user: user,
|
||||||
target += ":\(gateway.sshPort)"
|
host: host,
|
||||||
}
|
port: gateway.sshPort)
|
||||||
return target
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func sanitizedTailnetHost(_ host: String?) -> String? {
|
private func sanitizedTailnetHost(_ host: String?) -> String? {
|
||||||
|
|||||||
@@ -117,31 +117,9 @@ final class GatewayDiscoveryModel {
|
|||||||
let prettyName =
|
let prettyName =
|
||||||
advertisedName ?? Self.prettifyServiceName(decodedName)
|
advertisedName ?? Self.prettifyServiceName(decodedName)
|
||||||
|
|
||||||
var lanHost: String?
|
let parsedTXT = Self.parseGatewayTXT(txt)
|
||||||
var tailnetDns: String?
|
|
||||||
var sshPort = 22
|
|
||||||
var cliPath: String?
|
|
||||||
|
|
||||||
if let value = txt["lanHost"] {
|
if parsedTXT.lanHost == nil || parsedTXT.tailnetDns == nil {
|
||||||
let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
||||||
lanHost = trimmed.isEmpty ? nil : trimmed
|
|
||||||
}
|
|
||||||
if let value = txt["tailnetDns"] {
|
|
||||||
let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
||||||
tailnetDns = trimmed.isEmpty ? nil : trimmed
|
|
||||||
}
|
|
||||||
if let value = txt["sshPort"],
|
|
||||||
let parsed = Int(value.trimmingCharacters(in: .whitespacesAndNewlines)),
|
|
||||||
parsed > 0
|
|
||||||
{
|
|
||||||
sshPort = parsed
|
|
||||||
}
|
|
||||||
if let value = txt["cliPath"] {
|
|
||||||
let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
||||||
cliPath = trimmed.isEmpty ? nil : trimmed
|
|
||||||
}
|
|
||||||
|
|
||||||
if lanHost == nil || tailnetDns == nil {
|
|
||||||
self.ensureTXTResolution(
|
self.ensureTXTResolution(
|
||||||
stableID: stableID,
|
stableID: stableID,
|
||||||
serviceName: name,
|
serviceName: name,
|
||||||
@@ -150,17 +128,17 @@ final class GatewayDiscoveryModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let isLocal = Self.isLocalGateway(
|
let isLocal = Self.isLocalGateway(
|
||||||
lanHost: lanHost,
|
lanHost: parsedTXT.lanHost,
|
||||||
tailnetDns: tailnetDns,
|
tailnetDns: parsedTXT.tailnetDns,
|
||||||
displayName: prettyName,
|
displayName: prettyName,
|
||||||
serviceName: decodedName,
|
serviceName: decodedName,
|
||||||
local: self.localIdentity)
|
local: self.localIdentity)
|
||||||
return DiscoveredGateway(
|
return DiscoveredGateway(
|
||||||
displayName: prettyName,
|
displayName: prettyName,
|
||||||
lanHost: lanHost,
|
lanHost: parsedTXT.lanHost,
|
||||||
tailnetDns: tailnetDns,
|
tailnetDns: parsedTXT.tailnetDns,
|
||||||
sshPort: sshPort,
|
sshPort: parsedTXT.sshPort,
|
||||||
cliPath: cliPath,
|
cliPath: parsedTXT.cliPath,
|
||||||
stableID: stableID,
|
stableID: stableID,
|
||||||
debugID: BridgeEndpointID.prettyDescription(result.endpoint),
|
debugID: BridgeEndpointID.prettyDescription(result.endpoint),
|
||||||
isLocal: isLocal)
|
isLocal: isLocal)
|
||||||
@@ -228,6 +206,44 @@ final class GatewayDiscoveryModel {
|
|||||||
return merged
|
return merged
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static func parseGatewayTXT(_ txt: [String: String])
|
||||||
|
-> (lanHost: String?, tailnetDns: String?, sshPort: Int, cliPath: String?)
|
||||||
|
{
|
||||||
|
var lanHost: String?
|
||||||
|
var tailnetDns: String?
|
||||||
|
var sshPort = 22
|
||||||
|
var cliPath: String?
|
||||||
|
|
||||||
|
if let value = txt["lanHost"] {
|
||||||
|
let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
lanHost = trimmed.isEmpty ? nil : trimmed
|
||||||
|
}
|
||||||
|
if let value = txt["tailnetDns"] {
|
||||||
|
let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
tailnetDns = trimmed.isEmpty ? nil : trimmed
|
||||||
|
}
|
||||||
|
if let value = txt["sshPort"],
|
||||||
|
let parsed = Int(value.trimmingCharacters(in: .whitespacesAndNewlines)),
|
||||||
|
parsed > 0
|
||||||
|
{
|
||||||
|
sshPort = parsed
|
||||||
|
}
|
||||||
|
if let value = txt["cliPath"] {
|
||||||
|
let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
cliPath = trimmed.isEmpty ? nil : trimmed
|
||||||
|
}
|
||||||
|
|
||||||
|
return (lanHost, tailnetDns, sshPort, cliPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func buildSSHTarget(user: String, host: String, port: Int) -> String {
|
||||||
|
var target = "\(user)@\(host)"
|
||||||
|
if port != 22 {
|
||||||
|
target += ":\(port)"
|
||||||
|
}
|
||||||
|
return target
|
||||||
|
}
|
||||||
|
|
||||||
private func ensureTXTResolution(
|
private func ensureTXTResolution(
|
||||||
stableID: String,
|
stableID: String,
|
||||||
serviceName: String,
|
serviceName: String,
|
||||||
|
|||||||
@@ -612,11 +612,10 @@ extension GeneralSettings {
|
|||||||
let host = gateway.tailnetDns ?? gateway.lanHost
|
let host = gateway.tailnetDns ?? gateway.lanHost
|
||||||
guard let host else { return }
|
guard let host else { return }
|
||||||
let user = NSUserName()
|
let user = NSUserName()
|
||||||
var target = "\(user)@\(host)"
|
self.state.remoteTarget = GatewayDiscoveryModel.buildSSHTarget(
|
||||||
if gateway.sshPort != 22 {
|
user: user,
|
||||||
target += ":\(gateway.sshPort)"
|
host: host,
|
||||||
}
|
port: gateway.sshPort)
|
||||||
self.state.remoteTarget = target
|
|
||||||
self.state.remoteCliPath = gateway.cliPath ?? ""
|
self.state.remoteCliPath = gateway.cliPath ?? ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -454,11 +454,10 @@ struct OnboardingView: View {
|
|||||||
|
|
||||||
if let host = gateway.tailnetDns ?? gateway.lanHost {
|
if let host = gateway.tailnetDns ?? gateway.lanHost {
|
||||||
let user = NSUserName()
|
let user = NSUserName()
|
||||||
var target = "\(user)@\(host)"
|
self.state.remoteTarget = GatewayDiscoveryModel.buildSSHTarget(
|
||||||
if gateway.sshPort != 22 {
|
user: user,
|
||||||
target += ":\(gateway.sshPort)"
|
host: host,
|
||||||
}
|
port: gateway.sshPort)
|
||||||
self.state.remoteTarget = target
|
|
||||||
}
|
}
|
||||||
self.state.remoteCliPath = gateway.cliPath ?? ""
|
self.state.remoteCliPath = gateway.cliPath ?? ""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user