Ein eigener Sperrbildschirm — und ohne gespeichertes Passwort
Kameraaufnahme, Anlernen über drei Posen, Fenster je Bildschirm auf Bildschirmschoner-Ebene, Passwortrückfall. **Das Anmeldepasswort wird nicht gespeichert.** Ein Spike hat den Weg freigeräumt: `ODRecord.verifyPassword` ist öffentliche API, die Eingabe geht direkt hinein, das Ergebnis ist ein `Bool`, danach ist die Zeichenkette wieder weg. Damit fällt der Grund weg, aus dem vergleichbare Programme sich das Passwort geben lassen und in die Keychain legen. Angelernt wird über drei Posen mit je fünf Aufnahmen. Der Merkmalsvektor ist ein allgemeiner Bildmerkmalsvektor und kein Gesichtsmerkmal — er reagiert auf Kopfhaltung und Beleuchtung mit. Eine einzige Aufnahme beschreibt genau eine Haltung bei genau einem Licht. Die Vektoren liegen in der Keychain, nicht in einer Datei: aus ihnen lässt sich kein Bild zurückgewinnen, aber wer sie hat, kann prüfen, ob eine bestimmte Person vor der Kamera stand. Die Einschränkung steht auf dem Sperrbildschirm selbst und nicht im Kleingedruckten: Bequemlichkeit, keine Sicherheitsgrenze; der Vergleich läuft über die Webcam und lässt sich mit einem Foto täuschen. Wer sich darauf verlässt, tut es dort. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3da673662f
commit
e3b215a1dd
@@ -13,6 +13,8 @@ import NetworkProvider
|
||||
import AudioProvider
|
||||
import ShelfProvider
|
||||
import ClipboardProvider
|
||||
import LockProvider
|
||||
import FaceProvider
|
||||
import NotesProvider
|
||||
import ActivityProvider
|
||||
import OSLog
|
||||
@@ -59,6 +61,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
/// Die Helligkeit des eingebauten Bildschirms. Auf Rechnern ohne lesbare
|
||||
/// Helligkeit bleibt sie leer und meldet nie etwas.
|
||||
private let brightness = DisplayBrightness()
|
||||
/// Der Sperrbildschirm. Steht bereit, sperrt aber nur auf Verlangen.
|
||||
private let lockController = LockController()
|
||||
/// Der zuletzt gemeldete Stand — der erste meldet nichts, sonst begrüßte
|
||||
/// Onyx jeden Start mit der Helligkeit, die ohnehin schon eingestellt war.
|
||||
private var lastBrightness: Double?
|
||||
@@ -183,6 +187,12 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
model.onNotchWidthsChanged = { [weak self] widths in
|
||||
self?.coordinator?.virtualWidthOverrides = widths
|
||||
}
|
||||
// Ohne diese Zeile wäre der Schalter in den Einstellungen eine
|
||||
// Behauptung: gespeichert, aber ohne Wirkung.
|
||||
lockController.usesFaceUnlock = model.faceUnlockEnabled
|
||||
model.onFaceUnlockChanged = { [weak self] uses in
|
||||
self?.lockController.usesFaceUnlock = uses
|
||||
}
|
||||
|
||||
let menuBar = MenuBarController()
|
||||
if let metricsModel {
|
||||
@@ -407,6 +417,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
menu.addItem(withTitle: "Schaufenster",
|
||||
action: #selector(openGallery), keyEquivalent: "").target = self
|
||||
}
|
||||
if model?.lockScreenEnabled == true {
|
||||
menu.addItem(.separator())
|
||||
menu.addItem(withTitle: String(localized: "menu.lock"),
|
||||
action: #selector(lockNow), keyEquivalent: "l").target = self
|
||||
}
|
||||
menu.addItem(.separator())
|
||||
menu.addItem(withTitle: String(localized: "menu.quit"),
|
||||
action: #selector(quit), keyEquivalent: "q").target = self
|
||||
@@ -417,6 +432,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
|
||||
@objc private func openOnboarding() { showOnboarding() }
|
||||
|
||||
@objc private func lockNow() { lockController.lock() }
|
||||
|
||||
/// Meldet jede Änderung der Systemlautstärke als Live Activity an.
|
||||
///
|
||||
/// Über `withObservationTracking` und nicht über einen eigenen Listener:
|
||||
@@ -626,6 +643,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
settingsWindow.show(model: model, calendarModel: calendarModel,
|
||||
weatherModel: weatherModel, metricsModel: metricsModel,
|
||||
shelfStore: shelfStore, fanControl: fanControl,
|
||||
lockController: lockController,
|
||||
launchAtLogin: launchAtLogin,
|
||||
showOnboarding: { [weak self] in self?.showOnboarding() },
|
||||
section: section)
|
||||
|
||||
Reference in New Issue
Block a user