Files

66 lines
2.7 KiB
Swift

import SwiftUI
/// Sheet-Request (Identifiable): .sheet(item:) rendert IMMER mit Wert —
/// ein `if let` im Sheet kann den Empty-Zweig nehmen und bleibt dann leer.
struct HostKeyRequest: Identifiable {
let id = UUID()
var info: HostKeyInfo
var isChange: Bool
}
/// 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)
}
}