From 01d569a85996f39bfdd88e1db574154f08b5c5a9 Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Mon, 23 Jun 2025 10:19:49 +0100 Subject: [PATCH] mainacotr for sshhandler added a cleanup to run after 10s clearing memory for keys and files remove timer code remove write(1 to stop console echo open links image -> systemImage --- ShhShell/SSH/SSHHandler.swift | 46 +++++++------------ ShhShell/Views/Terminal/SSHTerminalView.swift | 5 +- ShhShell/Views/Terminal/ShellView.swift | 2 +- 3 files changed, 22 insertions(+), 31 deletions(-) diff --git a/ShhShell/SSH/SSHHandler.swift b/ShhShell/SSH/SSHHandler.swift index d979a8e..64c3ce4 100644 --- a/ShhShell/SSH/SSHHandler.swift +++ b/ShhShell/SSH/SSHHandler.swift @@ -10,18 +10,18 @@ import LibSSH import OSLog import SwiftUI +@MainActor class SSHHandler: ObservableObject { private var session: ssh_session? private var channel: ssh_channel? - private var readTimer: Timer? - @Published var connected: Bool = false - @Published var authorized: Bool = false - @Published var testSuceeded: Bool? = nil + @MainActor @Published var connected: Bool = false + @MainActor @Published var authorized: Bool = false + @MainActor @Published var testSuceeded: Bool? = nil - @Published var bell: UUID? + @MainActor @Published var bell: UUID? - @Published var host: Host + @MainActor @Published var host: Host private let userDefaults = NSUbiquitousKeyValueStore.default private let logger = Logger(subsystem: "xy", category: "sshHandler") @@ -208,14 +208,17 @@ class SSHHandler: ObservableObject { return } - withAnimation { authorized = true } - return //if u got this far, youre authed! - //cleanpu here: - //ssh_key_free(pubkey) - //ssh_key_free(privkey) - //try? fileManager.removeItem(at: tempPubkey) - //try? fileManager.removeItem(at: tempKey) + withAnimation { authorized = true } + + DispatchQueue.main.asyncAfter(deadline: .now()+10) { + ssh_key_free(pubkey) + ssh_key_free(privkey) + try? fileManager.removeItem(at: tempPubkey) + try? fileManager.removeItem(at: tempKey) + } + + return } func authWithPw() -> Bool { @@ -297,20 +300,6 @@ class SSHHandler: ObservableObject { status = ssh_channel_request_shell(self.channel) guard status == SSH_OK else { return } - - self.readTimer = Timer(timeInterval: 0.1, repeats: true) { timer in - guard self.connected else { - timer.invalidate() - self.readTimer = nil - return - } - guard ssh_channel_is_open(self.channel) != 0 && ssh_channel_is_eof(self.channel) == 0 else { - timer.invalidate() - self.readTimer = nil - return - } - } -// RunLoop.main.add(self.readTimer!, forMode: .common) } func readFromChannel() -> String? { @@ -321,9 +310,8 @@ class SSHHandler: ObservableObject { let nbytes = ssh_channel_read_nonblocking(channel, &buffer, UInt32(buffer.count), 0) guard nbytes > 0 else { return nil } - write(1, buffer, Int(nbytes)) - let data = Data(bytes: buffer, count: buffer.count) + let data = Data(bytes: buffer, count: Int(nbytes)) if let string = String(data: data, encoding: .utf8) { return string } diff --git a/ShhShell/Views/Terminal/SSHTerminalView.swift b/ShhShell/Views/Terminal/SSHTerminalView.swift index e595fe1..936ca41 100644 --- a/ShhShell/Views/Terminal/SSHTerminalView.swift +++ b/ShhShell/Views/Terminal/SSHTerminalView.swift @@ -6,6 +6,7 @@ // import Foundation +import UIKit import SwiftTerm class SSHTerminalView: TerminalView, TerminalViewDelegate { @@ -65,7 +66,9 @@ class SSHTerminalView: TerminalView, TerminalViewDelegate { } public func requestOpenLink(source: TerminalView, link: String, params: [String : String]) { - print("open link \(link) \(params)") + guard let url = URL(string: link) else { return } + guard UIApplication.shared.canOpenURL(url) else { return } + UIApplication.shared.open(url, options: [:]) } public func rangeChanged(source: TerminalView, startY: Int, endY: Int) { diff --git a/ShhShell/Views/Terminal/ShellView.swift b/ShhShell/Views/Terminal/ShellView.swift index 53415a4..6436981 100644 --- a/ShhShell/Views/Terminal/ShellView.swift +++ b/ShhShell/Views/Terminal/ShellView.swift @@ -25,7 +25,7 @@ struct ShellView: View { } } label: { if handler.connected { - Label("Disconnect", image: "xmark.square.fill") + Label("Disconnect", systemImage: "xmark.square.fill") } else { Label("Connect", image: "power") }