Host-Key-Popup mit Fingerprint + ctty-run-Helper (Ctty fuer ssh-Prompts), Doku
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
import SwiftUI
|
||||
|
||||
/// Popup bei unbekanntem/geändertem Host-Key: Fingerprint prüfen, dann
|
||||
/// akzeptieren (→ known_hosts + verbinden) oder abbrechen.
|
||||
struct HostKeySheet: View {
|
||||
var info: HostKeyInfo
|
||||
var isChange: Bool
|
||||
var onAccept: () -> Void
|
||||
var onCancel: () -> Void
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
HStack(spacing: 10) {
|
||||
Image(systemName: isChange ? "exclamationmark.octagon.fill" : "key.fill")
|
||||
.font(.title)
|
||||
.foregroundStyle(isChange ? Dracula.red : Dracula.orange)
|
||||
VStack(alignment: .leading) {
|
||||
Text(isChange ? "Host-Key GEÄNDERT" : "Neuer Host-Key")
|
||||
.font(.headline)
|
||||
Text("\(info.host):\(info.port) · \(info.keyType)")
|
||||
.font(.subheadline).foregroundStyle(.secondary)
|
||||
}
|
||||
}
|
||||
|
||||
if isChange {
|
||||
Text("Warnung: Der gespeicherte Schlüssel passt NICHT zum Server. Das kann ein neu aufgesetzter Server sein — oder ein Angriff (MITM). Nur fortfahren, wenn du die Änderung erwartest!")
|
||||
.font(.callout).foregroundStyle(Dracula.red)
|
||||
} else {
|
||||
Text("Erstverbindung: Dieser Server ist noch unbekannt. Fingerprint prüfen (z. B. mit dem Server-Admin oder einer Terminal-Verbindung vergleichen), dann akzeptieren.")
|
||||
.font(.callout).foregroundStyle(.secondary)
|
||||
}
|
||||
|
||||
GroupBox("SHA256-Fingerprint") {
|
||||
Text(info.fingerprintSHA256)
|
||||
.font(.system(.body, design: .monospaced))
|
||||
.textSelection(.enabled)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
}
|
||||
GroupBox("MD5-Fingerprint") {
|
||||
Text(info.fingerprintMD5)
|
||||
.font(.system(.callout, design: .monospaced))
|
||||
.foregroundStyle(.secondary)
|
||||
.textSelection(.enabled)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
}
|
||||
|
||||
HStack {
|
||||
Button("Abbrechen", role: .cancel, action: onCancel)
|
||||
Spacer()
|
||||
Button(isChange ? "Trotzdem ersetzen & verbinden" : "Akzeptieren & verbinden", action: onAccept)
|
||||
.keyboardShortcut(.defaultAction)
|
||||
}
|
||||
}
|
||||
.padding(20)
|
||||
.frame(width: 480)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user