Introduction
Le but est de déverouiller son PC en approchant un tag NFC. Il faut pour ceci un ordinateur sous Linux, et un lecteur de tags NFC. J'ai utilisé un ACR122U.
PAM_nfc
pam_nfc permet d'ouvrir sa session et remplir le mot de passe demandé par sudo ou PolKit. Lorsque le système demande le mot de passe, il suffit d'approcher le tag et d'appuyer sur Entrée.
Pour dévérouiller sa session, les screensavers ne passent pas par PAM (Plugable Authentication Modules), il faut donc un script qui verrouille/dévérouille la session lorsqu'on approche un tag.
NFC-eventd
Pour ceci, on utilise nfc_eventd qui écoute le lecteur NFC en permanence. Il permet de lancer des commandes en réponse à un évènement (détéction ou perte de vue d'un tag).
Malheureusement, mon lecteur ne fonctionne pas correctement avec ces deux utilisations, car si deux programmes utilisent le lecteur NFC en même temps, il y a des erreurs.
Mon script ne permet donc pas de verrouiller automatiquement tout en conservant la fonctionnalité de PAM pour sudo.
Pour associer un tag à votre session, placez-le sur le lecteur et faites
$ pam_nfc add $(whoami)
Voilà pour PAM, ensuite il faut insérer l'UID du tag dans un fichier nfc_cards.conf
pour le script à la fin de ce post.
nfc-list |grep UID|awk -F: '{print $2}'|awk '{print $1$2$3$4$5$6$7}'
note : Vous pouvez mettre plusieurs cartes
Configuration de NFC-eventd
nfc-eventd {
# Run in background? Implies debug=false if true
daemon = true;
# show debug messages?
debug = true;
# polling time in seconds
polling_time = 2;
# expire time in seconds
# default = 0 ( no expire )
expire_time = 0;
# list of events and actions
module nem_execute {
# Tag inserted
event tag_insert {
# what to do if an action fail?
# ignore : continue to next action
# return : end action sequence
# quit : end program
on_error = ignore ;
# You can enter several, comma-separated action entries
# they will be executed in turn
action = "/home/jean/.local/bin/nfc-lock.sh unlock $TAG_UID";
}
# Tag has been removed
event tag_remove {
on_error = return;
action = "/bin/false";
}
# Too much time card removed
event expire_time {
on_error = ignore;
action = "/bin/false";
}
}
}
Script de déverrouillage
#!/bin/bash
if [ $# -eq 0 ]; then
echo "starting nfc-lock d-bus monitor"
nfc-lock.sh monitor
fi
ACTION=$1
NFC_UID=$2
case $ACTION in
lock|unlock)
CMD=$(grep "$NFC_UID" /home/user/.local/etc/nfc_cards.conf |wc -l)
if [ "$CMD" = "1" ]; then
echo "carte trouvée dans le fichier nfc_cards.conf"
#process $1 $2
echo "$ACTION by $NFC_UID"
case $ACTION in
lock)
qdbus org.kde.plasma.browser_integration /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause
loginctl lock-session
;;
unlock)
xset dpms force on
qdbus org.kde.plasma.browser_integration /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Play
loginctl unlock-session
;;
esac
else
echo "erreur: $NFC_UID invalide"
fi
;;
stop)
killall nfc-eventd ;sleep 3; loginctl unlock-session
;;
help)
echo "Usage : $0 start|stop"
echo "$0 lock <uid>"
echo "$0 unlock <uid>"
echo "No arguments launches daemon"
;;
monitor)
dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver',path='/org/freedesktop/ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*)
echo SCREEN_LOCKED
qdbus org.kde.plasma.browser_integration /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause
nfc-eventd --config_file=/home/user/.local/etc/nfc-eventd.conf &
echo "nfc-eventd launched"
;;
*"boolean false"*)
echo SCREEN_UNLOCKED
killall nfc-eventd
echo "nfc eventd was killed, returning to dbus monitoring"
;;
esac
done
echo "end dbus listen"
;;
esac