From 3fd4ff76f72a29437a0a00e9b3346e74e4bbef74 Mon Sep 17 00:00:00 2001 From: Sven Date: Sun, 12 Apr 2026 18:43:55 +0200 Subject: [PATCH] https issue erledigt --- .DS_Store | Bin 8196 -> 8196 bytes .../UserInterfaceState.xcuserstate | Bin 37779 -> 43560 bytes dock-g/dock-g/Models/DockgeServer.swift | 10 +++++++- dock-g/dock-g/Services/SocketIOClient.swift | 3 +++ .../dock-g/Views/Servers/AddServerView.swift | 12 ++++++++- dock-g/dock-g/Views/Servers/LoginView.swift | 23 +++++++++++++++--- 6 files changed, 43 insertions(+), 5 deletions(-) diff --git a/.DS_Store b/.DS_Store index 769c722faa096b321a7b0416ce5662bfa2e9df64..d36304b0b545c002645124fbc98d98e6553ce892 100644 GIT binary patch delta 44 zcmZp1XmOa}&&akhU^hP_+h!gC6-LgK;^ds9{QMk-%{+qV*fz6Ed}G;sL4=(d05K^I Ap#T5? delta 40 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 diff --git a/dock-g/dock-g/Models/DockgeServer.swift b/dock-g/dock-g/Models/DockgeServer.swift index ccc1561..92640dd 100644 --- a/dock-g/dock-g/Models/DockgeServer.swift +++ b/dock-g/dock-g/Models/DockgeServer.swift @@ -15,7 +15,15 @@ struct DockgeServer: Identifiable, Codable { var baseURL: URL? { let scheme = useSSL ? "https" : "http" - return URL(string: "\(scheme)://\(host)") + var cleanHost = host.trimmingCharacters(in: .whitespaces) + for prefix in ["https://", "http://"] { + if cleanHost.lowercased().hasPrefix(prefix) { + cleanHost = String(cleanHost.dropFirst(prefix.count)) + break + } + } + cleanHost = cleanHost.trimmingCharacters(in: CharacterSet(charactersIn: "/")) + return URL(string: "\(scheme)://\(cleanHost)") } var displayHost: String { host } diff --git a/dock-g/dock-g/Services/SocketIOClient.swift b/dock-g/dock-g/Services/SocketIOClient.swift index b6bef78..f921540 100644 --- a/dock-g/dock-g/Services/SocketIOClient.swift +++ b/dock-g/dock-g/Services/SocketIOClient.swift @@ -153,6 +153,9 @@ final class SocketIOClient: NSObject { Task { @MainActor [weak self] in guard let self else { return } self.connectionState = .disconnected + self.webSocketTask?.cancel(with: .goingAway, reason: nil) + self.webSocketTask = nil + self.pendingAcks.removeAll() self.errorHandlers.forEach { $0(error) } self.disconnectHandlers.forEach { $0() } } diff --git a/dock-g/dock-g/Views/Servers/AddServerView.swift b/dock-g/dock-g/Views/Servers/AddServerView.swift index 72d7433..db80431 100644 --- a/dock-g/dock-g/Views/Servers/AddServerView.swift +++ b/dock-g/dock-g/Views/Servers/AddServerView.swift @@ -62,7 +62,17 @@ struct AddServerView: View { } private func save() { - let trimmedHost = host.trimmingCharacters(in: .whitespaces) + var trimmedHost = host.trimmingCharacters(in: .whitespaces) + // Strip any scheme the user may have pasted in + if trimmedHost.lowercased().hasPrefix("https://") { + trimmedHost = String(trimmedHost.dropFirst("https://".count)) + useSSL = true + } else if trimmedHost.lowercased().hasPrefix("http://") { + trimmedHost = String(trimmedHost.dropFirst("http://".count)) + useSSL = false + } + // Strip trailing slash + trimmedHost = trimmedHost.trimmingCharacters(in: CharacterSet(charactersIn: "/")) if var existing = editingServer { existing.name = name.trimmingCharacters(in: .whitespaces) existing.host = trimmedHost diff --git a/dock-g/dock-g/Views/Servers/LoginView.swift b/dock-g/dock-g/Views/Servers/LoginView.swift index b348a67..ea5bc72 100644 --- a/dock-g/dock-g/Views/Servers/LoginView.swift +++ b/dock-g/dock-g/Views/Servers/LoginView.swift @@ -7,6 +7,7 @@ struct LoginView: View { @Environment(\.dismiss) private var dismiss @State private var username = "" @State private var password = "" + @State private var showPassword = false @State private var twoFAToken = "" @State private var showTwoFA = false @State private var showSetup = false @@ -53,10 +54,26 @@ struct LoginView: View { .padding() .background(Color.appSurface, in: RoundedRectangle(cornerRadius: 10)) - SecureField("Password", text: $password) + HStack { + Group { + if showPassword { + TextField("Password", text: $password) + } else { + SecureField("Password", text: $password) + } + } .textFieldStyle(.plain) - .padding() - .background(Color.appSurface, in: RoundedRectangle(cornerRadius: 10)) + .autocorrectionDisabled() + .textInputAutocapitalization(.never) + Button { + showPassword.toggle() + } label: { + Image(systemName: showPassword ? "eye.slash" : "eye") + .foregroundStyle(.appGray) + } + } + .padding() + .background(Color.appSurface, in: RoundedRectangle(cornerRadius: 10)) if showTwoFA { TextField("2FA Code", text: $twoFAToken)