Récemment j’ai réinstallé OpenBSD sur mon ordinateur portable afin de repartir d’une base propre (j’en ai fait un article pour ceux que ça intéresse).
Ma configuration était parfaite : disque chiffré, fonds noirs et thèmes sombres partout de Xenocara (le fork de X fait par OpenBSD) à GTK en passant par Xenodm et Qt, i3 comme gestionnaire de fenêtres avec tous les bons raccourcis clavier, le top. Après un délai d’inactivité mon ordinateur s’est verrouillé (sécurité oblige), et j’ai dû taper mon mot de passe deux fois pour déverrouiller le système.
J’étais si satisfait de ma configuration, et ce minuscule bug gâchait mon plaisir. C’était un caillou dans ma chaussure qui m’agaçait à chaque fois que l’écran se verrouillait automatiquement, il fallait que je règle ce problème.

Origine du problème

Le verrouillage automatique fonctionne comme ceci :

  1. xidle, un programme fourni avec Xenocara, reçoit un message du serveur X en cas d’inactivité et exécute un programme, dans mon cas i3lock.
  2. i3lock, l’écran de verrouillage fourni avec i3, bloque l’écran jusqu’à ce que l’utilisateur entre son mot de passe.

La commande ressemble à ceci :

xidle -timeout 60 -program '/usr/local/bin/i3lock -c 000000'

J’ai d’abord pensé que le problème venait de moi. J’ai vérifié si xidle était lancé deux fois, une fois dans ma configuration X et une autre dans i3. J’ai lu la documentation de xidle au cas où j’aurais raté quelque chose, mais non.
Sur Reddit , quelqu’un avait exactement le même problème, mais aucune réponse n’a permis de régler le problème. Je suis passé en mode débogage.

J’ai ouvert un second terminal après que l’écran ait été verrouillé automatiquement, j’ai regardé les process en cours, i3lock tournait deux fois.
J’ai lancé i3lock manuellement depuis mon terminal : OK.
J’ai exécuté xidle manuellement : NOK.

Le problème venait donc de xidle, i3lock était hors de cause. Il me restait à identifier ce que xidle faisait de travers. J’ai créé un petit script qui écrit l’heure dans un fichier, et j’ai modifié la commande pour que xidle appelle ce script, et là j’ai compris.
Après 60 secondes, moment où xidle appelait le script, la date était écrite dans le fichier. Et elle était écrite une seconde fois quand je bougeais mon curseur ou que j’appuyais sur une touche de mon clavier. Pas de doute, c’était un bug dans xidle.
Ça signifiait que xidle lançait i3lock une fois après le timeout, et une seconde fois quand je commençais à taper mon mot de passe. Ça explique pourquoi je devais taper mon mot de passe deux fois.

J’aurais pu simplement décider d’utiliser une alternative à xidle comme xss-lock. D’ailleurs c’est certainement ce qu’ont fait les personnes qui ont discuté du problème sur Reddit il y a trois ans. Mais je ne l’ai pas fait.

Investigation

J’ai récupéré le code de Xenocara et j’ai regardé comment fonctionnait xidle.
En continuant mes recherches sur le Web j’ai également découvert que FreeBSD avait eu le même problème … Et l’avait corrigé.

J’ai étudié le patch, très simple, et j’ai vu qu’il était totalement compatible avec Xenocara. Je l’ai testé sur mon ordi, et ça réglait le problème.
Il était temps de forker Xenocara et de proposer un patch.

Fork et soumission du patch

J’ai forké le repository Github de Xenocara, et j’ai appliqué le patch pour en garder une trace.
Ensuite la procédure a été la même que pour mon patch doas : j’ai exporté le patch dans un fichier et j’ai envoyé un e-mail à la mailing list.

Pourquoi contribuer ?

On pourrait dire que je cherche la petite bête, j’aurais pu utiliser un autre programme et gagner du temps, alors pourquoi j’ai pris du temps pour comprendre et régler le problème ?
Parce que je ne me contente pas de vendre des prestations OpenBSD, je l’utilise tous les jours.

C’était un petit bug, mais ça m’apporte du confort au quotidien, le plaisir de la chose bien faite. Et puis c’est tellement satisfaisant de pouvoir régler ses problèmes soi-même. C’est aussi ça, être administrateur OpenBSD.


Si vous avez besoin d’un expert pour auditer, migrer ou maintenir vos serveurs, consultez mes prestations ou contactez-moi .