Bring the fingerprint affordance to the Quickshell lock screen and polkit dialog, matching what hyprlock did on master. Lock screen: render the md-fingerprint glyph inside the password field's right edge when a sensor is enrolled, reserving space so long passwords never run under it. Polkit dialog: show one method at a time. When a sensor is enrolled and the reader is reachable, the dialog is just the centered fingerprint icon (square card); the moment PAM asks for a password it switches to the password field. Detects pam_fprintd anywhere in the auth stack now that a gate can precede it. Lid awareness: a closed lid means the reader is unreachable, so both surfaces fall back to the password. polkit gets a pam_exec clamshell gate (auth [success=1 default=ignore] before pam_fprintd) so a shut lid drops straight to the password prompt instead of blocking on the reader for the pam_fprintd timeout; the lock screen hides the icon and skips scanning. The gate points at the fixed /usr/bin path the package always provides so it survives switching between package installs and dev-link. A migration adds the gate for existing fingerprint setups. New helper omarchy-hw-laptop-closed (pure lid state); omarchy-hw-clamshell now composes it with the external-monitor check. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
33 lines
1.2 KiB
JavaScript
33 lines
1.2 KiB
JavaScript
function promptLooksFingerprint(text) {
|
|
var s = String(text || "").toLowerCase()
|
|
return s.indexOf("finger") !== -1 || s.indexOf("fprint") !== -1 || s.indexOf("swipe") !== -1
|
|
}
|
|
|
|
function fingerprintConfiguredFromPamConfig(raw) {
|
|
// Fingerprint is available whenever pam_fprintd appears anywhere in the auth
|
|
// stack — it need not be the first module. A clamshell gate (pam_exec) may
|
|
// legitimately precede it to skip fingerprint while the lid is closed.
|
|
var lines = String(raw || "").split("\n")
|
|
for (var i = 0; i < lines.length; i++) {
|
|
var line = lines[i].replace(/^\s+|\s+$/g, "")
|
|
if (!line || line.charAt(0) === "#") continue
|
|
if (!line.match(/^auth\s+/)) continue
|
|
if (line.indexOf("pam_fprintd.so") !== -1) return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
function authorizationLabel(message) {
|
|
var text = String(message || "")
|
|
var match = text.match(/^Authentication is (?:needed|required) to run [`']([^`']+)[`'] as /i)
|
|
return match ? "Authorize running '" + match[1] + "'" : text
|
|
}
|
|
|
|
if (typeof module !== "undefined") {
|
|
module.exports = {
|
|
promptLooksFingerprint: promptLooksFingerprint,
|
|
fingerprintConfiguredFromPamConfig: fingerprintConfiguredFromPamConfig,
|
|
authorizationLabel: authorizationLabel
|
|
}
|
|
}
|