Dotfiles_ArchAP/greetd/VALIDATION.md

7.9 KiB
Raw Blame History

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_session avec ['/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 et git diff --check réussis.
  • Code, CSS, config et scripts exécutables : root:root, non modifiables par greeter. État/cache : greeter:greeter en mode 0700.
  • 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.