Économiseur d’écran personnalisé avec XSecureLock

Vincent Bernat

i3lock est une solution populaire pour verrouiller une session X11. Les possibilités de personnalisation sont restreintes : il ne permet que de définir un fond d’écran à partir d’un fichier PNG. Cette limitation fait partie de la conception d’i3lock : son objectif principal est de maintenir l’écran verrouillé, ce qui est déjà assez difficile avec X11. Chaque fonctionnalité supplémentaire augmente la surface d’attaque et s’éloigne de cet objectif1. Beaucoup sont frustrés par ces limitations et étendent i3lock par le biais de simples scripts ou en modifiant son code source2. La première solution est généralement sûre, mais la seconde va à l’encontre de l’esprit d’i3lock.

XSecureLock est une alternative moins connue à i3lock. L’une des caractéristiques les plus attrayantes de ce programme est de déléguer la fonction d’économiseur d’écran à un autre processus. Ce dernier doit seulement s’attacher à une fenêtre existante fournie par XSecureLock qui ne lui transmettra aucune entrée. Il placera également une fenêtre noire en dessous pour s’assurer que l’écran reste verrouillé en cas de plantage.

XSecureLock contient déjà quelques économiseurs d’écran, notamment un utilisant mpv pour afficher des photos ou des vidéos, comme les vidéos aériennes de l’Apple TV. J’ai écrit mon propre économiseur à l’aide de Python et GTK3. Il affiche un fond d’écran, une horloge et la méteo4.

Économiseur d'écran personnalisé pour XSecureLock. Il affiche une
horloge au centre et la météo dans un
coin
Économiseur d'écran personnalisé pour XSecureLock

J’apporte deux modifications au-dessus de XSecureLock :

  • Faire une pause avant d’afficher la fenêtre de l’économiseur d’écran. Cette rustine évite un flash noir au démarrage de XSecureLock en attendant un peu que l’écran de veille soit prêt avant de l’afficher. Comme j’utilise également une application de fondu vers l’arrière-plan avant de verrouiller l’écran, le flash noir était assez gênant pour moi. J’ai bon espoir que cette rustine soit acceptée par l’auteur.
  • Ne pas tenter d’éteindre l’écran. Cette rustine empêche XSecureLock d’éteindre l’écran après un certain temps. Je pense que c’est le rôle de l’extension X11 DPMS. Cela simplifie le code. Je ne suis pas sûr que cette rustine soit acceptée par l’auteur.

Mise à jour (05.2023)

La première rustine a été acceptée et est présente dans la version 1.8.0. Au lieu d’utiliser la seconde rustine, j’initialise la variable XSECURELOCK_BLANK_TIMEOUT à -1.

XSecureLock délègue également la fenêtre d’authentification à un autre processus, mais je suis moins à l’aise avec l’idée de personnaliser celui-ci étant donné que c’est plus délicat d’un point de vue sécurité. Bien que basique, l’actuelle présentation me convient.

Je pense que les gens devraient éviter de modifier le code d’i3lock et utiliser plutôt XSecureLock. J’espère que cet article aidera un peu.


  1. Voir par exemple ce commentaire ou celui-ci↩︎

  2. Ce fil Reddit énumère beaucoup de ces alternatives. ↩︎

  3. L’utilisation de GTK rend un peu difficile l’utilisation de certaines fonctionnalités de bas niveau, comme l’intégration d’une application dans une fenêtre existante. En revanche, les fonctionnalités de haut niveau sont plus faciles, notamment dessiner une image et un texte avec une ombre. ↩︎

  4. La météo est récupérée par un autre script fonctionnant sur une minuterie et écrite dans un fichier. L’écran de veille surveille ce dernier pour s’actualiser. ↩︎