diff --git a/ShhShell/SSH/SSHHandler.swift b/ShhShell/SSH/SSHHandler.swift index 8bff2c8..47494fd 100644 --- a/ShhShell/SSH/SSHHandler.swift +++ b/ShhShell/SSH/SSHHandler.swift @@ -164,16 +164,25 @@ class SSHHandler: ObservableObject { return } - func authWithPubkey() -> Bool { - var status: CInt - status = ssh_userauth_publickey_auto(session, nil, nil) - if status == SSH_AUTH_ERROR.rawValue { - print("pubkey auth failed") - logSshGetError() - return false - } - withAnimation { authorized = true } - return true + func authWithPubkey(pub: String, priv: String, pass: String) { + let fileManager = FileManager.default + let tempDir = fileManager.temporaryDirectory + let tempPubkey = tempDir.appendingPathComponent("key.pub") + let tempKey = tempDir.appendingPathComponent("key") + + fileManager.createFile(atPath: tempPubkey.path(), contents: nil) + fileManager.createFile(atPath: tempKey.path(), contents: nil) + + try? pub.data(using: .utf8)?.write(to: tempPubkey) + try? priv.data(using: .utf8)?.write(to: tempKey) + + var pubkey: ssh_key? + ssh_pki_import_pubkey_file(tempPubkey.path(), &pubkey) + let status = ssh_userauth_try_publickey(session, nil, pubkey) + print(status) + + var privkey: ssh_key? + ssh_pki_import_privkey_file(tempKey.path(), pass, nil, nil, &privkey) } func authWithPw() -> Bool { diff --git a/ShhShell/Views/ContentView.swift b/ShhShell/Views/ContentView.swift index 6d6b54b..ceade9a 100644 --- a/ShhShell/Views/ContentView.swift +++ b/ShhShell/Views/ContentView.swift @@ -9,11 +9,17 @@ import SwiftUI struct ContentView: View { @ObservedObject var handler: SSHHandler -// @State var connected: Bool = false + + @State var pubkey: String = "" + @State var privkey: String = "" + @State var passphrase: String = "" var body: some View { NavigationStack { List { + TextField("", text: $pubkey) + TextField("", text: $privkey) + TextField("", text: $passphrase) HStack { Text(handler.connected ? "connected" : "not connected") .modifier(foregroundColorStyle(handler.connected ? .green : .red)) @@ -46,12 +52,16 @@ struct ContentView: View { TextField("username", text: $handler.host.username) .textFieldStyle(.roundedBorder) - TextField("password", text: $handler.host.password) + SecureField("password", text: $handler.host.password) .textFieldStyle(.roundedBorder) Button() { handler.connect() - let _ = handler.authWithPw() + if !pubkey.isEmpty && !privkey.isEmpty { + handler.authWithPubkey(pub: pubkey, priv: privkey, pass: passphrase) + } else { + let _ = handler.authWithPw() + } handler.openShell() } label: { Label("Connect", systemImage: "powerplug.portrait")