From 2caf7000de595e245d0648327e243f3f25a44514 Mon Sep 17 00:00:00 2001 From: moutonjr Date: Fri, 4 Feb 2022 12:25:38 +0100 Subject: [PATCH 01/12] Remove YNH panel what's breaking Keeweb content display Issue #25 --- conf/nginx.conf | 3 --- 1 file changed, 3 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 723ac56..330afe3 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -9,7 +9,4 @@ location __PATH__/ { # default_type text/html; more_set_headers "Content-Security-Policy : default-src 'self'; font-src data:; script-src __DOMAIN__ 'unsafe-inline' 'unsafe-eval'; style-src 'unsafe-inline' __DOMAIN__ blob:; connect-src 'self' ws: https:; child-src 'self' blob:; worker-src 'self' blob:; img-src 'self' data: blob: https://services.keeweb.info/; object-src 'none'; form-action 'none';"; - - # Include SSOWAT user panel. - include conf.d/yunohost_panel.conf.inc; } From 24230824c9377d967367b53da254e1c2faf2018b Mon Sep 17 00:00:00 2001 From: moutonjr Date: Fri, 4 Feb 2022 12:29:26 +0100 Subject: [PATCH 02/12] Update version for global upgrade --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 5fbdfc4..620214d 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Password manager compatible with KeePass.", "fr": "Gestionnaire de mots de passe compatible avec KeePass." }, - "version": "1.18.7~ynh1", + "version": "1.18.8~ynh1", "url": "https://keeweb.info/", "license": "MIT", "maintainer": { From 7ed2c6796efbcdca5363e7b369271eee785a8a37 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 4 Feb 2022 15:22:16 +0100 Subject: [PATCH 03/12] 4.3 --- YEP.md | 117 --------------------------------- check_process | 6 +- conf/nginx.conf | 5 +- doc/screenshots/screenshot.png | Bin 0 -> 106261 bytes manifest.json | 16 +++-- 5 files changed, 15 insertions(+), 129 deletions(-) delete mode 100644 YEP.md create mode 100644 doc/screenshots/screenshot.png diff --git a/YEP.md b/YEP.md deleted file mode 100644 index 16adf62..0000000 --- a/YEP.md +++ /dev/null @@ -1,117 +0,0 @@ -#### [Level 0](https://github.com/YunoHost/doc/blob/master/packaging_apps_levels_fr.md#niveau-0) -[YEP 1.1 - Nommer son app et son dépot](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-11) -`Validated` -[YEP 1.2 - Inscrire l'app sur un "répertoire" connu](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-12) -`Validated` - -#### [Level 1](https://github.com/YunoHost/doc/blob/master/packaging_apps_levels_fr.md#niveau-1) -[YEP 2.2 - Utiliser bash pour les scripts principaux](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-22) -`Validated` -[YEP 2.5 - Copier correctement des fichiers](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-25) -`Don't know` -[YEP 2.7 - Donner des permissions suffisantes aux instructions bash](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-27) -`Validated` -[YEP 2.15 - Suivre les instructions d'installation de l'application](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-215) -`Validated` - -#### [Level 2](https://github.com/YunoHost/doc/blob/master/packaging_apps_levels_fr.md#niveau-2) -[YEP 1.5 - Mettre à jour régulièrement le statut de l'app](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-11) -`Validated` -[YEP 2.18.2 - Gérer l'installation à la racine d’un nom de domaine](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-2182) -`Validated` - *Automatically verified.* -[YEP 2.18.3 - Gérer l'installation sur un sous-domaine](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-2183) -`Validated` - *Automatically verified.* -[YEP 2.18.4 - Gérer l'installation sur un chemin /path](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-2184) -`Validated` - *Automatically verified.* -[YEP 4.6 - Gère le multi-instance](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-11) -`Validated` - *Automatically verified.* - -#### [Level 3](https://github.com/YunoHost/doc/blob/master/packaging_apps_levels_fr.md#niveau-3) -[YEP 2.3 - Sauvegarder les réponses lors de l'installation](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-23) -`Validated` - -#### [Level 4](https://github.com/YunoHost/doc/blob/master/packaging_apps_levels_fr.md#niveau-4) -[YEP 4.1 - Lier au ldap](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-41) -`Not applicable` -[YEP 4.2 - Lier l'authentification au sso](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-42) -`Not applicable` - -#### [Level 5](https://github.com/YunoHost/doc/blob/master/packaging_apps_levels_fr.md#niveau-5) -[YEP 1.3 - Indiquer la licence associée au paquet](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-13) -`Validated` -[YEP 2.1 - Respecter le format du manifeste](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-21) -`Validated` - *Automatically verified.* -[YEP 2.12 - Utiliser les commandes pratiques (helpers)](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-212) -`Validated` -[YEP 2.18.1 - Lancer le script d'installation d'une webapp correctement](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-2181) -`Not applicable` - -#### [Level 6](https://github.com/YunoHost/doc/blob/master/packaging_apps_levels_fr.md#niveau-6) -[YEP 1.4 - Informer sur l'intention de maintenir un paquet](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-14) -`Not yet validated` -[YEP 1.6 - Se tenir informé sur l'évolution du packaging d'apps](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-16) -`Validated` -[YEP 1.7 - Ajouter l'app à l'organisation YunoHost-Apps](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-17) -`Validated` - *Automatically verified.* -[YEP 1.8 - Publier des demandes de test](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-18) -`Validated` -[YEP 1.9 - Documenter l'app](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-19) -`Not yet validated` -[YEP 1.10 - Garder un historique de version propre](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-110) -`Don't know` -[YEP 2.9 - Enlever toutes traces de l'app lors de la suppression](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-29) -`Validated` -[YEP 3.3 - Faciliter le contrôle de l'intégrité des sources](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-33) -`Validated` -[YEP 3.5 - Suivre les recommendations de la documentation de l'app](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-35) -`Validated` -[YEP 3.6 - Mettre à jour les versions contenant des CVE](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-36) -`Validated` -[YEP 4.3 - Fournir un script de sauvegarde YunoHost fonctionnel](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-43) -`Validated` - *Automatically verified.* -[YEP 4.4 - Fournir un script de restauration YunoHost fonctionnel](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-44) -`Validated` - *Automatically verified.* - -#### [Level 7](https://github.com/YunoHost/doc/blob/master/packaging_apps_levels_fr.md#niveau-7) -[YEP 2.6 - Annuler l'action si les valeurs d'entrées sont incorrectes](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-26) -`Validated` -[YEP 3.2 - Ouvrir un port correctement](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-32) -`Not applicable` - -#### [Level 8](https://github.com/YunoHost/doc/blob/master/packaging_apps_levels_fr.md#niveau-8) -[YEP 2.4 - Détecter et gérer les erreurs](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-24) -`Validated` -[YEP 2.8 - Modifier correctement une configuration système](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-28) -`Validated` -[YEP 2.16 - Vérifier la disponibilité des dépendances sur ARM, x86 et x64](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-216) -`Validated` - *Automatically verified.* -[YEP 2.18.5 - Gérer la tuile YunoHost pour faciliter la navigation entre les applications](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-2185) -`Validated` -[YEP 3.4 - Isoler l'app](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-34) -`Not yet validated` -[YEP 4.5 - Utiliser les hooks](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-45) -`Not applicable` - -#### [Level 9](https://github.com/YunoHost/doc/blob/master/packaging_apps_levels_fr.md#niveau-9) -[YEP 2.10 - Configurer les logs de l'application](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-210) -`Not applicable` -[YEP 2.11 - Utiliser une variable plutôt que l'app id directement](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-211) -`Validated` -[YEP 2.13 - Traduire le paquet en anglais](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-213) -`Not yet validated` -[YEP 2.14 - Remplir correctement un fichier de conf](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-214) -`Not yet validated` -[YEP 2.17 - Prendre en compte la version d'origine lors des mises à jour](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-217) -`Validated` -[YEP 4.2.1 - Déconnexion](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-421) -`Don't know` - -#### Other YEP -[YEP 3.1 - Ne pas demander ou stocker de mot de passe LDAP](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-31) -`Validated` -[YEP 4.7 - Ajouter un module à la CLI](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-47) -`Not applicable` -[YEP 4.8 - Ajouter un module à l'admin web](https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-48) -`Not applicable` - -State of each YEP can be one of these: `Validated`, `Partially validated`, `Not yet validated`, `Not applicable`, `Don't know`. diff --git a/check_process b/check_process index ac3537a..63badee 100644 --- a/check_process +++ b/check_process @@ -1,8 +1,8 @@ ;; Full test on Keeweb ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - is_public=1 (PUBLIC|public=1|private=0) + domain="domain.tld" + path="/path" + is_public=1 ; Checks pkg_linter=1 setup_sub_dir=1 diff --git a/conf/nginx.conf b/conf/nginx.conf index 723ac56..b3bbf1c 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,12 +1,9 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { + alias __FINALPATH__/; - if ($scheme = http) { - rewrite ^ https://$server_name$request_uri? permanent; - } index index.html ; -# default_type text/html; more_set_headers "Content-Security-Policy : default-src 'self'; font-src data:; script-src __DOMAIN__ 'unsafe-inline' 'unsafe-eval'; style-src 'unsafe-inline' __DOMAIN__ blob:; connect-src 'self' ws: https:; child-src 'self' blob:; worker-src 'self' blob:; img-src 'self' data: blob: https://services.keeweb.info/; object-src 'none'; form-action 'none';"; diff --git a/doc/screenshots/screenshot.png b/doc/screenshots/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..463facc72dbeaa637bc57cbbb99fff9493334dd4 GIT binary patch literal 106261 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 literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json index 5fbdfc4..223c8aa 100644 --- a/manifest.json +++ b/manifest.json @@ -3,18 +3,25 @@ "id": "keeweb", "packaging_format": 1, "description": { - "en": "Password manager compatible with KeePass.", - "fr": "Gestionnaire de mots de passe compatible avec KeePass." + "en": "Password manager compatible with KeePass", + "fr": "Gestionnaire de mots de passe compatible avec KeePass" }, "version": "1.18.7~ynh1", "url": "https://keeweb.info/", + "upstream": { + "license": "MIT", + "website": "https://keeweb.info/", + "demo": "https://app.keeweb.info/", + "admindoc": "https://github.com/keeweb/keeweb/wiki", + "code": "https://github.com/keeweb/keeweb" + }, "license": "MIT", "maintainer": { "name": "kay0u", "email": "pierre@kayou.io" }, "requirements": { - "yunohost": ">= 4.1.7" + "yunohost": ">= 4.3.0" }, "multi_instance": true, "services": [ @@ -24,8 +31,7 @@ "install" : [ { "name": "domain", - "type": "domain", - "example": "example.com" + "type": "domain" }, { "name": "path", From ba7695555fa6012e96dbe716167387da90c2ab13 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Fri, 4 Feb 2022 14:22:22 +0000 Subject: [PATCH 04/12] Auto-update README --- README.md | 78 +++++++++++++++++----------------------------------- README_fr.md | 78 ++++++++++++++++------------------------------------ 2 files changed, 48 insertions(+), 108 deletions(-) diff --git a/README.md b/README.md index 79c5fe6..41328d9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ + + # Keeweb for YunoHost [![Integration level](https://dash.yunohost.org/integration/keeweb.svg)](https://dash.yunohost.org/appci/app/keeweb) ![](https://ci-apps.yunohost.org/ci/badges/keeweb.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/keeweb.maintain.svg) @@ -5,71 +10,38 @@ *[Lire ce readme en français.](./README_fr.md)* -> *This package allow you to install Keeweb quickly and simply on a YunoHost server. -If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to know how to install and enjoy it.* +> *This package allows you to install Keeweb quickly and simply on a YunoHost server. +If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* ## Overview -Web client for reading and editing Keepass files locally. It can also sync with WebDAV (Nextcloud, Dropbox, Google Drive, OneDrive...) -**Shipped version:** 1.7.7 +Password manager compatible with KeePass + +**Shipped version:** 1.18.7~ynh1 + +**Demo:** https://app.keeweb.info/ ## Screenshots -![](https://github.com/keeweb/keeweb/blob/master/img/screenshot.png) +![](./doc/screenshots/screenshot.png) -## Demo +## Documentation and resources -https://app.keeweb.info/ +* Official app website: https://keeweb.info/ +* Official admin documentation: https://github.com/keeweb/keeweb/wiki +* Upstream app code repository: https://github.com/keeweb/keeweb +* YunoHost documentation for this app: https://yunohost.org/app_keeweb +* Report a bug: https://github.com/YunoHost-Apps/keeweb_ynh/issues -## Configuration +## Developer info -Use the web panel of Keeweb to configure it. - -## Documentation - - * Official documentation: https://github.com/keeweb/keeweb/wiki - * YunoHost documentation: There no other documentations, feel free to contribute. - -## YunoHost specific features - -#### Multi-users support - -No users support. - -#### Supported architectures - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/keeweb.svg)](https://ci-apps.yunohost.org/ci/apps/keeweb/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/keeweb.svg)](https://ci-apps-arm.yunohost.org/ci/apps/keeweb/) - -## Additionnal informations - -### Usage with Nextcloud -1. Open your file through webdav using https://linktoowncloud/remote.php/webdav/PATH-TO-YOUR-KDBX-FILE and your username and password (no need to enter username and password if you are using a private Keeweb, as it will automatically detect that you are logged in NextCloud) - -### Usage for Dropbox sync -1. [create](https://www.dropbox.com/developers/apps/create) a Dropbox app -2. find your app key (in Dropbox App page, go to Settings/App key) -3. Enter the app key when prompted - -### Add default files on your homepage -1. Read https://github.com/keeweb/keeweb/wiki/Configuration#json-app-config -2. In your config.json add the "files" entry with the appropriate settings - -## Links - - * Report a bug: https://github.com/YunoHost-Apps/keeweb_ynh/issues - * Keeweb website: https://keeweb.info/ - * YunoHost website: https://yunohost.org/ - ---- - -## Developers infos - -Please do your pull request to the [testing branch](https://github.com/YunoHost-Apps/keeweb_ynh/tree/testing). +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/keeweb_ynh/tree/testing). To try the testing branch, please proceed like that. ``` -sudo yunohost app install https://github.com/YunoHost-Apps/keeweb_ynh/tree/testing --verbose +sudo yunohost app install https://github.com/YunoHost-Apps/keeweb_ynh/tree/testing --debug or -sudo yunohost app upgrade keeweb -u https://github.com/YunoHost-Apps/keeweb_ynh/tree/testing --verbose +sudo yunohost app upgrade keeweb -u https://github.com/YunoHost-Apps/keeweb_ynh/tree/testing --debug ``` + +**More info regarding app packaging:** https://yunohost.org/packaging_apps \ No newline at end of file diff --git a/README_fr.md b/README_fr.md index 1bfd490..d6dea13 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,75 +1,43 @@ # Keeweb pour YunoHost -[![Integration level](https://dash.yunohost.org/integration/keeweb.svg)](https://dash.yunohost.org/appci/app/keeweb) ![](https://ci-apps.yunohost.org/ci/badges/keeweb.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/keeweb.maintain.svg) +[![Niveau d'intégration](https://dash.yunohost.org/integration/keeweb.svg)](https://dash.yunohost.org/appci/app/keeweb) ![](https://ci-apps.yunohost.org/ci/badges/keeweb.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/keeweb.maintain.svg) [![Installer Keeweb avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=keeweb) *[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* -> *Ce package vous permet d'installer Keeweb rapidement et simplement sur un serveur YunoHost. -Si vous n'avez pas YunoHost, merci de regarder [ici](https://yunohost.org/#/install_fr) pour savoir comment l'installer et en profiter.* +> *Ce package vous permet d'installer Keeweb rapidement et simplement sur un serveur YunoHost. +Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l'installer et en profiter.* -## Résumé -Client Web pour la lecture et l'édition de fichiers Keepass en local. Il peut également synchroniser avec WebDAV (Nextcloud, Dropbox, Google Drive, OneDrive...) +## Vue d'ensemble -**Version embarquée :** 1.7.7 +Gestionnaire de mots de passe compatible avec KeePass + +**Version incluse :** 1.18.7~ynh1 + +**Démo :** https://app.keeweb.info/ ## Captures d'écran -![](https://github.com/keeweb/keeweb/blob/master/img/screenshot.png) +![](./doc/screenshots/screenshot.png) -## Démo +## Documentations et ressources -https://app.keeweb.info/ +* Site officiel de l'app : https://keeweb.info/ +* Documentation officielle de l'admin : https://github.com/keeweb/keeweb/wiki +* Dépôt de code officiel de l'app : https://github.com/keeweb/keeweb +* Documentation YunoHost pour cette app : https://yunohost.org/app_keeweb +* Signaler un bug : https://github.com/YunoHost-Apps/keeweb_ynh/issues -## Configuration - -Utilisez Keeweb pour configurer. - -## Documentation - - * Documentation officielle : https://github.com/keeweb/keeweb/wiki - * Documentation YunoHost : Il n'y a pas d'autre documentation, n'hésitez pas à contribuer. - -## Fonctionnalités spécifiques à YunoHost - -#### Support multi-utilisateurs - -Pas de support utilisateurs - -#### Architectures supportées. - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/keeweb.svg)](https://ci-apps.yunohost.org/ci/apps/keeweb/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/keeweb.svg)](https://ci-apps-arm.yunohost.org/ci/apps/keeweb/) - -## Informations additionnelles - -### Usage avec Nextcloud -1. Ouvrez votre fichier via webdav en utilisant https://linktoowncloud/remote.php/webdav/PATH-TO-YOUR-KDBX-FILE et votre nom d'utilisateur et votre mot de passe (pas besoin d'entrer votre nom d'utilisateur et votre mot de passe si vous utilisez un Keeweb privé, car il détectera automatiquement que vous êtes connecté dans Nextcloud) - -### Usage pour Dropbox sync -1. [Créer](https://www.dropbox.com/developers/apps/create) une app Dropbox -2. Trouver votre clé d'application (dans la page Dropbox App, allez à Paramètres/Clé d'application) -3. Entrer la clé de l'application lorsque vous y êtes invité - -### Ajouter des fichiers par défaut sur votre page d'accueil -1. Lisez https://github.com/keeweb/keeweb/wiki/Configuration#json-app-config -2. Dans votre config.json ajoutez l'entrée "files" avec les paramètres appropriés - -## Liens - - * Reporter un bug: https://github.com/YunoHost-Apps/keeweb_ynh/issues - * Site de Keeweb: https://keeweb.info/ - * Site de YunoHost: https://yunohost.org/ - ---- - -## Informations à l'intention des développeurs +## Informations pour les développeurs Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/keeweb_ynh/tree/testing). -Pour tester la branche testing, merci de procéder ainsi. +Pour essayer la branche testing, procédez comme suit. ``` -sudo yunohost app install https://github.com/YunoHost-Apps/keeweb_ynh/tree/testing --verbose +sudo yunohost app install https://github.com/YunoHost-Apps/keeweb_ynh/tree/testing --debug ou -sudo yunohost app upgrade keeweb -u https://github.com/YunoHost-Apps/keeweb_ynh/tree/testing --verbose +sudo yunohost app upgrade keeweb -u https://github.com/YunoHost-Apps/keeweb_ynh/tree/testing --debug ``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file From 617343e7ce7703a83492619a0c32305f078ae112 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Fri, 4 Feb 2022 14:23:27 +0000 Subject: [PATCH 05/12] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 41328d9..86d10f9 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Password manager compatible with KeePass -**Shipped version:** 1.18.7~ynh1 +**Shipped version:** 1.18.8~ynh1 **Demo:** https://app.keeweb.info/ diff --git a/README_fr.md b/README_fr.md index d6dea13..b169c09 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Gestionnaire de mots de passe compatible avec KeePass -**Version incluse :** 1.18.7~ynh1 +**Version incluse :** 1.18.8~ynh1 **Démo :** https://app.keeweb.info/ From 1f4b8f2093a123b83ce5625f658b298e02ab1b06 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 4 Feb 2022 15:25:15 +0100 Subject: [PATCH 06/12] Create DESCRIPTION.md --- doc/DESCRIPTION.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/DESCRIPTION.md diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..7b49f69 --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1 @@ +This webapp is a browser password manager compatible with KeePass databases. It doesn't require any server or additional resources. \ No newline at end of file From 4f0f6271763e85b0f0ab99d972fe24555d70d5e9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 4 Feb 2022 15:36:57 +0100 Subject: [PATCH 07/12] Fix --- scripts/_common.sh | 240 --------------------------------------------- scripts/backup | 4 +- scripts/change_url | 43 +++----- scripts/install | 18 +--- scripts/remove | 1 - scripts/restore | 26 +---- scripts/upgrade | 52 +++++----- 7 files changed, 43 insertions(+), 341 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 351cb2c..cf080fd 100755 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,243 +4,3 @@ # EXPERIMENTAL HELPERS #================================================= -# Install or update the main directory yunohost.multimedia -# -# usage: ynh_multimedia_build_main_dir -ynh_multimedia_build_main_dir () { - local ynh_media_release="v1.0" - local checksum="4852c8607db820ad51f348da0dcf0c88" - - # Download yunohost.multimedia scripts - wget -nv https://github.com/YunoHost-Apps/yunohost.multimedia/archive/${ynh_media_release}.tar.gz 2>&1 - - # Check the control sum - echo "${checksum} ${ynh_media_release}.tar.gz" | md5sum -c --status \ - || ynh_die "Corrupt source" - - # Extract - mkdir yunohost.multimedia-master - tar -xf ${ynh_media_release}.tar.gz -C yunohost.multimedia-master --strip-components 1 - ./yunohost.multimedia-master/script/ynh_media_build.sh -} - -# Add a directory in yunohost.multimedia -# This "directory" will be a symbolic link to a existing directory. -# -# usage: ynh_multimedia_addfolder "Source directory" "Destination directory" -# -# | arg: -s, --source_dir= - Source directory - The real directory which contains your medias. -# | arg: -d, --dest_dir= - Destination directory - The name and the place of the symbolic link, relative to "/home/yunohost.multimedia" -ynh_multimedia_addfolder () { - # Declare an array to define the options of this helper. - declare -Ar args_array=( [s]=source_dir= [d]=dest_dir= ) - local source_dir - local dest_dir - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - - ./yunohost.multimedia-master/script/ynh_media_addfolder.sh --source="$source_dir" --dest="$dest_dir" -} - -# Move a directory in yunohost.multimedia, and replace by a symbolic link -# -# usage: ynh_multimedia_movefolder "Source directory" "Destination directory" -# -# | arg: -s, --source_dir= - Source directory - The real directory which contains your medias. -# It will be moved to "Destination directory" -# A symbolic link will replace it. -# | arg: -d, --dest_dir= - Destination directory - The new name and place of the directory, relative to "/home/yunohost.multimedia" -ynh_multimedia_movefolder () { - # Declare an array to define the options of this helper. - declare -Ar args_array=( [s]=source_dir= [d]=dest_dir= ) - local source_dir - local dest_dir - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - - ./yunohost.multimedia-master/script/ynh_media_addfolder.sh --inv --source="$source_dir" --dest="$dest_dir" -} - -# Allow an user to have an write authorisation in multimedia directories -# -# usage: ynh_multimedia_addaccess user_name -# -# | arg: -u, --user_name= - The name of the user which gain this access. -ynh_multimedia_addaccess () { - # Declare an array to define the options of this helper. - declare -Ar args_array=( [u]=user_name=) - local user_name - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - - groupadd -f multimedia - usermod -a -G multimedia $user_name -} - -#================================================= - -# Send an email to inform the administrator -# -# usage: ynh_send_readme_to_admin app_message [recipients] -# | arg: -m --app_message= - The message to send to the administrator. -# | arg: -r, --recipients= - The recipients of this email. Use spaces to separate multiples recipients. - default: root -# example: "root admin@domain" -# If you give the name of a YunoHost user, ynh_send_readme_to_admin will find its email adress for you -# example: "root admin@domain user1 user2" -ynh_send_readme_to_admin() { - # Declare an array to define the options of this helper. - declare -Ar args_array=( [m]=app_message= [r]=recipients= [s]=subject= ) - local app_message - local recipients - local subject - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - local app_message="${app_message:-...No specific information...}" - local recipients="${recipients:-root}" - local subject="☁️🆈🅽🅷☁️: \`$app\`${subject:-" was just installed!"}" - - # Retrieve the email of users - find_mails () { - local list_mails="$1" - local mail - local recipients=" " - # Read each mail in argument - for mail in $list_mails - do - # Keep root or a real email address as it is - if [ "$mail" = "root" ] || echo "$mail" | grep --quiet "@" - then - recipients="$recipients $mail" - else - # But replace an user name without a domain after by its email - if mail=$(ynh_user_get_info "$mail" "mail" 2> /dev/null) - then - recipients="$recipients $mail" - fi - fi - done - echo "$recipients" - } - recipients=$(find_mails "$recipients") - - local mail_message="This is an automated message from your beloved YunoHost server. - -Specific information for the application $app. - -$app_message - ---- -Automatic diagnosis data from YunoHost - -$(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')" - - # Define binary to use for mail command - if [ -e /usr/bin/bsd-mailx ] - then - local mail_bin=/usr/bin/bsd-mailx - else - local mail_bin=/usr/bin/mail.mailutils - fi - - # Send the email to the recipients - echo "$mail_message" | $mail_bin -a "Content-Type: text/plain; charset=UTF-8" -s "$subject" "$recipients" -} - -#================================================= - -# Reload (or other actions) a service and print a log in case of failure. -# -# usage: ynh_system_reload service_name [action] -# | arg: -n, --service_name= - Name of the service to reload -# | arg: -a, --action= - Action to perform with systemctl. Default: reload -ynh_system_reload () { - # Declare an array to define the options of this helper. - declare -Ar args_array=( [n]=service_name= [a]=action= ) - local service_name - local action - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - local action=${action:-reload} - - # Reload, restart or start and print the log if the service fail to start or reload - systemctl $action $service_name || ( journalctl --lines=20 -u $service_name >&2 && false) -} - -#================================================= - -ynh_maintenance_mode_ON () { - # Load value of $path_url and $domain from the config if their not set - if [ -z $path_url ]; then - path_url=$(ynh_app_setting_get $app path) - fi - if [ -z $domain ]; then - domain=$(ynh_app_setting_get $app domain) - fi - - # Create an html to serve as maintenance notice - echo " - - - -Your app $app is currently under maintenance! - - - -

Your app $app is currently under maintenance!

-

This app has been put under maintenance by your administrator at $(date)

-

Please wait until the maintenance operation is done. This page will be reloaded as soon as your app will be back.

- - -" > "/var/www/html/maintenance.$app.html" - - # Create a new nginx config file to redirect all access to the app to the maintenance notice instead. - echo "# All request to the app will be redirected to ${path_url}_maintenance and fall on the maintenance notice -rewrite ^${path_url}/(.*)$ ${path_url}_maintenance/? redirect; -# Use another location, to not be in conflict with the original config file -location ${path_url}_maintenance/ { -alias /var/www/html/ ; - -try_files maintenance.$app.html =503; - -# Include SSOWAT user panel. -include conf.d/yunohost_panel.conf.inc; -}" > "/etc/nginx/conf.d/$domain.d/maintenance.$app.conf" - - # The current config file will redirect all requests to the root of the app. - # To keep the full path, we can use the following rewrite rule: - # rewrite ^${path_url}/(.*)$ ${path_url}_maintenance/\$1? redirect; - # The difference will be in the $1 at the end, which keep the following queries. - # But, if it works perfectly for a html request, there's an issue with any php files. - # This files are treated as simple files, and will be downloaded by the browser. - # Would be really be nice to be able to fix that issue. So that, when the page is reloaded after the maintenance, the user will be redirected to the real page he was. - - systemctl reload nginx -} - -ynh_maintenance_mode_OFF () { - # Load value of $path_url and $domain from the config if their not set - if [ -z $path_url ]; then - path_url=$(ynh_app_setting_get $app path) - fi - if [ -z $domain ]; then - domain=$(ynh_app_setting_get $app domain) - fi - - # Rewrite the nginx config file to redirect from ${path_url}_maintenance to the real url of the app. - echo "rewrite ^${path_url}_maintenance/(.*)$ ${path_url}/\$1 redirect;" > "/etc/nginx/conf.d/$domain.d/maintenance.$app.conf" - systemctl reload nginx - - # Sleep 4 seconds to let the browser reload the pages and redirect the user to the app. - sleep 4 - - # Then remove the temporary files used for the maintenance. - rm "/var/www/html/maintenance.$app.html" - rm "/etc/nginx/conf.d/$domain.d/maintenance.$app.conf" - - systemctl reload nginx -} diff --git a/scripts/backup b/scripts/backup index 478d80f..149cafd 100644 --- a/scripts/backup +++ b/scripts/backup @@ -23,8 +23,8 @@ ynh_print_info --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME -final_path=$(ynh_app_setting_get $app final_path) -domain=$(ynh_app_setting_get $app domain) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +domain=$(ynh_app_setting_get --app=$app --key=domain) #================================================= # DECLARE DATA AND CONF FILES TO BACKUP diff --git a/scripts/change_url b/scripts/change_url index 6dfbb14..8352d11 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -24,25 +24,26 @@ app=$YNH_APP_INSTANCE_NAME #================================================= # LOAD SETTINGS #================================================= +ynh_script_progression --message="Loading installation settings..." -final_path=$(ynh_app_setting_get $app final_path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) #================================================= -# CHECK THE SYNTAX OF THE PATHS +# BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP #================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." -test -n "$old_path" || old_path="/" -test -n "$new_path" || new_path="/" -new_path=$(ynh_normalize_url_path $new_path) -old_path=$(ynh_normalize_url_path $old_path) +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. + ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" -#================================================= -# ACTIVATE MAINTENANCE MODE -#================================================= - -path_url=$old_path -domain=$old_domain -ynh_maintenance_mode_ON + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors #================================================= # CHECK WHICH PARTS SHOULD BE CHANGED @@ -60,18 +61,12 @@ then change_path=1 fi -#================================================= -# MANAGE FAILURE OF THE SCRIPT -#================================================= - -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - #================================================= # STANDARD MODIFICATIONS #================================================= # MODIFY URL IN NGINX CONF #================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf @@ -112,14 +107,6 @@ ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload -#================================================= -# DEACTIVE MAINTENANCE MODE -#================================================= - -path_url=$old_path -domain=$old_domain -ynh_maintenance_mode_OFF - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/install b/scripts/install index 4c269f8..257f33c 100644 --- a/scripts/install +++ b/scripts/install @@ -79,15 +79,9 @@ ynh_replace_string "(no-config)" "config.json" "$final_path/index.html" #================================================= # COPY THE CONFIG FILE #================================================= +ynh_script_progression --message="Adding a configuration file..." -cp ../conf/config.json "$final_path/config.json" - -#================================================= -# STORE THE CHECKSUM OF THE CONFIG FILE -#================================================= - -# Enregistre la somme de contrôle du fichier de config -ynh_store_file_checksum "$final_path/config.json" +ynh_add_config --template="../conf/config.json" --destination="$final_path/config.json" #================================================= # GENERIC FINALISATION @@ -116,14 +110,6 @@ ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload -#================================================= -# SEND A README FOR THE ADMIN -#================================================= - -message="If you facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/keeweb_ynh" - -ynh_send_readme_to_admin --app_message="$message" --recipients="root" - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/remove b/scripts/remove index 0f9791a..04f8518 100644 --- a/scripts/remove +++ b/scripts/remove @@ -42,4 +42,3 @@ ynh_remove_nginx_config #================================================= ynh_script_progression --message="Removal of $app completed" --last - diff --git a/scripts/restore b/scripts/restore index 02d0f6c..bb77dc0 100644 --- a/scripts/restore +++ b/scripts/restore @@ -29,17 +29,9 @@ final_path=$(ynh_app_setting_get $app final_path) #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= +ynh_script_progression --message="Validating restoration parameters..." -ynh_webpath_available $domain $path_url \ - || ynh_die "Path not available: ${domain}${path_url}" -test ! -d $final_path \ - || ynh_die "There is already a directory: $final_path " - -#================================================= -# ACTIVATE MAINTENANCE MODE -#================================================= - -ynh_maintenance_mode_ON +test ! -d $final_path || ynh_die "There is already a directory: $final_path " #================================================= # STANDARD RESTORE STEPS @@ -71,20 +63,6 @@ ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." ynh_systemd_action --service_name=nginx --action=reload -#================================================= -# DEACTIVE MAINTENANCE MODE -#================================================= - -ynh_maintenance_mode_OFF - -#================================================= -# SEND A README FOR THE ADMIN -#================================================= - -message="If you facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/keeweb_ynh" - -ynh_send_readme_to_admin --app_message="$message" --recipients="root" - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 0d5bbd6..525ca17 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -25,6 +25,19 @@ final_path=$(ynh_app_setting_get $app final_path) upgrade_type=$(ynh_check_app_version_changed) +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= @@ -41,33 +54,20 @@ if ynh_legacy_permissions_exists; then ynh_app_setting_delete --app=$app --key=is_public fi -#================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP -#================================================= - -# Backup the current version of the app -ynh_backup_before_upgrade -ynh_clean_setup () { - # restore it if the upgrade fails - ynh_restore_upgradebackup -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# ACTIVATE MAINTENANCE MODE -#================================================= - -ynh_maintenance_mode_ON - #================================================= # STANDARD UPGRADE STEPS #================================================= # INSTALL SOURCES #================================================= -mkdir -p "$final_path" -cp -r ../sources/extra_files/app/* "$final_path" +if [ "$upgrade_type" == "UPGRADE_APP" ] +then + ynh_script_progression --message="Upgrading source files..." --time --weight=1 + + # Download, check integrity, uncompress and patch the source from app.src + mkdir -p "$final_path" + cp -r ../sources/extra_files/app/* "$final_path" +fi #================================================= # NGINX CONFIGURATION @@ -88,9 +88,7 @@ ynh_replace_string "(no-config)" "config.json" "$final_path/index.html" #================================================= # Copie ou modification d'un fichier de config -ynh_backup_if_checksum_is_different "$final_path/config.json" # Créé un backup du fichier de config si il a été modifié. -cp ../conf/config.json "$final_path/config.json" -ynh_store_file_checksum "$final_path/config.json" # Réenregistre la somme de contrôle du fichier de config +ynh_add_config --template="../conf/config.json" --destination="$final_path/config.json" #================================================= # GENERIC FINALISATION @@ -108,12 +106,6 @@ ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload -#================================================= -# DEACTIVE MAINTENANCE MODE -#================================================= - -ynh_maintenance_mode_OFF - #================================================= # END OF SCRIPT #================================================= From 5743ba3cb8ad89c54b2ca91ada6a11467d4c2392 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Fri, 4 Feb 2022 14:37:03 +0000 Subject: [PATCH 08/12] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 86d10f9..8467434 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview -Password manager compatible with KeePass +This webapp is a browser password manager compatible with KeePass databases. It doesn't require any server or additional resources. **Shipped version:** 1.18.8~ynh1 diff --git a/README_fr.md b/README_fr.md index b169c09..187b3b5 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,7 +11,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour ## Vue d'ensemble -Gestionnaire de mots de passe compatible avec KeePass +This webapp is a browser password manager compatible with KeePass databases. It doesn't require any server or additional resources. **Version incluse :** 1.18.8~ynh1 From f6103ba9d59413140be32c46f7c6b2d9f3e3d41a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 4 Feb 2022 15:41:24 +0100 Subject: [PATCH 09/12] Fix --- scripts/install | 12 +++++++++++- scripts/remove | 8 ++++++++ scripts/restore | 19 +++++++++++++------ scripts/upgrade | 2 +- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/scripts/install b/scripts/install index 257f33c..07dcd43 100644 --- a/scripts/install +++ b/scripts/install @@ -50,6 +50,14 @@ ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=final_path --value=$final_path +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." + +# Create a system user +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # STANDARD MODIFICATIONS #================================================= @@ -90,7 +98,9 @@ ynh_add_config --template="../conf/config.json" --destination="$final_path/confi #================================================= # Les fichiers appartiennent à root -chown -R root: $final_path +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # SETUP SSOWAT diff --git a/scripts/remove b/scripts/remove index 04f8518..cd69123 100644 --- a/scripts/remove +++ b/scripts/remove @@ -37,6 +37,14 @@ ynh_script_progression --message="Removing NGINX web server configuration..." # Remove the dedicated NGINX config ynh_remove_nginx_config +#================================================= +# REMOVE DEDICATED USER +#================================================= +ynh_script_progression --message="Removing the dedicated system user..." + +# Delete a system user +ynh_system_user_delete --username=$app + #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/restore b/scripts/restore index bb77dc0..0b93315 100644 --- a/scripts/restore +++ b/scripts/restore @@ -38,21 +38,28 @@ test ! -d $final_path || ynh_die "There is already a directory: $final_path " #================================================= # RESTORE OF THE NGINX CONFIGURATION #================================================= +ynh_script_progression --message="Restoring the NGINX configuration..." ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" +#================================================= +# RECREATE THE DEDICATED USER +#================================================= +ynh_script_progression --message="Recreating the dedicated system user..." + +# Create the dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # RESTORE OF THE MAIN DIR OF THE APP #================================================= +ynh_script_progression --message="Restoring the app main directory..." ynh_restore_file --origin_path="$final_path" -#================================================= -# RESTORE USER RIGHTS -#================================================= - -# Les fichiers appartiennent à root -chown -R root: $final_path +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # GENERIC FINALISATION diff --git a/scripts/upgrade b/scripts/upgrade index 525ca17..62d3f52 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -62,7 +62,7 @@ fi if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Upgrading source files..." --time --weight=1 + ynh_script_progression --message="Upgrading source files..." # Download, check integrity, uncompress and patch the source from app.src mkdir -p "$final_path" From c2961b310e60dd0b636f97c07ee7a457aede939e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 4 Feb 2022 15:44:00 +0100 Subject: [PATCH 10/12] Update upgrade --- scripts/upgrade | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 62d3f52..8046a9d 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -15,9 +15,9 @@ source /usr/share/yunohost/helpers app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get $app domain) -path_url=$(ynh_app_setting_get $app path) -final_path=$(ynh_app_setting_get $app final_path) +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) #================================================= # CHECK VERSION @@ -28,11 +28,12 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." # Backup the current version of the app ynh_backup_before_upgrade ynh_clean_setup () { - # restore it if the upgrade fails + # Restore it if the upgrade fails ynh_restore_upgradebackup } # Exit if an error occurs during the execution of the script @@ -41,6 +42,7 @@ ynh_abort_if_errors #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= +ynh_script_progression --message="Ensuring downward compatibility..." if [ -z "$final_path" ]; then final_path=/var/www/$app @@ -54,6 +56,14 @@ if ynh_legacy_permissions_exists; then ynh_app_setting_delete --app=$app --key=is_public fi +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." + +# Create a dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # STANDARD UPGRADE STEPS #================================================= @@ -96,8 +106,9 @@ ynh_add_config --template="../conf/config.json" --destination="$final_path/confi # SECURING FILES AND DIRECTORIES #================================================= -# Les fichiers appartiennent à root -chown -R root: $final_path +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # RELOAD NGINX From c0c6c8d8aaca44e78e22d7a89681a67f6b360ac8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 4 Feb 2022 15:45:27 +0100 Subject: [PATCH 11/12] Update manifest.json --- manifest.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/manifest.json b/manifest.json index 15c8d70..6db04b6 100644 --- a/manifest.json +++ b/manifest.json @@ -42,6 +42,10 @@ { "name": "is_public", "type": "boolean", + "help": { + "en": "If enabled, KeeWeb will be accessible by people who do not have an account. This can be changed later via the webadmin.", + "fr": "Si cette case est cochée, KeeWeb sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." + }, "default": false } ] From 66ad15fbaf16afe121aa5605db6a4f918fb2b609 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 4 Feb 2022 15:58:59 +0100 Subject: [PATCH 12/12] Update install --- scripts/install | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/install b/scripts/install index 07dcd43..2e949fd 100644 --- a/scripts/install +++ b/scripts/install @@ -63,6 +63,7 @@ ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= # INSTALL SOURCES #================================================= +ynh_script_progression --message="Setting up source files..." # To avoid a complete rebuild, I downloaded the gh-pages as explained here: https://github.com/keeweb/keeweb#self-hosting # and put all files in "../sources/extra_files/app/", like that I can assure the version install in YunoHost is the version described in the manifest