diff --git a/README.md b/README.md index 5483e96..5ff51bd 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/build/publier.sh b/build/publier.sh index 330b1cd..10f03bc 100755 --- a/build/publier.sh +++ b/build/publier.sh @@ -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" diff --git a/conf/systemd.service b/conf/systemd.service index 6c52e1e..85ff564 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -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] diff --git a/doc/ADMIN.md b/doc/ADMIN.md index 6e5a6bb..c80710c 100644 --- a/doc/ADMIN.md +++ b/doc/ADMIN.md @@ -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). diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 324b2f4..f21f067 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -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. diff --git a/manifest.toml b/manifest.toml index c0bbd61..21582a7 100644 --- a/manifest.toml +++ b/manifest.toml @@ -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.