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:
@@ -1,6 +1,6 @@
|
|||||||
# Paquet YunoHost pour MaBibli
|
# 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).
|
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
|
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
|
## 📖 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,
|
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,
|
publication d'une version, mise en production pas à pas, montée de version, retour arrière,
|
||||||
désinstallation, et contraintes permanentes.
|
désinstallation, et contraintes permanentes.
|
||||||
|
|||||||
+7
-4
@@ -44,10 +44,13 @@ manifeste="$racine_paquet/manifest.toml"
|
|||||||
# passe des options aussi bien que des variables.
|
# passe des options aussi bien que des variables.
|
||||||
# ⚠️ LA SEULE LIGNE À CHANGER pour héberger ce projet ailleurs.
|
# ⚠️ 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.
|
# 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,
|
# Une copie publique du projet porte ici `https://forge.example.org/mabibli`, injoignable
|
||||||
# plutôt que d'écrire une URL morte dans le manifeste — voir les contrôles préalables.
|
# par construction (example.org est réservé à la documentation par la RFC 2606). Le
|
||||||
depot_code="https://forge.example.org/mabibli"
|
# 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)"
|
source_dir="$(cd "$racine_paquet/../mabibli" 2>/dev/null && pwd || true)"
|
||||||
base_url="$depot_code/releases/download"
|
base_url="$depot_code/releases/download"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=MaBibli — gestion de bibliothèque personnelle
|
Description=MaBibli — gestion de bibliothèque personnelle
|
||||||
Documentation=https://forge.example.org/mabibli
|
Documentation=https://git.akbar.nohost.me/mathieu/mabibli
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
|
|||||||
+22
-1
@@ -11,6 +11,27 @@ aux données, et le schéma est migré automatiquement au démarrage. Rien à la
|
|||||||
|
|
||||||
## Qui a accès
|
## 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
|
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.
|
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 —
|
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).
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
MaBibli est une application de gestion de bibliothèque personnelle, pensée pour un foyer.
|
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é).
|
- **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.
|
- **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.
|
- **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
@@ -13,7 +13,7 @@ maintainers = ["mathieu"]
|
|||||||
|
|
||||||
[upstream]
|
[upstream]
|
||||||
license = "AGPL-3.0-or-later"
|
license = "AGPL-3.0-or-later"
|
||||||
code = "https://forge.example.org/mabibli"
|
code = "https://git.akbar.nohost.me/mathieu/mabibli"
|
||||||
|
|
||||||
[integration]
|
[integration]
|
||||||
yunohost = ">= 12.1.38"
|
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
|
# le cœur classe l'app en « full_domain » et refusera un changement d'URL vers
|
||||||
# un sous-chemin.
|
# un sous-chemin.
|
||||||
|
|
||||||
[install.init_main_permission]
|
# Pas de question `init_main_permission` : l'accès est fixé à `all_users` par la
|
||||||
type = "group"
|
# ressource `permissions` ci-dessous, et l'installation ne demande donc rien.
|
||||||
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."
|
# Vérifié dans le cœur YunoHost (`src/utils/resources.py`) :
|
||||||
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."
|
#
|
||||||
|
# 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]
|
[resources]
|
||||||
|
|
||||||
@@ -98,7 +105,7 @@ ram.runtime = "256M"
|
|||||||
# self-contained (CLAUDE.md, « Ne jamais compiler sur le serveur »).
|
# self-contained (CLAUDE.md, « Ne jamais compiler sur le serveur »).
|
||||||
#
|
#
|
||||||
# Ces deux valeurs sont réécrites par `build/publier.sh`.
|
# 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"
|
amd64.sha256 = "15fb2ee67fb8f3a77a4c4734229e74d2605231713e100da38972d4dcf29e225d"
|
||||||
|
|
||||||
# L'archive dépose ses fichiers à la racine, sans dossier intermédiaire.
|
# L'archive dépose ses fichiers à la racine, sans dossier intermédiaire.
|
||||||
@@ -130,6 +137,33 @@ ram.runtime = "256M"
|
|||||||
main.url = "/"
|
main.url = "/"
|
||||||
main.auth_header = true
|
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]
|
[resources.ports]
|
||||||
# Port interne uniquement. `exposed` vaut `false` par défaut : le pare-feu reste
|
# 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.
|
# fermé, et l'unité systemd n'écoute que sur 127.0.0.1.
|
||||||
|
|||||||
Reference in New Issue
Block a user