From b60946f19f7f8b7c22e397798153dd868a9d0e90 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Tue, 25 Aug 2026 13:33:10 -0400 Subject: [PATCH] forgejo : verifier l'etat du compte, ne pas faire confiance au drapeau MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Toute l'API rendait 403 — ni 401, ni message de droits : jeton valide, identite reconnue, requete rejetee. La cause etait `must-change-password` sur le compte d'administration. Le role passait DEJA `--must-change-password=false`, corrige le 2026-08-23 sur la premiere forge de patient 0. Forgejo 16 a ignore l'option : le compte de la forge du SITE est ne avec le drapeau pose malgre elle. La correction d'il y a deux jours ne protegeait plus rien, et rien ne le disait. Le role ne demande donc plus a la creation de bien se comporter : il CONSTATE l'etat voulu et le retablit, par une tache idempotente sans effet quand la creation a tenu parole. Le genome vit desormais sur la forge du site : six depots, 606 commits, chaque tete confrontee entre le poste et la forge — identique. L'ancienne forge reste comme second remote : « une famille, pas un maitre ». 42 preuves vertes. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 29 ++++++++++++++++++++++++++++ roles/serveur_forgejo/tasks/main.yml | 28 +++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 838a541..90f8f41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ # CHANGELOG — Set-OPS +## 2026-08-25 — Le génome vit sur la forge du SITE + +Six dépôts, 606 commits, chaque tête confrontée entre le poste et la forge : **identique**. +Le génome ne dépend plus d'un écosystème pour se reproduire. + +L'ancienne forge de patient 0 devient un second remote, nommé `patient0` — elle n'est pas +remplacée. Le README de patient 0 exige que le génome vive en **au moins trois endroits +sans coordination** : *« n'importe quel survivant réamorce les autres. Une famille, pas un +maître. »* La forge du site en fait un quatrième. + +### On vérifie l'état, on ne fait pas confiance au drapeau + +Toute l'API de la forge rendait **403**. Ni 401, ni un message de droits : jeton valide, +identité reconnue, requête rejetée. On cherche un scope, une politique, une capacité — et +la cause est un drapeau sur le compte, `must-change-password`. + +Le rôle passait pourtant **déjà** `--must-change-password=false`, corrigé le 2026-08-23 +sur la première forge de patient 0. **Forgejo 16 a ignoré l'option** : le compte est né +avec le drapeau posé malgré elle. La correction d'il y a deux jours ne protégeait plus +rien, et rien ne le disait. + +D'où la forme du remède : le rôle ne demande plus à la création de bien se comporter, il +**constate l'état voulu et le rétablit** — une tâche idempotente, sans effet quand la +création a tenu parole. C'est la même leçon que le `changed=` d'Ansible qui ne prouve pas +un service : *vérifier l'état, pas l'intention*. + +Le jeton d'amorçage est créé localement par la CLI : un mot de passe d'administrateur n'a +pas à circuler pour créer six dépôts. + ## 2026-08-25 — Un SITE a bien un plan J'ai passé la journée à répéter qu'un SITE n'est pas un plan. **C'était faux**, et le diff --git a/roles/serveur_forgejo/tasks/main.yml b/roles/serveur_forgejo/tasks/main.yml index bf6b672..3d4c9c1 100644 --- a/roles/serveur_forgejo/tasks/main.yml +++ b/roles/serveur_forgejo/tasks/main.yml @@ -323,6 +323,34 @@ GITEA_WORK_DIR: "{{ serveur_forgejo_data }}" no_log: true +# ON VERIFIE L'ETAT, ON NE FAIT PAS CONFIANCE AU DRAPEAU (2026-08-25). +# +# La creation passe deja `--must-change-password=false` — corrige le 2026-08-23, sur la +# premiere forge de patient 0. **Forgejo 16 l'a ignore** : le compte de la forge du SITE +# est ne avec le drapeau POSE malgre l'option. +# +# La panne qui en resulte n'accuse rien de juste : toute requete d'API rend **403**, pas +# 401. Le jeton est valide, l'identite reconnue, la requete rejetee quand meme — on +# cherche un scope, un droit, une politique, et la cause est un drapeau sur le compte. +# +# D'ou cette tache : elle ne demande pas a la creation de bien se comporter, elle CONSTATE +# l'etat voulu et le retablit. Idempotente, et sans effet quand la creation a tenu parole. +- name: Le compte d'administration ne doit exiger aucun changement de mot de passe + ansible.builtin.command: + cmd: >- + {{ serveur_forgejo_binaire }} admin user must-change-password --unset + {{ serveur_forgejo_admin_user }} + --config {{ serveur_forgejo_config }} + become: true + become_user: "{{ serveur_forgejo_utilisateur }}" + environment: + FORGEJO_WORK_DIR: "{{ serveur_forgejo_data }}" + register: forgejo_mcp + changed_when: "'Updated 1 users' in (forgejo_mcp.stdout | default(''))" + failed_when: + - forgejo_mcp.rc != 0 + - "'not found' not in (forgejo_mcp.stderr | default(''))" + - name: Configurer la source OAuth2 SSO (Keycloak, idempotent) ansible.builtin.shell: executable: /bin/bash