From d454e41c36bfa84f8069eddaf393eb04f06e6476 Mon Sep 17 00:00:00 2001 From: mathieu Date: Sat, 22 Aug 2026 14:22:50 +0200 Subject: [PATCH] Restaure les vraies URL, et documente la production d'une copie publique MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pendant du commit du paquet. Les passages qui PARLAIENT du placeholder annoncaient desormais la vraie URL comme etant un placeholder : ils sont reecrits pour dire ce qui est. docs/publier-une-version.md porte maintenant la marche a suivre pour produire une copie publique — depot neuf sans historique, URL neutralisees, identite a revoir — avec le rm -rf .git AVANT le git init : un git clone ne conviendrait pas, l'historique portant les URL reelles dans chaque ancien commit. CLAUDE.md consigne l'erreur et la regle qui en sort : on anonymise une copie, jamais l'original. 626 tests au vert. Co-Authored-By: Claude Opus 5 --- CLAUDE.md | 76 +++++++++++++++++++++--------- MaBibli.Client/Pages/APropos.razor | 2 +- README.md | 12 +++-- docs/installer.md | 8 ++-- docs/publier-une-version.md | 71 ++++++++++++++++------------ 5 files changed, 106 insertions(+), 63 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 978c7bd..6aa3176 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2270,6 +2270,28 @@ lui-même** pour les afficher dans son catalogue et son interface d'administrati compilation, et rien n'est recompilé sur le serveur. Le manifeste déclare donc l'application en `full_domain`. +**`all_users`, et la question n'est plus posée** (2026-08-22). `init_main_permission` a +quitté `[install]` au profit de `resources.permissions.main.allowed = "all_users"`. +Vérifié dans le cœur YunoHost (`src/utils/resources.py`) : `allowed` **l'emporte** sur la +question, qui n'aurait donc fait que laisser croire que la réponse comptait. + +⚠️ **Ce n'est pas un réglage de confort : `visitors` casserait deux invariants du code.** +L'application n'a aucune authentification propre — elle fait confiance à `YNH_USER` parce +que SSOwat l'écrase à chaque requête, exactement comme elle n'écoute que sur `127.0.0.1` — +et **toute personne autorisée peut supprimer n'importe quel livre** du catalogue commun, +sans rôle ni lecture seule. Ouverte au public, la portée « personnelle » (statuts de +lecture, envies) n'existe plus du tout. + +⚠️ **Pas de `protected = true`, délibérément** : restreindre à un groupe dédié reste +légitime, et c'est l'affaire de l'administrateur. C'est l'**élargissement** qui est un +contresens, pas le réglage. + +⚠️ **`allowed` n'agit qu'à la CRÉATION de la permission** (`if perm not in existing_perms`). +Une montée de version ne réaligne rien : un accès élargi à la main le reste. Un commentaire +de manifeste n'atteignant aucun administrateur, l'avertissement vit dans +`doc/DESCRIPTION.md` (page d'installation) et `doc/ADMIN.md` (interface d'administration) — +les deux seuls fichiers du paquet que **YunoHost lit lui-même**. + ## Héberger hors YunoHost — voie SECONDAIRE, ajoutée le 2026-08-21 Demande venue d'un tiers voulant installer le projet sur un **Synology**. `Dockerfile`, @@ -2374,35 +2396,43 @@ référencés mais qui partaient dans chaque release. L'archive passe de **69 à l'écart est bien moindre que sur disque (8,4 Mo), les *source maps* étant du texte qui se compresse très bien. **Toujours mesurer sur l'archive, jamais sur le disque.** -## Les URL de dépôt sont un placeholder — sortie du projet (2026-08-22) +## ⚠️ Le dépôt de travail garde ses vraies URL — corrigé le 2026-08-22 -`https://forge.example.org/mabibli` remplace partout l'URL du Gitea privé de l'utilisateur. -`example.org` est réservé à la documentation par la **RFC 2606** : le placeholder est donc -définitivement injoignable, ce qui est exactement ce qu'on veut d'un placeholder. +**Erreur commise ce jour-là, et instructive.** Les URL du Gitea de l'utilisateur avaient été +remplacées partout par un placeholder `forge.example.org`, dans le dépôt **de travail**. +Deux conséquences, la seconde immédiate : -⚠️ **Une seule ligne commande tout** : `depot_code`, en tête de `build/publier.sh`. Les URL -de release, d'archive et le message de fin en dérivent. `--depot-code URL` fait la même -chose sans modifier le fichier. +1. le remplacement global a réécrit `amd64.url` dans `manifest.toml` — **le champ que la + documentation qu'on venait d'écrire désignait comme « à ne jamais changer à la main »**, + parce que `publier.sh` le régénère à chaque publication. Le manifeste de la 0.5.0, déjà + publiée, s'est mis à pointer une archive introuvable ; +2. l'installation a échoué, et **le symptôme ne désignait pas la cause** : `ynh_setup_source` + annonce une URL morte, sans rapport apparent avec un nettoyage de documentation. -⚠️ **`publier.sh` REFUSE de publier tant que le placeholder est en place**, et il refuse -**avant de compiler**, comme ses autres garde-fous. Sans lui, on écrirait dans -`manifest.toml` une `amd64.url` que personne ne peut télécharger — et l'échec surviendrait -**bien plus loin**, à l'installation, sous la forme d'un `ynh_setup_source` en erreur, sans -rapport apparent avec la cause. C'est la même famille de panne que le manifeste corrigé mais -non poussé : un défaut posé ici, constaté ailleurs. +⚠️ **L'erreur de conception derrière** : le placeholder avait sa place dans la **copie +publique**, pas dans le dépôt de travail. Ce dernier sert au déploiement réel de son auteur +et doit rester opérationnel ; la copie publique est produite à part, sans historique et avec +les URL neutralisées — la marche à suivre est dans `docs/publier-une-version.md`. -⚠️ **Ce que le remplacement de fichiers ne règle PAS** : l'**historique git** porte ces URL -dans chaque ancien commit, et le dépôt du paquet contient en plus une archive de 68 Mo -committée par erreur à la 0.1.0 puis retirée. Seul un dépôt **neuf, sans historique**, en -vient à bout — c'est ce qui a été décidé pour la sortie. +**Règle qui en sort, et qui dépasse ce cas** : anonymiser un dépôt qui sert encore, c'est le +casser. On anonymise **une copie**, jamais l'original. -⚠️ **`amd64.url` ne se change pas à la main** : `publier.sh` la réécrit à chaque -publication. La corriger donnerait l'illusion que c'est fait. +### Ce qui reste en place, et qui vaut -Ce qui **reste** volontairement : `maintainers = ["mathieu"]` (c'est le champ prévu par le -format v2), l'adresse de contact et le site de l'auteur dans `/a-propos` (décidé au lot Y — -l'AGPL attend d'ailleurs qu'on puisse joindre la source, donc l'auteur), et `"mathieu"` -comme nom de lecteur dans les jeux de test. +- **`depot_code`, en tête de `build/publier.sh`**, commande toutes les URL dérivées. Une + ligne à changer, `--depot-code` pour un essai. +- **Le garde-fou refuse de publier si l'URL contient `example.org`**, et refuse **avant de + compiler**. Il ne se déclenche pas dans le dépôt de travail — il sert à la copie publique, + pour que celui qui reprend le projet renseigne `depot_code` avant sa première release + plutôt que de le découvrir à l'installation. +- **Les cinq variables d'environnement jumelles restent supprimées** (`MABIBLI_SOURCE_DIR`, + `MABIBLI_BASE_URL`, `MABIBLI_URL_RELEASES`, `MABIBLI_OUTPUT_DIR`, `MABIBLI_VERSION`) : + chacune doublait une option qu'elle répétait, et rien ne disait laquelle l'emportait. + +⚠️ **L'historique git n'est pas anonymisable** : il porte les URL réelles dans chaque ancien +commit, et le dépôt du paquet contient en plus une archive de 68 Mo committée par erreur à +la 0.1.0 puis retirée. Seul un dépôt **neuf, sans historique**, en vient à bout — d'où le +`rm -rf .git` **avant** le `git init` dans la marche à suivre. ## Historique du projet (pourquoi ces choix) diff --git a/MaBibli.Client/Pages/APropos.razor b/MaBibli.Client/Pages/APropos.razor index 9494151..1bd3b88 100644 --- a/MaBibli.Client/Pages/APropos.razor +++ b/MaBibli.Client/Pages/APropos.razor @@ -121,7 +121,7 @@ private const string Site = "https://www.limonier.be"; /// Dépôt du code — ce que l'AGPL attend qu'on rende accessible. - private const string Depot = "https://forge.example.org/mabibli"; + private const string Depot = "https://git.akbar.nohost.me/mathieu/mabibli"; private VersionApplication? _version; diff --git a/README.md b/README.md index f270dcd..beb12ed 100644 --- a/README.md +++ b/README.md @@ -65,12 +65,14 @@ dotnet run --project MaBibli.Api L'API sert aussi le client compilé : une seule commande suffit. -## ⚠️ Avant de publier ce projet quelque part +## Ce dépôt porte les URL du serveur de son auteur -Les URL de dépôt sont un **placeholder volontaire**, `https://forge.example.org/mabibli`. -Une seule ligne les commande toutes — `depot_code`, en tête de -`mabibli_ynh/build/publier.sh` — et `publier.sh` **refuse de publier tant qu'elle n'est -pas changée**. Le détail est dans +`https://git.akbar.nohost.me/mathieu/…` — c'est le dépôt **de travail**, et il doit rester +opérationnel. Une seule ligne les commande toutes : `depot_code`, en tête de +`mabibli_ynh/build/publier.sh`. + +Pour en tirer une **copie publique** destinée à des tiers, la marche à suivre — dépôt neuf +sans historique, URL neutralisées — est dans [docs/publier-une-version.md](docs/publier-une-version.md). ## ⚠️ Depuis la 0.5.0, aucune base antérieure n'est migrable diff --git a/docs/installer.md b/docs/installer.md index 4e4e00a..a4e3fb3 100644 --- a/docs/installer.md +++ b/docs/installer.md @@ -37,7 +37,7 @@ version ultérieures fonctionnent normalement. ## Le paquet YunoHost -MaBibli se déploie via un **second dépôt**, [`mabibli_ynh`](https://forge.example.org/mabibli_ynh), +MaBibli se déploie via un **second dépôt**, [`mabibli_ynh`](https://git.akbar.nohost.me/mathieu/mabibli_ynh), qui **ne contient aucun code C#** : il porte le manifeste, les configurations nginx et systemd, et les scripts d'installation. Toute la documentation, elle, vit ici — ce fichier est le point d'entrée unique du projet. @@ -178,7 +178,7 @@ Vérification, à faire **sans être authentifié** (autre navigateur, ou `curl` ci-dessous) : ```bash -curl -fsSLI "https://forge.example.org/mabibli/releases/download/v0.1.0/mabibli-0.1.0-linux-x64.tar.gz" | head -1 +curl -fsSLI "https://git.akbar.nohost.me/mathieu/mabibli/releases/download/v0.1.0/mabibli-0.1.0-linux-x64.tar.gz" | head -1 ``` Attendu : `HTTP/2 200`. Un 404 signifie soit que la release n'est pas déposée, soit que @@ -200,13 +200,13 @@ Le contrôle qui tranche, quel que soit le chemin suivi — c'est le manifeste * serveur le lira** : ```bash -curl -fsSL "https://forge.example.org/mabibli_ynh/raw/branch/main/manifest.toml" | grep amd64 +curl -fsSL "https://git.akbar.nohost.me/mathieu/mabibli_ynh/raw/branch/main/manifest.toml" | grep amd64 ``` #### A.5 Installer ```bash -sudo yunohost app install https://forge.example.org/mabibli_ynh --debug +sudo yunohost app install https://git.akbar.nohost.me/mathieu/mabibli_ynh --debug ``` YunoHost demande le domaine (celui créé en A.1) et le groupe autorisé (`all_users`). diff --git a/docs/publier-une-version.md b/docs/publier-une-version.md index 398b644..419cc53 100644 --- a/docs/publier-une-version.md +++ b/docs/publier-une-version.md @@ -11,41 +11,52 @@ Pour vous, qui sortez les versions. Pour installer, voir | [La chaîne de publication](#publication) | ce que `publier.sh` fait, et ce qu'il refuse | | [Monter de version](#b-monter-de-version) | pas à pas | -## Avant de publier ce projet quelque part +## L'URL du dépôt, et la copie publique -Les URL de dépôt sont un **placeholder volontaire**, `https://forge.example.org/mabibli` -(le domaine `example.org` est réservé à la documentation par la RFC 2606, donc -définitivement injoignable). Rien ne fonctionnera tant qu'il n'est pas remplacé. +Ce dépôt est le dépôt **de travail** : il porte les URL réelles du serveur de son auteur, +`https://git.akbar.nohost.me/mathieu/…`, et c'est ce qui le rend opérationnel. -**Une seule ligne commande tout le reste** — `depot_code`, en tête de -`mabibli_ynh/build/publier.sh`. Elle produit les URL de release, celles d'archive, et le -message de fin. Pour un essai ponctuel, `--depot-code https://…` fait la même chose sans -modifier le fichier. +**Une seule ligne les commande toutes** — `depot_code`, en tête de `build/publier.sh`. +Les URL de release, d'archive et le message de fin en dérivent. `--depot-code URL` fait la +même chose sans modifier le fichier, pour un essai ponctuel. -⚠️ **`publier.sh` refuse de publier tant que le placeholder est en place**, et il refuse -*avant* de compiler. C'est délibéré : publier avec une URL morte écrirait dans -`manifest.toml` une `amd64.url` que personne ne peut télécharger, et l'échec surviendrait -bien plus tard, à l'installation, sous la forme d'un `ynh_setup_source` en erreur — sans -rapport apparent avec la cause. +⚠️ **`amd64.url` dans `manifest.toml` ne se change JAMAIS à la main** : `publier.sh` la +réécrit à chaque publication. La modifier hors de ce chemin produit un manifeste qui pointe +une archive introuvable — l'échec survient alors **bien plus loin**, à l'installation, dans +`ynh_setup_source`, sans rapport apparent avec la cause. C'est arrivé le 2026-08-22. -Restent à changer à la main, une fois seulement : +### Produire une copie publique -| Fichier | Quoi | -|---|---| -| `mabibli_ynh/manifest.toml` | `code = "…"`, et `maintainers` | -| `mabibli_ynh/conf/systemd.service` | `Documentation=…` | -| `mabibli_ynh/doc/ADMIN.md` | le lien de bas de page | -| `mabibli_ynh/README.md`, ce fichier | les liens et les commandes d'exemple | -| `MaBibli.Client/Pages/APropos.razor` | `Depot`, `Site`, et l'adresse de contact | +Pour publier le projet à destination de tiers, on **copie** — on ne transforme pas le dépôt +de travail : -⚠️ **`amd64.url` dans le manifeste n'est PAS à changer à la main** : `publier.sh` la -réécrit à chaque publication. La corriger donnerait l'illusion que c'est fait alors que la -source du problème est ailleurs. +```bash +cd ~/Code && rm -rf mabibli-public && cp -r mabibli mabibli-public +rm -rf mabibli-public/.git +``` -⚠️ **Le dépôt du code doit être PUBLIC.** `ynh_setup_source` télécharge sans jeton, et -Gitea comme GitHub répondent **404** — pas 403 — à un anonyme sur un dépôt privé. Le -symptôme est alors rigoureusement identique à « la release n'existe pas ». Contrôle qui -tranche, hors session authentifiée : `curl -fsSLI ""`. +⚠️ **Le `rm -rf .git` vient AVANT le `git init`**, et un `git clone` ne conviendrait pas : +l'historique porte les URL réelles dans chaque ancien commit — et, côté paquet, une archive +de 68 Mo committée par erreur à la 0.1.0 puis retirée. + +Puis neutraliser les URL et l'identité : + +```bash +cd mabibli-public +grep -rl 'git\.akbar\.nohost\.me' . | xargs sed -i \ + -e 's|https://git\.akbar\.nohost\.me/mathieu/mabibli_ynh|https://forge.example.org/mabibli_ynh|g' \ + -e 's|https://git\.akbar\.nohost\.me/mathieu/mabibli|https://forge.example.org/mabibli|g' +git init -b main && git add -A && git commit -m "MaBibli" +``` + +`forge.example.org` est injoignable par construction — `example.org` est réservé à la +documentation par la **RFC 2606**. C'est voulu : `publier.sh` **refuse de publier** tant +qu'une URL en `example.org` est en place, et il refuse **avant de compiler**. Celui qui +reprend le projet doit donc renseigner `depot_code` avant sa première release, plutôt que +de découvrir le problème à l'installation. + +Restent à revoir à la main dans la copie : `maintainers` dans `manifest.toml`, et l'adresse +de contact et le site dans `MaBibli.Client/Pages/APropos.razor`. ## Compilation @@ -242,7 +253,7 @@ Créer la release `v0.1.1` dans Gitea, y téléverser `build/dist/mabibli-0.1.1-linux-x64.tar.gz`, puis vérifier sans authentification : ```bash -curl -fsSLI "https://forge.example.org/mabibli/releases/download/v0.1.1/mabibli-0.1.1-linux-x64.tar.gz" | head -1 +curl -fsSLI "https://git.akbar.nohost.me/mathieu/mabibli/releases/download/v0.1.1/mabibli-0.1.1-linux-x64.tar.gz" | head -1 ``` #### B.5 Pousser le paquet @@ -263,7 +274,7 @@ sudo yunohost backup create --apps mabibli ``` ```bash -sudo yunohost app upgrade mabibli -u https://forge.example.org/mabibli_ynh --debug +sudo yunohost app upgrade mabibli -u https://git.akbar.nohost.me/mathieu/mabibli_ynh --debug ``` ⚠️ **L'option `-u` n'est pas facultative ici.** MaBibli n'est pas dans le catalogue