import Foundation import OpenDirectory // Lässt sich ein eingegebenes Passwort gegen die echte Anmeldung prüfen, ohne // es je zu speichern? // // Sapphire lässt sich das Anmeldepasswort geben und legt es in die Keychain. // Das ist nicht nötig — und ein gespeichertes Anmeldepasswort ist genau die // Sorte Sicherheitsschuld, die man nicht aufnehmen sollte, wenn es auch ohne // geht. // // **Hier wird ausdrücklich KEIN Passwort geprüft.** Der Spike stellt nur fest, // ob der Weg zum Benutzerdatensatz offensteht. Fehlversuche gegen ein echtes // Konto können Sperrfristen auslösen; das ist nichts, was ein Spike anrichten // darf. let user = NSUserName() print("Benutzer: \(user)") do { let node = try ODNode(session: ODSession.default(), type: ODNodeType(kODNodeTypeAuthentication)) print("Knoten: erreichbar") let record = try node.record(withRecordType: kODRecordTypeUsers, name: user, attributes: nil) print("Datensatz: gefunden") // Genau diese Methode würde die Prüfung machen — sie wird hier nicht gerufen. let selector = NSSelectorFromString("verifyPassword:error:") print("verifyPassword(_:): \(record.responds(to: selector) ? "vorhanden" : "FEHLT")") let names = try record.values(forAttribute: kODAttributeTypeFullName) as? [String] print("Vollständiger Name lesbar: \(names?.first != nil ? "ja" : "nein")") print("\nBefund: Der Weg steht offen. Ein eingegebenes Passwort lässt sich") print("gegen die echte Anmeldung prüfen, ohne es irgendwo abzulegen.") } catch { print("FEHLER: \(error.localizedDescription)") print("Dann bliebe nur Authorization Services — oder, schlimmstenfalls, das") print("Speichern des Passworts. Letzteres wäre ein Grund, die Funktion zu lassen.") }