mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-04-04 04:42:05 -04:00
* feat: Add FIDO2/U2F security key support for lock screen Adds hardware security key authentication (e.g. YubiKey) with two modes: Alternative (OR) and Second Factor (AND). Includes settings UI, PAM integration, availability detection, and proper state cleanup. Also fixes persist:false properties being reset on settings file reload. * feat: Add U2F pending timeout and Escape to cancel Cancel U2F second factor after 30s or on Escape key press, returning to password/fingerprint input. * fix: U2F detection honors custom PAM override for non-default key paths
85 lines
2.8 KiB
QML
85 lines
2.8 KiB
QML
pragma Singleton
|
|
pragma ComponentBehavior: Bound
|
|
|
|
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Io
|
|
|
|
Singleton {
|
|
id: root
|
|
|
|
property var settingsRoot: null
|
|
|
|
function detectQtTools() {
|
|
qtToolsDetectionProcess.running = true;
|
|
}
|
|
|
|
function detectFprintd() {
|
|
fprintdDetectionProcess.running = true;
|
|
}
|
|
|
|
function detectU2f() {
|
|
u2fDetectionProcess.running = true;
|
|
}
|
|
|
|
function checkPluginSettings() {
|
|
pluginSettingsCheckProcess.running = true;
|
|
}
|
|
|
|
property var qtToolsDetectionProcess: Process {
|
|
command: ["sh", "-c", "echo -n 'qt5ct:'; command -v qt5ct >/dev/null && echo 'true' || echo 'false'; echo -n 'qt6ct:'; command -v qt6ct >/dev/null && echo 'true' || echo 'false'; echo -n 'gtk:'; (command -v gsettings >/dev/null || command -v dconf >/dev/null) && echo 'true' || echo 'false'"]
|
|
running: false
|
|
|
|
stdout: StdioCollector {
|
|
onStreamFinished: {
|
|
if (!settingsRoot)
|
|
return;
|
|
if (text && text.trim()) {
|
|
var lines = text.trim().split('\n');
|
|
for (var i = 0; i < lines.length; i++) {
|
|
var line = lines[i];
|
|
if (line.startsWith('qt5ct:')) {
|
|
settingsRoot.qt5ctAvailable = line.split(':')[1] === 'true';
|
|
} else if (line.startsWith('qt6ct:')) {
|
|
settingsRoot.qt6ctAvailable = line.split(':')[1] === 'true';
|
|
} else if (line.startsWith('gtk:')) {
|
|
settingsRoot.gtkAvailable = line.split(':')[1] === 'true';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
property var fprintdDetectionProcess: Process {
|
|
command: ["sh", "-c", "command -v fprintd-list >/dev/null 2>&1"]
|
|
running: false
|
|
onExited: function (exitCode) {
|
|
if (!settingsRoot)
|
|
return;
|
|
settingsRoot.fprintdAvailable = (exitCode === 0);
|
|
}
|
|
}
|
|
|
|
property var u2fDetectionProcess: Process {
|
|
command: ["sh", "-c", "(test -f /usr/lib/security/pam_u2f.so || test -f /usr/lib64/security/pam_u2f.so) && (test -f /etc/pam.d/dankshell-u2f || test -f \"$HOME/.config/Yubico/u2f_keys\")"]
|
|
running: false
|
|
onExited: function (exitCode) {
|
|
if (!settingsRoot)
|
|
return;
|
|
settingsRoot.u2fAvailable = (exitCode === 0);
|
|
}
|
|
}
|
|
|
|
property var pluginSettingsCheckProcess: Process {
|
|
command: ["test", "-f", settingsRoot?.pluginSettingsPath || ""]
|
|
running: false
|
|
|
|
onExited: function (exitCode) {
|
|
if (!settingsRoot)
|
|
return;
|
|
settingsRoot.pluginSettingsFileExists = (exitCode === 0);
|
|
}
|
|
}
|
|
}
|