Detect Elan match-on-chip fingerprint readers again (#6578)

* Detect Elan match-on-chip fingerprint readers again

Elan readers report "ELAN:ARM-M4" as their product string, so the
*fingerprint* and *biometric* checks miss them. Elan's 04f3 is also left
out of the vendor list on purpose, because Elan makes touchscreens too.
Both checks fail, so the machine looks like it has no reader.

Add "elan:arm-m4" to the product string check. The comment above the
vendor list already says the excluded vendors should still match there,
so this makes that true. The vendor list and its has_kernel_driver guard
are unchanged, and touchscreens still cannot cause a false positive.

The string is a family name, not one device. libfprint uses it for
04f3:0c9c and 04f3:0ca7 as well as 04f3:0ca8.

Tested on an HP EliteBook X G2i with 04f3:0ca8.

* Point the Elan comment at the vendor list above it

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Configure PAM only after a fingerprint enrolls and verifies

Detection proves a reader is present, not that libfprint can drive it.
Elan MOC sensors outside the elanmoc table pass the gate and then fail
to enroll, which left pam_fprintd in the sudo and polkit stacks with no
print to match.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Meir Dick
2026-08-09 21:54:01 +02:00
committed by GitHub
co-authored by Claude Opus 5 David Heinemeier Hansson
parent e1d0c4e0a8
commit 9b03f15b4f
2 changed files with 10 additions and 4 deletions
+4 -1
View File
@@ -30,7 +30,10 @@ for dev in /sys/bus/usb/devices/*; do
if [[ -r $dev/product ]]; then if [[ -r $dev/product ]]; then
product=$(<"$dev/product") product=$(<"$dev/product")
product=${product,,} product=${product,,}
[[ $product == *fingerprint* || $product == *biometric* ]] && exit 0 # Elan's match-on-chip readers report "ELAN:ARM-M4", the family name
# rather than the function. Elan is left out of the vendor list above
# on purpose, so without this they match nothing.
[[ $product == *fingerprint* || $product == *biometric* || $product == *elan:arm-m4* ]] && exit 0
fi fi
if [[ -r $dev/idVendor ]]; then if [[ -r $dev/idVendor ]]; then
+6 -3
View File
@@ -83,9 +83,6 @@ fi
omarchy-pkg-add libfprint fprintd usbutils omarchy-pkg-add libfprint fprintd usbutils
# Configure PAM
setup_pam_config
# Enroll first fingerprint # Enroll first fingerprint
echo -e "\e[32m\nLet's setup your right index finger as the first fingerprint.\e[0m" echo -e "\e[32m\nLet's setup your right index finger as the first fingerprint.\e[0m"
echo -e "Keep moving the finger around on sensor until the process completes.\n" echo -e "Keep moving the finger around on sensor until the process completes.\n"
@@ -96,6 +93,12 @@ if sudo fprintd-enroll "$USER"; then
# Verify # Verify
echo -e "\nNow let's verify that it's working correctly.\n" echo -e "\nNow let's verify that it's working correctly.\n"
if fprintd-verify; then if fprintd-verify; then
# PAM comes last, once a print is enrolled and verified. Detection only
# proves a reader is there, not that libfprint can drive it — an Elan MOC
# sensor outside the elanmoc table gets this far and then fails to enroll.
# Editing the stacks up front would leave those machines pointing at
# pam_fprintd with nothing to match.
setup_pam_config
setup_lock_fingerprint_pam setup_lock_fingerprint_pam
echo -e "\e[32m\nPerfect! Fingerprint authentication is now configured.\e[0m" echo -e "\e[32m\nPerfect! Fingerprint authentication is now configured.\e[0m"
echo "You can use your fingerprint for sudo, polkit, and lock screen (Super + Ctrl + L)." echo "You can use your fingerprint for sudo, polkit, and lock screen (Super + Ctrl + L)."