Dotfiles_ArchAP/greetd
2026-10-07 09:42:55 +02:00
..
config feat(greetd): add Labfy GTK greeter 2026-10-07 09:42:55 +02:00
scripts feat(greetd): add Labfy GTK greeter 2026-10-07 09:42:55 +02:00
src feat(greetd): add Labfy GTK greeter 2026-10-07 09:42:55 +02:00
style feat(greetd): add Labfy GTK greeter 2026-10-07 09:42:55 +02:00
tests feat(greetd): add Labfy GTK greeter 2026-10-07 09:42:55 +02:00
.gitignore feat(greetd): add Labfy GTK greeter 2026-10-07 09:42:55 +02:00
README.md feat(greetd): add Labfy GTK greeter 2026-10-07 09:42:55 +02:00
VALIDATION.md feat(greetd): add Labfy GTK greeter 2026-10-07 09:42:55 +02:00

Labfy Greeter GTK4 V1

Contrat

greetd ouvre la session PAM. Le client IPC envoie exclusivement ["/usr/bin/uwsm", "start", "default"] dans start_session, avec env=[]. Le greeter GTK termine ensuite, run-ui demande la sortie du Sway greeter, et greetd démarre alors la session authentifiée. Aucun code du greeter ne lance Sway utilisateur ou Session Restore V2. /etc/pam.d/greetd reste intact.

Fichiers

  • src/greetd_ipc.py : trames JSON UTF-8 bornées à 64 KiB, socket Unix.
  • src/auth.py : réponses PAM secret, visible, info, error, invites successives et nouvel essai.
  • src/accounts.py : comptes NSS dans les limites de /etc/login.defs, avec saisie manuelle.
  • src/system_state.py : batterie, rétroéclairage et dernier nom réussi.
  • src/avatar_icon.py : lecture de la copie PNG AccountsService root-owned.
  • src/avatar_backend.py : conversion bornée puis SetIconFile via D-Bus système.
  • src/labfy_greeter.py : fenêtre GTK4 et mode --preview.
  • style/labfy-greeter.css : palette Mocha/Lavender versionnée autonome.
  • config/labfy-sway.conf : Sway greeter séparé, sans include utilisateur.
  • scripts/start-compositor : environnement HOME/XDG greeter, préserve GREETD_SOCK.
  • scripts/run-ui : ferme le compositor après GTK.

La palette provient de quickshell/.config/quickshell/labfy-sway/theme/catppuccin.json. Le fond système /etc/greetd/background/sway.png est lu sans dépendance au HOME utilisateur. La ligne output * fournit le fallback ; eDP-1 reprend le mode et l'échelle de cette machine.

Quick Settings → Apparence → Avatar propose un sélecteur de PNG, JPEG ou WebP. python-pillow convertit l'image en PNG carré de 256 px, après vérification de la taille du fichier et du nombre de pixels. AccountsService publie ensuite la copie système. Le greeter ne consulte que /var/lib/AccountsService/icons/<username> : fichier régulier root-owned, PNG de dimensions bornées. Une image absente ou invalide laisse l'icône utilisateur par défaut. L'outil de réglage utilise la politique standard org.freedesktop.accounts.change-own-user-data ; il n'installe ni sudoers ni helper root. La page QuickShell se trouve sous Apparence → Avatar ; elle ne versionne aucune image personnelle.

Prévisualisation sans authentification

GDK_BACKEND=wayland python3 greetd/src/labfy_greeter.py --preview

Dans ce mode, le sélecteur est de démonstration, le champ et les actions sont inactifs, le slider ne peut pas écrire et aucun GREETD_SOCK n'est requis. La date utilise la locale système de /etc/locale.conf.

Validation locale

python3 -m unittest discover -s greetd/tests -v
python3 -m py_compile greetd/src/*.py
sway --validate --config greetd/config/labfy-sway.conf
git diff --check

Pour prouver l'accès à la luminosité sans variation visible, un membre du groupe video peut écrire la valeur courante dans brightness puis la relire. Le test automatique n'écrit que dans un sysfs fictif temporaire.

Installation

Depuis la copie source, avec les droits root :

sudo greetd/scripts/install.sh --prepare
sudo greetd/scripts/install.sh --activate-after-visual-approval

--prepare sauve byte-for-byte les fichiers existants sous /var/lib/labfy-greeter/backup/ et vérifie leur SHA-256 avant toute écriture sous /etc/greetd. Il installe code, CSS et configuration Sway avec ownership root, prépare state/cache en greeter:greeter et active getty@tty2.service. L'installateur accepte la configuration tuigreet sauvegardée ou la configuration Labfy déjà active ; toute autre configuration active est refusée. La commande --activate-after-visual-approval remplace uniquement /etc/greetd/config.toml. Elle ne redémarre jamais greetd. /etc/greetd/sway reste présent jusqu'à la recette réelle réussie.

Avant logout, vérifier systemctl is-active getty@tty2.service et le chemin de secours Ctrl+Alt+F2 → connexion console. En cas d'échec, depuis tty2 :

sudo /usr/local/libexec/labfy-greeter/rollback --restart

Le rollback root-owned vérifie les hashes, remet config.toml initial, recharge systemd et ne redémarre greetd que sur demande explicite --restart depuis le TTY. Les sauvegardes restent disponibles après rollback.

Première recette réelle

Après approbation visuelle et activation sur disque, effectuer le logout normal QuickShell, contrôler l'interface et la luminosité sur VT1, puis authentifier. Vérifier ensuite loginctl, XDG_RUNTIME_DIR, systemd --user, UWSM, quickshell-labfy-sway.service, l'unicité QuickShell et du chooser Session Restore V2, autotiling, Limusic et transparency helper. Aucun commit/push avant cette recette complète.

Les boutons d'alimentation ne sont activés que si org.freedesktop.login1.Manager retourne yes à CanReboot ou CanPowerOff dans le contexte greeter. Une réponse challenge, no ou une erreur les désactive. Aucun privilège supplémentaire n'est installé. Sur la machine validée, logind retourne challenge : les boutons restent désactivés par la politique en place.

Le thème de login reste Mocha/Lavender en V1. La mise à l'échelle validée concerne l'écran eDP-1 ; output * fournit un fallback. Session Restore V2 reste indépendant du greeter : seul le démarrage UWSM lui transmet la session. La recette et ses limites sont consignées dans VALIDATION.md.