Restaure les vraies URL : on anonymise une copie, jamais l'original

Le manifeste de la 0.5.0, deja publiee, s'est mis a pointer une archive
introuvable — l'installation echouait sur ynh_setup_source, sans que le
symptome designe la cause.

Le remplacement global des URL avait reecrit amd64.url, c'est-a-dire
precisement le champ que la documentation ecrite le meme jour designait comme
« a ne jamais changer a la main », puisque publier.sh le regenere a chaque
publication.

⚠ L'erreur de conception est plus large : le placeholder avait sa place dans la
COPIE publique, pas dans le depot de travail, qui sert au deploiement reel et
doit rester operationnel. Anonymiser un depot qui sert encore, c'est le casser.

Ce qui reste, et qui vaut : depot_code commande toujours toutes les URL
derivees, et le garde-fou refuse toujours de publier avec une URL en
example.org — il ne se declenche simplement plus ici, puisqu'il sert a la copie
publique.

sha256 inchange : seule l'URL avait bouge, le manifeste retrouve exactement son
etat de publication.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-22 14:22:50 +02:00
co-authored by Claude Opus 5
parent 5ebfd4a82b
commit 6d88ddb1d0
6 changed files with 78 additions and 15 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
# Paquet YunoHost pour MaBibli
Paquet d'installation de [MaBibli](https://forge.example.org/mabibli), application de
Paquet d'installation de [MaBibli](https://git.akbar.nohost.me/mathieu/mabibli), application de
gestion de bibliothèque personnelle (catalogue, prêts, scan ISBN).
Ce dépôt **ne contient aucun code C#**. Il porte uniquement de quoi installer sur YunoHost une
@@ -9,7 +9,7 @@ d'installation, et les scripts de publication.
## 📖 Toute la documentation est dans le dépôt du code
Elle a été regroupée dans **[le README de `mabibli`](https://forge.example.org/mabibli#readme)**,
Elle a été regroupée dans **[le README de `mabibli`](https://git.akbar.nohost.me/mathieu/mabibli#readme)**,
qui est le point d'entrée unique du projet : contenu et points de conception du paquet,
publication d'une version, mise en production pas à pas, montée de version, retour arrière,
désinstallation, et contraintes permanentes.
+7 -4
View File
@@ -44,10 +44,13 @@ manifeste="$racine_paquet/manifest.toml"
# passe des options aussi bien que des variables.
# ⚠️ LA SEULE LIGNE À CHANGER pour héberger ce projet ailleurs.
# Tout ce qui suit en dérive : URL de release, URL d'archive, message de fin.
# Le placeholder ci-dessous est volontairement injoignable (example.org est réservé à la
# documentation par la RFC 2606) : `publier.sh` REFUSE de publier tant qu'il est en place,
# plutôt que d'écrire une URL morte dans le manifeste — voir les contrôles préalables.
depot_code="https://forge.example.org/mabibli"
#
# Une copie publique du projet porte ici `https://forge.example.org/mabibli`, injoignable
# par construction (example.org est réservé à la documentation par la RFC 2606). Le
# contrôle préalable plus bas REFUSE alors de publier, et refuse AVANT de compiler :
# celui qui reprend le projet doit renseigner cette ligne avant sa première release,
# plutôt que de découvrir le problème à l'installation, dans ynh_setup_source.
depot_code="https://git.akbar.nohost.me/mathieu/mabibli"
source_dir="$(cd "$racine_paquet/../mabibli" 2>/dev/null && pwd || true)"
base_url="$depot_code/releases/download"
+1 -1
View File
@@ -1,6 +1,6 @@
[Unit]
Description=MaBibli — gestion de bibliothèque personnelle
Documentation=https://forge.example.org/mabibli
Documentation=https://git.akbar.nohost.me/mathieu/mabibli
After=network.target
[Service]
+22 -1
View File
@@ -11,6 +11,27 @@ aux données, et le schéma est migré automatiquement au démarrage. Rien à la
## Qui a accès
> ## ⚠️ MaBibli est une application **privée**
>
> Elle n'est **pas** faite pour être publique. L'installation la règle sur `all_users` —
> les comptes du serveur — et **ne pose pas la question**, parce qu'il n'y a pas de bonne
> raison de l'ouvrir plus large.
>
> **N'ajoutez jamais le groupe `visitors` à la permission `mabibli.main`.**
>
> Deux raisons, et ce sont des propriétés du code, pas des préférences :
>
> 1. **L'application n'a aucune authentification à elle.** Elle lit l'en-tête `YNH_USER`
> que le portail YunoHost injecte à chaque requête, et lui fait confiance. Ouverte aux
> visiteurs, plus personne n'écrit cet en-tête : tout ce qui est **personnel** — statuts
> de lecture, liste d'envies — devient lisible et modifiable par n'importe qui.
> 2. **Toute personne autorisée peut tout modifier**, y compris **supprimer** des livres du
> catalogue commun. Il n'existe ni rôle, ni lecture seule, ni journal des suppressions.
> C'est assumé pour un foyer, dont les membres se connaissent.
>
> Restreindre plus (un groupe dédié) est parfaitement légitime, et se fait dans les
> permissions YunoHost (`mabibli.main`). C'est **l'élargissement** qui est un contresens.
MaBibli n'a pas de connexion propre : l'identité vient du portail YunoHost. **Réglez les accès
dans les permissions YunoHost** (`mabibli.main`), pas dans l'application.
@@ -44,4 +65,4 @@ sqlite3 /home/yunohost.app/mabibli/mabibli.db ".backup '/quelque/part/mabibli.db
---
Le détail — conception du paquet, publication, mise à jour pas à pas, retour arrière —
est dans le [README du dépôt du code](https://forge.example.org/mabibli#readme).
est dans le [README du dépôt du code](https://git.akbar.nohost.me/mathieu/mabibli#readme).
+5
View File
@@ -1,5 +1,10 @@
MaBibli est une application de gestion de bibliothèque personnelle, pensée pour un foyer.
⚠️ **Application privée.** L'accès est réservé aux comptes du serveur (`all_users`) et
l'installation ne pose pas la question. MaBibli n'a pas de connexion propre — elle fait
confiance au portail YunoHost — et toute personne autorisée peut modifier et supprimer
n'importe quel livre. **Ne l'ouvrez pas aux visiteurs.**
- **Catalogue** des livres physiques et des ebooks (fiches uniquement, aucun fichier n'est hébergé).
- **Prêts** : à qui le livre a été confié, depuis quand, et l'historique complet des prêts passés.
- **Scan ISBN** au code-barres depuis le téléphone, ou saisie manuelle, avec pré-remplissage automatique du titre, de l'auteur, de l'éditeur et de la couverture.
+41 -7
View File
@@ -13,7 +13,7 @@ maintainers = ["mathieu"]
[upstream]
license = "AGPL-3.0-or-later"
code = "https://forge.example.org/mabibli"
code = "https://git.akbar.nohost.me/mathieu/mabibli"
[integration]
yunohost = ">= 12.1.38"
@@ -83,11 +83,18 @@ ram.runtime = "256M"
# le cœur classe l'app en « full_domain » et refusera un changement d'URL vers
# un sous-chemin.
[install.init_main_permission]
type = "group"
default = "all_users"
help.fr = "Qui peut accéder à la bibliothèque. MaBibli n'a pas de connexion propre : l'identité vient du portail YunoHost, et la collection est commune à toutes les personnes autorisées."
help.en = "Who may access the library. MaBibli has no login of its own: identity comes from the YunoHost portal, and the collection is shared between all allowed users."
# Pas de question `init_main_permission` : l'accès est fixé à `all_users` par la
# ressource `permissions` ci-dessous, et l'installation ne demande donc rien.
#
# Vérifié dans le cœur YunoHost (`src/utils/resources.py`) :
#
# init_allowed = infos["allowed"] or self.get_setting(f"init_{perm}_permission") or []
#
# `allowed` l'emporte sur la question ; garder la question l'aurait donc posée pour
# rien, en laissant croire que la réponse comptait.
#
# ⚠️ Ce code ne s'exécute qu'à la CRÉATION de la permission. Une montée de version ne
# réaligne rien : un accès élargi à la main le reste.
[resources]
@@ -98,7 +105,7 @@ ram.runtime = "256M"
# self-contained (CLAUDE.md, « Ne jamais compiler sur le serveur »).
#
# Ces deux valeurs sont réécrites par `build/publier.sh`.
amd64.url = "https://forge.example.org/mabibli/releases/download/v0.5.0/mabibli-0.5.0-linux-x64.tar.gz"
amd64.url = "https://git.akbar.nohost.me/mathieu/mabibli/releases/download/v0.5.0/mabibli-0.5.0-linux-x64.tar.gz"
amd64.sha256 = "15fb2ee67fb8f3a77a4c4734229e74d2605231713e100da38972d4dcf29e225d"
# L'archive dépose ses fichiers à la racine, sans dossier intermédiaire.
@@ -130,6 +137,33 @@ ram.runtime = "256M"
main.url = "/"
main.auth_header = true
# ╔══════════════════════════════════════════════════════════════════════════════╗
# ║ ⚠️ MaBibli EST UNE APPLICATION PRIVÉE. NE JAMAIS L'OUVRIR AUX `visitors`. ║
# ╚══════════════════════════════════════════════════════════════════════════════╝
#
# Ce n'est pas une préférence de confidentialité, c'est une propriété du code, et
# elle vaut sur les DEUX moitiés de l'application :
#
# • L'application n'a AUCUNE authentification propre. Elle lit `YNH_USER`, un
# en-tête que SSOwat injecte, et fait confiance à ce qu'il contient. Ouverte aux
# visiteurs, il n'y a plus personne pour l'écraser : tout ce qui est PERSONNEL
# (statuts de lecture, liste d'envies) devient lisible et modifiable par le
# premier venu. C'est la même frontière que « le service n'écoute que sur
# 127.0.0.1 » — SSOwat n'est pas un confort, c'est la seule porte.
#
# • Il n'existe AUCUNE notion d'écriture réservée. Toute personne autorisée peut
# ajouter, modifier et SUPPRIMER n'importe quel livre du catalogue commun, ainsi
# que noter un prêt ou son retour. C'est délibéré — un foyer, pas un service
# public — et cela suppose que les personnes autorisées se connaissent.
#
# `all_users` est donc le plus large qui ait du sens : les comptes du serveur.
# Restreindre davantage (un groupe dédié) est légitime ; élargir ne l'est pas.
#
# ⚠️ Volontairement PAS `protected = true` : l'administrateur du serveur reste
# maître de ses permissions, et peut vouloir restreindre à un groupe. C'est
# l'élargissement qui est un contresens, pas le réglage lui-même.
main.allowed = "all_users"
[resources.ports]
# Port interne uniquement. `exposed` vaut `false` par défaut : le pare-feu reste
# fermé, et l'unité systemd n'écoute que sur 127.0.0.1.