58 lines
2.4 KiB
Swift
58 lines
2.4 KiB
Swift
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)
|
|
}
|
|
}
|