added a keymanager and keymanagerview, can ontly generate 4096 rsa rn

uses seckey
This commit is contained in:
neon443
2025-06-20 10:31:22 +01:00
parent 5747fe5395
commit 86dd316e33
9 changed files with 301 additions and 143 deletions

View File

@@ -9,151 +9,28 @@ import SwiftUI
struct ContentView: View {
@ObservedObject var handler: SSHHandler
@State var passphrase: String = ""
@State var pubkeyStr: String = ""
@State var privkeyStr: String = ""
@State var pubkey: Data?
@State var privkey: Data?
@State var privPickerPresented: Bool = false
@State var pubPickerPresented: Bool = false
@ObservedObject var keyManager: KeyManager
var body: some View {
NavigationStack {
List {
HStack {
TextField("", text: $pubkeyStr, prompt: Text("Public Key"))
.onSubmit {
pubkey = Data(pubkeyStr.utf8)
}
Button() {
pubPickerPresented.toggle()
} label: {
Image(systemName: "folder")
}
.buttonStyle(.plain)
.fileImporter(isPresented: $pubPickerPresented, allowedContentTypes: [.item, .content, .data]) { (Result) in
do {
let fileURL = try Result.get()
pubkey = try! Data(contentsOf: fileURL)
print(fileURL)
} catch {
print(error.localizedDescription)
}
}
}
HStack {
TextField("", text: $privkeyStr, prompt: Text("Private Key"))
.onSubmit {
privkey = Data(privkeyStr.utf8)
}
Button() {
privPickerPresented.toggle()
} label: {
Image(systemName: "folder")
}
.buttonStyle(.plain)
.fileImporter(isPresented: $privPickerPresented, allowedContentTypes: [.item, .content, .data]) { (Result) in
do {
let fileURL = try Result.get()
privkey = try! Data(contentsOf: fileURL)
print(fileURL)
} catch {
print(error.localizedDescription)
}
}
}
TextField("", text: $passphrase)
HStack {
Text(handler.connected ? "connected" : "not connected")
.modifier(foregroundColorStyle(handler.connected ? .green : .red))
Text(handler.authorized ? "authorized" : "unauthorized")
.modifier(foregroundColorStyle(handler.authorized ? .green : .red))
}
// if let testSucceded = testSucceded {
// Image(systemName: testSucceded ? "checkmark.circle" : "xmark.circle")
// .modifier(foregroundColorStyle(testSucceded ? .green : .red))
// }
if handler.host.key != nil {
Text("Hostkey: \(handler.host.key!.base64EncodedString())")
}
TextField("address", text: $handler.host.address)
.textFieldStyle(.roundedBorder)
TextField(
"port",
text: Binding(
get: { String(handler.host.port) },
set: { handler.host.port = Int($0) ?? 22} )
)
.keyboardType(.numberPad)
.textFieldStyle(.roundedBorder)
TextField("username", text: $handler.host.username)
.textFieldStyle(.roundedBorder)
SecureField("password", text: $handler.host.password)
.textFieldStyle(.roundedBorder)
if handler.connected {
Button() {
handler.disconnect()
} label: {
Label("Disconnect", systemImage: "xmark.app.fill")
}
} else {
Button() {
handler.connect()
if pubkey != nil && privkey != nil {
handler.authWithPubkey(pub: pubkey!, priv: privkey!, pass: passphrase)
} else {
let _ = handler.authWithPw()
}
handler.openShell()
} label: {
Label("Connect", systemImage: "powerplug.portrait")
}
.disabled(
pubkey == nil && privkey == nil ||
handler.host.username.isEmpty && handler.host.password.isEmpty
)
}
NavigationLink() {
TerminalView(handler: handler)
} label: {
Label("Open Terminal", systemImage: "apple.terminal")
}
.disabled(!(handler.connected && handler.authorized))
Button() {
withAnimation { handler.testExec() }
} label: {
if handler.testSuceeded {
Image(systemName: handler.testSuceeded ? "checkmark.circle" : "xmark.circle")
.modifier(foregroundColorStyle(handler.testSuceeded ? .green : .red))
} else {
Label("Test Connection", systemImage: "checkmark")
}
}
.disabled(!(handler.connected && handler.authorized))
TabView {
ConnectionView(
handler: handler,
keyManager: keyManager
)
.tabItem {
Label("Connection", systemImage: "powerplug.portrait")
}
.transition(.opacity)
KeyManagerView(keyManager: keyManager)
.tabItem {
Label("Keys", systemImage: "key.2.on.ring")
}
}
}
}
#Preview {
ContentView(
handler: SSHHandler(host: debugHost())
handler: SSHHandler(host: debugHost()),
keyManager: KeyManager()
)
}