Restaure les vraies URL, et fixe l'acces a all_users sans le demander

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.

--- L'installation ne demande plus qui a acces

init_main_permission quitte [install] au profit de
resources.permissions.main.allowed = "all_users". Verifie dans le coeur
YunoHost (src/utils/resources.py) :

    init_allowed = infos["allowed"] or self.get_setting(f"init_{perm}_permission") or []

allowed L'EMPORTE sur la question. La garder l'aurait donc posee pour rien, en
laissant croire que la reponse comptait.

⚠ Ce n'est pas un reglage de confort : visitors casserait deux invariants du
code. L'application n'a aucune authentification propre — elle fait confiance a
YNH_USER parce que SSOwat l'ecrase a chaque requete, exactement comme elle
n'ecoute que sur 127.0.0.1 — et toute personne autorisee peut SUPPRIMER
n'importe quel livre du catalogue commun, sans role ni lecture seule.

⚠ Pas de protected = true, delibere : restreindre a un groupe dedie reste
legitime, et c'est l'affaire de l'administrateur. C'est l'elargissement qui est
un contresens, pas le reglage.

⚠ allowed n'agit qu'a la CREATION de la permission (if perm not in
existing_perms) : une montee de version ne realigne rien. 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-meme.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-22 14:29:10 +02:00
co-authored by Claude Opus 5
parent 5ebfd4a82b
commit d0ebecc233
6 changed files with 78 additions and 15 deletions
+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.