| .. | ||
| config | ||
| mosaic-login-v2 | ||
| scripts | ||
| src | ||
| style | ||
| tests | ||
| .gitignore | ||
| LOGIN_RECOVERY_V2.md | ||
| README.md | ||
| SESSION_SELECTOR.md | ||
| VALIDATION.md | ||
Labfy Greeter GTK4 V1
La récupération de connexion Mosaic + QuickShell V2 est préparée séparément, sans installation : voir LOGIN_RECOVERY_V2.md. Le runtime du sélecteur V1 est conservé ; le greeter installé reste l'ancienne version.
Contrat
greetd ouvre la session PAM. Le client IPC envoie exclusivement
un des deux argv allowlistés dans start_session, avec exactement env=[] :
| Choix non persistant | argv transmis à greetd |
|---|---|
| SwayFX — Stable (défaut et secours) | ["/usr/bin/uwsm", "start", "sway.desktop"] |
| SwayFX Mosaic — Expérimental | ["/usr/bin/uwsm", "start", "swayfx-mosaic-test.desktop"] |
Le choix est figé au début de la tentative PAM. Changer compte/session entre
les invites annule celle-ci ; pendant une requête les contrôles sont bloqués.
Le greeter redémarre toujours sur Stable, sans lire/écrire uwsm/default-id.
Une erreur de lancement reste explicite, sans repli automatique.
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 PAMsecret,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 puisSetIconFilevia 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é, sansincludeutilisateur.scripts/start-compositor: environnement HOME/XDG greeter, préserveGREETD_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 compte est de démonstration ; le sélecteur Session fonctionne
avec Stable par défaut, 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.
Mise à jour du choix de session
Voir SESSION_SELECTOR.md pour le contrat, les prérequis, les captures, la mise à jour ciblée et son rollback. Le changement reste non activé ; la recette physique de cette version est NOT_RUN.
Installation initiale historique
Les commandes ci-dessous décrivent l'installation initiale complète. Pour la
mise à jour du sélecteur, utiliser exclusivement la procédure ciblée ci-dessus.
--prepare est mutant et ne constitue pas une validation en lecture seule.
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.