7.9 KiB
Recette Labfy Greeter GTK4 V1
Complément V2 — 15 octobre 2026
Voir LOGIN_RECOVERY_V2.md : 21 tests greeter avec GTK et 29 tests lanceur/garde/déploiement/coordination passent. Sources candidates, bundle global et captures sont préparés ; READY_FOR_EXPLICIT_INSTALL_APPROVAL : audit r1 FAIL conservé, réparation de durabilité et revue bornée indépendante r2 PASS. Aucune installation, activation ou connexion physique. Les observations V1 ci-dessous restent historiques, notamment la préférence alors différente.
Sélecteur Stable / Mosaic — validation locale du 15 octobre 2026
État : READY_FOR_USER_VISUAL_REVIEW, changement source non activé.
La recette historique ci-dessous décrit l'ancien start default et ne qualifie
pas ce nouveau sélecteur. La connexion réelle du siège physique, l'approbation
visuelle humaine et les opérations root restent NOT_RUN pour cette version.
LAB privé 0700 : /var/tmp/labfy-greeter-dual-session-mkzppvge/.
TMPDIR, TMP, TEMP, pycache et sorties des campagnes y sont dirigés.
Les commandes exactes, rc et sorties brutes sont dans results.json et logs/.
| Contrôle | Résultat |
|---|---|
| Régression avant modification : unittest discover | PASS, 6 tests, rc=0 |
python3 -B -m unittest discover -s greetd/tests -v |
PASS, 17 exécutés, 2 GTK ignorés, rc=0 |
Même commande avec GDK_BACKEND=wayland LABFY_GTK_TESTS=1 |
PASS, 19 exécutés, zéro ignoré, rc=0 |
| AST et py_compile, neuf fichiers Python, pycache dans le LAB | PASS, rc=0 |
| Parsing CSS par le vrai Gtk.CssProvider | PASS, zéro erreur |
| Aperçu réel dans Sway et captures natives GTK Stable/Mosaic | PASS pour 1131 × 853, rc=0 |
| Contrôle du bundle face aux quatre originaux installés | PASS, rc=0 |
| Tentative apply non-root, sans écriture | Refus attendu, rc=2 |
| Erreur d'écriture du deuxième fichier dans une cible factice | Rollback complet PASS |
| Arrêt brutal après deux vrais rename en cible factice | Reprise, rollback puis apply/rollback PASS |
| Hash/mode divergent, lien symbolique, idempotence en cible factice | PASS |
git diff --check |
PASS, rc=0 |
| Installation/rollback root réels, connexion physique Stable/Mosaic | NOT_RUN |
uwsm start -n, lancement du launcher, seat réel |
NOT_RUN |
Les tests exercent le vrai client sur socket Unix fictif : argv exacts Stable
et Mosaic, env=[], défaut Stable, types/valeurs/arguments invalides, absence
de secret synthétique dans les sorties, tous les types PAM et plusieurs tours,
changement de compte/session, erreur puis nouvel essai, socket perdu à chaque
étape, lancement refusé sans repli ni réutilisation de PAM. Les vrais widgets
GTK vérifient en plus le mode preview, le gel des contrôles et le double clic.
Les tests de transaction utilisent les vraies lectures, SHA, journal, fsync et
rename dans le LAB ; seule la confiance des parents et l'UID sont adaptés à la
cible utilisateur factice. Ils ne constituent pas une installation root réelle.
La première exécution de l'aperçu a révélé six erreurs CSS :is() et un libellé
Mosaic tronqué. Le CSS utilise maintenant des sélecteurs GTK explicites et la
carte mesure au minimum 510 px. La capture finale et le test CSS passent ; les
sorties initiales restent dans le LAB. Les avertissements de dépréciation
Python 3.14 / PyGObject concernant asyncio sont conservés dans le log des tests
GTK ; ils ne sont pas des erreurs CSS ni des erreurs d'authentification.
Les sept modules Python et le CSS installés ont été comparés byte-à-byte aux
sources avant modification : identité complète. Les originaux sont sauvegardés
hors HOME avec SHA-256 dans le bundle et dans installed-before.json. Les
permissions installées sont root:root 0644, scripts root:root 0755 ; les
répertoires config/state/cache du greeter sont greeter:greeter 0700. Le
start-compositor installé définit HOME/XDG sous /var/lib/labfy-greeter et
/var/cache/labfy-greeter. Aucun code runtime source ne dépend de /home/fy59.
Aucun secret PAM réel n'est lu.
Les entrées desktop propres à chaque emplacement et le hash du binaire Mosaic
attendu sont confirmés en lecture seule. getty@tty2.service est actif.
default-id était déjà Mosaic, contrairement à l'hypothèse initiale du ticket ;
il est préservé. L'ancien greeter installé reste donc dépendant de cette
préférence jusqu'à une installation approuvée. Voir
SESSION_SELECTOR.md pour le retour Stable et la limite
du rollback qui rétablit l'ancien start default.
La revue finale est locale, sans revue indépendante par un autre agent. Aucune installation, élévation, commande IPC Sway, relance de service, modification du launcher/compositeur ou commit/push. L'aperçu est une fenêtre Wayland ordinaire, sans changement des configurations du bureau.
Recette historique V1 — avant le sélecteur
Gates de publication
USER_VISUAL_VALIDATION=PASS;REAL_GREETER_LOGIN=PASS.BRIGHTNESS_VT1=PASS;SESSION_RESTORE_CHOOSER_COUNT=1;SESSION_RESTORE_V2_AFTER_GREETER=PASS: constats utilisateur après login.UWSM_SYSTEMD_SESSION_CHAIN=PASS;GREETER_RUNTIME_HOME_INDEPENDENT=PASS.GREETER_PERMISSIONS=PASS;RECOVERY_TTY2=READY.AUTH_SECRET_NOT_LOGGED=PASS;PUBLICATION_PRIVACY_SCAN=PASS;TESTS=PASS.POWER_ACTIONS=DISABLED_BY_POLICY.
Chaîne de connexion
La validation visuelle et une connexion sur le greeter réel ont été confirmées
par l'utilisateur. Le chemin observé est : greetd → PAM → Labfy Greeter →
/usr/bin/uwsm start default → session Wayland Sway → systemd --user.
Le client IPC envoie un argv fixe à start_session ; il ne lance pas UWSM
lui-même. Après login, aucun processus du greeter ou de son Sway temporaire
ne reste ouvert.
loginctl indique une session Service=greetd, Type=wayland et un
XDG_RUNTIME_DIR propre au compte utilisateur. Les services
wayland-wm@sway.desktop.service et quickshell-labfy-sway.service sont
actifs ; un seul processus QuickShell, autotiling, Limusic et l'aide à la
transparence sont observés selon leurs modes habituels.
L'utilisateur a constaté sur VT1 que le curseur modifie la luminosité, sans élévation de privilège. Après un checkpoint éligible, il a observé exactement un chooser Session Restore V2 et une restauration réussie. Aucun code Session Restore V2 n'a été modifié pour ce greeter.
Contrôles techniques
- Faux socket greetd : trames bornées, invites PAM
secret,visible,info,error, plusieurs invites, erreur puis nouvel essai,start_sessionavec['/usr/bin/uwsm', 'start', 'default']uniquement. - Secret synthétique : absent des sorties stdout/stderr capturées par le test.
- Comptes NSS, batterie absente ou présente, luminosité bornée et avatar facultatif : tests Python réussis.
- CSS GTK chargé sans erreur ;
qmllint,py_compile, validation Sway etgit diff --checkréussis. - Code, CSS, config et scripts exécutables :
root:root, non modifiables pargreeter. État/cache :greeter:greeteren mode0700. - Runtime sans dépendance au HOME utilisateur pour code, CSS, fond, config, état ou authentification.
Récupération et limites
La sauvegarde initiale et son manifeste SHA-256 restent dans
/var/lib/labfy-greeter/backup/ et ne sont pas versionnés. Le secours
getty@tty2.service reste actif. Depuis Ctrl+Alt+F2, la commande
sudo /usr/local/libexec/labfy-greeter/rollback --restart restaure tuigreet.
Le config.toml initial sauvegardé a pour SHA-256
6c2dc3c9e0973a87ff0fb33de05e7e5c697303aec6e5e399e3caf5577cf1096a ;
la configuration Labfy active a pour SHA-256
33f2b27dfffdd0a6b160ecfc9b47fb570f09fba647b0b37c276c747dbe55e9f5.
CanReboot et CanPowerOff répondent challenge sous greeter : les boutons
sont désactivés par la politique logind actuelle. Le thème V1 est fixe
Mocha/Lavender. La sortie physique validée est eDP-1, avec fallback Sway
output * si la sortie change.