唤醒时带有指纹的 systemd 屏幕锁定

唤醒时带有指纹的 systemd 屏幕锁定

5.18.9-arch1-1 指纹传感器:27c6:63ac 深圳市汇顶科技有限公司汇顶科技USB2.0杂项

我创建了一个 systemd 服务,当系统从休眠状态唤醒时,该服务运行 bash 脚本:

[Unit]
Description=User resume actions
After=hibernate.target

[Service]
User=marc
Type=forking
Environment=DISPLAY=:0
ExecStart=/usr/bin/lock.sh

[Install]
WantedBy=hibernate.target

这是lock.sh:

#!/bin/bash
    
thisPid=$$
xsecurelock &
lock=$!

# loop until $lock is gone, or fingerprint is verified
until ! kill -0 $lock || fprintd-verify; do
    echo "FAILURE"
done

#kill the pid for the lock and thisPid
kill $lock
kill $thisPid

该脚本生成 xsecurelock 并捕获其 pid。然后它运行 fprintd-verify 并阻塞,直到成功读取指纹。然后该脚本会杀死 xsecurelock 及其本身,我知道这是多余的。

systemd 服务运行良好。醒来后,xsecurelock 会生成,但我无法用指纹杀死它。

请注意,如果我手动执行lock.sh,它会完美运行。 xsecurelock 打开,我可以用我的指纹杀死它。但是,当我唤醒屏幕(触发触发 lock.sh 的 systemd 文件)时,屏幕会使用 xsecurelock 锁定,我可以输入密码来解锁它,但 fprintd-verify 失败。 systemctl 状态为:

Jul 07 12:33:49 manray lock.sh[6630]: failed to claim device: GDBus.Error:net.reactivated.Fprint.Error.PermissionDenied: Not Authorized: ne>
Jul 07 12:33:49 manray lock.sh[4760]: FAILURE
Jul 07 12:33:49 manray lock.sh[6634]: Using device /net/reactivated/Fprint/Device/0
Jul 07 12:33:49 manray lock.sh[6634]: failed to claim device: GDBus.Error:net.reactivated.Fprint.Error.PermissionDenied: Not Authorized: ne>
Jul 07 12:33:49 manray lock.sh[4760]: FAILURE

我怎样才能让 fprintd-verify 声明该设备。

编辑:当我将用户设置为 root 时,systemctl 状态:

Jul 07 13:14:43 manray systemd[1]: Starting User resume actions...
Jul 07 13:14:43 manray lock.sh[25997]: Authorization required, but no authorization protocol specified
Jul 07 13:14:43 manray lock.sh[25997]: 2022-07-07T17:14:43Z 25997 xsecurelock: Could not connect to $DISPLAY.
Jul 07 13:14:44 manray lock.sh[25998]: Using device /net/reactivated/Fprint/Device/0
Jul 07 13:14:44 manray lock.sh[25998]: ListEnrolledFingers failed: GDBus.Error:net.reactivated.Fprint.Error.NoEnrolledPrints: Failed to dis>
Jul 07 13:14:44 manray lock.sh[25996]: FAILURE

当以 root 身份运行时,xsecurelock 无法检测到显示屏,并且指纹传感器仍然无法工作。似乎没有注册根手指,我无法添加任何手指。

答案1

解决方案是在以下位置添加一条新规则/usr/share/polkit-1/rules.d/50-net.reactivated.fprint.device.verify.rules

polkit.addRule(function (action, subject) {
  if (action.id == "net.reactivated.fprint.device.verify") {
    return polkit.Result.YES
  }
})

该规则始终允许 fprintd-verify 运行,而不管 polkit 身份验证(我认为)。

我不喜欢这个解决方案,因为它(似乎)不安全。

相关内容