From 70d8aea655dc578370b16f21ecd41bd7b4d31cd1 Mon Sep 17 00:00:00 2001 From: anmol Date: Wed, 21 Nov 2018 02:33:53 +0530 Subject: [PATCH 001/144] Added Fail2ban --- scripts/_common.sh | 66 +++++++++++++++++++++++++++++++++++++++++++++- scripts/backup | 7 +++++ scripts/change_url | 5 +++- scripts/install | 6 +++++ scripts/remove | 3 +++ scripts/restore | 6 +++++ scripts/upgrade | 6 +++++ 7 files changed, 97 insertions(+), 2 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index bb04a03..217a16a 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -10,4 +10,68 @@ ynh_delete_file_checksum () { local checksum_setting_name=checksum_${1//[\/ ]/_} # Replace all '/' and ' ' by '_' ynh_app_setting_delete $app $checksum_setting_name -} \ No newline at end of file +} + +#================================================= +# EXPERIMENTAL HELPERS +#================================================= + +# Create a dedicated fail2ban config (jail and filter conf files) +# +# usage: ynh_add_fail2ban_config log_file filter [max_retry [ports]] +# | arg: log_file - Log file to be checked by fail2ban +# | arg: failregex - Failregex to be looked for by fail2ban +# | arg: max_retry - Maximum number of retries allowed before banning IP address - default: 3 +# | arg: ports - Ports blocked for a banned IP address - default: http,https +ynh_add_fail2ban_config () { + # Process parameters + logpath=$1 + failregex=$2 + max_retry=${3:-3} + ports=${4:-http,https} + + test -n "$logpath" || ynh_die "ynh_add_fail2ban_config expects a logfile path as first argument and received nothing." + test -n "$failregex" || ynh_die "ynh_add_fail2ban_config expects a failure regex as second argument and received nothing." + + finalfail2banjailconf="/etc/fail2ban/jail.d/$app.conf" + finalfail2banfilterconf="/etc/fail2ban/filter.d/$app.conf" + ynh_backup_if_checksum_is_different "$finalfail2banjailconf" 1 + ynh_backup_if_checksum_is_different "$finalfail2banfilterconf" 1 + + sudo tee $finalfail2banjailconf <&2 + echo "WARNING${fail2ban_error#*WARNING}" >&2 + fi +} + +# Remove the dedicated fail2ban config (jail and filter conf files) +# +# usage: ynh_remove_fail2ban_config +ynh_remove_fail2ban_config () { + ynh_secure_remove "/etc/fail2ban/jail.d/$app.conf" + ynh_secure_remove "/etc/fail2ban/filter.d/$app.conf" + sudo systemctl restart fail2ban +} diff --git a/scripts/backup b/scripts/backup index 9c63df7..e24e312 100755 --- a/scripts/backup +++ b/scripts/backup @@ -50,3 +50,10 @@ ynh_backup "/etc/php5/fpm/conf.d/20-$app.ini" # SPECIFIC BACKUP #================================================= +#================================================= +# BACKUP FAIL2BAN CONFIGURATION +#================================================= + +ynh_backup "/etc/fail2ban/jail.d/$app.conf" +ynh_backup "/etc/fail2ban/filter.d/$app.conf" + diff --git a/scripts/change_url b/scripts/change_url index 2af51af..8f11601 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -75,7 +75,7 @@ then ynh_add_nginx_config fi -# Change the domain for nginx +# Change the domain for nginx and impliment Fail2ban if [ $change_domain -eq 1 ] then # Delete file checksum for the old conf file location @@ -83,6 +83,9 @@ then mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf # Store file checksum for the new config file location ynh_store_file_checksum "/etc/nginx/conf.d/$new_domain.d/$app.conf" + # Fail2ban configuration + ynh_add_fail2ban_config "/var/log/nginx/$new_domain-error.log" "^.*authentication failure\" while reading response header from upstream, client: ,.*$" 5 + fi #================================================= diff --git a/scripts/install b/scripts/install index 046c816..d0102b8 100755 --- a/scripts/install +++ b/scripts/install @@ -211,6 +211,12 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 # chmod : -rwxr-xr-x 1 root root 241 May 3 08:36 index.html => BAD # find : -rw-r--r-- 1 1001 1002 241 May 3 08:36 index.html => GOOD +#================================================= +# SETUP FAIL2BAN +#================================================= + +ynh_add_fail2ban_config "/var/log/nginx/$domain-error.log" "^.*authentication failure\" while reading response header from upstream, client: ,.*$" 5 + #================================================= # SETUP SSOWAT #================================================= diff --git a/scripts/remove b/scripts/remove index f453065..96dfb72 100755 --- a/scripts/remove +++ b/scripts/remove @@ -46,7 +46,10 @@ ynh_remove_fpm_config #================================================= # SPECIFIC REMOVE #================================================= +# REMOVE FAIL2BAN CONFIGURATION +#================================================= +ynh_remove_fail2ban_config #================================================= # GENERIC FINALIZATION diff --git a/scripts/restore b/scripts/restore index f8363c7..23153b2 100755 --- a/scripts/restore +++ b/scripts/restore @@ -108,7 +108,13 @@ ynh_restore_file "/etc/php5/fpm/conf.d/20-$app.ini" # SPECIFIC RESTORATION #================================================= +#================================================= +# RESTORE FAIL2BAN CONFIGURATION +#================================================= +ynh_restore_file "/etc/fail2ban/jail.d/$app.conf" +ynh_restore_file "/etc/fail2ban/filter.d/$app.conf" +systemctl restart fail2ban #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index 75be9a7..25b70b0 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -287,6 +287,12 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 # chmod : -rwxr-xr-x 1 root root 241 May 3 08:36 index.html => BAD # find : -rw-r--r-- 1 1001 1002 241 May 3 08:36 index.html => GOOD +#================================================= +# SETUP FAIL2BAN +#================================================= + +ynh_add_fail2ban_config "/var/log/nginx/$domain-error.log" "^.*authentication failure\" while reading response header from upstream, client: ,.*$" 5 + #================================================= # SETUP SSOWAT #================================================= From 5951478de2dd1c8037d8ae0295b973e0dedb559f Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Sun, 12 May 2019 17:06:51 +0200 Subject: [PATCH 002/144] Fix fail2ban and add logautherror plugin --- conf/logautherror.src | 6 ++++ scripts/_common.sh | 64 ------------------------------------------- scripts/change_url | 2 +- scripts/install | 7 ++++- scripts/upgrade | 8 +++++- 5 files changed, 20 insertions(+), 67 deletions(-) create mode 100644 conf/logautherror.src diff --git a/conf/logautherror.src b/conf/logautherror.src new file mode 100644 index 0000000..56bab0d --- /dev/null +++ b/conf/logautherror.src @@ -0,0 +1,6 @@ +SOURCE_URL=https://github.com/mallchin/dokuwiki_plugin_logautherror/archive/master.zip +SOURCE_SUM=ac36038a710d8f4823a006416ef28c46 +SOURCE_SUM_PRG=md5sum +SOURCE_FORMAT=zip +SOURCE_IN_SUBDIR=true +SOURCE_FILENAME= diff --git a/scripts/_common.sh b/scripts/_common.sh index 217a16a..24bd7ba 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -11,67 +11,3 @@ ynh_delete_file_checksum () { local checksum_setting_name=checksum_${1//[\/ ]/_} # Replace all '/' and ' ' by '_' ynh_app_setting_delete $app $checksum_setting_name } - -#================================================= -# EXPERIMENTAL HELPERS -#================================================= - -# Create a dedicated fail2ban config (jail and filter conf files) -# -# usage: ynh_add_fail2ban_config log_file filter [max_retry [ports]] -# | arg: log_file - Log file to be checked by fail2ban -# | arg: failregex - Failregex to be looked for by fail2ban -# | arg: max_retry - Maximum number of retries allowed before banning IP address - default: 3 -# | arg: ports - Ports blocked for a banned IP address - default: http,https -ynh_add_fail2ban_config () { - # Process parameters - logpath=$1 - failregex=$2 - max_retry=${3:-3} - ports=${4:-http,https} - - test -n "$logpath" || ynh_die "ynh_add_fail2ban_config expects a logfile path as first argument and received nothing." - test -n "$failregex" || ynh_die "ynh_add_fail2ban_config expects a failure regex as second argument and received nothing." - - finalfail2banjailconf="/etc/fail2ban/jail.d/$app.conf" - finalfail2banfilterconf="/etc/fail2ban/filter.d/$app.conf" - ynh_backup_if_checksum_is_different "$finalfail2banjailconf" 1 - ynh_backup_if_checksum_is_different "$finalfail2banfilterconf" 1 - - sudo tee $finalfail2banjailconf <&2 - echo "WARNING${fail2ban_error#*WARNING}" >&2 - fi -} - -# Remove the dedicated fail2ban config (jail and filter conf files) -# -# usage: ynh_remove_fail2ban_config -ynh_remove_fail2ban_config () { - ynh_secure_remove "/etc/fail2ban/jail.d/$app.conf" - ynh_secure_remove "/etc/fail2ban/filter.d/$app.conf" - sudo systemctl restart fail2ban -} diff --git a/scripts/change_url b/scripts/change_url index 8f11601..c3eb541 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -84,7 +84,7 @@ then # Store file checksum for the new config file location ynh_store_file_checksum "/etc/nginx/conf.d/$new_domain.d/$app.conf" # Fail2ban configuration - ynh_add_fail2ban_config "/var/log/nginx/$new_domain-error.log" "^.*authentication failure\" while reading response header from upstream, client: ,.*$" 5 + ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 fi diff --git a/scripts/install b/scripts/install index d0102b8..690bc16 100755 --- a/scripts/install +++ b/scripts/install @@ -166,7 +166,12 @@ ynh_store_file_checksum "$final_path/conf/local.protected.php" ### Files can be modified by user, no need to store checksum as they cannot be overwritten safely by package #ynh_store_file_checksum "$final_path/conf/local.php" #ynh_store_file_checksum "$final_path/conf/acl.auth.php" + #================================================= +# INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN +#================================================= + +ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror #================================================= # GENERIC FINALIZATION @@ -215,7 +220,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 # SETUP FAIL2BAN #================================================= -ynh_add_fail2ban_config "/var/log/nginx/$domain-error.log" "^.*authentication failure\" while reading response header from upstream, client: ,.*$" 5 +ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 #================================================= # SETUP SSOWAT diff --git a/scripts/upgrade b/scripts/upgrade index 25b70b0..0be6262 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -244,6 +244,12 @@ ynh_replace_string "__YNH_ADMIN_USER__" "$admin" "$final_path/conf/local.protec # Recalculate and store the checksum of the file for the next upgrade. ynh_store_file_checksum "$final_path/conf/local.protected.php" +#================================================= +# INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN +#================================================= + +ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror + #================================================= # GENERIC FINALIZATION #================================================= @@ -291,7 +297,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 # SETUP FAIL2BAN #================================================= -ynh_add_fail2ban_config "/var/log/nginx/$domain-error.log" "^.*authentication failure\" while reading response header from upstream, client: ,.*$" 5 +ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 #================================================= # SETUP SSOWAT From d058c86a478471a014ed60424ae567687f8dcaa6 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Sun, 12 May 2019 17:09:42 +0200 Subject: [PATCH 003/144] Typo fix --- scripts/change_url | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index c3eb541..a91a6fd 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -75,7 +75,7 @@ then ynh_add_nginx_config fi -# Change the domain for nginx and impliment Fail2ban +# Change the domain for nginx and update Fail2ban if [ $change_domain -eq 1 ] then # Delete file checksum for the old conf file location @@ -83,9 +83,9 @@ then mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf # Store file checksum for the new config file location ynh_store_file_checksum "/etc/nginx/conf.d/$new_domain.d/$app.conf" - # Fail2ban configuration - ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 + # Update Fail2ban configuration + ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 fi #================================================= From 71b270ab186ca96782877db03a13c2a94d184508 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Sun, 12 May 2019 17:22:25 +0200 Subject: [PATCH 004/144] Normalization... --- scripts/backup | 5 +++-- scripts/install | 2 ++ scripts/remove | 1 + scripts/restore | 7 ++++--- scripts/upgrade | 2 ++ 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/scripts/backup b/scripts/backup index 36a90b8..bb1439a 100755 --- a/scripts/backup +++ b/scripts/backup @@ -52,9 +52,10 @@ ynh_backup "/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # BACKUP FAIL2BAN CONFIGURATION #================================================= +ynh_script_progression --message="Backing up fail2ban configuration..." -ynh_backup "/etc/fail2ban/jail.d/$app.conf" -ynh_backup "/etc/fail2ban/filter.d/$app.conf" +ynh_backup --src_path="/etc/fail2ban/jail.d/$app.conf" +ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" #================================================= # END OF SCRIPT diff --git a/scripts/install b/scripts/install index 5262e1a..ef4f3e7 100755 --- a/scripts/install +++ b/scripts/install @@ -161,6 +161,7 @@ ynh_store_file_checksum "$final_path/conf/local.protected.php" #================================================= # INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN #================================================= +ynh_script_progression --message="Installing logautherror plugin for fail2ban..." --weight=2 ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror @@ -210,6 +211,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 #================================================= # SETUP FAIL2BAN #================================================= +ynh_script_progression --message="Configuring fail2ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 diff --git a/scripts/remove b/scripts/remove index f1d9798..5797d12 100755 --- a/scripts/remove +++ b/scripts/remove @@ -48,6 +48,7 @@ ynh_remove_fpm_config #================================================= # REMOVE FAIL2BAN CONFIGURATION #================================================= +ynh_script_progression --message="Removing fail2ban configuration..." --weight=7 ynh_remove_fail2ban_config diff --git a/scripts/restore b/scripts/restore index ac6fec6..2e7c1cd 100755 --- a/scripts/restore +++ b/scripts/restore @@ -94,10 +94,11 @@ ynh_restore_file "/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # RESTORE FAIL2BAN CONFIGURATION #================================================= +ynh_script_progression --message="Restoring the fail2ban configuration..." --weight=7 -ynh_restore_file "/etc/fail2ban/jail.d/$app.conf" -ynh_restore_file "/etc/fail2ban/filter.d/$app.conf" -systemctl restart fail2ban +ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" +ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" +ynh_systemd_action --action=restart --service_name=fail2ban #================================================= # GENERIC FINALIZATION diff --git a/scripts/upgrade b/scripts/upgrade index 5fc992e..1f07a9c 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -242,6 +242,7 @@ ynh_store_file_checksum "$final_path/conf/local.protected.php" #================================================= # INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN #================================================= +ynh_script_progression --message="Upgrading logautherror plugin for fail2ban..." --weight=2 ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror @@ -291,6 +292,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 #================================================= # SETUP FAIL2BAN #================================================= +ynh_script_progression --message="Reconfiguring fail2ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 From eb4f85bd841211de9bf8bede9f2b20d38352a420 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Thu, 30 May 2019 00:14:48 +0200 Subject: [PATCH 005/144] Upgrade fail2ban for new_path and new_domain --- scripts/change_url | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index d705d5e..249d73b 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -75,7 +75,7 @@ then ynh_add_nginx_config fi -# Change the domain for nginx and update Fail2ban +# Change the domain for nginx if [ $change_domain -eq 1 ] then # Delete file checksum for the old conf file location @@ -83,11 +83,17 @@ then mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf # Store file checksum for the new config file location ynh_store_file_checksum "/etc/nginx/conf.d/$new_domain.d/$app.conf" - - # Update Fail2ban configuration - ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 fi +#================================================= +# SPECIFIC MODIFICATIONS +#================================================= +# UPGRADE FAIL2BAN +#================================================= +ynh_script_progression --message="Reconfiguring fail2ban..." --weight=6 + +ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $new_path.*$" --max_retry=5 + #================================================= # GENERIC FINALISATION #================================================= From 7de40f5a7c51b29248cdf24e408b014c9008119b Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 9 Jul 2019 09:55:36 +0200 Subject: [PATCH 006/144] Remove useless comment --- scripts/install | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/install b/scripts/install index 6421a75..4ceb331 100755 --- a/scripts/install +++ b/scripts/install @@ -66,8 +66,6 @@ ynh_setup_source --dest_dir="$final_path" #================================================= ynh_script_progression --message="Configuring nginx web server..." --weight=2 -### `ynh_add_nginx_config` will use the file conf/nginx.conf - # Create a dedicated nginx config ynh_add_nginx_config From 407180e2f24d9e3b8b7ca8179159e564eb1d75b8 Mon Sep 17 00:00:00 2001 From: Gofannon <17145502+Gofannon@users.noreply.github.com> Date: Sat, 29 Feb 2020 09:56:13 +0100 Subject: [PATCH 007/144] Url rewriting (#54) * Remove unused code * Add rewrite URL functionnality * Fix subpath handling * Fix nginx error nginx: [emerg] named location "@dokuwiki" can be on the server level only in /etc/nginx/conf.d/sub.example.org.d/dokuwiki.conf:20 * [enh] Enforce URL rewrite * Increment package version --- conf/local.protected.php | 7 ++++--- conf/nginx.conf | 18 +++++++++++++++++- manifest.json | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/conf/local.protected.php b/conf/local.protected.php index f1b27c4..0604e4e 100644 --- a/conf/local.protected.php +++ b/conf/local.protected.php @@ -23,11 +23,12 @@ $conf['plugin']['authldap']['port'] = 389; $conf['plugin']['authldap']['version'] = 3; $conf['plugin']['authldap']['usertree'] = 'ou=users,dc=yunohost,dc=org'; $conf['plugin']['authldap']['userfilter'] = '(&(uid=%{user})(objectClass=posixAccount))'; -# no groups -#$conf['plugin']['authldap']['grouptree'] = 'ou=Group, dc=server, dc=tld'; -#$conf['plugin']['authldap']['groupfilter'] = '(&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; /* Advanced Settings */ $conf['updatecheck'] = 0; //automatically check for new releases? + // Taken from previous package. Don't know what it does. Maybe Yunohost corner logo ? $conf['cssdatauri'] = 512; //Maximum byte size of small images to embed into CSS, won't work on IE<8 + +// URL Rewriting is handled by the webserver +$conf['userewrite'] = 1; // See https://www.dokuwiki.org/config:userewrite diff --git a/conf/nginx.conf b/conf/nginx.conf index c17758d..67b1f32 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,3 +1,8 @@ +# config built from these sources: +# https://www.dokuwiki.org/install:nginx +# https://www.nginx.com/resources/wiki/start/topics/recipes/dokuwiki/ +# https://forum.dokuwiki.org/thread/17126 + #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { @@ -14,7 +19,8 @@ location __PATH__/ { # Common parameter to increase upload size limit in conjuction with dedicated php-fpm file client_max_body_size 25M; - try_files $uri $uri/ index.php; + try_files $uri $uri/ @dokuwiki; + location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_pass unix:/var/run/php/php7.0-fpm-__NAME__.sock; @@ -45,3 +51,13 @@ location __PATH__/ { # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; } + +# rewrites "doku.php/" out of the URLs if you set the userwrite setting to .htaccess in dokuwiki confi$ +location @dokuwiki { + rewrite ^__PATH__/_media/(.*) __PATH__/lib/exe/fetch.php?media=$1 last; + rewrite ^__PATH__/_detail/(.*) __PATH__/lib/exe/detail.php?media=$1 last; + rewrite ^__PATH__/_export/([^/]+)/(.*) __PATH__/doku.php?do=export_$1&id=$2 last; + # Specifig to "tag plugin". Added here to allow plugin to work if installed + rewrite ^__PATH__/tag/(.*) __PATH__/doku.php?id=tag:$1&do=showtag&tag=tag:$1 last; + rewrite ^__PATH__/(.*) __PATH__/doku.php?id=$1&$args last; +} diff --git a/manifest.json b/manifest.json index 8f68fac..1c3ae56 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "DokuWiki es un sistema de Wiki de uso sencillicimo y compatible con los estándares.", "it": "DokuWiki è un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2018-04-22a~ynh2", + "version": "2018-04-22a~ynh3", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { From 7a70f8af7644ee7fc02bf7bfca08dd896defa8a1 Mon Sep 17 00:00:00 2001 From: JimboJoe Date: Sat, 14 Mar 2020 09:08:38 +0100 Subject: [PATCH 008/144] Testing (#55) * Remove unused code * Add rewrite URL functionnality * Fix subpath handling * Fix nginx error nginx: [emerg] named location "@dokuwiki" can be on the server level only in /etc/nginx/conf.d/sub.example.org.d/dokuwiki.conf:20 * [enh] Enforce URL rewrite * Increment package version Co-authored-by: Gofannon <17145502+Gofannon@users.noreply.github.com> --- conf/local.protected.php | 7 ++++--- conf/nginx.conf | 18 +++++++++++++++++- manifest.json | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/conf/local.protected.php b/conf/local.protected.php index f1b27c4..0604e4e 100644 --- a/conf/local.protected.php +++ b/conf/local.protected.php @@ -23,11 +23,12 @@ $conf['plugin']['authldap']['port'] = 389; $conf['plugin']['authldap']['version'] = 3; $conf['plugin']['authldap']['usertree'] = 'ou=users,dc=yunohost,dc=org'; $conf['plugin']['authldap']['userfilter'] = '(&(uid=%{user})(objectClass=posixAccount))'; -# no groups -#$conf['plugin']['authldap']['grouptree'] = 'ou=Group, dc=server, dc=tld'; -#$conf['plugin']['authldap']['groupfilter'] = '(&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; /* Advanced Settings */ $conf['updatecheck'] = 0; //automatically check for new releases? + // Taken from previous package. Don't know what it does. Maybe Yunohost corner logo ? $conf['cssdatauri'] = 512; //Maximum byte size of small images to embed into CSS, won't work on IE<8 + +// URL Rewriting is handled by the webserver +$conf['userewrite'] = 1; // See https://www.dokuwiki.org/config:userewrite diff --git a/conf/nginx.conf b/conf/nginx.conf index c17758d..67b1f32 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,3 +1,8 @@ +# config built from these sources: +# https://www.dokuwiki.org/install:nginx +# https://www.nginx.com/resources/wiki/start/topics/recipes/dokuwiki/ +# https://forum.dokuwiki.org/thread/17126 + #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { @@ -14,7 +19,8 @@ location __PATH__/ { # Common parameter to increase upload size limit in conjuction with dedicated php-fpm file client_max_body_size 25M; - try_files $uri $uri/ index.php; + try_files $uri $uri/ @dokuwiki; + location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_pass unix:/var/run/php/php7.0-fpm-__NAME__.sock; @@ -45,3 +51,13 @@ location __PATH__/ { # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; } + +# rewrites "doku.php/" out of the URLs if you set the userwrite setting to .htaccess in dokuwiki confi$ +location @dokuwiki { + rewrite ^__PATH__/_media/(.*) __PATH__/lib/exe/fetch.php?media=$1 last; + rewrite ^__PATH__/_detail/(.*) __PATH__/lib/exe/detail.php?media=$1 last; + rewrite ^__PATH__/_export/([^/]+)/(.*) __PATH__/doku.php?do=export_$1&id=$2 last; + # Specifig to "tag plugin". Added here to allow plugin to work if installed + rewrite ^__PATH__/tag/(.*) __PATH__/doku.php?id=tag:$1&do=showtag&tag=tag:$1 last; + rewrite ^__PATH__/(.*) __PATH__/doku.php?id=$1&$args last; +} diff --git a/manifest.json b/manifest.json index 8f68fac..1c3ae56 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "DokuWiki es un sistema de Wiki de uso sencillicimo y compatible con los estándares.", "it": "DokuWiki è un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2018-04-22a~ynh2", + "version": "2018-04-22a~ynh3", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { From 9715aff9bae05ddadda652a4cea93f977f393aa0 Mon Sep 17 00:00:00 2001 From: Gofannon <17145502+Gofannon@users.noreply.github.com> Date: Wed, 15 Apr 2020 12:54:57 +0200 Subject: [PATCH 009/144] [fix] dedicated named location per $app (#61) fix multiple install on subdomains Before this fix app1 => @dokuwiki works app2 => @dokuwiki fails After \o/ app1 => @app1 works app2 => @app2 works --- conf/nginx.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 67b1f32..64fc3ba 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -19,7 +19,7 @@ location __PATH__/ { # Common parameter to increase upload size limit in conjuction with dedicated php-fpm file client_max_body_size 25M; - try_files $uri $uri/ @dokuwiki; + try_files $uri $uri/ @__NAME__ ; location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; @@ -53,7 +53,7 @@ location __PATH__/ { } # rewrites "doku.php/" out of the URLs if you set the userwrite setting to .htaccess in dokuwiki confi$ -location @dokuwiki { +location @__NAME__ { rewrite ^__PATH__/_media/(.*) __PATH__/lib/exe/fetch.php?media=$1 last; rewrite ^__PATH__/_detail/(.*) __PATH__/lib/exe/detail.php?media=$1 last; rewrite ^__PATH__/_export/([^/]+)/(.*) __PATH__/doku.php?do=export_$1&id=$2 last; From 500a7d3fa9c008a2b75d0f6bec519e41fed97da0 Mon Sep 17 00:00:00 2001 From: Gofannon <17145502+Gofannon@users.noreply.github.com> Date: Wed, 22 Apr 2020 22:37:42 +0200 Subject: [PATCH 010/144] [fix] dedicated named location per $app (#63) * Url rewriting (#54) * Remove unused code * Add rewrite URL functionnality * Fix subpath handling * Fix nginx error nginx: [emerg] named location "@dokuwiki" can be on the server level only in /etc/nginx/conf.d/sub.example.org.d/dokuwiki.conf:20 * [enh] Enforce URL rewrite * Increment package version * [fix] dedicated named location per $app (#61) fix multiple install on subdomains Before this fix app1 => @dokuwiki works app2 => @dokuwiki fails After \o/ app1 => @app1 works app2 => @app2 works Co-authored-by: Maniack Crudelis --- conf/nginx.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 67b1f32..64fc3ba 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -19,7 +19,7 @@ location __PATH__/ { # Common parameter to increase upload size limit in conjuction with dedicated php-fpm file client_max_body_size 25M; - try_files $uri $uri/ @dokuwiki; + try_files $uri $uri/ @__NAME__ ; location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; @@ -53,7 +53,7 @@ location __PATH__/ { } # rewrites "doku.php/" out of the URLs if you set the userwrite setting to .htaccess in dokuwiki confi$ -location @dokuwiki { +location @__NAME__ { rewrite ^__PATH__/_media/(.*) __PATH__/lib/exe/fetch.php?media=$1 last; rewrite ^__PATH__/_detail/(.*) __PATH__/lib/exe/detail.php?media=$1 last; rewrite ^__PATH__/_export/([^/]+)/(.*) __PATH__/doku.php?do=export_$1&id=$2 last; From 9d12c49aaec6dc7a45396bdc2407c0a7eb545b1b Mon Sep 17 00:00:00 2001 From: Gofannon <17145502+Gofannon@users.noreply.github.com> Date: Wed, 22 Apr 2020 23:24:55 +0200 Subject: [PATCH 011/144] 2018 04 22b (#58) * Upgrade template to latest version * Upgrade dokuwiki version and version's location * Delete "jessie" from READMEs * Migrate to changelog file instead of READMEs * Fix markdown syntax errors * Add local screenshot * Update manifest.json Co-Authored-By: Kayou * Revert CI link * Correct version number to match manifest Co-authored-by: Gofannon Co-authored-by: Kayou --- CHANGELOG.md | 59 +++++++++++++++++++++++++++++++++++++++ README.md | 28 +++++++------------ README_fr.md | 30 ++++++++------------ conf/app.src | 6 ++-- dokuwikimainwindow.png | Bin 0 -> 21486 bytes manifest.json | 2 +- pull_request_template.md | 12 ++++---- 7 files changed, 89 insertions(+), 48 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 dokuwikimainwindow.png diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ba827a8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,59 @@ +# Changelog + +## [Unreleased] + +## [2018-04-22a~ynhXX] + +### Added + +- Upgrade actions and config-panel scripts + +------------ + +## [2018-04-22b~ynh1] - 2020-03-23 + +### Added + +- New DokuWiki version `2018-04-22b` +- Changelog available in `CHANGELOG.md` + +### Changed + +- Upgrade content of file `pull_request_template.md` + +## [2018-04-22a~ynh3] - 2020-02-20 + +### Added + +- Use 'URL rewrite' for prettier URLs + +### Changed + +- Activate URL rewrite by default (does not break old links) + +### Removed + +- Unused DokuWiki config file + +## [2018-04-22a~ynh2] - 2020-02-20 + +### Added + +- Add fail2ban support to avoid bruteforce login attempts + +### Changed + +- Global upgrade of the package + +### Fixed + +- Get rid of the php ini file and merge its content into the pool file +- Update Readme following last work made on the package and current version in testing branch + +### Removed + +- Unused config file settings + +## [Previous versions] - YYYY-MM-DD + +- Will be written (one day maybye) diff --git a/README.md b/README.md index fea004e..8f18d2a 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,11 @@ If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. -**Shipped version:** 2018-04-22a "Greebo" +**Shipped version:** 2018-04-22b "Greebo" ## Screenshots -![](https://www.dokuwiki.org/_media/dokuwikimainwindow.png) +![Screenshot of DokuWiki main window](dokuwikimainwindow.png) ## Demo @@ -26,8 +26,8 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Documentation -* Official documentation: https://www.dokuwiki.org/manual -* YunoHost documentation: https://yunohost.org/#/app_dokuwiki +* Official documentation: +* YunoHost documentation: ## YunoHost specific features @@ -40,26 +40,17 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) -* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-stretch.nohost.me/ci/apps/dokuwiki/) ## Limitations * Cannot create or login with dokuwiki internal users, only users from Yunohost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) -## Additional information - -### Changelog - -* *Many missing - List taken from previous documentation* -* 07 Mar 2017 - Update app -* 11 Feb 2017 - Create script app - ## Links - * Report a bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues - * App website: https://www.dokuwiki.org - * Upstream app repository: https://github.com/splitbrain/dokuwiki - * YunoHost website: https://yunohost.org +* Report a bug: +* App website: +* Upstream app repository: +* YunoHost website: --- @@ -70,7 +61,8 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that Instead of merging directly into `master`, please do your pull request to the [`testing` branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) To try the `testing` branch, please proceed like that. -``` + +```bash sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug or sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug diff --git a/README_fr.md b/README_fr.md index fe39537..2eb9035 100644 --- a/README_fr.md +++ b/README_fr.md @@ -3,7 +3,7 @@ [![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) [![Installer DokuWiki grâce à YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) -*[Read this readme in english.](./README.md)* +*[Read this readme in english.](./README.md)* > *Ce package vous permet d'installer Dokuwiki 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.* @@ -12,11 +12,11 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne nécessite pas de base de données. Il est apprécié par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait un favori d'administrateur. Des contrôles d'accès et des connecteurs d'authentification intégrés rendent DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins apportés par sa communauté dynamique permettent un large éventail de cas d'utilisation au-delà d'un wiki traditionnel. -**Version incluse:** 2018-04-22a "Greebo" +**Version incluse:** 2018-04-22b "Greebo" ## Captures d'écran -![](https://www.dokuwiki.org/_media/dokuwikimainwindow.png) +![Capture d'écran de la fenêtre principale de DokuWiki](dokuwikimainwindow.png) ## Démo @@ -26,8 +26,8 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentation -* Documentation officielle: https://www.dokuwiki.org/manual -* Documentation YunoHost: https://yunohost.org/#/app_dokuwiki +* Documentation officielle: +* Documentation YunoHost: ## Caractéristiques spécifiques YunoHost @@ -40,26 +40,17 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) -* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-stretch.nohost.me/ci/apps/dokuwiki/) ## Limitations * Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de Yunohost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) -## Informations additionnelles - -### Historique des versions - -* *Many missing - List taken from previous documentation* -* 07 Mar 2017 - Update app -* 11 Feb 2017 - Create script app - ## Liens - * Signaler un bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues - * Site de l'application:https://www.dokuwiki.org - * Dépôt de l'application principale: https://github.com/splitbrain/dokuwiki - * Site web YunoHost: https://yunohost.org/ +* Signaler un bug: +* Site de l'application: +* Dépôt de l'application principale: +* Site web YunoHost: --- @@ -70,7 +61,8 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. -``` + +```bash sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ou sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug diff --git a/conf/app.src b/conf/app.src index e42acb7..4021565 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,6 +1,6 @@ -SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2018-04-22a.tgz -SOURCE_SUM=18765a29508f96f9882349a304bffc03 -SOURCE_SUM_PRG=md5sum +SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2018-04-22b.tgz +SOURCE_SUM=9d1437cdc7e98e471ff32079f7ca224ccf52dbbaafed39ec9746b0405b3a29ce +SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true SOURCE_FILENAME= diff --git a/dokuwikimainwindow.png b/dokuwikimainwindow.png new file mode 100644 index 0000000000000000000000000000000000000000..c357376b781f55d9cfe7d6505bbc679a4dd41e8d GIT binary patch literal 21486 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 literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json index 1c3ae56..503c689 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "DokuWiki es un sistema de Wiki de uso sencillicimo y compatible con los estándares.", "it": "DokuWiki è un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2018-04-22a~ynh3", + "version": "2018-04-22b~ynh1", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { diff --git a/pull_request_template.md b/pull_request_template.md index fceb723..8f984e1 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -2,7 +2,7 @@ - *Description of why you made this PR* ## Solution -- *And how you fix that* +- *And how do you fix that problem* ## PR Status - [ ] Code finished. @@ -13,12 +13,10 @@ ## Validation --- -*Minor decision* -- **Upgrade previous version** : - [ ] **Code review** : -- [ ] **Approval (LGTM)** : -- [ ] **Approval (LGTM)** : -- **CI succeeded** : -[![Build Status](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/badge/icon)](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/) +- [ ] **Approval (LGTM)** : +*Code review and approval have to be from a member of @YunoHost-Apps/apps-group* +- **CI succeeded** : +[![Build Status](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/badge/icon)](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/) *Please replace '-NUM-' in this link by the PR number.* When the PR is marked as ready to merge, you have to wait for 3 days before really merging it. From ff984be3b50e0e837519656aca941a47ae188846 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 22 Apr 2020 23:25:56 +0200 Subject: [PATCH 012/144] Simplify description (#60) --- manifest.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/manifest.json b/manifest.json index 503c689..8b83da8 100644 --- a/manifest.json +++ b/manifest.json @@ -3,11 +3,11 @@ "id": "dokuwiki", "packaging_format": 1, "description": { - "en": "DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database.", - "fr": "DokuWiki est un wiki Open Source simple à utiliser et très polyvalent qui n'exige aucune base de données.", - "de": "DokuWiki ist ein standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab.", - "es": "DokuWiki es un sistema de Wiki de uso sencillicimo y compatible con los estándares.", - "it": "DokuWiki è un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." + "en": "A lightweight, simple to use and highly versatile wiki", + "fr": "Un wiki léger, simple à utiliser et très polyvalent", + "de": "Ein standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab.", + "es": "Un sistema de Wiki de uso sencillicimo y compatible con los estándares.", + "it": "Un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, "version": "2018-04-22b~ynh1", "url": "https://www.dokuwiki.org", From 851001f91ae6cb6d264e477b34b00a74f533c378 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 30 Apr 2020 17:37:53 +0200 Subject: [PATCH 013/144] Bump new version number --- CHANGELOG.md | 12 ++++++++++++ manifest.json | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba827a8..d304d40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,18 @@ ------------ +# [2018-04-22b~ynh2] - 2020-04-30 + +### Added + +- Support for new permission system in YunoHost 3.7 + +### Changed + +- wiki administrators is now a group and can be modified from webadmin YunoHost panel +- Require YunoHost 3.7 minimum + + ## [2018-04-22b~ynh1] - 2020-03-23 ### Added diff --git a/manifest.json b/manifest.json index 8b83da8..0b3719d 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Un sistema de Wiki de uso sencillicimo y compatible con los estándares.", "it": "Un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2018-04-22b~ynh1", + "version": "2018-04-22b~ynh2", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { @@ -22,7 +22,7 @@ "email": "opi@zeropi.net" }], "requirements": { - "yunohost": ">= 3.5.0" + "yunohost": ">= 3.7" }, "multi_instance": true, "services": [ From 228968e2dec986f539d9edb7ee1c9adbf755aead Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 30 Apr 2020 17:38:37 +0200 Subject: [PATCH 014/144] Add required helper --- scripts/_common.sh | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/scripts/_common.sh b/scripts/_common.sh index a9bf588..91adcdb 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1 +1,52 @@ #!/bin/bash + +#================================================= +# COMMON VARIABLES +#================================================= + +#================================================= +# PERSONAL HELPERS +#================================================= + +#================================================= +# EXPERIMENTAL HELPERS +#================================================= + +#================================================= +# FUTURE OFFICIAL HELPERS +#================================================= + +# Check if a permission exists +# +# While waiting for this new helper https://github.com/YunoHost/yunohost/pull/905 +# We have to use another one because the new helper use a new YunoHost command, not available for now. +# +# usage: ynh_permission_has_user --permission=permission --user=user +# | arg: -p, --permission - the permission to check +# | arg: -u, --user - the user seek in the permission +# +# example: ynh_permission_has_user --permission=main --user=visitors +# +# Requires YunoHost version 3.7.1 or higher. +ynh_permission_has_user() { + local legacy_args=pu + # Declare an array to define the options of this helper. + declare -Ar args_array=( [p]=permission= [u]=user= ) + local permission + local user + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + if ! ynh_permission_exists --permission=$permission + then + return 1 + fi + + # List all permissions + # Filter only the required permission with a multiline sed (Here a cut from the permission to the next one), remove the url and his value + perm="$(yunohost user permission list --full --output-as plain | sed --quiet "/^#$app.$permission/,/^#[[:alnum:]]/p" | sed "/^##url/,+1d")" + # Remove all lines starting by # (got from the plain output before) + allowed_users="$(echo "$perm" | grep --invert-match '^#')" + # Grep the list of users an return the result if the user is indeed into the list + echo "$allowed_users" | grep --quiet --word "$user" +} \ No newline at end of file From ac50e4c71938bdbb1341fb3ba8079dbea74e4910 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 30 Apr 2020 17:41:56 +0200 Subject: [PATCH 015/144] Implement new permissions system in YNH 3.7 --- conf/local.protected.php | 10 +++++++--- scripts/install | 19 +++++++++++-------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/conf/local.protected.php b/conf/local.protected.php index 0604e4e..ddf37b3 100644 --- a/conf/local.protected.php +++ b/conf/local.protected.php @@ -14,15 +14,19 @@ $conf['useacl'] = 1; //Use Access Control Lists to restrict access? $conf['authtype'] = 'authldap'; //which authentication backend should be used $conf['passcrypt'] = 'sha1'; //Used crypt method (smd5,md5,sha1,ssha,crypt,mysql,my411) -$conf['superuser'] = '__YNH_ADMIN_USER__'; //The admin can be user or @group or comma separated list user1,@group1,user2 -$conf['manager'] = '__YNH_ADMIN_USER__'; //The manager can be user or @group or comma separated list user1,@group1,user2 +$conf['superuser'] = '@__APP__.admin'; //The admin can be user or @group or comma separated list user1,@group1,user2 +$conf['manager'] = '@__APP__.admin'; //The manager can be user or @group or comma separated list user1,@group1,user2 /* LDAP Yunohost config */ $conf['plugin']['authldap']['server'] = 'localhost'; $conf['plugin']['authldap']['port'] = 389; $conf['plugin']['authldap']['version'] = 3; $conf['plugin']['authldap']['usertree'] = 'ou=users,dc=yunohost,dc=org'; -$conf['plugin']['authldap']['userfilter'] = '(&(uid=%{user})(objectClass=posixAccount))'; +$conf['plugin']['authldap']['grouptree'] = 'ou=permission,dc=yunohost,dc=org'; +$conf['plugin']['authldap']['userfilter'] = '(&(objectClass=posixAccount)(uid=%{user})(permission=cn=__APP__.main,ou=permission,dc=yunohost,dc=org))'; +$conf['plugin']['authldap']['groupfilter'] = '(&(objectClass=posixGroup)(memberUID=%{user})(cn=__APP__.*))'; +#$conf['plugin']['authldap']['debug'] = 1; + /* Advanced Settings */ $conf['updatecheck'] = 0; //automatically check for new releases? diff --git a/scripts/install b/scripts/install index 4ceb331..58accd4 100755 --- a/scripts/install +++ b/scripts/install @@ -22,7 +22,7 @@ ynh_abort_if_errors domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH -admin=$YNH_APP_ARG_ADMIN +admin_user=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC language=$YNH_APP_ARG_LANGUAGE @@ -46,8 +46,6 @@ ynh_script_progression --message="Storing installation settings..." --weight=2 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=admin --value=$admin -ynh_app_setting_set --app=$app --key=is_public --value=$is_public ynh_app_setting_set --app=$app --key=language --value=$language #================================================= @@ -108,8 +106,12 @@ ynh_script_progression --message="Configuring dokuwiki..." --weight=2 # It will only be updated by Yunohost package or directly by adventurous users cp ../conf/local.protected.php $final_path/conf -# Set the "admin" user -ynh_replace_string --match_string="__YNH_ADMIN_USER__" --replace_string="$admin" --target_file="$final_path/conf/local.protected.php" +# Create the "admin" group and add the "admin" user +ynh_permission_create --permission "admin" --allowed "$admin_user" + +# Customize admin group in case of multiple wiki install managed by different admins +# dokuwiki.admin; dokuwiki__1.admin; etc +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/conf/local.protected.php" # This file might be modified by dokuwiki admin panel or by plugins @@ -216,13 +218,14 @@ ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring SSOwat..." +ynh_script_progression --message="Configuring permissions..." --weight=2 # Make app public if necessary if [ $is_public -eq 1 ] then - # unprotected_uris allows SSO credentials to be passed anyway. - ynh_app_setting_set --app=$app --key=unprotected_uris --value="/" + # Everyone can access the app. + # The "main" permission is automatically created before the install script. + ynh_permission_update --permission "main" --add "visitors" fi #================================================= From e42bed446d3f16d9764f76650e406c00d568c0c1 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 30 Apr 2020 17:43:46 +0200 Subject: [PATCH 016/144] Adapt 'upgrade' script for new permission system --- scripts/upgrade | 75 ++++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 8e9eaaa..e2a7375 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -18,8 +18,6 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app=$app --key=domain) path_url=$(ynh_app_setting_get --app=$app --key=path) -admin=$(ynh_app_setting_get --app=$app --key=admin) -is_public=$(ynh_app_setting_get --app=$app --key=is_public) final_path=$(ynh_app_setting_get --app=$app --key=final_path) #================================================= @@ -33,34 +31,53 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= ynh_script_progression --message="Ensuring downward compatibility..." -# Fix is_public as a boolean value -if [ "$is_public" = "Yes" ]; then - ynh_app_setting_set --app=$app --key=is_public --value=1 - is_public=1 -elif [ "$is_public" = "No" ]; then - ynh_app_setting_set --app=$app --key=is_public --value=0 - is_public=0 -fi - # If final_path doesn't exist, create it if [ -z "$final_path" ]; then final_path=/var/www/$app ynh_app_setting_set --app=$app --key=final_path --value=$final_path fi -# TODO Not sure if still needed ?? -# admin default value, if not set -if [ -z "$admin" ]; then - admin=$(yunohost user list | grep 'username' -m1 | awk '{print $2}') - ynh_app_setting_set --app=$app --key=is_public --value=$is_public -fi - # language default value, if not set if [ -z "$language" ]; then language='en' ynh_app_setting_set --app=$app --key=language --value=$language fi +# Cleaning legacy permissions +admin_user=$(ynh_app_setting_get --app=$app --key=admin) + +if [ -n "$admin_user" ]; then + # Removing skipped/unprotected_uris under certain conditions, remove the visitors group added during the migration process of 3.7 + # Remove skipped_uris. If the app was public, add visitors again to the main permission + if ynh_permission_has_user --permission=admin --user="$admin_user" + then + echo "permission admin already exist. Nothing to do" + else + ynh_permission_create --permission "admin" --allowed "$admin_user" + fi + # Remove legacy admin setting + ynh_app_setting_delete --app=$app --key=admin +fi + +is_public=$(ynh_app_setting_get --app=$app --key=is_public) +if [ -n "$is_public" ]; then + # Remove unprotected_uris + ynh_app_setting_delete --app=$app --key=unprotected_uris + # Remove protected_uris + ynh_app_setting_delete --app=$app --key=protected_uris + + # Removing skipped/unprotected_uris under certain conditions, remove the visitors group added during the migration process of 3.7 + # Remove skipped_uris. If the app was public, add visitors again to the main permission + if ynh_permission_has_user --permission=main --user=visitors + then + ynh_app_setting_delete --app=$app --key=skipped_uris + ynh_permission_update --permission "main" --add "visitors" + else + ynh_app_setting_delete --app=$app --key=skipped_uris + fi + ynh_app_setting_delete --app=$app --key=is_public +fi + # Yunohost specific configuration, if it isn't exist already @@ -247,8 +264,12 @@ ynh_backup_if_checksum_is_different --file="$final_path/conf/local.protected.php # Always overwrite local file with the one from package. cp ../conf/local.protected.php $final_path/conf -# Set the "admin" user -ynh_replace_string --match_string="__YNH_ADMIN_USER__" --replace_string="$admin" --target_file="$final_path/conf/local.protected.php" +# Create the "admin" group and add the "admin" user +#ynh_permission_create --permission "admin" --allowed "$admin_user" + +# Customize admin group in case of multiple wiki install managed by different admins +# dokuwiki.admin; dokuwiki__1.admin; etc +ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/conf/local.protected.php" # Recalculate and store the checksum of the file for the next upgrade. ynh_store_file_checksum --file="$final_path/conf/local.protected.php" @@ -313,18 +334,8 @@ ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Upgrading SSOwat configuration..." - -if [ $is_public -eq 0 ] -then # Remove the public access - ynh_app_setting_delete --app=$app --key=skipped_uris -fi -# Make app public if necessary -if [ $is_public -eq 1 ] -then - # unprotected_uris allows SSO credentials to be passed anyway - ynh_app_setting_set --app=$app --key=unprotected_uris --value="/" -fi + # Nothinf to do here. Already done in "ENSURE DOWNWARD COMPATIBILITY" part + #ynh_script_progression --message="Upgrading permissions configuration..." --weight=2 #================================================= # RELOAD NGINX From af43ee6008069295fc8ec6f248aff964a7a0b8d2 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Fri, 15 May 2020 12:50:50 +0200 Subject: [PATCH 017/144] Fix upgrade error by changing rm options Warning: yunohost.hook - [1188.1] rm: cannot remove 'vendor/easybook/geshi': Directory not empty --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index e2a7375..709e29b 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -236,7 +236,7 @@ then # Move to the dokuwiki installation folder so the "official" commands can be used without adaptation cd $final_path - grep --extended-regexp --invert-match '^($|#)' data/deleted.files | xargs --max-args=1 rm --force --dir || true + grep --extended-regexp --invert-match '^($|#)' data/deleted.files | xargs --max-args=1 rm --force || true ) fi From 717f0f9f4452232b5888bbd4bd66ef130ce3a71f Mon Sep 17 00:00:00 2001 From: Gofannon <17145502+Gofannon@users.noreply.github.com> Date: Fri, 15 May 2020 12:53:36 +0200 Subject: [PATCH 018/144] [Fix] caching pictures that didn't work (#65) Set HTTP Headers 'Expires' on the correct PATH... Co-authored-by: Gofannon --- conf/nginx.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 64fc3ba..5cb057b 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -39,12 +39,12 @@ location __PATH__/ { } # Deny Access to htaccess-Files for Apache - location ~ /\.ht { + location ~ __PATH__/\.ht { deny all; } # Serve static files - location ~ ^/lib.*\.(gif|png|ico|jpg)$ { + location ~ ^__PATH__/lib.*\.(gif|png|ico|jpg)$ { expires 30d; } From 2ab75c429794310209be9dc09b191f63a326d8d3 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Fri, 15 May 2020 14:52:04 +0200 Subject: [PATCH 019/144] Revert "Fix upgrade error by changing rm options" This reverts commit af43ee6008069295fc8ec6f248aff964a7a0b8d2. --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 709e29b..e2a7375 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -236,7 +236,7 @@ then # Move to the dokuwiki installation folder so the "official" commands can be used without adaptation cd $final_path - grep --extended-regexp --invert-match '^($|#)' data/deleted.files | xargs --max-args=1 rm --force || true + grep --extended-regexp --invert-match '^($|#)' data/deleted.files | xargs --max-args=1 rm --force --dir || true ) fi From fac3df20256f08c6f41b09ceb64e765f9af80d77 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Tue, 25 Aug 2020 23:31:12 +0200 Subject: [PATCH 020/144] [enh] purge of old upgrade files --- scripts/_common.sh | 95 ++++++++++++++++++++++++++++++++++++++++++++++ scripts/upgrade | 36 +++++++++++++++++- 2 files changed, 130 insertions(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 91adcdb..0d62977 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -12,6 +12,101 @@ # EXPERIMENTAL HELPERS #================================================= +# Remove a file or a directory securely +# +# usage: ynh_secure_remove --file=path_to_remove [--regex=regex to append to $file] [--non_recursive] [--dry_run] +# | arg: -f, --file - File or directory to remove +# | arg: -r, --regex - Regex to append to $file to filter the files to remove +# | arg: -n, --non_recursive - Perform a non recursive rm and a non recursive search with the regex +# | arg: -d, --dry_run - Do not remove, only list the files to remove +# +# Requires YunoHost version 2.6.4 or higher. +ynh_secure_remove () { + # Declare an array to define the options of this helper. + local legacy_args=frnd + declare -Ar args_array=( [f]=file= [r]=regex= [n]=non_recursive [d]=dry_run ) + local file + local regex + local dry_run + local non_recursive + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + regex=${regex:-} + dry_run=${dry_run:-0} + non_recursive=${non_recursive:-0} + + local forbidden_path=" +/var/www \ +/home/yunohost.app" + + # Fail if no argument is provided to the helper. + if [ -z "$file" ] + then + ynh_print_warn --message="ynh_secure_remove called with no argument --file, ignoring." + return 0 + fi + + if [ -n "$regex" ] + then + if [ -e "$file" ] + then + if [ $non_recursive -eq 1 ]; then + local recursive="-maxdepth 1" + else + local recursive="" + fi + # Use find to list the files in $file and grep to filter with the regex + files_to_remove="$(find -P "$file" $recursive -name ".." -prune -o -print | grep --extended-regexp "$regex")" + else + ynh_print_info --message="'$file' wasn't deleted because it doesn't exist." + return 0 + fi + else + files_to_remove="$file" + fi + + # Check each file before removing it + while read file_to_remove + do + if [ -n "$file_to_remove" ] + then + # Check all forbidden path before removing anything + # First match all paths or subpaths in $forbidden_path + if [[ "$forbidden_path" =~ "$file_to_remove" ]] || \ + # Match all first level paths from / (Like /var, /root, etc...) + [[ "$file_to_remove" =~ ^/[[:alnum:]]+$ ]] || \ + # Match if the path finishes by /. Because it seems there is an empty variable + [ "${file_to_remove:${#file_to_remove}-1}" = "/" ] + then + ynh_print_err --message="Not deleting '$file_to_remove' because this path is forbidden !!!" + + # If the file to remove exists + elif [ -e "$file_to_remove" ] + then + if [ $dry_run -eq 1 ] + then + ynh_print_warn --message="File to remove: $file_to_remove" + else + if [ $non_recursive -eq 1 ]; then + local recursive="" + else + local recursive="--recursive" + fi + + # Remove a file or a directory + rm --force $recursive "$file_to_remove" + fi + else + # Ignore non existent files with regex, as we likely remove the parent directory before its content is listed. + if [ -z "$regex" ] + then + ynh_print_info --message="'$file_to_remove' wasn't deleted because it doesn't exist." + fi + fi + fi + done <<< "$(echo "$files_to_remove")" +} + #================================================= # FUTURE OFFICIAL HELPERS #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index e2a7375..88f5813 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -236,7 +236,41 @@ then # Move to the dokuwiki installation folder so the "official" commands can be used without adaptation cd $final_path - grep --extended-regexp --invert-match '^($|#)' data/deleted.files | xargs --max-args=1 rm --force --dir || true + while IFS= read -r line; do + + # Added this test to reduce the spam printed by helper to the user in the webadmin. + # Should be less 'scary' to them I think + # + # number of messages = number of lines *2 (673 lines while writing this) + ### grep --extended-regexp --invert-match '^($|#)' data/deleted.files | wc -l + ### 673 + # + # Spam sample: + #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. + #Info : 'inc/parser/spamcheck.php' wasn't deleted because it doesn't exist. + #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. + #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. + #Info : 'lib/images/favicon.ico' wasn't deleted because it doesn't exist. + #Info : 'lib/images/thumbup.gif' wasn't deleted because it doesn't exist. + #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. + #Info : 'lib/images/toolbar/code.png' wasn't deleted because it doesn't exist. + #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. + #Info : 'lib/images/toolbar/empty.png' wasn't deleted because it doesn't exist. + if [ -f "$line" ]; then + ynh_secure_remove --file "$line" + fi + done < <(grep --null --extended-regexp --invert-match '^($|#)' "$final_path/data/deleted.files" | xargs --null --max-args=1 || true) + # ^ ^ First < is redirection, second is process substitution. + # Source: https://tldp.org/LDP/abs/html/process-sub.html + + # Previous attemps if someone reads this one day + ###grep --extended-regexp --invert-match '^($|#)' data/deleted.files | xargs --max-args=1 rm --verbose --force --dir 2>&1 || true + ###grep --extended-regexp --invert-match '^($|#)' data/deleted.files | xargs --max-args=1 ynh_secure_remove --file 2>&1 + + ###grep --null --extended-regexp --invert-match '^($|#)' data/deleted.files > toto.list + ###xargs --null --verbose --max-args=1 --arg-file=toto.list ynh_secure_remove 2>&1 + + ) fi From 1332c386564f02380a6c4cc79c6cadf4ce59f448 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Tue, 25 Aug 2020 23:36:47 +0200 Subject: [PATCH 021/144] [enh] Simplify by removing subprocess + add comment --- scripts/upgrade | 76 +++++++++++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 41 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 88f5813..cf19ba1 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -230,49 +230,43 @@ then # See https://www.dokuwiki.org/install:unused_files if [ -f "$final_path/data/deleted.files" ]; then - # Use a "sub process" to start a new shell to run these commands - # Allow to use only one "cd" and to be more efficent - ( - # Move to the dokuwiki installation folder so the "official" commands can be used without adaptation - cd $final_path + # Feed output of grep[...] line by line to 'ynh_secure_remove' + # 'ynh_secure_remove' can only work file by file. Cannot work with a list + # This is a (complicated) workaround this limitation + while IFS= read -r line; do - while IFS= read -r line; do + # Added this test to reduce the spam printed by helper to the user in the webadmin. + # Should be less 'scary' to them I think + # + # number of messages = number of lines *2 (673 lines while writing this) + ### grep --extended-regexp --invert-match '^($|#)' data/deleted.files | wc -l + ### 673 + # + # Spam sample: + #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. + #Info : 'inc/parser/spamcheck.php' wasn't deleted because it doesn't exist. + #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. + #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. + #Info : 'lib/images/favicon.ico' wasn't deleted because it doesn't exist. + #Info : 'lib/images/thumbup.gif' wasn't deleted because it doesn't exist. + #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. + #Info : 'lib/images/toolbar/code.png' wasn't deleted because it doesn't exist. + #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. + #Info : 'lib/images/toolbar/empty.png' wasn't deleted because it doesn't exist. + if [ -f "$line" ]; then + ynh_secure_remove --file "$line" + fi + done < <(grep --null --extended-regexp --invert-match '^($|#)' "$final_path/data/deleted.files" | xargs --null --max-args=1 || true) + # ^ ^ First < is redirection, second is process substitution. + # Source: https://tldp.org/LDP/abs/html/process-sub.html - # Added this test to reduce the spam printed by helper to the user in the webadmin. - # Should be less 'scary' to them I think - # - # number of messages = number of lines *2 (673 lines while writing this) - ### grep --extended-regexp --invert-match '^($|#)' data/deleted.files | wc -l - ### 673 - # - # Spam sample: - #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. - #Info : 'inc/parser/spamcheck.php' wasn't deleted because it doesn't exist. - #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. - #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. - #Info : 'lib/images/favicon.ico' wasn't deleted because it doesn't exist. - #Info : 'lib/images/thumbup.gif' wasn't deleted because it doesn't exist. - #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. - #Info : 'lib/images/toolbar/code.png' wasn't deleted because it doesn't exist. - #Attention : /!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time. - #Info : 'lib/images/toolbar/empty.png' wasn't deleted because it doesn't exist. - if [ -f "$line" ]; then - ynh_secure_remove --file "$line" - fi - done < <(grep --null --extended-regexp --invert-match '^($|#)' "$final_path/data/deleted.files" | xargs --null --max-args=1 || true) - # ^ ^ First < is redirection, second is process substitution. - # Source: https://tldp.org/LDP/abs/html/process-sub.html - - # Previous attemps if someone reads this one day - ###grep --extended-regexp --invert-match '^($|#)' data/deleted.files | xargs --max-args=1 rm --verbose --force --dir 2>&1 || true - ###grep --extended-regexp --invert-match '^($|#)' data/deleted.files | xargs --max-args=1 ynh_secure_remove --file 2>&1 - - ###grep --null --extended-regexp --invert-match '^($|#)' data/deleted.files > toto.list - ###xargs --null --verbose --max-args=1 --arg-file=toto.list ynh_secure_remove 2>&1 - - - ) - fi + # Previous attemps if someone reads this one day + ###grep --extended-regexp --invert-match '^($|#)' data/deleted.files | xargs --max-args=1 rm --verbose --force --dir 2>&1 || true + ###grep --extended-regexp --invert-match '^($|#)' data/deleted.files | xargs --max-args=1 ynh_secure_remove --file 2>&1 + + ###grep --null --extended-regexp --invert-match '^($|#)' data/deleted.files > toto.list + ###xargs --null --verbose --max-args=1 --arg-file=toto.list ynh_secure_remove 2>&1 +fi # TODO Taken from old "upgrade" script. Should check if it is needed and what it does # Update all plugins From 2075b564ae9cdddc2792b1929b663b23bf1886d9 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 3 Sep 2020 00:02:29 +0200 Subject: [PATCH 022/144] [enh] remove helper's code as there are in core --- scripts/_common.sh | 130 --------------------------------------------- 1 file changed, 130 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 0d62977..944a65e 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -12,136 +12,6 @@ # EXPERIMENTAL HELPERS #================================================= -# Remove a file or a directory securely -# -# usage: ynh_secure_remove --file=path_to_remove [--regex=regex to append to $file] [--non_recursive] [--dry_run] -# | arg: -f, --file - File or directory to remove -# | arg: -r, --regex - Regex to append to $file to filter the files to remove -# | arg: -n, --non_recursive - Perform a non recursive rm and a non recursive search with the regex -# | arg: -d, --dry_run - Do not remove, only list the files to remove -# -# Requires YunoHost version 2.6.4 or higher. -ynh_secure_remove () { - # Declare an array to define the options of this helper. - local legacy_args=frnd - declare -Ar args_array=( [f]=file= [r]=regex= [n]=non_recursive [d]=dry_run ) - local file - local regex - local dry_run - local non_recursive - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - regex=${regex:-} - dry_run=${dry_run:-0} - non_recursive=${non_recursive:-0} - - local forbidden_path=" -/var/www \ -/home/yunohost.app" - - # Fail if no argument is provided to the helper. - if [ -z "$file" ] - then - ynh_print_warn --message="ynh_secure_remove called with no argument --file, ignoring." - return 0 - fi - - if [ -n "$regex" ] - then - if [ -e "$file" ] - then - if [ $non_recursive -eq 1 ]; then - local recursive="-maxdepth 1" - else - local recursive="" - fi - # Use find to list the files in $file and grep to filter with the regex - files_to_remove="$(find -P "$file" $recursive -name ".." -prune -o -print | grep --extended-regexp "$regex")" - else - ynh_print_info --message="'$file' wasn't deleted because it doesn't exist." - return 0 - fi - else - files_to_remove="$file" - fi - - # Check each file before removing it - while read file_to_remove - do - if [ -n "$file_to_remove" ] - then - # Check all forbidden path before removing anything - # First match all paths or subpaths in $forbidden_path - if [[ "$forbidden_path" =~ "$file_to_remove" ]] || \ - # Match all first level paths from / (Like /var, /root, etc...) - [[ "$file_to_remove" =~ ^/[[:alnum:]]+$ ]] || \ - # Match if the path finishes by /. Because it seems there is an empty variable - [ "${file_to_remove:${#file_to_remove}-1}" = "/" ] - then - ynh_print_err --message="Not deleting '$file_to_remove' because this path is forbidden !!!" - - # If the file to remove exists - elif [ -e "$file_to_remove" ] - then - if [ $dry_run -eq 1 ] - then - ynh_print_warn --message="File to remove: $file_to_remove" - else - if [ $non_recursive -eq 1 ]; then - local recursive="" - else - local recursive="--recursive" - fi - - # Remove a file or a directory - rm --force $recursive "$file_to_remove" - fi - else - # Ignore non existent files with regex, as we likely remove the parent directory before its content is listed. - if [ -z "$regex" ] - then - ynh_print_info --message="'$file_to_remove' wasn't deleted because it doesn't exist." - fi - fi - fi - done <<< "$(echo "$files_to_remove")" -} - #================================================= # FUTURE OFFICIAL HELPERS #================================================= - -# Check if a permission exists -# -# While waiting for this new helper https://github.com/YunoHost/yunohost/pull/905 -# We have to use another one because the new helper use a new YunoHost command, not available for now. -# -# usage: ynh_permission_has_user --permission=permission --user=user -# | arg: -p, --permission - the permission to check -# | arg: -u, --user - the user seek in the permission -# -# example: ynh_permission_has_user --permission=main --user=visitors -# -# Requires YunoHost version 3.7.1 or higher. -ynh_permission_has_user() { - local legacy_args=pu - # Declare an array to define the options of this helper. - declare -Ar args_array=( [p]=permission= [u]=user= ) - local permission - local user - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - - if ! ynh_permission_exists --permission=$permission - then - return 1 - fi - - # List all permissions - # Filter only the required permission with a multiline sed (Here a cut from the permission to the next one), remove the url and his value - perm="$(yunohost user permission list --full --output-as plain | sed --quiet "/^#$app.$permission/,/^#[[:alnum:]]/p" | sed "/^##url/,+1d")" - # Remove all lines starting by # (got from the plain output before) - allowed_users="$(echo "$perm" | grep --invert-match '^#')" - # Grep the list of users an return the result if the user is indeed into the list - echo "$allowed_users" | grep --quiet --word "$user" -} \ No newline at end of file From 0ce691091d35d9d5a182ea5427aad07b64a999c6 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 3 Sep 2020 00:05:08 +0200 Subject: [PATCH 023/144] [enh] fix CI test for upgrade - add recent commit --- check_process | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/check_process b/check_process index f6fdd01..c039dfc 100644 --- a/check_process +++ b/check_process @@ -14,7 +14,8 @@ setup_private=1 setup_public=1 upgrade=1 - upgrade=1 from_commit=01add99d3d903ca6d07f863045edf2ba46cf18d5 + # Laster released version. See https://github.com/YunoHost-Apps/dokuwiki_ynh/commits/master + upgrade=1 from_commit=500a7d3fa9c008a2b75d0f6bec519e41fed97da0 backup_restore=1 multi_instance=1 incorrect_path=1 From b428aa06bb56ac65ca9427ef642fd102f0314b76 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 10:59:54 +0200 Subject: [PATCH 024/144] Update app.src --- conf/app.src | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/app.src b/conf/app.src index 4021565..2274131 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2018-04-22b.tgz -SOURCE_SUM=9d1437cdc7e98e471ff32079f7ca224ccf52dbbaafed39ec9746b0405b3a29ce +SOURCE_URL=https://github.com/splitbrain/dokuwiki/archive/release_stable_2020-07-29.tar.gz +SOURCE_SUM=cc1cd9f00095fea327baa79d8f02c904fe1c37bc3f8fd9999eaf646ee9928884 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true From c5178d814f1a989739d761ccec2e8df274c6a093 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:34:47 +0200 Subject: [PATCH 025/144] Add badges --- README.md | 6 +++--- README_fr.md | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 8f18d2a..fd1beff 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DokuWiki for YunoHost -[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) +[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) [![Install DokuWiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* @@ -38,12 +38,12 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ### Supported architectures -* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) ## Limitations -* Cannot create or login with dokuwiki internal users, only users from Yunohost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) +* Cannot create or login with DokuWiki internal users, only users from YunoHost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) ## Links diff --git a/README_fr.md b/README_fr.md index 2eb9035..ee91cd0 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,18 +1,22 @@ -# Dokuwiki pour YunoHost +# DokuWiki pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) +[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) [![Installer DokuWiki grâce à YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) *[Read this readme in english.](./README.md)* -> *Ce package vous permet d'installer Dokuwiki rapidement et simplement sur un serveur Yunohost. +> *Ce package vous permet d'installer DokuWiki 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.* ## Vue d'ensemble DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne nécessite pas de base de données. Il est apprécié par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait un favori d'administrateur. Des contrôles d'accès et des connecteurs d'authentification intégrés rendent DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins apportés par sa communauté dynamique permettent un large éventail de cas d'utilisation au-delà d'un wiki traditionnel. +<<<<<<< Updated upstream **Version incluse:** 2018-04-22b "Greebo" +======= +**Version incluse :** 2018-04-22a "Greebo" +>>>>>>> Stashed changes ## Captures d'écran @@ -26,8 +30,13 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentation +<<<<<<< Updated upstream * Documentation officielle: * Documentation YunoHost: +======= +* Documentation officielle : https://www.dokuwiki.org/manual +* Documentation YunoHost : https://yunohost.org/#/app_dokuwiki +>>>>>>> Stashed changes ## Caractéristiques spécifiques YunoHost @@ -38,27 +47,38 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ### Architectures matérielles supportées -* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) ## Limitations -* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de Yunohost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) +* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de YunoHost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) +<<<<<<< Updated upstream ## Liens * Signaler un bug: * Site de l'application: * Dépôt de l'application principale: * Site web YunoHost: +======= +## Informations additionnelles + +### Historique des versions + +## Liens + + * Signaler un bug : https://github.com/YunoHost-Apps/dokuwiki_ynh/issues + * Site de l'application : https://www.dokuwiki.org + * Dépôt de l'application principale : https://github.com/splitbrain/dokuwiki + * Site web YunoHost : https://yunohost.org/ +>>>>>>> Stashed changes --- ## Informations pour les développeurs -**Seulement si vous voulez utiliser une branche de test pour le codage, au lieu de fusionner directement dans la banche principale.** - -Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing). +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. From cb229a1462fabe42654b289ef9d70e3b0a0698f8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:36:42 +0200 Subject: [PATCH 026/144] Change version --- README.md | 2 +- README_fr.md | 8 ++------ dokuwikimainwindow.png | Bin 21486 -> 0 bytes manifest.json | 6 +++--- 4 files changed, 6 insertions(+), 10 deletions(-) delete mode 100644 dokuwikimainwindow.png diff --git a/README.md b/README.md index fd1beff..2d1b627 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. -**Shipped version:** 2018-04-22b "Greebo" +**Shipped version:** 2020-07-29 ## Screenshots diff --git a/README_fr.md b/README_fr.md index ee91cd0..1d80136 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,7 +1,7 @@ # DokuWiki pour YunoHost [![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) -[![Installer DokuWiki grâce à YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) +[![Installer DokuWiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) *[Read this readme in english.](./README.md)* @@ -12,11 +12,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne nécessite pas de base de données. Il est apprécié par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait un favori d'administrateur. Des contrôles d'accès et des connecteurs d'authentification intégrés rendent DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins apportés par sa communauté dynamique permettent un large éventail de cas d'utilisation au-delà d'un wiki traditionnel. -<<<<<<< Updated upstream -**Version incluse:** 2018-04-22b "Greebo" -======= -**Version incluse :** 2018-04-22a "Greebo" ->>>>>>> Stashed changes +**Version incluse:** 2020-07-29 ## Captures d'écran diff --git a/dokuwikimainwindow.png b/dokuwikimainwindow.png deleted file mode 100644 index c357376b781f55d9cfe7d6505bbc679a4dd41e8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21486 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 diff --git a/manifest.json b/manifest.json index 8b83da8..53dd472 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Un sistema de Wiki de uso sencillicimo y compatible con los estándares.", "it": "Un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2018-04-22b~ynh1", + "version": "2020-07-29~ynh1", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { @@ -63,10 +63,10 @@ "name": "is_public", "type": "boolean", "ask": { - "en": "Is it a public DokuWiki site ?", + "en": "Is it a public DokuWiki site?", "fr": "Est-ce un site public ?" }, - "default": "true" + "default": true }, { "name": "language", From 7bea7b1b3b2fb3d96d43b98288c431c915c3dec5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:39:46 +0200 Subject: [PATCH 027/144] Nicer screenshot --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2d1b627..bf68e11 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Screenshots -![Screenshot of DokuWiki main window](dokuwikimainwindow.png) +![Screenshot](https://www.dokuwiki.org/lib/exe/fetch.php?tok=341927&media=http%3A%2F%2Fimg832.imageshack.us%2Fimg832%2F8784%2Fdokuwikitemplatevector2.png) ## Demo diff --git a/README_fr.md b/README_fr.md index 1d80136..ba796c2 100644 --- a/README_fr.md +++ b/README_fr.md @@ -16,7 +16,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Captures d'écran -![Capture d'écran de la fenêtre principale de DokuWiki](dokuwikimainwindow.png) +![Capture d'écran](https://www.dokuwiki.org/lib/exe/fetch.php?tok=341927&media=http%3A%2F%2Fimg832.imageshack.us%2Fimg832%2F8784%2Fdokuwikitemplatevector2.png) ## Démo From 9b7d078d822ec79fca72bae24dd5c4d4e38f573d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:40:23 +0200 Subject: [PATCH 028/144] Cleanup backup script --- scripts/backup | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/scripts/backup b/scripts/backup index b931a0e..176834b 100755 --- a/scripts/backup +++ b/scripts/backup @@ -19,7 +19,7 @@ ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." +ynh_print_info --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME @@ -27,32 +27,31 @@ final_path=$(ynh_app_setting_get --app=$app --key=final_path) domain=$(ynh_app_setting_get --app=$app --key=domain) #================================================= -# STANDARD BACKUP STEPS +# DECLARE DATA AND CONF FILES TO BACKUP +#================================================= +ynh_print_info --message="Declaring files to be backed up..." + #================================================= # BACKUP THE APP MAIN DIR #================================================= -ynh_script_progression --message="Backing up the main app directory..." ynh_backup --src_path="$final_path" #================================================= # BACKUP THE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Backing up nginx web server configuration..." ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # BACKUP THE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Backing up php-fpm configuration..." --weight=2 ynh_backup --src_path="/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # BACKUP FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Backing up fail2ban configuration..." ynh_backup --src_path="/etc/fail2ban/jail.d/$app.conf" ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" @@ -61,4 +60,4 @@ ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" # END OF SCRIPT #================================================= -ynh_script_progression --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." --last +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." From d6660e904fb7e917b362b20df5dedb4c8846470b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:46:49 +0200 Subject: [PATCH 029/144] Small typos --- scripts/change_url | 16 ++++++++-------- scripts/install | 22 +++++++++++----------- scripts/remove | 10 +++++----- scripts/restore | 4 ++-- scripts/upgrade | 20 ++++++++++---------- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 6851308..fe9ea64 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -50,23 +50,23 @@ fi #================================================= # MODIFY URL IN NGINX CONF #================================================= -ynh_script_progression --message="Updating nginx web server configuration..." --weight=2 +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=2 nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf -# Change the path in the nginx config file +# Change the path in the NGINX config file if [ $change_path -eq 1 ] then - # Make a backup of the original nginx config file if modified + # Make a backup of the original NGINX config file if modified ynh_backup_if_checksum_is_different --file="$nginx_conf_path" - # Set global variables for nginx helper + # Set global variables for NGINX helper domain="$old_domain" path_url="$new_path" - # Create a dedicated nginx config + # Create a dedicated NGINX config ynh_add_nginx_config fi -# Change the domain for nginx +# Change the domain for NGINX if [ $change_domain -eq 1 ] then # Delete file checksum for the old conf file location @@ -81,7 +81,7 @@ fi #================================================= # UPGRADE FAIL2BAN #================================================= -ynh_script_progression --message="Reconfiguring fail2ban..." --weight=6 +ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=6 ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $new_path.*$" --max_retry=5 @@ -90,7 +90,7 @@ ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failr #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/install b/scripts/install index 4ceb331..820c3ef 100755 --- a/scripts/install +++ b/scripts/install @@ -64,9 +64,9 @@ ynh_setup_source --dest_dir="$final_path" #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Configuring nginx web server..." --weight=2 +ynh_script_progression --message="Configuring NGINX web server..." --weight=2 -# Create a dedicated nginx config +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= @@ -80,9 +80,9 @@ ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Configuring php-fpm..." --weight=2 +ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 -# Create a dedicated php-fpm config +# Create a dedicated PHP-FPM config ynh_add_fpm_config #================================================= @@ -90,7 +90,7 @@ ynh_add_fpm_config #================================================= # CUSTOMIZE DOKUWIKI #================================================= -ynh_script_progression --message="Configuring dokuwiki..." --weight=2 +ynh_script_progression --message="Configuring DokuWiki..." --weight=2 # Loading order of configuration files # @@ -103,8 +103,8 @@ ynh_script_progression --message="Configuring dokuwiki..." --weight=2 # See https://www.dokuwiki.org/plugin:config#protecting_settings -### Copy Yunohost specific configuration -# This File cannot be modified directly by Dokuwiki, only by hand or by Yunohost +### Copy YunoHost specific configuration +# This File cannot be modified directly by DokuWiki, only by hand or by YunoHost # It will only be updated by Yunohost package or directly by adventurous users cp ../conf/local.protected.php $final_path/conf @@ -112,7 +112,7 @@ cp ../conf/local.protected.php $final_path/conf ynh_replace_string --match_string="__YNH_ADMIN_USER__" --replace_string="$admin" --target_file="$final_path/conf/local.protected.php" -# This file might be modified by dokuwiki admin panel or by plugins +# This file might be modified by DokuWiki admin panel or by plugins # It will not be modified by Yunohost in order to keep user settings cp ../conf/local.php $final_path/conf @@ -159,7 +159,7 @@ ynh_store_file_checksum --file="$final_path/conf/local.protected.php" #================================================= # INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN #================================================= -ynh_script_progression --message="Installing logautherror plugin for fail2ban..." --weight=2 +ynh_script_progression --message="Installing logautherror plugin for Fail2Ban..." --weight=2 ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror @@ -209,7 +209,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 #================================================= # SETUP FAIL2BAN #================================================= -ynh_script_progression --message="Configuring fail2ban..." --weight=7 +ynh_script_progression --message="Configuring Fail2Ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 @@ -228,7 +228,7 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/remove b/scripts/remove index 6bb05bb..b0d36b7 100755 --- a/scripts/remove +++ b/scripts/remove @@ -32,23 +32,23 @@ ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing nginx web server configuration..." +ynh_script_progression --message="Removing NGINX web server configuration..." -# Remove the dedicated nginx config +# Remove the dedicated NGINX config ynh_remove_nginx_config #================================================= # REMOVE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Removing php-fpm configuration..." --weight=2 +ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=2 -# Remove the dedicated php-fpm config +# Remove the dedicated PHP-FPM config ynh_remove_fpm_config #================================================= # REMOVE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Removing fail2ban configuration..." --weight=7 +ynh_script_progression --message="Removing Fail2Ban configuration..." --weight=7 ynh_remove_fail2ban_config diff --git a/scripts/restore b/scripts/restore index 0cf8f4a..e36a534 100755 --- a/scripts/restore +++ b/scripts/restore @@ -94,7 +94,7 @@ ynh_restore_file --origin_path="/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # RESTORE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the fail2ban configuration..." --weight=7 +ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=7 ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" @@ -105,7 +105,7 @@ ynh_systemd_action --action=restart --service_name=fail2ban #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading nginx web server and php-fpm..." --weight=2 +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM.." --weight=2 ynh_systemd_action --service_name=php7.0-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/upgrade b/scripts/upgrade index 8e9eaaa..645baee 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -63,10 +63,10 @@ fi -# Yunohost specific configuration, if it isn't exist already +# YunoHost specific configuration, if it isn't exist already # Previously, these settings were store in an unique "dokuwiki.php" -# Now, they are split in multiple files to ease upgrading process (separate Yunohost config from user config) +# Now, they are split in multiple files to ease upgrading process (separate YunoHost config from user config) # Loading order of configuration files # @@ -176,9 +176,9 @@ fi #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading nginx web server configuration..." --weight=2 +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 -# Create a dedicated nginx config +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= @@ -192,9 +192,9 @@ ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading php-fpm configuration..." +ynh_script_progression --message="Upgrading PHP-FPM configuration..." -# Create a dedicated php-fpm config +# Create a dedicated PHP-FPM config ynh_add_fpm_config #================================================= @@ -203,7 +203,7 @@ ynh_add_fpm_config if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Upgrading dokuwiki..." --weight=7 + ynh_script_progression --message="Upgrading DokuWiki..." --weight=7 # Remove upgrade notification inside Dokuwiki's admin panel # See https://www.dokuwiki.org/update_check @@ -256,7 +256,7 @@ ynh_store_file_checksum --file="$final_path/conf/local.protected.php" #================================================= # INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN #================================================= -ynh_script_progression --message="Upgrading logautherror plugin for fail2ban..." --weight=2 +ynh_script_progression --message="Upgrading logautherror plugin for Fail2Ban..." --weight=2 ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror @@ -306,7 +306,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 #================================================= # SETUP FAIL2BAN #================================================= -ynh_script_progression --message="Reconfiguring fail2ban..." --weight=7 +ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 @@ -329,7 +329,7 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload From 8accb206f20e013e30309aae5298d7d815b5afb3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:48:33 +0200 Subject: [PATCH 030/144] Update README_fr.md --- README_fr.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/README_fr.md b/README_fr.md index ba796c2..51397f0 100644 --- a/README_fr.md +++ b/README_fr.md @@ -26,13 +26,8 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentation -<<<<<<< Updated upstream -* Documentation officielle: -* Documentation YunoHost: -======= * Documentation officielle : https://www.dokuwiki.org/manual * Documentation YunoHost : https://yunohost.org/#/app_dokuwiki ->>>>>>> Stashed changes ## Caractéristiques spécifiques YunoHost @@ -50,14 +45,6 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de YunoHost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) -<<<<<<< Updated upstream -## Liens - -* Signaler un bug: -* Site de l'application: -* Dépôt de l'application principale: -* Site web YunoHost: -======= ## Informations additionnelles ### Historique des versions @@ -68,7 +55,6 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Site de l'application : https://www.dokuwiki.org * Dépôt de l'application principale : https://github.com/splitbrain/dokuwiki * Site web YunoHost : https://yunohost.org/ ->>>>>>> Stashed changes --- From 0db62e3a35ce0f87fffba3f6701586f8f504ce90 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:55:17 +0200 Subject: [PATCH 031/144] Update README.md --- README.md | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index bf68e11..5d0b729 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,8 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Documentation -* Official documentation: -* YunoHost documentation: +* Official documentation: https://www.dokuwiki.org/manual +* YunoHost documentation: https://yunohost.org/#/app_dokuwiki ## YunoHost specific features @@ -47,22 +47,19 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Links -* Report a bug: -* App website: -* Upstream app repository: -* YunoHost website: +* Report a bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues +* App website: https://www.dokuwiki.org +* Upstream app repository: https://github.com/splitbrain/dokuwiki +* YunoHost website: https://yunohost.org --- ## Developers infos -**Only if you know what you are doing AND want to switch to an unstable branch for testing or coding** +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) -Instead of merging directly into `master`, please do your pull request to the [`testing` branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) - -To try the `testing` branch, please proceed like that. - -```bash +To try the testing branch, please proceed like that. +``` sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug or sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug From 65d17a64b58e13ce540919aebfb7c8db8d35d582 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 25 Sep 2020 21:49:16 +0200 Subject: [PATCH 032/144] Add local screenshot --- README.md | 2 +- README_fr.md | 2 +- sources/DokuWiki_Screenshot.png | Bin 0 -> 141447 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 sources/DokuWiki_Screenshot.png diff --git a/README.md b/README.md index 5d0b729..ea35bc5 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Screenshots -![Screenshot](https://www.dokuwiki.org/lib/exe/fetch.php?tok=341927&media=http%3A%2F%2Fimg832.imageshack.us%2Fimg832%2F8784%2Fdokuwikitemplatevector2.png) +![Screenshot](../sources/DokuWiki_Screenshot.png) ## Demo diff --git a/README_fr.md b/README_fr.md index 51397f0..cc4b1d3 100644 --- a/README_fr.md +++ b/README_fr.md @@ -16,7 +16,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Captures d'écran -![Capture d'écran](https://www.dokuwiki.org/lib/exe/fetch.php?tok=341927&media=http%3A%2F%2Fimg832.imageshack.us%2Fimg832%2F8784%2Fdokuwikitemplatevector2.png) +![Capture d'écran](../sources/DokuWiki_Screenshot.png) ## Démo diff --git a/sources/DokuWiki_Screenshot.png b/sources/DokuWiki_Screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..dcba61c6d18cee25ab47c4bde5370fcc71d41830 GIT binary patch literal 141447 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%0D!mL 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� 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 Date: Fri, 23 Oct 2020 18:35:07 +0200 Subject: [PATCH 037/144] Transition to PHP7.2 (#68) --- conf/nginx.conf | 2 +- conf/php-fpm.conf | 2 +- manifest.json | 2 +- scripts/_common.sh | 18 ++++++++++++++++++ scripts/backup | 3 ++- scripts/install | 3 ++- scripts/restore | 5 +++-- scripts/upgrade | 5 ++--- 8 files changed, 30 insertions(+), 10 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 5cb057b..85ae532 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -23,7 +23,7 @@ location __PATH__/ { location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; - fastcgi_pass unix:/var/run/php/php7.0-fpm-__NAME__.sock; + fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; fastcgi_index index.php; include fastcgi_params; diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf index 74a8089..238913c 100644 --- a/conf/php-fpm.conf +++ b/conf/php-fpm.conf @@ -33,7 +33,7 @@ group = __USER__ ; (IPv6 and IPv4-mapped) on a specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. -listen = /var/run/php/php7.0-fpm-__NAMETOCHANGE__.sock +listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock ; Set listen(2) backlog. ; Default Value: 511 (-1 on FreeBSD and OpenBSD) diff --git a/manifest.json b/manifest.json index 53dd472..f21401e 100644 --- a/manifest.json +++ b/manifest.json @@ -22,7 +22,7 @@ "email": "opi@zeropi.net" }], "requirements": { - "yunohost": ">= 3.5.0" + "yunohost": ">= 3.8.1" }, "multi_instance": true, "services": [ diff --git a/scripts/_common.sh b/scripts/_common.sh index a9bf588..d7614e9 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1 +1,19 @@ #!/bin/bash + +#================================================= +# COMMON VARIABLES +#================================================= + +YNH_PHP_VERSION="7.3" + +#================================================= +# PERSONAL HELPERS +#================================================= + +#================================================= +# EXPERIMENTAL HELPERS +#================================================= + +#================================================= +# FUTURE OFFICIAL HELPERS +#================================================= diff --git a/scripts/backup b/scripts/backup index 176834b..994eb7f 100755 --- a/scripts/backup +++ b/scripts/backup @@ -25,6 +25,7 @@ app=$YNH_APP_INSTANCE_NAME final_path=$(ynh_app_setting_get --app=$app --key=final_path) domain=$(ynh_app_setting_get --app=$app --key=domain) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # DECLARE DATA AND CONF FILES TO BACKUP @@ -47,7 +48,7 @@ ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" # BACKUP THE PHP-FPM CONFIGURATION #================================================= -ynh_backup --src_path="/etc/php/7.0/fpm/pool.d/$app.conf" +ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" #================================================= # BACKUP FAIL2BAN CONFIGURATION diff --git a/scripts/install b/scripts/install index 820c3ef..c0ddf5b 100755 --- a/scripts/install +++ b/scripts/install @@ -83,7 +83,8 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 # Create a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_add_fpm_config --phpversion=$YNH_PHP_VERSION +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # SPECIFIC SETUP diff --git a/scripts/restore b/scripts/restore index e36a534..8e49f15 100755 --- a/scripts/restore +++ b/scripts/restore @@ -26,6 +26,7 @@ app=$YNH_APP_INSTANCE_NAME 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) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # CHECK IF THE APP CAN BE RESTORED @@ -89,7 +90,7 @@ chown -R $app:root $final_path/lib/tpl # RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_restore_file --origin_path="/etc/php/7.0/fpm/pool.d/$app.conf" +ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" #================================================= # RESTORE FAIL2BAN CONFIGURATION @@ -107,7 +108,7 @@ ynh_systemd_action --action=restart --service_name=fail2ban #================================================= ynh_script_progression --message="Reloading NGINX web server and PHP-FPM.." --weight=2 -ynh_systemd_action --service_name=php7.0-fpm --action=reload +ynh_systemd_action --service_name=php${phpversion}-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 645baee..6a99821 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -21,6 +21,7 @@ path_url=$(ynh_app_setting_get --app=$app --key=path) admin=$(ynh_app_setting_get --app=$app --key=admin) is_public=$(ynh_app_setting_get --app=$app --key=is_public) final_path=$(ynh_app_setting_get --app=$app --key=final_path) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # CHECK VERSION @@ -61,8 +62,6 @@ if [ -z "$language" ]; then ynh_app_setting_set --app=$app --key=language --value=$language fi - - # YunoHost specific configuration, if it isn't exist already # Previously, these settings were store in an unique "dokuwiki.php" @@ -195,7 +194,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Upgrading PHP-FPM configuration..." # Create a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_add_fpm_config --phpversion=$YNH_PHP_VERSION #================================================= # SPECIFIC UPGRADE From d34636051e17e4992450be17e97623037d02ae44 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 23 Oct 2020 18:49:46 +0200 Subject: [PATCH 038/144] Update CHANGELOG.md --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba827a8..3eeed71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,16 @@ ------------ +## [2020-07-29~ynh2] - 2020-10-23 + +### Added + +- New DokuWiki version `2020-07-29` + +### Changed + +- Set PHP7.3 as default + ## [2018-04-22b~ynh1] - 2020-03-23 ### Added From f27e751e89b040a3358814c197f8a21c0bd03da9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 23 Oct 2020 18:50:59 +0200 Subject: [PATCH 039/144] Version increment --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index f21401e..80b7cd1 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Un sistema de Wiki de uso sencillicimo y compatible con los estándares.", "it": "Un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2020-07-29~ynh1", + "version": "2020-07-29~ynh2", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { From 2e7ac608edf98e2428ff9f97ad029f69b5cba8c1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 24 Oct 2020 06:46:41 +0200 Subject: [PATCH 040/144] Revert "Testing (#67)" This reverts commit d3723298e2941744a39938b28e7a5b061ad58896. --- CHANGELOG.md | 59 -------------------------------- README.md | 33 ++++++++++++------ README_fr.md | 42 +++++++++++++---------- conf/app.src | 6 ++-- conf/nginx.conf | 4 +-- manifest.json | 16 ++++----- pull_request_template.md | 12 ++++--- scripts/backup | 13 +++---- scripts/change_url | 16 ++++----- scripts/install | 22 ++++++------ scripts/remove | 10 +++--- scripts/restore | 4 +-- scripts/upgrade | 20 +++++------ sources/DokuWiki_Screenshot.png | Bin 141447 -> 0 bytes 14 files changed, 109 insertions(+), 148 deletions(-) delete mode 100644 CHANGELOG.md delete mode 100644 sources/DokuWiki_Screenshot.png diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index ba827a8..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,59 +0,0 @@ -# Changelog - -## [Unreleased] - -## [2018-04-22a~ynhXX] - -### Added - -- Upgrade actions and config-panel scripts - ------------- - -## [2018-04-22b~ynh1] - 2020-03-23 - -### Added - -- New DokuWiki version `2018-04-22b` -- Changelog available in `CHANGELOG.md` - -### Changed - -- Upgrade content of file `pull_request_template.md` - -## [2018-04-22a~ynh3] - 2020-02-20 - -### Added - -- Use 'URL rewrite' for prettier URLs - -### Changed - -- Activate URL rewrite by default (does not break old links) - -### Removed - -- Unused DokuWiki config file - -## [2018-04-22a~ynh2] - 2020-02-20 - -### Added - -- Add fail2ban support to avoid bruteforce login attempts - -### Changed - -- Global upgrade of the package - -### Fixed - -- Get rid of the php ini file and merge its content into the pool file -- Update Readme following last work made on the package and current version in testing branch - -### Removed - -- Unused config file settings - -## [Previous versions] - YYYY-MM-DD - -- Will be written (one day maybye) diff --git a/README.md b/README.md index dadfba7..fea004e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DokuWiki for YunoHost -[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) [![Install DokuWiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* @@ -12,11 +12,11 @@ If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. -**Shipped version:** 2020-07-29 +**Shipped version:** 2018-04-22a "Greebo" ## Screenshots -![Screenshot of DokuWiki main window](sources/DokuWiki_Screenshot.png) +![](https://www.dokuwiki.org/_media/dokuwikimainwindow.png) ## Demo @@ -38,27 +38,38 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ### Supported architectures -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) +* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) +* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-stretch.nohost.me/ci/apps/dokuwiki/) ## Limitations -* Cannot create or login with DokuWiki internal users, only users from YunoHost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) +* Cannot create or login with dokuwiki internal users, only users from Yunohost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) + +## Additional information + +### Changelog + +* *Many missing - List taken from previous documentation* +* 07 Mar 2017 - Update app +* 11 Feb 2017 - Create script app ## Links -* Report a bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues -* App website: https://www.dokuwiki.org -* Upstream app repository: https://github.com/splitbrain/dokuwiki -* YunoHost website: https://yunohost.org + * Report a bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues + * App website: https://www.dokuwiki.org + * Upstream app repository: https://github.com/splitbrain/dokuwiki + * YunoHost website: https://yunohost.org --- ## Developers infos -Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) +**Only if you know what you are doing AND want to switch to an unstable branch for testing or coding** -To try the testing branch, please proceed like that. +Instead of merging directly into `master`, please do your pull request to the [`testing` branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) + +To try the `testing` branch, please proceed like that. ``` sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug or diff --git a/README_fr.md b/README_fr.md index 0796ecc..fe39537 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,22 +1,22 @@ -# DokuWiki pour YunoHost +# Dokuwiki pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) -[![Installer DokuWiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) +[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) +[![Installer DokuWiki grâce à YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) -*[Read this readme in english.](./README.md)* +*[Read this readme in english.](./README.md)* -> *Ce package vous permet d'installer DokuWiki rapidement et simplement sur un serveur YunoHost. +> *Ce package vous permet d'installer Dokuwiki 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.* ## Vue d'ensemble DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne nécessite pas de base de données. Il est apprécié par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait un favori d'administrateur. Des contrôles d'accès et des connecteurs d'authentification intégrés rendent DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins apportés par sa communauté dynamique permettent un large éventail de cas d'utilisation au-delà d'un wiki traditionnel. -**Version incluse:** 2020-07-29 +**Version incluse:** 2018-04-22a "Greebo" ## Captures d'écran -![Capture d'écran](sources/DokuWiki_Screenshot.png) +![](https://www.dokuwiki.org/_media/dokuwikimainwindow.png) ## Démo @@ -26,8 +26,8 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentation -* Documentation officielle : https://www.dokuwiki.org/manual -* Documentation YunoHost : https://yunohost.org/#/app_dokuwiki +* Documentation officielle: https://www.dokuwiki.org/manual +* Documentation YunoHost: https://yunohost.org/#/app_dokuwiki ## Caractéristiques spécifiques YunoHost @@ -38,33 +38,39 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ### Architectures matérielles supportées -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) +* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) +* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-stretch.nohost.me/ci/apps/dokuwiki/) ## Limitations -* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de YunoHost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) +* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de Yunohost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) ## Informations additionnelles ### Historique des versions +* *Many missing - List taken from previous documentation* +* 07 Mar 2017 - Update app +* 11 Feb 2017 - Create script app + ## Liens - * Signaler un bug : https://github.com/YunoHost-Apps/dokuwiki_ynh/issues - * Site de l'application : https://www.dokuwiki.org - * Dépôt de l'application principale : https://github.com/splitbrain/dokuwiki - * Site web YunoHost : https://yunohost.org/ + * Signaler un bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues + * Site de l'application:https://www.dokuwiki.org + * Dépôt de l'application principale: https://github.com/splitbrain/dokuwiki + * Site web YunoHost: https://yunohost.org/ --- ## Informations pour les développeurs -Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). +**Seulement si vous voulez utiliser une branche de test pour le codage, au lieu de fusionner directement dans la banche principale.** + +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. - -```bash +``` sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ou sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug diff --git a/conf/app.src b/conf/app.src index 2274131..e42acb7 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,6 +1,6 @@ -SOURCE_URL=https://github.com/splitbrain/dokuwiki/archive/release_stable_2020-07-29.tar.gz -SOURCE_SUM=cc1cd9f00095fea327baa79d8f02c904fe1c37bc3f8fd9999eaf646ee9928884 -SOURCE_SUM_PRG=sha256sum +SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2018-04-22a.tgz +SOURCE_SUM=18765a29508f96f9882349a304bffc03 +SOURCE_SUM_PRG=md5sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true SOURCE_FILENAME= diff --git a/conf/nginx.conf b/conf/nginx.conf index 5cb057b..64fc3ba 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -39,12 +39,12 @@ location __PATH__/ { } # Deny Access to htaccess-Files for Apache - location ~ __PATH__/\.ht { + location ~ /\.ht { deny all; } # Serve static files - location ~ ^__PATH__/lib.*\.(gif|png|ico|jpg)$ { + location ~ ^/lib.*\.(gif|png|ico|jpg)$ { expires 30d; } diff --git a/manifest.json b/manifest.json index 53dd472..1c3ae56 100644 --- a/manifest.json +++ b/manifest.json @@ -3,13 +3,13 @@ "id": "dokuwiki", "packaging_format": 1, "description": { - "en": "A lightweight, simple to use and highly versatile wiki", - "fr": "Un wiki léger, simple à utiliser et très polyvalent", - "de": "Ein standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab.", - "es": "Un sistema de Wiki de uso sencillicimo y compatible con los estándares.", - "it": "Un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." + "en": "DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database.", + "fr": "DokuWiki est un wiki Open Source simple à utiliser et très polyvalent qui n'exige aucune base de données.", + "de": "DokuWiki ist ein standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab.", + "es": "DokuWiki es un sistema de Wiki de uso sencillicimo y compatible con los estándares.", + "it": "DokuWiki è un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2020-07-29~ynh1", + "version": "2018-04-22a~ynh3", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { @@ -63,10 +63,10 @@ "name": "is_public", "type": "boolean", "ask": { - "en": "Is it a public DokuWiki site?", + "en": "Is it a public DokuWiki site ?", "fr": "Est-ce un site public ?" }, - "default": true + "default": "true" }, { "name": "language", diff --git a/pull_request_template.md b/pull_request_template.md index 8f984e1..fceb723 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -2,7 +2,7 @@ - *Description of why you made this PR* ## Solution -- *And how do you fix that problem* +- *And how you fix that* ## PR Status - [ ] Code finished. @@ -13,10 +13,12 @@ ## Validation --- +*Minor decision* +- **Upgrade previous version** : - [ ] **Code review** : -- [ ] **Approval (LGTM)** : -*Code review and approval have to be from a member of @YunoHost-Apps/apps-group* -- **CI succeeded** : -[![Build Status](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/badge/icon)](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/) +- [ ] **Approval (LGTM)** : +- [ ] **Approval (LGTM)** : +- **CI succeeded** : +[![Build Status](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/badge/icon)](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/) *Please replace '-NUM-' in this link by the PR number.* When the PR is marked as ready to merge, you have to wait for 3 days before really merging it. diff --git a/scripts/backup b/scripts/backup index 176834b..b931a0e 100755 --- a/scripts/backup +++ b/scripts/backup @@ -19,7 +19,7 @@ ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_print_info --message="Loading installation settings..." +ynh_script_progression --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME @@ -27,31 +27,32 @@ 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 -#================================================= -ynh_print_info --message="Declaring files to be backed up..." - +# STANDARD BACKUP STEPS #================================================= # BACKUP THE APP MAIN DIR #================================================= +ynh_script_progression --message="Backing up the main app directory..." ynh_backup --src_path="$final_path" #================================================= # BACKUP THE NGINX CONFIGURATION #================================================= +ynh_script_progression --message="Backing up nginx web server configuration..." ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # BACKUP THE PHP-FPM CONFIGURATION #================================================= +ynh_script_progression --message="Backing up php-fpm configuration..." --weight=2 ynh_backup --src_path="/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # BACKUP FAIL2BAN CONFIGURATION #================================================= +ynh_script_progression --message="Backing up fail2ban configuration..." ynh_backup --src_path="/etc/fail2ban/jail.d/$app.conf" ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" @@ -60,4 +61,4 @@ ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" # END OF SCRIPT #================================================= -ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." +ynh_script_progression --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." --last diff --git a/scripts/change_url b/scripts/change_url index fe9ea64..6851308 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -50,23 +50,23 @@ fi #================================================= # MODIFY URL IN NGINX CONF #================================================= -ynh_script_progression --message="Updating NGINX web server configuration..." --weight=2 +ynh_script_progression --message="Updating nginx web server configuration..." --weight=2 nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf -# Change the path in the NGINX config file +# Change the path in the nginx config file if [ $change_path -eq 1 ] then - # Make a backup of the original NGINX config file if modified + # Make a backup of the original nginx config file if modified ynh_backup_if_checksum_is_different --file="$nginx_conf_path" - # Set global variables for NGINX helper + # Set global variables for nginx helper domain="$old_domain" path_url="$new_path" - # Create a dedicated NGINX config + # Create a dedicated nginx config ynh_add_nginx_config fi -# Change the domain for NGINX +# Change the domain for nginx if [ $change_domain -eq 1 ] then # Delete file checksum for the old conf file location @@ -81,7 +81,7 @@ fi #================================================= # UPGRADE FAIL2BAN #================================================= -ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=6 +ynh_script_progression --message="Reconfiguring fail2ban..." --weight=6 ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $new_path.*$" --max_retry=5 @@ -90,7 +90,7 @@ ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failr #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." +ynh_script_progression --message="Reloading nginx web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/install b/scripts/install index 820c3ef..4ceb331 100755 --- a/scripts/install +++ b/scripts/install @@ -64,9 +64,9 @@ ynh_setup_source --dest_dir="$final_path" #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Configuring NGINX web server..." --weight=2 +ynh_script_progression --message="Configuring nginx web server..." --weight=2 -# Create a dedicated NGINX config +# Create a dedicated nginx config ynh_add_nginx_config #================================================= @@ -80,9 +80,9 @@ ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 +ynh_script_progression --message="Configuring php-fpm..." --weight=2 -# Create a dedicated PHP-FPM config +# Create a dedicated php-fpm config ynh_add_fpm_config #================================================= @@ -90,7 +90,7 @@ ynh_add_fpm_config #================================================= # CUSTOMIZE DOKUWIKI #================================================= -ynh_script_progression --message="Configuring DokuWiki..." --weight=2 +ynh_script_progression --message="Configuring dokuwiki..." --weight=2 # Loading order of configuration files # @@ -103,8 +103,8 @@ ynh_script_progression --message="Configuring DokuWiki..." --weight=2 # See https://www.dokuwiki.org/plugin:config#protecting_settings -### Copy YunoHost specific configuration -# This File cannot be modified directly by DokuWiki, only by hand or by YunoHost +### Copy Yunohost specific configuration +# This File cannot be modified directly by Dokuwiki, only by hand or by Yunohost # It will only be updated by Yunohost package or directly by adventurous users cp ../conf/local.protected.php $final_path/conf @@ -112,7 +112,7 @@ cp ../conf/local.protected.php $final_path/conf ynh_replace_string --match_string="__YNH_ADMIN_USER__" --replace_string="$admin" --target_file="$final_path/conf/local.protected.php" -# This file might be modified by DokuWiki admin panel or by plugins +# This file might be modified by dokuwiki admin panel or by plugins # It will not be modified by Yunohost in order to keep user settings cp ../conf/local.php $final_path/conf @@ -159,7 +159,7 @@ ynh_store_file_checksum --file="$final_path/conf/local.protected.php" #================================================= # INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN #================================================= -ynh_script_progression --message="Installing logautherror plugin for Fail2Ban..." --weight=2 +ynh_script_progression --message="Installing logautherror plugin for fail2ban..." --weight=2 ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror @@ -209,7 +209,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 #================================================= # SETUP FAIL2BAN #================================================= -ynh_script_progression --message="Configuring Fail2Ban..." --weight=7 +ynh_script_progression --message="Configuring fail2ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 @@ -228,7 +228,7 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." +ynh_script_progression --message="Reloading nginx web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/remove b/scripts/remove index b0d36b7..6bb05bb 100755 --- a/scripts/remove +++ b/scripts/remove @@ -32,23 +32,23 @@ ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing NGINX web server configuration..." +ynh_script_progression --message="Removing nginx web server configuration..." -# Remove the dedicated NGINX config +# Remove the dedicated nginx config ynh_remove_nginx_config #================================================= # REMOVE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=2 +ynh_script_progression --message="Removing php-fpm configuration..." --weight=2 -# Remove the dedicated PHP-FPM config +# Remove the dedicated php-fpm config ynh_remove_fpm_config #================================================= # REMOVE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Removing Fail2Ban configuration..." --weight=7 +ynh_script_progression --message="Removing fail2ban configuration..." --weight=7 ynh_remove_fail2ban_config diff --git a/scripts/restore b/scripts/restore index e36a534..0cf8f4a 100755 --- a/scripts/restore +++ b/scripts/restore @@ -94,7 +94,7 @@ ynh_restore_file --origin_path="/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # RESTORE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=7 +ynh_script_progression --message="Restoring the fail2ban configuration..." --weight=7 ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" @@ -105,7 +105,7 @@ ynh_systemd_action --action=restart --service_name=fail2ban #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading NGINX web server and PHP-FPM.." --weight=2 +ynh_script_progression --message="Reloading nginx web server and php-fpm..." --weight=2 ynh_systemd_action --service_name=php7.0-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/upgrade b/scripts/upgrade index 645baee..8e9eaaa 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -63,10 +63,10 @@ fi -# YunoHost specific configuration, if it isn't exist already +# Yunohost specific configuration, if it isn't exist already # Previously, these settings were store in an unique "dokuwiki.php" -# Now, they are split in multiple files to ease upgrading process (separate YunoHost config from user config) +# Now, they are split in multiple files to ease upgrading process (separate Yunohost config from user config) # Loading order of configuration files # @@ -176,9 +176,9 @@ fi #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 +ynh_script_progression --message="Upgrading nginx web server configuration..." --weight=2 -# Create a dedicated NGINX config +# Create a dedicated nginx config ynh_add_nginx_config #================================================= @@ -192,9 +192,9 @@ ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading PHP-FPM configuration..." +ynh_script_progression --message="Upgrading php-fpm configuration..." -# Create a dedicated PHP-FPM config +# Create a dedicated php-fpm config ynh_add_fpm_config #================================================= @@ -203,7 +203,7 @@ ynh_add_fpm_config if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Upgrading DokuWiki..." --weight=7 + ynh_script_progression --message="Upgrading dokuwiki..." --weight=7 # Remove upgrade notification inside Dokuwiki's admin panel # See https://www.dokuwiki.org/update_check @@ -256,7 +256,7 @@ ynh_store_file_checksum --file="$final_path/conf/local.protected.php" #================================================= # INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN #================================================= -ynh_script_progression --message="Upgrading logautherror plugin for Fail2Ban..." --weight=2 +ynh_script_progression --message="Upgrading logautherror plugin for fail2ban..." --weight=2 ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror @@ -306,7 +306,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 #================================================= # SETUP FAIL2BAN #================================================= -ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=7 +ynh_script_progression --message="Reconfiguring fail2ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 @@ -329,7 +329,7 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." +ynh_script_progression --message="Reloading nginx web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/sources/DokuWiki_Screenshot.png b/sources/DokuWiki_Screenshot.png deleted file mode 100644 index dcba61c6d18cee25ab47c4bde5370fcc71d41830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141447 zcmb4qWmFu^x-|rXJ40}H3-0dj?lKTu26qC%-Q5Wi+}+*Xo#5_nAMd^QoOAEbZ%y~i zRM)IE)m3}%daOegH5*1Q)TRF{i&CpeQ z`q(^3I$HH)Z%6SsB!U%73n5Vx-3!kNG5(5L<@Xb#yRsO@ALI5#C4od4fJR&g21_nT z6dBX8Y%S&D`lD#wbMom8WM;-OTqu-)mBleeTg%g!;b@!cDDc9YErAV0@F#-#_tC>{ zG>r0}razH24@u$wX+!`2wxbaI{`CiTiNcc(-^SVkaoW-J4tvAYXBf|L`*0uPx=|sG zlEp|=Acau=>u{5S)c0G<^E8*mSqqEpE77iYEY)H?L59>fx}p7%4eU;-rc23Oy+(S@ z-mPDdqRUF(6r!J)@tnrWdY-|%Z9Ni1#J|AjFVyJ;-ivY6EGDlEwHGv0?#D54I2>8~ znsuPLotu4_G#ZroT6udx4_9iBNKCdyKfas;SF+Wwn;qYW`{5y|%64QRE&`2EnZ*8k zSSSIFqM$e2TRL~Z&tvKX<24#EV=KafruWG4N-S)d+4{v9)`4|r=%PzFy9f770dNrk8{w?_8W>I@!H3UBUK+C>e7#O8lBwqN$*pe5P&{|My4n7G&+>N zuUVyC+kimJxDHpy*wd_+KCcN5{s(Vh(S+shslw?nb|jA`#id8{@mlBAMylADyrXx= z_|DG|>VGYL8=`KexO@9;n-_G;4wwHLJFgax+?>~6UCT5V??rGkT}qpe#wtA6{LM!e zo6^B8ZOa$-IeT{KeFwbsQIPe4fJI4p;Zg3y<$-P##AL}w^nGcQ2|;ISvSD6pf{xkk z#|w#f2H7k>Q{W%D>qG8arguIAp3pG?`GTDX=$rR?c&-DpGwZw}^Y+A@yd&Km6#;%B zWpI}S(rChQR5s}#xAdrg4Hc$Ghe(+vmg|oURl|6X&U+@kj2<*{1!PXF7( z)}MWkEPn5y1M}Bq4n|jF|09}i^g*xq^NCzkSe=bVeIJJKDBQ{XBx4T;UIrgesQ$BO z5tod)C&C~eJIZ)ys;Q4)fjouQpJBhhgx!7^+7a-aD*#3n+OZdWEg=|x`eLFPa7OOczcq)!=a~T+k8r#rtkqxn3hEf24}VUxPpPK^3vfM zlJ&|+xj8K~_$>j&REx7gY(9j7-_!W()82{2q!XxH;-h=e_l9K9=Q=y0-SE4@9?{Ld zGXGsOv}A@oawyA3Kjp;*c{%)=_gyEaUDo7{K>9>TH1EV+cnf>_N^SeuDnXDC;X-_>>K6gcx*q3#D*u_ zn*m>_7>lQj0!T*dWf5y9>uj&7{y|0H;biRN=C~XB;}xz&pD%(hD|52WGqJOR3zAyJsRn9|;-%wZ&hCHQ~jynS9*~mNJj7f~#3*BfG_E zMb2Qo0iW<%Ji=RtLp8QK@4vN9F1Guji;n<;mVg5V-;gu`zV7p)2*dOpR0pf(oha59 zy(-*bUnje?gRyPD#BCqhO@|Jb;~giTXRnpl%9}onAc4*Jfz_?yw%|^_n5~lJPN9Q5 z^x}^ly$t(-FNLqqGENWPK@11kJAcz#sgY=%Zm)+*NuQQ$v&}YYZnz%C2b&&0Wz60T znPISZ^tk!#V36tJKL63dh2QMm7XR(%unXv^@nH7uo%HDOV3_v?_0d=1fa4I@f8GjO zyig$ixE$tnln)SiKO`qObmn}o5qVPe_7ATR2)*~*nB0tx24Z?N-JeXdc>e|HH-E5t z__ibG{}|g>VY$&cOP;s~eayabjwiA%2{H`|B+c26(o@!)HbUD69PQTFwe_3?;}2X1 z%bPwmN>pt%6g8i!h0k_+({-+|Zs#y$3a(~KfR^`_|7?iAGz1OX7J65@9lpzdZ}kB8 zCgcu_^352lC2VZ6TG-;WvskA$$Unav6zT)~&jyF`zCLEKGLgxm57f#{?7a8N7^Ly- zdfm6XF0HsZl;nB6t-#b=Uv8W~gLL$jFuPKv@V=8IsgT(Xkx6xGkr=ErfFqnc^}y-$ zgk>8?Roy|2;A{_Fn;nJvirSbuATvos@YNW-*waAd>BjK<;^IP2mffOY8MppYgYa6lA9N>+0M0`&42jmQ_I~G`WNM8ShnVI7c5bv;O9~ z({H#5f&&>7#qImm$A0rz2pjQ@Q<>c93)G=!JVY*}^Mp@ee}Z5%6Ms)ULDAPU%+{M@ zjGp+3RGFJ?TW?`2}b)A>H?!Ar#B`W^YH z)$#5?LeWBpHQOF?lhYyJ={rw1bR}1S$O+wFbk~D5Z@{^f%F`jgQbw4#{D&r+RhIT- z)wgEbFqQA?@zqL1>b;-~nVP>x1TIaP6&TyUk)uu8AULHaI7>rMXKCHr!IsHK-HEWe z*$7K=M{3OZ?U^@M%!cxtFiel9$4^yEa}!4O2j%xq!}JNX*xITR^{y#=Pp$S_qB&TY z^Fr9_FYjv6#(bL6vy3L$#>)tKMaPGINkPZ?UX(mx=^abL`Cpe%<==;>T*8s8J-K`z zBre}rPAu%{aPCw49*Qi^KO~S>ai(hD&Q@I-<~l0KX&<4>b>I9fOX$J}s9Ueb-%hWa zTS%YpU1Da2{NIB<4t)L<-G1Qs;EpX8w42wd3pI#r(SOOjN-B*RyuS7{8 z2#Z4GO6Ub5Y%Df~293kkYu%h5)JN_q`t|2F+97e)Y~EQKWL|F-P~V1~=`P$NhbTLR zcxwzLUv&O_tohNsZ+6BCeB}SO%aYn%yNHRfIRKwNIch&b`}TG##H>d!0(a?YjRW7y z+x1d<_`1mhn)D5bh1Rf1j`1J9IUT<_;@K6AvQRdh2dxa2G@ol!);x|%%(he{Td%vN zjQ|OZ=6*j0A!o@)BpuIe-X+S>S*pzA(9-AIqqB1pA`t2sN)*fdxxRAAhZ87jq}7%* zf??Mdg8r%e3ux3@r;ZR65g!&mQlLfnGkGGm-1>L3mo|5VWhBD=wA)z61x7`aE8>j@ zVuR`7IMu{ukez9DQFc^^?Zn%zh^TZcYez87Ni0j%5qJ&fCH$cM!yJq)ov>aH9OiKH zN+zCex6Hv|WicTyfhKEo*wlwG=y50;f2PC6Oy=xF!R$zZZJLp>YNW84S~-en*THacL0s|dQEvCG0UTFQNfIT_*LzwTwrM-qDQMU#27pT3_wMv z8_id9ZWBCRnx?drs`mK4)zIF+pHg+_z3L1E=}<75URC~)?-+N9ctt7S=@_y?CLGCX zj1sRl`~|&p_`$3eKj*DP=?PP_ZZI@G z^gN}j*zP#}JBy_e_v`9-!{;w1U8x6Q(2HaL2KIUm1_Wksq$cckSR4q~q{{OJeGombq1viW` z(226N_1VqVg5c~f`D-GdxVrV*vdhPfh5g3>E(d?)!HZk1?QY~JzWJL!R^L}^+BeHRWgu%{mS(i1D z#o{aV*OhRq;9_!PV2)g5u(#HIF0HT9pfkl?rem!1^K3K4v>#7E@O_%c8S{Ao`RjMl zBbx~W=fx^7Yq7;{CmjBY(>@NNGG(;_`CSuQjp<`|E_Bh=(S+<`R>~YAF7Nzm+>Ma?XG^t^! zQ8LZ~k&D2K>sFJxu6%#spuPJZ$q}ysGgNjtbXr@5YIpd+@%L=|tr_#@yU7d7ZGorM zLttf86kFT-b7@_3miX*(79BFZRDP>|w zLO14rd!`LT%ar({X53px8cEjbZ;@Dm>>(FXNM zmPJ!e>%V0A3*l<)YGc(TSe`1vQ(ZUwc)d+YZFk;P30HZs%Bu^!OGQ#RcaYnjmMbr< z_n@zwAziPPBAVV^jvHEu;XK#2=b~2E2Io}`ZoxU9A5>qTRgLYosmJ*bPh`1|oc7Q7 zQY9S`&-G`EvFrC3zpx#Xo<21VwpmazFJ^Z8BoqFuEl7wY8W-Ux&w0*Jxa{Vm!Fnb2 zjr(|d=JdG@JaB)PC~{cW3%)wKu?3DKN?GEhbGL?pcb4sQa<*{rDGglJWSSq%be6_B&?=?!BYZ zYT6)k4=`u#6?z{2Ja-xtspyv{Z~SM`CbO2z66l2y?F#rnayFk z!{aU{CDTrDH1km^E z9L2f>#jFJPtVBy?bjQYBUAdN+&Z_i^Iz46PQNJ@C9*_Uo5*a#(Mj2Ka1A`1*N*P0{ zghpk|+noSNc{=La>3g$(;VaZ-)40)9-uaFVJNTm!#J1}|fUl=@&A;U0|8~z4(|(`T z(*#22JP(Km;Z3joH}nGVCGWNNFRqx%TJ?d~-5_k_F1n5^Gvs$lAf{|lffgFfhSIg3 zuKjyBtIvaGhd_7I)sn^cxG%1HS1Vp^+zA6MfOS5t4b7GD8a3~-6TOMjTFlEL0Vl?bdCaF{jLldG`u~nOoi=gZ zwtT&Pn4g*38ZiV*;rH+b!3P3ue|Ja)0EA$s%TgDIS7H%QH4sY==yubdnE0=oALWTn zLQ4evsRgs!!E+q)YYL| zq{_y~l1q}s|BjOqkCbF`{|inQKU-W``gxa0&(9u~B~~Cj+|in9did39kaa6r(h^m{ zlppaFPCkSab&5GrAr&JOtE!s%^y&-F09L{ZBY$OUYrIvbBQ}Eo->*px@(}Z0e?gVl zi0zhda(C3?>>B>ck3K(zncjxUbzN_4A_!QrYA5&&4JqsY#3WK3D8u{&9eUx5;L~ z|Kyb=OzrWzQ$XYsw!ZAIjSTA&g_X(Y=kn@}2LC?>Y$H&KiB-IRc;6}g0(nST@1b=8JL9C!)MIy0k zr%#CvrqtYAcPTC39wIciBB9F0g+e}Tytw*YjS5_M37DZPAS@IZRR5Lh0PXcVO=gdp zm7t$uR=XE=4pr9gCvOUbj+g`(O4=|M0Fu5on1Tk^8E%3-4GxkF-eY@_1hgxD{L68I z+}4})EeGI1fvigK({>o*A|$CfMUCmn`W~UZMe<(_ zyI(aPM@+McH|7WW*1+9%sUZva=m4gBOy{r!#|8Mv!Z> z<-dZSC;_f)Jc%i29?`o;7YfONvG4D!Z>g+DPJ~BJ419bipPbAC2-QS*5i9gn+v`EE zx=0lmtEyUK@zuQaLEUefvHnqw8+fKUKC${!US3d>_hq%A3K|lP=a#X$?9u=zJS}b& zxxgKP#`McW0tL&ztH``fZpIQyEV{d8;g^31&JV7j4{H{ZkuAz!#&RUFebqKu9)GEk zvbhtv9JBt;j0%hfcm*lU_x))AXyu2})Q6^gPSgwdlUZ_JYt0hSGURkavW|H`?0`Ua zQ6YQlx>CQ-rt=Bj*%{Gc?>{l*3+)XiCevL*IZ46rUvB zXiv?lvUViJR11L5m^}pQiVx8oF7Pj7-hd#|L=Z_|p>P;Zo?o%tBB44Sw!A1)@Ap!6 zeSJTnc*(wM{B(|Fy1xc21iR@PdSiZW89L~s6@b8*eb&M@8!N-sD6uMQ{I`cO2!me* z_7CPg86C*;<@34@-A1}kJA+Nf=?41)*&hUpkwf#O|Gv#OTKB=ego7;ijE~kGiu(;m z4zyva9SMz^2Lk9=X$o`e;=G26wC5G>5*pgxLsXtyoN61~Rpq6qUp9f%)P99@an|PG z=!NT$V$tJVy#c~Q;^O4#Avl&SC$>k)Iw;a};=;o}@|EV)#S;8DRtq9LJ+05#|>nj@4sZYqU4J&UMIqD z^d@qQ?FOAx?4E44$X5{jFRBgmP!y`F%}>p#j&f8!B3!xQ6{t3Qd~$xp++Pp~)g}>C zb^;A0fQ2H7V5#Y6v=zLqmLP;`D&w-;>)Y{^kQIqrg>8^9ZtFSPL6yFVL}eOVQVh15 zhw_`NfO&%Y52xW}@ORsux!+2jXOVX!#y%g5m`%5{D%D`E#Gz^!A`iRWP#CUP8h2B^ zo4luv$UjE(>2+WKh&-OlHL|#@iSj>RDU4!}{b$xs+y*V-3Y0N^&uY~vnL}g|#*AVf zUQEV~9#8{#y#$D+(gbmDW0IM+X%k527+3m|@}&}Lr1c0}#s*?Z7ARJ+*b5~7*hGsj z3wABLE$6;1NwbEn*k?{{_S=7meB?D&M%U8pWTb@wBZwJ|x+2+gAPDmz;(`f>i3wjg zHM~xH*93q}zV9!kqSk>b$z(2loU+}xYkFe^oRyhtr+d2)oMaBDw@|>)-1}kE6mi0dW%KyN;5*7-+mYy4g4QO0(aRA8HgZn2a?|DV zhi9AYxDa2gLvuI8`+j$(R{kLABYk|#ED5ciJ`XyoXT2Rf{vn7}ODUuATjs;nm+_;E z&0p~wJV_Vc4^|FeVgEhU3+|2SA;9E~W@82J=!&K_7QcrGqTJ!KX!25ANS?It$bBdk z#EET&aJNuJ+trG3Fi;c|o65OJCQ&dm2YI70OAO%5nl}#X10C^$@2^xsngJALF zG>Jv6B$1a%i7gX6;vwOEiq@KHAh;d?@tXDpH4Db$U|VD8&|?s zX^Ik~%ac4{4K0p55tl4t(Y?vXb${)KesZuve;L5L7W(4{$B3hMD=D`UxxW)VC|>|` z&8280lgMP$PjH6ntk>~=HQT(4*}2oAleODwz?WnKggeQAxJq`~rq@$2Y4lL-8%W^B ztf<(9L;LqCZaAOXGxa}sFO;8{-j%p4)HzpqIP+Atw}hDe7%%YjMjmdGaRkzjk0&m< zB%GgjZ0|C>^bNgNiVlUk zIZk=L%j=C0PoX%||6q{6c{q5fD!)9KY_9|_0H7}RRAa=3h;dg=L&51&^=V3j`Uo&i z`AOsz*tY^XSg;V=wX&z_6P?P={*GMeP0B>`4HS^3rvN}hh<6#&IBlQl!ijkRQ+Zyo}p?ta<4BBsh*8moON+}MtPK)kTa$lC|>oTzhiD$ zCQjXp$)G1`&=M_p5?7Vmke80Y5Ti-{fhI#uM+<;^Rc;CYf~S+{t<^^4b<~w3_oy|e z#L51M<8LS^S*^KA$ml7Rv>_{~!EGp7J{pWvL1V=vHfg_k%D>_nMn!b+%ak^1wTSsN z-p@&1<(3syLP^UsK8y$O1xpWekCxC{$g0Z#9#u>AQlDwkoNnGuBB;2Q4;w_2fc)^S(rI8)Fg6|k+-HZkU~`;x)G?B z&;sfGGRvvi`5WRXD2QD?s^_3K%noaK@i|VauW#{%%et35l^59Py%su+$ zGXI#?JYy{6?`ax1|WQkc|gpv3*m%=7n@!*2?tji?5Po??mc!U z&^N526JrWy+adl}EdXQL=p(1gQuJ{E{&Nx5FB@u-s2;;&X-zDMW+FUX3BO9jlAP*< zKpW}^jO}_c+U6s>&aLqS{jE49`a14!S~er|2@sQmVNI;~T#0FX4_${js^n6EEul(= zWpS?OibCXLM#qzTTu#?y-(N1NU$-iK^E=pwjb5TjP#r@Cb*)#0lM&2qbdHdP0)!-oRyAd9yr86>Mhq1E{I*2{9!g?l6#oWhEIMeFT&wsyhS>#fk>c zNr6~7o#u>b4o<;9+LcAm-LTw7sodhD!yAxwASM>g4ts@ZqF7EBmbH#jrqdKwm{`wQ zB7zknN;uV;d4lyIjqTG(WwBOkii|kBikV0UfX*09@6w)DxvtF>Cvj&0)ot4inQfa5 zf=dp9WJHimQA?9)7v7!U?UA_7)%9jaC!0(u-q^%3jE|C?v8LL;;R;>iW+`G2q>C#<-Iga&ZOD!yx}-_QWVp)C#>Pgcl_mxaHA>*Nv}td&s6?l& zvbAwg%gMeQ9(1?-vlgk`P}vb-mE9yf?cJXkTP>oz(W1g-gyh!_RRV@BrSPG9T$pwr zX_&v=;jra(KjX@82F%L?Exub*w!zbQ;oOudz}}JAn;_LLotBPav=S58^;dK_)`B7I zPC#f)TmDc7aOd``QQG8BcN?`H8qcbnt{i)t@DWk0mbe??iv&eE*ugxKM54xXwJgue zgNRd|@n$*axg|wB%UI>xki|u&zbO`EX*e)&1z~*BM$!ZfCA#xNh9iT0aP7uW0T=~c zpdpvCy(X`;*gLf{7*;Ed-&!qhd<>~S%WQxo>{-gcX{`RY>VFbgUt64YW}`Z4;+$VR zvY3?7KeU(iU3 znB9Vzs$M{}Tsgw5F^mk%pdODbDzi~RCh$Rq$;Kg17gXfkK8b!)+txs1P%(B>>5eVV zA-YsfE-q6pV>(8Wx!9DH*S?s4h-+LS){t}M^w?29VJc=8tJ{4!u<}J^fSlS5d?nzo zSf3KBhQu^^Z2lS_#B@ktKH#f@$|b^;BvqX#kSVG29Y^8qj51=_38e4MN1cO(5Kw6z zK^TLxJ~EWQ@k=L`WC&B5d*r7;7)BUPShqAkE?!DpNC8~}FjniD;*8~8Eau$Qi)6sI zV6r_qakbAI~D;k30f?gx$Uj;Y*mleGpt+-gzE27+bTl0%a+bt970RXkASiyg$ zD|>S1#Bd5PQLYYPT+vh0L&63f5$&)-j3JAI+6|8oRbDK`jRhe_m{6cdUaJKpI!1d= zK*5=$`5Iars8TY=(m*}JC86dx)CZYG_*@R)?JWy@`_w%4y{gF+x5w0SbAyZ7>`&K& zS}Zmf-`!eM$Gt-1eHaFSbJVf}YuloYvVOlRv;WfK{@g~1xYm0JX+ zzDJ@=Cx{%KS@kiZW&Iyb!E-jE3^zc=}w_)^47PXMf( zX~nP(3jZgpv=)ERouh%#{M*BhDf5;%wWY{}`SpMyZ50M@?1S6d4cE?X^!3|`Z6dAY zf5^yW>Sb%*PvQ@w|1gNE40Z}pdd8V zGAfBa31C*V`)+8YLolj-i^(bkmh^Qe-MGm`Q>nOpFrT6H%31Sx39C3_wJ-nMkNgg7 z2qg)lRilq*2OJIzvxVA8$7%9pmb{{L$CDCCFnuYS>6IL3!8aezDegO>gmM@!0f1x# z6gmPOtf`XNFX~Vl4?)#wDj8G&e4W4(s}+GKUO6J?#Lrf^fuHcVUxNg0_aAjo`5*RZ zpY{_uVkF7-{+E^Y58wV?VFeTVfLZZ)PyycjWaA=50cD2nHe) zm0EL2y^9n8egswWp2PT>tpFOc7g5r0Nd=b>LsrQLSsqC;9X{lq0EY|}oj@Q}(ej}n zkj|XnNkAKE2{WSm(Fdym$V$P8WiuiW41oqmYg8xwlNy#Lshq0f!gQWAdgiT1W^2iC z6`>4#i$?R@!uDvqx~VV}x1u%BapEaLm+Rk7P*3Z(L2Cf*mHLv|h)GroQ+yugR?|Yv zR19Li5|l3tpX}dINWY8O`T71Oru?fn#L`K@ravLL9)(mnTY=nuG-|C(f^+p%0D!mL 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� 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 Date: Wed, 22 Apr 2020 23:24:55 +0200 Subject: [PATCH 041/144] 2018 04 22b (#58) * Upgrade template to latest version * Upgrade dokuwiki version and version's location * Delete "jessie" from READMEs * Migrate to changelog file instead of READMEs * Fix markdown syntax errors * Add local screenshot * Update manifest.json Co-Authored-By: Kayou * Revert CI link * Correct version number to match manifest Co-authored-by: Gofannon Co-authored-by: Kayou --- CHANGELOG.md | 59 +++++++++++++++++++++++++++++++++++++++ README.md | 28 +++++++------------ README_fr.md | 30 ++++++++------------ conf/app.src | 6 ++-- dokuwikimainwindow.png | Bin 0 -> 21486 bytes manifest.json | 2 +- pull_request_template.md | 12 ++++---- 7 files changed, 89 insertions(+), 48 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 dokuwikimainwindow.png diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ba827a8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,59 @@ +# Changelog + +## [Unreleased] + +## [2018-04-22a~ynhXX] + +### Added + +- Upgrade actions and config-panel scripts + +------------ + +## [2018-04-22b~ynh1] - 2020-03-23 + +### Added + +- New DokuWiki version `2018-04-22b` +- Changelog available in `CHANGELOG.md` + +### Changed + +- Upgrade content of file `pull_request_template.md` + +## [2018-04-22a~ynh3] - 2020-02-20 + +### Added + +- Use 'URL rewrite' for prettier URLs + +### Changed + +- Activate URL rewrite by default (does not break old links) + +### Removed + +- Unused DokuWiki config file + +## [2018-04-22a~ynh2] - 2020-02-20 + +### Added + +- Add fail2ban support to avoid bruteforce login attempts + +### Changed + +- Global upgrade of the package + +### Fixed + +- Get rid of the php ini file and merge its content into the pool file +- Update Readme following last work made on the package and current version in testing branch + +### Removed + +- Unused config file settings + +## [Previous versions] - YYYY-MM-DD + +- Will be written (one day maybye) diff --git a/README.md b/README.md index fea004e..8f18d2a 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,11 @@ If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. -**Shipped version:** 2018-04-22a "Greebo" +**Shipped version:** 2018-04-22b "Greebo" ## Screenshots -![](https://www.dokuwiki.org/_media/dokuwikimainwindow.png) +![Screenshot of DokuWiki main window](dokuwikimainwindow.png) ## Demo @@ -26,8 +26,8 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Documentation -* Official documentation: https://www.dokuwiki.org/manual -* YunoHost documentation: https://yunohost.org/#/app_dokuwiki +* Official documentation: +* YunoHost documentation: ## YunoHost specific features @@ -40,26 +40,17 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) -* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-stretch.nohost.me/ci/apps/dokuwiki/) ## Limitations * Cannot create or login with dokuwiki internal users, only users from Yunohost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) -## Additional information - -### Changelog - -* *Many missing - List taken from previous documentation* -* 07 Mar 2017 - Update app -* 11 Feb 2017 - Create script app - ## Links - * Report a bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues - * App website: https://www.dokuwiki.org - * Upstream app repository: https://github.com/splitbrain/dokuwiki - * YunoHost website: https://yunohost.org +* Report a bug: +* App website: +* Upstream app repository: +* YunoHost website: --- @@ -70,7 +61,8 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that Instead of merging directly into `master`, please do your pull request to the [`testing` branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) To try the `testing` branch, please proceed like that. -``` + +```bash sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug or sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug diff --git a/README_fr.md b/README_fr.md index fe39537..2eb9035 100644 --- a/README_fr.md +++ b/README_fr.md @@ -3,7 +3,7 @@ [![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) [![Installer DokuWiki grâce à YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) -*[Read this readme in english.](./README.md)* +*[Read this readme in english.](./README.md)* > *Ce package vous permet d'installer Dokuwiki 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.* @@ -12,11 +12,11 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne nécessite pas de base de données. Il est apprécié par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait un favori d'administrateur. Des contrôles d'accès et des connecteurs d'authentification intégrés rendent DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins apportés par sa communauté dynamique permettent un large éventail de cas d'utilisation au-delà d'un wiki traditionnel. -**Version incluse:** 2018-04-22a "Greebo" +**Version incluse:** 2018-04-22b "Greebo" ## Captures d'écran -![](https://www.dokuwiki.org/_media/dokuwikimainwindow.png) +![Capture d'écran de la fenêtre principale de DokuWiki](dokuwikimainwindow.png) ## Démo @@ -26,8 +26,8 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentation -* Documentation officielle: https://www.dokuwiki.org/manual -* Documentation YunoHost: https://yunohost.org/#/app_dokuwiki +* Documentation officielle: +* Documentation YunoHost: ## Caractéristiques spécifiques YunoHost @@ -40,26 +40,17 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) -* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-stretch.nohost.me/ci/apps/dokuwiki/) ## Limitations * Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de Yunohost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) -## Informations additionnelles - -### Historique des versions - -* *Many missing - List taken from previous documentation* -* 07 Mar 2017 - Update app -* 11 Feb 2017 - Create script app - ## Liens - * Signaler un bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues - * Site de l'application:https://www.dokuwiki.org - * Dépôt de l'application principale: https://github.com/splitbrain/dokuwiki - * Site web YunoHost: https://yunohost.org/ +* Signaler un bug: +* Site de l'application: +* Dépôt de l'application principale: +* Site web YunoHost: --- @@ -70,7 +61,8 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. -``` + +```bash sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ou sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug diff --git a/conf/app.src b/conf/app.src index e42acb7..4021565 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,6 +1,6 @@ -SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2018-04-22a.tgz -SOURCE_SUM=18765a29508f96f9882349a304bffc03 -SOURCE_SUM_PRG=md5sum +SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2018-04-22b.tgz +SOURCE_SUM=9d1437cdc7e98e471ff32079f7ca224ccf52dbbaafed39ec9746b0405b3a29ce +SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true SOURCE_FILENAME= diff --git a/dokuwikimainwindow.png b/dokuwikimainwindow.png new file mode 100644 index 0000000000000000000000000000000000000000..c357376b781f55d9cfe7d6505bbc679a4dd41e8d GIT binary patch literal 21486 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 literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json index 1c3ae56..503c689 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "DokuWiki es un sistema de Wiki de uso sencillicimo y compatible con los estándares.", "it": "DokuWiki è un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2018-04-22a~ynh3", + "version": "2018-04-22b~ynh1", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { diff --git a/pull_request_template.md b/pull_request_template.md index fceb723..8f984e1 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -2,7 +2,7 @@ - *Description of why you made this PR* ## Solution -- *And how you fix that* +- *And how do you fix that problem* ## PR Status - [ ] Code finished. @@ -13,12 +13,10 @@ ## Validation --- -*Minor decision* -- **Upgrade previous version** : - [ ] **Code review** : -- [ ] **Approval (LGTM)** : -- [ ] **Approval (LGTM)** : -- **CI succeeded** : -[![Build Status](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/badge/icon)](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/) +- [ ] **Approval (LGTM)** : +*Code review and approval have to be from a member of @YunoHost-Apps/apps-group* +- **CI succeeded** : +[![Build Status](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/badge/icon)](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/) *Please replace '-NUM-' in this link by the PR number.* When the PR is marked as ready to merge, you have to wait for 3 days before really merging it. From 29f7b8d4ce324ea628d7ee101c1fc5f80da25d17 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 22 Apr 2020 23:25:56 +0200 Subject: [PATCH 042/144] Simplify description (#60) --- manifest.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/manifest.json b/manifest.json index 503c689..8b83da8 100644 --- a/manifest.json +++ b/manifest.json @@ -3,11 +3,11 @@ "id": "dokuwiki", "packaging_format": 1, "description": { - "en": "DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database.", - "fr": "DokuWiki est un wiki Open Source simple à utiliser et très polyvalent qui n'exige aucune base de données.", - "de": "DokuWiki ist ein standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab.", - "es": "DokuWiki es un sistema de Wiki de uso sencillicimo y compatible con los estándares.", - "it": "DokuWiki è un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." + "en": "A lightweight, simple to use and highly versatile wiki", + "fr": "Un wiki léger, simple à utiliser et très polyvalent", + "de": "Ein standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab.", + "es": "Un sistema de Wiki de uso sencillicimo y compatible con los estándares.", + "it": "Un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, "version": "2018-04-22b~ynh1", "url": "https://www.dokuwiki.org", From b1d6dfc77cf3e6db546c5a59f81e3cfd7cb89f2d Mon Sep 17 00:00:00 2001 From: Gofannon <17145502+Gofannon@users.noreply.github.com> Date: Fri, 15 May 2020 12:53:36 +0200 Subject: [PATCH 043/144] [Fix] caching pictures that didn't work (#65) Set HTTP Headers 'Expires' on the correct PATH... Co-authored-by: Gofannon --- conf/nginx.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 64fc3ba..5cb057b 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -39,12 +39,12 @@ location __PATH__/ { } # Deny Access to htaccess-Files for Apache - location ~ /\.ht { + location ~ __PATH__/\.ht { deny all; } # Serve static files - location ~ ^/lib.*\.(gif|png|ico|jpg)$ { + location ~ ^__PATH__/lib.*\.(gif|png|ico|jpg)$ { expires 30d; } From e112636a7d39867fe2a55835ef629cfe72603c0b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 10:59:54 +0200 Subject: [PATCH 044/144] Update app.src --- conf/app.src | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/app.src b/conf/app.src index 4021565..2274131 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2018-04-22b.tgz -SOURCE_SUM=9d1437cdc7e98e471ff32079f7ca224ccf52dbbaafed39ec9746b0405b3a29ce +SOURCE_URL=https://github.com/splitbrain/dokuwiki/archive/release_stable_2020-07-29.tar.gz +SOURCE_SUM=cc1cd9f00095fea327baa79d8f02c904fe1c37bc3f8fd9999eaf646ee9928884 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true From 69c9a4932921c8c46c62af311381df6cf87ba7e1 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:34:47 +0200 Subject: [PATCH 045/144] Add badges --- README.md | 6 +++--- README_fr.md | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 8f18d2a..fd1beff 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DokuWiki for YunoHost -[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) +[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) [![Install DokuWiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* @@ -38,12 +38,12 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ### Supported architectures -* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) ## Limitations -* Cannot create or login with dokuwiki internal users, only users from Yunohost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) +* Cannot create or login with DokuWiki internal users, only users from YunoHost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) ## Links diff --git a/README_fr.md b/README_fr.md index 2eb9035..ee91cd0 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,18 +1,22 @@ -# Dokuwiki pour YunoHost +# DokuWiki pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) +[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) [![Installer DokuWiki grâce à YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) *[Read this readme in english.](./README.md)* -> *Ce package vous permet d'installer Dokuwiki rapidement et simplement sur un serveur Yunohost. +> *Ce package vous permet d'installer DokuWiki 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.* ## Vue d'ensemble DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne nécessite pas de base de données. Il est apprécié par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait un favori d'administrateur. Des contrôles d'accès et des connecteurs d'authentification intégrés rendent DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins apportés par sa communauté dynamique permettent un large éventail de cas d'utilisation au-delà d'un wiki traditionnel. +<<<<<<< Updated upstream **Version incluse:** 2018-04-22b "Greebo" +======= +**Version incluse :** 2018-04-22a "Greebo" +>>>>>>> Stashed changes ## Captures d'écran @@ -26,8 +30,13 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentation +<<<<<<< Updated upstream * Documentation officielle: * Documentation YunoHost: +======= +* Documentation officielle : https://www.dokuwiki.org/manual +* Documentation YunoHost : https://yunohost.org/#/app_dokuwiki +>>>>>>> Stashed changes ## Caractéristiques spécifiques YunoHost @@ -38,27 +47,38 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ### Architectures matérielles supportées -* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) ## Limitations -* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de Yunohost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) +* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de YunoHost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) +<<<<<<< Updated upstream ## Liens * Signaler un bug: * Site de l'application: * Dépôt de l'application principale: * Site web YunoHost: +======= +## Informations additionnelles + +### Historique des versions + +## Liens + + * Signaler un bug : https://github.com/YunoHost-Apps/dokuwiki_ynh/issues + * Site de l'application : https://www.dokuwiki.org + * Dépôt de l'application principale : https://github.com/splitbrain/dokuwiki + * Site web YunoHost : https://yunohost.org/ +>>>>>>> Stashed changes --- ## Informations pour les développeurs -**Seulement si vous voulez utiliser une branche de test pour le codage, au lieu de fusionner directement dans la banche principale.** - -Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing). +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. From 6508dda3455085cbc8bd74935aebd265b93a093f Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:36:42 +0200 Subject: [PATCH 046/144] Change version --- README.md | 2 +- README_fr.md | 8 ++------ dokuwikimainwindow.png | Bin 21486 -> 0 bytes manifest.json | 6 +++--- 4 files changed, 6 insertions(+), 10 deletions(-) delete mode 100644 dokuwikimainwindow.png diff --git a/README.md b/README.md index fd1beff..2d1b627 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. -**Shipped version:** 2018-04-22b "Greebo" +**Shipped version:** 2020-07-29 ## Screenshots diff --git a/README_fr.md b/README_fr.md index ee91cd0..1d80136 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,7 +1,7 @@ # DokuWiki pour YunoHost [![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) -[![Installer DokuWiki grâce à YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) +[![Installer DokuWiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) *[Read this readme in english.](./README.md)* @@ -12,11 +12,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne nécessite pas de base de données. Il est apprécié par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait un favori d'administrateur. Des contrôles d'accès et des connecteurs d'authentification intégrés rendent DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins apportés par sa communauté dynamique permettent un large éventail de cas d'utilisation au-delà d'un wiki traditionnel. -<<<<<<< Updated upstream -**Version incluse:** 2018-04-22b "Greebo" -======= -**Version incluse :** 2018-04-22a "Greebo" ->>>>>>> Stashed changes +**Version incluse:** 2020-07-29 ## Captures d'écran diff --git a/dokuwikimainwindow.png b/dokuwikimainwindow.png deleted file mode 100644 index c357376b781f55d9cfe7d6505bbc679a4dd41e8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21486 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 diff --git a/manifest.json b/manifest.json index 8b83da8..53dd472 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Un sistema de Wiki de uso sencillicimo y compatible con los estándares.", "it": "Un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2018-04-22b~ynh1", + "version": "2020-07-29~ynh1", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { @@ -63,10 +63,10 @@ "name": "is_public", "type": "boolean", "ask": { - "en": "Is it a public DokuWiki site ?", + "en": "Is it a public DokuWiki site?", "fr": "Est-ce un site public ?" }, - "default": "true" + "default": true }, { "name": "language", From 4435a8f0cf7205494503b828dbeffba4f07f803d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:39:46 +0200 Subject: [PATCH 047/144] Nicer screenshot --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2d1b627..bf68e11 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Screenshots -![Screenshot of DokuWiki main window](dokuwikimainwindow.png) +![Screenshot](https://www.dokuwiki.org/lib/exe/fetch.php?tok=341927&media=http%3A%2F%2Fimg832.imageshack.us%2Fimg832%2F8784%2Fdokuwikitemplatevector2.png) ## Demo diff --git a/README_fr.md b/README_fr.md index 1d80136..ba796c2 100644 --- a/README_fr.md +++ b/README_fr.md @@ -16,7 +16,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Captures d'écran -![Capture d'écran de la fenêtre principale de DokuWiki](dokuwikimainwindow.png) +![Capture d'écran](https://www.dokuwiki.org/lib/exe/fetch.php?tok=341927&media=http%3A%2F%2Fimg832.imageshack.us%2Fimg832%2F8784%2Fdokuwikitemplatevector2.png) ## Démo From a3d2d36f6249f06d90a99b214fda67ff7facdfe3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:40:23 +0200 Subject: [PATCH 048/144] Cleanup backup script --- scripts/backup | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/scripts/backup b/scripts/backup index b931a0e..176834b 100755 --- a/scripts/backup +++ b/scripts/backup @@ -19,7 +19,7 @@ ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." +ynh_print_info --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME @@ -27,32 +27,31 @@ final_path=$(ynh_app_setting_get --app=$app --key=final_path) domain=$(ynh_app_setting_get --app=$app --key=domain) #================================================= -# STANDARD BACKUP STEPS +# DECLARE DATA AND CONF FILES TO BACKUP +#================================================= +ynh_print_info --message="Declaring files to be backed up..." + #================================================= # BACKUP THE APP MAIN DIR #================================================= -ynh_script_progression --message="Backing up the main app directory..." ynh_backup --src_path="$final_path" #================================================= # BACKUP THE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Backing up nginx web server configuration..." ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # BACKUP THE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Backing up php-fpm configuration..." --weight=2 ynh_backup --src_path="/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # BACKUP FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Backing up fail2ban configuration..." ynh_backup --src_path="/etc/fail2ban/jail.d/$app.conf" ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" @@ -61,4 +60,4 @@ ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" # END OF SCRIPT #================================================= -ynh_script_progression --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." --last +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." From a4e9531b8022a5502686cfae44c5f15a11357746 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:46:49 +0200 Subject: [PATCH 049/144] Small typos --- scripts/change_url | 16 ++++++++-------- scripts/install | 22 +++++++++++----------- scripts/remove | 10 +++++----- scripts/restore | 4 ++-- scripts/upgrade | 20 ++++++++++---------- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 6851308..fe9ea64 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -50,23 +50,23 @@ fi #================================================= # MODIFY URL IN NGINX CONF #================================================= -ynh_script_progression --message="Updating nginx web server configuration..." --weight=2 +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=2 nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf -# Change the path in the nginx config file +# Change the path in the NGINX config file if [ $change_path -eq 1 ] then - # Make a backup of the original nginx config file if modified + # Make a backup of the original NGINX config file if modified ynh_backup_if_checksum_is_different --file="$nginx_conf_path" - # Set global variables for nginx helper + # Set global variables for NGINX helper domain="$old_domain" path_url="$new_path" - # Create a dedicated nginx config + # Create a dedicated NGINX config ynh_add_nginx_config fi -# Change the domain for nginx +# Change the domain for NGINX if [ $change_domain -eq 1 ] then # Delete file checksum for the old conf file location @@ -81,7 +81,7 @@ fi #================================================= # UPGRADE FAIL2BAN #================================================= -ynh_script_progression --message="Reconfiguring fail2ban..." --weight=6 +ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=6 ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $new_path.*$" --max_retry=5 @@ -90,7 +90,7 @@ ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failr #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/install b/scripts/install index 4ceb331..820c3ef 100755 --- a/scripts/install +++ b/scripts/install @@ -64,9 +64,9 @@ ynh_setup_source --dest_dir="$final_path" #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Configuring nginx web server..." --weight=2 +ynh_script_progression --message="Configuring NGINX web server..." --weight=2 -# Create a dedicated nginx config +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= @@ -80,9 +80,9 @@ ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Configuring php-fpm..." --weight=2 +ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 -# Create a dedicated php-fpm config +# Create a dedicated PHP-FPM config ynh_add_fpm_config #================================================= @@ -90,7 +90,7 @@ ynh_add_fpm_config #================================================= # CUSTOMIZE DOKUWIKI #================================================= -ynh_script_progression --message="Configuring dokuwiki..." --weight=2 +ynh_script_progression --message="Configuring DokuWiki..." --weight=2 # Loading order of configuration files # @@ -103,8 +103,8 @@ ynh_script_progression --message="Configuring dokuwiki..." --weight=2 # See https://www.dokuwiki.org/plugin:config#protecting_settings -### Copy Yunohost specific configuration -# This File cannot be modified directly by Dokuwiki, only by hand or by Yunohost +### Copy YunoHost specific configuration +# This File cannot be modified directly by DokuWiki, only by hand or by YunoHost # It will only be updated by Yunohost package or directly by adventurous users cp ../conf/local.protected.php $final_path/conf @@ -112,7 +112,7 @@ cp ../conf/local.protected.php $final_path/conf ynh_replace_string --match_string="__YNH_ADMIN_USER__" --replace_string="$admin" --target_file="$final_path/conf/local.protected.php" -# This file might be modified by dokuwiki admin panel or by plugins +# This file might be modified by DokuWiki admin panel or by plugins # It will not be modified by Yunohost in order to keep user settings cp ../conf/local.php $final_path/conf @@ -159,7 +159,7 @@ ynh_store_file_checksum --file="$final_path/conf/local.protected.php" #================================================= # INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN #================================================= -ynh_script_progression --message="Installing logautherror plugin for fail2ban..." --weight=2 +ynh_script_progression --message="Installing logautherror plugin for Fail2Ban..." --weight=2 ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror @@ -209,7 +209,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 #================================================= # SETUP FAIL2BAN #================================================= -ynh_script_progression --message="Configuring fail2ban..." --weight=7 +ynh_script_progression --message="Configuring Fail2Ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 @@ -228,7 +228,7 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/remove b/scripts/remove index 6bb05bb..b0d36b7 100755 --- a/scripts/remove +++ b/scripts/remove @@ -32,23 +32,23 @@ ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing nginx web server configuration..." +ynh_script_progression --message="Removing NGINX web server configuration..." -# Remove the dedicated nginx config +# Remove the dedicated NGINX config ynh_remove_nginx_config #================================================= # REMOVE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Removing php-fpm configuration..." --weight=2 +ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=2 -# Remove the dedicated php-fpm config +# Remove the dedicated PHP-FPM config ynh_remove_fpm_config #================================================= # REMOVE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Removing fail2ban configuration..." --weight=7 +ynh_script_progression --message="Removing Fail2Ban configuration..." --weight=7 ynh_remove_fail2ban_config diff --git a/scripts/restore b/scripts/restore index 0cf8f4a..e36a534 100755 --- a/scripts/restore +++ b/scripts/restore @@ -94,7 +94,7 @@ ynh_restore_file --origin_path="/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # RESTORE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the fail2ban configuration..." --weight=7 +ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=7 ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" @@ -105,7 +105,7 @@ ynh_systemd_action --action=restart --service_name=fail2ban #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading nginx web server and php-fpm..." --weight=2 +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM.." --weight=2 ynh_systemd_action --service_name=php7.0-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/upgrade b/scripts/upgrade index 8e9eaaa..645baee 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -63,10 +63,10 @@ fi -# Yunohost specific configuration, if it isn't exist already +# YunoHost specific configuration, if it isn't exist already # Previously, these settings were store in an unique "dokuwiki.php" -# Now, they are split in multiple files to ease upgrading process (separate Yunohost config from user config) +# Now, they are split in multiple files to ease upgrading process (separate YunoHost config from user config) # Loading order of configuration files # @@ -176,9 +176,9 @@ fi #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading nginx web server configuration..." --weight=2 +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 -# Create a dedicated nginx config +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= @@ -192,9 +192,9 @@ ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading php-fpm configuration..." +ynh_script_progression --message="Upgrading PHP-FPM configuration..." -# Create a dedicated php-fpm config +# Create a dedicated PHP-FPM config ynh_add_fpm_config #================================================= @@ -203,7 +203,7 @@ ynh_add_fpm_config if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Upgrading dokuwiki..." --weight=7 + ynh_script_progression --message="Upgrading DokuWiki..." --weight=7 # Remove upgrade notification inside Dokuwiki's admin panel # See https://www.dokuwiki.org/update_check @@ -256,7 +256,7 @@ ynh_store_file_checksum --file="$final_path/conf/local.protected.php" #================================================= # INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN #================================================= -ynh_script_progression --message="Upgrading logautherror plugin for fail2ban..." --weight=2 +ynh_script_progression --message="Upgrading logautherror plugin for Fail2Ban..." --weight=2 ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror @@ -306,7 +306,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 #================================================= # SETUP FAIL2BAN #================================================= -ynh_script_progression --message="Reconfiguring fail2ban..." --weight=7 +ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 @@ -329,7 +329,7 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload From 310bf01f79ff8e6ae11cda00e9a75c814f875eb5 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:48:33 +0200 Subject: [PATCH 050/144] Update README_fr.md --- README_fr.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/README_fr.md b/README_fr.md index ba796c2..51397f0 100644 --- a/README_fr.md +++ b/README_fr.md @@ -26,13 +26,8 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentation -<<<<<<< Updated upstream -* Documentation officielle: -* Documentation YunoHost: -======= * Documentation officielle : https://www.dokuwiki.org/manual * Documentation YunoHost : https://yunohost.org/#/app_dokuwiki ->>>>>>> Stashed changes ## Caractéristiques spécifiques YunoHost @@ -50,14 +45,6 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de YunoHost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) -<<<<<<< Updated upstream -## Liens - -* Signaler un bug: -* Site de l'application: -* Dépôt de l'application principale: -* Site web YunoHost: -======= ## Informations additionnelles ### Historique des versions @@ -68,7 +55,6 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Site de l'application : https://www.dokuwiki.org * Dépôt de l'application principale : https://github.com/splitbrain/dokuwiki * Site web YunoHost : https://yunohost.org/ ->>>>>>> Stashed changes --- From bdf8e6cfefa49391e137edbe9811b76164c785d4 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Sep 2020 11:55:17 +0200 Subject: [PATCH 051/144] Update README.md --- README.md | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index bf68e11..5d0b729 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,8 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Documentation -* Official documentation: -* YunoHost documentation: +* Official documentation: https://www.dokuwiki.org/manual +* YunoHost documentation: https://yunohost.org/#/app_dokuwiki ## YunoHost specific features @@ -47,22 +47,19 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Links -* Report a bug: -* App website: -* Upstream app repository: -* YunoHost website: +* Report a bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues +* App website: https://www.dokuwiki.org +* Upstream app repository: https://github.com/splitbrain/dokuwiki +* YunoHost website: https://yunohost.org --- ## Developers infos -**Only if you know what you are doing AND want to switch to an unstable branch for testing or coding** +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) -Instead of merging directly into `master`, please do your pull request to the [`testing` branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) - -To try the `testing` branch, please proceed like that. - -```bash +To try the testing branch, please proceed like that. +``` sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug or sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug From 89176932222c5fb4adcba3db92ef6db357f51daa Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 25 Sep 2020 21:49:16 +0200 Subject: [PATCH 052/144] Add local screenshot --- README.md | 2 +- README_fr.md | 2 +- sources/DokuWiki_Screenshot.png | Bin 0 -> 141447 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 sources/DokuWiki_Screenshot.png diff --git a/README.md b/README.md index 5d0b729..ea35bc5 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Screenshots -![Screenshot](https://www.dokuwiki.org/lib/exe/fetch.php?tok=341927&media=http%3A%2F%2Fimg832.imageshack.us%2Fimg832%2F8784%2Fdokuwikitemplatevector2.png) +![Screenshot](../sources/DokuWiki_Screenshot.png) ## Demo diff --git a/README_fr.md b/README_fr.md index 51397f0..cc4b1d3 100644 --- a/README_fr.md +++ b/README_fr.md @@ -16,7 +16,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Captures d'écran -![Capture d'écran](https://www.dokuwiki.org/lib/exe/fetch.php?tok=341927&media=http%3A%2F%2Fimg832.imageshack.us%2Fimg832%2F8784%2Fdokuwikitemplatevector2.png) +![Capture d'écran](../sources/DokuWiki_Screenshot.png) ## Démo diff --git a/sources/DokuWiki_Screenshot.png b/sources/DokuWiki_Screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..dcba61c6d18cee25ab47c4bde5370fcc71d41830 GIT binary patch literal 141447 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%0D!mL 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� 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 Date: Fri, 25 Sep 2020 21:51:33 +0200 Subject: [PATCH 053/144] :/ --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ea35bc5..a36ce1c 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Screenshots -![Screenshot](../sources/DokuWiki_Screenshot.png) +![Screenshot](sources/DokuWiki_Screenshot.png) ## Demo diff --git a/README_fr.md b/README_fr.md index cc4b1d3..0796ecc 100644 --- a/README_fr.md +++ b/README_fr.md @@ -16,7 +16,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Captures d'écran -![Capture d'écran](../sources/DokuWiki_Screenshot.png) +![Capture d'écran](sources/DokuWiki_Screenshot.png) ## Démo From b7166f410d6600343f70f82a854e2ccd5bcff2be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 1 Oct 2020 08:44:30 +0200 Subject: [PATCH 054/144] Update README.md Co-authored-by: yalh76 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a36ce1c..b8db370 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DokuWiki for YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) [![Install DokuWiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* From 46aab7ce12c26089ad82175241e2e7b745a19ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 1 Oct 2020 08:44:41 +0200 Subject: [PATCH 055/144] Update README.md Co-authored-by: yalh76 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b8db370..dadfba7 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Screenshots -![Screenshot](sources/DokuWiki_Screenshot.png) +![Screenshot of DokuWiki main window](sources/DokuWiki_Screenshot.png) ## Demo From 81554d2093b7772b3f45d10c1ea6755cbb009fc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 23 Oct 2020 18:35:07 +0200 Subject: [PATCH 056/144] Transition to PHP7.2 (#68) --- conf/nginx.conf | 2 +- conf/php-fpm.conf | 2 +- manifest.json | 2 +- scripts/_common.sh | 18 ++++++++++++++++++ scripts/backup | 3 ++- scripts/install | 3 ++- scripts/restore | 5 +++-- scripts/upgrade | 5 ++--- 8 files changed, 30 insertions(+), 10 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 5cb057b..85ae532 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -23,7 +23,7 @@ location __PATH__/ { location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; - fastcgi_pass unix:/var/run/php/php7.0-fpm-__NAME__.sock; + fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; fastcgi_index index.php; include fastcgi_params; diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf index 74a8089..238913c 100644 --- a/conf/php-fpm.conf +++ b/conf/php-fpm.conf @@ -33,7 +33,7 @@ group = __USER__ ; (IPv6 and IPv4-mapped) on a specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. -listen = /var/run/php/php7.0-fpm-__NAMETOCHANGE__.sock +listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock ; Set listen(2) backlog. ; Default Value: 511 (-1 on FreeBSD and OpenBSD) diff --git a/manifest.json b/manifest.json index 53dd472..f21401e 100644 --- a/manifest.json +++ b/manifest.json @@ -22,7 +22,7 @@ "email": "opi@zeropi.net" }], "requirements": { - "yunohost": ">= 3.5.0" + "yunohost": ">= 3.8.1" }, "multi_instance": true, "services": [ diff --git a/scripts/_common.sh b/scripts/_common.sh index a9bf588..d7614e9 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1 +1,19 @@ #!/bin/bash + +#================================================= +# COMMON VARIABLES +#================================================= + +YNH_PHP_VERSION="7.3" + +#================================================= +# PERSONAL HELPERS +#================================================= + +#================================================= +# EXPERIMENTAL HELPERS +#================================================= + +#================================================= +# FUTURE OFFICIAL HELPERS +#================================================= diff --git a/scripts/backup b/scripts/backup index 176834b..994eb7f 100755 --- a/scripts/backup +++ b/scripts/backup @@ -25,6 +25,7 @@ app=$YNH_APP_INSTANCE_NAME final_path=$(ynh_app_setting_get --app=$app --key=final_path) domain=$(ynh_app_setting_get --app=$app --key=domain) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # DECLARE DATA AND CONF FILES TO BACKUP @@ -47,7 +48,7 @@ ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" # BACKUP THE PHP-FPM CONFIGURATION #================================================= -ynh_backup --src_path="/etc/php/7.0/fpm/pool.d/$app.conf" +ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" #================================================= # BACKUP FAIL2BAN CONFIGURATION diff --git a/scripts/install b/scripts/install index 820c3ef..c0ddf5b 100755 --- a/scripts/install +++ b/scripts/install @@ -83,7 +83,8 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 # Create a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_add_fpm_config --phpversion=$YNH_PHP_VERSION +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # SPECIFIC SETUP diff --git a/scripts/restore b/scripts/restore index e36a534..8e49f15 100755 --- a/scripts/restore +++ b/scripts/restore @@ -26,6 +26,7 @@ app=$YNH_APP_INSTANCE_NAME 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) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # CHECK IF THE APP CAN BE RESTORED @@ -89,7 +90,7 @@ chown -R $app:root $final_path/lib/tpl # RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_restore_file --origin_path="/etc/php/7.0/fpm/pool.d/$app.conf" +ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" #================================================= # RESTORE FAIL2BAN CONFIGURATION @@ -107,7 +108,7 @@ ynh_systemd_action --action=restart --service_name=fail2ban #================================================= ynh_script_progression --message="Reloading NGINX web server and PHP-FPM.." --weight=2 -ynh_systemd_action --service_name=php7.0-fpm --action=reload +ynh_systemd_action --service_name=php${phpversion}-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 645baee..6a99821 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -21,6 +21,7 @@ path_url=$(ynh_app_setting_get --app=$app --key=path) admin=$(ynh_app_setting_get --app=$app --key=admin) is_public=$(ynh_app_setting_get --app=$app --key=is_public) final_path=$(ynh_app_setting_get --app=$app --key=final_path) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # CHECK VERSION @@ -61,8 +62,6 @@ if [ -z "$language" ]; then ynh_app_setting_set --app=$app --key=language --value=$language fi - - # YunoHost specific configuration, if it isn't exist already # Previously, these settings were store in an unique "dokuwiki.php" @@ -195,7 +194,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Upgrading PHP-FPM configuration..." # Create a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_add_fpm_config --phpversion=$YNH_PHP_VERSION #================================================= # SPECIFIC UPGRADE From 5260ab300fbb984cae9bb757eabdc12633f315fc Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 23 Oct 2020 18:49:46 +0200 Subject: [PATCH 057/144] Update CHANGELOG.md --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba827a8..3eeed71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,16 @@ ------------ +## [2020-07-29~ynh2] - 2020-10-23 + +### Added + +- New DokuWiki version `2020-07-29` + +### Changed + +- Set PHP7.3 as default + ## [2018-04-22b~ynh1] - 2020-03-23 ### Added From fb407d05c8dd870f04d1ef044a55a02ceb9605f3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 23 Oct 2020 18:50:59 +0200 Subject: [PATCH 058/144] Version increment --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index f21401e..80b7cd1 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Un sistema de Wiki de uso sencillicimo y compatible con los estándares.", "it": "Un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2020-07-29~ynh1", + "version": "2020-07-29~ynh2", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { From 756c0905adac37c0cecaa9f2d65c59927c0ef94b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 19 Nov 2020 17:00:43 +0100 Subject: [PATCH 059/144] Remove unneeded --phpversion --- scripts/install | 2 +- scripts/upgrade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index c0ddf5b..2066dad 100755 --- a/scripts/install +++ b/scripts/install @@ -83,7 +83,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 # Create a dedicated PHP-FPM config -ynh_add_fpm_config --phpversion=$YNH_PHP_VERSION +ynh_add_fpm_config phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 6a99821..ec7de76 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -194,7 +194,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Upgrading PHP-FPM configuration..." # Create a dedicated PHP-FPM config -ynh_add_fpm_config --phpversion=$YNH_PHP_VERSION +ynh_add_fpm_config #================================================= # SPECIFIC UPGRADE From 05c37a64433e034b1315ab0a9d8f516d188929ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 30 Nov 2020 21:48:13 +0100 Subject: [PATCH 060/144] Testing (#69) - Upgrade PHP to version 7.3 - Upgrade to version 2020-07-29 --- CHANGELOG.md | 69 ++++++++++++++++++++++++++++++++ README.md | 33 +++++---------- README_fr.md | 42 +++++++++---------- conf/app.src | 6 +-- conf/nginx.conf | 6 +-- conf/php-fpm.conf | 2 +- manifest.json | 18 ++++----- pull_request_template.md | 12 +++--- scripts/_common.sh | 18 +++++++++ scripts/backup | 16 ++++---- scripts/change_url | 16 ++++---- scripts/install | 23 ++++++----- scripts/remove | 10 ++--- scripts/restore | 9 +++-- scripts/upgrade | 23 +++++------ sources/DokuWiki_Screenshot.png | Bin 0 -> 141447 bytes 16 files changed, 186 insertions(+), 117 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 sources/DokuWiki_Screenshot.png diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3eeed71 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,69 @@ +# Changelog + +## [Unreleased] + +## [2018-04-22a~ynhXX] + +### Added + +- Upgrade actions and config-panel scripts + +------------ + +## [2020-07-29~ynh2] - 2020-10-23 + +### Added + +- New DokuWiki version `2020-07-29` + +### Changed + +- Set PHP7.3 as default + +## [2018-04-22b~ynh1] - 2020-03-23 + +### Added + +- New DokuWiki version `2018-04-22b` +- Changelog available in `CHANGELOG.md` + +### Changed + +- Upgrade content of file `pull_request_template.md` + +## [2018-04-22a~ynh3] - 2020-02-20 + +### Added + +- Use 'URL rewrite' for prettier URLs + +### Changed + +- Activate URL rewrite by default (does not break old links) + +### Removed + +- Unused DokuWiki config file + +## [2018-04-22a~ynh2] - 2020-02-20 + +### Added + +- Add fail2ban support to avoid bruteforce login attempts + +### Changed + +- Global upgrade of the package + +### Fixed + +- Get rid of the php ini file and merge its content into the pool file +- Update Readme following last work made on the package and current version in testing branch + +### Removed + +- Unused config file settings + +## [Previous versions] - YYYY-MM-DD + +- Will be written (one day maybye) diff --git a/README.md b/README.md index fea004e..dadfba7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DokuWiki for YunoHost -[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) +[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) [![Install DokuWiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* @@ -12,11 +12,11 @@ If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. -**Shipped version:** 2018-04-22a "Greebo" +**Shipped version:** 2020-07-29 ## Screenshots -![](https://www.dokuwiki.org/_media/dokuwikimainwindow.png) +![Screenshot of DokuWiki main window](sources/DokuWiki_Screenshot.png) ## Demo @@ -38,38 +38,27 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ### Supported architectures -* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) -* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-stretch.nohost.me/ci/apps/dokuwiki/) ## Limitations -* Cannot create or login with dokuwiki internal users, only users from Yunohost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) - -## Additional information - -### Changelog - -* *Many missing - List taken from previous documentation* -* 07 Mar 2017 - Update app -* 11 Feb 2017 - Create script app +* Cannot create or login with DokuWiki internal users, only users from YunoHost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) ## Links - * Report a bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues - * App website: https://www.dokuwiki.org - * Upstream app repository: https://github.com/splitbrain/dokuwiki - * YunoHost website: https://yunohost.org +* Report a bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues +* App website: https://www.dokuwiki.org +* Upstream app repository: https://github.com/splitbrain/dokuwiki +* YunoHost website: https://yunohost.org --- ## Developers infos -**Only if you know what you are doing AND want to switch to an unstable branch for testing or coding** +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) -Instead of merging directly into `master`, please do your pull request to the [`testing` branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) - -To try the `testing` branch, please proceed like that. +To try the testing branch, please proceed like that. ``` sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug or diff --git a/README_fr.md b/README_fr.md index fe39537..0796ecc 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,22 +1,22 @@ -# Dokuwiki pour YunoHost +# DokuWiki pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) -[![Installer DokuWiki grâce à YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) +[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) +[![Installer DokuWiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) -*[Read this readme in english.](./README.md)* +*[Read this readme in english.](./README.md)* -> *Ce package vous permet d'installer Dokuwiki rapidement et simplement sur un serveur Yunohost. +> *Ce package vous permet d'installer DokuWiki 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.* ## Vue d'ensemble DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne nécessite pas de base de données. Il est apprécié par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait un favori d'administrateur. Des contrôles d'accès et des connecteurs d'authentification intégrés rendent DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins apportés par sa communauté dynamique permettent un large éventail de cas d'utilisation au-delà d'un wiki traditionnel. -**Version incluse:** 2018-04-22a "Greebo" +**Version incluse:** 2020-07-29 ## Captures d'écran -![](https://www.dokuwiki.org/_media/dokuwikimainwindow.png) +![Capture d'écran](sources/DokuWiki_Screenshot.png) ## Démo @@ -26,8 +26,8 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentation -* Documentation officielle: https://www.dokuwiki.org/manual -* Documentation YunoHost: https://yunohost.org/#/app_dokuwiki +* Documentation officielle : https://www.dokuwiki.org/manual +* Documentation YunoHost : https://yunohost.org/#/app_dokuwiki ## Caractéristiques spécifiques YunoHost @@ -38,39 +38,33 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ### Architectures matérielles supportées -* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) -* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-stretch.nohost.me/ci/apps/dokuwiki/) ## Limitations -* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de Yunohost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) +* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de YunoHost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) ## Informations additionnelles ### Historique des versions -* *Many missing - List taken from previous documentation* -* 07 Mar 2017 - Update app -* 11 Feb 2017 - Create script app - ## Liens - * Signaler un bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues - * Site de l'application:https://www.dokuwiki.org - * Dépôt de l'application principale: https://github.com/splitbrain/dokuwiki - * Site web YunoHost: https://yunohost.org/ + * Signaler un bug : https://github.com/YunoHost-Apps/dokuwiki_ynh/issues + * Site de l'application : https://www.dokuwiki.org + * Dépôt de l'application principale : https://github.com/splitbrain/dokuwiki + * Site web YunoHost : https://yunohost.org/ --- ## Informations pour les développeurs -**Seulement si vous voulez utiliser une branche de test pour le codage, au lieu de fusionner directement dans la banche principale.** - -Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing). +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. -``` + +```bash sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ou sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug diff --git a/conf/app.src b/conf/app.src index e42acb7..2274131 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,6 +1,6 @@ -SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2018-04-22a.tgz -SOURCE_SUM=18765a29508f96f9882349a304bffc03 -SOURCE_SUM_PRG=md5sum +SOURCE_URL=https://github.com/splitbrain/dokuwiki/archive/release_stable_2020-07-29.tar.gz +SOURCE_SUM=cc1cd9f00095fea327baa79d8f02c904fe1c37bc3f8fd9999eaf646ee9928884 +SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true SOURCE_FILENAME= diff --git a/conf/nginx.conf b/conf/nginx.conf index 64fc3ba..85ae532 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -23,7 +23,7 @@ location __PATH__/ { location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; - fastcgi_pass unix:/var/run/php/php7.0-fpm-__NAME__.sock; + fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; fastcgi_index index.php; include fastcgi_params; @@ -39,12 +39,12 @@ location __PATH__/ { } # Deny Access to htaccess-Files for Apache - location ~ /\.ht { + location ~ __PATH__/\.ht { deny all; } # Serve static files - location ~ ^/lib.*\.(gif|png|ico|jpg)$ { + location ~ ^__PATH__/lib.*\.(gif|png|ico|jpg)$ { expires 30d; } diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf index 74a8089..238913c 100644 --- a/conf/php-fpm.conf +++ b/conf/php-fpm.conf @@ -33,7 +33,7 @@ group = __USER__ ; (IPv6 and IPv4-mapped) on a specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. -listen = /var/run/php/php7.0-fpm-__NAMETOCHANGE__.sock +listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock ; Set listen(2) backlog. ; Default Value: 511 (-1 on FreeBSD and OpenBSD) diff --git a/manifest.json b/manifest.json index 1c3ae56..80b7cd1 100644 --- a/manifest.json +++ b/manifest.json @@ -3,13 +3,13 @@ "id": "dokuwiki", "packaging_format": 1, "description": { - "en": "DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database.", - "fr": "DokuWiki est un wiki Open Source simple à utiliser et très polyvalent qui n'exige aucune base de données.", - "de": "DokuWiki ist ein standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab.", - "es": "DokuWiki es un sistema de Wiki de uso sencillicimo y compatible con los estándares.", - "it": "DokuWiki è un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." + "en": "A lightweight, simple to use and highly versatile wiki", + "fr": "Un wiki léger, simple à utiliser et très polyvalent", + "de": "Ein standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab.", + "es": "Un sistema de Wiki de uso sencillicimo y compatible con los estándares.", + "it": "Un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2018-04-22a~ynh3", + "version": "2020-07-29~ynh2", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { @@ -22,7 +22,7 @@ "email": "opi@zeropi.net" }], "requirements": { - "yunohost": ">= 3.5.0" + "yunohost": ">= 3.8.1" }, "multi_instance": true, "services": [ @@ -63,10 +63,10 @@ "name": "is_public", "type": "boolean", "ask": { - "en": "Is it a public DokuWiki site ?", + "en": "Is it a public DokuWiki site?", "fr": "Est-ce un site public ?" }, - "default": "true" + "default": true }, { "name": "language", diff --git a/pull_request_template.md b/pull_request_template.md index fceb723..8f984e1 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -2,7 +2,7 @@ - *Description of why you made this PR* ## Solution -- *And how you fix that* +- *And how do you fix that problem* ## PR Status - [ ] Code finished. @@ -13,12 +13,10 @@ ## Validation --- -*Minor decision* -- **Upgrade previous version** : - [ ] **Code review** : -- [ ] **Approval (LGTM)** : -- [ ] **Approval (LGTM)** : -- **CI succeeded** : -[![Build Status](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/badge/icon)](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/) +- [ ] **Approval (LGTM)** : +*Code review and approval have to be from a member of @YunoHost-Apps/apps-group* +- **CI succeeded** : +[![Build Status](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/badge/icon)](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/) *Please replace '-NUM-' in this link by the PR number.* When the PR is marked as ready to merge, you have to wait for 3 days before really merging it. diff --git a/scripts/_common.sh b/scripts/_common.sh index a9bf588..d7614e9 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1 +1,19 @@ #!/bin/bash + +#================================================= +# COMMON VARIABLES +#================================================= + +YNH_PHP_VERSION="7.3" + +#================================================= +# PERSONAL HELPERS +#================================================= + +#================================================= +# EXPERIMENTAL HELPERS +#================================================= + +#================================================= +# FUTURE OFFICIAL HELPERS +#================================================= diff --git a/scripts/backup b/scripts/backup index b931a0e..994eb7f 100755 --- a/scripts/backup +++ b/scripts/backup @@ -19,40 +19,40 @@ ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." +ynh_print_info --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME final_path=$(ynh_app_setting_get --app=$app --key=final_path) domain=$(ynh_app_setting_get --app=$app --key=domain) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= -# STANDARD BACKUP STEPS +# DECLARE DATA AND CONF FILES TO BACKUP +#================================================= +ynh_print_info --message="Declaring files to be backed up..." + #================================================= # BACKUP THE APP MAIN DIR #================================================= -ynh_script_progression --message="Backing up the main app directory..." ynh_backup --src_path="$final_path" #================================================= # BACKUP THE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Backing up nginx web server configuration..." ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # BACKUP THE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Backing up php-fpm configuration..." --weight=2 -ynh_backup --src_path="/etc/php/7.0/fpm/pool.d/$app.conf" +ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" #================================================= # BACKUP FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Backing up fail2ban configuration..." ynh_backup --src_path="/etc/fail2ban/jail.d/$app.conf" ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" @@ -61,4 +61,4 @@ ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" # END OF SCRIPT #================================================= -ynh_script_progression --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." --last +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/change_url b/scripts/change_url index 6851308..fe9ea64 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -50,23 +50,23 @@ fi #================================================= # MODIFY URL IN NGINX CONF #================================================= -ynh_script_progression --message="Updating nginx web server configuration..." --weight=2 +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=2 nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf -# Change the path in the nginx config file +# Change the path in the NGINX config file if [ $change_path -eq 1 ] then - # Make a backup of the original nginx config file if modified + # Make a backup of the original NGINX config file if modified ynh_backup_if_checksum_is_different --file="$nginx_conf_path" - # Set global variables for nginx helper + # Set global variables for NGINX helper domain="$old_domain" path_url="$new_path" - # Create a dedicated nginx config + # Create a dedicated NGINX config ynh_add_nginx_config fi -# Change the domain for nginx +# Change the domain for NGINX if [ $change_domain -eq 1 ] then # Delete file checksum for the old conf file location @@ -81,7 +81,7 @@ fi #================================================= # UPGRADE FAIL2BAN #================================================= -ynh_script_progression --message="Reconfiguring fail2ban..." --weight=6 +ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=6 ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $new_path.*$" --max_retry=5 @@ -90,7 +90,7 @@ ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failr #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/install b/scripts/install index 4ceb331..2066dad 100755 --- a/scripts/install +++ b/scripts/install @@ -64,9 +64,9 @@ ynh_setup_source --dest_dir="$final_path" #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Configuring nginx web server..." --weight=2 +ynh_script_progression --message="Configuring NGINX web server..." --weight=2 -# Create a dedicated nginx config +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= @@ -80,17 +80,18 @@ ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Configuring php-fpm..." --weight=2 +ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 -# Create a dedicated php-fpm config +# Create a dedicated PHP-FPM config ynh_add_fpm_config +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # SPECIFIC SETUP #================================================= # CUSTOMIZE DOKUWIKI #================================================= -ynh_script_progression --message="Configuring dokuwiki..." --weight=2 +ynh_script_progression --message="Configuring DokuWiki..." --weight=2 # Loading order of configuration files # @@ -103,8 +104,8 @@ ynh_script_progression --message="Configuring dokuwiki..." --weight=2 # See https://www.dokuwiki.org/plugin:config#protecting_settings -### Copy Yunohost specific configuration -# This File cannot be modified directly by Dokuwiki, only by hand or by Yunohost +### Copy YunoHost specific configuration +# This File cannot be modified directly by DokuWiki, only by hand or by YunoHost # It will only be updated by Yunohost package or directly by adventurous users cp ../conf/local.protected.php $final_path/conf @@ -112,7 +113,7 @@ cp ../conf/local.protected.php $final_path/conf ynh_replace_string --match_string="__YNH_ADMIN_USER__" --replace_string="$admin" --target_file="$final_path/conf/local.protected.php" -# This file might be modified by dokuwiki admin panel or by plugins +# This file might be modified by DokuWiki admin panel or by plugins # It will not be modified by Yunohost in order to keep user settings cp ../conf/local.php $final_path/conf @@ -159,7 +160,7 @@ ynh_store_file_checksum --file="$final_path/conf/local.protected.php" #================================================= # INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN #================================================= -ynh_script_progression --message="Installing logautherror plugin for fail2ban..." --weight=2 +ynh_script_progression --message="Installing logautherror plugin for Fail2Ban..." --weight=2 ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror @@ -209,7 +210,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 #================================================= # SETUP FAIL2BAN #================================================= -ynh_script_progression --message="Configuring fail2ban..." --weight=7 +ynh_script_progression --message="Configuring Fail2Ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 @@ -228,7 +229,7 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/remove b/scripts/remove index 6bb05bb..b0d36b7 100755 --- a/scripts/remove +++ b/scripts/remove @@ -32,23 +32,23 @@ ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing nginx web server configuration..." +ynh_script_progression --message="Removing NGINX web server configuration..." -# Remove the dedicated nginx config +# Remove the dedicated NGINX config ynh_remove_nginx_config #================================================= # REMOVE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Removing php-fpm configuration..." --weight=2 +ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=2 -# Remove the dedicated php-fpm config +# Remove the dedicated PHP-FPM config ynh_remove_fpm_config #================================================= # REMOVE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Removing fail2ban configuration..." --weight=7 +ynh_script_progression --message="Removing Fail2Ban configuration..." --weight=7 ynh_remove_fail2ban_config diff --git a/scripts/restore b/scripts/restore index 0cf8f4a..8e49f15 100755 --- a/scripts/restore +++ b/scripts/restore @@ -26,6 +26,7 @@ app=$YNH_APP_INSTANCE_NAME 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) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # CHECK IF THE APP CAN BE RESTORED @@ -89,12 +90,12 @@ chown -R $app:root $final_path/lib/tpl # RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_restore_file --origin_path="/etc/php/7.0/fpm/pool.d/$app.conf" +ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" #================================================= # RESTORE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the fail2ban configuration..." --weight=7 +ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=7 ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" @@ -105,9 +106,9 @@ ynh_systemd_action --action=restart --service_name=fail2ban #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading nginx web server and php-fpm..." --weight=2 +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM.." --weight=2 -ynh_systemd_action --service_name=php7.0-fpm --action=reload +ynh_systemd_action --service_name=php${phpversion}-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 8e9eaaa..ec7de76 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -21,6 +21,7 @@ path_url=$(ynh_app_setting_get --app=$app --key=path) admin=$(ynh_app_setting_get --app=$app --key=admin) is_public=$(ynh_app_setting_get --app=$app --key=is_public) final_path=$(ynh_app_setting_get --app=$app --key=final_path) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # CHECK VERSION @@ -61,12 +62,10 @@ if [ -z "$language" ]; then ynh_app_setting_set --app=$app --key=language --value=$language fi - - -# Yunohost specific configuration, if it isn't exist already +# YunoHost specific configuration, if it isn't exist already # Previously, these settings were store in an unique "dokuwiki.php" -# Now, they are split in multiple files to ease upgrading process (separate Yunohost config from user config) +# Now, they are split in multiple files to ease upgrading process (separate YunoHost config from user config) # Loading order of configuration files # @@ -176,9 +175,9 @@ fi #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading nginx web server configuration..." --weight=2 +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 -# Create a dedicated nginx config +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= @@ -192,9 +191,9 @@ ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading php-fpm configuration..." +ynh_script_progression --message="Upgrading PHP-FPM configuration..." -# Create a dedicated php-fpm config +# Create a dedicated PHP-FPM config ynh_add_fpm_config #================================================= @@ -203,7 +202,7 @@ ynh_add_fpm_config if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Upgrading dokuwiki..." --weight=7 + ynh_script_progression --message="Upgrading DokuWiki..." --weight=7 # Remove upgrade notification inside Dokuwiki's admin panel # See https://www.dokuwiki.org/update_check @@ -256,7 +255,7 @@ ynh_store_file_checksum --file="$final_path/conf/local.protected.php" #================================================= # INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN #================================================= -ynh_script_progression --message="Upgrading logautherror plugin for fail2ban..." --weight=2 +ynh_script_progression --message="Upgrading logautherror plugin for Fail2Ban..." --weight=2 ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror @@ -306,7 +305,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 #================================================= # SETUP FAIL2BAN #================================================= -ynh_script_progression --message="Reconfiguring fail2ban..." --weight=7 +ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 @@ -329,7 +328,7 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/sources/DokuWiki_Screenshot.png b/sources/DokuWiki_Screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..dcba61c6d18cee25ab47c4bde5370fcc71d41830 GIT binary patch literal 141447 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%0D!mL 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� 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 Date: Sun, 6 Dec 2020 11:52:06 +0100 Subject: [PATCH 061/144] Fix linter warnings --- check_process | 2 -- manifest.json | 2 +- scripts/upgrade | 7 ------- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/check_process b/check_process index f6fdd01..af56a08 100644 --- a/check_process +++ b/check_process @@ -20,8 +20,6 @@ incorrect_path=1 port_already_use=0 change_url=1 -;;; Levels - Level 5=auto ;;; Options Email= Notification=none diff --git a/manifest.json b/manifest.json index 80b7cd1..6b128f7 100644 --- a/manifest.json +++ b/manifest.json @@ -22,7 +22,7 @@ "email": "opi@zeropi.net" }], "requirements": { - "yunohost": ">= 3.8.1" + "yunohost": ">= 4.0.0" }, "multi_instance": true, "services": [ diff --git a/scripts/upgrade b/scripts/upgrade index ec7de76..9e6c3c2 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -151,13 +151,6 @@ ynh_clean_setup () { # Exit if an error occurs during the execution of the script ynh_abort_if_errors -#================================================= -# CHECK THE PATH -#================================================= - -# Normalize the URL path syntax -path_url=$(ynh_normalize_url_path --path_url=$path_url) - #================================================= # STANDARD UPGRADE STEPS #================================================= From d4b4abcc0c5a53c1028d0c6e2a2b427359b1ed23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 26 Dec 2020 23:16:49 +0100 Subject: [PATCH 062/144] Set SVG badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dadfba7..4e5f662 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # DokuWiki for YunoHost [![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) -[![Install DokuWiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) +[![Install DokuWiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* From 74fc35d984aa2d2edc33f9fcdbf23a2373ef9422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 26 Dec 2020 23:17:10 +0100 Subject: [PATCH 063/144] Set SVG badge --- README_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_fr.md b/README_fr.md index 0796ecc..6626ce5 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,7 +1,7 @@ # DokuWiki pour YunoHost [![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) -[![Installer DokuWiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) +[![Installer DokuWiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) *[Read this readme in english.](./README.md)* From dd5aff6203578be4a7bf1ab92ea87f041b6f51c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 6 Jan 2021 16:54:00 +0100 Subject: [PATCH 064/144] Add extra php dependencies (#73) --- check_process | 1 - scripts/_common.sh | 2 ++ scripts/install | 2 +- scripts/restore | 3 +++ scripts/upgrade | 2 +- 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/check_process b/check_process index af56a08..5302a20 100644 --- a/check_process +++ b/check_process @@ -17,7 +17,6 @@ upgrade=1 from_commit=01add99d3d903ca6d07f863045edf2ba46cf18d5 backup_restore=1 multi_instance=1 - incorrect_path=1 port_already_use=0 change_url=1 ;;; Options diff --git a/scripts/_common.sh b/scripts/_common.sh index d7614e9..115991f 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -6,6 +6,8 @@ YNH_PHP_VERSION="7.3" +extra_php_dependencies="php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-ldap php${YNH_PHP_VERSION}-gd" + #================================================= # PERSONAL HELPERS #================================================= diff --git a/scripts/install b/scripts/install index 2066dad..b3dfdf5 100755 --- a/scripts/install +++ b/scripts/install @@ -83,7 +83,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 # Create a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_add_fpm_config --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= diff --git a/scripts/restore b/scripts/restore index 8e49f15..213eb9f 100755 --- a/scripts/restore +++ b/scripts/restore @@ -89,9 +89,12 @@ chown -R $app:root $final_path/lib/tpl #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= +ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=5 ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" +ynh_add_fpm_config --package="$extra_php_dependencies" + #================================================= # RESTORE FAIL2BAN CONFIGURATION #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 9e6c3c2..f87cc73 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -187,7 +187,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Upgrading PHP-FPM configuration..." # Create a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_add_fpm_config --package="$extra_php_dependencies" #================================================= # SPECIFIC UPGRADE From 1a3fbbebe49d07764145a7e27d0d6f18e767d049 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 6 Jan 2021 17:15:33 +0100 Subject: [PATCH 065/144] Change version --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 80b7cd1..fb212b8 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Un sistema de Wiki de uso sencillicimo y compatible con los estándares.", "it": "Un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2020-07-29~ynh2", + "version": "2020-07-29~ynh3", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { From e0f0fd4a05e6d2a6b91ad81d096d023c70c49908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 6 Jan 2021 17:43:00 +0100 Subject: [PATCH 066/144] Testing (#74) * Add extra php dependencies (#73) --- README.md | 2 +- README_fr.md | 2 +- check_process | 3 --- manifest.json | 2 +- scripts/_common.sh | 2 ++ scripts/install | 2 +- scripts/restore | 3 +++ scripts/upgrade | 9 +-------- 8 files changed, 10 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index dadfba7..4e5f662 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # DokuWiki for YunoHost [![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) -[![Install DokuWiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) +[![Install DokuWiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* diff --git a/README_fr.md b/README_fr.md index 0796ecc..6626ce5 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,7 +1,7 @@ # DokuWiki pour YunoHost [![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) -[![Installer DokuWiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) +[![Installer DokuWiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) *[Read this readme in english.](./README.md)* diff --git a/check_process b/check_process index f6fdd01..5302a20 100644 --- a/check_process +++ b/check_process @@ -17,11 +17,8 @@ upgrade=1 from_commit=01add99d3d903ca6d07f863045edf2ba46cf18d5 backup_restore=1 multi_instance=1 - incorrect_path=1 port_already_use=0 change_url=1 -;;; Levels - Level 5=auto ;;; Options Email= Notification=none diff --git a/manifest.json b/manifest.json index 80b7cd1..fb212b8 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Un sistema de Wiki de uso sencillicimo y compatible con los estándares.", "it": "Un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2020-07-29~ynh2", + "version": "2020-07-29~ynh3", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { diff --git a/scripts/_common.sh b/scripts/_common.sh index d7614e9..115991f 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -6,6 +6,8 @@ YNH_PHP_VERSION="7.3" +extra_php_dependencies="php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-ldap php${YNH_PHP_VERSION}-gd" + #================================================= # PERSONAL HELPERS #================================================= diff --git a/scripts/install b/scripts/install index 2066dad..b3dfdf5 100755 --- a/scripts/install +++ b/scripts/install @@ -83,7 +83,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 # Create a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_add_fpm_config --package="$extra_php_dependencies" phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= diff --git a/scripts/restore b/scripts/restore index 8e49f15..213eb9f 100755 --- a/scripts/restore +++ b/scripts/restore @@ -89,9 +89,12 @@ chown -R $app:root $final_path/lib/tpl #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= +ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=5 ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" +ynh_add_fpm_config --package="$extra_php_dependencies" + #================================================= # RESTORE FAIL2BAN CONFIGURATION #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index ec7de76..f87cc73 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -151,13 +151,6 @@ ynh_clean_setup () { # Exit if an error occurs during the execution of the script ynh_abort_if_errors -#================================================= -# CHECK THE PATH -#================================================= - -# Normalize the URL path syntax -path_url=$(ynh_normalize_url_path --path_url=$path_url) - #================================================= # STANDARD UPGRADE STEPS #================================================= @@ -194,7 +187,7 @@ ynh_system_user_create --username=$app ynh_script_progression --message="Upgrading PHP-FPM configuration..." # Create a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_add_fpm_config --package="$extra_php_dependencies" #================================================= # SPECIFIC UPGRADE From fb65a8bfa2cc8348ae2d531ce09d29820a255e13 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Tue, 19 Jan 2021 13:25:05 +0100 Subject: [PATCH 067/144] [fix] Allow to use every groups we want --- conf/local.protected.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/local.protected.php b/conf/local.protected.php index ddf37b3..f6945dd 100644 --- a/conf/local.protected.php +++ b/conf/local.protected.php @@ -24,7 +24,7 @@ $conf['plugin']['authldap']['version'] = 3; $conf['plugin']['authldap']['usertree'] = 'ou=users,dc=yunohost,dc=org'; $conf['plugin']['authldap']['grouptree'] = 'ou=permission,dc=yunohost,dc=org'; $conf['plugin']['authldap']['userfilter'] = '(&(objectClass=posixAccount)(uid=%{user})(permission=cn=__APP__.main,ou=permission,dc=yunohost,dc=org))'; -$conf['plugin']['authldap']['groupfilter'] = '(&(objectClass=posixGroup)(memberUID=%{user})(cn=__APP__.*))'; +$conf['plugin']['authldap']['groupfilter'] = '(&(objectClass=posixGroup)(memberUid=%{user}))'; #$conf['plugin']['authldap']['debug'] = 1; From 793df20c076c38c1bd508998a7a56674ba8f0657 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 19 Feb 2021 00:06:47 +0100 Subject: [PATCH 068/144] Simplify legacy permission migration --- scripts/upgrade | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 2c550f9..b56a82e 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -61,22 +61,10 @@ if [ -n "$admin_user" ]; then ynh_app_setting_delete --app=$app --key=admin fi -is_public=$(ynh_app_setting_get --app=$app --key=is_public) -if [ -n "$is_public" ]; then - # Remove unprotected_uris - ynh_app_setting_delete --app=$app --key=unprotected_uris - # Remove protected_uris - ynh_app_setting_delete --app=$app --key=protected_uris +# Cleaning legacy permissions +if ynh_legacy_permissions_exists; then + ynh_legacy_permissions_delete_all - # Removing skipped/unprotected_uris under certain conditions, remove the visitors group added during the migration process of 3.7 - # Remove skipped_uris. If the app was public, add visitors again to the main permission - if ynh_permission_has_user --permission=main --user=visitors - then - ynh_app_setting_delete --app=$app --key=skipped_uris - ynh_permission_update --permission "main" --add "visitors" - else - ynh_app_setting_delete --app=$app --key=skipped_uris - fi ynh_app_setting_delete --app=$app --key=is_public fi From 4e81097d8e4b1988edab453a440de2878d06c292 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 19 Feb 2021 00:07:53 +0100 Subject: [PATCH 069/144] Unecessary commnted block --- scripts/upgrade | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index b56a82e..99d5000 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -342,9 +342,6 @@ ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 -#================================================= -# SETUP SSOWAT -#================================================= # Nothinf to do here. Already done in "ENSURE DOWNWARD COMPATIBILITY" part #ynh_script_progression --message="Upgrading permissions configuration..." --weight=2 From a6c6be2f1db6a7e6fc3e0746fd2455d29a625f6c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 19 Feb 2021 00:08:19 +0100 Subject: [PATCH 070/144] Unecessary commented code --- scripts/upgrade | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 99d5000..8db409e 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -342,8 +342,6 @@ ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 - # Nothinf to do here. Already done in "ENSURE DOWNWARD COMPATIBILITY" part - #ynh_script_progression --message="Upgrading permissions configuration..." --weight=2 #================================================= # RELOAD NGINX From 3fe2ebdbf7f8e53b1a8b6a460fc8035c431852cc Mon Sep 17 00:00:00 2001 From: yalh76 Date: Sat, 17 Apr 2021 14:56:26 +0200 Subject: [PATCH 071/144] Fix Using official helper ynh_legacy_permissions_delete_all implies requiring at least version 4.1.2, but manifest only requires 4.1.0 --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index c8ce5e0..2105583 100644 --- a/manifest.json +++ b/manifest.json @@ -22,7 +22,7 @@ "email": "opi@zeropi.net" }], "requirements": { - "yunohost": ">= 4.1.0" + "yunohost": ">= 4.1.2" }, "multi_instance": true, "services": [ From 4b20b0401a33bb0ad7e81d05e6a8a88a25b6b976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 18 Apr 2021 16:50:50 +0200 Subject: [PATCH 072/144] Remove ask on manifest (#78) * Remove ask on manifest * Add ynh_abort_if_errors Co-authored-by: Gofannon <17145502+Gofannon@users.noreply.github.com> --- README.md | 2 +- README_fr.md | 2 +- check_process | 1 - manifest.json | 20 ++------------------ pull_request_template.md | 10 ++-------- scripts/change_url | 17 +++++++++++++++++ scripts/install | 4 +--- scripts/upgrade | 1 - 8 files changed, 24 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 4e5f662..94cffd5 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Documentation * Official documentation: https://www.dokuwiki.org/manual -* YunoHost documentation: https://yunohost.org/#/app_dokuwiki +* YunoHost documentation: https://yunohost.org/en/app_dokuwiki ## YunoHost specific features diff --git a/README_fr.md b/README_fr.md index 6626ce5..e75fbfb 100644 --- a/README_fr.md +++ b/README_fr.md @@ -27,7 +27,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentation * Documentation officielle : https://www.dokuwiki.org/manual -* Documentation YunoHost : https://yunohost.org/#/app_dokuwiki +* Documentation YunoHost : https://yunohost.org/fr/app_dokuwiki ## Caractéristiques spécifiques YunoHost diff --git a/check_process b/check_process index cf4781d..49a2a04 100644 --- a/check_process +++ b/check_process @@ -18,7 +18,6 @@ upgrade=1 from_commit=500a7d3fa9c008a2b75d0f6bec519e41fed97da0 backup_restore=1 multi_instance=1 - port_already_use=0 change_url=1 ;;; Options Email= diff --git a/manifest.json b/manifest.json index 2105583..db5e641 100644 --- a/manifest.json +++ b/manifest.json @@ -22,50 +22,34 @@ "email": "opi@zeropi.net" }], "requirements": { - "yunohost": ">= 4.1.2" + "yunohost": ">= 4.1.7" }, "multi_instance": true, "services": [ "nginx", - "php7.0-fpm" + "php7.3-fpm" ], "arguments": { "install" : [ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain for DokuWiki", - "fr": "Choisissez un domaine pour DokuWiki" - }, "example": "domain.org" }, { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for DokuWiki", - "fr": "Choisissez un chemin pour DokuWiki" - }, "example": "/dokuwiki", "default": "/dokuwiki" }, { "name": "admin", "type": "user", - "ask": { - "en": "Choose an admin user", - "fr": "Choisissez l'administrateur" - }, "example": "johndoe" }, { "name": "is_public", "type": "boolean", - "ask": { - "en": "Is it a public DokuWiki site?", - "fr": "Est-ce un site public ?" - }, "default": true }, { diff --git a/pull_request_template.md b/pull_request_template.md index 8f984e1..6c28fc5 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -11,12 +11,6 @@ - [ ] Upgrade from last version tested. - [ ] Can be reviewed and tested. -## Validation +## Package_check results --- -- [ ] **Code review** : -- [ ] **Approval (LGTM)** : -*Code review and approval have to be from a member of @YunoHost-Apps/apps-group* -- **CI succeeded** : -[![Build Status](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/badge/icon)](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/) -*Please replace '-NUM-' in this link by the PR number.* -When the PR is marked as ready to merge, you have to wait for 3 days before really merging it. +* An automatic package_check will be launch at https://ci-apps-dev.yunohost.org/, when you add a specific comment to your Pull Request: "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!"* diff --git a/scripts/change_url b/scripts/change_url index fe9ea64..7b2adff 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -29,6 +29,23 @@ ynh_script_progression --message="Loading installation settings..." # Needed for helper "ynh_add_nginx_config" final_path=$(ynh_app_setting_get --app=$app --key=final_path) +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 + +# 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" + + # 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 #================================================= diff --git a/scripts/install b/scripts/install index 6314e1a..92731ae 100755 --- a/scripts/install +++ b/scripts/install @@ -224,9 +224,7 @@ ynh_script_progression --message="Configuring permissions..." --weight=2 # Make app public if necessary if [ $is_public -eq 1 ] then - # Everyone can access the app. - # The "main" permission is automatically created before the install script. - ynh_permission_update --permission "main" --add "visitors" + ynh_permission_update --permission="main" --add="visitors" fi #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 8db409e..34daf6f 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -44,7 +44,6 @@ if [ -z "$language" ]; then ynh_app_setting_set --app=$app --key=language --value=$language fi - # Cleaning legacy permissions admin_user=$(ynh_app_setting_get --app=$app --key=admin) From 8ca845440ee0a27da324d3b7783c7a7aaefc711c Mon Sep 17 00:00:00 2001 From: yalh76 Date: Tue, 11 May 2021 23:31:32 +0200 Subject: [PATCH 073/144] md5sum checksum to sha256sum ! logautherror.src: Using md5sum checksum is not so great for security. Consider using sha256sum instead. --- conf/logautherror.src | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/logautherror.src b/conf/logautherror.src index 56bab0d..f68bd07 100644 --- a/conf/logautherror.src +++ b/conf/logautherror.src @@ -1,6 +1,6 @@ SOURCE_URL=https://github.com/mallchin/dokuwiki_plugin_logautherror/archive/master.zip -SOURCE_SUM=ac36038a710d8f4823a006416ef28c46 -SOURCE_SUM_PRG=md5sum +SOURCE_SUM=bc51d4da781d0aabab8e086e51f3cb77ac983eb4366f4c8f5247bb863d4a3bb2 +SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true SOURCE_FILENAME= From f45e1ca16a2630d392455057e6ec7d6b1824a2ab Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Thu, 13 May 2021 17:46:13 +0200 Subject: [PATCH 074/144] [autopatch] Update issue and PR templates --- .github/ISSUE_TEMPLATE.md | 55 ++++++++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 16 ++++++++++ pull_request_template.md | 16 ---------- 3 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 pull_request_template.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..2729a6b --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,55 @@ +--- +name: Bug report +about: When creating a bug report, please use the following template to provide all the relevant information and help debugging efficiently. + +--- + +**How to post a meaningful bug report** +1. *Read this whole template first.* +2. *Determine if you are on the right place:* + - *If you were performing an action on the app from the webadmin or the CLI (install, update, backup, restore, change_url...), you are on the right place!* + - *Otherwise, the issue may be due to the app itself. Refer to its documentation or repository for help.* + - *When in doubt, post here and we will figure it out together.* +3. *Delete the italic comments as you write over them below, and remove this guide.* +--- + +### Describe the bug + +*A clear and concise description of what the bug is.* + +### Context + +- Hardware: *VPS bought online / Old laptop or computer / Raspberry Pi at home / Internet Cube with VPN / Other ARM board / ...* +- YunoHost version: x.x.x +- I have access to my server: *Through SSH | through the webadmin | direct access via keyboard / screen | ...* +- Are you in a special context or did you perform some particular tweaking on your YunoHost instance?: *no / yes* + - If yes, please explain: +- Using, or trying to install package version/branch: +- If upgrading, current package version: *can be found in the admin, or with `yunohost app info $app_id`* + +### Steps to reproduce + +- *If you performed a command from the CLI, the command itself is enough. For example:* + ```sh + sudo yunohost app install the_app + ``` +- *If you used the webadmin, please perform the equivalent command from the CLI first.* +- *If the error occurs in your browser, explain what you did:* + 1. *Go to '...'* + 2. *Click on '...'* + 3. *Scroll down to '...'* + 4. *See error* + +### Expected behavior + +*A clear and concise description of what you expected to happen. You can remove this section if the command above is enough to understand your intent.* + +### Logs + +*When an operation fails, YunoHost provides a simple way to share the logs.* +- *In the webadmin, the error message contains a link to the relevant log page. On that page, you will be able to 'Share with Yunopaste'. If you missed it, the logs of previous operations are also available under Tools > Logs.* +- *In command line, the command to share the logs is displayed at the end of the operation and looks like `yunohost log display [log name] --share`. If you missed it, you can find the log ID of a previous operation using `yunohost log list`.* + +*After sharing the log, please copypaste directly the link provided by YunoHost (to help readability, no need to copypaste the entire content of the log here, just the link is enough...)* + +*If applicable and useful, add screenshots to help explain your problem.* diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..ef70e18 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +## Problem + +- *Description of why you made this PR* + +## Solution + +- *And how do you fix that problem* + +## PR Status + +- [ ] Code finished and ready to be reviewed/tested +- [ ] The fix/enhancement were manually tested (if applicable) + +## Automatic tests + +Automatic tests can be triggered on https://ci-apps-dev.yunohost.org/ *after creating the PR*, by commenting "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!". (N.B. : for this to work you need to be a member of the Yunohost-Apps organization) diff --git a/pull_request_template.md b/pull_request_template.md deleted file mode 100644 index 6c28fc5..0000000 --- a/pull_request_template.md +++ /dev/null @@ -1,16 +0,0 @@ -## Problem -- *Description of why you made this PR* - -## Solution -- *And how do you fix that problem* - -## PR Status -- [ ] Code finished. -- [ ] Tested with Package_check. -- [ ] Fix or enhancement tested. -- [ ] Upgrade from last version tested. -- [ ] Can be reviewed and tested. - -## Package_check results ---- -* An automatic package_check will be launch at https://ci-apps-dev.yunohost.org/, when you add a specific comment to your Pull Request: "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!"* From 89fc6747b16daa96ffb0236552ad6db4e4ea4448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 24 Nov 2021 21:21:02 +0100 Subject: [PATCH 075/144] Template (#85) --- .DS_Store | Bin 0 -> 8196 bytes README.md | 59 ++++----- README_fr.md | 58 ++++----- check_process | 8 +- conf/app.src | 1 - conf/local.php | 2 +- conf/nginx.conf | 7 +- doc/.DS_Store | Bin 0 -> 6148 bytes doc/DESCRIPTION.md | 8 ++ doc/DESCRIPTION_fr.md | 8 ++ doc/DISCLAIMER.md | 3 + doc/DISCLAIMER_fr.md | 3 + .../screenshots}/DokuWiki_Screenshot.png | Bin manifest.json | 27 ++-- scripts/_common.sh | 3 +- scripts/install | 109 ++++++++-------- scripts/restore | 66 +++++----- scripts/upgrade | 118 ++++++++++-------- 18 files changed, 253 insertions(+), 227 deletions(-) create mode 100644 .DS_Store create mode 100644 doc/.DS_Store create mode 100644 doc/DESCRIPTION.md create mode 100644 doc/DESCRIPTION_fr.md create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/DISCLAIMER_fr.md rename {sources => doc/screenshots}/DokuWiki_Screenshot.png (100%) diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e6edef11a67974d19614e1d78412c927cc10eefd GIT binary patch literal 8196 zcmeHMTWl0n7(U;&z>FQ*DWH^f!G&52T0_gFS~0NgmP?`7+HGkI*kyKSgbCA`Iy1Wk zD`w-1M#VS0pfN!OHTd8Ic!{?}G$F?LAT?ehKKR0mi7(>y#sAEiElA;s#E>v2ne&}F z|K-g2&bM=NW*KAXDCjMW)iK5-x;Uy;R9&WUJHMutSlBaz5ERe6v7F`P=p0sekS(#0_qVo6}|>Yyq(0uWYG zcTlLU@&;it#8ikSfn=cq5lSdR5gsuh!l^$Q`lUiF2^8TB;o$?}$Oum;2u7#;$-tc< zB`~TZ1|kNgGr-U86-;Li%jd=~KEGS0=QlThhge1BjG40}`36~$t7YYZ%pPYv<7(Jb+n#h>Ck<;8kQ}_4u8}@q3C>nN;+pYPAyMsITJB~#TqOIk&nZ|flotJiOUo&mP z4f2T`I|of$cg8!Mf~|Xjf0#UI_iFwg$|KjOj8ZTUS(3AA-NeMom8+YQEiG*anvxTD zuWV~dwzjq$I3P>Xg2oMfBZbGFIsD>lM~}V!=_xULgl`a5EAFT2&!`nrVR^;0_>>WQ zJ2xh%_~8N-Rm$x6rmjt!wE zds($MuUYwmMeMX&R>pkTpuQR}?>d&%>v$$lGd$!Q`+RPjW*XY=Ij)}$k`0-ZUwEkn z&*(EKsaZ5SDYd6UK3+XPvAE&(<*VA(rYCFE+BtLQDav*t+V;%{O~V}+=PNd>d3nRu zO?&rX(e%umW%S$Hs8Nf*WjTndTM&;A6>{c71=HWJ)=N^*yKqrl*{Rb=TOFNe)76ub z@L#eh9^b(&Y1g1y4+Cy%j4S;fO-a>4$2*!7rGGCixax&NHMc170ZYpnma5BQoYk#L ze6T23Rkwtl_pDLkLwRR(l&0dr+cbGnjXMDkbh@+Kv{o6|9qWvt7((6YL;+o*iK)*gNc9c8Yz;zGY|GIrc02 zjs3y?WPc%sD$GVTYEXv;G-4^1VFlJ=9a8ARedxvg=)(@|LJoQ87=?!diWo-;PvA*B zg{N@{FXISa!K-)+AK)W=j8AYHU*ilW@eO{$IsAh2;sIl26>k;yw=2I4|1_X zmsfFOlMT!6TyfXE?NdvC$zuOUj~7cY(47!gAh@!if)$@6 zf!~~1sN7Q4|E0f+0g|Y(PvSaLX9@2miCZO-mMR6eN@Jo*CjARrW1>lt)R?d=PqfG+ zc(p>lf?{`lYF4lm#^ zUcylv!y9-L$8iED@gCkM;eLqE@fC^o$4jKzT^6Z8oV_5`V#c*C$KFjnT-dXiM>|r1 zet3CiFi-dLR*trjvgSp6R9__n6(YWlpa0ii`TPG>juM4O3`7iE%M75hGt=2YPk5#G zD?e)|>DomXFWj#rFbJV4IF1tr$8o}`KMbjzBv&4j3b7=RdZ_&G9|H7f|Bv?nKzi48 F^)F}XGsOS^ literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 94cffd5..1c93c23 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,22 @@ -# DokuWiki for YunoHost + + +# Dokuwiki for YunoHost [![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) -[![Install DokuWiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) +[![Install Dokuwiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* -> *This package allows you to install DokuWiki 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 Dokuwiki 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 DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. -**Shipped version:** 2020-07-29 - -## Screenshots - -![Screenshot of DokuWiki main window](sources/DokuWiki_Screenshot.png) - -## Demo - -* [YunoHost demo](https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo) - -## Configuration - -## Documentation - -* Official documentation: https://www.dokuwiki.org/manual -* YunoHost documentation: https://yunohost.org/en/app_dokuwiki - ## YunoHost specific features * Integrate with YunoHost users and SSO - i.e. logout button @@ -36,27 +24,32 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * Default authorization is set as read only so guest people cannot edit pages. (Especially needed if wiki is public to avoid spam and defacing. Can be changed from admin panel) * During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... -### Supported architectures -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) +**Shipped version:** 2020.07.29~ynh4 + +**Demo:** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo + +## Screenshots + +![](./doc/screenshots/DokuWiki_Screenshot.png) + +## Disclaimers / important information ## Limitations * Cannot create or login with DokuWiki internal users, only users from YunoHost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) -## Links +## Documentation and resources +* Official app website: https://www.dokuwiki.org +* Official admin documentation: https://www.dokuwiki.org/manual +* Upstream app code repository: https://github.com/splitbrain/dokuwiki +* YunoHost documentation for this app: https://yunohost.org/app_dokuwiki * Report a bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues -* App website: https://www.dokuwiki.org -* Upstream app repository: https://github.com/splitbrain/dokuwiki -* YunoHost website: https://yunohost.org ---- +## Developer info -## Developers infos - -Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). To try the testing branch, please proceed like that. ``` @@ -64,3 +57,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/tes or sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_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 e75fbfb..7607167 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,34 +1,18 @@ -# DokuWiki pour YunoHost +# Dokuwiki pour YunoHost [![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) -[![Installer DokuWiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) +[![Installer Dokuwiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) *[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* -> *Ce package vous permet d'installer DokuWiki rapidement et simplement sur un serveur YunoHost. +> *Ce package vous permet d'installer Dokuwiki 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.* ## Vue d'ensemble DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne nécessite pas de base de données. Il est apprécié par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait un favori d'administrateur. Des contrôles d'accès et des connecteurs d'authentification intégrés rendent DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins apportés par sa communauté dynamique permettent un large éventail de cas d'utilisation au-delà d'un wiki traditionnel. -**Version incluse:** 2020-07-29 - -## Captures d'écran - -![Capture d'écran](sources/DokuWiki_Screenshot.png) - -## Démo - -* [Démo YunoHost](https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo) - -## Configuration - -## Documentation - -* Documentation officielle : https://www.dokuwiki.org/manual -* Documentation YunoHost : https://yunohost.org/fr/app_dokuwiki - ## Caractéristiques spécifiques YunoHost * Fonctionne avec les utilisateurs YunoHost ainsi que le SSO - i.e. button de déconnexion @@ -36,36 +20,38 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Droits d'édition par défaut du wiki définis en lecture seule afin que les invités ne puissent éditer les pages. (Nécessaire surtout lorsque le wiki est public pour éviter le spam et le vandalisme. Peut être changé depuis la partie administration du wiki) * Lors de la mise à jour, les plugins officiels sont également mis à jour. Nous vous recommandons toutefois de vérifier le bon fonctionnement des plugins dans le panneau d'administration après cette opération. Nous ne pouvons pas savoir si des plugins spéciaux posent problèmes... -### Architectures matérielles supportées -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) +**Version incluse :** 2020.07.29~ynh4 + +**Démo :** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo + +## Captures d'écran + +![](./doc/screenshots/DokuWiki_Screenshot.png) + +## Avertissements / informations importantes ## Limitations * Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de YunoHost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) -## Informations additionnelles +## Documentations et ressources -### Historique des versions - -## Liens - - * Signaler un bug : https://github.com/YunoHost-Apps/dokuwiki_ynh/issues - * Site de l'application : https://www.dokuwiki.org - * Dépôt de l'application principale : https://github.com/splitbrain/dokuwiki - * Site web YunoHost : https://yunohost.org/ - ---- +* Site officiel de l'app : https://www.dokuwiki.org +* Documentation officielle de l'admin : https://www.dokuwiki.org/manual +* Dépôt de code officiel de l'app : https://github.com/splitbrain/dokuwiki +* Documentation YunoHost pour cette app : https://yunohost.org/app_dokuwiki +* Signaler un bug : https://github.com/YunoHost-Apps/dokuwiki_ynh/issues ## Informations pour les développeurs Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. - -```bash +``` sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ou sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file diff --git a/check_process b/check_process index 49a2a04..084fa0f 100644 --- a/check_process +++ b/check_process @@ -1,10 +1,10 @@ ;; Test complet auto_remove=1 ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - admin="john" (USER) - is_public=1 (PUBLIC|public=1|private=0) + domain="domain.tld" + path="/path" + admin="john" + is_public=1 language=en ; Checks pkg_linter=1 diff --git a/conf/app.src b/conf/app.src index 2274131..78012a6 100644 --- a/conf/app.src +++ b/conf/app.src @@ -3,4 +3,3 @@ SOURCE_SUM=cc1cd9f00095fea327baa79d8f02c904fe1c37bc3f8fd9999eaf646ee9928884 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= diff --git a/conf/local.php b/conf/local.php index cfa5cd6..e2a3158 100644 --- a/conf/local.php +++ b/conf/local.php @@ -10,4 +10,4 @@ /* Basic Settings */ -$conf['lang'] = '__YNH_LANGUAGE__'; //your language +$conf['lang'] = '__LANGUAGE__'; //your language diff --git a/conf/nginx.conf b/conf/nginx.conf index 85ae532..cb10924 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -9,12 +9,7 @@ location __PATH__/ { # Path to source alias __FINALPATH__/ ; - # Force usage of https - if ($scheme = http) { - rewrite ^ https://$server_name$request_uri? permanent; - } - - index index.php; + index index.php doku.php; # Common parameter to increase upload size limit in conjuction with dedicated php-fpm file client_max_body_size 25M; diff --git a/doc/.DS_Store b/doc/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0= 4.1.7" + "yunohost": ">= 4.3.0" }, "multi_instance": true, "services": [ @@ -33,8 +40,7 @@ "install" : [ { "name": "domain", - "type": "domain", - "example": "domain.org" + "type": "domain" }, { "name": "path", @@ -44,8 +50,7 @@ }, { "name": "admin", - "type": "user", - "example": "johndoe" + "type": "user" }, { "name": "is_public", diff --git a/scripts/_common.sh b/scripts/_common.sh index 4bad65e..80e5275 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,10 +4,9 @@ # COMMON VARIABLES #================================================= - YNH_PHP_VERSION="7.3" -extra_php_dependencies="php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-ldap php${YNH_PHP_VERSION}-gd" +pkg_dependencies="php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-ldap php${YNH_PHP_VERSION}-gd" #================================================= # PERSONAL HELPERS diff --git a/scripts/install b/scripts/install index 92731ae..f887690 100755 --- a/scripts/install +++ b/scripts/install @@ -48,6 +48,21 @@ 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=language --value=$language +#================================================= +# INSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Installing dependencies..." --weight=1 + +ynh_install_app_dependencies $pkg_dependencies + +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --weight=2 + +# Create a system user +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # STANDARD MODIFICATIONS #================================================= @@ -59,6 +74,10 @@ ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # NGINX CONFIGURATION #================================================= @@ -67,21 +86,13 @@ ynh_script_progression --message="Configuring NGINX web server..." --weight=2 # Create a dedicated NGINX config ynh_add_nginx_config -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." --weight=2 - -# Create a system user -ynh_system_user_create --username=$app - #================================================= # PHP-FPM CONFIGURATION #================================================= ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 # Create a dedicated PHP-FPM config -ynh_add_fpm_config --package="$extra_php_dependencies" +ynh_add_fpm_config phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= @@ -104,29 +115,25 @@ ynh_script_progression --message="Configuring DokuWiki..." --weight=2 ### Copy YunoHost specific configuration # This File cannot be modified directly by DokuWiki, only by hand or by YunoHost -# It will only be updated by Yunohost package or directly by adventurous users -cp ../conf/local.protected.php $final_path/conf +# It will only be updated by YunoHost package or directly by adventurous users # Create the "admin" group and add the "admin" user ynh_permission_create --permission "admin" --allowed "$admin_user" # Customize admin group in case of multiple wiki install managed by different admins # dokuwiki.admin; dokuwiki__1.admin; etc -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/conf/local.protected.php" - +ynh_add_config --template="../conf/local.protected.php" --destination="$final_path/conf/local.protected.php" # This file might be modified by DokuWiki admin panel or by plugins # It will not be modified by Yunohost in order to keep user settings -cp ../conf/local.php $final_path/conf # Set the "language" -ynh_replace_string --match_string="__YNH_LANGUAGE__" --replace_string="$language" --target_file="$final_path/conf/local.php" - +ynh_add_config --template="../conf/local.php" --destination="$final_path/conf/local.php" # Restrict user rights by enforcing "read-only" mode for all users # See https://www.dokuwiki.org/acl#background_info # Default is "8" -cp ../conf/acl.auth.php $final_path/conf +ynh_add_config --template="../conf/acl.auth.php" --destination="$final_path/conf/acl.auth.php" #================================================= # CREATE DEFAULT FILES @@ -156,7 +163,7 @@ cp ../conf/plugins.local.php $final_path/conf/plugins.local.php.bak #================================================= # Calculate and store the config file checksum into the app settings -ynh_store_file_checksum --file="$final_path/conf/local.protected.php" +#ynh_store_file_checksum --file="$final_path/conf/local.protected.php" ### Files '$final_path/conf/local.php' and '$final_path/conf/acl.auth.php' can be modified by user, no need to store checksum as they cannot be overwritten safely by the upgrade script #================================================= @@ -166,48 +173,48 @@ ynh_script_progression --message="Installing logautherror plugin for Fail2Ban... ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror -#================================================= -# GENERIC FINALIZATION -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= +# #================================================= +# # GENERIC FINALIZATION +# #================================================= +# # SECURE FILES AND DIRECTORIES +# #================================================= -# Try to use "least privilege" to grant minimal access -# For details, see https://www.dokuwiki.org/install:permissions +# # Try to use "least privilege" to grant minimal access +# # For details, see https://www.dokuwiki.org/install:permissions -# Files owned by DokuWiki can just read -chown -R root: $final_path +# # Files owned by DokuWiki can just read +# chown -R root: $final_path -# DokuWiki needs to write inside these folders. Make "DokuWiki" owner -chown $app:root $final_path/{conf,inc} +# # DokuWiki needs to write inside these folders. Make "DokuWiki" owner +# chown $app:root $final_path/{conf,inc} -# Make "DokuWiki" owner of configuration files that must be writable -chown $app:root $final_path/conf/{local.php,local.php.bak,users.auth.php,acl.auth.php,plugins.local.php,plugins.local.php.bak} +# # Make "DokuWiki" owner of configuration files that must be writable +# chown $app:root $final_path/conf/{local.php,local.php.bak,users.auth.php,acl.auth.php,plugins.local.php,plugins.local.php.bak} -# Usefull for some plugins like https://www.dokuwiki.org/plugin:siteexport -# See https://www.dokuwiki.org/devel:preload -chown $app:root $final_path/inc/preload.php +# # Usefull for some plugins like https://www.dokuwiki.org/plugin:siteexport +# # See https://www.dokuwiki.org/devel:preload +# chown $app:root $final_path/inc/preload.php -# Grant read-only to all files as files copied above are owned by root by defaut and nginx cannot read them -# There are only files in the folder and there are no sublevels. No need to use "find" -chmod -R a+r $final_path/{conf,inc} +# # Grant read-only to all files as files copied above are owned by root by defaut and nginx cannot read them +# # There are only files in the folder and there are no sublevels. No need to use "find" +# chmod -R a+r $final_path/{conf,inc} -# Give write access to "data" and subfolders -chown -R $app:root $final_path/data -# Remove access to "other" -chmod -R o-rwx $final_path/data +# # Give write access to "data" and subfolders +# chown -R $app:root $final_path/data +# # Remove access to "other" +# chmod -R o-rwx $final_path/data -# Allow the web admin panel to run, aka "Extension Manager" -chown -R $app:root $final_path/lib/plugins -# Allow to install templates -chown -R $app:root $final_path/lib/tpl +# # Allow the web admin panel to run, aka "Extension Manager" +# chown -R $app:root $final_path/lib/plugins +# # Allow to install templates +# chown -R $app:root $final_path/lib/tpl -# Allow access to public assets like style sheets -find $final_path/lib -type f -print0 | xargs -0 chmod 0644 -find $final_path/lib -type d -print0 | xargs -0 chmod 0755 -# Using "find" instead of "chmod -R 755" so files does not become executable too -# chmod : -rwxr-xr-x 1 root root 241 May 3 08:36 index.html => BAD -# find : -rw-r--r-- 1 1001 1002 241 May 3 08:36 index.html => GOOD +# # Allow access to public assets like style sheets +# find $final_path/lib -type f -print0 | xargs -0 chmod 0644 +# find $final_path/lib -type d -print0 | xargs -0 chmod 0755 +# # Using "find" instead of "chmod -R 755" so files does not become executable too +# # chmod : -rwxr-xr-x 1 root root 241 May 3 08:36 index.html => BAD +# # find : -rw-r--r-- 1 1001 1002 241 May 3 08:36 index.html => GOOD #================================================= # SETUP FAIL2BAN diff --git a/scripts/restore b/scripts/restore index 213eb9f..c9a1bbe 100755 --- a/scripts/restore +++ b/scripts/restore @@ -33,8 +33,6 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=2 -ynh_webpath_available --domain=$domain --path_url=$path_url \ - || ynh_die --message="Path not available: ${domain}${path_url}" test ! -d $final_path \ || ynh_die --message="There is already a directory: $final_path " @@ -46,6 +44,14 @@ test ! -d $final_path \ 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..." --weight=2 + +# Create the dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # RESTORE THE APP MAIN DIR #================================================= @@ -53,38 +59,34 @@ ynh_script_progression --message="Restoring the app main directory..." ynh_restore_file --origin_path="$final_path" -#================================================= -# RECREATE THE DEDICATED USER -#================================================= -ynh_script_progression --message="Recreating the dedicated system user..." --weight=2 +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" -# Create the dedicated user (if not existing) -ynh_system_user_create --username=$app +# #================================================= +# # RESTORE USER RIGHTS +# #================================================= -#================================================= -# RESTORE USER RIGHTS -#================================================= +# # Try to use "least privilege" to grant minimal access +# # For details, see https://www.dokuwiki.org/install:permissions -# Try to use "least privilege" to grant minimal access -# For details, see https://www.dokuwiki.org/install:permissions +# # DokuWiki needs to write inside these folders. Make "DokuWiki" owner +# chown $app:root $final_path/{conf,inc} -# DokuWiki needs to write inside these folders. Make "DokuWiki" owner -chown $app:root $final_path/{conf,inc} +# # Make "DokuWiki" owner of configuration files that must be writable +# chown $app:root $final_path/conf/{local.php,local.php.bak,users.auth.php,acl.auth.php,plugins.local.php,plugins.local.php.bak} -# Make "DokuWiki" owner of configuration files that must be writable -chown $app:root $final_path/conf/{local.php,local.php.bak,users.auth.php,acl.auth.php,plugins.local.php,plugins.local.php.bak} +# # Usefull for some plugins like https://www.dokuwiki.org/plugin:siteexport +# # See https://www.dokuwiki.org/devel:preload +# chown $app:root $final_path/inc/preload.php -# Usefull for some plugins like https://www.dokuwiki.org/plugin:siteexport -# See https://www.dokuwiki.org/devel:preload -chown $app:root $final_path/inc/preload.php +# # Give write access to "data" and subfolders +# chown -R $app:root $final_path/data -# Give write access to "data" and subfolders -chown -R $app:root $final_path/data - -# Allow the web admin panel to run, aka "Extension Manager" -chown -R $app:root $final_path/lib/plugins -# Allow to install templates -chown -R $app:root $final_path/lib/tpl +# # Allow the web admin panel to run, aka "Extension Manager" +# chown -R $app:root $final_path/lib/plugins +# # Allow to install templates +# chown -R $app:root $final_path/lib/tpl #================================================= # RESTORE THE PHP-FPM CONFIGURATION @@ -93,7 +95,15 @@ ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=5 ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -ynh_add_fpm_config --package="$extra_php_dependencies" +ynh_add_fpm_config + +#================================================= +# REINSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Reinstalling dependencies..." --weight=1 + +# Define and install dependencies +ynh_install_app_dependencies $pkg_dependencies #================================================= # RESTORE FAIL2BAN CONFIGURATION diff --git a/scripts/upgrade b/scripts/upgrade index 34daf6f..548e11b 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -20,6 +20,7 @@ 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) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +language=$(ynh_app_setting_get --app=$app --key=language) #================================================= # CHECK VERSION @@ -27,6 +28,20 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) 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)..." --weight=9 + +# 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 #================================================= @@ -67,8 +82,6 @@ if ynh_legacy_permissions_exists; then ynh_app_setting_delete --app=$app --key=is_public fi - - # Yunohost specific configuration, if it isn't exist already # Previously, these settings were store in an unique "dokuwiki.php" @@ -95,17 +108,15 @@ fi # Do not overwrite existing dokuwiki configuration as it could have user customization's and settings. # Create file if it does not exist if [ ! -f "$final_path/conf/local.php" ]; then - cp ../conf/local.php $final_path/conf - # Set the default "language" - ynh_replace_string --match_string="__YNH_LANGUAGE__" --replace_string="$language" --target_file="$final_path/conf/local.php" + ynh_add_config --template="../conf/local.php" --destination="$final_path/conf/local.php" fi # Do not overwrite existing ACL configuration file as it could have user customization's and settings. # Create file if it does not exist # See https://www.dokuwiki.org/acl#background_info if [ ! -f "$final_path/conf/acl.auth.php" ]; then - cp ../conf/acl.auth.php $final_path/conf + ynh_add_config --template="../conf/acl.auth.php" --destination="$final_path/conf/acl.auth.php" fi # For securing DokuWiki installation, create default files that will be writable in the "conf" folder. @@ -145,18 +156,12 @@ if [ ! -f "$final_path/inc/preload.php" ]; then fi #================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +# CREATE DEDICATED USER #================================================= -ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=9 +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 -# 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 +# Create a system user +ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= # STANDARD UPGRADE STEPS @@ -172,6 +177,10 @@ then ynh_setup_source --dest_dir="$final_path" fi +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # NGINX CONFIGURATION #================================================= @@ -181,20 +190,19 @@ ynh_script_progression --message="Upgrading NGINX web server configuration..." - ynh_add_nginx_config #================================================= -# CREATE DEDICATED USER +# UPGRADE DEPENDENCIES #================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." +ynh_script_progression --message="Upgrading dependencies..." --weight=1 -# Create a system user -ynh_system_user_create --username=$app +ynh_install_app_dependencies $pkg_dependencies #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading PHP-FPM configuration..." +ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 # Create a dedicated PHP-FPM config -ynh_add_fpm_config --package="$extra_php_dependencies" +ynh_add_fpm_config #================================================= # SPECIFIC UPGRADE @@ -291,48 +299,48 @@ ynh_script_progression --message="Upgrading logautherror plugin for Fail2Ban..." ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror -#================================================= -# GENERIC FINALIZATION -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= +# #================================================= +# # GENERIC FINALIZATION +# #================================================= +# # SECURE FILES AND DIRECTORIES +# #================================================= -# Try to use "least privilege" to grant minimal access -# For details, see https://www.dokuwiki.org/install:permissions +# # Try to use "least privilege" to grant minimal access +# # For details, see https://www.dokuwiki.org/install:permissions -# Files owned by DokuWiki can just read -chown -R root: $final_path +# # Files owned by DokuWiki can just read +# chown -R root: $final_path -# DokuWiki needs to write inside these folders. Make "DokuWiki" owner -chown $app:root $final_path/{conf,inc} +# # DokuWiki needs to write inside these folders. Make "DokuWiki" owner +# chown $app:root $final_path/{conf,inc} -# Make "DokuWiki" owner of configuration files that must be writable -chown $app:root $final_path/conf/{local.php,local.php.bak,users.auth.php,acl.auth.php,plugins.local.php,plugins.local.php.bak} +# # Make "DokuWiki" owner of configuration files that must be writable +# chown $app:root $final_path/conf/{local.php,local.php.bak,users.auth.php,acl.auth.php,plugins.local.php,plugins.local.php.bak} -# Usefull for some plugins like https://www.dokuwiki.org/plugin:siteexport -# See https://www.dokuwiki.org/devel:preload -chown $app:root $final_path/inc/preload.php +# # Usefull for some plugins like https://www.dokuwiki.org/plugin:siteexport +# # See https://www.dokuwiki.org/devel:preload +# chown $app:root $final_path/inc/preload.php -# Grant read-only to all files as files copied above are owned by root by defaut and nginx cannot read them -# There are only files in the folder and there are no sublevels. No need to use "find" -chmod -R a+r $final_path/{conf,inc} +# # Grant read-only to all files as files copied above are owned by root by defaut and nginx cannot read them +# # There are only files in the folder and there are no sublevels. No need to use "find" +# chmod -R a+r $final_path/{conf,inc} -# Give write access to "data" and subfolders -chown -R $app:root $final_path/data -# Remove access to "other" -chmod -R o-rwx $final_path/data +# # Give write access to "data" and subfolders +# chown -R $app:root $final_path/data +# # Remove access to "other" +# chmod -R o-rwx $final_path/data -# Allow the web admin panel to run, aka "Extension Manager" -chown -R $app:root $final_path/lib/plugins -# Allow to install templates -chown -R $app:root $final_path/lib/tpl +# # Allow the web admin panel to run, aka "Extension Manager" +# chown -R $app:root $final_path/lib/plugins +# # Allow to install templates +# chown -R $app:root $final_path/lib/tpl -# Allow access to public assets like style sheets -find $final_path/lib -type f -print0 | xargs -0 chmod 0644 -find $final_path/lib -type d -print0 | xargs -0 chmod 0755 -# Using "find" instead of "chmod -R 755" so files does not become executable too -# chmod : -rwxr-xr-x 1 root root 241 May 3 08:36 index.html => BAD -# find : -rw-r--r-- 1 1001 1002 241 May 3 08:36 index.html => GOOD +# # Allow access to public assets like style sheets +# find $final_path/lib -type f -print0 | xargs -0 chmod 0644 +# find $final_path/lib -type d -print0 | xargs -0 chmod 0755 +# # Using "find" instead of "chmod -R 755" so files does not become executable too +# # chmod : -rwxr-xr-x 1 root root 241 May 3 08:36 index.html => BAD +# # find : -rw-r--r-- 1 1001 1002 241 May 3 08:36 index.html => GOOD #================================================= # SETUP FAIL2BAN From 2bf7151585655efe972a49923fb4aca4f126536a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 29 Nov 2021 16:20:31 +0100 Subject: [PATCH 076/144] Delete .DS_Store --- .DS_Store | Bin 8196 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index e6edef11a67974d19614e1d78412c927cc10eefd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMTWl0n7(U;&z>FQ*DWH^f!G&52T0_gFS~0NgmP?`7+HGkI*kyKSgbCA`Iy1Wk zD`w-1M#VS0pfN!OHTd8Ic!{?}G$F?LAT?ehKKR0mi7(>y#sAEiElA;s#E>v2ne&}F z|K-g2&bM=NW*KAXDCjMW)iK5-x;Uy;R9&WUJHMutSlBaz5ERe6v7F`P=p0sekS(#0_qVo6}|>Yyq(0uWYG zcTlLU@&;it#8ikSfn=cq5lSdR5gsuh!l^$Q`lUiF2^8TB;o$?}$Oum;2u7#;$-tc< zB`~TZ1|kNgGr-U86-;Li%jd=~KEGS0=QlThhge1BjG40}`36~$t7YYZ%pPYv<7(Jb+n#h>Ck<;8kQ}_4u8}@q3C>nN;+pYPAyMsITJB~#TqOIk&nZ|flotJiOUo&mP z4f2T`I|of$cg8!Mf~|Xjf0#UI_iFwg$|KjOj8ZTUS(3AA-NeMom8+YQEiG*anvxTD zuWV~dwzjq$I3P>Xg2oMfBZbGFIsD>lM~}V!=_xULgl`a5EAFT2&!`nrVR^;0_>>WQ zJ2xh%_~8N-Rm$x6rmjt!wE zds($MuUYwmMeMX&R>pkTpuQR}?>d&%>v$$lGd$!Q`+RPjW*XY=Ij)}$k`0-ZUwEkn z&*(EKsaZ5SDYd6UK3+XPvAE&(<*VA(rYCFE+BtLQDav*t+V;%{O~V}+=PNd>d3nRu zO?&rX(e%umW%S$Hs8Nf*WjTndTM&;A6>{c71=HWJ)=N^*yKqrl*{Rb=TOFNe)76ub z@L#eh9^b(&Y1g1y4+Cy%j4S;fO-a>4$2*!7rGGCixax&NHMc170ZYpnma5BQoYk#L ze6T23Rkwtl_pDLkLwRR(l&0dr+cbGnjXMDkbh@+Kv{o6|9qWvt7((6YL;+o*iK)*gNc9c8Yz;zGY|GIrc02 zjs3y?WPc%sD$GVTYEXv;G-4^1VFlJ=9a8ARedxvg=)(@|LJoQ87=?!diWo-;PvA*B zg{N@{FXISa!K-)+AK)W=j8AYHU*ilW@eO{$IsAh2;sIl26>k;yw=2I4|1_X zmsfFOlMT!6TyfXE?NdvC$zuOUj~7cY(47!gAh@!if)$@6 zf!~~1sN7Q4|E0f+0g|Y(PvSaLX9@2miCZO-mMR6eN@Jo*CjARrW1>lt)R?d=PqfG+ zc(p>lf?{`lYF4lm#^ zUcylv!y9-L$8iED@gCkM;eLqE@fC^o$4jKzT^6Z8oV_5`V#c*C$KFjnT-dXiM>|r1 zet3CiFi-dLR*trjvgSp6R9__n6(YWlpa0ii`TPG>juM4O3`7iE%M75hGt=2YPk5#G zD?e)|>DomXFWj#rFbJV4IF1tr$8o}`KMbjzBv&4j3b7=RdZ_&G9|H7f|Bv?nKzi48 F^)F}XGsOS^ From 12ea5672475261c3c9bda0b8784a8557c4beaa2c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 29 Nov 2021 16:21:09 +0100 Subject: [PATCH 077/144] Delete .DS_Store --- doc/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 doc/.DS_Store diff --git a/doc/.DS_Store b/doc/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Mon, 29 Nov 2021 16:24:37 +0100 Subject: [PATCH 078/144] Bump package version --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 34e257c..b1002bf 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Sistema de Wiki de uso sencillicimo y compatible con los estándares", "it": "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" }, - "version": "2020.07.29~ynh4", + "version": "2020.07.29~ynh5", "url": "https://www.dokuwiki.org", "upstream": { "license": "GPL-2.0-or-later", From c6d829166c738e88d560e7909b153476a69a89cc Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Mon, 29 Nov 2021 15:24:51 +0000 Subject: [PATCH 079/144] 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 1c93c23..0a1c955 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... -**Shipped version:** 2020.07.29~ynh4 +**Shipped version:** 2020.07.29~ynh5 **Demo:** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo diff --git a/README_fr.md b/README_fr.md index 7607167..ff4e6c5 100644 --- a/README_fr.md +++ b/README_fr.md @@ -21,7 +21,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Lors de la mise à jour, les plugins officiels sont également mis à jour. Nous vous recommandons toutefois de vérifier le bon fonctionnement des plugins dans le panneau d'administration après cette opération. Nous ne pouvons pas savoir si des plugins spéciaux posent problèmes... -**Version incluse :** 2020.07.29~ynh4 +**Version incluse :** 2020.07.29~ynh5 **Démo :** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo From af11cd726296f7c85daf119cb41d541ddd778b14 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Wed, 8 Dec 2021 21:59:05 +0100 Subject: [PATCH 080/144] Add config panel --- config_panel.toml | 25 +++++++++++++ scripts/config | 95 +++++++++++++++++++++++++++++++++++++++++++++++ scripts/install | 2 +- scripts/restore | 6 ++- scripts/upgrade | 17 ++++++++- 5 files changed, 142 insertions(+), 3 deletions(-) create mode 100644 config_panel.toml create mode 100644 scripts/config diff --git a/config_panel.toml b/config_panel.toml new file mode 100644 index 0000000..3abba52 --- /dev/null +++ b/config_panel.toml @@ -0,0 +1,25 @@ +version = "1.0" + +[main] +name = "Dokuwiki configuration" + + [main.php_fpm_config] + name = "PHP-FPM configuration" + + [main.php_fpm_config.fpm_footprint] + ask = "Memory footprint of the service?" + choices = ["low", "medium", "high", "specific"] + default = "low" + help = "low <= 20Mb per pool. medium between 20Mb and 40Mb per pool. high > 40Mb per pool.
Use specific to set a value with the following option." + + [main.php_fpm_config.free_footprint] + ask = "Memory footprint of the service?" + type = "number" + default = "0" + help = "Free field to specify exactly the footprint in Mb if you don't want to use one of the three previous values." + + [main.php_fpm_config.fpm_usage] + ask = "Expected usage of the service?" + choices = ["low", "medium", "high"] + default = "low" + help = "low: Personal usage, behind the SSO. No RAM footprint when not used, but the impact on the processor can be high if many users are using the service.
medium: Low usage, few people or/and publicly accessible. Low RAM footprint, medium processor footprint when used.
high: High usage, frequently visited website. High RAM footprint, but lower on processor usage and quickly responding." diff --git a/scripts/config b/scripts/config new file mode 100644 index 0000000..3440bd2 --- /dev/null +++ b/scripts/config @@ -0,0 +1,95 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +ynh_abort_if_errors + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +current_fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) + +#================================================= +# SPECIFIC GETTERS FOR TOML SHORT KEY +#================================================= + +get__fpm_footprint() { + # Free footprint value for php-fpm + # Check if current_fpm_footprint is an integer + if [ "$current_fpm_footprint" -eq "$current_fpm_footprint" ] 2> /dev/null + then + echo "specific" + else + echo "$current_fpm_footprint" + fi +} + +get__free_footprint() { + # Free footprint value for php-fpm + # Check if current_fpm_footprint is an integer + if [ "$current_fpm_footprint" -eq "$current_fpm_footprint" ] 2> /dev/null + then + # If current_fpm_footprint is an integer, that's a numeric value for the footprint + echo "$current_fpm_footprint" + else + echo "0" + fi +} + +#================================================= +# SPECIFIC SETTERS FOR TOML SHORT KEYS +#================================================= + +set__fpm_footprint() { + if [ "$fpm_footprint" != "specific" ] + then + ynh_app_setting_set --app=$app --key=fpm_footprint --value="$fpm_footprint" + fi +} + +set__free_footprint() { + if [ "$fpm_footprint" = "specific" ] + then + ynh_app_setting_set --app=$app --key=fpm_footprint --value="$free_footprint" + fi +} + +#================================================= +# GENERIC FINALIZATION +#================================================= + +ynh_app_config_validate() { + _ynh_app_config_validate + + if [ "${changed[fpm_usage]}" == "true" ] || [ "${changed[fpm_footprint]}" == "true" ] || [ "${changed[free_footprint]}" == "true" ]; then + # If fpm_footprint is set to 'specific', use $free_footprint value. + if [ "$fpm_footprint" = "specific" ] + then + fpm_footprint=$free_footprint + fi + + if [ "$fpm_footprint" == "0" ] + then + ynh_print_err --message="When selecting 'specific', you have to set a footprint value into the field below." + + exit 0 + fi + fi +} + +ynh_app_config_apply() { + _ynh_app_config_apply + + ynh_add_fpm_config --phpversion=$phpversion --usage=$fpm_usage --footprint=$fpm_footprint +} + +ynh_app_config_run $1 diff --git a/scripts/install b/scripts/install index f887690..0f75316 100755 --- a/scripts/install +++ b/scripts/install @@ -92,7 +92,7 @@ ynh_add_nginx_config ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 # Create a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_add_fpm_config --usage=low --footprint=low phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= diff --git a/scripts/restore b/scripts/restore index c9a1bbe..7131e35 100755 --- a/scripts/restore +++ b/scripts/restore @@ -28,6 +28,9 @@ path_url=$(ynh_app_setting_get --app=$app --key=path) final_path=$(ynh_app_setting_get --app=$app --key=final_path) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) +fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) + #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= @@ -95,7 +98,8 @@ ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=5 ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -ynh_add_fpm_config +# Recreate a dedicated php-fpm config +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion #================================================= # REINSTALL DEPENDENCIES diff --git a/scripts/upgrade b/scripts/upgrade index 548e11b..a5ee7cf 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -22,6 +22,9 @@ final_path=$(ynh_app_setting_get --app=$app --key=final_path) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) language=$(ynh_app_setting_get --app=$app --key=language) +fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) +fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) + #================================================= # CHECK VERSION #================================================= @@ -59,6 +62,18 @@ if [ -z "$language" ]; then ynh_app_setting_set --app=$app --key=language --value=$language fi +# If fpm_footprint doesn't exist, create it +if [ -z "$fpm_footprint" ]; then + fpm_footprint=low + ynh_app_setting_set --app=$app --key=fpm_footprint --value=$fpm_footprint +fi + +# If fpm_usage doesn't exist, create it +if [ -z "$fpm_usage" ]; then + fpm_usage=low + ynh_app_setting_set --app=$app --key=fpm_usage --value=$fpm_usage +fi + # Cleaning legacy permissions admin_user=$(ynh_app_setting_get --app=$app --key=admin) @@ -202,7 +217,7 @@ ynh_install_app_dependencies $pkg_dependencies ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 # Create a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_add_fpm_config --phpversion=$phpversion --usage=$fpm_usage --footprint=$fpm_footprint #================================================= # SPECIFIC UPGRADE From 6d2b98381bf6badcd9264b8291172f0eafbe9e85 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 18 Jan 2022 19:10:08 +0100 Subject: [PATCH 081/144] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index b1002bf..02c097c 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Sistema de Wiki de uso sencillicimo y compatible con los estándares", "it": "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" }, - "version": "2020.07.29~ynh5", + "version": "2020.07.29~ynh6", "url": "https://www.dokuwiki.org", "upstream": { "license": "GPL-2.0-or-later", From ec2f9e5265ae69343772ba6e722b60a66f96447a Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 18 Jan 2022 18:10:18 +0000 Subject: [PATCH 082/144] 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 0a1c955..45ad289 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... -**Shipped version:** 2020.07.29~ynh5 +**Shipped version:** 2020.07.29~ynh6 **Demo:** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo diff --git a/README_fr.md b/README_fr.md index ff4e6c5..7dfdb64 100644 --- a/README_fr.md +++ b/README_fr.md @@ -21,7 +21,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Lors de la mise à jour, les plugins officiels sont également mis à jour. Nous vous recommandons toutefois de vérifier le bon fonctionnement des plugins dans le panneau d'administration après cette opération. Nous ne pouvons pas savoir si des plugins spéciaux posent problèmes... -**Version incluse :** 2020.07.29~ynh5 +**Version incluse :** 2020.07.29~ynh6 **Démo :** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo From 054162302af0251f1f766618dff25a1a1e5f9a2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 18 Jan 2022 19:11:29 +0100 Subject: [PATCH 083/144] Add config panel (#89) * Add config panel --- README.md | 2 +- README_fr.md | 2 +- config_panel.toml | 25 +++++++++++++ manifest.json | 2 +- scripts/config | 95 +++++++++++++++++++++++++++++++++++++++++++++++ scripts/install | 2 +- scripts/restore | 6 ++- scripts/upgrade | 17 ++++++++- 8 files changed, 145 insertions(+), 6 deletions(-) create mode 100644 config_panel.toml create mode 100644 scripts/config diff --git a/README.md b/README.md index 0a1c955..45ad289 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... -**Shipped version:** 2020.07.29~ynh5 +**Shipped version:** 2020.07.29~ynh6 **Demo:** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo diff --git a/README_fr.md b/README_fr.md index ff4e6c5..7dfdb64 100644 --- a/README_fr.md +++ b/README_fr.md @@ -21,7 +21,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Lors de la mise à jour, les plugins officiels sont également mis à jour. Nous vous recommandons toutefois de vérifier le bon fonctionnement des plugins dans le panneau d'administration après cette opération. Nous ne pouvons pas savoir si des plugins spéciaux posent problèmes... -**Version incluse :** 2020.07.29~ynh5 +**Version incluse :** 2020.07.29~ynh6 **Démo :** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo diff --git a/config_panel.toml b/config_panel.toml new file mode 100644 index 0000000..3abba52 --- /dev/null +++ b/config_panel.toml @@ -0,0 +1,25 @@ +version = "1.0" + +[main] +name = "Dokuwiki configuration" + + [main.php_fpm_config] + name = "PHP-FPM configuration" + + [main.php_fpm_config.fpm_footprint] + ask = "Memory footprint of the service?" + choices = ["low", "medium", "high", "specific"] + default = "low" + help = "low <= 20Mb per pool. medium between 20Mb and 40Mb per pool. high > 40Mb per pool.
Use specific to set a value with the following option." + + [main.php_fpm_config.free_footprint] + ask = "Memory footprint of the service?" + type = "number" + default = "0" + help = "Free field to specify exactly the footprint in Mb if you don't want to use one of the three previous values." + + [main.php_fpm_config.fpm_usage] + ask = "Expected usage of the service?" + choices = ["low", "medium", "high"] + default = "low" + help = "low: Personal usage, behind the SSO. No RAM footprint when not used, but the impact on the processor can be high if many users are using the service.
medium: Low usage, few people or/and publicly accessible. Low RAM footprint, medium processor footprint when used.
high: High usage, frequently visited website. High RAM footprint, but lower on processor usage and quickly responding." diff --git a/manifest.json b/manifest.json index b1002bf..02c097c 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Sistema de Wiki de uso sencillicimo y compatible con los estándares", "it": "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" }, - "version": "2020.07.29~ynh5", + "version": "2020.07.29~ynh6", "url": "https://www.dokuwiki.org", "upstream": { "license": "GPL-2.0-or-later", diff --git a/scripts/config b/scripts/config new file mode 100644 index 0000000..3440bd2 --- /dev/null +++ b/scripts/config @@ -0,0 +1,95 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +ynh_abort_if_errors + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +current_fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) + +#================================================= +# SPECIFIC GETTERS FOR TOML SHORT KEY +#================================================= + +get__fpm_footprint() { + # Free footprint value for php-fpm + # Check if current_fpm_footprint is an integer + if [ "$current_fpm_footprint" -eq "$current_fpm_footprint" ] 2> /dev/null + then + echo "specific" + else + echo "$current_fpm_footprint" + fi +} + +get__free_footprint() { + # Free footprint value for php-fpm + # Check if current_fpm_footprint is an integer + if [ "$current_fpm_footprint" -eq "$current_fpm_footprint" ] 2> /dev/null + then + # If current_fpm_footprint is an integer, that's a numeric value for the footprint + echo "$current_fpm_footprint" + else + echo "0" + fi +} + +#================================================= +# SPECIFIC SETTERS FOR TOML SHORT KEYS +#================================================= + +set__fpm_footprint() { + if [ "$fpm_footprint" != "specific" ] + then + ynh_app_setting_set --app=$app --key=fpm_footprint --value="$fpm_footprint" + fi +} + +set__free_footprint() { + if [ "$fpm_footprint" = "specific" ] + then + ynh_app_setting_set --app=$app --key=fpm_footprint --value="$free_footprint" + fi +} + +#================================================= +# GENERIC FINALIZATION +#================================================= + +ynh_app_config_validate() { + _ynh_app_config_validate + + if [ "${changed[fpm_usage]}" == "true" ] || [ "${changed[fpm_footprint]}" == "true" ] || [ "${changed[free_footprint]}" == "true" ]; then + # If fpm_footprint is set to 'specific', use $free_footprint value. + if [ "$fpm_footprint" = "specific" ] + then + fpm_footprint=$free_footprint + fi + + if [ "$fpm_footprint" == "0" ] + then + ynh_print_err --message="When selecting 'specific', you have to set a footprint value into the field below." + + exit 0 + fi + fi +} + +ynh_app_config_apply() { + _ynh_app_config_apply + + ynh_add_fpm_config --phpversion=$phpversion --usage=$fpm_usage --footprint=$fpm_footprint +} + +ynh_app_config_run $1 diff --git a/scripts/install b/scripts/install index f887690..0f75316 100755 --- a/scripts/install +++ b/scripts/install @@ -92,7 +92,7 @@ ynh_add_nginx_config ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 # Create a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_add_fpm_config --usage=low --footprint=low phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= diff --git a/scripts/restore b/scripts/restore index c9a1bbe..7131e35 100755 --- a/scripts/restore +++ b/scripts/restore @@ -28,6 +28,9 @@ path_url=$(ynh_app_setting_get --app=$app --key=path) final_path=$(ynh_app_setting_get --app=$app --key=final_path) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) +fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) + #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= @@ -95,7 +98,8 @@ ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=5 ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -ynh_add_fpm_config +# Recreate a dedicated php-fpm config +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion #================================================= # REINSTALL DEPENDENCIES diff --git a/scripts/upgrade b/scripts/upgrade index 548e11b..a5ee7cf 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -22,6 +22,9 @@ final_path=$(ynh_app_setting_get --app=$app --key=final_path) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) language=$(ynh_app_setting_get --app=$app --key=language) +fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) +fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) + #================================================= # CHECK VERSION #================================================= @@ -59,6 +62,18 @@ if [ -z "$language" ]; then ynh_app_setting_set --app=$app --key=language --value=$language fi +# If fpm_footprint doesn't exist, create it +if [ -z "$fpm_footprint" ]; then + fpm_footprint=low + ynh_app_setting_set --app=$app --key=fpm_footprint --value=$fpm_footprint +fi + +# If fpm_usage doesn't exist, create it +if [ -z "$fpm_usage" ]; then + fpm_usage=low + ynh_app_setting_set --app=$app --key=fpm_usage --value=$fpm_usage +fi + # Cleaning legacy permissions admin_user=$(ynh_app_setting_get --app=$app --key=admin) @@ -202,7 +217,7 @@ ynh_install_app_dependencies $pkg_dependencies ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 # Create a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_add_fpm_config --phpversion=$phpversion --usage=$fpm_usage --footprint=$fpm_footprint #================================================= # SPECIFIC UPGRADE From 719fa4d2c1f87e988ed6aaa27b9e16a23d6094a0 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 20 Mar 2022 18:38:33 +0100 Subject: [PATCH 084/144] Update config --- scripts/config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/config b/scripts/config index 3440bd2..8a9110c 100644 --- a/scripts/config +++ b/scripts/config @@ -57,7 +57,7 @@ set__fpm_footprint() { } set__free_footprint() { - if [ "$fpm_footprint" = "specific" ] + if [ "$fpm_footprint" == "specific" ] then ynh_app_setting_set --app=$app --key=fpm_footprint --value="$free_footprint" fi @@ -72,7 +72,7 @@ ynh_app_config_validate() { if [ "${changed[fpm_usage]}" == "true" ] || [ "${changed[fpm_footprint]}" == "true" ] || [ "${changed[free_footprint]}" == "true" ]; then # If fpm_footprint is set to 'specific', use $free_footprint value. - if [ "$fpm_footprint" = "specific" ] + if [ "$fpm_footprint" == "specific" ] then fpm_footprint=$free_footprint fi From 36d28d3c45664c04900125ac698efbce09c0d666 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 3 Jun 2022 23:08:22 +0000 Subject: [PATCH 085/144] Auto-update README --- README.md | 19 ++++++++++--------- README_fr.md | 25 +++++++++++++++---------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 45ad289..6b752a3 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ It shall NOT be edited by hand. # Dokuwiki for YunoHost -[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Working status](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) [![Install Dokuwiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* @@ -31,7 +31,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Screenshots -![](./doc/screenshots/DokuWiki_Screenshot.png) +![Screenshot of Dokuwiki](./doc/screenshots/DokuWiki_Screenshot.png) ## Disclaimers / important information @@ -41,21 +41,22 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Documentation and resources -* Official app website: https://www.dokuwiki.org -* Official admin documentation: https://www.dokuwiki.org/manual -* Upstream app code repository: https://github.com/splitbrain/dokuwiki -* YunoHost documentation for this app: https://yunohost.org/app_dokuwiki -* Report a bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues +* Official app website: +* Official admin documentation: +* Upstream app code repository: +* YunoHost documentation for this app: +* Report a bug: ## Developer info Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). To try the testing branch, please proceed like that. -``` + +``` bash sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug or sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ``` -**More info regarding app packaging:** https://yunohost.org/packaging_apps \ No newline at end of file +**More info regarding app packaging:** diff --git a/README_fr.md b/README_fr.md index 7dfdb64..ea9408a 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,10 +1,14 @@ + + # Dokuwiki pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) +[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) [![Installer Dokuwiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) *[Read this readme in english.](./README.md)* -*[Lire ce readme en français.](./README_fr.md)* > *Ce package vous permet d'installer Dokuwiki 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.* @@ -27,7 +31,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Captures d'écran -![](./doc/screenshots/DokuWiki_Screenshot.png) +![Capture d'écran de Dokuwiki](./doc/screenshots/DokuWiki_Screenshot.png) ## Avertissements / informations importantes @@ -37,21 +41,22 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentations et ressources -* Site officiel de l'app : https://www.dokuwiki.org -* Documentation officielle de l'admin : https://www.dokuwiki.org/manual -* Dépôt de code officiel de l'app : https://github.com/splitbrain/dokuwiki -* Documentation YunoHost pour cette app : https://yunohost.org/app_dokuwiki -* Signaler un bug : https://github.com/YunoHost-Apps/dokuwiki_ynh/issues +* Site officiel de l'app : +* Documentation officielle de l'admin : +* Dépôt de code officiel de l'app : +* Documentation YunoHost pour cette app : +* Signaler un bug : ## Informations pour les développeurs Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. -``` + +``` bash sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ou sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ``` -**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file +**Plus d'infos sur le packaging d'applications :** From 5193b0d7d09ead2a145eb30a2321a7a482959204 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sun, 7 Aug 2022 20:11:23 +0200 Subject: [PATCH 086/144] =?UTF-8?q?[autopatch]=20Add=20Common=20Platform?= =?UTF-8?q?=C2=A0Enumeration=20id=20to=20`manifest.json`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manifest.json | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/manifest.json b/manifest.json index 02c097c..123aa0d 100644 --- a/manifest.json +++ b/manifest.json @@ -16,7 +16,8 @@ "website": "https://www.dokuwiki.org", "demo": "https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo", "admindoc": "https://www.dokuwiki.org/manual", - "code": "https://github.com/splitbrain/dokuwiki" + "code": "https://github.com/splitbrain/dokuwiki", + "cpe": "cpe:2.3:a:dokuwiki:dokuwiki" }, "license": "GPL-2.0-or-later", "maintainer": { @@ -24,10 +25,11 @@ "email": "gofannon@riseup.net" }, "previous_maintainers": [ - { - "name": "opi", - "email": "opi@zeropi.net" - }], + { + "name": "opi", + "email": "opi@zeropi.net" + } + ], "requirements": { "yunohost": ">= 4.3.0" }, @@ -37,7 +39,7 @@ "php7.3-fpm" ], "arguments": { - "install" : [ + "install": [ { "name": "domain", "type": "domain" @@ -64,9 +66,12 @@ "en": "Choose the application language", "fr": "Choisissez la langue de l'application" }, - "choices": ["en", "fr"], + "choices": [ + "en", + "fr" + ], "default": "en" } ] } -} +} \ No newline at end of file From f5b13fce99a2085046650863c164f085d5fc21fd Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 18 Aug 2022 19:58:12 +0200 Subject: [PATCH 087/144] bump dokuwiki upstream version --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 78012a6..1fbd62e 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/splitbrain/dokuwiki/archive/release_stable_2020-07-29.tar.gz -SOURCE_SUM=cc1cd9f00095fea327baa79d8f02c904fe1c37bc3f8fd9999eaf646ee9928884 +SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2022-07-31.tgz +SOURCE_SUM=908189bd39f8b9a08654de38e799eb67ae62865265997f3f00e8280de2b45c65 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 02c097c..656581d 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Sistema de Wiki de uso sencillicimo y compatible con los estándares", "it": "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" }, - "version": "2020.07.29~ynh6", + "version": "2022.07.31~ynh1", "url": "https://www.dokuwiki.org", "upstream": { "license": "GPL-2.0-or-later", From e3ef8657a790b4a443cf10e8b92e20fd4f034822 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 18 Aug 2022 20:00:04 +0200 Subject: [PATCH 088/144] apply 'example_ynh' + use php 8.1 PHP7.4 is bulleyes will be EOL "28 Nov 2022" so bump the version and dokuwiki is compatible with PHP 8.X https://www.dokuwiki.org/requirements --- scripts/_common.sh | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 80e5275..52b12cb 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -3,10 +3,26 @@ #================================================= # COMMON VARIABLES #================================================= +# PHP APP SPECIFIC +#================================================= +# Depending on its version, YunoHost uses different default PHP version: +## YunoHost version "11.X" => PHP 7.4 +## YunoHost version "4.X" => PHP 7.3 +# +# This behaviour can be overridden by setting the YNH_PHP_VERSION variable +#YNH_PHP_VERSION=7.3 +#YNH_PHP_VERSION=7.4 +#YNH_PHP_VERSION=8.0 +YNH_PHP_VERSION=8.1 +# For more information, see the PHP application helper: https://github.com/YunoHost/yunohost/blob/dev/helpers/php#L3-L6 +# Or this app package depending on PHP: https://github.com/YunoHost-Apps/grav_ynh/blob/master/scripts/_common.sh +# PHP dependencies used by the app (must be on a single line) +php_dependencies="php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-ldap php${YNH_PHP_VERSION}-gd" +# or, if you do not need a custom YNH_PHP_VERSION: +###php_dependencies="php$YNH_DEFAULT_PHP_VERSION-deb1 php$YNH_DEFAULT_PHP_VERSION-deb2" -YNH_PHP_VERSION="7.3" - -pkg_dependencies="php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-ldap php${YNH_PHP_VERSION}-gd" +# dependencies used by the app (must be on a single line) +pkg_dependencies="$php_dependencies" #================================================= # PERSONAL HELPERS From d9e9f932817a4531a181dcc4dbc4ec5226178135 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 18 Aug 2022 20:46:27 +0200 Subject: [PATCH 089/144] purge plugin "logautherror" (not compatible) --- conf/logautherror.src | 6 ------ scripts/install | 7 ------- scripts/upgrade | 8 ++++++++ 3 files changed, 8 insertions(+), 13 deletions(-) delete mode 100644 conf/logautherror.src diff --git a/conf/logautherror.src b/conf/logautherror.src deleted file mode 100644 index f68bd07..0000000 --- a/conf/logautherror.src +++ /dev/null @@ -1,6 +0,0 @@ -SOURCE_URL=https://github.com/mallchin/dokuwiki_plugin_logautherror/archive/master.zip -SOURCE_SUM=bc51d4da781d0aabab8e086e51f3cb77ac983eb4366f4c8f5247bb863d4a3bb2 -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=zip -SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= diff --git a/scripts/install b/scripts/install index 0f75316..c4bd0ff 100755 --- a/scripts/install +++ b/scripts/install @@ -166,13 +166,6 @@ cp ../conf/plugins.local.php $final_path/conf/plugins.local.php.bak #ynh_store_file_checksum --file="$final_path/conf/local.protected.php" ### Files '$final_path/conf/local.php' and '$final_path/conf/acl.auth.php' can be modified by user, no need to store checksum as they cannot be overwritten safely by the upgrade script -#================================================= -# INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN -#================================================= -ynh_script_progression --message="Installing logautherror plugin for Fail2Ban..." --weight=2 - -ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror - # #================================================= # # GENERIC FINALIZATION # #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index a5ee7cf..3c56493 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -170,6 +170,14 @@ if [ ! -f "$final_path/inc/preload.php" ]; then fi fi +# purge "LOGAUTHERROR PLUGIN" as not compatible and not maintained anymore +# See https://www.dokuwiki.org/plugin:logautherror +if [ -d "$final_path/lib/plugins/logautherror" ]; then + ynh_script_progression --message="Purge "LOGAUTHERROR PLUGIN" as not maintained anymore" --weight=1 + ynh_secure_remove --file "$final_path/lib/plugins/logautherror" +fi + + #================================================= # CREATE DEDICATED USER #================================================= From 3006e4345d7f8c81d0a9dede39ce4e1e273445d1 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 18 Aug 2022 21:47:53 +0200 Subject: [PATCH 090/144] Change method to "automatic upgrade" of plugins --- scripts/_common.sh | 2 +- scripts/upgrade | 30 +++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 52b12cb..07ff399 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -17,7 +17,7 @@ YNH_PHP_VERSION=8.1 # For more information, see the PHP application helper: https://github.com/YunoHost/yunohost/blob/dev/helpers/php#L3-L6 # Or this app package depending on PHP: https://github.com/YunoHost-Apps/grav_ynh/blob/master/scripts/_common.sh # PHP dependencies used by the app (must be on a single line) -php_dependencies="php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-ldap php${YNH_PHP_VERSION}-gd" +php_dependencies="php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-ldap php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-cli" # or, if you do not need a custom YNH_PHP_VERSION: ###php_dependencies="php$YNH_DEFAULT_PHP_VERSION-deb1 php$YNH_DEFAULT_PHP_VERSION-deb2" diff --git a/scripts/upgrade b/scripts/upgrade index 3c56493..46b23af 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -283,15 +283,27 @@ fi # TODO Taken from old "upgrade" script. Should check if it is needed and what it does # Update all plugins - for name_plugin in $(sudo -s cat $final_path/lib/plugins/*/plugin.info.txt | grep url | awk -F ':' '{print $3}'); - do - # Get a official plugin for dokuwiki, not update a no-official - wget -nv --quiet "https://github.com/splitbrain/dokuwiki-plugin-$name_plugin/zipball/master" -O "${name_plugin}.zip" -o /dev/null || true - if [ -s "${name_plugin}.zip" ]; then - unzip ${name_plugin}.zip - cp -a splitbrain-dokuwiki-plugin-${name_plugin}*/. "$final_path/lib/plugins/$name_plugin/" - fi - done + ###for name_plugin in $(sudo -s cat $final_path/lib/plugins/*/plugin.info.txt | grep url | awk -F ':' '{print $3}'); + ###do + ### # Get a official plugin for dokuwiki, not update a no-official + ### wget -nv --quiet "https://github.com/splitbrain/dokuwiki-plugin-$name_plugin/zipball/master" -O "${name_plugin}.zip" -o /dev/null || true + ### if [ -s "${name_plugin}.zip" ]; then + ### unzip ${name_plugin}.zip + ### cp -a splitbrain-dokuwiki-plugin-${name_plugin}*/. "$final_path/lib/plugins/$name_plugin/" + ### fi + ###done + + # if "file" exists and is executable + # Stolen from https://github.com/YunoHost-Apps/grav_ynh/blob/testing/scripts/upgrade#L189 + if [ -x "$final_path/bin/plugin.php" ]; then + pushd "$final_path" + ynh_exec_warn_less ynh_exec_as $app php${YNH_PHP_VERSION} bin/plugin.php --no-colors extension upgrade || ynh_print_warn --message="Automatic plugin upgrade has failed, you can upgrade them from your DokuWiki admin panel." + popd + else + ynh_print_warn --message="Automatic plugin cannot be done, you have to upgrade them from your DokuWiki admin panel." + fi + + fi #================================================= From f1d843f6ca7f5b11a851a29e53d7ce1a5c1a7c2d Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 18 Aug 2022 22:05:52 +0200 Subject: [PATCH 091/144] try to enhance the CI upgrade tests --- check_process | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/check_process b/check_process index 084fa0f..5ff09b0 100644 --- a/check_process +++ b/check_process @@ -14,15 +14,20 @@ setup_private=1 setup_public=1 upgrade=1 - # Laster released version. See https://github.com/YunoHost-Apps/dokuwiki_ynh/commits/master + # Latest released version. See https://github.com/YunoHost-Apps/dokuwiki_ynh/commits/master upgrade=1 from_commit=500a7d3fa9c008a2b75d0f6bec519e41fed97da0 + upgrade=1 from_commit=f45c459b287c8f045c08e65cea412cfc2cae38f4 backup_restore=1 multi_instance=1 change_url=1 + actions=0 + config_panel=0 ;;; Options Email= Notification=none ;;; Upgrade options - ; commit=01add99d3d903ca6d07f863045edf2ba46cf18d5 - name=Create check_process + ; commit=500a7d3fa9c008a2b75d0f6bec519e41fed97da0 + name=[fix] dedicated named location per $app (#63) manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=Yes&language=en& + ; commit=f45c459b287c8f045c08e65cea412cfc2cae38f4 + name=add config panel From 0473c71a35d9f6a5b901c5835a085abaf8ca96db Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 18 Aug 2022 23:57:11 +0200 Subject: [PATCH 092/144] refactor admin permission (move in install script & clean in upgrade) --- scripts/install | 5 +++-- scripts/upgrade | 3 --- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/scripts/install b/scripts/install index c4bd0ff..b00cf76 100755 --- a/scripts/install +++ b/scripts/install @@ -117,8 +117,6 @@ ynh_script_progression --message="Configuring DokuWiki..." --weight=2 # This File cannot be modified directly by DokuWiki, only by hand or by YunoHost # It will only be updated by YunoHost package or directly by adventurous users -# Create the "admin" group and add the "admin" user -ynh_permission_create --permission "admin" --allowed "$admin_user" # Customize admin group in case of multiple wiki install managed by different admins # dokuwiki.admin; dokuwiki__1.admin; etc @@ -221,6 +219,9 @@ ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex #================================================= ynh_script_progression --message="Configuring permissions..." --weight=2 +# Create the "admin" permission and add the "admin_user" to it +ynh_permission_create --permission "admin" --allowed "$admin_user" + # Make app public if necessary if [ $is_public -eq 1 ] then diff --git a/scripts/upgrade b/scripts/upgrade index 46b23af..99c5ed2 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -317,9 +317,6 @@ ynh_backup_if_checksum_is_different --file="$final_path/conf/local.protected.php # Always overwrite local file with the one from package. cp ../conf/local.protected.php $final_path/conf -# Create the "admin" group and add the "admin" user -#ynh_permission_create --permission "admin" --allowed "$admin_user" - # Customize admin group in case of multiple wiki install managed by different admins # dokuwiki.admin; dokuwiki__1.admin; etc ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/conf/local.protected.php" From 4802b254bf137cf5980c24486745a5c62fe1a570 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 18 Aug 2022 23:59:19 +0200 Subject: [PATCH 093/144] fix copied files being owned by root and not app user --- scripts/install | 10 +++++----- scripts/upgrade | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/scripts/install b/scripts/install index b00cf76..4b469df 100755 --- a/scripts/install +++ b/scripts/install @@ -141,20 +141,20 @@ ynh_add_config --template="../conf/acl.auth.php" --destination="$final_path/conf # Other files will be read ony and owned by root. # See https://www.dokuwiki.org/install:permissions -cp $final_path/conf/local.php.dist $final_path/conf/local.php.bak -cp $final_path/conf/users.auth.php.dist $final_path/conf/users.auth.php +cp --archive $final_path/conf/local.php.dist $final_path/conf/local.php.bak +cp --archive $final_path/conf/users.auth.php.dist $final_path/conf/users.auth.php # This file might be used by plugins like https://www.dokuwiki.org/plugin:siteexport # Create it to be more "user friendly" as over the top security is not the main goal here # This file could be use for bad behaviour. # See https://www.dokuwiki.org/devel:preload?s[]=preload -cp $final_path/inc/preload.php.dist $final_path/inc/preload.php +cp --archive $final_path/inc/preload.php.dist $final_path/inc/preload.php # There is no template .dist provided inside DokuWiki installation folder # Create "empty" files to be able to manage linux permissions # Files content is taken from an existing DokuWiki installation -cp ../conf/plugins.local.php $final_path/conf -cp ../conf/plugins.local.php $final_path/conf/plugins.local.php.bak +cp --archive ../conf/plugins.local.php $final_path/conf +cp --archive ../conf/plugins.local.php $final_path/conf/plugins.local.php.bak #================================================= # STORE THE CHECKSUM OF THE CONFIG FILE diff --git a/scripts/upgrade b/scripts/upgrade index 99c5ed2..8e7d452 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -143,22 +143,22 @@ if [ ! -f "$final_path/conf/local.php.bak" ]; then # if template exists if [ -f "$final_path/conf/local.php.dist" ]; then # Copy template to create default file - cp "$final_path/conf/local.php.dist" "$final_path/conf/local.php.bak" + cp --archive "$final_path/conf/local.php.dist" "$final_path/conf/local.php.bak" fi fi if [ ! -f "$final_path/conf/users.auth.php" ]; then if [ -f "$final_path/conf/users.auth.php.dist" ]; then - cp $final_path/conf/users.auth.php.dist $final_path/conf/users.auth.php + cp --archive $final_path/conf/users.auth.php.dist $final_path/conf/users.auth.php fi fi if [ ! -f "$final_path/conf/plugins.local.php" ]; then - cp ../conf/plugins.local.php $final_path/conf + cp --archive ../conf/plugins.local.php $final_path/conf fi if [ ! -f "$final_path/conf/plugins.local.php.bak" ]; then - cp ../conf/plugins.local.php $final_path/conf/plugins.local.php.bak + cp --archive ../conf/plugins.local.php $final_path/conf/plugins.local.php.bak fi @@ -166,7 +166,7 @@ if [ ! -f "$final_path/inc/preload.php" ]; then # if template exists if [ -f "$final_path/inc/preload.php.dist" ]; then # Copy template to create default file - cp "$final_path/inc/preload.php.dist" "$final_path/inc/preload.php" + cp --archive "$final_path/inc/preload.php.dist" "$final_path/inc/preload.php" fi fi @@ -315,7 +315,7 @@ fi ynh_backup_if_checksum_is_different --file="$final_path/conf/local.protected.php" # Always overwrite local file with the one from package. -cp ../conf/local.protected.php $final_path/conf +cp --archive ../conf/local.protected.php $final_path/conf # Customize admin group in case of multiple wiki install managed by different admins # dokuwiki.admin; dokuwiki__1.admin; etc From 03ae0ce55bd26c56631608afd4743ff8c2c16eb0 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Fri, 19 Aug 2022 00:18:36 +0200 Subject: [PATCH 094/144] fix remains of logauth plugins again... --- scripts/upgrade | 7 ------- 1 file changed, 7 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 8e7d452..a9430de 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -324,13 +324,6 @@ ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_fil # Recalculate and store the checksum of the file for the next upgrade. ynh_store_file_checksum --file="$final_path/conf/local.protected.php" -#================================================= -# INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN -#================================================= -ynh_script_progression --message="Upgrading logautherror plugin for Fail2Ban..." --weight=2 - -ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror - # #================================================= # # GENERIC FINALIZATION # #================================================= From 7fcfcdb6e9bff3d30e0ffa9effe3026068565c1e Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sat, 20 Aug 2022 20:14:29 +0200 Subject: [PATCH 095/144] example_ynh: switch nginx and php blocks --- scripts/install | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/install b/scripts/install index 4b469df..e2e2618 100755 --- a/scripts/install +++ b/scripts/install @@ -78,14 +78,6 @@ chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" -#================================================= -# NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Configuring NGINX web server..." --weight=2 - -# Create a dedicated NGINX config -ynh_add_nginx_config - #================================================= # PHP-FPM CONFIGURATION #================================================= @@ -95,6 +87,14 @@ ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 ynh_add_fpm_config --usage=low --footprint=low phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Configuring NGINX web server..." --weight=2 + +# Create a dedicated NGINX config +ynh_add_nginx_config + #================================================= # SPECIFIC SETUP #================================================= From 477ade870d440b98f2b40be6de72246947d7e47b Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 21 Aug 2022 01:14:43 +0200 Subject: [PATCH 096/144] use variables for config "ynh_add_fpm_config" --- scripts/install | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index e2e2618..8f3f517 100755 --- a/scripts/install +++ b/scripts/install @@ -84,8 +84,10 @@ chown -R $app:www-data "$final_path" ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 # Create a dedicated PHP-FPM config -ynh_add_fpm_config --usage=low --footprint=low phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +fpm_usage=low +fpm_footprint=low +ynh_add_fpm_config --usage="$fpm_usage" --footprint="$fpm_footprint" #================================================= # NGINX CONFIGURATION From a81ca1160384f4c7b8daff806ef2d80695f0e26d Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 21 Aug 2022 01:15:46 +0200 Subject: [PATCH 097/144] add 'extra_php-fpm.conf' to custom php config "ynh_add_fpm_config" uses this file at the end of its setup Allows to upload bigger files than default --- conf/extra_php-fpm.conf | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 conf/extra_php-fpm.conf diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf new file mode 100644 index 0000000..db2ca45 --- /dev/null +++ b/conf/extra_php-fpm.conf @@ -0,0 +1,7 @@ +; Additional 'php.ini' parameters for this YunoHost package/application + +; Common values to change to increase file upload limit +; Tips: you need to do modify nginx config too: "client_max_body_size" +php_admin_value[upload_max_filesize] = 25M +php_admin_value[post_max_size] = 25M +;source: https://www.dokuwiki.org/faq:uploadsize From 26a16c44d0c58d1413c6c7beb5ca45ecfcf7ddfd Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 21 Aug 2022 01:18:19 +0200 Subject: [PATCH 098/144] apply 'example_ynh' - no idea if these are needed... --- scripts/backup | 4 ++++ scripts/install | 4 ++++ scripts/restore | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/scripts/backup b/scripts/backup index 994eb7f..0020188 100755 --- a/scripts/backup +++ b/scripts/backup @@ -13,6 +13,10 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= +ynh_clean_setup () { + ### Remove this function if there's nothing to clean before calling the remove script. + true +} # Exit if an error occurs during the execution of the script ynh_abort_if_errors diff --git a/scripts/install b/scripts/install index 8f3f517..75c6b39 100755 --- a/scripts/install +++ b/scripts/install @@ -13,6 +13,10 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= +ynh_clean_setup () { + ### Remove this function if there's nothing to clean before calling the remove script. + true +} # Exit if an error occurs during the execution of the script ynh_abort_if_errors diff --git a/scripts/restore b/scripts/restore index 7131e35..0f7e0c0 100755 --- a/scripts/restore +++ b/scripts/restore @@ -13,6 +13,10 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= +ynh_clean_setup () { + #### Remove this function if there's nothing to clean before calling the remove script. + true +} # Exit if an error occurs during the execution of the script ynh_abort_if_errors From 006211049d4f2fc1a01d7a4b6c93b07353d0144e Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 21 Aug 2022 01:21:38 +0200 Subject: [PATCH 099/144] apply 'example_ynh' : dependencies + nginx block moved --- scripts/remove | 8 ++++++++ scripts/restore | 12 ++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/scripts/remove b/scripts/remove index b0d36b7..e2c981a 100755 --- a/scripts/remove +++ b/scripts/remove @@ -45,6 +45,14 @@ ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=2 # Remove the dedicated PHP-FPM config ynh_remove_fpm_config +#================================================= +# REMOVE DEPENDENCIES +#================================================= +ynh_script_progression --message="Removing dependencies..." --weight=1 + +# Remove metapackage and its dependencies if no other package need them +ynh_remove_app_dependencies + #================================================= # REMOVE FAIL2BAN CONFIGURATION #================================================= diff --git a/scripts/restore b/scripts/restore index 0f7e0c0..bfe1bca 100755 --- a/scripts/restore +++ b/scripts/restore @@ -45,12 +45,6 @@ test ! -d $final_path \ #================================================= # STANDARD RESTORATION STEPS -#================================================= -# RESTORE THE NGINX CONFIGURATION -#================================================= - -ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" - #================================================= # RECREATE THE DEDICATED USER #================================================= @@ -121,6 +115,12 @@ ynh_script_progression --message="Restoring the Fail2Ban configuration..." --wei ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" ynh_systemd_action --action=restart --service_name=fail2ban +#================================================= +# RESTORE THE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the NGINX web server configuration..." --weight=1 + +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # GENERIC FINALIZATION From ec68ea9c949c16f196a760ba8bbd9b6e5a26ac15 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 21 Aug 2022 01:22:58 +0200 Subject: [PATCH 100/144] apply 'example_ynh' : move permission block --- scripts/install | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index 75c6b39..863b430 100755 --- a/scripts/install +++ b/scripts/install @@ -225,15 +225,16 @@ ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex #================================================= ynh_script_progression --message="Configuring permissions..." --weight=2 -# Create the "admin" permission and add the "admin_user" to it -ynh_permission_create --permission "admin" --allowed "$admin_user" - # Make app public if necessary if [ $is_public -eq 1 ] then ynh_permission_update --permission="main" --add="visitors" fi +# Create the "admin" permission and add the "admin_user" to it +# More users can be added to the group from the YunoHost webadmin +ynh_permission_create --permission "admin" --allowed "$admin_user" + #================================================= # RELOAD NGINX #================================================= From b312077566976a24aa8173c381940fe0cd50a647 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 21 Aug 2022 01:28:25 +0200 Subject: [PATCH 101/144] apply 'example_ynh': move fail2ban block --- scripts/restore | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/restore b/scripts/restore index bfe1bca..d2d391a 100755 --- a/scripts/restore +++ b/scripts/restore @@ -91,13 +91,18 @@ chown -R $app:www-data "$final_path" #================================================= # RESTORE THE PHP-FPM CONFIGURATION +# RESTORE FAIL2BAN CONFIGURATION #================================================= ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=5 ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" +ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=7 # Recreate a dedicated php-fpm config ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion +ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" +ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" +ynh_systemd_action --action=restart --service_name=fail2ban #================================================= # REINSTALL DEPENDENCIES @@ -108,13 +113,8 @@ ynh_script_progression --message="Reinstalling dependencies..." --weight=1 ynh_install_app_dependencies $pkg_dependencies #================================================= -# RESTORE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=7 -ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" -ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" -ynh_systemd_action --action=restart --service_name=fail2ban #================================================= # RESTORE THE NGINX CONFIGURATION #================================================= From 2ce12e2e5e343b56b06c6f0eaa5309ab2f1de761 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 21 Aug 2022 01:29:29 +0200 Subject: [PATCH 102/144] apply 'example_ynh': move php fpm block --- scripts/restore | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/scripts/restore b/scripts/restore index d2d391a..e4bf421 100755 --- a/scripts/restore +++ b/scripts/restore @@ -90,16 +90,10 @@ chown -R $app:www-data "$final_path" # chown -R $app:root $final_path/lib/tpl #================================================= -# RESTORE THE PHP-FPM CONFIGURATION # RESTORE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=5 - -ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=7 -# Recreate a dedicated php-fpm config -ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" ynh_systemd_action --action=restart --service_name=fail2ban @@ -113,7 +107,15 @@ ynh_script_progression --message="Reinstalling dependencies..." --weight=1 ynh_install_app_dependencies $pkg_dependencies #================================================= +# RESTORE THE PHP-FPM CONFIGURATION #================================================= +ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=5 + +ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" + +# Recreate a dedicated php-fpm config +# TODO: not in example_ynh, not needed? +#ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion #================================================= # RESTORE THE NGINX CONFIGURATION From e81c507a1169e3242b3e649570758150a581dc08 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 21 Aug 2022 01:30:24 +0200 Subject: [PATCH 103/144] apply 'example_ynh': cosmetic + typo --- scripts/restore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/restore b/scripts/restore index e4bf421..f285815 100755 --- a/scripts/restore +++ b/scripts/restore @@ -98,6 +98,8 @@ ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" ynh_systemd_action --action=restart --service_name=fail2ban +#================================================= +# SPECIFIC RESTORATION #================================================= # REINSTALL DEPENDENCIES #================================================= @@ -131,7 +133,7 @@ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= ynh_script_progression --message="Reloading NGINX web server and PHP-FPM.." --weight=2 -ynh_systemd_action --service_name=php${phpversion}-fpm --action=reload +ynh_systemd_action --service_name=php$phpversion-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload #================================================= From 217eb7e8187fe433644e82380666d2c7fd0c8879 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 21 Aug 2022 01:31:11 +0200 Subject: [PATCH 104/144] Remove unused variable + pretty indent --- scripts/install | 1 - scripts/restore | 2 +- scripts/upgrade | 6 +++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/scripts/install b/scripts/install index 863b430..e39993f 100755 --- a/scripts/install +++ b/scripts/install @@ -88,7 +88,6 @@ chown -R $app:www-data "$final_path" ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 # Create a dedicated PHP-FPM config -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) fpm_usage=low fpm_footprint=low ynh_add_fpm_config --usage="$fpm_usage" --footprint="$fpm_footprint" diff --git a/scripts/restore b/scripts/restore index f285815..5469cad 100755 --- a/scripts/restore +++ b/scripts/restore @@ -30,8 +30,8 @@ app=$YNH_APP_INSTANCE_NAME 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) -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) diff --git a/scripts/upgrade b/scripts/upgrade index a9430de..790c8e0 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -296,9 +296,9 @@ fi # if "file" exists and is executable # Stolen from https://github.com/YunoHost-Apps/grav_ynh/blob/testing/scripts/upgrade#L189 if [ -x "$final_path/bin/plugin.php" ]; then - pushd "$final_path" - ynh_exec_warn_less ynh_exec_as $app php${YNH_PHP_VERSION} bin/plugin.php --no-colors extension upgrade || ynh_print_warn --message="Automatic plugin upgrade has failed, you can upgrade them from your DokuWiki admin panel." - popd + pushd "$final_path" + ynh_exec_warn_less ynh_exec_as $app php${YNH_PHP_VERSION} bin/plugin.php --no-colors extension upgrade || ynh_print_warn --message="Automatic plugin upgrade has failed, you can upgrade them from your DokuWiki admin panel." + popd else ynh_print_warn --message="Automatic plugin cannot be done, you have to upgrade them from your DokuWiki admin panel." fi From 7e79aa674a852c4aafca784533cc1d33dfb091b7 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 21 Aug 2022 01:34:40 +0200 Subject: [PATCH 105/144] Drop support for older YunoHost versions. I'm not sure how long it will take for people to migrate on YunoHost 11. Untill then, the package will not be available so bad news for them... Even if package should work on it, I cannot test against it as I don't use version 4.X anymore. Is there a CI for it? --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 656581d..32a5baa 100644 --- a/manifest.json +++ b/manifest.json @@ -29,12 +29,12 @@ "email": "opi@zeropi.net" }], "requirements": { - "yunohost": ">= 4.3.0" + "yunohost": ">= 11.0.0" }, "multi_instance": true, "services": [ "nginx", - "php7.3-fpm" + "php8.1-fpm" ], "arguments": { "install" : [ From 3da84c9dfe7e9723496bc8d3f924317729d12fa7 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 21 Aug 2022 01:38:01 +0200 Subject: [PATCH 106/144] update the changelog Hope it can be usefull to track changes made in the package --- CHANGELOG.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93ea3bf..787aa36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,26 @@ ------------ +# [2022.07.31~ynh1] - 2022-08-XX + +## Added + +- New DokuWiki version `2022-07-31 "Igor"` +- New automated tests for "check_process" CI + +## Changed + +- Use PHP8.1 as default (PHP7.4 is bulleyes will be EOL "28 Nov 2022" so bump the version) +- Change method to "automatic upgrade" of plugins +- Cleanning 'admin permission' handling +- redo how php is managed: ynh_add_fpm_config + php config files +- Sync with reference package 'example_ynh' + +## Removed + +- automatic installation of plugin "logautherror" (not compatible) +- support for YunoHost below 11 (no time to test against older versions) + # [2020-07-29~ynh4] - 2021-01-19 ### Added From c76dc5aa7523e32be026f9cbc92263e53f9b2e5c Mon Sep 17 00:00:00 2001 From: Gofannon Date: Fri, 26 Aug 2022 19:32:44 +0200 Subject: [PATCH 107/144] fix CI warning by adding details about public access --- manifest.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 32a5baa..6672e04 100644 --- a/manifest.json +++ b/manifest.json @@ -55,7 +55,11 @@ { "name": "is_public", "type": "boolean", - "default": true + "default": true, + "help": { + "en": "Makes the wiki accessible directly from the Internet for everyone, without intermediate YunoHost authentication", + "fr": "Rend le wiki accessible directement depuis Internet pour tout le monde, sans authentification YunoHost intermédiaire" + } }, { "name": "language", From e3132a97a6dbdd67e0984911b4b1ccd9fa8edaae Mon Sep 17 00:00:00 2001 From: Gofannon Date: Fri, 26 Aug 2022 19:33:17 +0200 Subject: [PATCH 108/144] Revert "apply 'example_ynh' - no idea if these are needed..." This reverts commit 26a16c44d0c58d1413c6c7beb5ca45ecfcf7ddfd. Unused bu the app! see https://github.com/YunoHost-Apps/dokuwiki_ynh/pull/92#issuecomment-1223069994 --- scripts/backup | 4 ---- scripts/install | 4 ---- scripts/restore | 4 ---- 3 files changed, 12 deletions(-) diff --git a/scripts/backup b/scripts/backup index 0020188..994eb7f 100755 --- a/scripts/backup +++ b/scripts/backup @@ -13,10 +13,6 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { - ### Remove this function if there's nothing to clean before calling the remove script. - true -} # Exit if an error occurs during the execution of the script ynh_abort_if_errors diff --git a/scripts/install b/scripts/install index e39993f..72bf387 100755 --- a/scripts/install +++ b/scripts/install @@ -13,10 +13,6 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { - ### Remove this function if there's nothing to clean before calling the remove script. - true -} # Exit if an error occurs during the execution of the script ynh_abort_if_errors diff --git a/scripts/restore b/scripts/restore index 5469cad..5f1e0f4 100755 --- a/scripts/restore +++ b/scripts/restore @@ -13,10 +13,6 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { - #### Remove this function if there's nothing to clean before calling the remove script. - true -} # Exit if an error occurs during the execution of the script ynh_abort_if_errors From 31825890144773a1e0ee338c7341026e32cfff79 Mon Sep 17 00:00:00 2001 From: Gofannon Date: Thu, 8 Sep 2022 10:20:55 +0200 Subject: [PATCH 109/144] upgrade to lastest version "Hotfix 2022-07-31a" Fix security hole https://github.com/splitbrain/dokuwiki/issues/3761 --- CHANGELOG.md | 4 ++-- conf/app.src | 4 ++-- manifest.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 787aa36..b03d4e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,11 +10,11 @@ ------------ -# [2022.07.31~ynh1] - 2022-08-XX +# [2022.07.31a~ynh1] - 2022-09-XX ## Added -- New DokuWiki version `2022-07-31 "Igor"` +- New DokuWiki version `2022-07-31a "Igor"` with **Hotfix 2022-07-31a** - New automated tests for "check_process" CI ## Changed diff --git a/conf/app.src b/conf/app.src index 1fbd62e..8339df0 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2022-07-31.tgz -SOURCE_SUM=908189bd39f8b9a08654de38e799eb67ae62865265997f3f00e8280de2b45c65 +SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2022-07-31a.tgz +SOURCE_SUM=48ed2ae11fa4a0ae8338af9aedc837601b34e21c0be15d16e2d6228ca7a91f23 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 6672e04..ab16da5 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Sistema de Wiki de uso sencillicimo y compatible con los estándares", "it": "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" }, - "version": "2022.07.31~ynh1", + "version": "2022.07.31a~ynh1", "url": "https://www.dokuwiki.org", "upstream": { "license": "GPL-2.0-or-later", From 2d28ddef2ba5ee31f1d8fdbc7fa542fb06845fea Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 14 Sep 2022 16:19:23 +0000 Subject: [PATCH 110/144] Auto-update README --- README.md | 3 ++- README_fr.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6b752a3..71eccc6 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,8 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... -**Shipped version:** 2020.07.29~ynh6 +**Shipped version:** 2022.07.31a~ynh1 + **Demo:** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo diff --git a/README_fr.md b/README_fr.md index ea9408a..3fa688b 100644 --- a/README_fr.md +++ b/README_fr.md @@ -25,7 +25,8 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Lors de la mise à jour, les plugins officiels sont également mis à jour. Nous vous recommandons toutefois de vérifier le bon fonctionnement des plugins dans le panneau d'administration après cette opération. Nous ne pouvons pas savoir si des plugins spéciaux posent problèmes... -**Version incluse :** 2020.07.29~ynh6 +**Version incluse :** 2022.07.31a~ynh1 + **Démo :** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo From da54fe887542cf13acff7833d1889791cca20113 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Tue, 27 Sep 2022 03:20:52 +0200 Subject: [PATCH 111/144] Apply example_ynh --- .github/workflows/updater.sh | 100 ++++++++++++++++++++++++++++++++++ .github/workflows/updater.yml | 49 +++++++++++++++++ check_process | 4 +- conf/app.src | 2 + conf/nginx.conf | 2 +- manifest.json | 10 ++-- scripts/backup | 4 ++ scripts/install | 74 ++++++------------------- scripts/remove | 11 ++-- scripts/restore | 38 +++---------- scripts/upgrade | 83 ++++++++-------------------- 11 files changed, 215 insertions(+), 162 deletions(-) create mode 100644 .github/workflows/updater.sh create mode 100644 .github/workflows/updater.yml diff --git a/.github/workflows/updater.sh b/.github/workflows/updater.sh new file mode 100644 index 0000000..0790258 --- /dev/null +++ b/.github/workflows/updater.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +#================================================= +# PACKAGE UPDATING HELPER +#================================================= + +# This script is meant to be run by GitHub Actions +# The YunoHost-Apps organisation offers a template Action to run this script periodically +# Since each app is different, maintainers can adapt its contents so as to perform +# automatic actions when a new upstream release is detected. + +#================================================= +# FETCHING LATEST RELEASE AND ITS ASSETS +#================================================= + +# Fetching information +current_version=$(cat manifest.json | jq -j '.version|split("~")[0]') +repo=$(cat manifest.json | jq -j '.upstream.code|split("https://github.com/")[1]') +# Some jq magic is needed, because the latest upstream release is not always the latest version (e.g. security patches for older versions) +version=$(curl --silent "https://api.github.com/repos/$repo/tags" | jq -r '.[] | select( .name | contains("release_stable_") ) | .name' | sort -V | tail -1 | cut -d "_" -f3-) +assets="https://download.dokuwiki.org/src/dokuwiki/dokuwiki-$version.tgz" + +# Later down the script, we assume the version has only digits and dots +# Sometimes the release name starts with a "v", so let's filter it out. +# You may need more tweaks here if the upstream repository has different naming conventions. +if [[ ${version:0:1} == "v" || ${version:0:1} == "V" ]]; then + version=${version:1} +fi + +# Setting up the environment variables +echo "Current version: $current_version" +echo "Latest release from upstream: $version" +echo "VERSION=$version" >> $GITHUB_ENV +echo "REPO=$repo" >> $GITHUB_ENV +# For the time being, let's assume the script will fail +echo "PROCEED=false" >> $GITHUB_ENV + +# Proceed only if the retrieved version is greater than the current one +if ! dpkg --compare-versions "$current_version" "lt" "$version" ; then + echo "::warning ::No new version available" + exit 0 +# Proceed only if a PR for this new version does not already exist +elif git ls-remote -q --exit-code --heads https://github.com/$GITHUB_REPOSITORY.git ci-auto-update-v$version ; then + echo "::warning ::A branch already exists for this update" + exit 0 +fi + +#================================================= +# UPDATE SOURCE FILES +#================================================= + +# Let's download source tarball +asset_url=$assets + +echo "Handling asset at $asset_url" + +src="app" + +# Create the temporary directory +tempdir="$(mktemp -d)" + +# Download sources and calculate checksum +filename=${asset_url##*/} +curl --silent -4 -L $asset_url -o "$tempdir/$filename" +checksum=$(sha256sum "$tempdir/$filename" | head -c 64) + +# Delete temporary directory +rm -rf $tempdir + +# Rewrite source file +cat < conf/$src.src +SOURCE_URL=$asset_url +SOURCE_SUM=$checksum +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=tar.gz +SOURCE_IN_SUBDIR=true +SOURCE_FILENAME= +SOURCE_EXTRACT=true +EOT +echo "... conf/$src.src updated" + +#================================================= +# SPECIFIC UPDATE STEPS +#================================================= + +# Any action on the app's source code can be done. +# The GitHub Action workflow takes care of committing all changes after this script ends. + +#================================================= +# GENERIC FINALIZATION +#================================================= + +# Replace new version in manifest +echo "$(jq -s --indent 4 ".[] | .version = \"${version//-/.}~ynh1\"" manifest.json)" > manifest.json + +# No need to update the README, yunohost-bot takes care of it + +# The Action will proceed only if the PROCEED environment variable is set to true +echo "PROCEED=true" >> $GITHUB_ENV +exit 0 diff --git a/.github/workflows/updater.yml b/.github/workflows/updater.yml new file mode 100644 index 0000000..fb72ba0 --- /dev/null +++ b/.github/workflows/updater.yml @@ -0,0 +1,49 @@ +# This workflow allows GitHub Actions to automagically update your app whenever a new upstream release is detected. +# You need to enable Actions in your repository settings, and fetch this Action from the YunoHost-Apps organization. +# This file should be enough by itself, but feel free to tune it to your needs. +# It calls updater.sh, which is where you should put the app-specific update steps. +name: Check for new upstream releases +on: + # Allow to manually trigger the workflow + workflow_dispatch: + # Run it every day at 6:00 UTC + schedule: + - cron: '0 6 * * *' +jobs: + updater: + runs-on: ubuntu-latest + steps: + - name: Fetch the source code + uses: actions/checkout@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Run the updater script + id: run_updater + run: | + # Setting up Git user + git config --global user.name 'yunohost-bot' + git config --global user.email 'yunohost-bot@users.noreply.github.com' + # Run the updater script + /bin/bash .github/workflows/updater.sh + - name: Commit changes + id: commit + if: ${{ env.PROCEED == 'true' }} + run: | + git commit -am "Upgrade to v$VERSION" + - name: Create Pull Request + id: cpr + if: ${{ env.PROCEED == 'true' }} + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: Update to version ${{ env.VERSION }} + committer: 'yunohost-bot ' + author: 'yunohost-bot ' + signoff: false + base: testing + branch: ci-auto-update-v${{ env.VERSION }} + delete-branch: true + title: 'Upgrade to version ${{ env.VERSION }}' + body: | + Upgrade to v${{ env.VERSION }} + draft: false diff --git a/check_process b/check_process index 5ff09b0..9cc2e20 100644 --- a/check_process +++ b/check_process @@ -1,11 +1,10 @@ ;; Test complet - auto_remove=1 ; Manifest domain="domain.tld" path="/path" - admin="john" is_public=1 language=en + admin="john" ; Checks pkg_linter=1 setup_sub_dir=1 @@ -19,6 +18,7 @@ upgrade=1 from_commit=f45c459b287c8f045c08e65cea412cfc2cae38f4 backup_restore=1 multi_instance=1 + port_already_use=0 change_url=1 actions=0 config_panel=0 diff --git a/conf/app.src b/conf/app.src index 8339df0..4f509ea 100644 --- a/conf/app.src +++ b/conf/app.src @@ -3,3 +3,5 @@ SOURCE_SUM=48ed2ae11fa4a0ae8338af9aedc837601b34e21c0be15d16e2d6228ca7a91f23 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true +SOURCE_FILENAME= +SOURCE_EXTRACT=true diff --git a/conf/nginx.conf b/conf/nginx.conf index cb10924..8f17035 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -7,7 +7,7 @@ location __PATH__/ { # Path to source - alias __FINALPATH__/ ; + alias __FINALPATH__/; index index.php doku.php; diff --git a/manifest.json b/manifest.json index 65f05d4..8b0c956 100644 --- a/manifest.json +++ b/manifest.json @@ -50,10 +50,6 @@ "example": "/dokuwiki", "default": "/dokuwiki" }, - { - "name": "admin", - "type": "user" - }, { "name": "is_public", "type": "boolean", @@ -75,7 +71,11 @@ "fr" ], "default": "en" + }, + { + "name": "admin", + "type": "user" } ] } -} \ No newline at end of file +} diff --git a/scripts/backup b/scripts/backup index 994eb7f..e666a1a 100755 --- a/scripts/backup +++ b/scripts/backup @@ -6,6 +6,7 @@ # IMPORT GENERIC HELPERS #================================================= +# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers @@ -13,6 +14,9 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= +ynh_clean_setup () { + true +} # Exit if an error occurs during the execution of the script ynh_abort_if_errors diff --git a/scripts/install b/scripts/install index 72bf387..8d8c707 100755 --- a/scripts/install +++ b/scripts/install @@ -13,6 +13,9 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= +ynh_clean_setup () { + true +} # Exit if an error occurs during the execution of the script ynh_abort_if_errors @@ -22,9 +25,9 @@ ynh_abort_if_errors domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH -admin_user=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC language=$YNH_APP_ARG_LANGUAGE +admin=$YNH_APP_ARG_ADMIN app=$YNH_APP_INSTANCE_NAME @@ -48,6 +51,8 @@ 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=language --value=$language +#================================================= +# STANDARD MODIFICATIONS #================================================= # INSTALL DEPENDENCIES #================================================= @@ -63,8 +68,6 @@ ynh_script_progression --message="Configuring system user..." --weight=2 # Create a system user ynh_system_user_create --username=$app --home_dir="$final_path" -#================================================= -# STANDARD MODIFICATIONS #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -99,9 +102,9 @@ ynh_add_nginx_config #================================================= # SPECIFIC SETUP #================================================= -# CUSTOMIZE DOKUWIKI +# ADD A CONFIGURATION #================================================= -ynh_script_progression --message="Configuring DokuWiki..." --weight=2 +ynh_script_progression --message="Adding a configuration file..." --weight=2 # Loading order of configuration files # @@ -137,6 +140,7 @@ ynh_add_config --template="../conf/acl.auth.php" --destination="$final_path/conf #================================================= # CREATE DEFAULT FILES #================================================= +ynh_script_progression --message="Creating default files..." --weight=1 # For securing DokuWiki installation, create default files that will be writable in the "conf" folder. # Other files will be read ony and owned by root. @@ -158,61 +162,13 @@ cp --archive ../conf/plugins.local.php $final_path/conf cp --archive ../conf/plugins.local.php $final_path/conf/plugins.local.php.bak #================================================= -# STORE THE CHECKSUM OF THE CONFIG FILE -#================================================= - -# Calculate and store the config file checksum into the app settings -#ynh_store_file_checksum --file="$final_path/conf/local.protected.php" -### Files '$final_path/conf/local.php' and '$final_path/conf/acl.auth.php' can be modified by user, no need to store checksum as they cannot be overwritten safely by the upgrade script - -# #================================================= -# # GENERIC FINALIZATION -# #================================================= -# # SECURE FILES AND DIRECTORIES -# #================================================= - -# # Try to use "least privilege" to grant minimal access -# # For details, see https://www.dokuwiki.org/install:permissions - -# # Files owned by DokuWiki can just read -# chown -R root: $final_path - -# # DokuWiki needs to write inside these folders. Make "DokuWiki" owner -# chown $app:root $final_path/{conf,inc} - -# # Make "DokuWiki" owner of configuration files that must be writable -# chown $app:root $final_path/conf/{local.php,local.php.bak,users.auth.php,acl.auth.php,plugins.local.php,plugins.local.php.bak} - -# # Usefull for some plugins like https://www.dokuwiki.org/plugin:siteexport -# # See https://www.dokuwiki.org/devel:preload -# chown $app:root $final_path/inc/preload.php - -# # Grant read-only to all files as files copied above are owned by root by defaut and nginx cannot read them -# # There are only files in the folder and there are no sublevels. No need to use "find" -# chmod -R a+r $final_path/{conf,inc} - -# # Give write access to "data" and subfolders -# chown -R $app:root $final_path/data -# # Remove access to "other" -# chmod -R o-rwx $final_path/data - -# # Allow the web admin panel to run, aka "Extension Manager" -# chown -R $app:root $final_path/lib/plugins -# # Allow to install templates -# chown -R $app:root $final_path/lib/tpl - -# # Allow access to public assets like style sheets -# find $final_path/lib -type f -print0 | xargs -0 chmod 0644 -# find $final_path/lib -type d -print0 | xargs -0 chmod 0755 -# # Using "find" instead of "chmod -R 755" so files does not become executable too -# # chmod : -rwxr-xr-x 1 root root 241 May 3 08:36 index.html => BAD -# # find : -rw-r--r-- 1 1001 1002 241 May 3 08:36 index.html => GOOD - +# GENERIC FINALIZATION #================================================= # SETUP FAIL2BAN #================================================= ynh_script_progression --message="Configuring Fail2Ban..." --weight=7 +# Create a dedicated Fail2Ban config ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 #================================================= @@ -223,17 +179,19 @@ ynh_script_progression --message="Configuring permissions..." --weight=2 # Make app public if necessary if [ $is_public -eq 1 ] then + # Everyone can access the app. + # The "main" permission is automatically created before the install script. ynh_permission_update --permission="main" --add="visitors" fi -# Create the "admin" permission and add the "admin_user" to it +# Create the "admin" permission and add the "admin" to it # More users can be added to the group from the YunoHost webadmin -ynh_permission_create --permission "admin" --allowed "$admin_user" +ynh_permission_create --permission "admin" --allowed "$admin" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/remove b/scripts/remove index e2c981a..309c7be 100755 --- a/scripts/remove +++ b/scripts/remove @@ -12,7 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -24,7 +24,7 @@ final_path=$(ynh_app_setting_get --app=$app --key=final_path) #================================================= # REMOVE APP MAIN DIR #================================================= -ynh_script_progression --message="Removing app main directory..." +ynh_script_progression --message="Removing app main directory..." --weight=1 # Remove the app directory securely ynh_secure_remove --file="$final_path" @@ -32,7 +32,7 @@ ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing NGINX web server configuration..." +ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 # Remove the dedicated NGINX config ynh_remove_nginx_config @@ -50,7 +50,7 @@ ynh_remove_fpm_config #================================================= ynh_script_progression --message="Removing dependencies..." --weight=1 -# Remove metapackage and its dependencies if no other package need them +# Remove metapackage and its dependencies ynh_remove_app_dependencies #================================================= @@ -58,6 +58,7 @@ ynh_remove_app_dependencies #================================================= ynh_script_progression --message="Removing Fail2Ban configuration..." --weight=7 +# Remove the dedicated Fail2Ban config ynh_remove_fail2ban_config #================================================= @@ -65,7 +66,7 @@ ynh_remove_fail2ban_config #================================================= # REMOVE DEDICATED USER #================================================= -ynh_script_progression --message="Removing the dedicated system user..." +ynh_script_progression --message="Removing the dedicated system user..." --weight=1 # Delete a system user ynh_system_user_delete --username=$app diff --git a/scripts/restore b/scripts/restore index 5f1e0f4..fe567d3 100755 --- a/scripts/restore +++ b/scripts/restore @@ -6,6 +6,7 @@ # IMPORT GENERIC HELPERS #================================================= +# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers @@ -13,20 +14,22 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= +ynh_clean_setup () { + true +} # Exit if an error occurs during the execution of the script ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading settings..." --weight=2 +ynh_script_progression --message="Loading installation settings..." --weight=2 app=$YNH_APP_INSTANCE_NAME 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) - phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) @@ -52,7 +55,7 @@ ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= # RESTORE THE APP MAIN DIR #================================================= -ynh_script_progression --message="Restoring the app main directory..." +ynh_script_progression --message="Restoring the app main directory..." --weight=1 ynh_restore_file --origin_path="$final_path" @@ -60,31 +63,6 @@ chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" -# #================================================= -# # RESTORE USER RIGHTS -# #================================================= - -# # Try to use "least privilege" to grant minimal access -# # For details, see https://www.dokuwiki.org/install:permissions - -# # DokuWiki needs to write inside these folders. Make "DokuWiki" owner -# chown $app:root $final_path/{conf,inc} - -# # Make "DokuWiki" owner of configuration files that must be writable -# chown $app:root $final_path/conf/{local.php,local.php.bak,users.auth.php,acl.auth.php,plugins.local.php,plugins.local.php.bak} - -# # Usefull for some plugins like https://www.dokuwiki.org/plugin:siteexport -# # See https://www.dokuwiki.org/devel:preload -# chown $app:root $final_path/inc/preload.php - -# # Give write access to "data" and subfolders -# chown -R $app:root $final_path/data - -# # Allow the web admin panel to run, aka "Extension Manager" -# chown -R $app:root $final_path/lib/plugins -# # Allow to install templates -# chown -R $app:root $final_path/lib/tpl - #================================================= # RESTORE FAIL2BAN CONFIGURATION #================================================= @@ -107,7 +85,7 @@ ynh_install_app_dependencies $pkg_dependencies #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=5 +ynh_script_progression --message="Restoring the PHP-FPM configuration..." --weight=5 ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" @@ -127,7 +105,7 @@ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading NGINX web server and PHP-FPM.." --weight=2 +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." --weight=2 ynh_systemd_action --service_name=php$phpversion-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/upgrade b/scripts/upgrade index 790c8e0..e86999f 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -18,16 +18,16 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app=$app --key=domain) path_url=$(ynh_app_setting_get --app=$app --key=path) +language=$(ynh_app_setting_get --app=$app --key=language) final_path=$(ynh_app_setting_get --app=$app --key=final_path) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -language=$(ynh_app_setting_get --app=$app --key=language) - fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) #================================================= # CHECK VERSION #================================================= +ynh_script_progression --message="Checking version..." --weight=1 upgrade_type=$(ynh_check_app_version_changed) @@ -39,16 +39,18 @@ ynh_script_progression --message="Backing up the app before upgrading (may take # 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 ynh_abort_if_errors +#================================================= +# STANDARD UPGRADE STEPS #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= -ynh_script_progression --message="Ensuring downward compatibility..." +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 # If final_path doesn't exist, create it if [ -z "$final_path" ]; then @@ -183,11 +185,9 @@ fi #================================================= ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 -# Create a system user +# Create a dedicated user (if not existing) ynh_system_user_create --username=$app --home_dir="$final_path" -#================================================= -# STANDARD UPGRADE STEPS #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -204,14 +204,6 @@ chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" -#================================================= -# NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 - -# Create a dedicated NGINX config -ynh_add_nginx_config - #================================================= # UPGRADE DEPENDENCIES #================================================= @@ -227,9 +219,19 @@ ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 # Create a dedicated PHP-FPM config ynh_add_fpm_config --phpversion=$phpversion --usage=$fpm_usage --footprint=$fpm_footprint +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 + +# Create a dedicated NGINX config +ynh_add_nginx_config + #================================================= # SPECIFIC UPGRADE #================================================= +# UPGRADE DOKUWIKI +#================================================= if [ "$upgrade_type" == "UPGRADE_APP" ] then @@ -324,61 +326,20 @@ ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_fil # Recalculate and store the checksum of the file for the next upgrade. ynh_store_file_checksum --file="$final_path/conf/local.protected.php" -# #================================================= -# # GENERIC FINALIZATION -# #================================================= -# # SECURE FILES AND DIRECTORIES -# #================================================= - -# # Try to use "least privilege" to grant minimal access -# # For details, see https://www.dokuwiki.org/install:permissions - -# # Files owned by DokuWiki can just read -# chown -R root: $final_path - -# # DokuWiki needs to write inside these folders. Make "DokuWiki" owner -# chown $app:root $final_path/{conf,inc} - -# # Make "DokuWiki" owner of configuration files that must be writable -# chown $app:root $final_path/conf/{local.php,local.php.bak,users.auth.php,acl.auth.php,plugins.local.php,plugins.local.php.bak} - -# # Usefull for some plugins like https://www.dokuwiki.org/plugin:siteexport -# # See https://www.dokuwiki.org/devel:preload -# chown $app:root $final_path/inc/preload.php - -# # Grant read-only to all files as files copied above are owned by root by defaut and nginx cannot read them -# # There are only files in the folder and there are no sublevels. No need to use "find" -# chmod -R a+r $final_path/{conf,inc} - -# # Give write access to "data" and subfolders -# chown -R $app:root $final_path/data -# # Remove access to "other" -# chmod -R o-rwx $final_path/data - -# # Allow the web admin panel to run, aka "Extension Manager" -# chown -R $app:root $final_path/lib/plugins -# # Allow to install templates -# chown -R $app:root $final_path/lib/tpl - -# # Allow access to public assets like style sheets -# find $final_path/lib -type f -print0 | xargs -0 chmod 0644 -# find $final_path/lib -type d -print0 | xargs -0 chmod 0755 -# # Using "find" instead of "chmod -R 755" so files does not become executable too -# # chmod : -rwxr-xr-x 1 root root 241 May 3 08:36 index.html => BAD -# # find : -rw-r--r-- 1 1001 1002 241 May 3 08:36 index.html => GOOD - #================================================= -# SETUP FAIL2BAN +# GENERIC FINALIZATION +#================================================= +# UPGRADE FAIL2BAN #================================================= ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=7 +# Create a dedicated Fail2Ban config ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 - #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload From 7c2d6a938a135cd90ad0df97370e283740396211 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Thu, 29 Sep 2022 08:23:26 +0200 Subject: [PATCH 112/144] Cleanup ynh_clean_setup --- scripts/backup | 3 --- scripts/install | 3 --- scripts/restore | 3 --- 3 files changed, 9 deletions(-) diff --git a/scripts/backup b/scripts/backup index e666a1a..5ead872 100755 --- a/scripts/backup +++ b/scripts/backup @@ -14,9 +14,6 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { - true -} # Exit if an error occurs during the execution of the script ynh_abort_if_errors diff --git a/scripts/install b/scripts/install index 8d8c707..e7f1dcd 100755 --- a/scripts/install +++ b/scripts/install @@ -13,9 +13,6 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { - true -} # Exit if an error occurs during the execution of the script ynh_abort_if_errors diff --git a/scripts/restore b/scripts/restore index fe567d3..0e1c0cb 100755 --- a/scripts/restore +++ b/scripts/restore @@ -14,9 +14,6 @@ source /usr/share/yunohost/helpers # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { - true -} # Exit if an error occurs during the execution of the script ynh_abort_if_errors From 90345a544e80d7e7f00767c55499bd32c578143b Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 26 Feb 2023 18:03:38 +0100 Subject: [PATCH 113/144] Fix "php conf location" breaking backup script See https://github.com/YunoHost-Apps/dokuwiki_ynh/issues/96 the bug: > php file is still in folder: '/etc/php/7.4/fpm/pool.d/' after upgrade > instead of '8.1' folder. Changing the "ynh_add_fpm_config" for the fix. The helper should do the "php version handling" instead of the package itself Example taken on the package: https://github.com/YunoHost-Apps/wordpress_ynh/blob/testing/scripts/upgrade --- scripts/upgrade | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index e86999f..2d9c457 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -76,6 +76,12 @@ if [ -z "$fpm_usage" ]; then ynh_app_setting_set --app=$app --key=fpm_usage --value=$fpm_usage fi +# If phpversion doesn't exist, create it +if [ -z "$phpversion" ]; then + phpversion=$YNH_PHP_VERSION + ynh_app_setting_set --app=$app --key=phpversion --value=$phpversion +fi + # Cleaning legacy permissions admin_user=$(ynh_app_setting_get --app=$app --key=admin) @@ -217,7 +223,7 @@ ynh_install_app_dependencies $pkg_dependencies ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 # Create a dedicated PHP-FPM config -ynh_add_fpm_config --phpversion=$phpversion --usage=$fpm_usage --footprint=$fpm_footprint +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint #================================================= # NGINX CONFIGURATION @@ -299,7 +305,7 @@ fi # Stolen from https://github.com/YunoHost-Apps/grav_ynh/blob/testing/scripts/upgrade#L189 if [ -x "$final_path/bin/plugin.php" ]; then pushd "$final_path" - ynh_exec_warn_less ynh_exec_as $app php${YNH_PHP_VERSION} bin/plugin.php --no-colors extension upgrade || ynh_print_warn --message="Automatic plugin upgrade has failed, you can upgrade them from your DokuWiki admin panel." + ynh_exec_warn_less ynh_exec_as $app php$phpversion bin/plugin.php --no-colors extension upgrade || ynh_print_warn --message="Automatic plugin upgrade has failed, you can upgrade them from your DokuWiki admin panel." popd else ynh_print_warn --message="Automatic plugin cannot be done, you have to upgrade them from your DokuWiki admin panel." From 2cb2ddab917811a0e1e04c200a1028df4937f42a Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 26 Feb 2023 18:13:16 +0100 Subject: [PATCH 114/144] enh use helper "ynh_add_config" to manage file --- scripts/upgrade | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 2d9c457..1e37e21 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -315,22 +315,14 @@ fi fi #================================================= -# LDAP Configuration +# UPDATE A CONFIG FILE #================================================= - -### Verify the checksum of a file, stored by `ynh_store_file_checksum` in the install script. -### And create a backup of this file if the checksum is different. So the file will be backed up if the admin had modified it. -ynh_backup_if_checksum_is_different --file="$final_path/conf/local.protected.php" - -# Always overwrite local file with the one from package. -cp --archive ../conf/local.protected.php $final_path/conf +ynh_script_progression --message="Adding a configuration file..." --weight=2 # Customize admin group in case of multiple wiki install managed by different admins # dokuwiki.admin; dokuwiki__1.admin; etc -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/conf/local.protected.php" +ynh_add_config --template="../conf/local.protected.php" --destination="$final_path/conf/local.protected.php" -# Recalculate and store the checksum of the file for the next upgrade. -ynh_store_file_checksum --file="$final_path/conf/local.protected.php" #================================================= # GENERIC FINALIZATION From 71a84a4cedaf77bb77ab9250d6111d6f0a320a6d Mon Sep 17 00:00:00 2001 From: Gofannon Date: Sun, 26 Feb 2023 18:22:45 +0100 Subject: [PATCH 115/144] bump package version and changelog --- CHANGELOG.md | 12 ++++++++++++ manifest.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b03d4e8..79fd231 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,18 @@ ------------ +# [2022.07.31a~ynh2] - 2023-02-XX + +## Changed + +- Apply "default package recommandation" for "example_ynh" package and "YunoHost apps teams" +- Use helper `ynh_add_config` for the uprgade script too (fix linter warning) + +### Fixed + +- Bug in upgrade script not writing the php configuration to the right location (and breaking the backup later if DokuWiki has been installed for the for the first time with version `2022.07.31a~ynh1`) + + # [2022.07.31a~ynh1] - 2022-09-XX ## Added diff --git a/manifest.json b/manifest.json index 8b0c956..19174f2 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "es": "Sistema de Wiki de uso sencillicimo y compatible con los estándares", "it": "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" }, - "version": "2022.07.31a~ynh1", + "version": "2022.07.31a~ynh2", "url": "https://www.dokuwiki.org", "upstream": { "license": "GPL-2.0-or-later", From 3724fcd4bf85248d4926eb785a90d960d34d9304 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 26 Feb 2023 17:23:09 +0000 Subject: [PATCH 116/144] Auto-update README --- README.md | 6 +++--- README_fr.md | 24 ++++++++++++------------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 71eccc6..b665f5d 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ It shall NOT be edited by hand. # Dokuwiki for YunoHost -[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Working status](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Working status](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) + [![Install Dokuwiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* @@ -25,8 +26,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... -**Shipped version:** 2022.07.31a~ynh1 - +**Shipped version:** 2022.07.31a~ynh2 **Demo:** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo diff --git a/README_fr.md b/README_fr.md index 3fa688b..f47781d 100644 --- a/README_fr.md +++ b/README_fr.md @@ -5,15 +5,16 @@ It shall NOT be edited by hand. # Dokuwiki pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) +[![Niveau d’intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) + [![Installer Dokuwiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) *[Read this readme in english.](./README.md)* -> *Ce package vous permet d'installer Dokuwiki 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.* +> *Ce package vous permet d’installer Dokuwiki 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.* -## Vue d'ensemble +## Vue d’ensemble DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne nécessite pas de base de données. Il est apprécié par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait un favori d'administrateur. Des contrôles d'accès et des connecteurs d'authentification intégrés rendent DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins apportés par sa communauté dynamique permettent un large éventail de cas d'utilisation au-delà d'un wiki traditionnel. @@ -25,14 +26,13 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Lors de la mise à jour, les plugins officiels sont également mis à jour. Nous vous recommandons toutefois de vérifier le bon fonctionnement des plugins dans le panneau d'administration après cette opération. Nous ne pouvons pas savoir si des plugins spéciaux posent problèmes... -**Version incluse :** 2022.07.31a~ynh1 - +**Version incluse :** 2022.07.31a~ynh2 **Démo :** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo -## Captures d'écran +## Captures d’écran -![Capture d'écran de Dokuwiki](./doc/screenshots/DokuWiki_Screenshot.png) +![Capture d’écran de Dokuwiki](./doc/screenshots/DokuWiki_Screenshot.png) ## Avertissements / informations importantes @@ -42,9 +42,9 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentations et ressources -* Site officiel de l'app : -* Documentation officielle de l'admin : -* Dépôt de code officiel de l'app : +* Site officiel de l’app : +* Documentation officielle de l’admin : +* Dépôt de code officiel de l’app : * Documentation YunoHost pour cette app : * Signaler un bug : @@ -60,4 +60,4 @@ ou sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ``` -**Plus d'infos sur le packaging d'applications :** +**Plus d’infos sur le packaging d’applications :** \ No newline at end of file From f86fda5a8c6bfae4e11bfa68b803704f53a5d5c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 16 May 2023 12:54:30 +0200 Subject: [PATCH 117/144] Version 2 (#98) * v2 * v2 * Auto-update README * Update tests.toml * Update manifest.toml * Update LICENSE * cleaning * cleaning --------- Co-authored-by: yunohost-bot --- .github/workflows/updater.sh | 100 ---- .github/workflows/updater.yml | 49 -- CHANGELOG.md | 112 ----- LICENSE | 855 +++++++++++++++++++++++++--------- README.md | 8 +- README_fr.md | 8 +- check_process | 33 -- conf/app.src | 7 - conf/nginx.conf | 2 +- conf/php-fpm.conf | 432 ----------------- doc/DISCLAIMER.md | 3 - doc/DISCLAIMER_fr.md | 3 - manifest.json | 81 ---- manifest.toml | 73 +++ scripts/_common.sh | 18 - scripts/backup | 20 +- scripts/change_url | 86 +--- scripts/install | 115 +---- scripts/remove | 50 +- scripts/restore | 80 +--- scripts/upgrade | 183 ++------ tests.toml | 11 + 22 files changed, 806 insertions(+), 1523 deletions(-) delete mode 100644 .github/workflows/updater.sh delete mode 100644 .github/workflows/updater.yml delete mode 100644 CHANGELOG.md delete mode 100644 check_process delete mode 100644 conf/app.src delete mode 100644 conf/php-fpm.conf delete mode 100644 doc/DISCLAIMER.md delete mode 100644 doc/DISCLAIMER_fr.md delete mode 100644 manifest.json create mode 100644 manifest.toml create mode 100644 tests.toml diff --git a/.github/workflows/updater.sh b/.github/workflows/updater.sh deleted file mode 100644 index 0790258..0000000 --- a/.github/workflows/updater.sh +++ /dev/null @@ -1,100 +0,0 @@ -#!/bin/bash - -#================================================= -# PACKAGE UPDATING HELPER -#================================================= - -# This script is meant to be run by GitHub Actions -# The YunoHost-Apps organisation offers a template Action to run this script periodically -# Since each app is different, maintainers can adapt its contents so as to perform -# automatic actions when a new upstream release is detected. - -#================================================= -# FETCHING LATEST RELEASE AND ITS ASSETS -#================================================= - -# Fetching information -current_version=$(cat manifest.json | jq -j '.version|split("~")[0]') -repo=$(cat manifest.json | jq -j '.upstream.code|split("https://github.com/")[1]') -# Some jq magic is needed, because the latest upstream release is not always the latest version (e.g. security patches for older versions) -version=$(curl --silent "https://api.github.com/repos/$repo/tags" | jq -r '.[] | select( .name | contains("release_stable_") ) | .name' | sort -V | tail -1 | cut -d "_" -f3-) -assets="https://download.dokuwiki.org/src/dokuwiki/dokuwiki-$version.tgz" - -# Later down the script, we assume the version has only digits and dots -# Sometimes the release name starts with a "v", so let's filter it out. -# You may need more tweaks here if the upstream repository has different naming conventions. -if [[ ${version:0:1} == "v" || ${version:0:1} == "V" ]]; then - version=${version:1} -fi - -# Setting up the environment variables -echo "Current version: $current_version" -echo "Latest release from upstream: $version" -echo "VERSION=$version" >> $GITHUB_ENV -echo "REPO=$repo" >> $GITHUB_ENV -# For the time being, let's assume the script will fail -echo "PROCEED=false" >> $GITHUB_ENV - -# Proceed only if the retrieved version is greater than the current one -if ! dpkg --compare-versions "$current_version" "lt" "$version" ; then - echo "::warning ::No new version available" - exit 0 -# Proceed only if a PR for this new version does not already exist -elif git ls-remote -q --exit-code --heads https://github.com/$GITHUB_REPOSITORY.git ci-auto-update-v$version ; then - echo "::warning ::A branch already exists for this update" - exit 0 -fi - -#================================================= -# UPDATE SOURCE FILES -#================================================= - -# Let's download source tarball -asset_url=$assets - -echo "Handling asset at $asset_url" - -src="app" - -# Create the temporary directory -tempdir="$(mktemp -d)" - -# Download sources and calculate checksum -filename=${asset_url##*/} -curl --silent -4 -L $asset_url -o "$tempdir/$filename" -checksum=$(sha256sum "$tempdir/$filename" | head -c 64) - -# Delete temporary directory -rm -rf $tempdir - -# Rewrite source file -cat < conf/$src.src -SOURCE_URL=$asset_url -SOURCE_SUM=$checksum -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=tar.gz -SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= -SOURCE_EXTRACT=true -EOT -echo "... conf/$src.src updated" - -#================================================= -# SPECIFIC UPDATE STEPS -#================================================= - -# Any action on the app's source code can be done. -# The GitHub Action workflow takes care of committing all changes after this script ends. - -#================================================= -# GENERIC FINALIZATION -#================================================= - -# Replace new version in manifest -echo "$(jq -s --indent 4 ".[] | .version = \"${version//-/.}~ynh1\"" manifest.json)" > manifest.json - -# No need to update the README, yunohost-bot takes care of it - -# The Action will proceed only if the PROCEED environment variable is set to true -echo "PROCEED=true" >> $GITHUB_ENV -exit 0 diff --git a/.github/workflows/updater.yml b/.github/workflows/updater.yml deleted file mode 100644 index fb72ba0..0000000 --- a/.github/workflows/updater.yml +++ /dev/null @@ -1,49 +0,0 @@ -# This workflow allows GitHub Actions to automagically update your app whenever a new upstream release is detected. -# You need to enable Actions in your repository settings, and fetch this Action from the YunoHost-Apps organization. -# This file should be enough by itself, but feel free to tune it to your needs. -# It calls updater.sh, which is where you should put the app-specific update steps. -name: Check for new upstream releases -on: - # Allow to manually trigger the workflow - workflow_dispatch: - # Run it every day at 6:00 UTC - schedule: - - cron: '0 6 * * *' -jobs: - updater: - runs-on: ubuntu-latest - steps: - - name: Fetch the source code - uses: actions/checkout@v2 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - name: Run the updater script - id: run_updater - run: | - # Setting up Git user - git config --global user.name 'yunohost-bot' - git config --global user.email 'yunohost-bot@users.noreply.github.com' - # Run the updater script - /bin/bash .github/workflows/updater.sh - - name: Commit changes - id: commit - if: ${{ env.PROCEED == 'true' }} - run: | - git commit -am "Upgrade to v$VERSION" - - name: Create Pull Request - id: cpr - if: ${{ env.PROCEED == 'true' }} - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: Update to version ${{ env.VERSION }} - committer: 'yunohost-bot ' - author: 'yunohost-bot ' - signoff: false - base: testing - branch: ci-auto-update-v${{ env.VERSION }} - delete-branch: true - title: 'Upgrade to version ${{ env.VERSION }}' - body: | - Upgrade to v${{ env.VERSION }} - draft: false diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 79fd231..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,112 +0,0 @@ -# Changelog - -## [Unreleased] - -## [2018-04-22a~ynhXX] - -### Added - -- Upgrade actions and config-panel scripts - ------------- - -# [2022.07.31a~ynh2] - 2023-02-XX - -## Changed - -- Apply "default package recommandation" for "example_ynh" package and "YunoHost apps teams" -- Use helper `ynh_add_config` for the uprgade script too (fix linter warning) - -### Fixed - -- Bug in upgrade script not writing the php configuration to the right location (and breaking the backup later if DokuWiki has been installed for the for the first time with version `2022.07.31a~ynh1`) - - -# [2022.07.31a~ynh1] - 2022-09-XX - -## Added - -- New DokuWiki version `2022-07-31a "Igor"` with **Hotfix 2022-07-31a** -- New automated tests for "check_process" CI - -## Changed - -- Use PHP8.1 as default (PHP7.4 is bulleyes will be EOL "28 Nov 2022" so bump the version) -- Change method to "automatic upgrade" of plugins -- Cleanning 'admin permission' handling -- redo how php is managed: ynh_add_fpm_config + php config files -- Sync with reference package 'example_ynh' - -## Removed - -- automatic installation of plugin "logautherror" (not compatible) -- support for YunoHost below 11 (no time to test against older versions) - -# [2020-07-29~ynh4] - 2021-01-19 - -### Added - -- Support for new permission system in YunoHost 3.7 - -### Changed - -- wiki administrators is now a group and can be modified from webadmin YunoHost panel -- Require YunoHost 3.7 minimum - -## [2020-07-29~ynh2] - 2020-10-23 - -### Added - -- New DokuWiki version `2020-07-29` - -### Changed - -- Set PHP7.3 as default - -## [2018-04-22b~ynh1] - 2020-03-23 - -### Added - -- New DokuWiki version `2018-04-22b` -- Changelog available in `CHANGELOG.md` - -### Changed - -- Upgrade content of file `pull_request_template.md` - -## [2018-04-22a~ynh3] - 2020-02-20 - -### Added - -- Use 'URL rewrite' for prettier URLs - -### Changed - -- Activate URL rewrite by default (does not break old links) - -### Removed - -- Unused DokuWiki config file - -## [2018-04-22a~ynh2] - 2020-02-20 - -### Added - -- Add fail2ban support to avoid bruteforce login attempts - -### Changed - -- Global upgrade of the package - -### Fixed - -- Get rid of the php ini file and merge its content into the pool file -- Update Readme following last work made on the package and current version in testing branch - -### Removed - -- Unused config file settings - -## [Previous versions] - YYYY-MM-DD - -- Will be written (one day maybye) diff --git a/LICENSE b/LICENSE index 3d3266e..f288702 100644 --- a/LICENSE +++ b/LICENSE @@ -1,241 +1,674 @@ -GNU AFFERO GENERAL PUBLIC LICENSE -Version 3, 19 November 2007 -Copyright (C) 2007 Free Software Foundation, Inc. + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. -Preamble + Preamble -The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. + The GNU General Public License is a free, copyleft license for +software and other kinds of works. -The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. -Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. -A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. -The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. -An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. -The precise terms and conditions for copying, distribution and modification follow. + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. -TERMS AND CONDITIONS + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. -0. Definitions. + The precise terms and conditions for copying, distribution and +modification follow. -"This License" refers to version 3 of the GNU Affero General Public License. + TERMS AND CONDITIONS -"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + 0. Definitions. -"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. + "This License" refers to version 3 of the GNU General Public License. -To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. -A "covered work" means either the unmodified Program or a work based on the Program. + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. -To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. -To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + A "covered work" means either the unmodified Program or a work based +on the Program. -An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. -1. Source Code. -The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. -A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. -The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + 1. Source Code. -The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those subprograms and other parts of the work. -The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -2. Basic Permissions. -All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. -No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. - -4. Conveying Verbatim Copies. -You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. -You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: - -a) The work must carry prominent notices stating that you modified it, and giving a relevant date. - -b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". - -c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. - -d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. - -A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. - -6. Conveying Non-Source Forms. -You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: - -a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. - -b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. - -c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. - -d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. - -e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. - -A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. - -"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). - -The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. - -7. Additional Terms. -"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: - -a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or - -b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or - -c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or - -d) Limiting the use for publicity purposes of names of licensors or authors of the material; or - -e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or - -f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. - -All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. - -8. Termination. - -You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. - -9. Acceptance Not Required for Having Copies. - -You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. - -10. Automatic Licensing of Downstream Recipients. - -Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. - -An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. - -11. Patents. - -A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". - -A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. - -In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to s ue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - -A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. - -12. No Surrender of Others' Freedom. - -If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. - -13. Remote Network Interaction; Use with the GNU General Public License. - -Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. - -Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. - -14. Revised Versions of this License. - -The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. - -Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. - -15. Disclaimer of Warranty. - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. - -If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - - -Copyright (C) - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. -If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: -You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index b665f5d..3463fb9 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... -**Shipped version:** 2022.07.31a~ynh2 +**Shipped version:** 2023.04.04a~ynh1 **Demo:** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo @@ -34,12 +34,6 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ![Screenshot of Dokuwiki](./doc/screenshots/DokuWiki_Screenshot.png) -## Disclaimers / important information - -## Limitations - -* Cannot create or login with DokuWiki internal users, only users from YunoHost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) - ## Documentation and resources * Official app website: diff --git a/README_fr.md b/README_fr.md index f47781d..513fd2a 100644 --- a/README_fr.md +++ b/README_fr.md @@ -26,7 +26,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Lors de la mise à jour, les plugins officiels sont également mis à jour. Nous vous recommandons toutefois de vérifier le bon fonctionnement des plugins dans le panneau d'administration après cette opération. Nous ne pouvons pas savoir si des plugins spéciaux posent problèmes... -**Version incluse :** 2022.07.31a~ynh2 +**Version incluse :** 2023.04.04a~ynh1 **Démo :** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo @@ -34,12 +34,6 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ![Capture d’écran de Dokuwiki](./doc/screenshots/DokuWiki_Screenshot.png) -## Avertissements / informations importantes - -## Limitations - -* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de YunoHost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) - ## Documentations et ressources * Site officiel de l’app : diff --git a/check_process b/check_process deleted file mode 100644 index 9cc2e20..0000000 --- a/check_process +++ /dev/null @@ -1,33 +0,0 @@ -;; Test complet - ; Manifest - domain="domain.tld" - path="/path" - is_public=1 - language=en - admin="john" - ; Checks - pkg_linter=1 - setup_sub_dir=1 - setup_root=1 - setup_nourl=0 - setup_private=1 - setup_public=1 - upgrade=1 - # Latest released version. See https://github.com/YunoHost-Apps/dokuwiki_ynh/commits/master - upgrade=1 from_commit=500a7d3fa9c008a2b75d0f6bec519e41fed97da0 - upgrade=1 from_commit=f45c459b287c8f045c08e65cea412cfc2cae38f4 - backup_restore=1 - multi_instance=1 - port_already_use=0 - change_url=1 - actions=0 - config_panel=0 -;;; Options -Email= -Notification=none -;;; Upgrade options - ; commit=500a7d3fa9c008a2b75d0f6bec519e41fed97da0 - name=[fix] dedicated named location per $app (#63) - manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=Yes&language=en& - ; commit=f45c459b287c8f045c08e65cea412cfc2cae38f4 - name=add config panel diff --git a/conf/app.src b/conf/app.src deleted file mode 100644 index 4f509ea..0000000 --- a/conf/app.src +++ /dev/null @@ -1,7 +0,0 @@ -SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2022-07-31a.tgz -SOURCE_SUM=48ed2ae11fa4a0ae8338af9aedc837601b34e21c0be15d16e2d6228ca7a91f23 -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=tar.gz -SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= -SOURCE_EXTRACT=true diff --git a/conf/nginx.conf b/conf/nginx.conf index 8f17035..13acc55 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -7,7 +7,7 @@ location __PATH__/ { # Path to source - alias __FINALPATH__/; + alias __INSTALL_DIR__/; index index.php doku.php; diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf deleted file mode 100644 index 238913c..0000000 --- a/conf/php-fpm.conf +++ /dev/null @@ -1,432 +0,0 @@ -; Start a new pool named 'www'. -; the variable $pool can be used in any directive and will be replaced by the -; pool name ('www' here) -[__NAMETOCHANGE__] - -; Per pool prefix -; It only applies on the following directives: -; - 'access.log' -; - 'slowlog' -; - 'listen' (unixsocket) -; - 'chroot' -; - 'chdir' -; - 'php_values' -; - 'php_admin_values' -; When not set, the global prefix (or /usr) applies instead. -; Note: This directive can also be relative to the global prefix. -; Default Value: none -;prefix = /path/to/pools/$pool - -; Unix user/group of processes -; Note: The user is mandatory. If the group is not set, the default user's group -; will be used. -user = __USER__ -group = __USER__ - -; The address on which to accept FastCGI requests. -; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on -; a specific port; -; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on -; a specific port; -; 'port' - to listen on a TCP socket to all addresses -; (IPv6 and IPv4-mapped) on a specific port; -; '/path/to/unix/socket' - to listen on a unix socket. -; Note: This value is mandatory. -listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock - -; Set listen(2) backlog. -; Default Value: 511 (-1 on FreeBSD and OpenBSD) -;listen.backlog = 511 - -; Set permissions for unix socket, if one is used. In Linux, read/write -; permissions must be set in order to allow connections from a web server. Many -; BSD-derived systems allow connections regardless of permissions. -; Default Values: user and group are set as the running user -; mode is set to 0660 -listen.owner = www-data -listen.group = www-data -;listen.mode = 0660 -; When POSIX Access Control Lists are supported you can set them using -; these options, value is a comma separated list of user/group names. -; When set, listen.owner and listen.group are ignored -;listen.acl_users = -;listen.acl_groups = - -; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. -; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original -; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address -; must be separated by a comma. If this value is left blank, connections will be -; accepted from any ip address. -; Default Value: any -;listen.allowed_clients = 127.0.0.1 - -; Specify the nice(2) priority to apply to the pool processes (only if set) -; The value can vary from -19 (highest priority) to 20 (lower priority) -; Note: - It will only work if the FPM master process is launched as root -; - The pool processes will inherit the master process priority -; unless it specified otherwise -; Default Value: no set -; process.priority = -19 - -; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user -; or group is differrent than the master process user. It allows to create process -; core dump and ptrace the process for the pool user. -; Default Value: no -; process.dumpable = yes - -; Choose how the process manager will control the number of child processes. -; Possible Values: -; static - a fixed number (pm.max_children) of child processes; -; dynamic - the number of child processes are set dynamically based on the -; following directives. With this process management, there will be -; always at least 1 children. -; pm.max_children - the maximum number of children that can -; be alive at the same time. -; pm.start_servers - the number of children created on startup. -; pm.min_spare_servers - the minimum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is less than this -; number then some children will be created. -; pm.max_spare_servers - the maximum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is greater than this -; number then some children will be killed. -; ondemand - no children are created at startup. Children will be forked when -; new requests will connect. The following parameter are used: -; pm.max_children - the maximum number of children that -; can be alive at the same time. -; pm.process_idle_timeout - The number of seconds after which -; an idle process will be killed. -; Note: This value is mandatory. -pm = dynamic - -; The number of child processes to be created when pm is set to 'static' and the -; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. -; This value sets the limit on the number of simultaneous requests that will be -; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. -; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP -; CGI. The below defaults are based on a server without much resources. Don't -; forget to tweak pm.* to fit your needs. -; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' -; Note: This value is mandatory. -pm.max_children = 5 - -; The number of child processes created on startup. -; Note: Used only when pm is set to 'dynamic' -; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 -pm.start_servers = 2 - -; The desired minimum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.min_spare_servers = 1 - -; The desired maximum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.max_spare_servers = 3 - -; The number of seconds after which an idle process will be killed. -; Note: Used only when pm is set to 'ondemand' -; Default Value: 10s -;pm.process_idle_timeout = 10s; - -; The number of requests each child process should execute before respawning. -; This can be useful to work around memory leaks in 3rd party libraries. For -; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. -; Default Value: 0 -;pm.max_requests = 500 - -; The URI to view the FPM status page. If this value is not set, no URI will be -; recognized as a status page. It shows the following informations: -; pool - the name of the pool; -; process manager - static, dynamic or ondemand; -; start time - the date and time FPM has started; -; start since - number of seconds since FPM has started; -; accepted conn - the number of request accepted by the pool; -; listen queue - the number of request in the queue of pending -; connections (see backlog in listen(2)); -; max listen queue - the maximum number of requests in the queue -; of pending connections since FPM has started; -; listen queue len - the size of the socket queue of pending connections; -; idle processes - the number of idle processes; -; active processes - the number of active processes; -; total processes - the number of idle + active processes; -; max active processes - the maximum number of active processes since FPM -; has started; -; max children reached - number of times, the process limit has been reached, -; when pm tries to start more children (works only for -; pm 'dynamic' and 'ondemand'); -; Value are updated in real time. -; Example output: -; pool: www -; process manager: static -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 62636 -; accepted conn: 190460 -; listen queue: 0 -; max listen queue: 1 -; listen queue len: 42 -; idle processes: 4 -; active processes: 11 -; total processes: 15 -; max active processes: 12 -; max children reached: 0 -; -; By default the status page output is formatted as text/plain. Passing either -; 'html', 'xml' or 'json' in the query string will return the corresponding -; output syntax. Example: -; http://www.foo.bar/status -; http://www.foo.bar/status?json -; http://www.foo.bar/status?html -; http://www.foo.bar/status?xml -; -; By default the status page only outputs short status. Passing 'full' in the -; query string will also return status for each pool process. -; Example: -; http://www.foo.bar/status?full -; http://www.foo.bar/status?json&full -; http://www.foo.bar/status?html&full -; http://www.foo.bar/status?xml&full -; The Full status returns for each process: -; pid - the PID of the process; -; state - the state of the process (Idle, Running, ...); -; start time - the date and time the process has started; -; start since - the number of seconds since the process has started; -; requests - the number of requests the process has served; -; request duration - the duration in µs of the requests; -; request method - the request method (GET, POST, ...); -; request URI - the request URI with the query string; -; content length - the content length of the request (only with POST); -; user - the user (PHP_AUTH_USER) (or '-' if not set); -; script - the main script called (or '-' if not set); -; last request cpu - the %cpu the last request consumed -; it's always 0 if the process is not in Idle state -; because CPU calculation is done when the request -; processing has terminated; -; last request memory - the max amount of memory the last request consumed -; it's always 0 if the process is not in Idle state -; because memory calculation is done when the request -; processing has terminated; -; If the process is in Idle state, then informations are related to the -; last request the process has served. Otherwise informations are related to -; the current request being served. -; Example output: -; ************************ -; pid: 31330 -; state: Running -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 63087 -; requests: 12808 -; request duration: 1250261 -; request method: GET -; request URI: /test_mem.php?N=10000 -; content length: 0 -; user: - -; script: /home/fat/web/docs/php/test_mem.php -; last request cpu: 0.00 -; last request memory: 0 -; -; Note: There is a real-time FPM status monitoring sample web page available -; It's available in: /usr/share/php/7.0/fpm/status.html -; -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;pm.status_path = /status - -; The ping URI to call the monitoring page of FPM. If this value is not set, no -; URI will be recognized as a ping page. This could be used to test from outside -; that FPM is alive and responding, or to -; - create a graph of FPM availability (rrd or such); -; - remove a server from a group if it is not responding (load balancing); -; - trigger alerts for the operating team (24/7). -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;ping.path = /ping - -; This directive may be used to customize the response of a ping request. The -; response is formatted as text/plain with a 200 response code. -; Default Value: pong -;ping.response = pong - -; The access log file -; Default: not set -;access.log = log/$pool.access.log - -; The access log format. -; The following syntax is allowed -; %%: the '%' character -; %C: %CPU used by the request -; it can accept the following format: -; - %{user}C for user CPU only -; - %{system}C for system CPU only -; - %{total}C for user + system CPU (default) -; %d: time taken to serve the request -; it can accept the following format: -; - %{seconds}d (default) -; - %{miliseconds}d -; - %{mili}d -; - %{microseconds}d -; - %{micro}d -; %e: an environment variable (same as $_ENV or $_SERVER) -; it must be associated with embraces to specify the name of the env -; variable. Some exemples: -; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e -; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e -; %f: script filename -; %l: content-length of the request (for POST request only) -; %m: request method -; %M: peak of memory allocated by PHP -; it can accept the following format: -; - %{bytes}M (default) -; - %{kilobytes}M -; - %{kilo}M -; - %{megabytes}M -; - %{mega}M -; %n: pool name -; %o: output header -; it must be associated with embraces to specify the name of the header: -; - %{Content-Type}o -; - %{X-Powered-By}o -; - %{Transfert-Encoding}o -; - .... -; %p: PID of the child that serviced the request -; %P: PID of the parent of the child that serviced the request -; %q: the query string -; %Q: the '?' character if query string exists -; %r: the request URI (without the query string, see %q and %Q) -; %R: remote IP address -; %s: status (response code) -; %t: server time the request was received -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %T: time the log has been written (the request has finished) -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %u: remote user -; -; Default: "%R - %u %t \"%m %r\" %s" -;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" - -; The log file for slow requests -; Default Value: not set -; Note: slowlog is mandatory if request_slowlog_timeout is set -;slowlog = log/$pool.log.slow - -; The timeout for serving a single request after which a PHP backtrace will be -; dumped to the 'slowlog' file. A value of '0s' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -;request_slowlog_timeout = 0 - -; The timeout for serving a single request after which the worker process will -; be killed. This option should be used when the 'max_execution_time' ini option -; does not stop script execution for some reason. A value of '0' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -request_terminate_timeout = 1d - -; Set open file descriptor rlimit. -; Default Value: system defined value -;rlimit_files = 1024 - -; Set max core size rlimit. -; Possible Values: 'unlimited' or an integer greater or equal to 0 -; Default Value: system defined value -;rlimit_core = 0 - -; Chroot to this directory at the start. This value must be defined as an -; absolute path. When this value is not set, chroot is not used. -; Note: you can prefix with '$prefix' to chroot to the pool prefix or one -; of its subdirectories. If the pool prefix is not set, the global prefix -; will be used instead. -; Note: chrooting is a great security feature and should be used whenever -; possible. However, all PHP paths will be relative to the chroot -; (error_log, sessions.save_path, ...). -; Default Value: not set -;chroot = - -; Chdir to this directory at the start. -; Note: relative path can be used. -; Default Value: current directory or / when chroot -chdir = __FINALPATH__ - -; Redirect worker stdout and stderr into main error log. If not set, stdout and -; stderr will be redirected to /dev/null according to FastCGI specs. -; Note: on highloaded environement, this can cause some delay in the page -; process time (several ms). -; Default Value: no -;catch_workers_output = yes - -; Clear environment in FPM workers -; Prevents arbitrary environment variables from reaching FPM worker processes -; by clearing the environment in workers before env vars specified in this -; pool configuration are added. -; Setting to "no" will make all environment variables available to PHP code -; via getenv(), $_ENV and $_SERVER. -; Default Value: yes -;clear_env = no - -; Limits the extensions of the main script FPM will allow to parse. This can -; prevent configuration mistakes on the web server side. You should only limit -; FPM to .php extensions to prevent malicious users to use other extensions to -; execute php code. -; Note: set an empty value to allow all extensions. -; Default Value: .php -;security.limit_extensions = .php .php3 .php4 .php5 .php7 - -; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from -; the current environment. -; Default Value: clean env -;env[HOSTNAME] = $HOSTNAME -;env[PATH] = /usr/local/bin:/usr/bin:/bin -;env[TMP] = /tmp -;env[TMPDIR] = /tmp -;env[TEMP] = /tmp - -; Additional php.ini defines, specific to this pool of workers. These settings -; overwrite the values previously defined in the php.ini. The directives are the -; same as the PHP SAPI: -; php_value/php_flag - you can set classic ini defines which can -; be overwritten from PHP call 'ini_set'. -; php_admin_value/php_admin_flag - these directives won't be overwritten by -; PHP call 'ini_set' -; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. - -; Defining 'extension' will load the corresponding shared extension from -; extension_dir. Defining 'disable_functions' or 'disable_classes' will not -; overwrite previously defined php.ini values, but will append the new value -; instead. - -; Note: path INI options can be relative and will be expanded with the prefix -; (pool, global or /usr) - -; Default Value: nothing is defined by default except the values in php.ini and -; specified at startup with the -d argument -;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com -;php_flag[display_errors] = off -;php_admin_value[error_log] = /var/log/fpm-php.www.log -;php_admin_flag[log_errors] = on -;php_admin_value[memory_limit] = 32M - -; Common values to change to increase file upload limit -; php_admin_value[upload_max_filesize] = 50M -; php_admin_value[post_max_size] = 50M -; php_admin_flag[mail.add_x_header] = Off - -; Other common parameters -; php_admin_value[max_execution_time] = 600 -; php_admin_value[max_input_time] = 300 -; php_admin_value[memory_limit] = 256M -; php_admin_flag[short_open_tag] = On -php_admin_value[upload_max_filesize] = 30M -php_admin_value[post_max_size] = 30M diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md deleted file mode 100644 index 3af12e4..0000000 --- a/doc/DISCLAIMER.md +++ /dev/null @@ -1,3 +0,0 @@ -## Limitations - -* Cannot create or login with DokuWiki internal users, only users from YunoHost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md deleted file mode 100644 index c759d77..0000000 --- a/doc/DISCLAIMER_fr.md +++ /dev/null @@ -1,3 +0,0 @@ -## Limitations - -* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de YunoHost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) diff --git a/manifest.json b/manifest.json deleted file mode 100644 index 19174f2..0000000 --- a/manifest.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "Dokuwiki", - "id": "dokuwiki", - "packaging_format": 1, - "description": { - "en": "Lightweight, simple to use and highly versatile wiki", - "fr": "Wiki léger, simple à utiliser et très polyvalent", - "de": "Standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab", - "es": "Sistema de Wiki de uso sencillicimo y compatible con los estándares", - "it": "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" - }, - "version": "2022.07.31a~ynh2", - "url": "https://www.dokuwiki.org", - "upstream": { - "license": "GPL-2.0-or-later", - "website": "https://www.dokuwiki.org", - "demo": "https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo", - "admindoc": "https://www.dokuwiki.org/manual", - "code": "https://github.com/splitbrain/dokuwiki", - "cpe": "cpe:2.3:a:dokuwiki:dokuwiki" - }, - "license": "GPL-2.0-or-later", - "maintainer": { - "name": "Gofannon", - "email": "gofannon@riseup.net" - }, - "previous_maintainers": [ - { - "name": "opi", - "email": "opi@zeropi.net" - } - ], - "requirements": { - "yunohost": ">= 11.0.0" - }, - "multi_instance": true, - "services": [ - "nginx", - "php8.1-fpm" - ], - "arguments": { - "install": [ - { - "name": "domain", - "type": "domain" - }, - { - "name": "path", - "type": "path", - "example": "/dokuwiki", - "default": "/dokuwiki" - }, - { - "name": "is_public", - "type": "boolean", - "default": true, - "help": { - "en": "Makes the wiki accessible directly from the Internet for everyone, without intermediate YunoHost authentication", - "fr": "Rend le wiki accessible directement depuis Internet pour tout le monde, sans authentification YunoHost intermédiaire" - } - }, - { - "name": "language", - "type": "string", - "ask": { - "en": "Choose the application language", - "fr": "Choisissez la langue de l'application" - }, - "choices": [ - "en", - "fr" - ], - "default": "en" - }, - { - "name": "admin", - "type": "user" - } - ] - } -} diff --git a/manifest.toml b/manifest.toml new file mode 100644 index 0000000..411a65a --- /dev/null +++ b/manifest.toml @@ -0,0 +1,73 @@ +packaging_format = 2 + +id = "dokuwiki" +name = "Dokuwiki" +description.en = "Lightweight, simple to use and highly versatile wiki" +description.fr = "Wiki léger, simple à utiliser et très polyvalent" +description.de = "Standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab" +description.es = "Sistema de Wiki de uso sencillicimo y compatible con los estándares" +description.it = "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" + +version = "2023.04.04a~ynh1" + +maintainers = ["Gofannon"] + +[upstream] +license = "GPL-2.0-or-later" +website = "https://www.dokuwiki.org" +demo = "https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo" +admindoc = "https://www.dokuwiki.org/manual" +code = "https://github.com/splitbrain/dokuwiki" + +[integration] +yunohost = ">= 11.1.19" +architectures = "all" +multi_instance = true +ldap = true +sso = true +disk = "50M" +ram.build = "200M" +ram.runtime = "50M" + +[install] + [install.domain] + type = "domain" + + [install.path] + type = "path" + default = "/dokuwiki" + + [install.init_main_permission] + help.en = "Makes the wiki accessible directly from the Internet for everyone, without intermediate YunoHost authentication" + help.fr = "Rend le wiki accessible directement depuis Internet pour tout le monde, sans authentification YunoHost intermédiaire" + type = "group" + default = "visitors" + + [install.language] + ask.en = "Choose the application language" + ask.fr = "Choisissez la langue de l'application" + type = "string" + choices = ["en", "fr"] + default = "en" + + [install.admin] + type = "user" + +[resources] + [resources.sources.main] + url = "https://github.com/dokuwiki/dokuwiki/releases/download/release-2023-04-04a/dokuwiki-2023-04-04a.tgz" + sha256 = "153c99cf42b9068b1ec21a2c765b862a44b374ad2f1a39223f5511a982b160bb" + autoupdate.strategy = "latest_github_tag" + + [resources.system_user] + + [resources.install_dir] + + [resources.permissions] + main.url = "/" + admin.url = "/admin" + admin.show_tile = false + admin.allowed = "admins" + + [resources.apt] + packages = "php8.1-xml php8.1-ldap php8.1-gd php8.1-cli" diff --git a/scripts/_common.sh b/scripts/_common.sh index 07ff399..1e47ce7 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -5,24 +5,6 @@ #================================================= # PHP APP SPECIFIC #================================================= -# Depending on its version, YunoHost uses different default PHP version: -## YunoHost version "11.X" => PHP 7.4 -## YunoHost version "4.X" => PHP 7.3 -# -# This behaviour can be overridden by setting the YNH_PHP_VERSION variable -#YNH_PHP_VERSION=7.3 -#YNH_PHP_VERSION=7.4 -#YNH_PHP_VERSION=8.0 -YNH_PHP_VERSION=8.1 -# For more information, see the PHP application helper: https://github.com/YunoHost/yunohost/blob/dev/helpers/php#L3-L6 -# Or this app package depending on PHP: https://github.com/YunoHost-Apps/grav_ynh/blob/master/scripts/_common.sh -# PHP dependencies used by the app (must be on a single line) -php_dependencies="php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-ldap php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-cli" -# or, if you do not need a custom YNH_PHP_VERSION: -###php_dependencies="php$YNH_DEFAULT_PHP_VERSION-deb1 php$YNH_DEFAULT_PHP_VERSION-deb2" - -# dependencies used by the app (must be on a single line) -pkg_dependencies="$php_dependencies" #================================================= # PERSONAL HELPERS diff --git a/scripts/backup b/scripts/backup index 5ead872..5181ebf 100755 --- a/scripts/backup +++ b/scripts/backup @@ -10,24 +10,6 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_print_info --message="Loading installation settings..." - -app=$YNH_APP_INSTANCE_NAME - -final_path=$(ynh_app_setting_get --app=$app --key=final_path) -domain=$(ynh_app_setting_get --app=$app --key=domain) -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) - #================================================= # DECLARE DATA AND CONF FILES TO BACKUP #================================================= @@ -37,7 +19,7 @@ ynh_print_info --message="Declaring files to be backed up..." # BACKUP THE APP MAIN DIR #================================================= -ynh_backup --src_path="$final_path" +ynh_backup --src_path="$install_dir" #================================================= # BACKUP THE NGINX CONFIGURATION diff --git a/scripts/change_url b/scripts/change_url index 7b2adff..f2a1c4b 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -9,59 +9,6 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# RETRIEVE ARGUMENTS -#================================================= - -old_domain=$YNH_APP_OLD_DOMAIN -old_path=$YNH_APP_OLD_PATH - -new_domain=$YNH_APP_NEW_DOMAIN -new_path=$YNH_APP_NEW_PATH - -app=$YNH_APP_INSTANCE_NAME - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." - -# Needed for helper "ynh_add_nginx_config" -final_path=$(ynh_app_setting_get --app=$app --key=final_path) - -#================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP -#================================================= -ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 - -# 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" - - # 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 -#================================================= - -change_domain=0 -if [ "$old_domain" != "$new_domain" ] -then - change_domain=1 -fi - -change_path=0 -if [ "$old_path" != "$new_path" ] -then - change_path=1 -fi - #================================================= # STANDARD MODIFICATIONS #================================================= @@ -69,29 +16,7 @@ fi #================================================= ynh_script_progression --message="Updating NGINX web server configuration..." --weight=2 -nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf - -# Change the path in the NGINX config file -if [ $change_path -eq 1 ] -then - # Make a backup of the original NGINX config file if modified - ynh_backup_if_checksum_is_different --file="$nginx_conf_path" - # Set global variables for NGINX helper - domain="$old_domain" - path_url="$new_path" - # Create a dedicated NGINX config - ynh_add_nginx_config -fi - -# Change the domain for NGINX -if [ $change_domain -eq 1 ] -then - # Delete file checksum for the old conf file location - ynh_delete_file_checksum --file="$nginx_conf_path" - mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf - # Store file checksum for the new config file location - ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" -fi +ynh_change_url_nginx_config #================================================= # SPECIFIC MODIFICATIONS @@ -102,15 +27,6 @@ ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=6 ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $new_path.*$" --max_retry=5 -#================================================= -# GENERIC FINALISATION -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." - -ynh_systemd_action --service_name=nginx --action=reload - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/install b/scripts/install index e7f1dcd..5440773 100755 --- a/scripts/install +++ b/scripts/install @@ -9,89 +9,40 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - #================================================= # RETRIEVE ARGUMENTS FROM THE MANIFEST #================================================= -domain=$YNH_APP_ARG_DOMAIN -path_url=$YNH_APP_ARG_PATH -is_public=$YNH_APP_ARG_IS_PUBLIC -language=$YNH_APP_ARG_LANGUAGE -admin=$YNH_APP_ARG_ADMIN - -app=$YNH_APP_INSTANCE_NAME - -#================================================= -# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS -#================================================= -ynh_script_progression --message="Validating installation parameters..." --weight=2 - -final_path=/var/www/$app -test ! -e "$final_path" || ynh_die --message="This path already contains a folder" - -# Register (book) web path -ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url +fpm_footprint="low" +fpm_free_footprint=0 +fpm_usage="low" #================================================= # STORE SETTINGS FROM MANIFEST #================================================= -ynh_script_progression --message="Storing installation settings..." --weight=2 -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=language --value=$language - -#================================================= -# STANDARD MODIFICATIONS -#================================================= -# INSTALL DEPENDENCIES -#================================================= -ynh_script_progression --message="Installing dependencies..." --weight=1 - -ynh_install_app_dependencies $pkg_dependencies - -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." --weight=2 - -# Create a system user -ynh_system_user_create --username=$app --home_dir="$final_path" +ynh_app_setting_set --app=$app --key=fpm_footprint --value=$fpm_footprint +ynh_app_setting_set --app=$app --key=fpm_free_footprint --value=$fpm_free_footprint +ynh_app_setting_set --app=$app --key=fpm_usage --value=$fpm_usage #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= ynh_script_progression --message="Setting up source files..." --weight=2 -ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src -ynh_setup_source --dest_dir="$final_path" +ynh_setup_source --dest_dir="$install_dir" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= -# PHP-FPM CONFIGURATION +# SYSTEM CONFIGURATION #================================================= -ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 +ynh_script_progression --message="Adding system configurations related to $app..." --weight=1 # Create a dedicated PHP-FPM config -fpm_usage=low -fpm_footprint=low -ynh_add_fpm_config --usage="$fpm_usage" --footprint="$fpm_footprint" - -#================================================= -# NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Configuring NGINX web server..." --weight=2 +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint # Create a dedicated NGINX config ynh_add_nginx_config @@ -121,18 +72,18 @@ ynh_script_progression --message="Adding a configuration file..." --weight=2 # Customize admin group in case of multiple wiki install managed by different admins # dokuwiki.admin; dokuwiki__1.admin; etc -ynh_add_config --template="../conf/local.protected.php" --destination="$final_path/conf/local.protected.php" +ynh_add_config --template="../conf/local.protected.php" --destination="$install_dir/conf/local.protected.php" # This file might be modified by DokuWiki admin panel or by plugins # It will not be modified by Yunohost in order to keep user settings # Set the "language" -ynh_add_config --template="../conf/local.php" --destination="$final_path/conf/local.php" +ynh_add_config --template="../conf/local.php" --destination="$install_dir/conf/local.php" # Restrict user rights by enforcing "read-only" mode for all users # See https://www.dokuwiki.org/acl#background_info # Default is "8" -ynh_add_config --template="../conf/acl.auth.php" --destination="$final_path/conf/acl.auth.php" +ynh_add_config --template="../conf/acl.auth.php" --destination="$install_dir/conf/acl.auth.php" #================================================= # CREATE DEFAULT FILES @@ -143,20 +94,20 @@ ynh_script_progression --message="Creating default files..." --weight=1 # Other files will be read ony and owned by root. # See https://www.dokuwiki.org/install:permissions -cp --archive $final_path/conf/local.php.dist $final_path/conf/local.php.bak -cp --archive $final_path/conf/users.auth.php.dist $final_path/conf/users.auth.php +cp --archive $install_dir/conf/local.php.dist $install_dir/conf/local.php.bak +cp --archive $install_dir/conf/users.auth.php.dist $install_dir/conf/users.auth.php # This file might be used by plugins like https://www.dokuwiki.org/plugin:siteexport # Create it to be more "user friendly" as over the top security is not the main goal here # This file could be use for bad behaviour. # See https://www.dokuwiki.org/devel:preload?s[]=preload -cp --archive $final_path/inc/preload.php.dist $final_path/inc/preload.php +cp --archive $install_dir/inc/preload.php.dist $install_dir/inc/preload.php # There is no template .dist provided inside DokuWiki installation folder # Create "empty" files to be able to manage linux permissions # Files content is taken from an existing DokuWiki installation -cp --archive ../conf/plugins.local.php $final_path/conf -cp --archive ../conf/plugins.local.php $final_path/conf/plugins.local.php.bak +cp --archive ../conf/plugins.local.php $install_dir/conf +cp --archive ../conf/plugins.local.php $install_dir/conf/plugins.local.php.bak #================================================= # GENERIC FINALIZATION @@ -166,31 +117,7 @@ cp --archive ../conf/plugins.local.php $final_path/conf/plugins.local ynh_script_progression --message="Configuring Fail2Ban..." --weight=7 # Create a dedicated Fail2Ban config -ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 - -#================================================= -# SETUP SSOWAT -#================================================= -ynh_script_progression --message="Configuring permissions..." --weight=2 - -# Make app public if necessary -if [ $is_public -eq 1 ] -then - # Everyone can access the app. - # The "main" permission is automatically created before the install script. - ynh_permission_update --permission="main" --add="visitors" -fi - -# Create the "admin" permission and add the "admin" to it -# More users can be added to the group from the YunoHost webadmin -ynh_permission_create --permission "admin" --allowed "$admin" - -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -ynh_systemd_action --service_name=nginx --action=reload +ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path.*$" --max_retry=5 #================================================= # END OF SCRIPT diff --git a/scripts/remove b/scripts/remove index 309c7be..19a8599 100755 --- a/scripts/remove +++ b/scripts/remove @@ -9,68 +9,20 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 - -app=$YNH_APP_INSTANCE_NAME - -domain=$(ynh_app_setting_get --app=$app --key=domain) -final_path=$(ynh_app_setting_get --app=$app --key=final_path) - -#================================================= -# STANDARD REMOVE -#================================================= -# REMOVE APP MAIN DIR -#================================================= -ynh_script_progression --message="Removing app main directory..." --weight=1 - -# Remove the app directory securely -ynh_secure_remove --file="$final_path" - #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 +ynh_script_progression --message="Removing system configurations related to $app..." --weight=1 # Remove the dedicated NGINX config ynh_remove_nginx_config -#================================================= -# REMOVE PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=2 - # Remove the dedicated PHP-FPM config ynh_remove_fpm_config -#================================================= -# REMOVE DEPENDENCIES -#================================================= -ynh_script_progression --message="Removing dependencies..." --weight=1 - -# Remove metapackage and its dependencies -ynh_remove_app_dependencies - -#================================================= -# REMOVE FAIL2BAN CONFIGURATION -#================================================= -ynh_script_progression --message="Removing Fail2Ban configuration..." --weight=7 - # Remove the dedicated Fail2Ban config ynh_remove_fail2ban_config -#================================================= -# GENERIC FINALIZATION -#================================================= -# REMOVE DEDICATED USER -#================================================= -ynh_script_progression --message="Removing the dedicated system user..." --weight=1 - -# Delete a system user -ynh_system_user_delete --username=$app - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/restore b/scripts/restore index 0e1c0cb..75e684f 100755 --- a/scripts/restore +++ b/scripts/restore @@ -10,93 +10,29 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=2 - -app=$YNH_APP_INSTANCE_NAME - -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) -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) -fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) - -#================================================= -# CHECK IF THE APP CAN BE RESTORED -#================================================= -ynh_script_progression --message="Validating restoration parameters..." --weight=2 - -test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " - -#================================================= -# STANDARD RESTORATION STEPS -#================================================= -# RECREATE THE DEDICATED USER -#================================================= -ynh_script_progression --message="Recreating the dedicated system user..." --weight=2 - -# Create the dedicated user (if not existing) -ynh_system_user_create --username=$app --home_dir="$final_path" - #================================================= # RESTORE THE APP MAIN DIR #================================================= ynh_script_progression --message="Restoring the app main directory..." --weight=1 -ynh_restore_file --origin_path="$final_path" +ynh_restore_file --origin_path="$install_dir" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - -#================================================= -# RESTORE FAIL2BAN CONFIGURATION -#================================================= -ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=7 - -ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" -ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" -ynh_systemd_action --action=restart --service_name=fail2ban - -#================================================= -# SPECIFIC RESTORATION -#================================================= -# REINSTALL DEPENDENCIES -#================================================= -ynh_script_progression --message="Reinstalling dependencies..." --weight=1 - -# Define and install dependencies -ynh_install_app_dependencies $pkg_dependencies +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the PHP-FPM configuration..." --weight=5 +ynh_script_progression --message="Restoring system configurations related to $app..." --weight=1 ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -# Recreate a dedicated php-fpm config -# TODO: not in example_ynh, not needed? -#ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion - -#================================================= -# RESTORE THE NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Restoring the NGINX web server configuration..." --weight=1 - ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" +ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" +ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" +ynh_systemd_action --action=restart --service_name=fail2ban + #================================================= # GENERIC FINALIZATION #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 1e37e21..ca22984 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -9,42 +9,12 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=2 - -app=$YNH_APP_INSTANCE_NAME - -domain=$(ynh_app_setting_get --app=$app --key=domain) -path_url=$(ynh_app_setting_get --app=$app --key=path) -language=$(ynh_app_setting_get --app=$app --key=language) -final_path=$(ynh_app_setting_get --app=$app --key=final_path) -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) -fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) - #================================================= # CHECK VERSION #================================================= -ynh_script_progression --message="Checking version..." --weight=1 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)..." --weight=9 - -# 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 - #================================================= # STANDARD UPGRADE STEPS #================================================= @@ -52,59 +22,24 @@ ynh_abort_if_errors #================================================= ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 -# If final_path doesn't exist, create it -if [ -z "$final_path" ]; then - final_path=/var/www/$app - ynh_app_setting_set --app=$app --key=final_path --value=$final_path -fi - -# language default value, if not set -if [ -z "$language" ]; then - language='en' - ynh_app_setting_set --app=$app --key=language --value=$language -fi - # If fpm_footprint doesn't exist, create it -if [ -z "$fpm_footprint" ]; then +if [ -z "${fpm_footprint:-}" ]; then fpm_footprint=low ynh_app_setting_set --app=$app --key=fpm_footprint --value=$fpm_footprint fi +# If fpm_free_footprint doesn't exist, create it +if [ -z "${fpm_free_footprint:-}" ]; then + fpm_free_footprint=0 + ynh_app_setting_set --app=$app --key=fpm_free_footprint --value=$fpm_free_footprint +fi + # If fpm_usage doesn't exist, create it -if [ -z "$fpm_usage" ]; then +if [ -z "${fpm_usage:-}" ]; then fpm_usage=low ynh_app_setting_set --app=$app --key=fpm_usage --value=$fpm_usage fi -# If phpversion doesn't exist, create it -if [ -z "$phpversion" ]; then - phpversion=$YNH_PHP_VERSION - ynh_app_setting_set --app=$app --key=phpversion --value=$phpversion -fi - -# Cleaning legacy permissions -admin_user=$(ynh_app_setting_get --app=$app --key=admin) - -if [ -n "$admin_user" ]; then - # Removing skipped/unprotected_uris under certain conditions, remove the visitors group added during the migration process of 3.7 - # Remove skipped_uris. If the app was public, add visitors again to the main permission - if ynh_permission_has_user --permission=admin --user="$admin_user" - then - echo "permission admin already exist. Nothing to do" - else - ynh_permission_create --permission "admin" --allowed "$admin_user" - fi - # Remove legacy admin setting - ynh_app_setting_delete --app=$app --key=admin -fi - -# Cleaning legacy permissions -if ynh_legacy_permissions_exists; then - ynh_legacy_permissions_delete_all - - ynh_app_setting_delete --app=$app --key=is_public -fi - # Yunohost specific configuration, if it isn't exist already # Previously, these settings were store in an unique "dokuwiki.php" @@ -124,22 +59,22 @@ fi # Create an empty configuration file if it does not exist # This file will be overwritten anyway later in the part "# LDAP Configuration" # The file is created here to prevent a failure of the helper `ynh_backup_if_checksum_is_different` -if [ ! -f "$final_path/conf/local.protected.php" ]; then - touch $final_path/conf/local.protected.php +if [ ! -f "$install_dir/conf/local.protected.php" ]; then + touch $install_dir/conf/local.protected.php fi # Do not overwrite existing dokuwiki configuration as it could have user customization's and settings. # Create file if it does not exist -if [ ! -f "$final_path/conf/local.php" ]; then +if [ ! -f "$install_dir/conf/local.php" ]; then # Set the default "language" - ynh_add_config --template="../conf/local.php" --destination="$final_path/conf/local.php" + ynh_add_config --template="../conf/local.php" --destination="$install_dir/conf/local.php" fi # Do not overwrite existing ACL configuration file as it could have user customization's and settings. # Create file if it does not exist # See https://www.dokuwiki.org/acl#background_info -if [ ! -f "$final_path/conf/acl.auth.php" ]; then - ynh_add_config --template="../conf/acl.auth.php" --destination="$final_path/conf/acl.auth.php" +if [ ! -f "$install_dir/conf/acl.auth.php" ]; then + ynh_add_config --template="../conf/acl.auth.php" --destination="$install_dir/conf/acl.auth.php" fi # For securing DokuWiki installation, create default files that will be writable in the "conf" folder. @@ -147,53 +82,44 @@ fi # See https://www.dokuwiki.org/install:permissions # If file does not exists -if [ ! -f "$final_path/conf/local.php.bak" ]; then +if [ ! -f "$install_dir/conf/local.php.bak" ]; then # if template exists - if [ -f "$final_path/conf/local.php.dist" ]; then + if [ -f "$install_dir/conf/local.php.dist" ]; then # Copy template to create default file - cp --archive "$final_path/conf/local.php.dist" "$final_path/conf/local.php.bak" + cp --archive "$install_dir/conf/local.php.dist" "$install_dir/conf/local.php.bak" fi fi -if [ ! -f "$final_path/conf/users.auth.php" ]; then - if [ -f "$final_path/conf/users.auth.php.dist" ]; then - cp --archive $final_path/conf/users.auth.php.dist $final_path/conf/users.auth.php +if [ ! -f "$install_dir/conf/users.auth.php" ]; then + if [ -f "$install_dir/conf/users.auth.php.dist" ]; then + cp --archive $install_dir/conf/users.auth.php.dist $install_dir/conf/users.auth.php fi fi -if [ ! -f "$final_path/conf/plugins.local.php" ]; then - cp --archive ../conf/plugins.local.php $final_path/conf +if [ ! -f "$install_dir/conf/plugins.local.php" ]; then + cp --archive ../conf/plugins.local.php $install_dir/conf fi -if [ ! -f "$final_path/conf/plugins.local.php.bak" ]; then - cp --archive ../conf/plugins.local.php $final_path/conf/plugins.local.php.bak +if [ ! -f "$install_dir/conf/plugins.local.php.bak" ]; then + cp --archive ../conf/plugins.local.php $install_dir/conf/plugins.local.php.bak fi -if [ ! -f "$final_path/inc/preload.php" ]; then +if [ ! -f "$install_dir/inc/preload.php" ]; then # if template exists - if [ -f "$final_path/inc/preload.php.dist" ]; then + if [ -f "$install_dir/inc/preload.php.dist" ]; then # Copy template to create default file - cp --archive "$final_path/inc/preload.php.dist" "$final_path/inc/preload.php" + cp --archive "$install_dir/inc/preload.php.dist" "$install_dir/inc/preload.php" fi fi # purge "LOGAUTHERROR PLUGIN" as not compatible and not maintained anymore # See https://www.dokuwiki.org/plugin:logautherror -if [ -d "$final_path/lib/plugins/logautherror" ]; then +if [ -d "$install_dir/lib/plugins/logautherror" ]; then ynh_script_progression --message="Purge "LOGAUTHERROR PLUGIN" as not maintained anymore" --weight=1 - ynh_secure_remove --file "$final_path/lib/plugins/logautherror" + ynh_secure_remove --file "$install_dir/lib/plugins/logautherror" fi - -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 - -# Create a dedicated user (if not existing) -ynh_system_user_create --username=$app --home_dir="$final_path" - #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -203,33 +129,20 @@ then ynh_script_progression --message="Upgrading source files..." --weight=2 # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir="$final_path" + ynh_setup_source --dest_dir="$install_dir" fi -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= -# UPGRADE DEPENDENCIES +# REAPPLY SYSTEM CONFIGURATIONS #================================================= -ynh_script_progression --message="Upgrading dependencies..." --weight=1 - -ynh_install_app_dependencies $pkg_dependencies - -#================================================= -# PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 +ynh_script_progression --message="Upgrading system configurations related to $app..." --weight=1 # Create a dedicated PHP-FPM config ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint -#================================================= -# NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 - # Create a dedicated NGINX config ynh_add_nginx_config @@ -245,11 +158,11 @@ then # Remove upgrade notification inside Dokuwiki's admin panel # See https://www.dokuwiki.org/update_check - touch $final_path/doku.php + touch $install_dir/doku.php # Remove files not used anymore after upgrade # See https://www.dokuwiki.org/install:unused_files - if [ -f "$final_path/data/deleted.files" ]; then + if [ -f "$install_dir/data/deleted.files" ]; then # Feed output of grep[...] line by line to 'ynh_secure_remove' # 'ynh_secure_remove' can only work file by file. Cannot work with a list @@ -277,7 +190,7 @@ then if [ -f "$line" ]; then ynh_secure_remove --file "$line" fi - done < <(grep --null --extended-regexp --invert-match '^($|#)' "$final_path/data/deleted.files" | xargs --null --max-args=1 || true) + done < <(grep --null --extended-regexp --invert-match '^($|#)' "$install_dir/data/deleted.files" | xargs --null --max-args=1 || true) # ^ ^ First < is redirection, second is process substitution. # Source: https://tldp.org/LDP/abs/html/process-sub.html @@ -291,27 +204,25 @@ fi # TODO Taken from old "upgrade" script. Should check if it is needed and what it does # Update all plugins - ###for name_plugin in $(sudo -s cat $final_path/lib/plugins/*/plugin.info.txt | grep url | awk -F ':' '{print $3}'); + ###for name_plugin in $(sudo -s cat $install_dir/lib/plugins/*/plugin.info.txt | grep url | awk -F ':' '{print $3}'); ###do ### # Get a official plugin for dokuwiki, not update a no-official ### wget -nv --quiet "https://github.com/splitbrain/dokuwiki-plugin-$name_plugin/zipball/master" -O "${name_plugin}.zip" -o /dev/null || true ### if [ -s "${name_plugin}.zip" ]; then ### unzip ${name_plugin}.zip - ### cp -a splitbrain-dokuwiki-plugin-${name_plugin}*/. "$final_path/lib/plugins/$name_plugin/" + ### cp -a splitbrain-dokuwiki-plugin-${name_plugin}*/. "$install_dir/lib/plugins/$name_plugin/" ### fi ###done # if "file" exists and is executable # Stolen from https://github.com/YunoHost-Apps/grav_ynh/blob/testing/scripts/upgrade#L189 - if [ -x "$final_path/bin/plugin.php" ]; then - pushd "$final_path" + if [ -x "$install_dir/bin/plugin.php" ]; then + pushd "$install_dir" ynh_exec_warn_less ynh_exec_as $app php$phpversion bin/plugin.php --no-colors extension upgrade || ynh_print_warn --message="Automatic plugin upgrade has failed, you can upgrade them from your DokuWiki admin panel." popd else ynh_print_warn --message="Automatic plugin cannot be done, you have to upgrade them from your DokuWiki admin panel." fi - - fi #================================================= @@ -321,8 +232,7 @@ ynh_script_progression --message="Adding a configuration file..." --weight=2 # Customize admin group in case of multiple wiki install managed by different admins # dokuwiki.admin; dokuwiki__1.admin; etc -ynh_add_config --template="../conf/local.protected.php" --destination="$final_path/conf/local.protected.php" - +ynh_add_config --template="../conf/local.protected.php" --destination="$install_dir/conf/local.protected.php" #================================================= # GENERIC FINALIZATION @@ -332,14 +242,7 @@ ynh_add_config --template="../conf/local.protected.php" --destination="$final_pa ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=7 # Create a dedicated Fail2Ban config -ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 - -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -ynh_systemd_action --service_name=nginx --action=reload +ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path.*$" --max_retry=5 #================================================= # END OF SCRIPT diff --git a/tests.toml b/tests.toml new file mode 100644 index 0000000..f766a45 --- /dev/null +++ b/tests.toml @@ -0,0 +1,11 @@ +test_format = 1.0 + +[default] + + + # ------------------------------- + # Commits to test upgrade from + # ------------------------------- + + test_upgrade_from.d451b3a3bb933149da9e44000f01b750337c3d3c.name = "Upgrade from 2022.07.31a" + \ No newline at end of file From a8a4a392b11bcac6971473e15e8957b10919735b Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 16 May 2023 14:01:26 +0200 Subject: [PATCH 118/144] Testing (#97) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Apply example_ynh * Cleanup ynh_clean_setup * Fix "php conf location" breaking backup script See https://github.com/YunoHost-Apps/dokuwiki_ynh/issues/96 the bug: > php file is still in folder: '/etc/php/7.4/fpm/pool.d/' after upgrade > instead of '8.1' folder. Changing the "ynh_add_fpm_config" for the fix. The helper should do the "php version handling" instead of the package itself Example taken on the package: https://github.com/YunoHost-Apps/wordpress_ynh/blob/testing/scripts/upgrade * enh use helper "ynh_add_config" to manage file * bump package version and changelog * Auto-update README * Version 2 (#98) * v2 * v2 * Auto-update README * Update tests.toml * Update manifest.toml * Update LICENSE * cleaning * cleaning --------- Co-authored-by: yunohost-bot --------- Co-authored-by: yalh76 Co-authored-by: Gofannon Co-authored-by: yunohost-bot Co-authored-by: Éric Gaspar <46165813+ericgaspar@users.noreply.github.com> --- CHANGELOG.md | 100 ----- LICENSE | 855 ++++++++++++++++++++++++++++++++----------- README.md | 12 +- README_fr.md | 30 +- check_process | 33 -- conf/app.src | 5 - conf/nginx.conf | 2 +- conf/php-fpm.conf | 432 ---------------------- doc/DISCLAIMER.md | 3 - doc/DISCLAIMER_fr.md | 3 - manifest.json | 81 ---- manifest.toml | 73 ++++ scripts/_common.sh | 18 - scripts/backup | 21 +- scripts/change_url | 86 +---- scripts/install | 170 ++------- scripts/remove | 51 +-- scripts/restore | 113 +----- scripts/upgrade | 252 +++---------- tests.toml | 11 + 20 files changed, 844 insertions(+), 1507 deletions(-) delete mode 100644 CHANGELOG.md delete mode 100644 check_process delete mode 100644 conf/app.src delete mode 100644 conf/php-fpm.conf delete mode 100644 doc/DISCLAIMER.md delete mode 100644 doc/DISCLAIMER_fr.md delete mode 100644 manifest.json create mode 100644 manifest.toml create mode 100644 tests.toml diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index b03d4e8..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,100 +0,0 @@ -# Changelog - -## [Unreleased] - -## [2018-04-22a~ynhXX] - -### Added - -- Upgrade actions and config-panel scripts - ------------- - -# [2022.07.31a~ynh1] - 2022-09-XX - -## Added - -- New DokuWiki version `2022-07-31a "Igor"` with **Hotfix 2022-07-31a** -- New automated tests for "check_process" CI - -## Changed - -- Use PHP8.1 as default (PHP7.4 is bulleyes will be EOL "28 Nov 2022" so bump the version) -- Change method to "automatic upgrade" of plugins -- Cleanning 'admin permission' handling -- redo how php is managed: ynh_add_fpm_config + php config files -- Sync with reference package 'example_ynh' - -## Removed - -- automatic installation of plugin "logautherror" (not compatible) -- support for YunoHost below 11 (no time to test against older versions) - -# [2020-07-29~ynh4] - 2021-01-19 - -### Added - -- Support for new permission system in YunoHost 3.7 - -### Changed - -- wiki administrators is now a group and can be modified from webadmin YunoHost panel -- Require YunoHost 3.7 minimum - -## [2020-07-29~ynh2] - 2020-10-23 - -### Added - -- New DokuWiki version `2020-07-29` - -### Changed - -- Set PHP7.3 as default - -## [2018-04-22b~ynh1] - 2020-03-23 - -### Added - -- New DokuWiki version `2018-04-22b` -- Changelog available in `CHANGELOG.md` - -### Changed - -- Upgrade content of file `pull_request_template.md` - -## [2018-04-22a~ynh3] - 2020-02-20 - -### Added - -- Use 'URL rewrite' for prettier URLs - -### Changed - -- Activate URL rewrite by default (does not break old links) - -### Removed - -- Unused DokuWiki config file - -## [2018-04-22a~ynh2] - 2020-02-20 - -### Added - -- Add fail2ban support to avoid bruteforce login attempts - -### Changed - -- Global upgrade of the package - -### Fixed - -- Get rid of the php ini file and merge its content into the pool file -- Update Readme following last work made on the package and current version in testing branch - -### Removed - -- Unused config file settings - -## [Previous versions] - YYYY-MM-DD - -- Will be written (one day maybye) diff --git a/LICENSE b/LICENSE index 3d3266e..f288702 100644 --- a/LICENSE +++ b/LICENSE @@ -1,241 +1,674 @@ -GNU AFFERO GENERAL PUBLIC LICENSE -Version 3, 19 November 2007 -Copyright (C) 2007 Free Software Foundation, Inc. + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. -Preamble + Preamble -The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. + The GNU General Public License is a free, copyleft license for +software and other kinds of works. -The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. -Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. -A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. -The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. -An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. -The precise terms and conditions for copying, distribution and modification follow. + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. -TERMS AND CONDITIONS + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. -0. Definitions. + The precise terms and conditions for copying, distribution and +modification follow. -"This License" refers to version 3 of the GNU Affero General Public License. + TERMS AND CONDITIONS -"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + 0. Definitions. -"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. + "This License" refers to version 3 of the GNU General Public License. -To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. -A "covered work" means either the unmodified Program or a work based on the Program. + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. -To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. -To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + A "covered work" means either the unmodified Program or a work based +on the Program. -An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. -1. Source Code. -The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. -A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. -The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + 1. Source Code. -The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those subprograms and other parts of the work. -The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -2. Basic Permissions. -All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. -No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. - -4. Conveying Verbatim Copies. -You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. -You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: - -a) The work must carry prominent notices stating that you modified it, and giving a relevant date. - -b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". - -c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. - -d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. - -A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. - -6. Conveying Non-Source Forms. -You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: - -a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. - -b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. - -c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. - -d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. - -e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. - -A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. - -"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). - -The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. - -7. Additional Terms. -"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: - -a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or - -b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or - -c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or - -d) Limiting the use for publicity purposes of names of licensors or authors of the material; or - -e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or - -f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. - -All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. - -8. Termination. - -You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. - -9. Acceptance Not Required for Having Copies. - -You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. - -10. Automatic Licensing of Downstream Recipients. - -Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. - -An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. - -11. Patents. - -A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". - -A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. - -In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to s ue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - -A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. - -12. No Surrender of Others' Freedom. - -If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. - -13. Remote Network Interaction; Use with the GNU General Public License. - -Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. - -Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. - -14. Revised Versions of this License. - -The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. - -Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. - -15. Disclaimer of Warranty. - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. - -If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - - -Copyright (C) - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. -If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: -You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index 71eccc6..3463fb9 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ It shall NOT be edited by hand. # Dokuwiki for YunoHost -[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Working status](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Working status](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) + [![Install Dokuwiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* @@ -25,8 +26,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... -**Shipped version:** 2022.07.31a~ynh1 - +**Shipped version:** 2023.04.04a~ynh1 **Demo:** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo @@ -34,12 +34,6 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ![Screenshot of Dokuwiki](./doc/screenshots/DokuWiki_Screenshot.png) -## Disclaimers / important information - -## Limitations - -* Cannot create or login with DokuWiki internal users, only users from YunoHost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) - ## Documentation and resources * Official app website: diff --git a/README_fr.md b/README_fr.md index 3fa688b..513fd2a 100644 --- a/README_fr.md +++ b/README_fr.md @@ -5,15 +5,16 @@ It shall NOT be edited by hand. # Dokuwiki pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) +[![Niveau d’intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) + [![Installer Dokuwiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) *[Read this readme in english.](./README.md)* -> *Ce package vous permet d'installer Dokuwiki 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.* +> *Ce package vous permet d’installer Dokuwiki 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.* -## Vue d'ensemble +## Vue d’ensemble DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne nécessite pas de base de données. Il est apprécié par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait un favori d'administrateur. Des contrôles d'accès et des connecteurs d'authentification intégrés rendent DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins apportés par sa communauté dynamique permettent un large éventail de cas d'utilisation au-delà d'un wiki traditionnel. @@ -25,26 +26,19 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Lors de la mise à jour, les plugins officiels sont également mis à jour. Nous vous recommandons toutefois de vérifier le bon fonctionnement des plugins dans le panneau d'administration après cette opération. Nous ne pouvons pas savoir si des plugins spéciaux posent problèmes... -**Version incluse :** 2022.07.31a~ynh1 - +**Version incluse :** 2023.04.04a~ynh1 **Démo :** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo -## Captures d'écran +## Captures d’écran -![Capture d'écran de Dokuwiki](./doc/screenshots/DokuWiki_Screenshot.png) - -## Avertissements / informations importantes - -## Limitations - -* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de YunoHost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) +![Capture d’écran de Dokuwiki](./doc/screenshots/DokuWiki_Screenshot.png) ## Documentations et ressources -* Site officiel de l'app : -* Documentation officielle de l'admin : -* Dépôt de code officiel de l'app : +* Site officiel de l’app : +* Documentation officielle de l’admin : +* Dépôt de code officiel de l’app : * Documentation YunoHost pour cette app : * Signaler un bug : @@ -60,4 +54,4 @@ ou sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ``` -**Plus d'infos sur le packaging d'applications :** +**Plus d’infos sur le packaging d’applications :** \ No newline at end of file diff --git a/check_process b/check_process deleted file mode 100644 index 5ff09b0..0000000 --- a/check_process +++ /dev/null @@ -1,33 +0,0 @@ -;; Test complet - auto_remove=1 - ; Manifest - domain="domain.tld" - path="/path" - admin="john" - is_public=1 - language=en - ; Checks - pkg_linter=1 - setup_sub_dir=1 - setup_root=1 - setup_nourl=0 - setup_private=1 - setup_public=1 - upgrade=1 - # Latest released version. See https://github.com/YunoHost-Apps/dokuwiki_ynh/commits/master - upgrade=1 from_commit=500a7d3fa9c008a2b75d0f6bec519e41fed97da0 - upgrade=1 from_commit=f45c459b287c8f045c08e65cea412cfc2cae38f4 - backup_restore=1 - multi_instance=1 - change_url=1 - actions=0 - config_panel=0 -;;; Options -Email= -Notification=none -;;; Upgrade options - ; commit=500a7d3fa9c008a2b75d0f6bec519e41fed97da0 - name=[fix] dedicated named location per $app (#63) - manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=Yes&language=en& - ; commit=f45c459b287c8f045c08e65cea412cfc2cae38f4 - name=add config panel diff --git a/conf/app.src b/conf/app.src deleted file mode 100644 index 8339df0..0000000 --- a/conf/app.src +++ /dev/null @@ -1,5 +0,0 @@ -SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2022-07-31a.tgz -SOURCE_SUM=48ed2ae11fa4a0ae8338af9aedc837601b34e21c0be15d16e2d6228ca7a91f23 -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=tar.gz -SOURCE_IN_SUBDIR=true diff --git a/conf/nginx.conf b/conf/nginx.conf index cb10924..13acc55 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -7,7 +7,7 @@ location __PATH__/ { # Path to source - alias __FINALPATH__/ ; + alias __INSTALL_DIR__/; index index.php doku.php; diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf deleted file mode 100644 index 238913c..0000000 --- a/conf/php-fpm.conf +++ /dev/null @@ -1,432 +0,0 @@ -; Start a new pool named 'www'. -; the variable $pool can be used in any directive and will be replaced by the -; pool name ('www' here) -[__NAMETOCHANGE__] - -; Per pool prefix -; It only applies on the following directives: -; - 'access.log' -; - 'slowlog' -; - 'listen' (unixsocket) -; - 'chroot' -; - 'chdir' -; - 'php_values' -; - 'php_admin_values' -; When not set, the global prefix (or /usr) applies instead. -; Note: This directive can also be relative to the global prefix. -; Default Value: none -;prefix = /path/to/pools/$pool - -; Unix user/group of processes -; Note: The user is mandatory. If the group is not set, the default user's group -; will be used. -user = __USER__ -group = __USER__ - -; The address on which to accept FastCGI requests. -; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on -; a specific port; -; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on -; a specific port; -; 'port' - to listen on a TCP socket to all addresses -; (IPv6 and IPv4-mapped) on a specific port; -; '/path/to/unix/socket' - to listen on a unix socket. -; Note: This value is mandatory. -listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock - -; Set listen(2) backlog. -; Default Value: 511 (-1 on FreeBSD and OpenBSD) -;listen.backlog = 511 - -; Set permissions for unix socket, if one is used. In Linux, read/write -; permissions must be set in order to allow connections from a web server. Many -; BSD-derived systems allow connections regardless of permissions. -; Default Values: user and group are set as the running user -; mode is set to 0660 -listen.owner = www-data -listen.group = www-data -;listen.mode = 0660 -; When POSIX Access Control Lists are supported you can set them using -; these options, value is a comma separated list of user/group names. -; When set, listen.owner and listen.group are ignored -;listen.acl_users = -;listen.acl_groups = - -; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. -; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original -; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address -; must be separated by a comma. If this value is left blank, connections will be -; accepted from any ip address. -; Default Value: any -;listen.allowed_clients = 127.0.0.1 - -; Specify the nice(2) priority to apply to the pool processes (only if set) -; The value can vary from -19 (highest priority) to 20 (lower priority) -; Note: - It will only work if the FPM master process is launched as root -; - The pool processes will inherit the master process priority -; unless it specified otherwise -; Default Value: no set -; process.priority = -19 - -; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user -; or group is differrent than the master process user. It allows to create process -; core dump and ptrace the process for the pool user. -; Default Value: no -; process.dumpable = yes - -; Choose how the process manager will control the number of child processes. -; Possible Values: -; static - a fixed number (pm.max_children) of child processes; -; dynamic - the number of child processes are set dynamically based on the -; following directives. With this process management, there will be -; always at least 1 children. -; pm.max_children - the maximum number of children that can -; be alive at the same time. -; pm.start_servers - the number of children created on startup. -; pm.min_spare_servers - the minimum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is less than this -; number then some children will be created. -; pm.max_spare_servers - the maximum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is greater than this -; number then some children will be killed. -; ondemand - no children are created at startup. Children will be forked when -; new requests will connect. The following parameter are used: -; pm.max_children - the maximum number of children that -; can be alive at the same time. -; pm.process_idle_timeout - The number of seconds after which -; an idle process will be killed. -; Note: This value is mandatory. -pm = dynamic - -; The number of child processes to be created when pm is set to 'static' and the -; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. -; This value sets the limit on the number of simultaneous requests that will be -; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. -; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP -; CGI. The below defaults are based on a server without much resources. Don't -; forget to tweak pm.* to fit your needs. -; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' -; Note: This value is mandatory. -pm.max_children = 5 - -; The number of child processes created on startup. -; Note: Used only when pm is set to 'dynamic' -; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 -pm.start_servers = 2 - -; The desired minimum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.min_spare_servers = 1 - -; The desired maximum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.max_spare_servers = 3 - -; The number of seconds after which an idle process will be killed. -; Note: Used only when pm is set to 'ondemand' -; Default Value: 10s -;pm.process_idle_timeout = 10s; - -; The number of requests each child process should execute before respawning. -; This can be useful to work around memory leaks in 3rd party libraries. For -; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. -; Default Value: 0 -;pm.max_requests = 500 - -; The URI to view the FPM status page. If this value is not set, no URI will be -; recognized as a status page. It shows the following informations: -; pool - the name of the pool; -; process manager - static, dynamic or ondemand; -; start time - the date and time FPM has started; -; start since - number of seconds since FPM has started; -; accepted conn - the number of request accepted by the pool; -; listen queue - the number of request in the queue of pending -; connections (see backlog in listen(2)); -; max listen queue - the maximum number of requests in the queue -; of pending connections since FPM has started; -; listen queue len - the size of the socket queue of pending connections; -; idle processes - the number of idle processes; -; active processes - the number of active processes; -; total processes - the number of idle + active processes; -; max active processes - the maximum number of active processes since FPM -; has started; -; max children reached - number of times, the process limit has been reached, -; when pm tries to start more children (works only for -; pm 'dynamic' and 'ondemand'); -; Value are updated in real time. -; Example output: -; pool: www -; process manager: static -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 62636 -; accepted conn: 190460 -; listen queue: 0 -; max listen queue: 1 -; listen queue len: 42 -; idle processes: 4 -; active processes: 11 -; total processes: 15 -; max active processes: 12 -; max children reached: 0 -; -; By default the status page output is formatted as text/plain. Passing either -; 'html', 'xml' or 'json' in the query string will return the corresponding -; output syntax. Example: -; http://www.foo.bar/status -; http://www.foo.bar/status?json -; http://www.foo.bar/status?html -; http://www.foo.bar/status?xml -; -; By default the status page only outputs short status. Passing 'full' in the -; query string will also return status for each pool process. -; Example: -; http://www.foo.bar/status?full -; http://www.foo.bar/status?json&full -; http://www.foo.bar/status?html&full -; http://www.foo.bar/status?xml&full -; The Full status returns for each process: -; pid - the PID of the process; -; state - the state of the process (Idle, Running, ...); -; start time - the date and time the process has started; -; start since - the number of seconds since the process has started; -; requests - the number of requests the process has served; -; request duration - the duration in µs of the requests; -; request method - the request method (GET, POST, ...); -; request URI - the request URI with the query string; -; content length - the content length of the request (only with POST); -; user - the user (PHP_AUTH_USER) (or '-' if not set); -; script - the main script called (or '-' if not set); -; last request cpu - the %cpu the last request consumed -; it's always 0 if the process is not in Idle state -; because CPU calculation is done when the request -; processing has terminated; -; last request memory - the max amount of memory the last request consumed -; it's always 0 if the process is not in Idle state -; because memory calculation is done when the request -; processing has terminated; -; If the process is in Idle state, then informations are related to the -; last request the process has served. Otherwise informations are related to -; the current request being served. -; Example output: -; ************************ -; pid: 31330 -; state: Running -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 63087 -; requests: 12808 -; request duration: 1250261 -; request method: GET -; request URI: /test_mem.php?N=10000 -; content length: 0 -; user: - -; script: /home/fat/web/docs/php/test_mem.php -; last request cpu: 0.00 -; last request memory: 0 -; -; Note: There is a real-time FPM status monitoring sample web page available -; It's available in: /usr/share/php/7.0/fpm/status.html -; -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;pm.status_path = /status - -; The ping URI to call the monitoring page of FPM. If this value is not set, no -; URI will be recognized as a ping page. This could be used to test from outside -; that FPM is alive and responding, or to -; - create a graph of FPM availability (rrd or such); -; - remove a server from a group if it is not responding (load balancing); -; - trigger alerts for the operating team (24/7). -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;ping.path = /ping - -; This directive may be used to customize the response of a ping request. The -; response is formatted as text/plain with a 200 response code. -; Default Value: pong -;ping.response = pong - -; The access log file -; Default: not set -;access.log = log/$pool.access.log - -; The access log format. -; The following syntax is allowed -; %%: the '%' character -; %C: %CPU used by the request -; it can accept the following format: -; - %{user}C for user CPU only -; - %{system}C for system CPU only -; - %{total}C for user + system CPU (default) -; %d: time taken to serve the request -; it can accept the following format: -; - %{seconds}d (default) -; - %{miliseconds}d -; - %{mili}d -; - %{microseconds}d -; - %{micro}d -; %e: an environment variable (same as $_ENV or $_SERVER) -; it must be associated with embraces to specify the name of the env -; variable. Some exemples: -; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e -; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e -; %f: script filename -; %l: content-length of the request (for POST request only) -; %m: request method -; %M: peak of memory allocated by PHP -; it can accept the following format: -; - %{bytes}M (default) -; - %{kilobytes}M -; - %{kilo}M -; - %{megabytes}M -; - %{mega}M -; %n: pool name -; %o: output header -; it must be associated with embraces to specify the name of the header: -; - %{Content-Type}o -; - %{X-Powered-By}o -; - %{Transfert-Encoding}o -; - .... -; %p: PID of the child that serviced the request -; %P: PID of the parent of the child that serviced the request -; %q: the query string -; %Q: the '?' character if query string exists -; %r: the request URI (without the query string, see %q and %Q) -; %R: remote IP address -; %s: status (response code) -; %t: server time the request was received -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %T: time the log has been written (the request has finished) -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %u: remote user -; -; Default: "%R - %u %t \"%m %r\" %s" -;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" - -; The log file for slow requests -; Default Value: not set -; Note: slowlog is mandatory if request_slowlog_timeout is set -;slowlog = log/$pool.log.slow - -; The timeout for serving a single request after which a PHP backtrace will be -; dumped to the 'slowlog' file. A value of '0s' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -;request_slowlog_timeout = 0 - -; The timeout for serving a single request after which the worker process will -; be killed. This option should be used when the 'max_execution_time' ini option -; does not stop script execution for some reason. A value of '0' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -request_terminate_timeout = 1d - -; Set open file descriptor rlimit. -; Default Value: system defined value -;rlimit_files = 1024 - -; Set max core size rlimit. -; Possible Values: 'unlimited' or an integer greater or equal to 0 -; Default Value: system defined value -;rlimit_core = 0 - -; Chroot to this directory at the start. This value must be defined as an -; absolute path. When this value is not set, chroot is not used. -; Note: you can prefix with '$prefix' to chroot to the pool prefix or one -; of its subdirectories. If the pool prefix is not set, the global prefix -; will be used instead. -; Note: chrooting is a great security feature and should be used whenever -; possible. However, all PHP paths will be relative to the chroot -; (error_log, sessions.save_path, ...). -; Default Value: not set -;chroot = - -; Chdir to this directory at the start. -; Note: relative path can be used. -; Default Value: current directory or / when chroot -chdir = __FINALPATH__ - -; Redirect worker stdout and stderr into main error log. If not set, stdout and -; stderr will be redirected to /dev/null according to FastCGI specs. -; Note: on highloaded environement, this can cause some delay in the page -; process time (several ms). -; Default Value: no -;catch_workers_output = yes - -; Clear environment in FPM workers -; Prevents arbitrary environment variables from reaching FPM worker processes -; by clearing the environment in workers before env vars specified in this -; pool configuration are added. -; Setting to "no" will make all environment variables available to PHP code -; via getenv(), $_ENV and $_SERVER. -; Default Value: yes -;clear_env = no - -; Limits the extensions of the main script FPM will allow to parse. This can -; prevent configuration mistakes on the web server side. You should only limit -; FPM to .php extensions to prevent malicious users to use other extensions to -; execute php code. -; Note: set an empty value to allow all extensions. -; Default Value: .php -;security.limit_extensions = .php .php3 .php4 .php5 .php7 - -; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from -; the current environment. -; Default Value: clean env -;env[HOSTNAME] = $HOSTNAME -;env[PATH] = /usr/local/bin:/usr/bin:/bin -;env[TMP] = /tmp -;env[TMPDIR] = /tmp -;env[TEMP] = /tmp - -; Additional php.ini defines, specific to this pool of workers. These settings -; overwrite the values previously defined in the php.ini. The directives are the -; same as the PHP SAPI: -; php_value/php_flag - you can set classic ini defines which can -; be overwritten from PHP call 'ini_set'. -; php_admin_value/php_admin_flag - these directives won't be overwritten by -; PHP call 'ini_set' -; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. - -; Defining 'extension' will load the corresponding shared extension from -; extension_dir. Defining 'disable_functions' or 'disable_classes' will not -; overwrite previously defined php.ini values, but will append the new value -; instead. - -; Note: path INI options can be relative and will be expanded with the prefix -; (pool, global or /usr) - -; Default Value: nothing is defined by default except the values in php.ini and -; specified at startup with the -d argument -;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com -;php_flag[display_errors] = off -;php_admin_value[error_log] = /var/log/fpm-php.www.log -;php_admin_flag[log_errors] = on -;php_admin_value[memory_limit] = 32M - -; Common values to change to increase file upload limit -; php_admin_value[upload_max_filesize] = 50M -; php_admin_value[post_max_size] = 50M -; php_admin_flag[mail.add_x_header] = Off - -; Other common parameters -; php_admin_value[max_execution_time] = 600 -; php_admin_value[max_input_time] = 300 -; php_admin_value[memory_limit] = 256M -; php_admin_flag[short_open_tag] = On -php_admin_value[upload_max_filesize] = 30M -php_admin_value[post_max_size] = 30M diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md deleted file mode 100644 index 3af12e4..0000000 --- a/doc/DISCLAIMER.md +++ /dev/null @@ -1,3 +0,0 @@ -## Limitations - -* Cannot create or login with DokuWiki internal users, only users from YunoHost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md deleted file mode 100644 index c759d77..0000000 --- a/doc/DISCLAIMER_fr.md +++ /dev/null @@ -1,3 +0,0 @@ -## Limitations - -* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de YunoHost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) diff --git a/manifest.json b/manifest.json deleted file mode 100644 index 65f05d4..0000000 --- a/manifest.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "Dokuwiki", - "id": "dokuwiki", - "packaging_format": 1, - "description": { - "en": "Lightweight, simple to use and highly versatile wiki", - "fr": "Wiki léger, simple à utiliser et très polyvalent", - "de": "Standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab", - "es": "Sistema de Wiki de uso sencillicimo y compatible con los estándares", - "it": "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" - }, - "version": "2022.07.31a~ynh1", - "url": "https://www.dokuwiki.org", - "upstream": { - "license": "GPL-2.0-or-later", - "website": "https://www.dokuwiki.org", - "demo": "https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo", - "admindoc": "https://www.dokuwiki.org/manual", - "code": "https://github.com/splitbrain/dokuwiki", - "cpe": "cpe:2.3:a:dokuwiki:dokuwiki" - }, - "license": "GPL-2.0-or-later", - "maintainer": { - "name": "Gofannon", - "email": "gofannon@riseup.net" - }, - "previous_maintainers": [ - { - "name": "opi", - "email": "opi@zeropi.net" - } - ], - "requirements": { - "yunohost": ">= 11.0.0" - }, - "multi_instance": true, - "services": [ - "nginx", - "php8.1-fpm" - ], - "arguments": { - "install": [ - { - "name": "domain", - "type": "domain" - }, - { - "name": "path", - "type": "path", - "example": "/dokuwiki", - "default": "/dokuwiki" - }, - { - "name": "admin", - "type": "user" - }, - { - "name": "is_public", - "type": "boolean", - "default": true, - "help": { - "en": "Makes the wiki accessible directly from the Internet for everyone, without intermediate YunoHost authentication", - "fr": "Rend le wiki accessible directement depuis Internet pour tout le monde, sans authentification YunoHost intermédiaire" - } - }, - { - "name": "language", - "type": "string", - "ask": { - "en": "Choose the application language", - "fr": "Choisissez la langue de l'application" - }, - "choices": [ - "en", - "fr" - ], - "default": "en" - } - ] - } -} \ No newline at end of file diff --git a/manifest.toml b/manifest.toml new file mode 100644 index 0000000..411a65a --- /dev/null +++ b/manifest.toml @@ -0,0 +1,73 @@ +packaging_format = 2 + +id = "dokuwiki" +name = "Dokuwiki" +description.en = "Lightweight, simple to use and highly versatile wiki" +description.fr = "Wiki léger, simple à utiliser et très polyvalent" +description.de = "Standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab" +description.es = "Sistema de Wiki de uso sencillicimo y compatible con los estándares" +description.it = "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" + +version = "2023.04.04a~ynh1" + +maintainers = ["Gofannon"] + +[upstream] +license = "GPL-2.0-or-later" +website = "https://www.dokuwiki.org" +demo = "https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo" +admindoc = "https://www.dokuwiki.org/manual" +code = "https://github.com/splitbrain/dokuwiki" + +[integration] +yunohost = ">= 11.1.19" +architectures = "all" +multi_instance = true +ldap = true +sso = true +disk = "50M" +ram.build = "200M" +ram.runtime = "50M" + +[install] + [install.domain] + type = "domain" + + [install.path] + type = "path" + default = "/dokuwiki" + + [install.init_main_permission] + help.en = "Makes the wiki accessible directly from the Internet for everyone, without intermediate YunoHost authentication" + help.fr = "Rend le wiki accessible directement depuis Internet pour tout le monde, sans authentification YunoHost intermédiaire" + type = "group" + default = "visitors" + + [install.language] + ask.en = "Choose the application language" + ask.fr = "Choisissez la langue de l'application" + type = "string" + choices = ["en", "fr"] + default = "en" + + [install.admin] + type = "user" + +[resources] + [resources.sources.main] + url = "https://github.com/dokuwiki/dokuwiki/releases/download/release-2023-04-04a/dokuwiki-2023-04-04a.tgz" + sha256 = "153c99cf42b9068b1ec21a2c765b862a44b374ad2f1a39223f5511a982b160bb" + autoupdate.strategy = "latest_github_tag" + + [resources.system_user] + + [resources.install_dir] + + [resources.permissions] + main.url = "/" + admin.url = "/admin" + admin.show_tile = false + admin.allowed = "admins" + + [resources.apt] + packages = "php8.1-xml php8.1-ldap php8.1-gd php8.1-cli" diff --git a/scripts/_common.sh b/scripts/_common.sh index 07ff399..1e47ce7 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -5,24 +5,6 @@ #================================================= # PHP APP SPECIFIC #================================================= -# Depending on its version, YunoHost uses different default PHP version: -## YunoHost version "11.X" => PHP 7.4 -## YunoHost version "4.X" => PHP 7.3 -# -# This behaviour can be overridden by setting the YNH_PHP_VERSION variable -#YNH_PHP_VERSION=7.3 -#YNH_PHP_VERSION=7.4 -#YNH_PHP_VERSION=8.0 -YNH_PHP_VERSION=8.1 -# For more information, see the PHP application helper: https://github.com/YunoHost/yunohost/blob/dev/helpers/php#L3-L6 -# Or this app package depending on PHP: https://github.com/YunoHost-Apps/grav_ynh/blob/master/scripts/_common.sh -# PHP dependencies used by the app (must be on a single line) -php_dependencies="php${YNH_PHP_VERSION}-xml php${YNH_PHP_VERSION}-ldap php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-cli" -# or, if you do not need a custom YNH_PHP_VERSION: -###php_dependencies="php$YNH_DEFAULT_PHP_VERSION-deb1 php$YNH_DEFAULT_PHP_VERSION-deb2" - -# dependencies used by the app (must be on a single line) -pkg_dependencies="$php_dependencies" #================================================= # PERSONAL HELPERS diff --git a/scripts/backup b/scripts/backup index 994eb7f..5181ebf 100755 --- a/scripts/backup +++ b/scripts/backup @@ -6,27 +6,10 @@ # IMPORT GENERIC HELPERS #================================================= +# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_print_info --message="Loading installation settings..." - -app=$YNH_APP_INSTANCE_NAME - -final_path=$(ynh_app_setting_get --app=$app --key=final_path) -domain=$(ynh_app_setting_get --app=$app --key=domain) -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) - #================================================= # DECLARE DATA AND CONF FILES TO BACKUP #================================================= @@ -36,7 +19,7 @@ ynh_print_info --message="Declaring files to be backed up..." # BACKUP THE APP MAIN DIR #================================================= -ynh_backup --src_path="$final_path" +ynh_backup --src_path="$install_dir" #================================================= # BACKUP THE NGINX CONFIGURATION diff --git a/scripts/change_url b/scripts/change_url index 7b2adff..f2a1c4b 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -9,59 +9,6 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# RETRIEVE ARGUMENTS -#================================================= - -old_domain=$YNH_APP_OLD_DOMAIN -old_path=$YNH_APP_OLD_PATH - -new_domain=$YNH_APP_NEW_DOMAIN -new_path=$YNH_APP_NEW_PATH - -app=$YNH_APP_INSTANCE_NAME - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." - -# Needed for helper "ynh_add_nginx_config" -final_path=$(ynh_app_setting_get --app=$app --key=final_path) - -#================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP -#================================================= -ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 - -# 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" - - # 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 -#================================================= - -change_domain=0 -if [ "$old_domain" != "$new_domain" ] -then - change_domain=1 -fi - -change_path=0 -if [ "$old_path" != "$new_path" ] -then - change_path=1 -fi - #================================================= # STANDARD MODIFICATIONS #================================================= @@ -69,29 +16,7 @@ fi #================================================= ynh_script_progression --message="Updating NGINX web server configuration..." --weight=2 -nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf - -# Change the path in the NGINX config file -if [ $change_path -eq 1 ] -then - # Make a backup of the original NGINX config file if modified - ynh_backup_if_checksum_is_different --file="$nginx_conf_path" - # Set global variables for NGINX helper - domain="$old_domain" - path_url="$new_path" - # Create a dedicated NGINX config - ynh_add_nginx_config -fi - -# Change the domain for NGINX -if [ $change_domain -eq 1 ] -then - # Delete file checksum for the old conf file location - ynh_delete_file_checksum --file="$nginx_conf_path" - mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf - # Store file checksum for the new config file location - ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" -fi +ynh_change_url_nginx_config #================================================= # SPECIFIC MODIFICATIONS @@ -102,15 +27,6 @@ ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=6 ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $new_path.*$" --max_retry=5 -#================================================= -# GENERIC FINALISATION -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." - -ynh_systemd_action --service_name=nginx --action=reload - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/install b/scripts/install index 72bf387..5440773 100755 --- a/scripts/install +++ b/scripts/install @@ -9,89 +9,40 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - #================================================= # RETRIEVE ARGUMENTS FROM THE MANIFEST #================================================= -domain=$YNH_APP_ARG_DOMAIN -path_url=$YNH_APP_ARG_PATH -admin_user=$YNH_APP_ARG_ADMIN -is_public=$YNH_APP_ARG_IS_PUBLIC -language=$YNH_APP_ARG_LANGUAGE - -app=$YNH_APP_INSTANCE_NAME - -#================================================= -# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS -#================================================= -ynh_script_progression --message="Validating installation parameters..." --weight=2 - -final_path=/var/www/$app -test ! -e "$final_path" || ynh_die --message="This path already contains a folder" - -# Register (book) web path -ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url +fpm_footprint="low" +fpm_free_footprint=0 +fpm_usage="low" #================================================= # STORE SETTINGS FROM MANIFEST #================================================= -ynh_script_progression --message="Storing installation settings..." --weight=2 -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=language --value=$language +ynh_app_setting_set --app=$app --key=fpm_footprint --value=$fpm_footprint +ynh_app_setting_set --app=$app --key=fpm_free_footprint --value=$fpm_free_footprint +ynh_app_setting_set --app=$app --key=fpm_usage --value=$fpm_usage -#================================================= -# INSTALL DEPENDENCIES -#================================================= -ynh_script_progression --message="Installing dependencies..." --weight=1 - -ynh_install_app_dependencies $pkg_dependencies - -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." --weight=2 - -# Create a system user -ynh_system_user_create --username=$app --home_dir="$final_path" - -#================================================= -# STANDARD MODIFICATIONS #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= ynh_script_progression --message="Setting up source files..." --weight=2 -ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src -ynh_setup_source --dest_dir="$final_path" +ynh_setup_source --dest_dir="$install_dir" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= -# PHP-FPM CONFIGURATION +# SYSTEM CONFIGURATION #================================================= -ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 +ynh_script_progression --message="Adding system configurations related to $app..." --weight=1 # Create a dedicated PHP-FPM config -fpm_usage=low -fpm_footprint=low -ynh_add_fpm_config --usage="$fpm_usage" --footprint="$fpm_footprint" - -#================================================= -# NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Configuring NGINX web server..." --weight=2 +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint # Create a dedicated NGINX config ynh_add_nginx_config @@ -99,9 +50,9 @@ ynh_add_nginx_config #================================================= # SPECIFIC SETUP #================================================= -# CUSTOMIZE DOKUWIKI +# ADD A CONFIGURATION #================================================= -ynh_script_progression --message="Configuring DokuWiki..." --weight=2 +ynh_script_progression --message="Adding a configuration file..." --weight=2 # Loading order of configuration files # @@ -121,121 +72,52 @@ ynh_script_progression --message="Configuring DokuWiki..." --weight=2 # Customize admin group in case of multiple wiki install managed by different admins # dokuwiki.admin; dokuwiki__1.admin; etc -ynh_add_config --template="../conf/local.protected.php" --destination="$final_path/conf/local.protected.php" +ynh_add_config --template="../conf/local.protected.php" --destination="$install_dir/conf/local.protected.php" # This file might be modified by DokuWiki admin panel or by plugins # It will not be modified by Yunohost in order to keep user settings # Set the "language" -ynh_add_config --template="../conf/local.php" --destination="$final_path/conf/local.php" +ynh_add_config --template="../conf/local.php" --destination="$install_dir/conf/local.php" # Restrict user rights by enforcing "read-only" mode for all users # See https://www.dokuwiki.org/acl#background_info # Default is "8" -ynh_add_config --template="../conf/acl.auth.php" --destination="$final_path/conf/acl.auth.php" +ynh_add_config --template="../conf/acl.auth.php" --destination="$install_dir/conf/acl.auth.php" #================================================= # CREATE DEFAULT FILES #================================================= +ynh_script_progression --message="Creating default files..." --weight=1 # For securing DokuWiki installation, create default files that will be writable in the "conf" folder. # Other files will be read ony and owned by root. # See https://www.dokuwiki.org/install:permissions -cp --archive $final_path/conf/local.php.dist $final_path/conf/local.php.bak -cp --archive $final_path/conf/users.auth.php.dist $final_path/conf/users.auth.php +cp --archive $install_dir/conf/local.php.dist $install_dir/conf/local.php.bak +cp --archive $install_dir/conf/users.auth.php.dist $install_dir/conf/users.auth.php # This file might be used by plugins like https://www.dokuwiki.org/plugin:siteexport # Create it to be more "user friendly" as over the top security is not the main goal here # This file could be use for bad behaviour. # See https://www.dokuwiki.org/devel:preload?s[]=preload -cp --archive $final_path/inc/preload.php.dist $final_path/inc/preload.php +cp --archive $install_dir/inc/preload.php.dist $install_dir/inc/preload.php # There is no template .dist provided inside DokuWiki installation folder # Create "empty" files to be able to manage linux permissions # Files content is taken from an existing DokuWiki installation -cp --archive ../conf/plugins.local.php $final_path/conf -cp --archive ../conf/plugins.local.php $final_path/conf/plugins.local.php.bak +cp --archive ../conf/plugins.local.php $install_dir/conf +cp --archive ../conf/plugins.local.php $install_dir/conf/plugins.local.php.bak #================================================= -# STORE THE CHECKSUM OF THE CONFIG FILE -#================================================= - -# Calculate and store the config file checksum into the app settings -#ynh_store_file_checksum --file="$final_path/conf/local.protected.php" -### Files '$final_path/conf/local.php' and '$final_path/conf/acl.auth.php' can be modified by user, no need to store checksum as they cannot be overwritten safely by the upgrade script - -# #================================================= -# # GENERIC FINALIZATION -# #================================================= -# # SECURE FILES AND DIRECTORIES -# #================================================= - -# # Try to use "least privilege" to grant minimal access -# # For details, see https://www.dokuwiki.org/install:permissions - -# # Files owned by DokuWiki can just read -# chown -R root: $final_path - -# # DokuWiki needs to write inside these folders. Make "DokuWiki" owner -# chown $app:root $final_path/{conf,inc} - -# # Make "DokuWiki" owner of configuration files that must be writable -# chown $app:root $final_path/conf/{local.php,local.php.bak,users.auth.php,acl.auth.php,plugins.local.php,plugins.local.php.bak} - -# # Usefull for some plugins like https://www.dokuwiki.org/plugin:siteexport -# # See https://www.dokuwiki.org/devel:preload -# chown $app:root $final_path/inc/preload.php - -# # Grant read-only to all files as files copied above are owned by root by defaut and nginx cannot read them -# # There are only files in the folder and there are no sublevels. No need to use "find" -# chmod -R a+r $final_path/{conf,inc} - -# # Give write access to "data" and subfolders -# chown -R $app:root $final_path/data -# # Remove access to "other" -# chmod -R o-rwx $final_path/data - -# # Allow the web admin panel to run, aka "Extension Manager" -# chown -R $app:root $final_path/lib/plugins -# # Allow to install templates -# chown -R $app:root $final_path/lib/tpl - -# # Allow access to public assets like style sheets -# find $final_path/lib -type f -print0 | xargs -0 chmod 0644 -# find $final_path/lib -type d -print0 | xargs -0 chmod 0755 -# # Using "find" instead of "chmod -R 755" so files does not become executable too -# # chmod : -rwxr-xr-x 1 root root 241 May 3 08:36 index.html => BAD -# # find : -rw-r--r-- 1 1001 1002 241 May 3 08:36 index.html => GOOD - +# GENERIC FINALIZATION #================================================= # SETUP FAIL2BAN #================================================= ynh_script_progression --message="Configuring Fail2Ban..." --weight=7 -ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 - -#================================================= -# SETUP SSOWAT -#================================================= -ynh_script_progression --message="Configuring permissions..." --weight=2 - -# Make app public if necessary -if [ $is_public -eq 1 ] -then - ynh_permission_update --permission="main" --add="visitors" -fi - -# Create the "admin" permission and add the "admin_user" to it -# More users can be added to the group from the YunoHost webadmin -ynh_permission_create --permission "admin" --allowed "$admin_user" - -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." - -ynh_systemd_action --service_name=nginx --action=reload +# Create a dedicated Fail2Ban config +ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path.*$" --max_retry=5 #================================================= # END OF SCRIPT diff --git a/scripts/remove b/scripts/remove index e2c981a..19a8599 100755 --- a/scripts/remove +++ b/scripts/remove @@ -9,67 +9,20 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." - -app=$YNH_APP_INSTANCE_NAME - -domain=$(ynh_app_setting_get --app=$app --key=domain) -final_path=$(ynh_app_setting_get --app=$app --key=final_path) - -#================================================= -# STANDARD REMOVE -#================================================= -# REMOVE APP MAIN DIR -#================================================= -ynh_script_progression --message="Removing app main directory..." - -# Remove the app directory securely -ynh_secure_remove --file="$final_path" - #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing NGINX web server configuration..." +ynh_script_progression --message="Removing system configurations related to $app..." --weight=1 # Remove the dedicated NGINX config ynh_remove_nginx_config -#================================================= -# REMOVE PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=2 - # Remove the dedicated PHP-FPM config ynh_remove_fpm_config -#================================================= -# REMOVE DEPENDENCIES -#================================================= -ynh_script_progression --message="Removing dependencies..." --weight=1 - -# Remove metapackage and its dependencies if no other package need them -ynh_remove_app_dependencies - -#================================================= -# REMOVE FAIL2BAN CONFIGURATION -#================================================= -ynh_script_progression --message="Removing Fail2Ban configuration..." --weight=7 - +# Remove the dedicated Fail2Ban config ynh_remove_fail2ban_config -#================================================= -# GENERIC FINALIZATION -#================================================= -# 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 5f1e0f4..75e684f 100755 --- a/scripts/restore +++ b/scripts/restore @@ -6,128 +6,39 @@ # IMPORT GENERIC HELPERS #================================================= +# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading settings..." --weight=2 - -app=$YNH_APP_INSTANCE_NAME - -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) - -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) -fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) - -#================================================= -# CHECK IF THE APP CAN BE RESTORED -#================================================= -ynh_script_progression --message="Validating restoration parameters..." --weight=2 - -test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " - -#================================================= -# STANDARD RESTORATION STEPS -#================================================= -# RECREATE THE DEDICATED USER -#================================================= -ynh_script_progression --message="Recreating the dedicated system user..." --weight=2 - -# Create the dedicated user (if not existing) -ynh_system_user_create --username=$app --home_dir="$final_path" - #================================================= # RESTORE THE APP MAIN DIR #================================================= -ynh_script_progression --message="Restoring the app main directory..." +ynh_script_progression --message="Restoring the app main directory..." --weight=1 -ynh_restore_file --origin_path="$final_path" +ynh_restore_file --origin_path="$install_dir" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - -# #================================================= -# # RESTORE USER RIGHTS -# #================================================= - -# # Try to use "least privilege" to grant minimal access -# # For details, see https://www.dokuwiki.org/install:permissions - -# # DokuWiki needs to write inside these folders. Make "DokuWiki" owner -# chown $app:root $final_path/{conf,inc} - -# # Make "DokuWiki" owner of configuration files that must be writable -# chown $app:root $final_path/conf/{local.php,local.php.bak,users.auth.php,acl.auth.php,plugins.local.php,plugins.local.php.bak} - -# # Usefull for some plugins like https://www.dokuwiki.org/plugin:siteexport -# # See https://www.dokuwiki.org/devel:preload -# chown $app:root $final_path/inc/preload.php - -# # Give write access to "data" and subfolders -# chown -R $app:root $final_path/data - -# # Allow the web admin panel to run, aka "Extension Manager" -# chown -R $app:root $final_path/lib/plugins -# # Allow to install templates -# chown -R $app:root $final_path/lib/tpl +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= -# RESTORE FAIL2BAN CONFIGURATION +# RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=7 +ynh_script_progression --message="Restoring system configurations related to $app..." --weight=1 + +ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" + +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" ynh_systemd_action --action=restart --service_name=fail2ban -#================================================= -# SPECIFIC RESTORATION -#================================================= -# REINSTALL DEPENDENCIES -#================================================= -ynh_script_progression --message="Reinstalling dependencies..." --weight=1 - -# Define and install dependencies -ynh_install_app_dependencies $pkg_dependencies - -#================================================= -# RESTORE THE PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=5 - -ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" - -# Recreate a dedicated php-fpm config -# TODO: not in example_ynh, not needed? -#ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion - -#================================================= -# RESTORE THE NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Restoring the NGINX web server configuration..." --weight=1 - -ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" - #================================================= # GENERIC FINALIZATION #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading NGINX web server and PHP-FPM.." --weight=2 +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." --weight=2 ynh_systemd_action --service_name=php$phpversion-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/upgrade b/scripts/upgrade index 790c8e0..ca22984 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -9,22 +9,6 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=2 - -app=$YNH_APP_INSTANCE_NAME - -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) -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -language=$(ynh_app_setting_get --app=$app --key=language) - -fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) -fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) - #================================================= # CHECK VERSION #================================================= @@ -32,71 +16,30 @@ fpm_usage=$(ynh_app_setting_get --app=$app --key=fpm_usage) 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)..." --weight=9 - -# 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 - +# STANDARD UPGRADE STEPS #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= -ynh_script_progression --message="Ensuring downward compatibility..." - -# If final_path doesn't exist, create it -if [ -z "$final_path" ]; then - final_path=/var/www/$app - ynh_app_setting_set --app=$app --key=final_path --value=$final_path -fi - -# language default value, if not set -if [ -z "$language" ]; then - language='en' - ynh_app_setting_set --app=$app --key=language --value=$language -fi +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 # If fpm_footprint doesn't exist, create it -if [ -z "$fpm_footprint" ]; then +if [ -z "${fpm_footprint:-}" ]; then fpm_footprint=low ynh_app_setting_set --app=$app --key=fpm_footprint --value=$fpm_footprint fi +# If fpm_free_footprint doesn't exist, create it +if [ -z "${fpm_free_footprint:-}" ]; then + fpm_free_footprint=0 + ynh_app_setting_set --app=$app --key=fpm_free_footprint --value=$fpm_free_footprint +fi + # If fpm_usage doesn't exist, create it -if [ -z "$fpm_usage" ]; then +if [ -z "${fpm_usage:-}" ]; then fpm_usage=low ynh_app_setting_set --app=$app --key=fpm_usage --value=$fpm_usage fi -# Cleaning legacy permissions -admin_user=$(ynh_app_setting_get --app=$app --key=admin) - -if [ -n "$admin_user" ]; then - # Removing skipped/unprotected_uris under certain conditions, remove the visitors group added during the migration process of 3.7 - # Remove skipped_uris. If the app was public, add visitors again to the main permission - if ynh_permission_has_user --permission=admin --user="$admin_user" - then - echo "permission admin already exist. Nothing to do" - else - ynh_permission_create --permission "admin" --allowed "$admin_user" - fi - # Remove legacy admin setting - ynh_app_setting_delete --app=$app --key=admin -fi - -# Cleaning legacy permissions -if ynh_legacy_permissions_exists; then - ynh_legacy_permissions_delete_all - - ynh_app_setting_delete --app=$app --key=is_public -fi - # Yunohost specific configuration, if it isn't exist already # Previously, these settings were store in an unique "dokuwiki.php" @@ -116,22 +59,22 @@ fi # Create an empty configuration file if it does not exist # This file will be overwritten anyway later in the part "# LDAP Configuration" # The file is created here to prevent a failure of the helper `ynh_backup_if_checksum_is_different` -if [ ! -f "$final_path/conf/local.protected.php" ]; then - touch $final_path/conf/local.protected.php +if [ ! -f "$install_dir/conf/local.protected.php" ]; then + touch $install_dir/conf/local.protected.php fi # Do not overwrite existing dokuwiki configuration as it could have user customization's and settings. # Create file if it does not exist -if [ ! -f "$final_path/conf/local.php" ]; then +if [ ! -f "$install_dir/conf/local.php" ]; then # Set the default "language" - ynh_add_config --template="../conf/local.php" --destination="$final_path/conf/local.php" + ynh_add_config --template="../conf/local.php" --destination="$install_dir/conf/local.php" fi # Do not overwrite existing ACL configuration file as it could have user customization's and settings. # Create file if it does not exist # See https://www.dokuwiki.org/acl#background_info -if [ ! -f "$final_path/conf/acl.auth.php" ]; then - ynh_add_config --template="../conf/acl.auth.php" --destination="$final_path/conf/acl.auth.php" +if [ ! -f "$install_dir/conf/acl.auth.php" ]; then + ynh_add_config --template="../conf/acl.auth.php" --destination="$install_dir/conf/acl.auth.php" fi # For securing DokuWiki installation, create default files that will be writable in the "conf" folder. @@ -139,55 +82,44 @@ fi # See https://www.dokuwiki.org/install:permissions # If file does not exists -if [ ! -f "$final_path/conf/local.php.bak" ]; then +if [ ! -f "$install_dir/conf/local.php.bak" ]; then # if template exists - if [ -f "$final_path/conf/local.php.dist" ]; then + if [ -f "$install_dir/conf/local.php.dist" ]; then # Copy template to create default file - cp --archive "$final_path/conf/local.php.dist" "$final_path/conf/local.php.bak" + cp --archive "$install_dir/conf/local.php.dist" "$install_dir/conf/local.php.bak" fi fi -if [ ! -f "$final_path/conf/users.auth.php" ]; then - if [ -f "$final_path/conf/users.auth.php.dist" ]; then - cp --archive $final_path/conf/users.auth.php.dist $final_path/conf/users.auth.php +if [ ! -f "$install_dir/conf/users.auth.php" ]; then + if [ -f "$install_dir/conf/users.auth.php.dist" ]; then + cp --archive $install_dir/conf/users.auth.php.dist $install_dir/conf/users.auth.php fi fi -if [ ! -f "$final_path/conf/plugins.local.php" ]; then - cp --archive ../conf/plugins.local.php $final_path/conf +if [ ! -f "$install_dir/conf/plugins.local.php" ]; then + cp --archive ../conf/plugins.local.php $install_dir/conf fi -if [ ! -f "$final_path/conf/plugins.local.php.bak" ]; then - cp --archive ../conf/plugins.local.php $final_path/conf/plugins.local.php.bak +if [ ! -f "$install_dir/conf/plugins.local.php.bak" ]; then + cp --archive ../conf/plugins.local.php $install_dir/conf/plugins.local.php.bak fi -if [ ! -f "$final_path/inc/preload.php" ]; then +if [ ! -f "$install_dir/inc/preload.php" ]; then # if template exists - if [ -f "$final_path/inc/preload.php.dist" ]; then + if [ -f "$install_dir/inc/preload.php.dist" ]; then # Copy template to create default file - cp --archive "$final_path/inc/preload.php.dist" "$final_path/inc/preload.php" + cp --archive "$install_dir/inc/preload.php.dist" "$install_dir/inc/preload.php" fi fi # purge "LOGAUTHERROR PLUGIN" as not compatible and not maintained anymore # See https://www.dokuwiki.org/plugin:logautherror -if [ -d "$final_path/lib/plugins/logautherror" ]; then +if [ -d "$install_dir/lib/plugins/logautherror" ]; then ynh_script_progression --message="Purge "LOGAUTHERROR PLUGIN" as not maintained anymore" --weight=1 - ynh_secure_remove --file "$final_path/lib/plugins/logautherror" + ynh_secure_remove --file "$install_dir/lib/plugins/logautherror" fi - -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 - -# Create a system user -ynh_system_user_create --username=$app --home_dir="$final_path" - -#================================================= -# STANDARD UPGRADE STEPS #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -197,39 +129,28 @@ then ynh_script_progression --message="Upgrading source files..." --weight=2 # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir="$final_path" + ynh_setup_source --dest_dir="$install_dir" fi -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chmod -R o-rwx "$install_dir" +chown -R $app:www-data "$install_dir" #================================================= -# NGINX CONFIGURATION +# REAPPLY SYSTEM CONFIGURATIONS #================================================= -ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 +ynh_script_progression --message="Upgrading system configurations related to $app..." --weight=1 + +# Create a dedicated PHP-FPM config +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint # Create a dedicated NGINX config ynh_add_nginx_config -#================================================= -# UPGRADE DEPENDENCIES -#================================================= -ynh_script_progression --message="Upgrading dependencies..." --weight=1 - -ynh_install_app_dependencies $pkg_dependencies - -#================================================= -# PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 - -# Create a dedicated PHP-FPM config -ynh_add_fpm_config --phpversion=$phpversion --usage=$fpm_usage --footprint=$fpm_footprint - #================================================= # SPECIFIC UPGRADE #================================================= +# UPGRADE DOKUWIKI +#================================================= if [ "$upgrade_type" == "UPGRADE_APP" ] then @@ -237,11 +158,11 @@ then # Remove upgrade notification inside Dokuwiki's admin panel # See https://www.dokuwiki.org/update_check - touch $final_path/doku.php + touch $install_dir/doku.php # Remove files not used anymore after upgrade # See https://www.dokuwiki.org/install:unused_files - if [ -f "$final_path/data/deleted.files" ]; then + if [ -f "$install_dir/data/deleted.files" ]; then # Feed output of grep[...] line by line to 'ynh_secure_remove' # 'ynh_secure_remove' can only work file by file. Cannot work with a list @@ -269,7 +190,7 @@ then if [ -f "$line" ]; then ynh_secure_remove --file "$line" fi - done < <(grep --null --extended-regexp --invert-match '^($|#)' "$final_path/data/deleted.files" | xargs --null --max-args=1 || true) + done < <(grep --null --extended-regexp --invert-match '^($|#)' "$install_dir/data/deleted.files" | xargs --null --max-args=1 || true) # ^ ^ First < is redirection, second is process substitution. # Source: https://tldp.org/LDP/abs/html/process-sub.html @@ -283,104 +204,45 @@ fi # TODO Taken from old "upgrade" script. Should check if it is needed and what it does # Update all plugins - ###for name_plugin in $(sudo -s cat $final_path/lib/plugins/*/plugin.info.txt | grep url | awk -F ':' '{print $3}'); + ###for name_plugin in $(sudo -s cat $install_dir/lib/plugins/*/plugin.info.txt | grep url | awk -F ':' '{print $3}'); ###do ### # Get a official plugin for dokuwiki, not update a no-official ### wget -nv --quiet "https://github.com/splitbrain/dokuwiki-plugin-$name_plugin/zipball/master" -O "${name_plugin}.zip" -o /dev/null || true ### if [ -s "${name_plugin}.zip" ]; then ### unzip ${name_plugin}.zip - ### cp -a splitbrain-dokuwiki-plugin-${name_plugin}*/. "$final_path/lib/plugins/$name_plugin/" + ### cp -a splitbrain-dokuwiki-plugin-${name_plugin}*/. "$install_dir/lib/plugins/$name_plugin/" ### fi ###done # if "file" exists and is executable # Stolen from https://github.com/YunoHost-Apps/grav_ynh/blob/testing/scripts/upgrade#L189 - if [ -x "$final_path/bin/plugin.php" ]; then - pushd "$final_path" - ynh_exec_warn_less ynh_exec_as $app php${YNH_PHP_VERSION} bin/plugin.php --no-colors extension upgrade || ynh_print_warn --message="Automatic plugin upgrade has failed, you can upgrade them from your DokuWiki admin panel." + if [ -x "$install_dir/bin/plugin.php" ]; then + pushd "$install_dir" + ynh_exec_warn_less ynh_exec_as $app php$phpversion bin/plugin.php --no-colors extension upgrade || ynh_print_warn --message="Automatic plugin upgrade has failed, you can upgrade them from your DokuWiki admin panel." popd else ynh_print_warn --message="Automatic plugin cannot be done, you have to upgrade them from your DokuWiki admin panel." fi - - fi #================================================= -# LDAP Configuration +# UPDATE A CONFIG FILE #================================================= - -### Verify the checksum of a file, stored by `ynh_store_file_checksum` in the install script. -### And create a backup of this file if the checksum is different. So the file will be backed up if the admin had modified it. -ynh_backup_if_checksum_is_different --file="$final_path/conf/local.protected.php" - -# Always overwrite local file with the one from package. -cp --archive ../conf/local.protected.php $final_path/conf +ynh_script_progression --message="Adding a configuration file..." --weight=2 # Customize admin group in case of multiple wiki install managed by different admins # dokuwiki.admin; dokuwiki__1.admin; etc -ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="$final_path/conf/local.protected.php" - -# Recalculate and store the checksum of the file for the next upgrade. -ynh_store_file_checksum --file="$final_path/conf/local.protected.php" - -# #================================================= -# # GENERIC FINALIZATION -# #================================================= -# # SECURE FILES AND DIRECTORIES -# #================================================= - -# # Try to use "least privilege" to grant minimal access -# # For details, see https://www.dokuwiki.org/install:permissions - -# # Files owned by DokuWiki can just read -# chown -R root: $final_path - -# # DokuWiki needs to write inside these folders. Make "DokuWiki" owner -# chown $app:root $final_path/{conf,inc} - -# # Make "DokuWiki" owner of configuration files that must be writable -# chown $app:root $final_path/conf/{local.php,local.php.bak,users.auth.php,acl.auth.php,plugins.local.php,plugins.local.php.bak} - -# # Usefull for some plugins like https://www.dokuwiki.org/plugin:siteexport -# # See https://www.dokuwiki.org/devel:preload -# chown $app:root $final_path/inc/preload.php - -# # Grant read-only to all files as files copied above are owned by root by defaut and nginx cannot read them -# # There are only files in the folder and there are no sublevels. No need to use "find" -# chmod -R a+r $final_path/{conf,inc} - -# # Give write access to "data" and subfolders -# chown -R $app:root $final_path/data -# # Remove access to "other" -# chmod -R o-rwx $final_path/data - -# # Allow the web admin panel to run, aka "Extension Manager" -# chown -R $app:root $final_path/lib/plugins -# # Allow to install templates -# chown -R $app:root $final_path/lib/tpl - -# # Allow access to public assets like style sheets -# find $final_path/lib -type f -print0 | xargs -0 chmod 0644 -# find $final_path/lib -type d -print0 | xargs -0 chmod 0755 -# # Using "find" instead of "chmod -R 755" so files does not become executable too -# # chmod : -rwxr-xr-x 1 root root 241 May 3 08:36 index.html => BAD -# # find : -rw-r--r-- 1 1001 1002 241 May 3 08:36 index.html => GOOD +ynh_add_config --template="../conf/local.protected.php" --destination="$install_dir/conf/local.protected.php" #================================================= -# SETUP FAIL2BAN +# GENERIC FINALIZATION +#================================================= +# UPGRADE FAIL2BAN #================================================= ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=7 -ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 - - -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." - -ynh_systemd_action --service_name=nginx --action=reload +# Create a dedicated Fail2Ban config +ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path.*$" --max_retry=5 #================================================= # END OF SCRIPT diff --git a/tests.toml b/tests.toml new file mode 100644 index 0000000..f766a45 --- /dev/null +++ b/tests.toml @@ -0,0 +1,11 @@ +test_format = 1.0 + +[default] + + + # ------------------------------- + # Commits to test upgrade from + # ------------------------------- + + test_upgrade_from.d451b3a3bb933149da9e44000f01b750337c3d3c.name = "Upgrade from 2022.07.31a" + \ No newline at end of file From 97843e34ac9ac7d63fa8c6862db5e0b24024dae2 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 20 Jun 2023 20:15:44 +0200 Subject: [PATCH 119/144] Upgrade to v2023.4.4 --- manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.toml b/manifest.toml index 411a65a..8c74417 100644 --- a/manifest.toml +++ b/manifest.toml @@ -55,8 +55,8 @@ ram.runtime = "50M" [resources] [resources.sources.main] - url = "https://github.com/dokuwiki/dokuwiki/releases/download/release-2023-04-04a/dokuwiki-2023-04-04a.tgz" - sha256 = "153c99cf42b9068b1ec21a2c765b862a44b374ad2f1a39223f5511a982b160bb" + url = "https://github.com/splitbrain/dokuwiki/archive/refs/tags/release-2023-04-04.tar.gz" + sha256 = "99cd9af97631cec43fb3f6c7c1c1e61a6f5ec0600d1611ce897b3419da18f9a6" autoupdate.strategy = "latest_github_tag" [resources.system_user] From 2c6f17c6ce48c5dd4c6a5a83aafc861f59ecb867 Mon Sep 17 00:00:00 2001 From: Tagada <36127788+Tagadda@users.noreply.github.com> Date: Wed, 27 Sep 2023 22:10:54 +0200 Subject: [PATCH 120/144] Update manifest.toml --- manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.toml b/manifest.toml index 8c74417..788e9c4 100644 --- a/manifest.toml +++ b/manifest.toml @@ -17,7 +17,7 @@ license = "GPL-2.0-or-later" website = "https://www.dokuwiki.org" demo = "https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo" admindoc = "https://www.dokuwiki.org/manual" -code = "https://github.com/splitbrain/dokuwiki" +code = "https://github.com/dokuwiki/dokuwiki" [integration] yunohost = ">= 11.1.19" @@ -55,7 +55,7 @@ ram.runtime = "50M" [resources] [resources.sources.main] - url = "https://github.com/splitbrain/dokuwiki/archive/refs/tags/release-2023-04-04.tar.gz" + url = "https://github.com/dokuwiki/dokuwiki/archive/refs/tags/release-2023-04-04a.tar.gz" sha256 = "99cd9af97631cec43fb3f6c7c1c1e61a6f5ec0600d1611ce897b3419da18f9a6" autoupdate.strategy = "latest_github_tag" From 11d3e69771812f9da0850b5cbdd56a1b596c6eaa Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 27 Sep 2023 20:11:00 +0000 Subject: [PATCH 121/144] 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 3463fb9..7dc4584 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * Official app website: * Official admin documentation: -* Upstream app code repository: +* Upstream app code repository: * YunoHost documentation for this app: * Report a bug: diff --git a/README_fr.md b/README_fr.md index 513fd2a..8882db8 100644 --- a/README_fr.md +++ b/README_fr.md @@ -38,7 +38,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Site officiel de l’app : * Documentation officielle de l’admin : -* Dépôt de code officiel de l’app : +* Dépôt de code officiel de l’app : * Documentation YunoHost pour cette app : * Signaler un bug : From 6fe546992bded965a067f57242d87bddd1d1891e Mon Sep 17 00:00:00 2001 From: YunoHost Bot Date: Thu, 28 Sep 2023 13:08:41 +0200 Subject: [PATCH 122/144] Upgrade to v2023.4.4 (#103) --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 788e9c4..e9e1060 100644 --- a/manifest.toml +++ b/manifest.toml @@ -55,7 +55,7 @@ ram.runtime = "50M" [resources] [resources.sources.main] - url = "https://github.com/dokuwiki/dokuwiki/archive/refs/tags/release-2023-04-04a.tar.gz" + url = "https://github.com/dokuwiki/dokuwiki/archive/refs/tags/release-2023-04-04.tar.gz" sha256 = "99cd9af97631cec43fb3f6c7c1c1e61a6f5ec0600d1611ce897b3419da18f9a6" autoupdate.strategy = "latest_github_tag" From 3e44ab734fb33e8de0ae693b33727031a27dd4cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 29 Sep 2023 16:23:09 +0200 Subject: [PATCH 123/144] Update manifest.toml --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index e9e1060..df6e0e3 100644 --- a/manifest.toml +++ b/manifest.toml @@ -20,7 +20,7 @@ admindoc = "https://www.dokuwiki.org/manual" code = "https://github.com/dokuwiki/dokuwiki" [integration] -yunohost = ">= 11.1.19" +yunohost = ">= 11.2" architectures = "all" multi_instance = true ldap = true @@ -46,7 +46,7 @@ ram.runtime = "50M" [install.language] ask.en = "Choose the application language" ask.fr = "Choisissez la langue de l'application" - type = "string" + type = "select" choices = ["en", "fr"] default = "en" @@ -70,4 +70,4 @@ ram.runtime = "50M" admin.allowed = "admins" [resources.apt] - packages = "php8.1-xml php8.1-ldap php8.1-gd php8.1-cli" + packages = "php8.1-xml, php8.1-ldap, php8.1-gd, php8.1-cli" From 2f070de0dad1341a94b7f0eac6eaf2306e4a0729 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 29 Sep 2023 14:23:15 +0000 Subject: [PATCH 124/144] Auto-update README --- README.md | 1 - README_fr.md | 1 - 2 files changed, 2 deletions(-) diff --git a/README.md b/README.md index 7dc4584..dd33cfa 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,6 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * Official app website: * Official admin documentation: * Upstream app code repository: -* YunoHost documentation for this app: * Report a bug: ## Developer info diff --git a/README_fr.md b/README_fr.md index 8882db8..db6e88d 100644 --- a/README_fr.md +++ b/README_fr.md @@ -39,7 +39,6 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Site officiel de l’app : * Documentation officielle de l’admin : * Dépôt de code officiel de l’app : -* Documentation YunoHost pour cette app : * Signaler un bug : ## Informations pour les développeurs From 30981b04fed763d4176b0bf7776ff6af12d2c861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 29 Sep 2023 16:24:19 +0200 Subject: [PATCH 125/144] Update manifest.toml --- manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.toml b/manifest.toml index df6e0e3..90cf76f 100644 --- a/manifest.toml +++ b/manifest.toml @@ -55,8 +55,8 @@ ram.runtime = "50M" [resources] [resources.sources.main] - url = "https://github.com/dokuwiki/dokuwiki/archive/refs/tags/release-2023-04-04.tar.gz" - sha256 = "99cd9af97631cec43fb3f6c7c1c1e61a6f5ec0600d1611ce897b3419da18f9a6" + url = "https://github.com/dokuwiki/dokuwiki/releases/download/release-2023-04-04a/dokuwiki-2023-04-04a.tgz" + sha256 = "153c99cf42b9068b1ec21a2c765b862a44b374ad2f1a39223f5511a982b160bb" autoupdate.strategy = "latest_github_tag" [resources.system_user] From 9962a1603f396a73703735277bb958450d553921 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 31 Oct 2023 14:07:30 +0000 Subject: [PATCH 126/144] Auto-update README --- README.md | 1 + README_fr.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index dd33cfa..cf96d9d 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * Official app website: * Official admin documentation: * Upstream app code repository: +* YunoHost Store: * Report a bug: ## Developer info diff --git a/README_fr.md b/README_fr.md index db6e88d..f234b38 100644 --- a/README_fr.md +++ b/README_fr.md @@ -39,6 +39,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Site officiel de l’app : * Documentation officielle de l’admin : * Dépôt de code officiel de l’app : +* YunoHost Store: * Signaler un bug : ## Informations pour les développeurs From 261552c82a58d4e57f9c9995552aa39b3c475763 Mon Sep 17 00:00:00 2001 From: tituspijean Date: Wed, 29 Nov 2023 15:14:16 +0100 Subject: [PATCH 127/144] Require php8.1-mbstring --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 90cf76f..12680ff 100644 --- a/manifest.toml +++ b/manifest.toml @@ -70,4 +70,4 @@ ram.runtime = "50M" admin.allowed = "admins" [resources.apt] - packages = "php8.1-xml, php8.1-ldap, php8.1-gd, php8.1-cli" + packages = "php8.1-xml, php8.1-ldap, php8.1-gd, php8.1-cli, php8.1-mbstring" From d5d473e6afaa6abcd92d4d79598718d9c097ab3c Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 30 Nov 2023 07:48:19 +0000 Subject: [PATCH 128/144] Auto-update README --- README.md | 1 + README_fr.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index dd33cfa..cf96d9d 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * Official app website: * Official admin documentation: * Upstream app code repository: +* YunoHost Store: * Report a bug: ## Developer info diff --git a/README_fr.md b/README_fr.md index db6e88d..f234b38 100644 --- a/README_fr.md +++ b/README_fr.md @@ -39,6 +39,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Site officiel de l’app : * Documentation officielle de l’admin : * Dépôt de code officiel de l’app : +* YunoHost Store: * Signaler un bug : ## Informations pour les développeurs From d2c7ed11d7f45752bee7b574bc87cb2c1a9ebc68 Mon Sep 17 00:00:00 2001 From: tituspijean Date: Thu, 30 Nov 2023 08:49:20 +0100 Subject: [PATCH 129/144] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 12680ff..c24fcfa 100644 --- a/manifest.toml +++ b/manifest.toml @@ -8,7 +8,7 @@ description.de = "Standardkonformes, einfach zu benutzendes Wiki und zielt haupt description.es = "Sistema de Wiki de uso sencillicimo y compatible con los estándares" description.it = "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" -version = "2023.04.04a~ynh1" +version = "2023.04.04a~ynh2" maintainers = ["Gofannon"] From f3efd1f641469829b21a494939f98e357b75028f Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 30 Nov 2023 07:49:24 +0000 Subject: [PATCH 130/144] 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 cf96d9d..c17d1d5 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... -**Shipped version:** 2023.04.04a~ynh1 +**Shipped version:** 2023.04.04a~ynh2 **Demo:** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo diff --git a/README_fr.md b/README_fr.md index f234b38..3d90b67 100644 --- a/README_fr.md +++ b/README_fr.md @@ -26,7 +26,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Lors de la mise à jour, les plugins officiels sont également mis à jour. Nous vous recommandons toutefois de vérifier le bon fonctionnement des plugins dans le panneau d'administration après cette opération. Nous ne pouvons pas savoir si des plugins spéciaux posent problèmes... -**Version incluse :** 2023.04.04a~ynh1 +**Version incluse :** 2023.04.04a~ynh2 **Démo :** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo From b6c7e787c09724edc15ad4ced1e669c5f2bb8a9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 9 Dec 2023 22:06:33 +0100 Subject: [PATCH 131/144] Update manifest.toml --- manifest.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/manifest.toml b/manifest.toml index c24fcfa..68fbc2d 100644 --- a/manifest.toml +++ b/manifest.toml @@ -23,8 +23,11 @@ code = "https://github.com/dokuwiki/dokuwiki" yunohost = ">= 11.2" architectures = "all" multi_instance = true + ldap = true + sso = true + disk = "50M" ram.build = "200M" ram.runtime = "50M" From 42db7e664247a6af94a9cac132fb3ea873e5759c Mon Sep 17 00:00:00 2001 From: YunoHost Bot Date: Tue, 6 Feb 2024 22:53:29 +0100 Subject: [PATCH 132/144] Upgrade to v2024.2.6 (#108) --- manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.toml b/manifest.toml index 68fbc2d..3b66462 100644 --- a/manifest.toml +++ b/manifest.toml @@ -58,8 +58,8 @@ ram.runtime = "50M" [resources] [resources.sources.main] - url = "https://github.com/dokuwiki/dokuwiki/releases/download/release-2023-04-04a/dokuwiki-2023-04-04a.tgz" - sha256 = "153c99cf42b9068b1ec21a2c765b862a44b374ad2f1a39223f5511a982b160bb" + url = "https://github.com/dokuwiki/dokuwiki/archive/refs/tags/release-2024-02-06.tar.gz" + sha256 = "fa5d890587d90e808402a95b581ccd173765045df23bd48f834b09a9df7252ed" autoupdate.strategy = "latest_github_tag" [resources.system_user] From 31a0693e62caa3494c72e0d163e251c79c98de1a Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 5 Mar 2024 22:39:37 +0100 Subject: [PATCH 133/144] Testing (#109) * Update manifest.toml * Upgrade to v2024.2.6 (#108) --------- Co-authored-by: YunoHost Bot --- manifest.toml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/manifest.toml b/manifest.toml index c24fcfa..3b66462 100644 --- a/manifest.toml +++ b/manifest.toml @@ -23,8 +23,11 @@ code = "https://github.com/dokuwiki/dokuwiki" yunohost = ">= 11.2" architectures = "all" multi_instance = true + ldap = true + sso = true + disk = "50M" ram.build = "200M" ram.runtime = "50M" @@ -55,8 +58,8 @@ ram.runtime = "50M" [resources] [resources.sources.main] - url = "https://github.com/dokuwiki/dokuwiki/releases/download/release-2023-04-04a/dokuwiki-2023-04-04a.tgz" - sha256 = "153c99cf42b9068b1ec21a2c765b862a44b374ad2f1a39223f5511a982b160bb" + url = "https://github.com/dokuwiki/dokuwiki/archive/refs/tags/release-2024-02-06.tar.gz" + sha256 = "fa5d890587d90e808402a95b581ccd173765045df23bd48f834b09a9df7252ed" autoupdate.strategy = "latest_github_tag" [resources.system_user] From 0aeb93ab5185af9970ba853dfd076ff55f49b8a6 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 5 Mar 2024 21:39:43 +0000 Subject: [PATCH 134/144] Auto-update README --- README.md | 4 ++-- README_fr.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c17d1d5..d0fba81 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ @@ -54,4 +54,4 @@ or sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ``` -**More info regarding app packaging:** +**More info regarding app packaging:** \ No newline at end of file diff --git a/README_fr.md b/README_fr.md index 3d90b67..3f7c2f2 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,5 +1,5 @@ From 21f964222f641731668e7f1aa4c3f38acee9e206 Mon Sep 17 00:00:00 2001 From: Gofannon <17145502+Gofannon@users.noreply.github.com> Date: Wed, 13 Mar 2024 15:59:35 +0100 Subject: [PATCH 135/144] chore: use latest dokuwiki hotfix version 2024-02-06a --- manifest.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manifest.toml b/manifest.toml index 3b66462..da552d1 100644 --- a/manifest.toml +++ b/manifest.toml @@ -8,9 +8,9 @@ description.de = "Standardkonformes, einfach zu benutzendes Wiki und zielt haupt description.es = "Sistema de Wiki de uso sencillicimo y compatible con los estándares" description.it = "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" -version = "2023.04.04a~ynh2" +version = "2024-02-06a~ynh1" -maintainers = ["Gofannon"] +maintainers = [""] [upstream] license = "GPL-2.0-or-later" @@ -58,8 +58,8 @@ ram.runtime = "50M" [resources] [resources.sources.main] - url = "https://github.com/dokuwiki/dokuwiki/archive/refs/tags/release-2024-02-06.tar.gz" - sha256 = "fa5d890587d90e808402a95b581ccd173765045df23bd48f834b09a9df7252ed" + url = "https://github.com/dokuwiki/dokuwiki/archive/refs/tags/release-2024-02-06a.tar.gz" + sha256 = "3d025174169bb15be36b934f63974772b8caa9ea23e1b0c93f897396642b1697" autoupdate.strategy = "latest_github_tag" [resources.system_user] From f078898234a661fd0fa036854fe40c9b3f8a6120 Mon Sep 17 00:00:00 2001 From: Gofannon <17145502+Gofannon@users.noreply.github.com> Date: Wed, 13 Mar 2024 16:18:25 +0100 Subject: [PATCH 136/144] chore(linter): fix linter warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ! manifest ✘ The 'version' field should match the format ~ynh. For example: 4.3-2~ynh3. ..... --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index da552d1..19834f3 100644 --- a/manifest.toml +++ b/manifest.toml @@ -8,7 +8,7 @@ description.de = "Standardkonformes, einfach zu benutzendes Wiki und zielt haupt description.es = "Sistema de Wiki de uso sencillicimo y compatible con los estándares" description.it = "Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo" -version = "2024-02-06a~ynh1" +version = "2024.02.06a~ynh1" maintainers = [""] From cd85ecf220623607c1d39027d4bc4db869e8987d Mon Sep 17 00:00:00 2001 From: OniriCorpe Date: Fri, 15 Mar 2024 02:38:40 +0100 Subject: [PATCH 137/144] add autoupdate.version_regex to fix the autoupdate --- manifest.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/manifest.toml b/manifest.toml index 19834f3..b9541bd 100644 --- a/manifest.toml +++ b/manifest.toml @@ -61,6 +61,7 @@ ram.runtime = "50M" url = "https://github.com/dokuwiki/dokuwiki/archive/refs/tags/release-2024-02-06a.tar.gz" sha256 = "3d025174169bb15be36b934f63974772b8caa9ea23e1b0c93f897396642b1697" autoupdate.strategy = "latest_github_tag" + autoupdate.version_regex = "^release-(.*)$" [resources.system_user] From 8b82d71623624e2aed11efd5d0aab79834b62753 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 15 Mar 2024 01:38:44 +0000 Subject: [PATCH 138/144] Auto-update README --- README.md | 19 +++++++++---------- README_fr.md | 19 +++++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index d0fba81..4b6041f 100644 --- a/README.md +++ b/README.md @@ -25,10 +25,9 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * Default authorization is set as read only so guest people cannot edit pages. (Especially needed if wiki is public to avoid spam and defacing. Can be changed from admin panel) * During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... +**Shipped version:** 2024.02.06a~ynh1 -**Shipped version:** 2023.04.04a~ynh2 - -**Demo:** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo +**Demo:** ## Screenshots @@ -36,11 +35,11 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Documentation and resources -* Official app website: -* Official admin documentation: -* Upstream app code repository: -* YunoHost Store: -* Report a bug: +- Official app website: +- Official admin documentation: +- Upstream app code repository: +- YunoHost Store: +- Report a bug: ## Developer info @@ -48,10 +47,10 @@ Please send your pull request to the [testing branch](https://github.com/YunoHos To try the testing branch, please proceed like that. -``` bash +```bash sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug or sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ``` -**More info regarding app packaging:** \ No newline at end of file +**More info regarding app packaging:** diff --git a/README_fr.md b/README_fr.md index 3f7c2f2..21abccb 100644 --- a/README_fr.md +++ b/README_fr.md @@ -25,10 +25,9 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Droits d'édition par défaut du wiki définis en lecture seule afin que les invités ne puissent éditer les pages. (Nécessaire surtout lorsque le wiki est public pour éviter le spam et le vandalisme. Peut être changé depuis la partie administration du wiki) * Lors de la mise à jour, les plugins officiels sont également mis à jour. Nous vous recommandons toutefois de vérifier le bon fonctionnement des plugins dans le panneau d'administration après cette opération. Nous ne pouvons pas savoir si des plugins spéciaux posent problèmes... +**Version incluse :** 2024.02.06a~ynh1 -**Version incluse :** 2023.04.04a~ynh2 - -**Démo :** https://demo.yunohost.org/dokuwiki/doku.php?id=start&do=login&u=demo&p=demo +**Démo :** ## Captures d’écran @@ -36,11 +35,11 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentations et ressources -* Site officiel de l’app : -* Documentation officielle de l’admin : -* Dépôt de code officiel de l’app : -* YunoHost Store: -* Signaler un bug : +- Site officiel de l’app : +- Documentation officielle de l’admin : +- Dépôt de code officiel de l’app : +- YunoHost Store : +- Signaler un bug : ## Informations pour les développeurs @@ -48,10 +47,10 @@ Merci de faire vos pull request sur la [branche testing](https://github.com/Yuno Pour essayer la branche testing, procédez comme suit. -``` bash +```bash sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ou sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ``` -**Plus d’infos sur le packaging d’applications :** \ No newline at end of file +**Plus d’infos sur le packaging d’applications :** From 8b3a69bb648ef4429a98bce35736a71bcc73c4c5 Mon Sep 17 00:00:00 2001 From: OniriCorpe Date: Wed, 20 Mar 2024 22:56:32 +0100 Subject: [PATCH 139/144] better autoupdate.version_regex --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index b9541bd..55228b8 100644 --- a/manifest.toml +++ b/manifest.toml @@ -61,7 +61,7 @@ ram.runtime = "50M" url = "https://github.com/dokuwiki/dokuwiki/archive/refs/tags/release-2024-02-06a.tar.gz" sha256 = "3d025174169bb15be36b934f63974772b8caa9ea23e1b0c93f897396642b1697" autoupdate.strategy = "latest_github_tag" - autoupdate.version_regex = "^release-(.*)$" + autoupdate.version_regex = "^release-(.*)tar.gz$" [resources.system_user] From 59d08a4f677ec400f20fdbd6aece9b8eada4f425 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 29 Mar 2024 07:00:26 +0100 Subject: [PATCH 140/144] Auto-update README --- ALL_README.md | 6 ++++++ README.md | 13 ++++++------ README_fr.md | 31 ++++++++++++++-------------- README_gl.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ README_it.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 143 insertions(+), 21 deletions(-) create mode 100644 ALL_README.md create mode 100644 README_gl.md create mode 100644 README_it.md diff --git a/ALL_README.md b/ALL_README.md new file mode 100644 index 0000000..3d6c579 --- /dev/null +++ b/ALL_README.md @@ -0,0 +1,6 @@ +# All available README files by language + +- [Read the README in English](README.md) +- [Lire le README en français](README_fr.md) +- [Le o README en galego](README_gl.md) +- [Leggi il “README” in italiano](README_it.md) diff --git a/README.md b/README.md index 4b6041f..73a9c0c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ @@ -9,10 +9,10 @@ It shall NOT be edited by hand. [![Install Dokuwiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) -*[Lire ce readme en français.](./README_fr.md)* +*[Read this README is other languages.](./ALL_README.md)* -> *This package allows you to install Dokuwiki 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.* +> *This package allows you to install Dokuwiki 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 @@ -25,6 +25,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that * Default authorization is set as read only so guest people cannot edit pages. (Especially needed if wiki is public to avoid spam and defacing. Can be changed from admin panel) * During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... + **Shipped version:** 2024.02.06a~ynh1 **Demo:** @@ -43,9 +44,9 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Developer info -Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). +Please send your pull request to the [`testing` branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). -To try the testing branch, please proceed like that. +To try the `testing` branch, please proceed like that: ```bash sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug diff --git a/README_fr.md b/README_fr.md index 21abccb..6264d94 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,6 +1,6 @@ # Dokuwiki pour YunoHost @@ -9,10 +9,10 @@ It shall NOT be edited by hand. [![Installer Dokuwiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) -*[Read this readme in english.](./README.md)* +*[Lire le README dans d'autres langues.](./ALL_README.md)* -> *Ce package vous permet d’installer Dokuwiki 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.* +> *Ce package vous permet d’installer Dokuwiki rapidement et simplement sur un serveur YunoHost.* +> *Si vous n’avez pas YunoHost, consultez [ce guide](https://yunohost.org/install) pour savoir comment l’installer et en profiter.* ## Vue d’ensemble @@ -25,9 +25,10 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent * Droits d'édition par défaut du wiki définis en lecture seule afin que les invités ne puissent éditer les pages. (Nécessaire surtout lorsque le wiki est public pour éviter le spam et le vandalisme. Peut être changé depuis la partie administration du wiki) * Lors de la mise à jour, les plugins officiels sont également mis à jour. Nous vous recommandons toutefois de vérifier le bon fonctionnement des plugins dans le panneau d'administration après cette opération. Nous ne pouvons pas savoir si des plugins spéciaux posent problèmes... -**Version incluse :** 2024.02.06a~ynh1 -**Démo :** +**Version incluse :** 2024.02.06a~ynh1 + +**Démo :** ## Captures d’écran @@ -35,17 +36,17 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentations et ressources -- Site officiel de l’app : -- Documentation officielle de l’admin : -- Dépôt de code officiel de l’app : -- YunoHost Store : -- Signaler un bug : +- Site officiel de l’app : +- Documentation officielle de l’admin : +- Dépôt de code officiel de l’app : +- YunoHost Store : +- Signaler un bug : ## Informations pour les développeurs -Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). +Merci de faire vos pull request sur la [branche `testing`](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). -Pour essayer la branche testing, procédez comme suit. +Pour essayer la branche `testing`, procédez comme suit : ```bash sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug @@ -53,4 +54,4 @@ ou sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ``` -**Plus d’infos sur le packaging d’applications :** +**Plus d’infos sur le packaging d’applications :** diff --git a/README_gl.md b/README_gl.md new file mode 100644 index 0000000..5c537c9 --- /dev/null +++ b/README_gl.md @@ -0,0 +1,57 @@ + + +# Dokuwiki para YunoHost + +[![Nivel de integración](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Estado de funcionamento](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Estado de mantemento](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) + +[![Instalar Dokuwiki con YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) + +*[Le este README en outros idiomas.](./ALL_README.md)* + +> *Este paquete permíteche instalar Dokuwiki de xeito rápido e doado nun servidor YunoHost.* +> *Se non usas YunoHost, le a [documentación](https://yunohost.org/install) para saber como instalalo.* + +## Vista xeral + +DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. + +## YunoHost specific features + +* Integrate with YunoHost users and SSO - i.e. logout button +* Allow one user to be the "administrator" (set at the installation) +* Default authorization is set as read only so guest people cannot edit pages. (Especially needed if wiki is public to avoid spam and defacing. Can be changed from admin panel) +* During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... + + +**Versión proporcionada:** 2024.02.06a~ynh1 + +**Demo:** + +## Capturas de pantalla + +![Captura de pantalla de Dokuwiki](./doc/screenshots/DokuWiki_Screenshot.png) + +## Documentación e recursos + +- Web oficial da app: +- Documentación oficial para admin: +- Repositorio de orixe do código: +- Tenda YunoHost: +- Informar dun problema: + +## Info de desenvolvemento + +Envía a túa colaboración á [rama `testing`](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). + +Para probar a rama `testing`, procede deste xeito: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug +ou +sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug +``` + +**Máis info sobre o empaquetado da app:** diff --git a/README_it.md b/README_it.md new file mode 100644 index 0000000..93b9ac8 --- /dev/null +++ b/README_it.md @@ -0,0 +1,57 @@ + + +# Dokuwiki per YunoHost + +[![Livello di integrazione](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Stato di funzionamento](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Stato di manutenzione](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) + +[![Installa Dokuwiki con YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) + +*[Leggi questo README in altre lingue.](./ALL_README.md)* + +> *Questo pacchetto ti permette di installare Dokuwiki su un server YunoHost in modo semplice e veloce.* +> *Se non hai YunoHost, consulta [la guida](https://yunohost.org/install) per imparare a installarlo.* + +## Panoramica + +DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. + +## YunoHost specific features + +* Integrate with YunoHost users and SSO - i.e. logout button +* Allow one user to be the "administrator" (set at the installation) +* Default authorization is set as read only so guest people cannot edit pages. (Especially needed if wiki is public to avoid spam and defacing. Can be changed from admin panel) +* During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... + + +**Versione pubblicata:** 2024.02.06a~ynh1 + +**Prova:** + +## Screenshot + +![Screenshot di Dokuwiki](./doc/screenshots/DokuWiki_Screenshot.png) + +## Documentazione e risorse + +- Sito web ufficiale dell’app: +- Documentazione ufficiale per gli amministratori: +- Repository upstream del codice dell’app: +- Store di YunoHost: +- Segnala un problema: + +## Informazioni per sviluppatori + +Si prega di inviare la tua pull request alla [branch di `testing`](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). + +Per provare la branch di `testing`, si prega di procedere in questo modo: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug +o +sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug +``` + +**Maggiori informazioni riguardo il pacchetto di quest’app:** From 3c4e826f01740efdf9459ef515012579e41db473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 2 Apr 2024 12:40:08 +0200 Subject: [PATCH 141/144] Fix autoupdate.version_regex --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 55228b8..3296841 100644 --- a/manifest.toml +++ b/manifest.toml @@ -61,7 +61,7 @@ ram.runtime = "50M" url = "https://github.com/dokuwiki/dokuwiki/archive/refs/tags/release-2024-02-06a.tar.gz" sha256 = "3d025174169bb15be36b934f63974772b8caa9ea23e1b0c93f897396642b1697" autoupdate.strategy = "latest_github_tag" - autoupdate.version_regex = "^release-(.*)tar.gz$" + autoupdate.version_regex = "^release-([0-9]{4})-([0-9]{2})-([0-9]{2})[a-z]*$" [resources.system_user] From 7d8f135f6d8a9ccefbf639f6f4fb908bac8810b3 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 2 Apr 2024 10:43:16 +0000 Subject: [PATCH 142/144] Auto-update READMEs --- ALL_README.md | 3 +-- README.md | 2 +- README_eu.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 README_eu.md diff --git a/ALL_README.md b/ALL_README.md index 3d6c579..3eeb161 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -1,6 +1,5 @@ # All available README files by language - [Read the README in English](README.md) +- [Irakurri README euskaraz](README_eu.md) - [Lire le README en français](README_fr.md) -- [Le o README en galego](README_gl.md) -- [Leggi il “README” in italiano](README_it.md) diff --git a/README.md b/README.md index 73a9c0c..b0b50fb 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ It shall NOT be edited by hand. [![Install Dokuwiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) -*[Read this README is other languages.](./ALL_README.md)* +*[Read this README in other languages.](./ALL_README.md)* > *This package allows you to install Dokuwiki 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.* diff --git a/README_eu.md b/README_eu.md new file mode 100644 index 0000000..f65ec3d --- /dev/null +++ b/README_eu.md @@ -0,0 +1,57 @@ + + +# Dokuwiki YunoHost-erako + +[![Integrazio maila](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![Funtzionamendu egoera](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![Mantentze egoera](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) + +[![Instalatu Dokuwiki YunoHost-ekin](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=dokuwiki) + +*[Irakurri README hau beste hizkuntzatan.](./ALL_README.md)* + +> *Pakete honek Dokuwiki YunoHost zerbitzari batean azkar eta zailtasunik gabe instalatzea ahalbidetzen dizu.* +> *YunoHost ez baduzu, kontsultatu [gida](https://yunohost.org/install) nola instalatu ikasteko.* + +## Aurreikuspena + +DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. + +## YunoHost specific features + +* Integrate with YunoHost users and SSO - i.e. logout button +* Allow one user to be the "administrator" (set at the installation) +* Default authorization is set as read only so guest people cannot edit pages. (Especially needed if wiki is public to avoid spam and defacing. Can be changed from admin panel) +* During the upgrade, official plugins are also upgraded. We recommend that you should check that they run properly in the administration panel after the upgrade. We cannot know if some plugins are broken... + + +**Paketatutako bertsioa:** 2024.02.06a~ynh1 + +**Demoa:** + +## Pantaila-argazkiak + +![Dokuwiki(r)en pantaila-argazkia](./doc/screenshots/DokuWiki_Screenshot.png) + +## Dokumentazioa eta baliabideak + +- Aplikazioaren webgune ofiziala: +- Administratzaileen dokumentazio ofiziala: +- Jatorrizko aplikazioaren kode-gordailua: +- YunoHost Denda: +- Eman errore baten berri: + +## Garatzaileentzako informazioa + +Bidali `pull request`a [`testing` abarrera](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). + +`testing` abarra probatzeko, ondorengoa egin: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug +edo +sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug +``` + +**Informazio gehiago aplikazioaren paketatzeari buruz:** From 27e0d31d25d43bfc92ece86fc9e7f8880f1d8d5c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Date: Mon, 1 Apr 2024 20:34:06 +0200 Subject: [PATCH 143/144] Update manifest.toml: fix "maintainers" key, empty string is hella confusing --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 3296841..e165b73 100644 --- a/manifest.toml +++ b/manifest.toml @@ -10,7 +10,7 @@ description.it = "Wiki aderente agli standard, semplice da usare, finalizzato pr version = "2024.02.06a~ynh1" -maintainers = [""] +maintainers = [] [upstream] license = "GPL-2.0-or-later" From 1d1a045d431e53538c53b57d487271b3fd6c73de Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 3 Apr 2024 20:44:30 +0000 Subject: [PATCH 144/144] Auto-update READMEs --- ALL_README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ALL_README.md b/ALL_README.md index 3eeb161..77b7509 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -3,3 +3,4 @@ - [Read the README in English](README.md) - [Irakurri README euskaraz](README_eu.md) - [Lire le README en français](README_fr.md) +- [Le o README en galego](README_gl.md)

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 Date: Fri, 25 Sep 2020 21:51:33 +0200 Subject: [PATCH 033/144] :/ --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ea35bc5..a36ce1c 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Screenshots -![Screenshot](../sources/DokuWiki_Screenshot.png) +![Screenshot](sources/DokuWiki_Screenshot.png) ## Demo diff --git a/README_fr.md b/README_fr.md index cc4b1d3..0796ecc 100644 --- a/README_fr.md +++ b/README_fr.md @@ -16,7 +16,7 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Captures d'écran -![Capture d'écran](../sources/DokuWiki_Screenshot.png) +![Capture d'écran](sources/DokuWiki_Screenshot.png) ## Démo From b59e479fce2fcd9c8f57c196b2891df76adbf355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 1 Oct 2020 08:44:30 +0200 Subject: [PATCH 034/144] Update README.md Co-authored-by: yalh76 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a36ce1c..b8db370 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DokuWiki for YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) [![Install DokuWiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* From 6fa6ea3c0f626be468f0b47e09d4e4c189afc3e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 1 Oct 2020 08:44:41 +0200 Subject: [PATCH 035/144] Update README.md Co-authored-by: yalh76 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b8db370..dadfba7 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ## Screenshots -![Screenshot](sources/DokuWiki_Screenshot.png) +![Screenshot of DokuWiki main window](sources/DokuWiki_Screenshot.png) ## Demo From d3723298e2941744a39938b28e7a5b061ad58896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 23 Oct 2020 08:46:09 +0200 Subject: [PATCH 036/144] Testing (#67) * Upgrade to upstream v.2020-07-29 --- CHANGELOG.md | 59 ++++++++++++++++++++++++++++++++ README.md | 33 ++++++------------ README_fr.md | 42 ++++++++++------------- conf/app.src | 6 ++-- conf/nginx.conf | 4 +-- manifest.json | 16 ++++----- pull_request_template.md | 12 +++---- scripts/backup | 13 ++++--- scripts/change_url | 16 ++++----- scripts/install | 22 ++++++------ scripts/remove | 10 +++--- scripts/restore | 4 +-- scripts/upgrade | 20 +++++------ sources/DokuWiki_Screenshot.png | Bin 0 -> 141447 bytes 14 files changed, 148 insertions(+), 109 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 sources/DokuWiki_Screenshot.png diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ba827a8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,59 @@ +# Changelog + +## [Unreleased] + +## [2018-04-22a~ynhXX] + +### Added + +- Upgrade actions and config-panel scripts + +------------ + +## [2018-04-22b~ynh1] - 2020-03-23 + +### Added + +- New DokuWiki version `2018-04-22b` +- Changelog available in `CHANGELOG.md` + +### Changed + +- Upgrade content of file `pull_request_template.md` + +## [2018-04-22a~ynh3] - 2020-02-20 + +### Added + +- Use 'URL rewrite' for prettier URLs + +### Changed + +- Activate URL rewrite by default (does not break old links) + +### Removed + +- Unused DokuWiki config file + +## [2018-04-22a~ynh2] - 2020-02-20 + +### Added + +- Add fail2ban support to avoid bruteforce login attempts + +### Changed + +- Global upgrade of the package + +### Fixed + +- Get rid of the php ini file and merge its content into the pool file +- Update Readme following last work made on the package and current version in testing branch + +### Removed + +- Unused config file settings + +## [Previous versions] - YYYY-MM-DD + +- Will be written (one day maybye) diff --git a/README.md b/README.md index fea004e..dadfba7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DokuWiki for YunoHost -[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) +[![Integration level](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) [![Install DokuWiki with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) *[Lire ce readme en français.](./README_fr.md)* @@ -12,11 +12,11 @@ If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. -**Shipped version:** 2018-04-22a "Greebo" +**Shipped version:** 2020-07-29 ## Screenshots -![](https://www.dokuwiki.org/_media/dokuwikimainwindow.png) +![Screenshot of DokuWiki main window](sources/DokuWiki_Screenshot.png) ## Demo @@ -38,38 +38,27 @@ DokuWiki is a simple to use and highly versatile Open Source wiki software that ### Supported architectures -* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) -* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-stretch.nohost.me/ci/apps/dokuwiki/) ## Limitations -* Cannot create or login with dokuwiki internal users, only users from Yunohost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) - -## Additional information - -### Changelog - -* *Many missing - List taken from previous documentation* -* 07 Mar 2017 - Update app -* 11 Feb 2017 - Create script app +* Cannot create or login with DokuWiki internal users, only users from YunoHost (Work needed for [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) ## Links - * Report a bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues - * App website: https://www.dokuwiki.org - * Upstream app repository: https://github.com/splitbrain/dokuwiki - * YunoHost website: https://yunohost.org +* Report a bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues +* App website: https://www.dokuwiki.org +* Upstream app repository: https://github.com/splitbrain/dokuwiki +* YunoHost website: https://yunohost.org --- ## Developers infos -**Only if you know what you are doing AND want to switch to an unstable branch for testing or coding** +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) -Instead of merging directly into `master`, please do your pull request to the [`testing` branch](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing) - -To try the `testing` branch, please proceed like that. +To try the testing branch, please proceed like that. ``` sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug or diff --git a/README_fr.md b/README_fr.md index fe39537..0796ecc 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,22 +1,22 @@ -# Dokuwiki pour YunoHost +# DokuWiki pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) -[![Installer DokuWiki grâce à YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) +[![Niveau d'intégration](https://dash.yunohost.org/integration/dokuwiki.svg)](https://dash.yunohost.org/appci/app/dokuwiki) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/dokuwiki.maintain.svg) +[![Installer DokuWiki avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=dokuwiki) -*[Read this readme in english.](./README.md)* +*[Read this readme in english.](./README.md)* -> *Ce package vous permet d'installer Dokuwiki rapidement et simplement sur un serveur Yunohost. +> *Ce package vous permet d'installer DokuWiki 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.* ## Vue d'ensemble DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent qui ne nécessite pas de base de données. Il est apprécié par les utilisateurs pour sa syntaxe propre et lisible. La facilité de maintenance, de sauvegarde et d'intégration en fait un favori d'administrateur. Des contrôles d'accès et des connecteurs d'authentification intégrés rendent DokuWiki particulièrement utile dans le contexte de l'entreprise et le grand nombre de plugins apportés par sa communauté dynamique permettent un large éventail de cas d'utilisation au-delà d'un wiki traditionnel. -**Version incluse:** 2018-04-22a "Greebo" +**Version incluse:** 2020-07-29 ## Captures d'écran -![](https://www.dokuwiki.org/_media/dokuwikimainwindow.png) +![Capture d'écran](sources/DokuWiki_Screenshot.png) ## Démo @@ -26,8 +26,8 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ## Documentation -* Documentation officielle: https://www.dokuwiki.org/manual -* Documentation YunoHost: https://yunohost.org/#/app_dokuwiki +* Documentation officielle : https://www.dokuwiki.org/manual +* Documentation YunoHost : https://yunohost.org/#/app_dokuwiki ## Caractéristiques spécifiques YunoHost @@ -38,39 +38,33 @@ DokuWiki est un logiciel wiki Open Source simple à utiliser et très polyvalent ### Architectures matérielles supportées -* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/dokuwiki/) * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/dokuwiki/) -* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/ci/logs/dokuwiki%20%28Apps%29.svg)](https://ci-stretch.nohost.me/ci/apps/dokuwiki/) ## Limitations -* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de Yunohost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) +* Impossible d'ajouter et d'utiliser les utilisateurs internes de DokuWiki, seulement ceux de YunoHost (travail nécessaire pour [authchained plugin](https://www.dokuwiki.org/plugin:authchained)) ## Informations additionnelles ### Historique des versions -* *Many missing - List taken from previous documentation* -* 07 Mar 2017 - Update app -* 11 Feb 2017 - Create script app - ## Liens - * Signaler un bug: https://github.com/YunoHost-Apps/dokuwiki_ynh/issues - * Site de l'application:https://www.dokuwiki.org - * Dépôt de l'application principale: https://github.com/splitbrain/dokuwiki - * Site web YunoHost: https://yunohost.org/ + * Signaler un bug : https://github.com/YunoHost-Apps/dokuwiki_ynh/issues + * Site de l'application : https://www.dokuwiki.org + * Dépôt de l'application principale : https://github.com/splitbrain/dokuwiki + * Site web YunoHost : https://yunohost.org/ --- ## Informations pour les développeurs -**Seulement si vous voulez utiliser une branche de test pour le codage, au lieu de fusionner directement dans la banche principale.** - -Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing). +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. -``` + +```bash sudo yunohost app install https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug ou sudo yunohost app upgrade dokuwiki -u https://github.com/YunoHost-Apps/dokuwiki_ynh/tree/testing --debug diff --git a/conf/app.src b/conf/app.src index e42acb7..2274131 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,6 +1,6 @@ -SOURCE_URL=https://download.dokuwiki.org/src/dokuwiki/dokuwiki-2018-04-22a.tgz -SOURCE_SUM=18765a29508f96f9882349a304bffc03 -SOURCE_SUM_PRG=md5sum +SOURCE_URL=https://github.com/splitbrain/dokuwiki/archive/release_stable_2020-07-29.tar.gz +SOURCE_SUM=cc1cd9f00095fea327baa79d8f02c904fe1c37bc3f8fd9999eaf646ee9928884 +SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true SOURCE_FILENAME= diff --git a/conf/nginx.conf b/conf/nginx.conf index 64fc3ba..5cb057b 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -39,12 +39,12 @@ location __PATH__/ { } # Deny Access to htaccess-Files for Apache - location ~ /\.ht { + location ~ __PATH__/\.ht { deny all; } # Serve static files - location ~ ^/lib.*\.(gif|png|ico|jpg)$ { + location ~ ^__PATH__/lib.*\.(gif|png|ico|jpg)$ { expires 30d; } diff --git a/manifest.json b/manifest.json index 1c3ae56..53dd472 100644 --- a/manifest.json +++ b/manifest.json @@ -3,13 +3,13 @@ "id": "dokuwiki", "packaging_format": 1, "description": { - "en": "DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database.", - "fr": "DokuWiki est un wiki Open Source simple à utiliser et très polyvalent qui n'exige aucune base de données.", - "de": "DokuWiki ist ein standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab.", - "es": "DokuWiki es un sistema de Wiki de uso sencillicimo y compatible con los estándares.", - "it": "DokuWiki è un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." + "en": "A lightweight, simple to use and highly versatile wiki", + "fr": "Un wiki léger, simple à utiliser et très polyvalent", + "de": "Ein standardkonformes, einfach zu benutzendes Wiki und zielt hauptsächlich auf die Erstellung von Dokumentationen aller Art ab.", + "es": "Un sistema de Wiki de uso sencillicimo y compatible con los estándares.", + "it": "Un Wiki aderente agli standard, semplice da usare, finalizzato principalmente alla creazione di documentazione di qualsiasi tipo." }, - "version": "2018-04-22a~ynh3", + "version": "2020-07-29~ynh1", "url": "https://www.dokuwiki.org", "license": "GPL-2.0-or-later", "maintainer": { @@ -63,10 +63,10 @@ "name": "is_public", "type": "boolean", "ask": { - "en": "Is it a public DokuWiki site ?", + "en": "Is it a public DokuWiki site?", "fr": "Est-ce un site public ?" }, - "default": "true" + "default": true }, { "name": "language", diff --git a/pull_request_template.md b/pull_request_template.md index fceb723..8f984e1 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -2,7 +2,7 @@ - *Description of why you made this PR* ## Solution -- *And how you fix that* +- *And how do you fix that problem* ## PR Status - [ ] Code finished. @@ -13,12 +13,10 @@ ## Validation --- -*Minor decision* -- **Upgrade previous version** : - [ ] **Code review** : -- [ ] **Approval (LGTM)** : -- [ ] **Approval (LGTM)** : -- **CI succeeded** : -[![Build Status](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/badge/icon)](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/) +- [ ] **Approval (LGTM)** : +*Code review and approval have to be from a member of @YunoHost-Apps/apps-group* +- **CI succeeded** : +[![Build Status](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/badge/icon)](https://ci-apps-hq.yunohost.org/jenkins/job/dokuwiki_ynh%20PR-NUM-/) *Please replace '-NUM-' in this link by the PR number.* When the PR is marked as ready to merge, you have to wait for 3 days before really merging it. diff --git a/scripts/backup b/scripts/backup index b931a0e..176834b 100755 --- a/scripts/backup +++ b/scripts/backup @@ -19,7 +19,7 @@ ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." +ynh_print_info --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME @@ -27,32 +27,31 @@ final_path=$(ynh_app_setting_get --app=$app --key=final_path) domain=$(ynh_app_setting_get --app=$app --key=domain) #================================================= -# STANDARD BACKUP STEPS +# DECLARE DATA AND CONF FILES TO BACKUP +#================================================= +ynh_print_info --message="Declaring files to be backed up..." + #================================================= # BACKUP THE APP MAIN DIR #================================================= -ynh_script_progression --message="Backing up the main app directory..." ynh_backup --src_path="$final_path" #================================================= # BACKUP THE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Backing up nginx web server configuration..." ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # BACKUP THE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Backing up php-fpm configuration..." --weight=2 ynh_backup --src_path="/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # BACKUP FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Backing up fail2ban configuration..." ynh_backup --src_path="/etc/fail2ban/jail.d/$app.conf" ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" @@ -61,4 +60,4 @@ ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" # END OF SCRIPT #================================================= -ynh_script_progression --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." --last +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/change_url b/scripts/change_url index 6851308..fe9ea64 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -50,23 +50,23 @@ fi #================================================= # MODIFY URL IN NGINX CONF #================================================= -ynh_script_progression --message="Updating nginx web server configuration..." --weight=2 +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=2 nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf -# Change the path in the nginx config file +# Change the path in the NGINX config file if [ $change_path -eq 1 ] then - # Make a backup of the original nginx config file if modified + # Make a backup of the original NGINX config file if modified ynh_backup_if_checksum_is_different --file="$nginx_conf_path" - # Set global variables for nginx helper + # Set global variables for NGINX helper domain="$old_domain" path_url="$new_path" - # Create a dedicated nginx config + # Create a dedicated NGINX config ynh_add_nginx_config fi -# Change the domain for nginx +# Change the domain for NGINX if [ $change_domain -eq 1 ] then # Delete file checksum for the old conf file location @@ -81,7 +81,7 @@ fi #================================================= # UPGRADE FAIL2BAN #================================================= -ynh_script_progression --message="Reconfiguring fail2ban..." --weight=6 +ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=6 ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $new_path.*$" --max_retry=5 @@ -90,7 +90,7 @@ ynh_add_fail2ban_config --logpath="/var/log/nginx/$new_domain-error.log" --failr #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/install b/scripts/install index 4ceb331..820c3ef 100755 --- a/scripts/install +++ b/scripts/install @@ -64,9 +64,9 @@ ynh_setup_source --dest_dir="$final_path" #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Configuring nginx web server..." --weight=2 +ynh_script_progression --message="Configuring NGINX web server..." --weight=2 -# Create a dedicated nginx config +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= @@ -80,9 +80,9 @@ ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Configuring php-fpm..." --weight=2 +ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 -# Create a dedicated php-fpm config +# Create a dedicated PHP-FPM config ynh_add_fpm_config #================================================= @@ -90,7 +90,7 @@ ynh_add_fpm_config #================================================= # CUSTOMIZE DOKUWIKI #================================================= -ynh_script_progression --message="Configuring dokuwiki..." --weight=2 +ynh_script_progression --message="Configuring DokuWiki..." --weight=2 # Loading order of configuration files # @@ -103,8 +103,8 @@ ynh_script_progression --message="Configuring dokuwiki..." --weight=2 # See https://www.dokuwiki.org/plugin:config#protecting_settings -### Copy Yunohost specific configuration -# This File cannot be modified directly by Dokuwiki, only by hand or by Yunohost +### Copy YunoHost specific configuration +# This File cannot be modified directly by DokuWiki, only by hand or by YunoHost # It will only be updated by Yunohost package or directly by adventurous users cp ../conf/local.protected.php $final_path/conf @@ -112,7 +112,7 @@ cp ../conf/local.protected.php $final_path/conf ynh_replace_string --match_string="__YNH_ADMIN_USER__" --replace_string="$admin" --target_file="$final_path/conf/local.protected.php" -# This file might be modified by dokuwiki admin panel or by plugins +# This file might be modified by DokuWiki admin panel or by plugins # It will not be modified by Yunohost in order to keep user settings cp ../conf/local.php $final_path/conf @@ -159,7 +159,7 @@ ynh_store_file_checksum --file="$final_path/conf/local.protected.php" #================================================= # INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN #================================================= -ynh_script_progression --message="Installing logautherror plugin for fail2ban..." --weight=2 +ynh_script_progression --message="Installing logautherror plugin for Fail2Ban..." --weight=2 ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror @@ -209,7 +209,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 #================================================= # SETUP FAIL2BAN #================================================= -ynh_script_progression --message="Configuring fail2ban..." --weight=7 +ynh_script_progression --message="Configuring Fail2Ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 @@ -228,7 +228,7 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/remove b/scripts/remove index 6bb05bb..b0d36b7 100755 --- a/scripts/remove +++ b/scripts/remove @@ -32,23 +32,23 @@ ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing nginx web server configuration..." +ynh_script_progression --message="Removing NGINX web server configuration..." -# Remove the dedicated nginx config +# Remove the dedicated NGINX config ynh_remove_nginx_config #================================================= # REMOVE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Removing php-fpm configuration..." --weight=2 +ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=2 -# Remove the dedicated php-fpm config +# Remove the dedicated PHP-FPM config ynh_remove_fpm_config #================================================= # REMOVE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Removing fail2ban configuration..." --weight=7 +ynh_script_progression --message="Removing Fail2Ban configuration..." --weight=7 ynh_remove_fail2ban_config diff --git a/scripts/restore b/scripts/restore index 0cf8f4a..e36a534 100755 --- a/scripts/restore +++ b/scripts/restore @@ -94,7 +94,7 @@ ynh_restore_file --origin_path="/etc/php/7.0/fpm/pool.d/$app.conf" #================================================= # RESTORE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the fail2ban configuration..." --weight=7 +ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=7 ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" @@ -105,7 +105,7 @@ ynh_systemd_action --action=restart --service_name=fail2ban #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading nginx web server and php-fpm..." --weight=2 +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM.." --weight=2 ynh_systemd_action --service_name=php7.0-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/upgrade b/scripts/upgrade index 8e9eaaa..645baee 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -63,10 +63,10 @@ fi -# Yunohost specific configuration, if it isn't exist already +# YunoHost specific configuration, if it isn't exist already # Previously, these settings were store in an unique "dokuwiki.php" -# Now, they are split in multiple files to ease upgrading process (separate Yunohost config from user config) +# Now, they are split in multiple files to ease upgrading process (separate YunoHost config from user config) # Loading order of configuration files # @@ -176,9 +176,9 @@ fi #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading nginx web server configuration..." --weight=2 +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 -# Create a dedicated nginx config +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= @@ -192,9 +192,9 @@ ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading php-fpm configuration..." +ynh_script_progression --message="Upgrading PHP-FPM configuration..." -# Create a dedicated php-fpm config +# Create a dedicated PHP-FPM config ynh_add_fpm_config #================================================= @@ -203,7 +203,7 @@ ynh_add_fpm_config if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Upgrading dokuwiki..." --weight=7 + ynh_script_progression --message="Upgrading DokuWiki..." --weight=7 # Remove upgrade notification inside Dokuwiki's admin panel # See https://www.dokuwiki.org/update_check @@ -256,7 +256,7 @@ ynh_store_file_checksum --file="$final_path/conf/local.protected.php" #================================================= # INSTALL LOGAUTHERROR PLUGIN FOR FAIL2BAN #================================================= -ynh_script_progression --message="Upgrading logautherror plugin for fail2ban..." --weight=2 +ynh_script_progression --message="Upgrading logautherror plugin for Fail2Ban..." --weight=2 ynh_setup_source --dest_dir="$final_path/lib/plugins/logautherror" --source_id=logautherror @@ -306,7 +306,7 @@ find $final_path/lib -type d -print0 | xargs -0 chmod 0755 #================================================= # SETUP FAIL2BAN #================================================= -ynh_script_progression --message="Reconfiguring fail2ban..." --weight=7 +ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=7 ynh_add_fail2ban_config --logpath="/var/log/nginx/$domain-error.log" --failregex="^.*authentication failure. while reading response header from upstream, client: ,.*POST $path_url.*$" --max_retry=5 @@ -329,7 +329,7 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading nginx web server..." +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload diff --git a/sources/DokuWiki_Screenshot.png b/sources/DokuWiki_Screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..dcba61c6d18cee25ab47c4bde5370fcc71d41830 GIT binary patch literal 141447 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%0D!mL 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� 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