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) } }