From 66cdfff98fe9afe4c15eed1aa051c8c0d51fcb6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 10:14:05 +0200 Subject: [PATCH 001/354] Update backup --- scripts/backup | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/scripts/backup b/scripts/backup index fc09803e..6a6f8602 100755 --- a/scripts/backup +++ b/scripts/backup @@ -39,13 +39,6 @@ ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -#================================================= -# BACKUP THE MYSQL DATABASE -#================================================= -ynh_print_info --message="Backing up the MySQL database..." - -ynh_mysql_dump_db --database="$db_name" --default_character_set="utf8mb4" > db.sql - #================================================= # SPECIFIC BACKUP #================================================= @@ -68,11 +61,11 @@ ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" ynh_backup --src_path="/etc/cron.d/$app" #================================================= -# BACKUP THE MYSQL DATABASE +# BACKUP THE POSTGRESQL DATABASE #================================================= -ynh_print_info --message="Backing up the MySQL database..." +ynh_print_info --message="Backing up the PostgreSQL database..." -ynh_mysql_dump_db --database="$db_name" > db.sql +ynh_psql_dump_db --database="$db_name" > db.sql #================================================= # END OF SCRIPT From 5d384066ec2ea666030811fc7e1a9716bfa59a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 10:25:12 +0200 Subject: [PATCH 002/354] fix --- manifest.toml | 4 ++-- scripts/_ynh_mysql_dump_db.sh | 37 ----------------------------------- scripts/backup | 1 - scripts/install | 20 ++++++------------- scripts/restore | 6 +++--- scripts/upgrade | 2 +- 6 files changed, 12 insertions(+), 58 deletions(-) delete mode 100644 scripts/_ynh_mysql_dump_db.sh diff --git a/manifest.toml b/manifest.toml index dafd7e53..32b295bb 100644 --- a/manifest.toml +++ b/manifest.toml @@ -69,8 +69,8 @@ ram.runtime = "512M" api.allowed = ["visitors", "all_users"] [resources.apt] - packages = "mariadb-server, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, php8.2-fpm, php8.2-bz2, php8.2-imap, php8.2-gmp, php8.2-gd, php8.2-intl, php8.2-curl, php8.2-apcu, php8.2-redis, php8.2-ldap, php8.2-imagick, php8.2-zip, php8.2-mbstring, php8.2-xml, php8.2-mysql, php8.2-igbinary, php8.2-bcmath" + packages = "postgresql, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, php8.2-pgsql, php8.2-fpm, php8.2-bz2, php8.2-imap, php8.2-gmp, php8.2-gd, php8.2-intl, php8.2-curl, php8.2-apcu, php8.2-redis, php8.2-ldap, php8.2-imagick, php8.2-zip, php8.2-mbstring, php8.2-xml, php8.2-mysql, php8.2-igbinary, php8.2-bcmath" [resources.database] - type = "mysql" + type = "postgresql" \ No newline at end of file diff --git a/scripts/_ynh_mysql_dump_db.sh b/scripts/_ynh_mysql_dump_db.sh deleted file mode 100644 index 3b922bb8..00000000 --- a/scripts/_ynh_mysql_dump_db.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -# Dump a database -# -# example: ynh_mysql_dump_db --database=roundcube --default_character_set="utf8mb4" > ./dump.sql -# -# usage: ynh_mysql_dump_db --database=database -# | arg: -d, --database= - the database name to dump -# | arg: -c, --default_character_set= - the charset to use -# | ret: the mysqldump output -# -# Requires YunoHost version 2.2.4 or higher. -ynh_mysql_dump_db() { - # Declare an array to define the options of this helper. - local legacy_args=dc - local -A args_array=( [d]=database= [c]=default_character_set= ) - local database - local default_character_set - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - default_character_set="${default_character_set:-}" - MYSQL_ROOT_PWD_FILE=/etc/yunohost/mysql - - if [ -n "$default_character_set" ] - then - default_character_set="--default-character-set=$default_character_set" - else - # By default, default character set is "latin1" - default_character_set="--default-character-set=latin1" - fi - - if [ -f "$MYSQL_ROOT_PWD_FILE" ]; then - mysqldump --user="root" --password="$(cat $MYSQL_ROOT_PWD_FILE)" --single-transaction --skip-dump-date "$default_character_set" "$database" - else - mysqldump --single-transaction --skip-dump-date "$default_character_set" "$database" - fi -} \ No newline at end of file diff --git a/scripts/backup b/scripts/backup index 6a6f8602..db1050b1 100755 --- a/scripts/backup +++ b/scripts/backup @@ -8,7 +8,6 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -source ../settings/scripts/_ynh_mysql_dump_db.sh #================================================= # DECLARE DATA AND CONF FILES TO BACKUP diff --git a/scripts/install b/scripts/install index ccfde361..b453dd06 100755 --- a/scripts/install +++ b/scripts/install @@ -28,14 +28,6 @@ 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 -#================================================= -# CREATE A MYSQL DATABASE -#================================================= -ynh_script_progression --message="Migrate MySQL database to utf8..." --weight=2 - -ynh_mysql_connect_as --user=$db_user --password="$db_pwd" --database=$db_name \ - <<< "ALTER DATABASE $db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" - #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= @@ -99,12 +91,12 @@ chown -R $app: "$install_dir" "$data_dir" # Define password in an intermediate var # The fact that it's called _password allows it to be -# picked up by Yunohost's auto-redact mecanism +# picked up by YunoHost's auto-redact mecanism admin_password="$(ynh_string_random --length=6)" # Install Nextcloud using a temporary admin user exec_occ maintenance:install \ - --database "mysql" --database-name $db_name \ + --database "pgsql" --database-name $db_name \ --database-user $db_user --database-pass "$db_pwd" \ --admin-user "admin" --admin-pass "$admin_password" \ --data-dir "$data_dir/data" \ @@ -115,9 +107,6 @@ exec_occ maintenance:install \ #================================================= ynh_script_progression --message="Configuring $app..." --weight=8 -# Set the mysql.utf8mb4 config to true in config.php -exec_occ config:system:set mysql.utf8mb4 --type boolean --value="true" - # Ensure that UpdateNotification app is disabled exec_occ app:disable updatenotification @@ -203,8 +192,9 @@ exec_occ config:system:set overwrite.cli.url --value="https://${domain}" #================================================= # Set the user as admin -ynh_mysql_connect_as --user=$db_name --password="$db_pwd" --database=$db_name --default_character_set="utf8mb4" \ +ynh_psql_connect_as --user=$db_user --password="$db_pwd" --database=$db_name \ <<< "INSERT INTO oc_group_user VALUES ('admin','$admin');" + # And delete admin user exec_occ user:delete admin @@ -241,10 +231,12 @@ ynh_script_progression --message="Adding multimedia directories..." --weight=6 # Build YunoHost multimedia directories ynh_multimedia_build_main_dir + # Mount the user directory in Nextcloud exec_occ app:enable files_external create_external_storage "/home/yunohost.multimedia/\$user" "Multimedia" create_external_storage "/home/yunohost.multimedia/share" "Shared multimedia" + # Allow nextcloud to write into these directories ynh_multimedia_addaccess $app diff --git a/scripts/restore b/scripts/restore index 3dde00f1..915dd146 100755 --- a/scripts/restore +++ b/scripts/restore @@ -20,11 +20,11 @@ ynh_script_progression --message="Restoring the app main directory..." ynh_restore_file --origin_path="$install_dir" #================================================= -# RESTORE THE MYSQL DATABASE +# RESTORE THE POSTGRESQL DATABASE #================================================= -ynh_script_progression --message="Restoring the MySQL database..." --weight=9 +ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=9 -ynh_mysql_connect_as --user=$db_name --password=$db_pwd --database=$db_name --default_character_set="utf8mb4" < ./db.sql +ynh_pgsql_connect_as --user=$db_user --password=$db_pwd --database=$db_name --default_character_set="utf8mb4" < ./db.sql #================================================= # RESTORE THE PHP-FPM CONFIGURATION diff --git a/scripts/upgrade b/scripts/upgrade index df854d09..9bc603ec 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -118,7 +118,7 @@ create_external_storage() { local data_dir="$1" local mount_name="$2" local mount_id=$(exec_occ files_external:create --output=json \ - "$mount_name" 'local' 'null::null' -c "data_dir=$data_dir" || true) + "$mount_name" 'local' 'null::null' -c "data_dir=$data_dir/data" || true) ! [[ $mount_id =~ ^[0-9]+$ ]] \ && ynh_print_warn --message="Unable to create external storage" \ || exec_occ files_external:option "$mount_id" enable_sharing true From 5a114fddf658dd979fb9bf1b7aa31c66ac52511f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 10:32:15 +0200 Subject: [PATCH 003/354] cleaning --- scripts/_ynh_mysql_connect_as.sh | 36 ------------------------------- scripts/install | 1 - scripts/upgrade | 37 +++++++++++++++++++++----------- 3 files changed, 24 insertions(+), 50 deletions(-) delete mode 100644 scripts/_ynh_mysql_connect_as.sh diff --git a/scripts/_ynh_mysql_connect_as.sh b/scripts/_ynh_mysql_connect_as.sh deleted file mode 100644 index a22963e8..00000000 --- a/scripts/_ynh_mysql_connect_as.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -# Open a connection as a user -# -# example: ynh_mysql_connect_as --user="user" --password="pass" <<< "UPDATE ...;" -# example: ynh_mysql_connect_as --user="user" --password="pass" --default_character_set="utf8mb4" < /path/to/file.sql -# -# usage: ynh_mysql_connect_as --user=user --password=password [--database=database] [--default_character_set=character-set] -# | arg: -u, --user= - the user name to connect as -# | arg: -p, --password= - the user password -# | arg: -d, --database= - the database to connect to -# | arg: -c, --default_character_set= - the charset to use -# -# Requires YunoHost version 2.2.4 or higher. -ynh_mysql_connect_as() { - # Declare an array to define the options of this helper. - local legacy_args=updc - local -A args_array=( [u]=user= [p]=password= [d]=database= [c]=default_character_set= ) - local user - local password - local database - local default_character_set - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - database="${database:-}" - default_character_set="${default_character_set:-}" - - if [ -n "$default_character_set" ] - then - default_character_set="--default-character-set=$default_character_set" - else - default_character_set="--default-character-set=latin1" - fi - - mysql --user="$user" --password="$password" "$default_character_set" --batch "$database" -} \ No newline at end of file diff --git a/scripts/install b/scripts/install index b453dd06..c9d9feba 100755 --- a/scripts/install +++ b/scripts/install @@ -8,7 +8,6 @@ source _common.sh source /usr/share/yunohost/helpers -source _ynh_mysql_connect_as.sh #================================================= # STORE SETTINGS FROM MANIFEST diff --git a/scripts/upgrade b/scripts/upgrade index 9bc603ec..306519c6 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -123,8 +123,28 @@ local mount_id=$(exec_occ files_external:create --output=json \ && ynh_print_warn --message="Unable to create external storage" \ || exec_occ files_external:option "$mount_id" enable_sharing true } -# Define app's data directory -#data_dir="/home/yunohost.app/$app/data" + +#================================================= +# HANDLE DATABASE MIGRATION +#================================================= + +mysql_db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +if [ -n "$mysql_db_pwd" ] +then + ynh_script_progression --message="Migrate Database..." + + ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" + + ynh_psql_test_if_first_run + ynh_psql_setup_db --db_user=$db_name --db_name=$db_name + + exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n + + ynh_mysql_remove_db --db_user=$db_name --db_name=$db_name + ynh_app_setting_delete --app=$app --key=mysqlpwd + + ynh_store_file_checksum --file="${install_dir}/config/config.php" +fi if [ "$upgrade_type" == "UPGRADE_APP" ] then @@ -142,15 +162,6 @@ then # Print the current version number of Nextcloud exec_occ -V - if [ "$(exec_occ config:system:get mysql.utf8mb4)" != "true" ]; then - db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) - # Change your databases character set and collation - ynh_mysql_connect_as --user=$db_user --password="$db_pwd" --database=$db_name \ - <<< "ALTER DATABASE $db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" - # Set the mysql.utf8mb4 config to true in config.php - exec_occ config:system:set mysql.utf8mb4 --type boolean --value="true" - exec_occ maintenance:repair - fi # Upgrade may fail if this app is enabled # Take all apps enabled, and check if mail is one of them @@ -188,7 +199,7 @@ then # Load the value for this version source upgrade.d/upgrade.$current_major_version.sh - ynh_print_info --message="Upgrade to nextcloud $next_version" + ynh_print_info --message="Upgrade to Nextcloud $next_version" # Create an app.src for this version of Nextcloud cat > ../conf/app.src << EOF @@ -242,7 +253,7 @@ EOF current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) current_major_version=${current_version%%.*} - # Print the current version number of nextcloud + # Print the current version number of Nextcloud exec_occ -V done From 0844be6a5255c52c49507aa70f67df757f4fdcb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 10:51:48 +0200 Subject: [PATCH 004/354] Update restore --- scripts/restore | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/restore b/scripts/restore index 915dd146..ad0c4438 100755 --- a/scripts/restore +++ b/scripts/restore @@ -8,7 +8,6 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -source ../settings/scripts/_ynh_mysql_connect_as.sh #================================================= # STANDARD RESTORATION STEPS From 9bf02287384c101901548bd55df704a18697b045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 11:24:28 +0200 Subject: [PATCH 005/354] Update _common.sh --- scripts/_common.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/scripts/_common.sh b/scripts/_common.sh index 19e6a36f..8e445c12 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -8,6 +8,19 @@ # EXPERIMENTAL HELPERS #================================================= +# Define a function to add an external storage +# Create the external storage for the given folders and enable sharing +create_external_storage() { +local datadir="$1" +local mount_name="$2" +local mount_id=`exec_occ files_external:create --output=json \ + "$mount_name" 'local' 'null::null' -c "datadir=$datadir/data" || true` +! [[ $mount_id =~ ^[0-9]+$ ]] \ + && ynh_print_warn --message="Unable to create external storage" \ + || exec_occ files_external:option "$mount_id" enable_sharing true +} + + # Check if an URL is already handled # usage: is_url_handled --domain=DOMAIN --path=PATH_URI is_url_handled() { From 6eb29b1d715cca36da5a8e9f3067551fb2746841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 11:26:47 +0200 Subject: [PATCH 006/354] Update _common.sh --- scripts/_common.sh | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 8e445c12..19e6a36f 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -8,19 +8,6 @@ # EXPERIMENTAL HELPERS #================================================= -# Define a function to add an external storage -# Create the external storage for the given folders and enable sharing -create_external_storage() { -local datadir="$1" -local mount_name="$2" -local mount_id=`exec_occ files_external:create --output=json \ - "$mount_name" 'local' 'null::null' -c "datadir=$datadir/data" || true` -! [[ $mount_id =~ ^[0-9]+$ ]] \ - && ynh_print_warn --message="Unable to create external storage" \ - || exec_occ files_external:option "$mount_id" enable_sharing true -} - - # Check if an URL is already handled # usage: is_url_handled --domain=DOMAIN --path=PATH_URI is_url_handled() { From 81e1eaeb970a2c435dca54a36352871ac417819a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 11:39:31 +0200 Subject: [PATCH 007/354] Fix --- scripts/_common.sh | 14 ++++++++++++++ scripts/install | 12 ------------ scripts/upgrade | 12 ------------ 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 19e6a36f..eb8de615 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -8,6 +8,20 @@ # EXPERIMENTAL HELPERS #================================================= +# Define a function to add an external storage +# Create the external storage for the given folders and enable sharing +create_external_storage() { +local datadir="$1" +local mount_name="$2" +local mount_id=$(exec_occ files_external:create --output=json \ + "$mount_name" 'local' 'null::null' -c "datadir=$datadir/data" || true) +! [[ $mount_id =~ ^[0-9]+$ ]] \ + && ynh_print_warn --message="Unable to create external storage" \ + || exec_occ files_external:option "$mount_id" enable_sharing true +} + +#================================================= + # Check if an URL is already handled # usage: is_url_handled --domain=DOMAIN --path=PATH_URI is_url_handled() { diff --git a/scripts/install b/scripts/install index c9d9feba..f0673b11 100755 --- a/scripts/install +++ b/scripts/install @@ -143,18 +143,6 @@ exec_occ ldap:test-config '' \ # MOUNT HOME FOLDERS AS EXTERNAL STORAGE #================================================= -# Define a function to add an external storage -# Create the external storage for the given folders and enable sharing -create_external_storage() { - local data_dir="$1" - local mount_name="$2" - local mount_id=`exec_occ files_external:create --output=json \ - "$mount_name" 'local' 'null::null' -c "data_dir=$data_dir/data" || true` - ! [[ $mount_id =~ ^[0-9]+$ ]] \ - && ynh_print_warn --message="Unable to create external storage" \ - || exec_occ files_external:option "$mount_id" enable_sharing true -} - # Enable External Storage and create local mount to home folder if [ $user_home -eq 1 ] then diff --git a/scripts/upgrade b/scripts/upgrade index 306519c6..6c236165 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -112,18 +112,6 @@ exec_occ() { php$NEXTCLOUD_PHP_VERSION --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") } -# Define a function to add an external storage -# Create the external storage for the given folders and enable sharing -create_external_storage() { -local data_dir="$1" -local mount_name="$2" -local mount_id=$(exec_occ files_external:create --output=json \ - "$mount_name" 'local' 'null::null' -c "data_dir=$data_dir/data" || true) -! [[ $mount_id =~ ^[0-9]+$ ]] \ - && ynh_print_warn --message="Unable to create external storage" \ - || exec_occ files_external:option "$mount_id" enable_sharing true -} - #================================================= # HANDLE DATABASE MIGRATION #================================================= From 09480477f594ab70fef0c31ff6cbcfb6b218e43d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 12:19:24 +0200 Subject: [PATCH 008/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 32b295bb..8e341ab6 100644 --- a/manifest.toml +++ b/manifest.toml @@ -25,7 +25,7 @@ multi_instance = true ldap = true sso = true disk = "50M" -ram.build = "300M" +ram.build = "500M" ram.runtime = "512M" [install] From e942be496119152cea7aa5cf16da871af3f15403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 12:20:09 +0200 Subject: [PATCH 009/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 8e341ab6..9e987cdc 100644 --- a/manifest.toml +++ b/manifest.toml @@ -69,7 +69,7 @@ ram.runtime = "512M" api.allowed = ["visitors", "all_users"] [resources.apt] - packages = "postgresql, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, php8.2-pgsql, php8.2-fpm, php8.2-bz2, php8.2-imap, php8.2-gmp, php8.2-gd, php8.2-intl, php8.2-curl, php8.2-apcu, php8.2-redis, php8.2-ldap, php8.2-imagick, php8.2-zip, php8.2-mbstring, php8.2-xml, php8.2-mysql, php8.2-igbinary, php8.2-bcmath" + packages = "postgresql, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, php8.2-pgsql, php8.2-fpm, php8.2-bz2, php8.2-imap, php8.2-gmp, php8.2-gd, php8.2-intl, php8.2-curl, php8.2-apcu, php8.2-redis, php8.2-ldap, php8.2-imagick, php8.2-zip, php8.2-mbstring, php8.2-xml, php8.2-igbinary, php8.2-bcmath" [resources.database] type = "postgresql" From ee2b79ac13eb0b77e50262c3f5f617567ec1757e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 12:28:12 +0200 Subject: [PATCH 010/354] Move exec_occ to common.sh --- scripts/_common.sh | 12 +++++++++--- scripts/install | 6 ------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index eb8de615..6366b74b 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1,11 +1,15 @@ #!/bin/bash #================================================= -# COMMON VARIABLES +# COMMON FUCTIONS #================================================= -#================================================= -# EXPERIMENTAL HELPERS +# Define a function to execute commands with `occ` +exec_occ() { + (cd "$install_dir" && ynh_exec_as "$app" \ + php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") +} + #================================================= # Define a function to add an external storage @@ -20,6 +24,8 @@ local mount_id=$(exec_occ files_external:create --output=json \ || exec_occ files_external:option "$mount_id" enable_sharing true } +#================================================= +# EXPERIMENTAL HELPERS #================================================= # Check if an URL is already handled diff --git a/scripts/install b/scripts/install index f0673b11..82d83455 100755 --- a/scripts/install +++ b/scripts/install @@ -79,12 +79,6 @@ ynh_add_nginx_config #================================================= ynh_script_progression --message="Installing $app..." --weight=30 -# Define a function to execute commands with `occ` -exec_occ() { - (cd "$install_dir" && ynh_exec_as "$app" \ - php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -} - # Set write access for the following commands chown -R $app: "$install_dir" "$data_dir" From b6091c4f70ebe06a9d26fd6104431ab8e74f02ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 12:35:31 +0200 Subject: [PATCH 011/354] cleaning --- scripts/_common.sh | 8 -------- scripts/install | 6 ++++++ scripts/upgrade | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 6366b74b..5591139d 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,14 +4,6 @@ # COMMON FUCTIONS #================================================= -# Define a function to execute commands with `occ` -exec_occ() { - (cd "$install_dir" && ynh_exec_as "$app" \ - php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -} - -#================================================= - # Define a function to add an external storage # Create the external storage for the given folders and enable sharing create_external_storage() { diff --git a/scripts/install b/scripts/install index 82d83455..f0673b11 100755 --- a/scripts/install +++ b/scripts/install @@ -79,6 +79,12 @@ ynh_add_nginx_config #================================================= ynh_script_progression --message="Installing $app..." --weight=30 +# Define a function to execute commands with `occ` +exec_occ() { + (cd "$install_dir" && ynh_exec_as "$app" \ + php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") +} + # Set write access for the following commands chown -R $app: "$install_dir" "$data_dir" diff --git a/scripts/upgrade b/scripts/upgrade index 6c236165..49e5a735 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -112,6 +112,25 @@ exec_occ() { php$NEXTCLOUD_PHP_VERSION --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") } +# Define a function to execute commands with `occ` +exec_occ() { + # Backward compatibility to upgrade from older versions + if [ $current_major_version = "last" ] + then + NEXTCLOUD_PHP_VERSION=$phpversion + elif [ $current_major_version -ge 24 ] + then + NEXTCLOUD_PHP_VERSION="8.0" + elif [ $current_major_version -ge 15 ] + then + NEXTCLOUD_PHP_VERSION="7.4" + else + NEXTCLOUD_PHP_VERSION="7.0" + fi +(cd "$install_dir" && ynh_exec_as "$app" \ + php$NEXTCLOUD_PHP_VERSION --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") +} + #================================================= # HANDLE DATABASE MIGRATION #================================================= From 028d6ebbbee736b477838b7428b510b0bddab5e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 13:13:58 +0200 Subject: [PATCH 012/354] Update restore --- scripts/restore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/restore b/scripts/restore index ad0c4438..72ea7ee8 100755 --- a/scripts/restore +++ b/scripts/restore @@ -23,7 +23,7 @@ ynh_restore_file --origin_path="$install_dir" #================================================= ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=9 -ynh_pgsql_connect_as --user=$db_user --password=$db_pwd --database=$db_name --default_character_set="utf8mb4" < ./db.sql +ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name --default_character_set="utf8mb4" < ./db.sql #================================================= # RESTORE THE PHP-FPM CONFIGURATION From e0b04bb379d2bedf444e540963ae2e40aea79183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 13:21:13 +0200 Subject: [PATCH 013/354] Update upgrade --- scripts/upgrade | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 49e5a735..1037b258 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -96,22 +96,6 @@ ynh_add_nginx_config current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) current_major_version=${current_version%%.*} -# Define a function to execute commands with `occ` -exec_occ() { - # Backward compatibility to upgrade from older versions - if [ $current_major_version = "last" ] || [ $current_major_version -ge 24 ] - then - NEXTCLOUD_PHP_VERSION=$phpversion - elif [ $current_major_version -ge 15 ] - then - NEXTCLOUD_PHP_VERSION="7.4" - else - NEXTCLOUD_PHP_VERSION="7.0" - fi -(cd "$install_dir" && ynh_exec_as "$app" \ - php$NEXTCLOUD_PHP_VERSION --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -} - # Define a function to execute commands with `occ` exec_occ() { # Backward compatibility to upgrade from older versions From a7118fac002ff46c8df7031e23c2db8a3e082338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 13:50:39 +0200 Subject: [PATCH 014/354] Update upgrade --- scripts/upgrade | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 1037b258..6c236165 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -99,12 +99,9 @@ current_major_version=${current_version%%.*} # Define a function to execute commands with `occ` exec_occ() { # Backward compatibility to upgrade from older versions - if [ $current_major_version = "last" ] + if [ $current_major_version = "last" ] || [ $current_major_version -ge 24 ] then NEXTCLOUD_PHP_VERSION=$phpversion - elif [ $current_major_version -ge 24 ] - then - NEXTCLOUD_PHP_VERSION="8.0" elif [ $current_major_version -ge 15 ] then NEXTCLOUD_PHP_VERSION="7.4" From 4719e0f3951b80f3b7262da2a3a403a017120847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 14:29:01 +0200 Subject: [PATCH 015/354] #584 --- scripts/install | 8 ++++---- scripts/restore | 8 ++++---- scripts/upgrade | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/scripts/install b/scripts/install index f0673b11..8e93f067 100755 --- a/scripts/install +++ b/scripts/install @@ -236,10 +236,10 @@ ynh_multimedia_addaccess $app # Fix app ownerships & permissions chown -R $app:www-data "$install_dir" chown -R $app: "$data_dir" -find $install_dir/ -type f -print0 | xargs -0 chmod 0644 -find $install_dir/ -type d -print0 | xargs -0 chmod 0755 -find $data_dir/data/ -type f -print0 | xargs -0 chmod 0640 -find $data_dir/data/ -type d -print0 | xargs -0 chmod 0750 +find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 +find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 +find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 +find $data_dir/data/ -type d -print0 | xargs -r0 chmod 0750 chmod 640 "$install_dir/config/config.php" chmod 755 /home/yunohost.app chmod 750 $install_dir diff --git a/scripts/restore b/scripts/restore index 72ea7ee8..f2d522a2 100755 --- a/scripts/restore +++ b/scripts/restore @@ -80,10 +80,10 @@ ynh_restore_file --origin_path="$data_dir" --not_mandatory # Fix app ownerships & permissions chown -R $app:www-data "$install_dir" chown -R $app: "$data_dir" -find $install_dir/ -type f -print0 | xargs -0 chmod 0644 -find $install_dir/ -type d -print0 | xargs -0 chmod 0755 -find $data_dir/data/ -type f -print0 | xargs -0 chmod 0640 -find $data_dir/data/ -type d -print0 | xargs -0 chmod 0750 +find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 +find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 +find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 +find $data_dir/data/ -type d -print0 | xargs -r0 chmod 0750 chmod 640 "$install_dir/config/config.php" chmod 755 /home/yunohost.app chmod 750 $install_dir diff --git a/scripts/upgrade b/scripts/upgrade index 6c236165..e9454146 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -342,10 +342,10 @@ exec_occ background:cron # Fix app ownerships & permissions chown -R $app:www-data "$install_dir" chown -R $app: "$data_dir" -find $install_dir/ -type f -print0 | xargs -0 chmod 0644 -find $install_dir/ -type d -print0 | xargs -0 chmod 0755 -find $data_dir/data/ -type f -print0 | xargs -0 chmod 0640 -find $data_dir/data/ -type d -print0 | xargs -0 chmod 0750 +find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 +find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 +find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 +find $data_dir/data/ -type d -print0 | xargs -r0 chmod 0750 chmod 640 "$install_dir/config/config.php" chmod 755 /home/yunohost.app chmod 750 $install_dir From 2ff88b00418c91914cd30fff00f3d4a32b3d9c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 11 Jun 2023 14:47:58 +0200 Subject: [PATCH 016/354] Update change_url --- scripts/change_url | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index 156db53f..0d8a1424 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -41,7 +41,7 @@ then # Check if .well-known is available for this domain if is_url_handled --domain="$new_domain" --path="/.well-known/caldav" || is_url_handled --domain="$new_domain" --path="/.well-known/carddav" then - ynh_print_warn --message="Another app already uses the domain $new_domain to serve a caldav/carddav feature. You may encounter issues when dealing with your calendar or address book." + ynh_print_warn --message="Another app already uses the domain $new_domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." # Remove lines about .well-known/carddav and caldav with sed. sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "/etc/nginx/conf.d/$new_domain.d/$app.conf" From 9902ad326e853537d350a877e02399c52a5c41bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:13:31 +0200 Subject: [PATCH 017/354] Update restore --- scripts/restore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/restore b/scripts/restore index f2d522a2..eb6a9859 100755 --- a/scripts/restore +++ b/scripts/restore @@ -23,7 +23,7 @@ ynh_restore_file --origin_path="$install_dir" #================================================= ynh_script_progression --message="Restoring the PostgreSQL database..." --weight=9 -ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name --default_character_set="utf8mb4" < ./db.sql +ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql #================================================= # RESTORE THE PHP-FPM CONFIGURATION From 59f4d751efc1fb4ff6cefd1ce2811dc3280c5436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:28:58 +0200 Subject: [PATCH 018/354] cleaning --- scripts/restore | 2 +- scripts/upgrade | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/restore b/scripts/restore index eb6a9859..27f68448 100755 --- a/scripts/restore +++ b/scripts/restore @@ -28,7 +28,7 @@ ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./d #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=50 +ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=5 # Restore the file first, so it can have a backup if different ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" diff --git a/scripts/upgrade b/scripts/upgrade index e9454146..3d433497 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -119,16 +119,16 @@ exec_occ() { mysql_db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) if [ -n "$mysql_db_pwd" ] then - ynh_script_progression --message="Migrate Database..." + ynh_script_progression --message="Migrating to PostgreSQL database..." ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" ynh_psql_test_if_first_run - ynh_psql_setup_db --db_user=$db_name --db_name=$db_name + ynh_psql_setup_db --db_user=$db_user --db_name=$db_name exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n - ynh_mysql_remove_db --db_user=$db_name --db_name=$db_name + ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name ynh_app_setting_delete --app=$app --key=mysqlpwd ynh_store_file_checksum --file="${install_dir}/config/config.php" From 931a3bc507609f24113d7d955dba655ea91aae78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:32:55 +0200 Subject: [PATCH 019/354] Update _common.sh --- scripts/_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 5591139d..2a7085a5 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -10,7 +10,7 @@ create_external_storage() { local datadir="$1" local mount_name="$2" local mount_id=$(exec_occ files_external:create --output=json \ - "$mount_name" 'local' 'null::null' -c "datadir=$datadir/data" || true) + "$mount_name" 'local' 'null::null' -c "datadir=$data_dir/data" || true) ! [[ $mount_id =~ ^[0-9]+$ ]] \ && ynh_print_warn --message="Unable to create external storage" \ || exec_occ files_external:option "$mount_id" enable_sharing true From 0addb2ad955ef70363e47e1f36aab88196b1e297 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 12 Jun 2023 09:36:07 +0000 Subject: [PATCH 020/354] Auto-update README --- README.md | 2 +- README_fr.md | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 05a118ec..43281fc9 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ this package: * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 26.0.2~ynh3 +**Shipped version:** 26.0.2~ynh1 **Demo:** https://demo.nextcloud.com/ diff --git a/README_fr.md b/README_fr.md index b2310919..173f9a50 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,8 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 26.0.2~ynh3 - +**Version incluse :** 26.0.2~ynh1 **Démo :** https://demo.nextcloud.com/ From 77fd54fc4b7ab00f8353143dff91a4401ebf396a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:39:33 +0200 Subject: [PATCH 021/354] Update upgrade --- scripts/upgrade | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index 3d433497..c586dc3f 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -112,6 +112,10 @@ exec_occ() { php$NEXTCLOUD_PHP_VERSION --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") } +# Define a function to add an external storage +# Create the external storage for the given folders and enable sharing +create_external_storage + #================================================= # HANDLE DATABASE MIGRATION #================================================= From 03f52ae739c355cd009dd47598a8da6463db74dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:40:30 +0200 Subject: [PATCH 022/354] Update install --- scripts/install | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/install b/scripts/install index 8e93f067..d3e9eec6 100755 --- a/scripts/install +++ b/scripts/install @@ -143,6 +143,10 @@ exec_occ ldap:test-config '' \ # MOUNT HOME FOLDERS AS EXTERNAL STORAGE #================================================= +# Define a function to add an external storage +# Create the external storage for the given folders and enable sharing +create_external_storage + # Enable External Storage and create local mount to home folder if [ $user_home -eq 1 ] then From 33d901ce3a740847dfeb5cb0d429b3cd358bb918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:52:03 +0200 Subject: [PATCH 023/354] fix --- scripts/install | 4 ---- scripts/upgrade | 4 ---- 2 files changed, 8 deletions(-) diff --git a/scripts/install b/scripts/install index d3e9eec6..8e93f067 100755 --- a/scripts/install +++ b/scripts/install @@ -143,10 +143,6 @@ exec_occ ldap:test-config '' \ # MOUNT HOME FOLDERS AS EXTERNAL STORAGE #================================================= -# Define a function to add an external storage -# Create the external storage for the given folders and enable sharing -create_external_storage - # Enable External Storage and create local mount to home folder if [ $user_home -eq 1 ] then diff --git a/scripts/upgrade b/scripts/upgrade index c586dc3f..3d433497 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -112,10 +112,6 @@ exec_occ() { php$NEXTCLOUD_PHP_VERSION --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") } -# Define a function to add an external storage -# Create the external storage for the given folders and enable sharing -create_external_storage - #================================================= # HANDLE DATABASE MIGRATION #================================================= From c0c13e9d3c17a3fb0b9c67a0d4657289b4b1e939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 13 Jun 2023 13:34:47 +0200 Subject: [PATCH 024/354] 27.0.0 --- manifest.toml | 2 +- scripts/upgrade.d/upgrade.26.sh | 7 +++++++ scripts/upgrade.d/upgrade.last.sh | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 scripts/upgrade.d/upgrade.26.sh diff --git a/manifest.toml b/manifest.toml index 9e987cdc..cea0aca1 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "26.0.2~ynh1" +version = "27.0.0~ynh1" maintainers = ["kay0u"] diff --git a/scripts/upgrade.d/upgrade.26.sh b/scripts/upgrade.d/upgrade.26.sh new file mode 100644 index 00000000..59b4622b --- /dev/null +++ b/scripts/upgrade.d/upgrade.26.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# Last available Nextcloud version +next_version="27.0.0" + +# Nextcloud tarball checksum sha256 +nextcloud_source_sha256="3d312a09b9345ac058758dd7b4059bf3cf0b1f0f1d747251b6fac3585ba6533f" diff --git a/scripts/upgrade.d/upgrade.last.sh b/scripts/upgrade.d/upgrade.last.sh index ba24f4f0..59b4622b 100644 --- a/scripts/upgrade.d/upgrade.last.sh +++ b/scripts/upgrade.d/upgrade.last.sh @@ -1,7 +1,7 @@ #!/bin/bash # Last available Nextcloud version -next_version="26.0.2" +next_version="27.0.0" # Nextcloud tarball checksum sha256 -nextcloud_source_sha256="f3db0ec5e0aaff7c088eb34f752d77d79913bc6784e0fc47a84cdaa28e567a33" +nextcloud_source_sha256="3d312a09b9345ac058758dd7b4059bf3cf0b1f0f1d747251b6fac3585ba6533f" From be67693c22cb91657f9e46bb98f2f1295a24fcd6 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 13 Jun 2023 11:34:52 +0000 Subject: [PATCH 025/354] 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 43281fc9..719d640c 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ this package: * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 26.0.2~ynh1 +**Shipped version:** 27.0.0~ynh1 **Demo:** https://demo.nextcloud.com/ diff --git a/README_fr.md b/README_fr.md index 173f9a50..c4437523 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 26.0.2~ynh1 +**Version incluse :** 27.0.0~ynh1 **Démo :** https://demo.nextcloud.com/ From c70f9102d9b67f4e9cabb59e8794aa1b9e3ba1ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 13 Jun 2023 16:40:59 +0200 Subject: [PATCH 026/354] cleaning --- doc/ADMIN.md | 6 +++++- doc/ADMIN_fr.md | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/doc/ADMIN.md b/doc/ADMIN.md index 2feddbb2..e682db71 100644 --- a/doc/ADMIN.md +++ b/doc/ADMIN.md @@ -1,3 +1,7 @@ +### Comment utiliser la commande CLI + +`sudo -u __APP__ php__YNH_PHP_VERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ...` + ### Configure ONLYOFFICE integration #### With Nextcloud App (no ARM support, lower performance) @@ -6,7 +10,7 @@ Starting from Nextcloud 18, it features a direct integration of ONLYOFFICE (an o To install and configure it: - Install *Community Document Server* application in your Nextcloud. That's the part that runs ONLYOFFICE server. - Install *ONLYOFFICE* application. That's the client part that will connect to an ONLYOFFICE server. -- Then in Settings -> ONLYOFFICE (`https://__DOMAIN__/__PATH__/settings/admin/onlyoffice`), if you want to configure which file formats should be opened by ONLYOFFICE. +- Then in Settings -> ONLYOFFICE (`https://__DOMAIN____PATH__/settings/admin/onlyoffice`), if you want to configure which file formats should be opened by ONLYOFFICE. - Here you go :) You should be able to create new type of documents and open them. *NB: ONLYOFFICE Nextcloud App is only available for x86 architecture - for **ARM** architecture (Raspberry Pi, OLinuXino...), consider the YunoHost App below* diff --git a/doc/ADMIN_fr.md b/doc/ADMIN_fr.md index 4977f09c..f0b4de14 100644 --- a/doc/ADMIN_fr.md +++ b/doc/ADMIN_fr.md @@ -1,3 +1,7 @@ +### How to use CLI commande + +`sudo -u __APP__ php__YNH_PHP_VERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ...` + ### Configurer l'intégration d'ONLYOFFICE #### Avec l'application Nextcloud (pas de support ARM, performances limitées) @@ -6,7 +10,7 @@ Pour l'installer et la configurer : - Installez l'application *Community Document Server* dans votre Nextcloud. C'est la partie qui fait tourner un serveur ONLYOFFICE. - Installez l'application *ONLYOFFICE*. C'est la partie cliente qui va se connecter au serveur ONLYOFFICE. -- Ensuite dans les Paramètres -> ONLYOFFICE (`https://__DOMAIN__/__PATH__/settings/admin/onlyoffice`), si vous voulez configurer quels formats de fichier s'ouvrent avec ONLYOFFICE. +- Ensuite dans les Paramètres -> ONLYOFFICE (`https://__DOMAIN____PATH__/settings/admin/onlyoffice`), si vous voulez configurer quels formats de fichier s'ouvrent avec ONLYOFFICE. - Et voilà :) Vous devriez pouvoir créer de nouveaux types de documents, et les ouvrir. *NB : l'app Nextcloud ONLYOFFICE Community Document Server n'est disponible que sous architecture x86 - Pour un support de l'architecture **ARM** (Raspberry Pi, OLinuXino...), installez plutôt l'App YunoHost, voir ci-dessous* From 351fa40615a6088c38e2f38ff33e0bd2eb321fea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 20 Jul 2023 17:18:47 +0200 Subject: [PATCH 027/354] 27.0.1 --- manifest.toml | 4 ++-- scripts/upgrade.d/upgrade.last.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/manifest.toml b/manifest.toml index cea0aca1..49d4e899 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "27.0.0~ynh1" +version = "27.0.1~ynh1" maintainers = ["kay0u"] @@ -19,7 +19,7 @@ code = "https://github.com/nextcloud/server" cpe = "cpe:2.3:a:nextcloud:nextcloud" [integration] -yunohost = ">= 11.1.20" +yunohost = ">= 11.1.21" architectures = ["amd64", "arm64"] multi_instance = true ldap = true diff --git a/scripts/upgrade.d/upgrade.last.sh b/scripts/upgrade.d/upgrade.last.sh index 59b4622b..32b7722d 100644 --- a/scripts/upgrade.d/upgrade.last.sh +++ b/scripts/upgrade.d/upgrade.last.sh @@ -1,7 +1,7 @@ #!/bin/bash # Last available Nextcloud version -next_version="27.0.0" +next_version="27.0.1" # Nextcloud tarball checksum sha256 -nextcloud_source_sha256="3d312a09b9345ac058758dd7b4059bf3cf0b1f0f1d747251b6fac3585ba6533f" +nextcloud_source_sha256="3976b5e8f58f934ddbeb7cc49ac33b11ad3adbd7f6d5d0908a0fc36a160c27bd" From 73183c464e91fd74d2f4aca546ea4feedfe77e3e Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 20 Jul 2023 15:18:52 +0000 Subject: [PATCH 028/354] 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 719d640c..de84a491 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ this package: * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 27.0.0~ynh1 +**Shipped version:** 27.0.1~ynh1 **Demo:** https://demo.nextcloud.com/ diff --git a/README_fr.md b/README_fr.md index c4437523..539a463b 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 27.0.0~ynh1 +**Version incluse :** 27.0.1~ynh1 **Démo :** https://demo.nextcloud.com/ From 0c5216a66119897a7c94e1bcb18b001613c33fc8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 30 Jul 2023 08:35:44 +0100 Subject: [PATCH 029/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 49d4e899..e80c1813 100644 --- a/manifest.toml +++ b/manifest.toml @@ -19,7 +19,7 @@ code = "https://github.com/nextcloud/server" cpe = "cpe:2.3:a:nextcloud:nextcloud" [integration] -yunohost = ">= 11.1.21" +yunohost = ">= 11.2" architectures = ["amd64", "arm64"] multi_instance = true ldap = true From 43096591c94cd9b6114c9bc63ff4d39ec9f06c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 11 Aug 2023 11:41:42 +0200 Subject: [PATCH 030/354] 27.0.2 --- manifest.toml | 2 +- scripts/upgrade.d/upgrade.last.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index e80c1813..0f4fba0a 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "27.0.1~ynh1" +version = "27.0.2~ynh1" maintainers = ["kay0u"] diff --git a/scripts/upgrade.d/upgrade.last.sh b/scripts/upgrade.d/upgrade.last.sh index 32b7722d..99a48292 100644 --- a/scripts/upgrade.d/upgrade.last.sh +++ b/scripts/upgrade.d/upgrade.last.sh @@ -1,7 +1,7 @@ #!/bin/bash # Last available Nextcloud version -next_version="27.0.1" +next_version="27.0.2" # Nextcloud tarball checksum sha256 -nextcloud_source_sha256="3976b5e8f58f934ddbeb7cc49ac33b11ad3adbd7f6d5d0908a0fc36a160c27bd" +nextcloud_source_sha256="7a2dcea43aa3b8fb303347efda4c6f37733cca113c8ee16dd9f0e5fb68c7212f" From 6c50ba9fd2b6ed4283a348cdf627daafb95e4333 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 11 Aug 2023 09:41:47 +0000 Subject: [PATCH 031/354] 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 de84a491..465375d0 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ this package: * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 27.0.1~ynh1 +**Shipped version:** 27.0.2~ynh1 **Demo:** https://demo.nextcloud.com/ diff --git a/README_fr.md b/README_fr.md index 539a463b..f3c768b6 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 27.0.1~ynh1 +**Version incluse :** 27.0.2~ynh1 **Démo :** https://demo.nextcloud.com/ From fc90a3b280446103801c4e536d78f862cb91cd42 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 24 Aug 2023 23:26:09 +0200 Subject: [PATCH 032/354] Update nginx.conf --- conf/nginx.conf | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/conf/nginx.conf b/conf/nginx.conf index 395a5c52..1a5fc18b 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -105,6 +105,14 @@ location ^~ __PATH__/ { fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; fastcgi_intercept_errors on; fastcgi_request_buffering off; + + fastcgi_read_timeout 600; + fastcgi_send_timeout 600; + fastcgi_connect_timeout 600; + proxy_connect_timeout 600; + proxy_send_timeout 600; + proxy_read_timeout 600; + send_timeout 600; } location ~ ^__PATH__/(?:updater|oc[ms]-provider)(?:$|/) { From 920d2d74c1ca788bc9c89c633530ffe81f3ad9b9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 9 Sep 2023 07:48:41 +0200 Subject: [PATCH 033/354] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 8e93f067..f96ff2dc 100755 --- a/scripts/install +++ b/scripts/install @@ -52,7 +52,7 @@ ynh_setup_source --dest_dir="$install_dir" #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Configuring PHP-FPM..." --weight=50 +ynh_script_progression --message="Configuring PHP-FPM..." --weight=5 # Create a dedicated PHP-FPM config ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint From 4762aa856c7fa99adb0c3003448c095749b70f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 15 Sep 2023 21:31:36 +0200 Subject: [PATCH 034/354] 27.1.0 --- manifest.toml | 4 ++-- scripts/upgrade.d/upgrade.last.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/manifest.toml b/manifest.toml index 0f4fba0a..b0c05cda 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "27.0.2~ynh1" +version = "27.1.0~ynh1" maintainers = ["kay0u"] @@ -20,7 +20,7 @@ cpe = "cpe:2.3:a:nextcloud:nextcloud" [integration] yunohost = ">= 11.2" -architectures = ["amd64", "arm64"] +architectures = ["amd64", "arm64", "armhf"] multi_instance = true ldap = true sso = true diff --git a/scripts/upgrade.d/upgrade.last.sh b/scripts/upgrade.d/upgrade.last.sh index 99a48292..f79ae9f3 100644 --- a/scripts/upgrade.d/upgrade.last.sh +++ b/scripts/upgrade.d/upgrade.last.sh @@ -1,7 +1,7 @@ #!/bin/bash # Last available Nextcloud version -next_version="27.0.2" +next_version="27.1.0" # Nextcloud tarball checksum sha256 -nextcloud_source_sha256="7a2dcea43aa3b8fb303347efda4c6f37733cca113c8ee16dd9f0e5fb68c7212f" +nextcloud_source_sha256="da665584507020a071d41c6fef5f3996254854e13700059d6e9ca18c3f29211e" From f6a8076246f786c7dbeb1f2f711d34e048d100b9 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 15 Sep 2023 19:31:42 +0000 Subject: [PATCH 035/354] 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 465375d0..25d99984 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ this package: * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 27.0.2~ynh1 +**Shipped version:** 27.1.0~ynh1 **Demo:** https://demo.nextcloud.com/ diff --git a/README_fr.md b/README_fr.md index f3c768b6..4929825b 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 27.0.2~ynh1 +**Version incluse :** 27.1.0~ynh1 **Démo :** https://demo.nextcloud.com/ From df883068ad8012511ca5e4753b9a8ed5f766ccfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 15 Sep 2023 22:04:52 +0200 Subject: [PATCH 036/354] Update upgrade.last.sh --- scripts/upgrade.d/upgrade.last.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade.d/upgrade.last.sh b/scripts/upgrade.d/upgrade.last.sh index f79ae9f3..1040e226 100644 --- a/scripts/upgrade.d/upgrade.last.sh +++ b/scripts/upgrade.d/upgrade.last.sh @@ -4,4 +4,4 @@ next_version="27.1.0" # Nextcloud tarball checksum sha256 -nextcloud_source_sha256="da665584507020a071d41c6fef5f3996254854e13700059d6e9ca18c3f29211e" +nextcloud_source_sha256="c3167059e69c517b7ae07f3bb0b832433d324675859081fe953ea41bc7df1242" From 3812b23fd8627ac446a15726c21aa2c522604407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 21 Sep 2023 10:53:32 +0200 Subject: [PATCH 037/354] Update tests.toml --- tests.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests.toml b/tests.toml index 44dd5980..7f7a558c 100644 --- a/tests.toml +++ b/tests.toml @@ -7,6 +7,8 @@ test_format = 1.0 # ------------------------------- test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" + test_upgrade_from.d02166a5.name = "Upgrade from 26.0.1" + test_upgrade_from.0f16f720.name = "Upgrade from 27.0.2" From a87205bb211b066d34e31f3136774521807faa04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 21 Sep 2023 13:21:29 +0200 Subject: [PATCH 038/354] 27.1.1 --- manifest.toml | 2 +- scripts/upgrade.d/upgrade.last.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index b0c05cda..f9fe3a9f 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "27.1.0~ynh1" +version = "27.1.1~ynh1" maintainers = ["kay0u"] diff --git a/scripts/upgrade.d/upgrade.last.sh b/scripts/upgrade.d/upgrade.last.sh index 1040e226..9e6becf0 100644 --- a/scripts/upgrade.d/upgrade.last.sh +++ b/scripts/upgrade.d/upgrade.last.sh @@ -1,7 +1,7 @@ #!/bin/bash # Last available Nextcloud version -next_version="27.1.0" +next_version="27.1.1" # Nextcloud tarball checksum sha256 -nextcloud_source_sha256="c3167059e69c517b7ae07f3bb0b832433d324675859081fe953ea41bc7df1242" +nextcloud_source_sha256="3a91500566874675676fa3b5bfae2587a839cde41dfac5318043b162c1311fab" From afc3084ae465ad8cac304ac4dfbceab0cbb5a11d Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 21 Sep 2023 11:21:33 +0000 Subject: [PATCH 039/354] 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 25d99984..655d87d1 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ this package: * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 27.1.0~ynh1 +**Shipped version:** 27.1.1~ynh1 **Demo:** https://demo.nextcloud.com/ diff --git a/README_fr.md b/README_fr.md index 4929825b..1ffd833f 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 27.1.0~ynh1 +**Version incluse :** 27.1.1~ynh1 **Démo :** https://demo.nextcloud.com/ From e7bfe5f7fce0becc63fdb1590d14b6d587712330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 6 Oct 2023 08:20:19 +0200 Subject: [PATCH 040/354] 27.1.2 --- manifest.toml | 2 +- scripts/upgrade.d/upgrade.last.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index f9fe3a9f..cf786ea1 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "27.1.1~ynh1" +version = "27.1.2~ynh1" maintainers = ["kay0u"] diff --git a/scripts/upgrade.d/upgrade.last.sh b/scripts/upgrade.d/upgrade.last.sh index 9e6becf0..09a19f6d 100644 --- a/scripts/upgrade.d/upgrade.last.sh +++ b/scripts/upgrade.d/upgrade.last.sh @@ -1,7 +1,7 @@ #!/bin/bash # Last available Nextcloud version -next_version="27.1.1" +next_version="27.1.2" # Nextcloud tarball checksum sha256 -nextcloud_source_sha256="3a91500566874675676fa3b5bfae2587a839cde41dfac5318043b162c1311fab" +nextcloud_source_sha256="0742b247aaee0b7044db0062f0a914aa77338c7a7d8fe7da0917147d76689721" From 0937844bde6768b98726c2727655f2c666795ea7 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 6 Oct 2023 06:20:24 +0000 Subject: [PATCH 041/354] Auto-update README --- README.md | 3 +-- README_fr.md | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 655d87d1..36f664c0 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ this package: * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 27.1.1~ynh1 +**Shipped version:** 27.1.2~ynh1 **Demo:** https://demo.nextcloud.com/ @@ -44,7 +44,6 @@ this package: * Official user documentation: * 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 1ffd833f..c198a085 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 27.1.1~ynh1 +**Version incluse :** 27.1.2~ynh1 **Démo :** https://demo.nextcloud.com/ @@ -43,7 +43,6 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Documentation officielle utilisateur : * 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 fd22e2271552ba9c66da3ce6e75b920866d9737d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 8 Oct 2023 21:10:15 +0200 Subject: [PATCH 042/354] Update nginx.conf --- conf/nginx.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 99168f0a..1803b994 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -92,7 +92,7 @@ location ^~ __PATH__/ { # Required for legacy support # https://github.com/nextcloud/documentation/pull/2197#issuecomment-721432337 # This line fix the ldap admin page - rewrite ^__PATH__/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) __PATH__/index.php$request_uri; + rewrite ^__PATH__/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocm-provider\/.+|.+\/richdocumentscode\/proxy) __PATH__/index.php$request_uri; fastcgi_split_path_info ^(.+?\.php)(/.*)$; set $path_info $fastcgi_path_info; @@ -120,7 +120,7 @@ location ^~ __PATH__/ { send_timeout 600; } - location ~ ^__PATH__/(?:updater|oc[ms]-provider)(?:$|/) { + location ~ ^__PATH__/(?:updater|ocm-provider)(?:$|/) { try_files $uri/ =404; index index.php; } From a7aaf2d82e5601781415691ddf41751d911ffab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 8 Oct 2023 21:16:40 +0200 Subject: [PATCH 043/354] Update nginx.conf --- conf/nginx.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 1803b994..f2a5a477 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -92,7 +92,7 @@ location ^~ __PATH__/ { # Required for legacy support # https://github.com/nextcloud/documentation/pull/2197#issuecomment-721432337 # This line fix the ldap admin page - rewrite ^__PATH__/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocm-provider\/.+|.+\/richdocumentscode\/proxy) __PATH__/index.php$request_uri; + rewrite ^__PATH__/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode\/proxy) __PATH__/index.php$request_uri; fastcgi_split_path_info ^(.+?\.php)(/.*)$; set $path_info $fastcgi_path_info; @@ -120,7 +120,7 @@ location ^~ __PATH__/ { send_timeout 600; } - location ~ ^__PATH__/(?:updater|ocm-provider)(?:$|/) { + location ~ ^__PATH__/(?:updater|ocs-provider)(?:$|/) { try_files $uri/ =404; index index.php; } From f3d4b149c995c37340fe27ab9e9ba4c077359ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 8 Oct 2023 21:22:15 +0200 Subject: [PATCH 044/354] Update nginx.conf --- conf/nginx.conf | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index f2a5a477..b3d35258 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -21,18 +21,9 @@ location ^~ __PATH__/ { # Path to source alias __INSTALL_DIR__/; - # Add headers to serve security related headers - more_set_headers "Strict-Transport-Security: max-age=15768000; includeSubDomains; preload;"; - more_set_headers "Referrer-Policy: no-referrer"; - more_set_headers "X-Content-Type-Options: nosniff"; - more_set_headers "X-Download-Options: noopen"; - more_set_headers "X-Frame-Options: SAMEORIGIN"; - more_set_headers "X-Permitted-Cross-Domain-Policies: none"; - more_set_headers "X-Robots-Tag: noindex, nofollow"; - more_set_headers "X-XSS-Protection: 1; mode=block"; - # Set max upload size client_max_body_size 10G; + client_body_timeout 300s; fastcgi_buffers 64 4K; # Enable gzip but do not remove ETag headers @@ -52,6 +43,16 @@ location ^~ __PATH__/ { # for tunning hints client_body_buffer_size 512k; + # Add headers to serve security related headers + more_set_headers "Strict-Transport-Security: max-age=15768000; includeSubDomains; preload;"; + more_set_headers "Referrer-Policy: no-referrer"; + more_set_headers "X-Content-Type-Options: nosniff"; + more_set_headers "X-Download-Options: noopen"; + more_set_headers "X-Frame-Options: SAMEORIGIN"; + more_set_headers "X-Permitted-Cross-Domain-Policies: none"; + more_set_headers "X-Robots-Tag: noindex, nofollow"; + more_set_headers "X-XSS-Protection: 1; mode=block"; + # Remove X-Powered-By, which is an information leak fastcgi_hide_header X-Powered-By; From c12c87ebb0348a584a4122c07a4eff40f39e88e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 8 Oct 2023 21:23:44 +0200 Subject: [PATCH 045/354] Update nginx.conf --- conf/nginx.conf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index b3d35258..bdbf14f8 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -12,7 +12,9 @@ location ^~ /.well-known { location = /.well-known/webfinger { return 301 __PATH__/index.php$uri; } location = /.well-known/nodeinfo { return 301 __PATH__/index.php$uri; } - try_files $uri $uri/ =404; + # Let Nextcloud's API for `/.well-known` URIs handle all other + # requests by passing them to the front-end controller. + return 301 __PATH__/index.php$request_uri; } #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; From ba9845a0a7bc6d4e7215cffce93cc0bd592178f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 10 Oct 2023 18:17:31 +0200 Subject: [PATCH 046/354] Update DESCRIPTION.md --- doc/DESCRIPTION.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 4a3dbc8c..3d35dc46 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -2,8 +2,7 @@ Nextcloud Hub is a fully open-source on-premises content collaboration platform. ### YunoHost-specific features -In addition to Nextcloud core features, the following are made available with -this package: +In addition to Nextcloud core features, the following are made available with this package: * Integrate with YunoHost users and SSO - i.e. logout button * Allow one user to be the administrator (set at the installation) From 942cd87cbf7b0197993a9ec2ac3c652e1b200270 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 10 Oct 2023 16:17:39 +0000 Subject: [PATCH 047/354] Auto-update README --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 36f664c0..7762b187 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,7 @@ Nextcloud Hub is a fully open-source on-premises content collaboration platform. ### YunoHost-specific features -In addition to Nextcloud core features, the following are made available with -this package: +In addition to Nextcloud core features, the following are made available with this package: * Integrate with YunoHost users and SSO - i.e. logout button * Allow one user to be the administrator (set at the installation) From 81e1511ed0a8ab1c8fbd54355b2c32301fe8a786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 10 Oct 2023 23:12:49 +0200 Subject: [PATCH 048/354] add mail config --- conf/config.json | 21 ++++++++++++++++++++- manifest.toml | 1 + 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/conf/config.json b/conf/config.json index 9e1c8f02..f8253ee9 100644 --- a/conf/config.json +++ b/conf/config.json @@ -13,7 +13,26 @@ }, "hashing_default_password": true, "localstorage.allowsymlinks": true, - "simpleSignUpLink.shown": false + "simpleSignUpLink.shown": false, + "hashing_default_password": true, + "localstorage.allowsymlinks": true, + "simpleSignUpLink.shown": false, + "mail_smtpmode": "smtp", + "mail_smtpport": "25", + "mail_smtpauth": 1, + "mail_smtpname": "__APP__", + "mail_smtppassword": "__MAIL_PWD__", + "mail_sendmailmode": "smtp", + "mail_from_address": "__APP__", + "mail_domain": "__DOMAIN__", + "mail_smtphost": "localhost", + "mail_smtpstreamoptions": { + "ssl": { + "allow_self_signed": true, + "verify_peer": false, + "verify_peer_name": false + } + } }, "apps": { "user_ldap": { diff --git a/manifest.toml b/manifest.toml index cf786ea1..2e5d99e5 100644 --- a/manifest.toml +++ b/manifest.toml @@ -53,6 +53,7 @@ ram.runtime = "512M" [resources] [resources.system_user] + allow_email = true [resources.install_dir] From 998993fdfed8be1de43a9704ff16bdebc368dcaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Oct 2023 08:25:24 +0200 Subject: [PATCH 049/354] Update restore --- scripts/restore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/restore b/scripts/restore index 27f68448..7d065889 100755 --- a/scripts/restore +++ b/scripts/restore @@ -34,7 +34,7 @@ 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 -ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion +#ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion #================================================= # RESTORE THE NGINX CONFIGURATION From b1025a7a8ac303e6e130613ff21e695aa20f31ea Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 12 Oct 2023 06:29:33 +0000 Subject: [PATCH 050/354] 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 42ebfd66..7762b187 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 27.1.2~ynh2 +**Shipped version:** 27.1.2~ynh1 **Demo:** https://demo.nextcloud.com/ diff --git a/README_fr.md b/README_fr.md index 3c89b6d2..c198a085 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 27.1.2~ynh2 +**Version incluse :** 27.1.2~ynh1 **Démo :** https://demo.nextcloud.com/ From 28cc359e86652e52fee4dbc6b9000212bf4b4140 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Oct 2023 18:04:27 +0200 Subject: [PATCH 051/354] Update extra_php-fpm.conf --- conf/extra_php-fpm.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf index 4e9d3497..feee90b0 100644 --- a/conf/extra_php-fpm.conf +++ b/conf/extra_php-fpm.conf @@ -8,7 +8,7 @@ php_value[default_charset] = UTF-8 ; OPcache is already activated by default ; php_value[opcache.enable]=1 ; The following parameters are nevertheless recommended for Nextcloud -; see here: https://docs.nextcloud.com/server/15/admin_manual/installation/server_tuning.html#enable-php-opcache +; see here: https://docs.nextcloud.com/server/20/admin_manual/installation/server_tuning.html#enable-php-opcache php_value[opcache.enable_cli]=1 php_value[opcache.interned_strings_buffer]=32 php_value[opcache.max_accelerated_files]=10000 From e305738c069214afddbf4ed5fe04cdb930982752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Oct 2023 18:17:59 +0200 Subject: [PATCH 052/354] Update config.json --- conf/config.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/config.json b/conf/config.json index f8253ee9..0ccf288c 100644 --- a/conf/config.json +++ b/conf/config.json @@ -17,6 +17,8 @@ "hashing_default_password": true, "localstorage.allowsymlinks": true, "simpleSignUpLink.shown": false, + "trashbin_retention_obligation": "auto, 30", + "versions_retention_obligation": "auto, 30", "mail_smtpmode": "smtp", "mail_smtpport": "25", "mail_smtpauth": 1, From 6b6699d09da88a7327ffca27cbfabe1d3ea4e6e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Oct 2023 18:19:00 +0200 Subject: [PATCH 053/354] bump opcache.memory_consumption to 256 --- conf/extra_php-fpm.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf index feee90b0..5ee6f92f 100644 --- a/conf/extra_php-fpm.conf +++ b/conf/extra_php-fpm.conf @@ -12,7 +12,7 @@ php_value[default_charset] = UTF-8 php_value[opcache.enable_cli]=1 php_value[opcache.interned_strings_buffer]=32 php_value[opcache.max_accelerated_files]=10000 -php_value[opcache.memory_consumption]=128 +php_value[opcache.memory_consumption]=256 php_value[opcache.save_comments]=1 php_value[opcache.revalidate_freq]=1 ; https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/caching_configuration.html#id1 From e440ab98c69cff05707c31e58f6582e46b357531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Oct 2023 19:21:38 +0200 Subject: [PATCH 054/354] Update extra_php-fpm.conf --- conf/extra_php-fpm.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf index 5ee6f92f..fbaff561 100644 --- a/conf/extra_php-fpm.conf +++ b/conf/extra_php-fpm.conf @@ -10,7 +10,7 @@ php_value[default_charset] = UTF-8 ; The following parameters are nevertheless recommended for Nextcloud ; see here: https://docs.nextcloud.com/server/20/admin_manual/installation/server_tuning.html#enable-php-opcache php_value[opcache.enable_cli]=1 -php_value[opcache.interned_strings_buffer]=32 +php_value[opcache.interned_strings_buffer]=64 php_value[opcache.max_accelerated_files]=10000 php_value[opcache.memory_consumption]=256 php_value[opcache.save_comments]=1 From 5fb5480446257841f4c41ee3324d11a52fe241da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Oct 2023 20:04:58 +0200 Subject: [PATCH 055/354] Update nginx.conf --- conf/nginx.conf | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/conf/nginx.conf b/conf/nginx.conf index bdbf14f8..4d01938e 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -58,6 +58,15 @@ location ^~ __PATH__/ { # Remove X-Powered-By, which is an information leak fastcgi_hide_header X-Powered-By; + # Add .mjs as a file extension for javascript + # Either include it in the default mime.types list + # or include you can include that list explicitly and add the file extension + # only for Nextcloud like below: + include mime.types; + types { + text/javascript js mjs; + } + # Specify how to handle directories -- specifying `/nextcloud/index.php$request_uri` # here as the fallback means that Nginx always exhibits the desired behaviour # when a client requests a path that corresponds to a directory that exists From fc8ea623f46b994d8ac671f8a63632dff4139ac9 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sat, 21 Oct 2023 19:33:14 +0000 Subject: [PATCH 056/354] Auto-update README --- README.md | 3 +-- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 17ebf974..7762b187 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 27.1.2~ynh3 - +**Shipped version:** 27.1.2~ynh1 **Demo:** https://demo.nextcloud.com/ diff --git a/README_fr.md b/README_fr.md index 7da37de5..c198a085 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 27.1.2~ynh +**Version incluse :** 27.1.2~ynh1 **Démo :** https://demo.nextcloud.com/ From fdacb1b2e7ca92cccbe6bf4a013c65e74c2cd03b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 21 Oct 2023 21:51:49 +0200 Subject: [PATCH 057/354] Update nginx.conf --- conf/nginx.conf | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 0948834e..ab6f4741 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -74,7 +74,7 @@ location ^~ __PATH__/ { # that file is correctly served; if it doesn't, then the request is passed to # the front-end controller. This consistent behaviour means that we don't need # to specify custom rules for certain paths (e.g. images and other assets, - # `/updater`, `/ocm-provider`, `/ocs-provider`), and thus + # `/updater`, `/ocs-provider`), and thus # `try_files $uri $uri/ /nextcloud/index.php$request_uri` # always provides the desired behaviour. index index.php index.html __PATH__/index.php$request_uri; @@ -112,13 +112,13 @@ location ^~ __PATH__/ { try_files $fastcgi_script_name =404; include fastcgi_params; - fastcgi_param SCRIPT_FILENAME $request_filename; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param PATH_INFO $path_info; fastcgi_param HTTPS on; fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice fastcgi_param front_controller_active true; # Enable pretty urls - fastcgi_param HTTP_ACCEPT_ENCODING ""; # Disable encoding of nextcloud response to inject ynh scripts + fastcgi_param HTTP_ACCEPT_ENCODING ""; # Disable encoding of Nextcloud response to inject ynh scripts fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; fastcgi_intercept_errors on; fastcgi_request_buffering off; @@ -137,9 +137,10 @@ location ^~ __PATH__/ { index index.php; } + # Serve static files location ~ \.(?:css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map)$ { try_files $uri / __PATH__/index.php$request_uri; - expires 6M; # Cache-Control policy borrowed from `.htaccess` + more_set_headers "Cache-Control: public, max-age=15778463, $asset_immutable"; access_log off; # Optional: Don't log access to assets location ~ \.wasm$ { From dd4f97e44d7aba90e3c4f4920542b873f6cf28f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 21 Oct 2023 22:08:07 +0200 Subject: [PATCH 058/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 3d433497..afae52a7 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -375,7 +375,7 @@ ynh_use_logrotate --non-append ynh_script_progression --message="Reconfiguring Fail2Ban..." --weight=7 # Create a dedicated Fail2Ban config -ynh_add_fail2ban_config --logpath="/home/yunohost.app/$app/data/nextcloud.log" --failregex="^.*Login failed: '.*' \(Remote IP: ''.*$" --max_retry=5 +ynh_add_fail2ban_config --logpath="$data_dir/data/nextcloud.log" --failregex="^.*Login failed: '.*' \(Remote IP: ''.*$" --max_retry=5 #================================================= # GENERIC FINALIZATION From 8b8671d8d773a3cbb1b9cbfc1a26d5fa344fd598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 21 Oct 2023 22:12:41 +0200 Subject: [PATCH 059/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index afae52a7..709b3c12 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -253,7 +253,7 @@ EOF #================================================= # CONFIGURE NEXTCLOUD #================================================= - ynh_script_progression --message="Reconfiguring Nextcloud..." --weight=9 + ynh_script_progression --message="Reconfiguring $app..." --weight=9 # Verify the checksum and backup the file if it's different ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" From 5383c04b714e887324a720c46860cd1f59b7fe18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 24 Oct 2023 17:22:42 +0200 Subject: [PATCH 060/354] Update nginx.conf --- conf/nginx.conf | 9 --------- 1 file changed, 9 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index ab6f4741..1bdfb427 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -58,15 +58,6 @@ location ^~ __PATH__/ { # Remove X-Powered-By, which is an information leak fastcgi_hide_header X-Powered-By; - # Add .mjs as a file extension for javascript - # Either include it in the default mime.types list - # or include you can include that list explicitly and add the file extension - # only for Nextcloud like below: - include mime.types; - types { - text/javascript js mjs; - } - # Specify how to handle directories -- specifying `/nextcloud/index.php$request_uri` # here as the fallback means that Nginx always exhibits the desired behaviour # when a client requests a path that corresponds to a directory that exists From a0864f25b0d7a35dca9244e319d6c22562b2e27c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 29 Oct 2023 18:33:02 +0100 Subject: [PATCH 061/354] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index f1a487aa..5b6db99e 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -130,7 +130,7 @@ location ^~ __PATH__/ { # Serve static files location ~ \.(?:css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map)$ { try_files $uri / __PATH__/index.php$request_uri; - more_set_headers "Cache-Control: public, max-age=15778463, $asset_immutable"; + expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets location ~ \.wasm$ { From 374819cb1266de62d69c824200c8aec6e47cad9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 29 Oct 2023 18:39:45 +0100 Subject: [PATCH 062/354] Update _common.sh --- scripts/_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 7c28468a..19e6a36f 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1,7 +1,7 @@ #!/bin/bash #================================================= -# COMMON FUCTIONS +# COMMON VARIABLES #================================================= #================================================= From 1413ddf49287f8d7a3961be79846fd162e89d152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 29 Oct 2023 19:46:55 +0100 Subject: [PATCH 063/354] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 5b6db99e..66823700 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -101,7 +101,7 @@ location ^~ __PATH__/ { try_files $fastcgi_script_name =404; include fastcgi_params; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #fastcgi_param SCRIPT_FILENAME $request_filename; + fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param PATH_INFO $path_info; fastcgi_param HTTPS on; From e47de152eb18b3c8ac9fa9087fc9ded2036bd06e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 23 Nov 2023 18:12:00 +0100 Subject: [PATCH 064/354] cleaning --- scripts/install | 6 +++--- scripts/upgrade | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/install b/scripts/install index cadb410d..9e4f3a29 100755 --- a/scripts/install +++ b/scripts/install @@ -117,7 +117,7 @@ exec_occ ldap:create-empty-config # Load the installation config file in Nextcloud nc_conf="$install_dir/config_install.json" -ynh_add_config --template="../conf/config_install.json" --destination="$nc_conf" +ynh_add_config --template="config_install.json" --destination="$nc_conf" exec_occ config:import "$nc_conf" @@ -126,7 +126,7 @@ ynh_secure_remove --file="$nc_conf" # Load the additional config file (used also for upgrade) nc_conf="$install_dir/config.json" -ynh_add_config --template="../conf/config.json" --destination="$nc_conf" +ynh_add_config --template="config.json" --destination="$nc_conf" exec_occ config:import "$nc_conf" @@ -211,7 +211,7 @@ ynh_store_file_checksum --file="$install_dir/config/config.php" #================================================= cron_path="/etc/cron.d/$app" -ynh_add_config --template="../conf/nextcloud.cron" --destination="$cron_path" +ynh_add_config --template="nextcloud.cron" --destination="$cron_path" chown root: "$cron_path" chmod 644 "$cron_path" diff --git a/scripts/upgrade b/scripts/upgrade index 049e719c..1b413503 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -281,7 +281,7 @@ EOF ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" nc_conf="${install_dir}/config.json" - ynh_add_config --template="../conf/config.json" --destination="$nc_conf" + ynh_add_config --template="config.json" --destination="$nc_conf" # Reneable the mail app if [ $mail_app_must_be_reactived -eq 1 ]; then @@ -352,7 +352,7 @@ fi #================================================= cron_path="/etc/cron.d/$app" -ynh_add_config --template="../conf/nextcloud.cron" --destination="$cron_path" +ynh_add_config --template="nextcloud.cron" --destination="$cron_path" chown root: "$cron_path" chmod 644 "$cron_path" From 4d975cc3e2a6982bd1828d78b3c4f9cc1410b166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 24 Nov 2023 08:59:10 +0100 Subject: [PATCH 065/354] Update restore --- scripts/restore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/restore b/scripts/restore index 7d065889..27f68448 100755 --- a/scripts/restore +++ b/scripts/restore @@ -34,7 +34,7 @@ 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 -#ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion +ynh_add_fpm_config --usage=$fpm_usage --footprint=$fpm_footprint --phpversion=$phpversion #================================================= # RESTORE THE NGINX CONFIGURATION From d687230c664ae9da86b6f93bf636e3cdcbdcf53e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 24 Nov 2023 08:59:59 +0100 Subject: [PATCH 066/354] Update extra_php-fpm.conf --- conf/extra_php-fpm.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf index fbaff561..feee90b0 100644 --- a/conf/extra_php-fpm.conf +++ b/conf/extra_php-fpm.conf @@ -10,9 +10,9 @@ php_value[default_charset] = UTF-8 ; The following parameters are nevertheless recommended for Nextcloud ; see here: https://docs.nextcloud.com/server/20/admin_manual/installation/server_tuning.html#enable-php-opcache php_value[opcache.enable_cli]=1 -php_value[opcache.interned_strings_buffer]=64 +php_value[opcache.interned_strings_buffer]=32 php_value[opcache.max_accelerated_files]=10000 -php_value[opcache.memory_consumption]=256 +php_value[opcache.memory_consumption]=128 php_value[opcache.save_comments]=1 php_value[opcache.revalidate_freq]=1 ; https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/caching_configuration.html#id1 From 79e4cdf4012d663f77e0d99bd58755600f61ef52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:54:22 +0100 Subject: [PATCH 067/354] fix --- scripts/install | 2 +- scripts/upgrade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 9e4f3a29..745d4e05 100755 --- a/scripts/install +++ b/scripts/install @@ -186,7 +186,7 @@ exec_occ config:system:get logout_url >/dev/null 2>&1 \ # CHANGE HOSTNAME FOR ACTIVITY NOTIFICATIONS #================================================= -exec_occ config:system:set overwrite.cli.url --value="https://${domain}" +exec_occ config:system:set overwrite.cli.url --value="https://${domain}${path}" #================================================= # REMOVE THE TEMPORARY ADMIN AND SET THE TRUE ONE diff --git a/scripts/upgrade b/scripts/upgrade index 6a14bcc2..e6fb9ab3 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -326,7 +326,7 @@ EOF # CHANGE HOSTNAME FOR ACTIVITY NOTIFICATIONS #================================================= - exec_occ config:system:set overwrite.cli.url --value="https://${domain}" + exec_occ config:system:set overwrite.cli.url --value="https://${domain}${path}" #================================================= # MOUNT HOME FOLDERS AS EXTERNAL STORAGE From 03d7960b7c064a9fa6fd7469c0937b99d9629de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 12 Dec 2023 23:44:39 +0100 Subject: [PATCH 068/354] fix --- manifest.toml | 2 +- scripts/upgrade.d/upgrade.27.sh | 7 +++++++ scripts/upgrade.d/upgrade.last.sh | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 scripts/upgrade.d/upgrade.27.sh diff --git a/manifest.toml b/manifest.toml index 4110e9fd..c06bb93c 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "27.1.4~ynh1" +version = "28.0.0~ynh1" maintainers = ["kay0u"] diff --git a/scripts/upgrade.d/upgrade.27.sh b/scripts/upgrade.d/upgrade.27.sh new file mode 100644 index 00000000..3716a7f2 --- /dev/null +++ b/scripts/upgrade.d/upgrade.27.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# Last available Nextcloud version +next_version="28.0.0" + +# Nextcloud tarball checksum sha256 +nextcloud_source_sha256="4e8b0b74b40221e85f92ab869d0873c69a52d7e43889d9259c6259428a6a36f2" diff --git a/scripts/upgrade.d/upgrade.last.sh b/scripts/upgrade.d/upgrade.last.sh index b31e5b56..3716a7f2 100644 --- a/scripts/upgrade.d/upgrade.last.sh +++ b/scripts/upgrade.d/upgrade.last.sh @@ -1,7 +1,7 @@ #!/bin/bash # Last available Nextcloud version -next_version="27.1.4" +next_version="28.0.0" # Nextcloud tarball checksum sha256 -nextcloud_source_sha256="bec65f2166b82c9303baf476c1e424f71aa196dad010ffe4c0c39d03990d594c" +nextcloud_source_sha256="4e8b0b74b40221e85f92ab869d0873c69a52d7e43889d9259c6259428a6a36f2" From 1ab867a7b4dec671095172bedc7f70b791bfbbdb Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 12 Dec 2023 22:44:44 +0000 Subject: [PATCH 069/354] 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 abbfd578..73b3afed 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 27.1.4~ynh1 +**Shipped version:** 28.0.0~ynh1 **Demo:** https://demo.nextcloud.com/ diff --git a/README_fr.md b/README_fr.md index f4fdfaa0..dc3c8b6c 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 27.1.4~ynh1 +**Version incluse :** 28.0.0~ynh1 **Démo :** https://demo.nextcloud.com/ From 98d24a9930c2b9297b72ffde8587afc14c630f9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 10 Jan 2024 14:00:09 +0100 Subject: [PATCH 070/354] add psql pwd --- scripts/upgrade | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 86f5951d..9f8ab84e 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -74,7 +74,8 @@ then ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" ynh_psql_test_if_first_run - ynh_psql_setup_db --db_user=$db_user --db_name=$db_name + ynh_psql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$(ynh_string_random) + ynh_app_setting_set --app=$app --key=psqlpwd --value=$db_pwd exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n From 92ca88779ab8c102603090c1cce18f9cff77bf98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 10 Jan 2024 14:08:31 +0100 Subject: [PATCH 071/354] cleaning --- scripts/restore | 2 +- scripts/upgrade | 34 ++++++++++++++++++++-------------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/scripts/restore b/scripts/restore index f4ce6191..ae153934 100755 --- a/scripts/restore +++ b/scripts/restore @@ -27,7 +27,7 @@ ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=5 # Restore the file first, so it can have a backup if different ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -# Recreate a dedicated php-fpm config +# Recreate a dedicated PHP-FPM config ynh_add_fpm_config #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 9f8ab84e..3b285dac 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -63,13 +63,14 @@ exec_occ() { } #================================================= -# HANDLE DATABASE MIGRATION +# HANDLE DATABASE MIGRATION FROM MYSL TO PSQL #================================================= mysql_db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) + if [ -n "$mysql_db_pwd" ] then - ynh_script_progression --message="Migrating to PostgreSQL database..." + ynh_script_progression --message="Migrating to PostgreSQL database..." --weight=3 ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" @@ -85,6 +86,10 @@ then ynh_store_file_checksum --file="${install_dir}/config/config.php" fi +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= + # Define a function to add an external storage # Create the external storage for the given folders and enable sharing create_external_storage() { @@ -97,7 +102,6 @@ local mount_id=$(exec_occ files_external:create --output=json \ || exec_occ files_external:option "$mount_id" enable_sharing true } - if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Upgrading Nextcloud..." --weight=3 @@ -290,7 +294,7 @@ EOF fi #================================================= -# REGEN SYSTEM CONFIGURATIONS +# REGEN PERMISSIONS #================================================= ynh_script_progression --message="Reapplying file permissions..." --weight=2 @@ -310,15 +314,15 @@ chmod 750 $install_dir #================================================= ynh_script_progression --message="Regenerating system configurations for $app..." --weight=2 -# ------- +#------------------------------------------------- # PHP-FPM -# ------- +#------------------------------------------------- ynh_add_fpm_config -# ------- +#------------------------------------------------- # NGINX -# ------- +#------------------------------------------------- # Delete current NGINX configuration to be able to check if .well-known is already served. ynh_backup_if_checksum_is_different --file="/etc/nginx/conf.d/$domain.d/$app.conf" @@ -340,9 +344,10 @@ fi # Create a dedicated NGINX config ynh_add_nginx_config -# ------- +#------------------------------------------------- # CRON JOB -# ------- +#------------------------------------------------- + cron_path="/etc/cron.d/$app" ynh_add_config --template="../conf/nextcloud.cron" --destination="$cron_path" chown root: "$cron_path" @@ -350,14 +355,15 @@ chmod 644 "$cron_path" exec_occ background:cron -# ------- +#------------------------------------------------- # LOGROTATE -# ------- +#------------------------------------------------- + ynh_use_logrotate --non-append -# ------- +#------------------------------------------------- # FAIL2BAN -# ------- +#------------------------------------------------- # Create a dedicated Fail2Ban config ynh_add_fail2ban_config --logpath="$data_dir/data/nextcloud.log" --failregex="^.*Login failed: '.*' \(Remote IP: ''.*$" --max_retry=5 From cb57f51e104d932143585dda6e032297f2e26286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 10 Jan 2024 14:47:57 +0100 Subject: [PATCH 072/354] Update config.json --- conf/config.json | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/config.json b/conf/config.json index 1cd7f95d..bbe9eed2 100644 --- a/conf/config.json +++ b/conf/config.json @@ -14,6 +14,7 @@ "hashing_default_password": true, "localstorage.allowsymlinks": true, "simpleSignUpLink.shown": false, + "default_phone_region": "", "mail_smtpmode": "smtp", "mail_smtpport": "25", "mail_smtpauth": 1, From 5c1f0576372257f403d7f4ed463da5f440691051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 10 Jan 2024 15:09:53 +0100 Subject: [PATCH 073/354] Update upgrade --- scripts/upgrade | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 3b285dac..f3f87427 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -72,18 +72,18 @@ if [ -n "$mysql_db_pwd" ] then ynh_script_progression --message="Migrating to PostgreSQL database..." --weight=3 - ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" + #ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" ynh_psql_test_if_first_run - ynh_psql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$(ynh_string_random) - ynh_app_setting_set --app=$app --key=psqlpwd --value=$db_pwd + ynh_psql_setup_db --db_user=$db_user --db_name=$db_name #--db_pwd=$(ynh_string_random) + #ynh_app_setting_set --app=$app --key=psqlpwd --value=$db_pwd exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name ynh_app_setting_delete --app=$app --key=mysqlpwd - ynh_store_file_checksum --file="${install_dir}/config/config.php" + #ynh_store_file_checksum --file="${install_dir}/config/config.php" fi #================================================= From e32aaf6ce9c1e6216d252201aed802349c5e26d5 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Date: Wed, 10 Jan 2024 19:02:36 +0100 Subject: [PATCH 074/354] Update manifest.toml: bump version to have a version reference corresponding to the mysql->postgresql transition --- manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.toml b/manifest.toml index ce1c8895..e21272d1 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "28.0.1~ynh1" +version = "28.0.1~ynh2" maintainers = ["kay0u"] @@ -77,4 +77,4 @@ ram.runtime = "512M" [resources.database] type = "postgresql" - \ No newline at end of file + From ce61682761e25227b99f2306a64f8bd200767ece Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 10 Jan 2024 18:02:41 +0000 Subject: [PATCH 075/354] 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 5b8a14bf..b463ddc1 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 28.0.1~ynh1 +**Shipped version:** 28.0.1~ynh2 **Demo:** https://demo.nextcloud.com/ diff --git a/README_fr.md b/README_fr.md index 8b6334cc..01f21b00 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 28.0.1~ynh1 +**Version incluse :** 28.0.1~ynh2 **Démo :** https://demo.nextcloud.com/ From e724e9820702a09130b77c7cead584909372ed8f Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 10 Jan 2024 19:33:45 +0100 Subject: [PATCH 076/354] Update scripts/upgrade Co-authored-by: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> --- scripts/upgrade | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index f3f87427..79a1fb1c 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -66,24 +66,25 @@ exec_occ() { # HANDLE DATABASE MIGRATION FROM MYSL TO PSQL #================================================= -mysql_db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) - -if [ -n "$mysql_db_pwd" ] +# If we're moving through version 28.0.1~ynh2 (in which the switch to psql is made) +if ynh_compare_current_package_version --comparison lt --version 28.0.1~ynh2 then - ynh_script_progression --message="Migrating to PostgreSQL database..." --weight=3 - - #ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" - - ynh_psql_test_if_first_run - ynh_psql_setup_db --db_user=$db_user --db_name=$db_name #--db_pwd=$(ynh_string_random) - #ynh_app_setting_set --app=$app --key=psqlpwd --value=$db_pwd - - exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n - - ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name - ynh_app_setting_delete --app=$app --key=mysqlpwd - - #ynh_store_file_checksum --file="${install_dir}/config/config.php" + # Double-check the mysql DB is here + if ! mysql -e "USE $db_name" 2>/dev/null + then + ynh_warn "Uhoh? The Nextcloud mysql DB doesn't exist ? We are supposed to move it to postgresql ... Maybe it was already migrated ?" + # Double check the psql is not empty, otherwise big whoops ? + if [[ "$(ynh_psql_execute_as_root --database=$db_name --sql="\dt" 2>/dev/null | wc -l)" == 0 ]] + then + ynh_warn "Apparently the postgresql DB is not empty, so this is probably OK?" + else + ynh_die "Apparently the postgresql DB is also empty, this is kind of worrying, what happened?!" + fi + else + ynh_script_info --message="Migrating to PostgreSQL database..." --weight=3 + exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n + ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name + fi fi #================================================= From 5149bcbee4918e6335a7103b7d0f9a5c02d80a9e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Date: Wed, 10 Jan 2024 20:46:38 +0100 Subject: [PATCH 077/354] Update upgrade: grompf --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 79a1fb1c..43b97535 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -81,7 +81,7 @@ then ynh_die "Apparently the postgresql DB is also empty, this is kind of worrying, what happened?!" fi else - ynh_script_info --message="Migrating to PostgreSQL database..." --weight=3 + ynh_print_info --message="Migrating to PostgreSQL database..." --weight=3 exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name fi From 1827a8584a276e8756e8819562c5cd35937661e1 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Date: Wed, 10 Jan 2024 21:49:10 +0100 Subject: [PATCH 078/354] Update upgrade: aaaaaa --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 43b97535..2df173b6 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -81,7 +81,7 @@ then ynh_die "Apparently the postgresql DB is also empty, this is kind of worrying, what happened?!" fi else - ynh_print_info --message="Migrating to PostgreSQL database..." --weight=3 + ynh_print_info --message="Migrating to PostgreSQL database..." exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name fi From 6ebebe88a60ff84ee5f0ae65e84841bf836cb9ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 11 Jan 2024 18:59:45 +0100 Subject: [PATCH 079/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index e21272d1..19bc5326 100644 --- a/manifest.toml +++ b/manifest.toml @@ -73,7 +73,7 @@ ram.runtime = "512M" api.allowed = ["visitors", "all_users"] [resources.apt] - packages = "postgresql, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, php8.2-pgsql, php8.2-fpm, php8.2-bz2, php8.2-imap, php8.2-gmp, php8.2-gd, php8.2-intl, php8.2-curl, php8.2-apcu, php8.2-redis, php8.2-ldap, php8.2-imagick, php8.2-zip, php8.2-mbstring, php8.2-xml, php8.2-igbinary, php8.2-bcmath" + packages = "postgresql, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, php8.2-pgsql, php8.2-mysql, php8.2-fpm, php8.2-bz2, php8.2-imap, php8.2-gmp, php8.2-gd, php8.2-intl, php8.2-curl, php8.2-apcu, php8.2-redis, php8.2-ldap, php8.2-imagick, php8.2-zip, php8.2-mbstring, php8.2-xml, php8.2-igbinary, php8.2-bcmath" [resources.database] type = "postgresql" From ab68a3a2eb7dc5272415c6ca3178832ee5cd7656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 11 Jan 2024 20:26:10 +0100 Subject: [PATCH 080/354] Update upgrade --- scripts/upgrade | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 2df173b6..90047ff8 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -69,20 +69,20 @@ exec_occ() { # If we're moving through version 28.0.1~ynh2 (in which the switch to psql is made) if ynh_compare_current_package_version --comparison lt --version 28.0.1~ynh2 then - # Double-check the mysql DB is here + # Double-check the MySQL DB is here if ! mysql -e "USE $db_name" 2>/dev/null then - ynh_warn "Uhoh? The Nextcloud mysql DB doesn't exist ? We are supposed to move it to postgresql ... Maybe it was already migrated ?" - # Double check the psql is not empty, otherwise big whoops ? + ynh_warn "Uhoh? The Nextcloud MySQL DB doesn't exist? We are supposed to move it to PostgreSQL... Maybe it was already migrated?" + # Double check the psql is not empty, otherwise big whoops? if [[ "$(ynh_psql_execute_as_root --database=$db_name --sql="\dt" 2>/dev/null | wc -l)" == 0 ]] then - ynh_warn "Apparently the postgresql DB is not empty, so this is probably OK?" + ynh_warn "Apparently the PostgreSQL DB is not empty, so this is probably OK?" else - ynh_die "Apparently the postgresql DB is also empty, this is kind of worrying, what happened?!" + ynh_die "Apparently the PostgreSQL DB is also empty, this is kind of worrying, what happened?!" fi else ynh_print_info --message="Migrating to PostgreSQL database..." - exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n + ynh_exec_warn_less exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name fi fi From d7568ca230cf4109ad00e9e66d9ab779159b66d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 11 Jan 2024 21:49:47 +0100 Subject: [PATCH 081/354] cleaning --- scripts/change_url | 2 +- scripts/install | 2 +- scripts/remove | 2 +- scripts/restore | 2 +- scripts/upgrade | 7 +++---- tests.toml | 1 + 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 4ba48b33..dbcbc60a 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -52,7 +52,7 @@ fi #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring permissions..." +ynh_script_progression --message="Configuring permissions..." --weight=1 # Temporary fix for the API permission ynh_permission_url --permission="api" --url="re:$new_domain\/.well-known\/.*" --auth_header="false" --clear_urls diff --git a/scripts/install b/scripts/install index e662aa2e..39ca4a2c 100755 --- a/scripts/install +++ b/scripts/install @@ -80,7 +80,7 @@ exec_occ maintenance:install \ --database-user $db_user --database-pass "$db_pwd" \ --admin-user "admin" --admin-pass "$admin_password" \ --data-dir "$data_dir/data" \ - || ynh_die --message="Unable to install Nextcloud" + || ynh_die --message="Unable to install $app" #================================================= # CONFIGURE NEXTCLOUD diff --git a/scripts/remove b/scripts/remove index c39ac68c..a0f4ba65 100755 --- a/scripts/remove +++ b/scripts/remove @@ -8,7 +8,7 @@ source /usr/share/yunohost/helpers #================================================= # REMOVE SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Removing system configurations related to $app..." --weight=5 +ynh_script_progression --message="Removing system configurations related to $app..." --weight=10 # Remove the dedicated NGINX config ynh_remove_nginx_config diff --git a/scripts/restore b/scripts/restore index ae153934..13d2fe6e 100755 --- a/scripts/restore +++ b/scripts/restore @@ -121,7 +121,7 @@ ynh_systemd_action --action=restart --service_name=fail2ban #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." +ynh_script_progression --message="Reloading NGINX web server..." --weight=3 ynh_systemd_action --service_name=nginx --action=reload diff --git a/scripts/upgrade b/scripts/upgrade index 90047ff8..c4012810 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -105,7 +105,7 @@ local mount_id=$(exec_occ files_external:create --output=json \ if [ "$upgrade_type" == "UPGRADE_APP" ] then - ynh_script_progression --message="Upgrading Nextcloud..." --weight=3 + ynh_script_progression --message="Upgrading $app..." --weight=3 # Load the last available version source upgrade.d/upgrade.last.sh @@ -146,7 +146,6 @@ then # If the current version has the same major version than the next one, # then it's the last upgrade to do # We also cover the case where the last version is the first of the current major version series - # (e.g. 20.0.0 is the latest version) if [[ ("$last_major_version" -eq "$current_major_version") || ( ("$last_major_version" -eq "$((current_major_version+1))") && ("$next_version" == "$last_version") ) ]]; then current_major_version=last # Enable YunoHost patches on Nextcloud sources @@ -156,7 +155,7 @@ then # Load the value for this version source upgrade.d/upgrade.$current_major_version.sh - ynh_print_info --message="Upgrade to Nextcloud $next_version" + ynh_print_info --message="Upgrade to $app $next_version" # Create an app.src for this version of Nextcloud cat > ../conf/app.src << EOF @@ -204,7 +203,7 @@ EOF # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) exec_occ maintenance:mode --off exec_occ upgrade \ - || [ $? -eq 3 ] || ynh_die --message="Unable to upgrade Nextcloud" + || [ $? -eq 3 ] || ynh_die --message="Unable to upgrade $app" # Get the new current version number current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) diff --git a/tests.toml b/tests.toml index 10c825b6..bc75dbbb 100644 --- a/tests.toml +++ b/tests.toml @@ -9,3 +9,4 @@ test_format = 1.0 test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" + test_upgrade_from.3e60bacf.name = "Upgrade from 28.0.1" From 4e9a1aa1a8217c5b7494cad6e7ec26ca93d453e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 11 Jan 2024 22:26:46 +0100 Subject: [PATCH 082/354] Create PRE_UPGRADE.md --- doc/PRE_UPGRADE.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 doc/PRE_UPGRADE.md diff --git a/doc/PRE_UPGRADE.md b/doc/PRE_UPGRADE.md new file mode 100644 index 00000000..6b46d5b9 --- /dev/null +++ b/doc/PRE_UPGRADE.md @@ -0,0 +1,2 @@ +#FIX this pre_upgrade notification/migration/warning +Starting in Nextcloud 28.0.1~ynh2, we are deprecating support for MariaDB. We are moving from MariaDB to PostgreSQL database. \ No newline at end of file From 7394835d4c0528974714ef86bc3531fa787d550e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 11 Jan 2024 22:27:13 +0100 Subject: [PATCH 083/354] Update PRE_UPGRADE.md --- doc/PRE_UPGRADE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/PRE_UPGRADE.md b/doc/PRE_UPGRADE.md index 6b46d5b9..dd91f95b 100644 --- a/doc/PRE_UPGRADE.md +++ b/doc/PRE_UPGRADE.md @@ -1,2 +1,2 @@ #FIX this pre_upgrade notification/migration/warning -Starting in Nextcloud 28.0.1~ynh2, we are deprecating support for MariaDB. We are moving from MariaDB to PostgreSQL database. \ No newline at end of file +Starting in Nextcloud 28.0.1~ynh2, we are deprecating support for MariaDB. We are moving from MariaDB to PostgreSQL database. From c39600e756f190ab734876871e804900e14096c8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Fri, 12 Jan 2024 07:15:43 +0100 Subject: [PATCH 084/354] Update upgrade --- scripts/upgrade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index c4012810..97b2a238 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -72,11 +72,11 @@ then # Double-check the MySQL DB is here if ! mysql -e "USE $db_name" 2>/dev/null then - ynh_warn "Uhoh? The Nextcloud MySQL DB doesn't exist? We are supposed to move it to PostgreSQL... Maybe it was already migrated?" + ynh_print_warn "Uhoh? The Nextcloud MySQL DB doesn't exist? We are supposed to move it to PostgreSQL... Maybe it was already migrated?" # Double check the psql is not empty, otherwise big whoops? if [[ "$(ynh_psql_execute_as_root --database=$db_name --sql="\dt" 2>/dev/null | wc -l)" == 0 ]] then - ynh_warn "Apparently the PostgreSQL DB is not empty, so this is probably OK?" + ynh_print_warn "Apparently the PostgreSQL DB is not empty, so this is probably OK?" else ynh_die "Apparently the PostgreSQL DB is also empty, this is kind of worrying, what happened?!" fi From 06eefbab6ffb0a35f5eb57610e9d14bb026fabfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 12 Jan 2024 17:25:32 +0100 Subject: [PATCH 085/354] fix --- doc/ADMIN.md | 2 +- doc/ADMIN_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/ADMIN.md b/doc/ADMIN.md index e9b7da81..8d401d2f 100644 --- a/doc/ADMIN.md +++ b/doc/ADMIN.md @@ -3,7 +3,7 @@ You can run Nextcloud commands from the command line using: ``` -sudo -u __APP__ php__YNH_PHP_VERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ... +sudo -u __APP__ php__PHPVERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ... ``` Alternatively, you may open a 'Nextcloud shell' with `sudo yunohost app shell __APP__`, then run `php occ ...` diff --git a/doc/ADMIN_fr.md b/doc/ADMIN_fr.md index 85445bd2..06b76b12 100644 --- a/doc/ADMIN_fr.md +++ b/doc/ADMIN_fr.md @@ -3,7 +3,7 @@ Vous pouvez lancer des commandes Nextcloud depuis la ligne de commande avec: ``` -sudo -u __APP__ php__YNH_PHP_VERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ... +sudo -u __APP__ php__PHPVERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ... ``` Ou bien, vous pouvez ouvrir un "shell Nextcloud" avec `sudo yunohost app shell __APP__`, puis lancer `php occ ...` From 5d991034de7bf4267dfb7eda8869e6bc217faed8 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Date: Tue, 16 Jan 2024 02:09:32 +0100 Subject: [PATCH 086/354] Update upgrade: fix check that postgresql is empty during mysql->psql migration --- scripts/upgrade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index b008d8d4..b86b4a61 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -76,9 +76,9 @@ then # Double check the psql is not empty, otherwise big whoops? if [[ "$(ynh_psql_execute_as_root --database=$db_name --sql="\dt" 2>/dev/null | wc -l)" == 0 ]] then - ynh_print_warn "Apparently the PostgreSQL DB is not empty, so this is probably OK?" - else ynh_die "Apparently the PostgreSQL DB is also empty, this is kind of worrying, what happened?!" + else + ynh_print_warn "Apparently the PostgreSQL DB is not empty, so this is probably OK?" fi else ynh_print_info --message="Migrating to PostgreSQL database..." From dc77d76d26ed54d7faa21b1bfa4b53868ac9bc64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 26 Jan 2024 20:36:33 +0100 Subject: [PATCH 087/354] Update upgrade --- scripts/upgrade | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 26764e6b..2a98ccaa 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -24,7 +24,6 @@ then ynh_die --message="Upgrading from Nextcloud < 22.2 is not supported anymore. You should first upgrade to 22.2 using: yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/41f5f902e7c7cd3c30a6793020562ba98b9bf3e9" fi - #================================================= # SPECIFIC UPGRADE #================================================= From 61bc1ff066bba7c7d97ad36a08e1a952f91ee8dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 26 Jan 2024 20:39:36 +0100 Subject: [PATCH 088/354] Update upgrade --- scripts/upgrade | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 2a98ccaa..d1e37fa0 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -39,6 +39,9 @@ filter_boring_occ_warnings() { sed -E 's@\s*([0-9]+\/[0-9]+\s+\[(-|>|=)+\]\s+[0-9]+%|\s*Starting ...|Nextcloud or one of the apps require upgrade - only a limited number of commands are available|You may use your browser or the occ upgrade command to do the upgrade)@@g' } +current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) +current_major_version=${current_version%%.*} + # Define a function to execute commands with `occ` exec_occ() { # Backward compatibility to upgrade from older versions @@ -133,9 +136,6 @@ function list_installed_apps_not_compatible_with_future_version() } -current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) -current_major_version=${current_version%%.*} - last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9]') last_major_version=${last_version%%.*} From 4a83c2b8480ee68ed2b367a669ea6502ab30225e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 1 Feb 2024 12:09:27 +0100 Subject: [PATCH 089/354] Update manifest.toml --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 75221be2..a875c861 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "28.0.1~ynh2" +version = "28.0.2~ynh1" maintainers = ["kay0u"] @@ -59,8 +59,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.1.tar.bz2' - sha256 = '2f80735b443082272fe6a3b5e32137957f1fc448c75342b94b5200b29725f3a4' + url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.2.tar.bz2' + sha256 = 'de34d6baf3ecceacfdd138e85520cd85e1d2ce6798d9ffa478ac17eb1efa1d08' [resources.sources.27] url = 'https://download.nextcloud.com/server/releases/nextcloud-27.0.0.tar.bz2' From c67899f5ea6ada1bc72048d72947a4603171b31e Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 1 Feb 2024 11:09:33 +0000 Subject: [PATCH 090/354] 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 b463ddc1..8d429f4e 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 28.0.1~ynh2 +**Shipped version:** 28.0.2~ynh1 **Demo:** https://demo.nextcloud.com/ diff --git a/README_fr.md b/README_fr.md index 01f21b00..daedd3de 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 28.0.1~ynh2 +**Version incluse :** 28.0.2~ynh1 **Démo :** https://demo.nextcloud.com/ From 37fe56f6afbcb6f01b41370c3e417da2a465edfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 1 Feb 2024 12:25:06 +0100 Subject: [PATCH 091/354] Update config.json --- conf/config.json | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/config.json b/conf/config.json index bbe9eed2..a316b245 100644 --- a/conf/config.json +++ b/conf/config.json @@ -15,6 +15,7 @@ "localstorage.allowsymlinks": true, "simpleSignUpLink.shown": false, "default_phone_region": "", + "maintenance_window_start": 1, "mail_smtpmode": "smtp", "mail_smtpport": "25", "mail_smtpauth": 1, From 8aab6f76c2fd838e2940919518652b4b3039c7de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 1 Feb 2024 13:35:32 +0100 Subject: [PATCH 092/354] Update upgrade --- scripts/upgrade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index d1e37fa0..93d146c0 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -75,8 +75,8 @@ exec_occ() { # HANDLE DATABASE MIGRATION FROM MYSL TO PSQL #================================================= -# If we're moving through version 28.0.1~ynh2 (in which the switch to psql is made) -if ynh_compare_current_package_version --comparison lt --version 28.0.1~ynh2 +# If we're moving through version 28.0.2~ynh1 (in which the switch to psql is made) +if ynh_compare_current_package_version --comparison lt --version 28.0.2~ynh1 then # Double-check the MySQL DB is here if ! mysql -e "USE $db_name" 2>/dev/null From 29fc438f1868ca9cf81f4603a37b785922f2c8ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 1 Feb 2024 13:40:52 +0100 Subject: [PATCH 093/354] Update upgrade --- scripts/upgrade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 93d146c0..90227510 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -75,8 +75,8 @@ exec_occ() { # HANDLE DATABASE MIGRATION FROM MYSL TO PSQL #================================================= -# If we're moving through version 28.0.2~ynh1 (in which the switch to psql is made) -if ynh_compare_current_package_version --comparison lt --version 28.0.2~ynh1 +# If we're moving through version 28.0.1~ynh1 (in which the switch to psql is made) +if ynh_compare_current_package_version --comparison lt --version 28.0.1~ynh1 then # Double-check the MySQL DB is here if ! mysql -e "USE $db_name" 2>/dev/null From 8912fbef1fafb5e4c0bc19e53c288d1e3cf40f41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 1 Feb 2024 13:42:55 +0100 Subject: [PATCH 094/354] Update upgrade --- scripts/upgrade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 90227510..cc4a1978 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -75,8 +75,8 @@ exec_occ() { # HANDLE DATABASE MIGRATION FROM MYSL TO PSQL #================================================= -# If we're moving through version 28.0.1~ynh1 (in which the switch to psql is made) -if ynh_compare_current_package_version --comparison lt --version 28.0.1~ynh1 +# If we're moving through version 28.0.2~ynh1 (in which the switch to psql is made) +if ynh_compare_current_package_version --comparison lt --version 28.0.2~ynh2 then # Double-check the MySQL DB is here if ! mysql -e "USE $db_name" 2>/dev/null From e9d9b28238166c6ba6c31ba9e9afac38cb1e03f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 3 Feb 2024 17:14:57 +0100 Subject: [PATCH 095/354] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 9487ac26..7a9340ed 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -55,7 +55,7 @@ location ^~ __PATH__/ { client_body_buffer_size 512k; # HTTP response headers borrowed from Nextcloud `.htaccess` - more_set_headers "Strict-Transport-Security: max-age=15768000; includeSubDomains; preload;"; + #more_set_headers "Strict-Transport-Security: max-age=15768000; includeSubDomains; preload;"; more_set_headers "Referrer-Policy: no-referrer"; more_set_headers "X-Content-Type-Options: nosniff"; more_set_headers "X-Download-Options: noopen"; From 98c13e0db81a47e9fdd0b1de0cb0ac99cff51df3 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 21 Feb 2024 12:20:10 +0000 Subject: [PATCH 096/354] 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 318910a4..df111f26 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ @@ -58,4 +58,4 @@ or sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_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 1f9ad1db..3a99357e 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,5 +1,5 @@ From ef5b058676e971d256eab606cc354ba8f1d0ba1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 29 Feb 2024 16:44:15 +0100 Subject: [PATCH 097/354] Update manifest.toml --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 3db25edc..72c4f90e 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "28.0.2~ynh2" +version = "28.0.3~ynh1" maintainers = ["kay0u"] @@ -59,8 +59,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.2.tar.bz2' - sha256 = 'de34d6baf3ecceacfdd138e85520cd85e1d2ce6798d9ffa478ac17eb1efa1d08' + url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.3.tar.bz2' + sha256 = '9ed413c0de16f5b033ceeffcca99c0d61fc698dbeb8db851ac9adf9eef951906' [resources.sources.27] url = 'https://download.nextcloud.com/server/releases/nextcloud-27.0.0.tar.bz2' From 91b1e7f7c487e67c52e3bbcea56bb7ae70386bf4 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 29 Feb 2024 15:44:20 +0000 Subject: [PATCH 098/354] 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 df111f26..8d063f11 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 28.0.2~ynh2 +**Shipped version:** 28.0.3~ynh1 **Demo:** https://demo.nextcloud.com/ diff --git a/README_fr.md b/README_fr.md index 3a99357e..f2e1700d 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 28.0.2~ynh2 +**Version incluse :** 28.0.3~ynh1 **Démo :** https://demo.nextcloud.com/ From d0645b93a7d3655d89b8dd9110bffd147c433e57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 28 Mar 2024 11:32:55 +0100 Subject: [PATCH 099/354] Update manifest.toml --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index f97ec223..dd40b4d9 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "28.0.3~ynh3" +version = "28.0.4~ynh1" maintainers = ["kay0u"] @@ -59,8 +59,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.3.tar.bz2' - sha256 = '9ed413c0de16f5b033ceeffcca99c0d61fc698dbeb8db851ac9adf9eef951906' + url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.4.tar.bz2' + sha256 = '9bfecee1e12fba48c49e9a71caa81c4ba10b2884787fab75d64ccfd122a13019' [resources.sources.27] url = 'https://download.nextcloud.com/server/releases/nextcloud-27.0.0.tar.bz2' From b40d07987c7fb8ea0a1b0048ed3acfb55981ba6d Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 28 Mar 2024 10:33:02 +0000 Subject: [PATCH 100/354] Auto-update READMEs --- ALL_README.md | 6 +++++ README.md | 17 +++++++------- README_fr.md | 35 +++++++++++++++-------------- README_gl.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ README_it.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 155 insertions(+), 25 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 00000000..3d6c579b --- /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 7b12d86d..933eeb78 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ @@ -9,10 +9,10 @@ It shall NOT be edited by hand. [![Install Nextcloud with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) -*[Lire ce readme en français.](./README_fr.md)* +*[Read this README is other languages.](./ALL_README.md)* -> *This package allows you to install Nextcloud 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 Nextcloud 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 @@ -28,7 +28,8 @@ In addition to Nextcloud core features, the following are made available with th * Optionally access the user home folder from Nextcloud files (set at the installation, the sharing is enabled by default) * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 28.0.3~ynh2 + +**Shipped version:** 28.0.4~ynh1 **Demo:** @@ -47,11 +48,11 @@ In addition to Nextcloud core features, the following are made available with th ## Developer info -Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing). +Please send your pull request to the [`testing` branch](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing). -To try the testing branch, please proceed like that. +To try the `testing` branch, please proceed like that: -``` bash +```bash sudo yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug or sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug diff --git a/README_fr.md b/README_fr.md index 1457f983..a89996ec 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,6 +1,6 @@ # Nextcloud pour YunoHost @@ -9,10 +9,10 @@ It shall NOT be edited by hand. [![Installer Nextcloud avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) -*[Read this readme in english.](./README.md)* +*[Lire le README dans d'autres langues.](./ALL_README.md)* -> *Ce package vous permet d’installer Nextcloud 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 Nextcloud 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 @@ -28,9 +28,10 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Accès optionnel au répertoire home depuis les fichiers Nextcloud (à activer à l'installation, le partage étant activé par défaut) * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 28.0.3~ynh2 -**Démo :** +**Version incluse :** 28.0.4~ynh1 + +**Démo :** ## Captures d’écran @@ -38,23 +39,23 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv ## Documentations et ressources -- Site officiel de l’app : -- Documentation officielle utilisateur : -- 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 utilisateur : +- 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/nextcloud_ynh/tree/testing). +Merci de faire vos pull request sur la [branche `testing`](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing). -Pour essayer la branche testing, procédez comme suit. +Pour essayer la branche `testing`, procédez comme suit : -``` bash +```bash sudo yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug ou sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_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 00000000..aad0610a --- /dev/null +++ b/README_gl.md @@ -0,0 +1,61 @@ + + +# Nextcloud para YunoHost + +[![Nivel de integración](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![Estado de funcionamento](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Estado de mantemento](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) + +[![Instalar Nextcloud con YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) + +*[Le este README en outros idiomas.](./ALL_README.md)* + +> *Este paquete permíteche instalar Nextcloud 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 + +Nextcloud Hub is a fully open-source on-premises content collaboration platform. Teams access, share and edit their documents, chat and participate in video calls and manage their mail and calendar and projects across mobile, desktop and web interfaces. + +### YunoHost-specific features + +In addition to Nextcloud core features, the following are made available with this package: + + * Integrate with YunoHost users and SSO - i.e. logout button + * Allow one user to be the administrator (set at the installation) + * Allow multiple instances of this application + * Optionally access the user home folder from Nextcloud files (set at the installation, the sharing is enabled by default) + * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal + + +**Versión proporcionada:** 28.0.4~ynh1 + +**Demo:** + +## Capturas de pantalla + +![Captura de pantalla de Nextcloud](./doc/screenshots/screenshot.png) + +## Documentación e recursos + +- Web oficial da app: +- Documentación oficial para usuarias: +- 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/nextcloud_ynh/tree/testing). + +Para probar a rama `testing`, procede deste xeito: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +ou +sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_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 00000000..d3fa6542 --- /dev/null +++ b/README_it.md @@ -0,0 +1,61 @@ + + +# Nextcloud per YunoHost + +[![Livello di integrazione](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![Stato di funzionamento](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Stato di manutenzione](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) + +[![Installa Nextcloud con YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) + +*[Leggi questo README in altre lingue.](./ALL_README.md)* + +> *Questo pacchetto ti permette di installare Nextcloud 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 + +Nextcloud Hub is a fully open-source on-premises content collaboration platform. Teams access, share and edit their documents, chat and participate in video calls and manage their mail and calendar and projects across mobile, desktop and web interfaces. + +### YunoHost-specific features + +In addition to Nextcloud core features, the following are made available with this package: + + * Integrate with YunoHost users and SSO - i.e. logout button + * Allow one user to be the administrator (set at the installation) + * Allow multiple instances of this application + * Optionally access the user home folder from Nextcloud files (set at the installation, the sharing is enabled by default) + * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal + + +**Versione pubblicata:** 28.0.4~ynh1 + +**Prova:** + +## Screenshot + +![Screenshot di Nextcloud](./doc/screenshots/screenshot.png) + +## Documentazione e risorse + +- Sito web ufficiale dell’app: +- Documentazione ufficiale per gli utenti: +- 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/nextcloud_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/nextcloud_ynh/tree/testing --debug +o +sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +``` + +**Maggiori informazioni riguardo il pacchetto di quest’app:** From cbfc4bdc4b267a5071b650886171cf990b8510b6 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 3 Apr 2024 09:57:57 +0000 Subject: [PATCH 101/354] Auto-update READMEs --- ALL_README.md | 2 +- README.md | 2 +- README_eu.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 README_eu.md diff --git a/ALL_README.md b/ALL_README.md index 3d6c579b..77b7509f 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -1,6 +1,6 @@ # 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 933eeb78..23bacd80 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ It shall NOT be edited by hand. [![Install Nextcloud with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) -*[Read this README is other languages.](./ALL_README.md)* +*[Read this README in other languages.](./ALL_README.md)* > *This package allows you to install Nextcloud 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 00000000..0a5fa09c --- /dev/null +++ b/README_eu.md @@ -0,0 +1,61 @@ + + +# Nextcloud YunoHost-erako + +[![Integrazio maila](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![Funtzionamendu egoera](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Mantentze egoera](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) + +[![Instalatu Nextcloud YunoHost-ekin](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) + +*[Irakurri README hau beste hizkuntzatan.](./ALL_README.md)* + +> *Pakete honek Nextcloud YunoHost zerbitzari batean azkar eta zailtasunik gabe instalatzea ahalbidetzen dizu.* +> *YunoHost ez baduzu, kontsultatu [gida](https://yunohost.org/install) nola instalatu ikasteko.* + +## Aurreikuspena + +Nextcloud Hub is a fully open-source on-premises content collaboration platform. Teams access, share and edit their documents, chat and participate in video calls and manage their mail and calendar and projects across mobile, desktop and web interfaces. + +### YunoHost-specific features + +In addition to Nextcloud core features, the following are made available with this package: + + * Integrate with YunoHost users and SSO - i.e. logout button + * Allow one user to be the administrator (set at the installation) + * Allow multiple instances of this application + * Optionally access the user home folder from Nextcloud files (set at the installation, the sharing is enabled by default) + * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal + + +**Paketatutako bertsioa:** 28.0.4~ynh1 + +**Demoa:** + +## Pantaila-argazkiak + +![Nextcloud(r)en pantaila-argazkia](./doc/screenshots/screenshot.png) + +## Dokumentazioa eta baliabideak + +- Aplikazioaren webgune ofiziala: +- Erabiltzaileen dokumentazio 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/nextcloud_ynh/tree/testing). + +`testing` abarra probatzeko, ondorengoa egin: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +edo +sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +``` + +**Informazio gehiago aplikazioaren paketatzeari buruz:** From 09219ab72d1473e655f26752c698d6654eaee0c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 18 Apr 2024 16:26:41 +0200 Subject: [PATCH 102/354] remove upgrade_type --- scripts/upgrade | 290 ++++++++++++++++++++++++------------------------ 1 file changed, 142 insertions(+), 148 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 75de3354..d99c2475 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -3,8 +3,6 @@ source _common.sh source /usr/share/yunohost/helpers -upgrade_type=$(ynh_check_app_version_changed) - #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= @@ -148,177 +146,173 @@ then fi fi -if [ "$upgrade_type" == "UPGRADE_APP" ] -then - ynh_script_progression --message="Upgrading $app..." --weight=3 +ynh_script_progression --message="Upgrading $app..." --weight=3 - # Set write access for the following commands - chown -R $app: "$install_dir" "$data_dir" +# Set write access for the following commands +chown -R $app: "$install_dir" "$data_dir" - # Print the current version number of Nextcloud - exec_occ -V +# Print the current version number of Nextcloud +exec_occ -V - # Upgrade may fail if this app is enabled - # Take all apps enabled, and check if mail is one of them - # Then temporary disable the mail app - mail_app_must_be_reactived=0 +# Upgrade may fail if this app is enabled +# Take all apps enabled, and check if mail is one of them +# Then temporary disable the mail app +mail_app_must_be_reactived=0 - if exec_occ app:list | awk '/Enabled/{f=1;next} /Disabled/{f=0} f' | grep -q -w mail; then - exec_occ app:disable mail +if exec_occ app:list | awk '/Enabled/{f=1;next} /Disabled/{f=0} f' | grep -q -w mail; then + exec_occ app:disable mail mail_app_must_be_reactived=1 +fi + +# While the current version is not the last version, do an upgrade +while [ "$last_version" != "$current_version" ] +do + next_major_version="$(( $current_major_version + 1 ))" + if [[ "$next_major_version" -ge "$last_major_version" ]]; then + ynh_print_info --message="Upgrading to Nextcloud $last_version" + cp -a ../sources/patches_last_version/* ../sources/patches + source_id="main" + else + ynh_print_info --message="Upgrading to Nextcloud $next_major_version" + source_id="$next_major_version" fi - # While the current version is not the last version, do an upgrade - while [ "$last_version" != "$current_version" ] - do + # Create a temporary directory + tmpdir="${install_dir}__tmp_upgrade" - next_major_version="$(( $current_major_version + 1 ))" - if [[ "$next_major_version" -ge "$last_major_version" ]]; then - ynh_print_info --message="Upgrading to Nextcloud $last_version" - cp -a ../sources/patches_last_version/* ../sources/patches - source_id="main" - else - ynh_print_info --message="Upgrading to Nextcloud $next_major_version" - source_id="$next_major_version" - fi + ynh_setup_source --dest_dir="$tmpdir" --source_id="$source_id" - # Create a temporary directory - tmpdir="${install_dir}__tmp_upgrade" - - ynh_setup_source --dest_dir="$tmpdir" --source_id="$source_id" - - # Backup the config file in the temp dir - cp -a "$install_dir/config/config.php" "$tmpdir/config/config.php" - - # Enable maintenance mode - exec_occ maintenance:mode --on - - # Backup 3rd party applications from the current Nextcloud - # But do not overwrite if there is any upgrade - # (apps directory already exists in Nextcloud archive) - ( - cd $install_dir/apps - for nc_app_dir in */ - do - if [ ! -d "$tmpdir/apps/$nc_app_dir" ] - then - cp -a "$nc_app_dir" "$tmpdir/apps/$nc_app_dir" - fi - done - ) - - # Replace the old Nextcloud by the new one - ynh_secure_remove --file="$install_dir" - mv "$tmpdir" "$install_dir" - - # Set write access for the following commands - chown -R $app: "$install_dir" "$data_dir" - - # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) - exec_occ maintenance:mode --off - exec_occ upgrade \ - || [ $? -eq 3 ] || ynh_die --message="Unable to upgrade $app" - - # Get the new current version number - current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) - current_major_version=${current_version%%.*} - - # Print the current version number of Nextcloud - exec_occ -V + # Backup the config file in the temp dir + cp -a "$install_dir/config/config.php" "$tmpdir/config/config.php" + + # Enable maintenance mode + exec_occ maintenance:mode --on + + # Backup 3rd party applications from the current Nextcloud + # But do not overwrite if there is any upgrade + # (apps directory already exists in Nextcloud archive) + ( + cd $install_dir/apps + for nc_app_dir in */ + do + if [ ! -d "$tmpdir/apps/$nc_app_dir" ] + then + cp -a "$nc_app_dir" "$tmpdir/apps/$nc_app_dir" + fi done + ) - exec_occ db:add-missing-indices -n - exec_occ db:add-missing-columns -n - exec_occ db:add-missing-primary-keys -n - exec_occ db:convert-filecache-bigint -n + # Replace the old Nextcloud by the new one + ynh_secure_remove --file="$install_dir" + mv "$tmpdir" "$install_dir" - #================================================= - # CONFIGURE NEXTCLOUD - #================================================= - ynh_script_progression --message="Reconfiguring $app..." --weight=9 + # Set write access for the following commands + chown -R $app: "$install_dir" "$data_dir" - # Verify the checksum and backup the file if it's different - ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" + # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) + exec_occ maintenance:mode --off + exec_occ upgrade \ + || [ $? -eq 3 ] || ynh_die --message="Unable to upgrade $app" - nc_conf="${install_dir}/config.json" - ynh_add_config --template="config.json" --destination="$nc_conf" + # Get the new current version number + current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) + current_major_version=${current_version%%.*} - # Reneable the mail app - if [ $mail_app_must_be_reactived -eq 1 ]; then - exec_occ app:enable mail - fi + # Print the current version number of Nextcloud + exec_occ -V +done - # Ensure that UpdateNotification app is disabled - exec_occ app:disable updatenotification +exec_occ db:add-missing-indices -n +exec_occ db:add-missing-columns -n +exec_occ db:add-missing-primary-keys -n +exec_occ db:convert-filecache-bigint -n - # Enable LDAP plugin - exec_occ app:enable user_ldap +#================================================= +# CONFIGURE NEXTCLOUD +#================================================= +ynh_script_progression --message="Reconfiguring $app..." --weight=9 - # Update all installed apps - exec_occ app:update --all +# Verify the checksum and backup the file if it's different +ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" - # move the logs from the data_dir to the standard /var/log - # it would be better in the ENSURE DOWNWARD COMPATIBILITY section - # but it must be after the exec_occ() definition, so it's here - if [ -f "$data_dir/data/nextcloud.log" ]; then - mkdir -p "/var/log/$app" - chmod 750 "/var/log/$app" - mv "$data_dir"/data/nextcloud.log* "/var/log/$app" - # adapt the nextcloud config - exec_occ config:system:set logfile --value="/var/log/$app/nextcloud.log" - fi +nc_conf="${install_dir}/config.json" +ynh_add_config --template="config.json" --destination="$nc_conf" - # Load the config file in nextcloud - exec_occ config:import "$nc_conf" - - # Then remove the config file - ynh_secure_remove --file="$nc_conf" - - #================================================= - # ALLOW USERS TO DISCONNECT FROM NEXTCLOUD - #================================================= - - # Add dynamic logout URL to the config - exec_occ config:system:get logout_url >/dev/null 2>&1 \ - || echo " - //-YunoHost- - // set logout_url according to main domain - \$main_domain = exec('cat /etc/yunohost/current_host'); - \$CONFIG['logout_url'] = 'https://'.\$main_domain.'/yunohost/sso/?action=logout'; - //-YunoHost- - " >> "$install_dir/config/config.php" - - #================================================= - # CHANGE HOSTNAME FOR ACTIVITY NOTIFICATIONS - #================================================= - - exec_occ config:system:set overwrite.cli.url --value="https://${domain}${path}" - - #================================================= - # MOUNT HOME FOLDERS AS EXTERNAL STORAGE - #================================================= - - # Enable External Storage and create local mount to home folder as needed - if [ $user_home -eq 1 ]; then - exec_occ app:enable files_external - exec_occ files_external:list --output=json \ - | grep -q '"storage":"\\\\OC\\\\Files\\\\Storage\\\\Local"' \ - || create_external_storage "/home/\$user" "Home" - # Iterate over users to extend their home folder permissions - for u in $(ynh_user_list); do - setfacl --modify g:$app:rwx "/home/$u" || true - done - fi +# Reneable the mail app +if [ $mail_app_must_be_reactived -eq 1 ]; then + exec_occ app:enable mail +fi + +# Ensure that UpdateNotification app is disabled +exec_occ app:disable updatenotification + +# Enable LDAP plugin +exec_occ app:enable user_ldap - #================================================= - # STORE THE CHECKSUM OF THE CONFIG FILE - #================================================= +# Update all installed apps +exec_occ app:update --all - # Calculate and store the config file checksum into the app settings - ynh_store_file_checksum --file="${install_dir}/config/config.php" +# move the logs from the data_dir to the standard /var/log +# it would be better in the ENSURE DOWNWARD COMPATIBILITY section +# but it must be after the exec_occ() definition, so it's here +if [ -f "$data_dir/data/nextcloud.log" ]; then + mkdir -p "/var/log/$app" + chmod 750 "/var/log/$app" + mv "$data_dir"/data/nextcloud.log* "/var/log/$app" + # adapt the nextcloud config + exec_occ config:system:set logfile --value="/var/log/$app/nextcloud.log" fi +# Load the config file in nextcloud +exec_occ config:import "$nc_conf" + +# Then remove the config file +ynh_secure_remove --file="$nc_conf" + +#================================================= +# ALLOW USERS TO DISCONNECT FROM NEXTCLOUD +#================================================= + +# Add dynamic logout URL to the config +exec_occ config:system:get logout_url >/dev/null 2>&1 \ +|| echo " +//-YunoHost- +// set logout_url according to main domain +\$main_domain = exec('cat /etc/yunohost/current_host'); +\$CONFIG['logout_url'] = 'https://'.\$main_domain.'/yunohost/sso/?action=logout'; +//-YunoHost- +" >> "$install_dir/config/config.php" + +#================================================= +# CHANGE HOSTNAME FOR ACTIVITY NOTIFICATIONS +#================================================= + +exec_occ config:system:set overwrite.cli.url --value="https://${domain}${path}" + +#================================================= +# MOUNT HOME FOLDERS AS EXTERNAL STORAGE +#================================================= + +# Enable External Storage and create local mount to home folder as needed +if [ $user_home -eq 1 ]; then + exec_occ app:enable files_external + exec_occ files_external:list --output=json \ + | grep -q '"storage":"\\\\OC\\\\Files\\\\Storage\\\\Local"' \ + || create_external_storage "/home/\$user" "Home" + # Iterate over users to extend their home folder permissions + for u in $(ynh_user_list); do + setfacl --modify g:$app:rwx "/home/$u" || true + done +fi + +#================================================= +# STORE THE CHECKSUM OF THE CONFIG FILE +#================================================= + +# Calculate and store the config file checksum into the app settings +ynh_store_file_checksum --file="${install_dir}/config/config.php" + #================================================= # REGEN PERMISSIONS #================================================= From e509d3766dde1907ada8f381f482346a59b6881a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 19 Apr 2024 12:20:29 +0200 Subject: [PATCH 103/354] Revert "remove upgrade_type" This reverts commit 09219ab72d1473e655f26752c698d6654eaee0c7. --- scripts/upgrade | 290 ++++++++++++++++++++++++------------------------ 1 file changed, 148 insertions(+), 142 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index d99c2475..75de3354 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -3,6 +3,8 @@ source _common.sh source /usr/share/yunohost/helpers +upgrade_type=$(ynh_check_app_version_changed) + #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= @@ -146,172 +148,176 @@ then fi fi -ynh_script_progression --message="Upgrading $app..." --weight=3 - -# Set write access for the following commands -chown -R $app: "$install_dir" "$data_dir" - -# Print the current version number of Nextcloud -exec_occ -V - - -# Upgrade may fail if this app is enabled -# Take all apps enabled, and check if mail is one of them -# Then temporary disable the mail app -mail_app_must_be_reactived=0 - -if exec_occ app:list | awk '/Enabled/{f=1;next} /Disabled/{f=0} f' | grep -q -w mail; then - exec_occ app:disable mail - mail_app_must_be_reactived=1 -fi - -# While the current version is not the last version, do an upgrade -while [ "$last_version" != "$current_version" ] -do - next_major_version="$(( $current_major_version + 1 ))" - if [[ "$next_major_version" -ge "$last_major_version" ]]; then - ynh_print_info --message="Upgrading to Nextcloud $last_version" - cp -a ../sources/patches_last_version/* ../sources/patches - source_id="main" - else - ynh_print_info --message="Upgrading to Nextcloud $next_major_version" - source_id="$next_major_version" - fi - - # Create a temporary directory - tmpdir="${install_dir}__tmp_upgrade" - - ynh_setup_source --dest_dir="$tmpdir" --source_id="$source_id" - - # Backup the config file in the temp dir - cp -a "$install_dir/config/config.php" "$tmpdir/config/config.php" - - # Enable maintenance mode - exec_occ maintenance:mode --on - - # Backup 3rd party applications from the current Nextcloud - # But do not overwrite if there is any upgrade - # (apps directory already exists in Nextcloud archive) - ( - cd $install_dir/apps - for nc_app_dir in */ - do - if [ ! -d "$tmpdir/apps/$nc_app_dir" ] - then - cp -a "$nc_app_dir" "$tmpdir/apps/$nc_app_dir" - fi - done - ) - - # Replace the old Nextcloud by the new one - ynh_secure_remove --file="$install_dir" - mv "$tmpdir" "$install_dir" +if [ "$upgrade_type" == "UPGRADE_APP" ] +then + ynh_script_progression --message="Upgrading $app..." --weight=3 # Set write access for the following commands chown -R $app: "$install_dir" "$data_dir" - # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) - exec_occ maintenance:mode --off - exec_occ upgrade \ - || [ $? -eq 3 ] || ynh_die --message="Unable to upgrade $app" - - # Get the new current version number - current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) - current_major_version=${current_version%%.*} - # Print the current version number of Nextcloud exec_occ -V -done -exec_occ db:add-missing-indices -n -exec_occ db:add-missing-columns -n -exec_occ db:add-missing-primary-keys -n -exec_occ db:convert-filecache-bigint -n -#================================================= -# CONFIGURE NEXTCLOUD -#================================================= -ynh_script_progression --message="Reconfiguring $app..." --weight=9 + # Upgrade may fail if this app is enabled + # Take all apps enabled, and check if mail is one of them + # Then temporary disable the mail app + mail_app_must_be_reactived=0 -# Verify the checksum and backup the file if it's different -ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" + if exec_occ app:list | awk '/Enabled/{f=1;next} /Disabled/{f=0} f' | grep -q -w mail; then + exec_occ app:disable mail + mail_app_must_be_reactived=1 + fi -nc_conf="${install_dir}/config.json" -ynh_add_config --template="config.json" --destination="$nc_conf" + # While the current version is not the last version, do an upgrade + while [ "$last_version" != "$current_version" ] + do -# Reneable the mail app -if [ $mail_app_must_be_reactived -eq 1 ]; then - exec_occ app:enable mail -fi + next_major_version="$(( $current_major_version + 1 ))" + if [[ "$next_major_version" -ge "$last_major_version" ]]; then + ynh_print_info --message="Upgrading to Nextcloud $last_version" + cp -a ../sources/patches_last_version/* ../sources/patches + source_id="main" + else + ynh_print_info --message="Upgrading to Nextcloud $next_major_version" + source_id="$next_major_version" + fi -# Ensure that UpdateNotification app is disabled -exec_occ app:disable updatenotification + # Create a temporary directory + tmpdir="${install_dir}__tmp_upgrade" + + ynh_setup_source --dest_dir="$tmpdir" --source_id="$source_id" + + # Backup the config file in the temp dir + cp -a "$install_dir/config/config.php" "$tmpdir/config/config.php" + + # Enable maintenance mode + exec_occ maintenance:mode --on + + # Backup 3rd party applications from the current Nextcloud + # But do not overwrite if there is any upgrade + # (apps directory already exists in Nextcloud archive) + ( + cd $install_dir/apps + for nc_app_dir in */ + do + if [ ! -d "$tmpdir/apps/$nc_app_dir" ] + then + cp -a "$nc_app_dir" "$tmpdir/apps/$nc_app_dir" + fi + done + ) + + # Replace the old Nextcloud by the new one + ynh_secure_remove --file="$install_dir" + mv "$tmpdir" "$install_dir" + + # Set write access for the following commands + chown -R $app: "$install_dir" "$data_dir" + + # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) + exec_occ maintenance:mode --off + exec_occ upgrade \ + || [ $? -eq 3 ] || ynh_die --message="Unable to upgrade $app" + + # Get the new current version number + current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) + current_major_version=${current_version%%.*} + + # Print the current version number of Nextcloud + exec_occ -V + done -# Enable LDAP plugin -exec_occ app:enable user_ldap + exec_occ db:add-missing-indices -n + exec_occ db:add-missing-columns -n + exec_occ db:add-missing-primary-keys -n + exec_occ db:convert-filecache-bigint -n -# Update all installed apps -exec_occ app:update --all + #================================================= + # CONFIGURE NEXTCLOUD + #================================================= + ynh_script_progression --message="Reconfiguring $app..." --weight=9 -# move the logs from the data_dir to the standard /var/log -# it would be better in the ENSURE DOWNWARD COMPATIBILITY section -# but it must be after the exec_occ() definition, so it's here -if [ -f "$data_dir/data/nextcloud.log" ]; then - mkdir -p "/var/log/$app" - chmod 750 "/var/log/$app" - mv "$data_dir"/data/nextcloud.log* "/var/log/$app" - # adapt the nextcloud config - exec_occ config:system:set logfile --value="/var/log/$app/nextcloud.log" -fi + # Verify the checksum and backup the file if it's different + ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" -# Load the config file in nextcloud -exec_occ config:import "$nc_conf" + nc_conf="${install_dir}/config.json" + ynh_add_config --template="config.json" --destination="$nc_conf" -# Then remove the config file -ynh_secure_remove --file="$nc_conf" + # Reneable the mail app + if [ $mail_app_must_be_reactived -eq 1 ]; then + exec_occ app:enable mail + fi -#================================================= -# ALLOW USERS TO DISCONNECT FROM NEXTCLOUD -#================================================= + # Ensure that UpdateNotification app is disabled + exec_occ app:disable updatenotification -# Add dynamic logout URL to the config -exec_occ config:system:get logout_url >/dev/null 2>&1 \ -|| echo " -//-YunoHost- -// set logout_url according to main domain -\$main_domain = exec('cat /etc/yunohost/current_host'); -\$CONFIG['logout_url'] = 'https://'.\$main_domain.'/yunohost/sso/?action=logout'; -//-YunoHost- -" >> "$install_dir/config/config.php" + # Enable LDAP plugin + exec_occ app:enable user_ldap -#================================================= -# CHANGE HOSTNAME FOR ACTIVITY NOTIFICATIONS -#================================================= - -exec_occ config:system:set overwrite.cli.url --value="https://${domain}${path}" + # Update all installed apps + exec_occ app:update --all -#================================================= -# MOUNT HOME FOLDERS AS EXTERNAL STORAGE -#================================================= + # move the logs from the data_dir to the standard /var/log + # it would be better in the ENSURE DOWNWARD COMPATIBILITY section + # but it must be after the exec_occ() definition, so it's here + if [ -f "$data_dir/data/nextcloud.log" ]; then + mkdir -p "/var/log/$app" + chmod 750 "/var/log/$app" + mv "$data_dir"/data/nextcloud.log* "/var/log/$app" + # adapt the nextcloud config + exec_occ config:system:set logfile --value="/var/log/$app/nextcloud.log" + fi -# Enable External Storage and create local mount to home folder as needed -if [ $user_home -eq 1 ]; then - exec_occ app:enable files_external - exec_occ files_external:list --output=json \ - | grep -q '"storage":"\\\\OC\\\\Files\\\\Storage\\\\Local"' \ - || create_external_storage "/home/\$user" "Home" - # Iterate over users to extend their home folder permissions - for u in $(ynh_user_list); do - setfacl --modify g:$app:rwx "/home/$u" || true - done -fi + # Load the config file in nextcloud + exec_occ config:import "$nc_conf" + + # Then remove the config file + ynh_secure_remove --file="$nc_conf" + + #================================================= + # ALLOW USERS TO DISCONNECT FROM NEXTCLOUD + #================================================= + + # Add dynamic logout URL to the config + exec_occ config:system:get logout_url >/dev/null 2>&1 \ + || echo " + //-YunoHost- + // set logout_url according to main domain + \$main_domain = exec('cat /etc/yunohost/current_host'); + \$CONFIG['logout_url'] = 'https://'.\$main_domain.'/yunohost/sso/?action=logout'; + //-YunoHost- + " >> "$install_dir/config/config.php" + + #================================================= + # CHANGE HOSTNAME FOR ACTIVITY NOTIFICATIONS + #================================================= + + exec_occ config:system:set overwrite.cli.url --value="https://${domain}${path}" + + #================================================= + # MOUNT HOME FOLDERS AS EXTERNAL STORAGE + #================================================= + + # Enable External Storage and create local mount to home folder as needed + if [ $user_home -eq 1 ]; then + exec_occ app:enable files_external + exec_occ files_external:list --output=json \ + | grep -q '"storage":"\\\\OC\\\\Files\\\\Storage\\\\Local"' \ + || create_external_storage "/home/\$user" "Home" + # Iterate over users to extend their home folder permissions + for u in $(ynh_user_list); do + setfacl --modify g:$app:rwx "/home/$u" || true + done + fi -#================================================= -# STORE THE CHECKSUM OF THE CONFIG FILE -#================================================= + #================================================= + # STORE THE CHECKSUM OF THE CONFIG FILE + #================================================= -# Calculate and store the config file checksum into the app settings -ynh_store_file_checksum --file="${install_dir}/config/config.php" + # Calculate and store the config file checksum into the app settings + ynh_store_file_checksum --file="${install_dir}/config/config.php" +fi #================================================= # REGEN PERMISSIONS From a423112999c419544175bae6d6c75c624934a9d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 23 Apr 2024 18:48:11 +0200 Subject: [PATCH 104/354] 29 --- manifest.toml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 6f996260..4c4c8590 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "28.0.4~ynh2" +version = "29.0.0~ynh1" maintainers = ["kay0u"] @@ -66,8 +66,12 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.4.tar.bz2' - sha256 = '9bfecee1e12fba48c49e9a71caa81c4ba10b2884787fab75d64ccfd122a13019' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.0.tar.bz2' + sha256 = 'e9b53f6432b6f664487d3869645fa121a64cf0ed6aee83aa560903daf86b52bd' + + [resources.sources.28] + url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.0.tar.bz2' + sha256 = '4e8b0b74b40221e85f92ab869d0873c69a52d7e43889d9259c6259428a6a36f2' [resources.sources.27] url = 'https://download.nextcloud.com/server/releases/nextcloud-27.0.0.tar.bz2' From cca94605192e9016b00b4f5352b8ceb45e196322 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 23 Apr 2024 16:48:17 +0000 Subject: [PATCH 105/354] Auto-update READMEs --- README.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_zh_Hans.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7a0a2676..7a9e3035 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 28.0.4~ynh2 +**Shipped version:** 29.0.0~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 06763946..1802216d 100644 --- a/README_eu.md +++ b/README_eu.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Paketatutako bertsioa:** 28.0.4~ynh2 +**Paketatutako bertsioa:** 29.0.0~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index 91334c29..a6a50e40 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 28.0.4~ynh2 +**Version incluse :** 29.0.0~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index e0c30707..dd5d8404 100644 --- a/README_gl.md +++ b/README_gl.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión proporcionada:** 28.0.4~ynh2 +**Versión proporcionada:** 29.0.0~ynh1 **Demo:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index be0c5919..5161b308 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**分发版本:** 28.0.4~ynh2 +**分发版本:** 29.0.0~ynh1 **演示:** From 06a9c074ef88da505e7dfb792e6a130b41a76e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 23 Apr 2024 18:49:28 +0200 Subject: [PATCH 106/354] Update manifest.toml --- manifest.toml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index b847a94e..1b5ca0b1 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "28.0.4~ynh2" +version = "29.0.0~ynh1" maintainers = ["kay0u"] @@ -66,8 +66,12 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.4.tar.bz2' - sha256 = '9bfecee1e12fba48c49e9a71caa81c4ba10b2884787fab75d64ccfd122a13019' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.0.tar.bz2' + sha256 = 'e9b53f6432b6f664487d3869645fa121a64cf0ed6aee83aa560903daf86b52bd' + + [resources.sources.28] + url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.0.tar.bz2' + sha256 = '4e8b0b74b40221e85f92ab869d0873c69a52d7e43889d9259c6259428a6a36f2' [resources.sources.27] url = 'https://download.nextcloud.com/server/releases/nextcloud-27.0.0.tar.bz2' From e5d224a0520eca0b76769f3e85727d128acc8268 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 23 Apr 2024 16:49:33 +0000 Subject: [PATCH 107/354] Auto-update READMEs --- README.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_zh_Hans.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7a0a2676..7a9e3035 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 28.0.4~ynh2 +**Shipped version:** 29.0.0~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 06763946..1802216d 100644 --- a/README_eu.md +++ b/README_eu.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Paketatutako bertsioa:** 28.0.4~ynh2 +**Paketatutako bertsioa:** 29.0.0~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index 91334c29..a6a50e40 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 28.0.4~ynh2 +**Version incluse :** 29.0.0~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index e0c30707..dd5d8404 100644 --- a/README_gl.md +++ b/README_gl.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión proporcionada:** 28.0.4~ynh2 +**Versión proporcionada:** 29.0.0~ynh1 **Demo:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index be0c5919..5161b308 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**分发版本:** 28.0.4~ynh2 +**分发版本:** 29.0.0~ynh1 **演示:** From 3503f0e279c5d4f2820a96a4f1c6011cd058e3df Mon Sep 17 00:00:00 2001 From: OniriCorpe Date: Fri, 26 Apr 2024 22:27:11 +0200 Subject: [PATCH 108/354] add pre upgrade warning for NC 29 --- doc/PRE_UPGRADE.d/29.0.0~ynh1.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 doc/PRE_UPGRADE.d/29.0.0~ynh1.md diff --git a/doc/PRE_UPGRADE.d/29.0.0~ynh1.md b/doc/PRE_UPGRADE.d/29.0.0~ynh1.md new file mode 100644 index 00000000..75e3ae66 --- /dev/null +++ b/doc/PRE_UPGRADE.d/29.0.0~ynh1.md @@ -0,0 +1,5 @@ +If you are upgrading to a new major version of Nextcloud, please make sure that your Nextcloud apps are up to date from Nextcloud's administration panel beforehand. + +Additionally, if you installed specific Nextcloud apps, we recommend making sure that they are compatible with the new major version. +YunoHost will attempt to check this automatically at the very beginning of the upgrade, but a manual check doesn't hurt either. +For Nextcloud 29, this forum thread might be helpful : . From 1d0d3f159fd284669e435f486c2b37c231ff672d Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Fri, 17 May 2024 13:07:18 +0000 Subject: [PATCH 109/354] Auto-update READMEs --- ALL_README.md | 1 + README_es.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++ README_zh_Hans.md | 2 +- 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 README_es.md diff --git a/ALL_README.md b/ALL_README.md index a01b345b..8938aaec 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -1,6 +1,7 @@ # All available README files by language - [Read the README in English](README.md) +- [Lee el README en español](README_es.md) - [Irakurri README euskaraz](README_eu.md) - [Lire le README en français](README_fr.md) - [Le o README en galego](README_gl.md) diff --git a/README_es.md b/README_es.md new file mode 100644 index 00000000..5d0f6b06 --- /dev/null +++ b/README_es.md @@ -0,0 +1,61 @@ + + +# Nextcloud para Yunohost + +[![Nivel de integración](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![Estado funcional](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Estado En Mantención](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) + +[![Instalar Nextcloud con Yunhost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) + +*[Leer este README en otros idiomas.](./ALL_README.md)* + +> *Este paquete le permite instalarNextcloud rapidamente y simplement en un servidor YunoHost.* +> *Si no tiene YunoHost, visita [the guide](https://yunohost.org/install) para aprender como instalarla.* + +## Descripción general + +Nextcloud Hub is a fully open-source on-premises content collaboration platform. Teams access, share and edit their documents, chat and participate in video calls and manage their mail and calendar and projects across mobile, desktop and web interfaces. + +### YunoHost-specific features + +In addition to Nextcloud core features, the following are made available with this package: + + * Integrate with YunoHost users and SSO - i.e. logout button + * Allow one user to be the administrator (set at the installation) + * Allow multiple instances of this application + * Optionally access the user home folder from Nextcloud files (set at the installation, the sharing is enabled by default) + * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal + + +**Versión actual:** 29.0.0~ynh1 + +**Demo:** + +## Capturas + +![Captura de Nextcloud](./doc/screenshots/screenshot.png) + +## Documentaciones y recursos + +- Sitio web oficial: +- Documentación usuario oficial: +- Documentación administrador oficial: +- Repositorio del código fuente oficial de la aplicación : +- Catálogo YunoHost: +- Reportar un error: + +## Información para desarrolladores + +Por favor enviar sus correcciones a la [`branch testing`](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing + +Para probar la rama `testing`, sigue asÍ: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +o +sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +``` + +**Mas informaciones sobre el empaquetado de aplicaciones:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 5161b308..915e5c34 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -3,7 +3,7 @@ 请勿手动编辑。 --> -# YunoHost 的 Nextcloud +# YunoHost 上的 Nextcloud [![集成程度](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![工作状态](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![维护状态](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) From 6d0c2ce24f180b98c2da8d89c18aab19b142a124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 22 May 2024 23:03:20 +0200 Subject: [PATCH 110/354] update to PHP8.3 --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 1b5ca0b1..bb9bfd73 100644 --- a/manifest.toml +++ b/manifest.toml @@ -116,7 +116,7 @@ ram.runtime = "512M" api.allowed = ["visitors", "all_users"] [resources.apt] - packages = "mariadb-server, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, php8.2-fpm, php8.2-bz2, php8.2-imap, php8.2-gmp, php8.2-gd, php8.2-intl, php8.2-curl, php8.2-apcu, php8.2-redis, php8.2-ldap, php8.2-imagick, php8.2-zip, php8.2-mbstring, php8.2-xml, php8.2-mysql, php8.2-igbinary, php8.2-bcmath" + packages = "mariadb-server, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, php8.3-fpm, php8.3-bz2, php8.3-imap, php8.3-gmp, php8.3-gd, php8.3-intl, php8.3-curl, php8.3-apcu, php8.3-redis, php8.3-ldap, php8.3-imagick, php8.3-zip, php8.3-mbstring, php8.3-xml, php8.3-mysql, php8.3-igbinary, php8.3-bcmath" [resources.database] type = "mysql" From 2b1d579974cf563883317715451d4ecfceceea32 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 22 May 2024 21:03:25 +0000 Subject: [PATCH 111/354] Auto-update READMEs --- ALL_README.md | 1 + README_es.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++ README_zh_Hans.md | 2 +- 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 README_es.md diff --git a/ALL_README.md b/ALL_README.md index a01b345b..152f2e74 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -1,6 +1,7 @@ # All available README files by language - [Read the README in English](README.md) +- [Lea el README en español](README_es.md) - [Irakurri README euskaraz](README_eu.md) - [Lire le README en français](README_fr.md) - [Le o README en galego](README_gl.md) diff --git a/README_es.md b/README_es.md new file mode 100644 index 00000000..5d0f6b06 --- /dev/null +++ b/README_es.md @@ -0,0 +1,61 @@ + + +# Nextcloud para Yunohost + +[![Nivel de integración](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![Estado funcional](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Estado En Mantención](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) + +[![Instalar Nextcloud con Yunhost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) + +*[Leer este README en otros idiomas.](./ALL_README.md)* + +> *Este paquete le permite instalarNextcloud rapidamente y simplement en un servidor YunoHost.* +> *Si no tiene YunoHost, visita [the guide](https://yunohost.org/install) para aprender como instalarla.* + +## Descripción general + +Nextcloud Hub is a fully open-source on-premises content collaboration platform. Teams access, share and edit their documents, chat and participate in video calls and manage their mail and calendar and projects across mobile, desktop and web interfaces. + +### YunoHost-specific features + +In addition to Nextcloud core features, the following are made available with this package: + + * Integrate with YunoHost users and SSO - i.e. logout button + * Allow one user to be the administrator (set at the installation) + * Allow multiple instances of this application + * Optionally access the user home folder from Nextcloud files (set at the installation, the sharing is enabled by default) + * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal + + +**Versión actual:** 29.0.0~ynh1 + +**Demo:** + +## Capturas + +![Captura de Nextcloud](./doc/screenshots/screenshot.png) + +## Documentaciones y recursos + +- Sitio web oficial: +- Documentación usuario oficial: +- Documentación administrador oficial: +- Repositorio del código fuente oficial de la aplicación : +- Catálogo YunoHost: +- Reportar un error: + +## Información para desarrolladores + +Por favor enviar sus correcciones a la [`branch testing`](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing + +Para probar la rama `testing`, sigue asÍ: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +o +sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +``` + +**Mas informaciones sobre el empaquetado de aplicaciones:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 5161b308..915e5c34 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -3,7 +3,7 @@ 请勿手动编辑。 --> -# YunoHost 的 Nextcloud +# YunoHost 上的 Nextcloud [![集成程度](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![工作状态](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![维护状态](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) From 04b78947688231eadb37e2a08fb806d5ba7fe77c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 22 May 2024 23:06:38 +0200 Subject: [PATCH 112/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 4c4c8590..173b50f4 100644 --- a/manifest.toml +++ b/manifest.toml @@ -116,7 +116,7 @@ ram.runtime = "512M" api.allowed = ["visitors", "all_users"] [resources.apt] - packages = "postgresql, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, php8.2-pgsql, php8.2-mysql, php8.2-fpm, php8.2-bz2, php8.2-imap, php8.2-gmp, php8.2-gd, php8.2-intl, php8.2-curl, php8.2-apcu, php8.2-redis, php8.2-ldap, php8.2-imagick, php8.2-zip, php8.2-mbstring, php8.2-xml, php8.2-igbinary, php8.2-bcmath" + packages = "postgresql, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, php8.3-pgsql, php8.3-mysql, php8.3-fpm, php8.3-bz2, php8.3-imap, php8.3-gmp, php8.3-gd, php8.3-intl, php8.3-curl, php8.3-apcu, php8.3-redis, php8.3-ldap, php8.3-imagick, php8.3-zip, php8.3-mbstring, php8.3-xml, php8.3-igbinary, php8.3-bcmath" [resources.database] type = "postgresql" From 1ffe5e4c7df5bb2dab027e44d71691b640aff25b Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 22 May 2024 21:06:43 +0000 Subject: [PATCH 113/354] Auto-update READMEs --- ALL_README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ALL_README.md b/ALL_README.md index 8938aaec..152f2e74 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -1,7 +1,7 @@ # All available README files by language - [Read the README in English](README.md) -- [Lee el README en español](README_es.md) +- [Lea el README en español](README_es.md) - [Irakurri README euskaraz](README_eu.md) - [Lire le README en français](README_fr.md) - [Le o README en galego](README_gl.md) From cc263ecfeec1eeade2368aa1015bdfc214c5d9ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 23 May 2024 18:07:20 +0200 Subject: [PATCH 114/354] Update manifest.toml --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index bb9bfd73..4494372a 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.0~ynh1" +version = "29.0.1~ynh1" maintainers = ["kay0u"] @@ -66,8 +66,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.0.tar.bz2' - sha256 = 'e9b53f6432b6f664487d3869645fa121a64cf0ed6aee83aa560903daf86b52bd' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.1.tar.bz2' + sha256 = '759546daecf79ca787ed6705503693c6db553aabf1d7ae4dfa779c7309b2ada9' [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.0.tar.bz2' From 0d05a771e7b5f186aaeab552d2812136a4c40ea9 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 23 May 2024 16:07:27 +0000 Subject: [PATCH 115/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_zh_Hans.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7a9e3035..b4ac0414 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 29.0.0~ynh1 +**Shipped version:** 29.0.1~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 5d0f6b06..0af9c6b0 100644 --- a/README_es.md +++ b/README_es.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión actual:** 29.0.0~ynh1 +**Versión actual:** 29.0.1~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 1802216d..6b5a084a 100644 --- a/README_eu.md +++ b/README_eu.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Paketatutako bertsioa:** 29.0.0~ynh1 +**Paketatutako bertsioa:** 29.0.1~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index a6a50e40..5c8079f3 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 29.0.0~ynh1 +**Version incluse :** 29.0.1~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index dd5d8404..0f794134 100644 --- a/README_gl.md +++ b/README_gl.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión proporcionada:** 29.0.0~ynh1 +**Versión proporcionada:** 29.0.1~ynh1 **Demo:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 915e5c34..adc61aa0 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**分发版本:** 29.0.0~ynh1 +**分发版本:** 29.0.1~ynh1 **演示:** From 1b66d7f23a22785515780983973a00a6b10a4e06 Mon Sep 17 00:00:00 2001 From: lyyn <79758863+lyynd@users.noreply.github.com> Date: Sat, 1 Jun 2024 19:47:09 +0200 Subject: [PATCH 116/354] Fix space splitting in phpflags on install (#690) --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 9be9341f..88c1c0da 100755 --- a/scripts/install +++ b/scripts/install @@ -6,7 +6,7 @@ source _ynh_mysql_connect_as.sh phpflags="--define apc.enable_cli=1" -ynh_app_setting_set --app=$app --key=phpflags --value=$phpflags +ynh_app_setting_set --app=$app --key=phpflags --value="$phpflags" #================================================= # CREATE A MYSQL DATABASE From f6a8dc83e58477a275839b5e3f85a8e9178cb62d Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sat, 1 Jun 2024 17:49:30 +0000 Subject: [PATCH 117/354] Auto-update READMEs --- README_fr.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README_fr.md b/README_fr.md index 2a7d3e48..5c8079f3 100644 --- a/README_fr.md +++ b/README_fr.md @@ -28,6 +28,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Accès optionnel au répertoire home depuis les fichiers Nextcloud (à activer à l'installation, le partage étant activé par défaut) * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal + **Version incluse :** 29.0.1~ynh1 **Démo :** From 652d6de292901f18ac4a3744247702c814d0054e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 2 Jun 2024 09:37:46 +0200 Subject: [PATCH 118/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 9d11edf5..5dd1497f 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -16,7 +16,7 @@ ynh_app_setting_delete --app=$app --key=backup_core_only # If phpflags doesn't exist, create it if [ -z "${phpflags:-}" ]; then phpflags="--define apc.enable_cli=1" - ynh_app_setting_set --app=$app --key=phpflags --value=$phpflags + ynh_app_setting_set --app=$app --key=phpflags --value="$phpflags" fi if ynh_compare_current_package_version --comparison lt --version 22.2~ynh1 From 2fef2c7b344b40e7b73b0dda308bb641d5b3a3c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 3 Jun 2024 16:42:01 +0200 Subject: [PATCH 119/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 52aa8302..1493a58b 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -136,7 +136,7 @@ function list_installed_apps_not_compatible_with_future_version() } -last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9]') +last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9][0-9]') last_major_version=${last_version%%.*} if [[ "$last_major_version" != "$current_major_version" ]] From 253357a7dd0b70796ad829a70c434c6f521979e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 6 Jun 2024 15:25:01 +0200 Subject: [PATCH 120/354] Update manifest.toml --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 4494372a..0c899523 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.1~ynh1" +version = "29.0.2~ynh1" maintainers = ["kay0u"] @@ -66,8 +66,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.1.tar.bz2' - sha256 = '759546daecf79ca787ed6705503693c6db553aabf1d7ae4dfa779c7309b2ada9' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.2.tar.bz2' + sha256 = '2d49d297dc340092021057823e8e78a312bc00f56de7d8677ac790590918ab17' [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.0.tar.bz2' From cc45b8eba271367f0a283f192ceb5c632423194b Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 6 Jun 2024 13:25:07 +0000 Subject: [PATCH 121/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_zh_Hans.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b4ac0414..b892592b 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 29.0.1~ynh1 +**Shipped version:** 29.0.2~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 0af9c6b0..3ed8bc10 100644 --- a/README_es.md +++ b/README_es.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión actual:** 29.0.1~ynh1 +**Versión actual:** 29.0.2~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 6b5a084a..e1df5a33 100644 --- a/README_eu.md +++ b/README_eu.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Paketatutako bertsioa:** 29.0.1~ynh1 +**Paketatutako bertsioa:** 29.0.2~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index 5c8079f3..0bb2d4d5 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 29.0.1~ynh1 +**Version incluse :** 29.0.2~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 0f794134..bbd9686b 100644 --- a/README_gl.md +++ b/README_gl.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión proporcionada:** 29.0.1~ynh1 +**Versión proporcionada:** 29.0.2~ynh1 **Demo:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index adc61aa0..d97e0ed5 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**分发版本:** 29.0.1~ynh1 +**分发版本:** 29.0.2~ynh1 **演示:** From 38c2ecc3659f55165fef781f96bf0c00a28fa1be Mon Sep 17 00:00:00 2001 From: tituspijean Date: Sat, 8 Jun 2024 08:01:04 +0200 Subject: [PATCH 122/354] Fix phpflags (#691) --- scripts/upgrade | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 5dd1497f..7dd9a828 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -13,11 +13,8 @@ ynh_script_progression --message="Ensuring downward compatibility..." # Remove the option backup_core_only if it's in the settings.yml file ynh_app_setting_delete --app=$app --key=backup_core_only -# If phpflags doesn't exist, create it -if [ -z "${phpflags:-}" ]; then - phpflags="--define apc.enable_cli=1" - ynh_app_setting_set --app=$app --key=phpflags --value="$phpflags" -fi +phpflags="--define apc.enable_cli=1" +ynh_app_setting_set --app=$app --key=phpflags --value="$phpflags" if ynh_compare_current_package_version --comparison lt --version 22.2~ynh1 then From 1c3536c13040c1b6b6f29578ad5db8e0387d4626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:34:48 +0200 Subject: [PATCH 123/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 1493a58b..df141873 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -76,7 +76,7 @@ exec_occ() { #================================================= # If we're moving through version 28.0.2~ynh1 (in which the switch to psql is made) -if ynh_compare_current_package_version --comparison lt --version 28.0.2~ynh2 +if ynh_compare_current_package_version --comparison lt --version 29.0.2~ynh1 then # Double-check the MySQL DB is here if ! mysql -e "USE $db_name" 2>/dev/null From 73a3f0d699f00a07bc919992d0db430b1f6abfbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:35:04 +0200 Subject: [PATCH 124/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index df141873..63fb3ef3 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -75,7 +75,7 @@ exec_occ() { # HANDLE DATABASE MIGRATION FROM MYSL TO PSQL #================================================= -# If we're moving through version 28.0.2~ynh1 (in which the switch to psql is made) +# If we're moving through version 29.0.2~ynh1 (in which the switch to psql is made) if ynh_compare_current_package_version --comparison lt --version 29.0.2~ynh1 then # Double-check the MySQL DB is here From 36cd0dc73d2a7281fb95ba55a6c8d4d14caaeb20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:59:45 +0200 Subject: [PATCH 125/354] Update upgrade --- scripts/upgrade | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 63fb3ef3..4fda8da0 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -19,10 +19,10 @@ if [ -z "${phpflags:-}" ]; then ynh_app_setting_set --app=$app --key=phpflags --value="$phpflags" fi -if ynh_compare_current_package_version --comparison lt --version 22.2~ynh1 -then - ynh_die --message="Upgrading from Nextcloud < 22.2 is not supported anymore. You should first upgrade to 22.2 using: yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/41f5f902e7c7cd3c30a6793020562ba98b9bf3e9" -fi +#if ynh_compare_current_package_version --comparison lt --version 22.2~ynh1 +#then +# ynh_die --message="Upgrading from Nextcloud < 22.2 is not supported anymore. You should first upgrade to 22.2 using: yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/41f5f902e7c7cd3c30a6793020562ba98b9bf3e9" +#fi #================================================= # SPECIFIC UPGRADE From 361f046f282d67fcf57022721c117c37620f6f57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:00:09 +0200 Subject: [PATCH 126/354] Update upgrade --- scripts/upgrade | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 4fda8da0..63fb3ef3 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -19,10 +19,10 @@ if [ -z "${phpflags:-}" ]; then ynh_app_setting_set --app=$app --key=phpflags --value="$phpflags" fi -#if ynh_compare_current_package_version --comparison lt --version 22.2~ynh1 -#then -# ynh_die --message="Upgrading from Nextcloud < 22.2 is not supported anymore. You should first upgrade to 22.2 using: yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/41f5f902e7c7cd3c30a6793020562ba98b9bf3e9" -#fi +if ynh_compare_current_package_version --comparison lt --version 22.2~ynh1 +then + ynh_die --message="Upgrading from Nextcloud < 22.2 is not supported anymore. You should first upgrade to 22.2 using: yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/41f5f902e7c7cd3c30a6793020562ba98b9bf3e9" +fi #================================================= # SPECIFIC UPGRADE From 1ab6c01c984736b13a4eb0e4bffa898caf474320 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Date: Thu, 20 Jun 2024 19:15:15 +0200 Subject: [PATCH 127/354] Fix upgrade: php version is 8.3 starting from 29.x ? (#692) --- scripts/upgrade | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 7dd9a828..418770ff 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -39,7 +39,10 @@ filter_boring_occ_warnings() { # Define a function to execute commands with `occ` exec_occ() { # Backward compatibility to upgrade from older versions - if [ $current_major_version = "last" ] || [ $current_major_version -ge 26 ] + if [ $current_major_version = "last" ] + then + NEXTCLOUD_PHP_VERSION="8.3" + elif [ $current_major_version -ge 26 ] then NEXTCLOUD_PHP_VERSION="8.2" elif [ $current_major_version -ge 24 ] From ef6d230ffec3b2c1abcc9b80cbed7d4ca38f921c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 20 Jun 2024 19:16:36 +0200 Subject: [PATCH 128/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 0c899523..0e38f3f2 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.2~ynh1" +version = "29.0.2~ynh2" maintainers = ["kay0u"] From 6aa78213260e8e306f19c3c880b90daac1127612 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 20 Jun 2024 17:16:48 +0000 Subject: [PATCH 129/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_zh_Hans.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b892592b..468c8397 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 29.0.2~ynh1 +**Shipped version:** 29.0.2~ynh2 **Demo:** diff --git a/README_es.md b/README_es.md index 3ed8bc10..b90a3d8c 100644 --- a/README_es.md +++ b/README_es.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión actual:** 29.0.2~ynh1 +**Versión actual:** 29.0.2~ynh2 **Demo:** diff --git a/README_eu.md b/README_eu.md index e1df5a33..40b4c1ab 100644 --- a/README_eu.md +++ b/README_eu.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Paketatutako bertsioa:** 29.0.2~ynh1 +**Paketatutako bertsioa:** 29.0.2~ynh2 **Demoa:** diff --git a/README_fr.md b/README_fr.md index 0bb2d4d5..80de7d92 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 29.0.2~ynh1 +**Version incluse :** 29.0.2~ynh2 **Démo :** diff --git a/README_gl.md b/README_gl.md index bbd9686b..387f9882 100644 --- a/README_gl.md +++ b/README_gl.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión proporcionada:** 29.0.2~ynh1 +**Versión proporcionada:** 29.0.2~ynh2 **Demo:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index d97e0ed5..3a6e3984 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**分发版本:** 29.0.2~ynh1 +**分发版本:** 29.0.2~ynh2 **演示:** From 6870be098bc604e12886afe8fbf1746de767ae48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 20 Jun 2024 19:17:52 +0200 Subject: [PATCH 130/354] Update tests.toml --- tests.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests.toml b/tests.toml index 0e8e459a..eb4b3634 100644 --- a/tests.toml +++ b/tests.toml @@ -9,4 +9,4 @@ test_format = 1.0 test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" - \ No newline at end of file + test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" From 89899fd7092dd1612c6626402d57c0104c3029d2 Mon Sep 17 00:00:00 2001 From: YunoHost Bot Date: Sun, 23 Jun 2024 02:54:07 +0200 Subject: [PATCH 131/354] [autopatch] Do not delete logs on app removal (#697) --- scripts/remove | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/remove b/scripts/remove index f8d582fe..e1c98c62 100755 --- a/scripts/remove +++ b/scripts/remove @@ -16,8 +16,6 @@ ynh_remove_nginx_config # Remove the dedicated PHP-FPM config ynh_remove_fpm_config -# remove logs -ynh_secure_remove --file="/var/log/$app" # Remove the app-specific logrotate config ynh_remove_logrotate From 2f0cfe5ebbca69d3cc204088abd13fad4568d470 Mon Sep 17 00:00:00 2001 From: YunoHost Bot Date: Sun, 23 Jun 2024 09:00:08 +0200 Subject: [PATCH 132/354] [autopatch] Do not delete logs on app removal (#698) Co-authored-by: Yunohost-Bot <> From d848e736a1dc94f46d4afc3f6af6fbe22a7e8bc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:36:30 +0200 Subject: [PATCH 133/354] 29.0.3 --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 0e38f3f2..ef01371e 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.2~ynh2" +version = "29.0.3~ynh1" maintainers = ["kay0u"] @@ -66,8 +66,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.2.tar.bz2' - sha256 = '2d49d297dc340092021057823e8e78a312bc00f56de7d8677ac790590918ab17' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.3.tar.bz2' + sha256 = 'a5996e764c120927f8844d8f5b28c736b8e2f3280b120be13a2bd7731cdb7fd4' [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.0.tar.bz2' From e584e31721dd0a756bb584917cd47ecb8e94f7d6 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 25 Jun 2024 13:36:41 +0000 Subject: [PATCH 134/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_zh_Hans.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 468c8397..3c548fd3 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 29.0.2~ynh2 +**Shipped version:** 29.0.3~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index b90a3d8c..594c0cb8 100644 --- a/README_es.md +++ b/README_es.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión actual:** 29.0.2~ynh2 +**Versión actual:** 29.0.3~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 40b4c1ab..a72230bb 100644 --- a/README_eu.md +++ b/README_eu.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Paketatutako bertsioa:** 29.0.2~ynh2 +**Paketatutako bertsioa:** 29.0.3~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index 80de7d92..814c1d7f 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 29.0.2~ynh2 +**Version incluse :** 29.0.3~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 387f9882..9abd0978 100644 --- a/README_gl.md +++ b/README_gl.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión proporcionada:** 29.0.2~ynh2 +**Versión proporcionada:** 29.0.3~ynh1 **Demo:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 3a6e3984..a9c8d4f9 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**分发版本:** 29.0.2~ynh2 +**分发版本:** 29.0.3~ynh1 **演示:** From 26bfa59cb45ad6dadb4ac6583b33a19926ca7dc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:36:46 +0200 Subject: [PATCH 135/354] Update remove --- scripts/remove | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/remove b/scripts/remove index e1c98c62..c39ac68c 100755 --- a/scripts/remove +++ b/scripts/remove @@ -16,7 +16,6 @@ ynh_remove_nginx_config # Remove the dedicated PHP-FPM config ynh_remove_fpm_config - # Remove the app-specific logrotate config ynh_remove_logrotate From 2d4ff6bfbf76884009a0a1f997e9fd216c3889dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:44:07 +0200 Subject: [PATCH 136/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 2821d65a..b369cb43 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -76,7 +76,7 @@ exec_occ() { #================================================= # If we're moving through version 29.0.2~ynh1 (in which the switch to psql is made) -if ynh_compare_current_package_version --comparison lt --version 29.0.2~ynh1 +if ynh_compare_current_package_version --comparison lt --version 29.0.3~ynh1 then # Double-check the MySQL DB is here if ! mysql -e "USE $db_name" 2>/dev/null From 1583a7c9c4d30332c3aaa5d222b03a1826150bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:47:53 +0200 Subject: [PATCH 137/354] Update upgrade --- scripts/upgrade | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index b369cb43..5f1e6657 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -75,26 +75,26 @@ exec_occ() { # HANDLE DATABASE MIGRATION FROM MYSL TO PSQL #================================================= -# If we're moving through version 29.0.2~ynh1 (in which the switch to psql is made) -if ynh_compare_current_package_version --comparison lt --version 29.0.3~ynh1 -then - # Double-check the MySQL DB is here - if ! mysql -e "USE $db_name" 2>/dev/null - then - ynh_print_warn "Uhoh? The Nextcloud MySQL DB doesn't exist? We are supposed to move it to PostgreSQL... Maybe it was already migrated?" - # Double check the psql is not empty, otherwise big whoops? - if [[ "$(ynh_psql_execute_as_root --database=$db_name --sql="\dt" 2>/dev/null | wc -l)" == 0 ]] - then - ynh_die "Apparently the PostgreSQL DB is also empty, this is kind of worrying, what happened?!" - else - ynh_print_warn "Apparently the PostgreSQL DB is not empty, so this is probably OK?" - fi - else - ynh_print_info --message="Migrating to PostgreSQL database..." - ynh_exec_warn_less exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n - ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name - fi -fi +# # If we're moving through version 29.0.3~ynh1 (in which the switch to psql is made) +# if ynh_compare_current_package_version --comparison lt --version 29.0.3~ynh1 +# then +# # Double-check the MySQL DB is here +# if ! mysql -e "USE $db_name" 2>/dev/null +# then +# ynh_print_warn "Uhoh? The Nextcloud MySQL DB doesn't exist? We are supposed to move it to PostgreSQL... Maybe it was already migrated?" +# # Double check the psql is not empty, otherwise big whoops? +# if [[ "$(ynh_psql_execute_as_root --database=$db_name --sql="\dt" 2>/dev/null | wc -l)" == 0 ]] +# then +# ynh_die "Apparently the PostgreSQL DB is also empty, this is kind of worrying, what happened?!" +# else +# ynh_print_warn "Apparently the PostgreSQL DB is not empty, so this is probably OK?" +# fi +# else +# ynh_print_info --message="Migrating to PostgreSQL database..." +# ynh_exec_warn_less exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n +# ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name +# fi +# fi #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE From 4d8b668ebfa7cb4a1d3cd06780bfb2b1f64d830c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:49:58 +0200 Subject: [PATCH 138/354] Update upgrade --- scripts/upgrade | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 5f1e6657..089b8476 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -75,26 +75,26 @@ exec_occ() { # HANDLE DATABASE MIGRATION FROM MYSL TO PSQL #================================================= -# # If we're moving through version 29.0.3~ynh1 (in which the switch to psql is made) -# if ynh_compare_current_package_version --comparison lt --version 29.0.3~ynh1 -# then -# # Double-check the MySQL DB is here -# if ! mysql -e "USE $db_name" 2>/dev/null -# then -# ynh_print_warn "Uhoh? The Nextcloud MySQL DB doesn't exist? We are supposed to move it to PostgreSQL... Maybe it was already migrated?" -# # Double check the psql is not empty, otherwise big whoops? -# if [[ "$(ynh_psql_execute_as_root --database=$db_name --sql="\dt" 2>/dev/null | wc -l)" == 0 ]] -# then -# ynh_die "Apparently the PostgreSQL DB is also empty, this is kind of worrying, what happened?!" -# else -# ynh_print_warn "Apparently the PostgreSQL DB is not empty, so this is probably OK?" -# fi -# else -# ynh_print_info --message="Migrating to PostgreSQL database..." -# ynh_exec_warn_less exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n -# ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name -# fi -# fi +# If we're moving through version 29.0.3~ynh1 (in which the switch to psql is made) +if ynh_compare_current_package_version --comparison lt --version 29.0.3~ynh1 +then + # Double-check the MySQL DB is here + if ! mysql -e "USE $db_name" 2>/dev/null + then + ynh_print_warn "Uhoh? The Nextcloud MySQL DB doesn't exist? We are supposed to move it to PostgreSQL... Maybe it was already migrated?" + # Double check the psql is not empty, otherwise big whoops? + if [[ "$(ynh_psql_execute_as_root --database=$db_name --sql="\dt" 2>/dev/null | wc -l)" == 0 ]] + then + ynh_die "Apparently the PostgreSQL DB is also empty, this is kind of worrying, what happened?!" + else + ynh_print_warn "Apparently the PostgreSQL DB is not empty, so this is probably OK?" + fi + else + ynh_print_info --message="Migrating to PostgreSQL database..." + ynh_exec_warn_less exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n + ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name + fi +fi #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE From 88fbb734c86f45f62c1a0c9371418036d4ead738 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 27 Jun 2024 11:33:57 +0200 Subject: [PATCH 139/354] Indent --- scripts/upgrade | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 418770ff..8252a9b3 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -71,13 +71,13 @@ exec_occ() { # Define a function to add an external storage # Create the external storage for the given folders and enable sharing create_external_storage() { -local mount_dir="$1" -local mount_name="$2" -local mount_id=$(exec_occ files_external:create --output=json \ - "$mount_name" 'local' 'null::null' -c "datadir=$mount_dir" || true) -! [[ $mount_id =~ ^[0-9]+$ ]] \ - && ynh_print_warn --message="Unable to create external storage" \ - || exec_occ files_external:option "$mount_id" enable_sharing true + local mount_dir="$1" + local mount_name="$2" + local mount_id=$(exec_occ files_external:create --output=json \ + "$mount_name" 'local' 'null::null' -c "datadir=$mount_dir" || true) + ! [[ $mount_id =~ ^[0-9]+$ ]] \ + && ynh_print_warn --message="Unable to create external storage" \ + || exec_occ files_external:option "$mount_id" enable_sharing true } function list_installed_apps_not_compatible_with_future_version() From f7c21e467e32c5e51bcf07c8663ecaf5edc9d699 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 27 Jun 2024 11:35:00 +0200 Subject: [PATCH 140/354] Fix again upgrade ending with Nextcloud being in PHP 8.2 ? --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 8252a9b3..c2ddc1d9 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -39,7 +39,7 @@ filter_boring_occ_warnings() { # Define a function to execute commands with `occ` exec_occ() { # Backward compatibility to upgrade from older versions - if [ $current_major_version = "last" ] + if [ $current_major_version = "$last_major_version" ] then NEXTCLOUD_PHP_VERSION="8.3" elif [ $current_major_version -ge 26 ] From b96736ad64d08aac524667b677d912d36b74886d Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 27 Jun 2024 09:35:08 +0000 Subject: [PATCH 141/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_zh_Hans.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3c548fd3..da9c32c3 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ It shall NOT be edited by hand. # Nextcloud for YunoHost -[![Integration level](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![Working status](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Working status](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) [![Install Nextcloud with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_es.md b/README_es.md index 594c0cb8..af9d2629 100644 --- a/README_es.md +++ b/README_es.md @@ -5,7 +5,7 @@ No se debe editar a mano. # Nextcloud para Yunohost -[![Nivel de integración](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![Estado funcional](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Estado En Mantención](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Nivel de integración](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Estado funcional](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Estado En Mantención](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) [![Instalar Nextcloud con Yunhost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_eu.md b/README_eu.md index a72230bb..0be7b88e 100644 --- a/README_eu.md +++ b/README_eu.md @@ -5,7 +5,7 @@ EZ editatu eskuz. # Nextcloud YunoHost-erako -[![Integrazio maila](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![Funtzionamendu egoera](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Mantentze egoera](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Integrazio maila](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Funtzionamendu egoera](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Mantentze egoera](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) [![Instalatu Nextcloud YunoHost-ekin](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_fr.md b/README_fr.md index 814c1d7f..cf2fbfb2 100644 --- a/README_fr.md +++ b/README_fr.md @@ -5,7 +5,7 @@ Il NE doit PAS être modifié à la main. # Nextcloud pour YunoHost -[![Niveau d’intégration](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Niveau d’intégration](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) [![Installer Nextcloud avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_gl.md b/README_gl.md index 9abd0978..6e3bf79b 100644 --- a/README_gl.md +++ b/README_gl.md @@ -5,7 +5,7 @@ NON debe editarse manualmente. # Nextcloud para YunoHost -[![Nivel de integración](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![Estado de funcionamento](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Estado de mantemento](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Nivel de integración](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Estado de funcionamento](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Estado de mantemento](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) [![Instalar Nextcloud con YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_zh_Hans.md b/README_zh_Hans.md index a9c8d4f9..1f71c2b3 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -5,7 +5,7 @@ # YunoHost 上的 Nextcloud -[![集成程度](https://dash.yunohost.org/integration/nextcloud.svg)](https://dash.yunohost.org/appci/app/nextcloud) ![工作状态](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![维护状态](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![集成程度](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![工作状态](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![维护状态](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) [![使用 YunoHost 安装 Nextcloud](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) From d9b99c496db43d6c4c55d21d0cb3334852e640bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 27 Jun 2024 16:06:12 +0200 Subject: [PATCH 142/354] Update upgrade --- scripts/upgrade | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index 04045f8e..a616b8e2 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -135,6 +135,8 @@ function list_installed_apps_not_compatible_with_future_version() comm -23 <(comm -23 $installed_apps $core_apps_in_current_version) $nextcloud_destination_appcatalog } +current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) +current_major_version=${current_version%%.*} last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9][0-9]') last_major_version=${last_version%%.*} From 42ae252c078eb3798c34cd0d20482ce7e4b59221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 1 Jul 2024 15:05:46 +0200 Subject: [PATCH 143/354] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 0300bad6..5a4f22a3 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -102,7 +102,7 @@ location ^~ __PATH__/ { # `/nextcloud/index.php` to the URI, resulting in a HTTP 500 error response. location ~ \.php(?:$|/) { # Required for legacy support - rewrite ^__PATH__/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode\/proxy|.+\/richdocumentscode_arm64\/proxy) __PATH__/index.php$request_uri; + rewrite ^__PATH__/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode(_arm64)?\/proxy) __PATH__/index.php$request_uri; fastcgi_split_path_info ^(.+?\.php)(/.*)$; set $path_info $fastcgi_path_info; From 9fcb43a0bf94b3bb7aa740984330589102cd9e5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 18 Jul 2024 14:49:44 +0200 Subject: [PATCH 144/354] Update manifest.toml --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index ef01371e..4cf5e999 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.3~ynh1" +version = "29.0.4~ynh1" maintainers = ["kay0u"] @@ -66,8 +66,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.3.tar.bz2' - sha256 = 'a5996e764c120927f8844d8f5b28c736b8e2f3280b120be13a2bd7731cdb7fd4' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.4.tar.bz2' + sha256 = '19c469e264b31ee80400f8396460854546569e88db4c15fc0854e192f96027eb' [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.0.tar.bz2' From 49e88d894995d3096367581a39f64fd3a5eafc1e Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 18 Jul 2024 12:49:49 +0000 Subject: [PATCH 145/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_zh_Hans.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index da9c32c3..b9dea00a 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 29.0.3~ynh1 +**Shipped version:** 29.0.4~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index af9d2629..b8685717 100644 --- a/README_es.md +++ b/README_es.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión actual:** 29.0.3~ynh1 +**Versión actual:** 29.0.4~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 0be7b88e..5a1609e8 100644 --- a/README_eu.md +++ b/README_eu.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Paketatutako bertsioa:** 29.0.3~ynh1 +**Paketatutako bertsioa:** 29.0.4~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index cf2fbfb2..0b9ec937 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 29.0.3~ynh1 +**Version incluse :** 29.0.4~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 6e3bf79b..939c2a41 100644 --- a/README_gl.md +++ b/README_gl.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión proporcionada:** 29.0.3~ynh1 +**Versión proporcionada:** 29.0.4~ynh1 **Demo:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 1f71c2b3..eb9b198f 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**分发版本:** 29.0.3~ynh1 +**分发版本:** 29.0.4~ynh1 **演示:** From 0742c9903d76fb47d6490b422859c25401a6a640 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 18 Jul 2024 13:25:24 +0000 Subject: [PATCH 146/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_zh_Hans.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index da9c32c3..b9dea00a 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Shipped version:** 29.0.3~ynh1 +**Shipped version:** 29.0.4~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index af9d2629..b8685717 100644 --- a/README_es.md +++ b/README_es.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión actual:** 29.0.3~ynh1 +**Versión actual:** 29.0.4~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 0be7b88e..5a1609e8 100644 --- a/README_eu.md +++ b/README_eu.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Paketatutako bertsioa:** 29.0.3~ynh1 +**Paketatutako bertsioa:** 29.0.4~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index cf2fbfb2..0b9ec937 100644 --- a/README_fr.md +++ b/README_fr.md @@ -29,7 +29,7 @@ En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suiv * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal -**Version incluse :** 29.0.3~ynh1 +**Version incluse :** 29.0.4~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 6e3bf79b..939c2a41 100644 --- a/README_gl.md +++ b/README_gl.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**Versión proporcionada:** 29.0.3~ynh1 +**Versión proporcionada:** 29.0.4~ynh1 **Demo:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 1f71c2b3..eb9b198f 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -29,7 +29,7 @@ In addition to Nextcloud core features, the following are made available with th * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal -**分发版本:** 29.0.3~ynh1 +**分发版本:** 29.0.4~ynh1 **演示:** From 70e9e721f227fef70ae015c6a8db0938888d36b7 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Date: Thu, 18 Jul 2024 17:29:39 +0200 Subject: [PATCH 147/354] Rework DESCRIPTION.md (#707) * Update DESCRIPTION_fr.md * Auto-update READMEs * Update DESCRIPTION.md * Auto-update READMEs * Update DESCRIPTION_fr.md * Auto-update READMEs --------- Co-authored-by: yunohost-bot --- README.md | 12 +++--------- README_es.md | 12 +++--------- README_eu.md | 12 +++--------- README_fr.md | 12 +++--------- README_gl.md | 12 +++--------- README_zh_Hans.md | 12 +++--------- doc/DESCRIPTION.md | 12 +++--------- doc/DESCRIPTION_fr.md | 12 +++--------- 8 files changed, 24 insertions(+), 72 deletions(-) diff --git a/README.md b/README.md index b9dea00a..81eb8a69 100644 --- a/README.md +++ b/README.md @@ -16,17 +16,11 @@ It shall NOT be edited by hand. ## Overview -Nextcloud Hub is a fully open-source on-premises content collaboration platform. Teams access, share and edit their documents, chat and participate in video calls and manage their mail and calendar and projects across mobile, desktop and web interfaces. +Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -### YunoHost-specific features +In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). -In addition to Nextcloud core features, the following are made available with this package: - - * Integrate with YunoHost users and SSO - i.e. logout button - * Allow one user to be the administrator (set at the installation) - * Allow multiple instances of this application - * Optionally access the user home folder from Nextcloud files (set at the installation, the sharing is enabled by default) - * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal +The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. **Shipped version:** 29.0.4~ynh1 diff --git a/README_es.md b/README_es.md index b8685717..9b75f1c2 100644 --- a/README_es.md +++ b/README_es.md @@ -16,17 +16,11 @@ No se debe editar a mano. ## Descripción general -Nextcloud Hub is a fully open-source on-premises content collaboration platform. Teams access, share and edit their documents, chat and participate in video calls and manage their mail and calendar and projects across mobile, desktop and web interfaces. +Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -### YunoHost-specific features +In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). -In addition to Nextcloud core features, the following are made available with this package: - - * Integrate with YunoHost users and SSO - i.e. logout button - * Allow one user to be the administrator (set at the installation) - * Allow multiple instances of this application - * Optionally access the user home folder from Nextcloud files (set at the installation, the sharing is enabled by default) - * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal +The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. **Versión actual:** 29.0.4~ynh1 diff --git a/README_eu.md b/README_eu.md index 5a1609e8..8b722e45 100644 --- a/README_eu.md +++ b/README_eu.md @@ -16,17 +16,11 @@ EZ editatu eskuz. ## Aurreikuspena -Nextcloud Hub is a fully open-source on-premises content collaboration platform. Teams access, share and edit their documents, chat and participate in video calls and manage their mail and calendar and projects across mobile, desktop and web interfaces. +Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -### YunoHost-specific features +In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). -In addition to Nextcloud core features, the following are made available with this package: - - * Integrate with YunoHost users and SSO - i.e. logout button - * Allow one user to be the administrator (set at the installation) - * Allow multiple instances of this application - * Optionally access the user home folder from Nextcloud files (set at the installation, the sharing is enabled by default) - * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal +The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. **Paketatutako bertsioa:** 29.0.4~ynh1 diff --git a/README_fr.md b/README_fr.md index 0b9ec937..f59d5831 100644 --- a/README_fr.md +++ b/README_fr.md @@ -16,17 +16,11 @@ Il NE doit PAS être modifié à la main. ## Vue d’ensemble -Nextcloud Hub est la plate-forme de collaboration de contenu sur site entièrement open source. Les équipes accèdent, partagent et modifient leurs documents, discutent et participent à des appels vidéo et gèrent leur courrier, leur calendrier et leurs projets sur des interfaces mobiles, de bureau et Web. +Nextcloud permet de rendre accessible et de synchroniser ses données, fichiers, contacts, agendas entre différents appareils (ordinateurs ou mobiles), ou de les partager avec d'autres personnes (avec ou sans comptes), et propose également des fonctionnalités avancées de communication et de travail collaboratif. Nextcloud dispose de son propre mécanisme d'applications (voir aussi [le store d'apps de Nextcloud](https://apps.nextcloud.com/)) pour disposer des fonctionnalités spécifiques. -### Caractéristiques spécifiques YunoHost +Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateur (les comptes YunoHost sont automatiquements connectés à Nextcloud). -En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suivantes sont incluses dans ce package : - - * Intégration avec les utilisateurs YunoHost et le SSO - exemple, le bouton de déconnexion - * Permet à un utilisateur d'être l'administrateur (choisi à l'installation) - * Permet de multiples instances de cette application - * Accès optionnel au répertoire home depuis les fichiers Nextcloud (à activer à l'installation, le partage étant activé par défaut) - * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal +L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. **Version incluse :** 29.0.4~ynh1 diff --git a/README_gl.md b/README_gl.md index 939c2a41..9a823a38 100644 --- a/README_gl.md +++ b/README_gl.md @@ -16,17 +16,11 @@ NON debe editarse manualmente. ## Vista xeral -Nextcloud Hub is a fully open-source on-premises content collaboration platform. Teams access, share and edit their documents, chat and participate in video calls and manage their mail and calendar and projects across mobile, desktop and web interfaces. +Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -### YunoHost-specific features +In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). -In addition to Nextcloud core features, the following are made available with this package: - - * Integrate with YunoHost users and SSO - i.e. logout button - * Allow one user to be the administrator (set at the installation) - * Allow multiple instances of this application - * Optionally access the user home folder from Nextcloud files (set at the installation, the sharing is enabled by default) - * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal +The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. **Versión proporcionada:** 29.0.4~ynh1 diff --git a/README_zh_Hans.md b/README_zh_Hans.md index eb9b198f..465182e3 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -16,17 +16,11 @@ ## 概况 -Nextcloud Hub is a fully open-source on-premises content collaboration platform. Teams access, share and edit their documents, chat and participate in video calls and manage their mail and calendar and projects across mobile, desktop and web interfaces. +Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -### YunoHost-specific features +In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). -In addition to Nextcloud core features, the following are made available with this package: - - * Integrate with YunoHost users and SSO - i.e. logout button - * Allow one user to be the administrator (set at the installation) - * Allow multiple instances of this application - * Optionally access the user home folder from Nextcloud files (set at the installation, the sharing is enabled by default) - * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal +The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. **分发版本:** 29.0.4~ynh1 diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 3d35dc46..67150c8f 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1,11 +1,5 @@ -Nextcloud Hub is a fully open-source on-premises content collaboration platform. Teams access, share and edit their documents, chat and participate in video calls and manage their mail and calendar and projects across mobile, desktop and web interfaces. +Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -### YunoHost-specific features +In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). -In addition to Nextcloud core features, the following are made available with this package: - - * Integrate with YunoHost users and SSO - i.e. logout button - * Allow one user to be the administrator (set at the installation) - * Allow multiple instances of this application - * Optionally access the user home folder from Nextcloud files (set at the installation, the sharing is enabled by default) - * Serve `/.well-known` paths for CalDAV and CardDAV on the domain only if it's not already served - i.e. by Baïkal +The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. diff --git a/doc/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md index 6131f487..b9229dc0 100644 --- a/doc/DESCRIPTION_fr.md +++ b/doc/DESCRIPTION_fr.md @@ -1,11 +1,5 @@ -Nextcloud Hub est la plate-forme de collaboration de contenu sur site entièrement open source. Les équipes accèdent, partagent et modifient leurs documents, discutent et participent à des appels vidéo et gèrent leur courrier, leur calendrier et leurs projets sur des interfaces mobiles, de bureau et Web. +Nextcloud permet de rendre accessible et de synchroniser ses données, fichiers, contacts, agendas entre différents appareils (ordinateurs ou mobiles), ou de les partager avec d'autres personnes (avec ou sans comptes), et propose également des fonctionnalités avancées de communication et de travail collaboratif. Nextcloud dispose de son propre mécanisme d'applications (voir aussi [le store d'apps de Nextcloud](https://apps.nextcloud.com/)) pour disposer des fonctionnalités spécifiques. -### Caractéristiques spécifiques YunoHost +Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateur (les comptes YunoHost sont automatiquements connectés à Nextcloud). -En plus des fonctionnalités principales de Nextcloud, les fonctionnalités suivantes sont incluses dans ce package : - - * Intégration avec les utilisateurs YunoHost et le SSO - exemple, le bouton de déconnexion - * Permet à un utilisateur d'être l'administrateur (choisi à l'installation) - * Permet de multiples instances de cette application - * Accès optionnel au répertoire home depuis les fichiers Nextcloud (à activer à l'installation, le partage étant activé par défaut) - * Utilise l'adresse `/.well-known` pour la synchronisation CalDAV et CardDAV du domaine si aucun autre service ne l'utilise déjà - par exemple, Baïkal +L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. From c0a58b2190ed028859aa5c403344c58844e2f166 Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 25 Jul 2024 11:40:48 +0200 Subject: [PATCH 148/354] bump all old versions --- manifest.toml | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/manifest.toml b/manifest.toml index 4cf5e999..ebffdec5 100644 --- a/manifest.toml +++ b/manifest.toml @@ -70,32 +70,33 @@ ram.runtime = "512M" sha256 = '19c469e264b31ee80400f8396460854546569e88db4c15fc0854e192f96027eb' [resources.sources.28] - url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.0.tar.bz2' - sha256 = '4e8b0b74b40221e85f92ab869d0873c69a52d7e43889d9259c6259428a6a36f2' + url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.8.tar.bz2' + sha256 = '55a2f745fcc8f01b5816b23333f1e3014d2040a66794e132ddd0d219a37be53a' + prefetch = false [resources.sources.27] - url = 'https://download.nextcloud.com/server/releases/nextcloud-27.0.0.tar.bz2' - sha256 = '3d312a09b9345ac058758dd7b4059bf3cf0b1f0f1d747251b6fac3585ba6533f' + url = 'https://download.nextcloud.com/server/releases/nextcloud-27.1.11.tar.bz2' + sha256 = '4edd2570f4c83442f8f0f0616fb774ed2663b11cf9f6ea49e795ab43aeef9645' prefetch = false [resources.sources.26] - url = 'https://download.nextcloud.com/server/releases/nextcloud-26.0.0.tar.bz2' - sha256 = 'f163150363aee9366ecb5cd5259bf6756ed4f073cea78b5fa515cada7a0d0c3d' + url = 'https://download.nextcloud.com/server/releases/nextcloud-26.0.13.tar.bz2' + sha256 = '0a362df7a1233348f99d1853fd7e79f0667b552c145dc45012fab54ac31c79ae' prefetch = false [resources.sources.25] - url = 'https://download.nextcloud.com/server/releases/nextcloud-25.0.0.tar.bz2' - sha256 = '2c05ac9d7b72b44ef8b3d2ae03ff0fd6121e254b8054556f5163bd8760dd8f49' + url = https://download.nextcloud.com/server/releases/nextcloud-25.0.13.tar.bz2' + sha256 = '387bac148a696244f1ec02698a082d408283a875b3de85eb9719dd4493eebe33' prefetch = false [resources.sources.24] - url = 'https://download.nextcloud.com/server/releases/nextcloud-24.0.0.tar.bz2' - sha256 = '176cb5620f20465fb4759bdf3caaebeb7acff39d6c8630351af9f8738c173780' + url = 'https://download.nextcloud.com/server/releases/nextcloud-24.0.12.tar.bz2' + sha256 = '2f093bdf7d34faf38d22f38a5e11f3aee32746ff4add3df17c790b9b36390836' prefetch = false [resources.sources.23] - url = 'https://download.nextcloud.com/server/releases/nextcloud-23.0.0.tar.bz2' - sha256 = 'c37592abc3b65c8fd28459281a24f414b87af52fc8c2ea979be3f9be75d01a2c' + url = 'https://download.nextcloud.com/server/releases/nextcloud-23.0.12.tar.bz2' + sha256 = 'ad3637fd987e9f1ed5bd5dbd177bdce1e39228e3daf95bc4a3c590d4b1522b1e' prefetch = false [resources.system_user] From 9d4487836c19ed1acef55afa9c75356a0d4a7e86 Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 25 Jul 2024 11:47:32 +0200 Subject: [PATCH 149/354] oupsie --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index ebffdec5..7f0c9ca2 100644 --- a/manifest.toml +++ b/manifest.toml @@ -85,7 +85,7 @@ ram.runtime = "512M" prefetch = false [resources.sources.25] - url = https://download.nextcloud.com/server/releases/nextcloud-25.0.13.tar.bz2' + url = 'https://download.nextcloud.com/server/releases/nextcloud-25.0.13.tar.bz2' sha256 = '387bac148a696244f1ec02698a082d408283a875b3de85eb9719dd4493eebe33' prefetch = false From 9bb5bee9db9d8a349d7ab41d29ad0e4555a57789 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 25 Jul 2024 09:47:36 +0000 Subject: [PATCH 150/354] Auto-update READMEs --- ALL_README.md | 1 + README_id.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 README_id.md diff --git a/ALL_README.md b/ALL_README.md index 152f2e74..4ed64dd4 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -5,4 +5,5 @@ - [Irakurri README euskaraz](README_eu.md) - [Lire le README en français](README_fr.md) - [Le o README en galego](README_gl.md) +- [Baca README dalam bahasa bahasa Indonesia](README_id.md) - [阅读中文(简体)的 README](README_zh_Hans.md) diff --git a/README_id.md b/README_id.md new file mode 100644 index 00000000..281ffba1 --- /dev/null +++ b/README_id.md @@ -0,0 +1,55 @@ + + +# Nextcloud untuk YunoHost + +[![Tingkat integrasi](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Status kerja](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Status pemeliharaan](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) + +[![Pasang Nextcloud dengan YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) + +*[Baca README ini dengan bahasa yang lain.](./ALL_README.md)* + +> *Paket ini memperbolehkan Anda untuk memasang Nextcloud secara cepat dan mudah pada server YunoHost.* +> *Bila Anda tidak mempunyai YunoHost, silakan berkonsultasi dengan [panduan](https://yunohost.org/install) untuk mempelajari bagaimana untuk memasangnya.* + +## Ringkasan + +Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. + +In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). + +The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. + + +**Versi terkirim:** 29.0.4~ynh1 + +**Demo:** + +## Tangkapan Layar + +![Tangkapan Layar pada Nextcloud](./doc/screenshots/screenshot.png) + +## Dokumentasi dan sumber daya + +- Website aplikasi resmi: +- Dokumentasi pengguna resmi: +- Dokumentasi admin resmi: +- Repositori kode aplikasi hulu: +- Gudang YunoHost: +- Laporkan bug: + +## Info developer + +Silakan kirim pull request ke [`testing` branch](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing). + +Untuk mencoba branch `testing`, silakan dilanjutkan seperti: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +atau +sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +``` + +**Info lebih lanjut mengenai pemaketan aplikasi:** From 8a090a966260733a16f9f9b91c0daa5d418dd74b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:41:37 +0200 Subject: [PATCH 151/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index a616b8e2..fa51ffd3 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -138,7 +138,7 @@ function list_installed_apps_not_compatible_with_future_version() current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) current_major_version=${current_version%%.*} -last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9][0-9]') +last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9]') last_major_version=${last_version%%.*} if [[ "$last_major_version" != "$current_major_version" ]] From 7d25e4ecaf14da55b9ca6d32cbbc0b43226e13e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 26 Jul 2024 21:17:53 +0200 Subject: [PATCH 152/354] Update upgrade --- scripts/upgrade | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index fa51ffd3..eeab55ae 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -39,6 +39,9 @@ filter_boring_occ_warnings() { current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) current_major_version=${current_version%%.*} +last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9]') +last_major_version=${last_version%%.*} + # Define a function to execute commands with `occ` exec_occ() { # Backward compatibility to upgrade from older versions @@ -135,11 +138,11 @@ function list_installed_apps_not_compatible_with_future_version() comm -23 <(comm -23 $installed_apps $core_apps_in_current_version) $nextcloud_destination_appcatalog } -current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) -current_major_version=${current_version%%.*} +#current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) +#current_major_version=${current_version%%.*} -last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9]') -last_major_version=${last_version%%.*} +#last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9]') +#last_major_version=${last_version%%.*} if [[ "$last_major_version" != "$current_major_version" ]] then From 1cb2448d3bab7d0d476c7f5d673daf07b44b749c Mon Sep 17 00:00:00 2001 From: Kayou Date: Mon, 29 Jul 2024 10:12:38 +0200 Subject: [PATCH 153/354] system_addressbook_exposed is a boolean --- manifest.toml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 7f0c9ca2..d727ead0 100644 --- a/manifest.toml +++ b/manifest.toml @@ -57,9 +57,8 @@ ram.runtime = "512M" [install.system_addressbook_exposed] ask.en = "Should there be a system address book listing all users, accessible by all users?" ask.fr = "Devrait-il y avoir un carnet d'adresses système listant tous les comptes, accessible par tous les comptes ?" - type = "select" - choices = ["yes", "no"] - default = "yes" + type = "boolean" + default = true [resources] From 0c4ab487e8d854783502def7c19d0a2ecec9eb6b Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 29 Jul 2024 08:12:41 +0000 Subject: [PATCH 154/354] Auto-update READMEs --- README_id.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_id.md b/README_id.md index 281ffba1..71cbfaaf 100644 --- a/README_id.md +++ b/README_id.md @@ -36,7 +36,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD - Website aplikasi resmi: - Dokumentasi pengguna resmi: - Dokumentasi admin resmi: -- Repositori kode aplikasi hulu: +- Depot kode aplikasi hulu: - Gudang YunoHost: - Laporkan bug: From 7f40b5a17b6c990550a03bcd25a023704d9395c8 Mon Sep 17 00:00:00 2001 From: Kayou Date: Mon, 29 Jul 2024 11:22:01 +0200 Subject: [PATCH 155/354] migrate system_addressbook_exposed to boolean, fix upgrade test --- scripts/upgrade | 9 +++++++++ tests.toml | 1 + 2 files changed, 10 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index c2ddc1d9..1441abbc 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -10,6 +10,15 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= ynh_script_progression --message="Ensuring downward compatibility..." +# Fix system_addressbook_exposed as a boolean +if [ "${system_addressbook_exposed,,}" = "yes" ]; then + ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=1 + system_addressbook_exposed=1 +elif [ "${system_addressbook_exposed,,}" = "no" ]; then + ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=0 + system_addressbook_exposed=0 +fi + # Remove the option backup_core_only if it's in the settings.yml file ynh_app_setting_delete --app=$app --key=backup_core_only diff --git a/tests.toml b/tests.toml index eb4b3634..cdd5e776 100644 --- a/tests.toml +++ b/tests.toml @@ -10,3 +10,4 @@ test_format = 1.0 test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" + test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" From 4fa1f991eb780f31c522fc5f83875194fcdf27f8 Mon Sep 17 00:00:00 2001 From: Kayou Date: Mon, 29 Jul 2024 13:20:37 +0200 Subject: [PATCH 156/354] another fix for system_addressbook_exposed, update the dav conf accordingly --- scripts/upgrade | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index 1441abbc..4db95980 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -10,6 +10,11 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= ynh_script_progression --message="Ensuring downward compatibility..." +if [ -z ${system_addressbook_exposed:-} ]; then + ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=0 + system_addressbook_exposed=0 +fi + # Fix system_addressbook_exposed as a boolean if [ "${system_addressbook_exposed,,}" = "yes" ]; then ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=1 @@ -288,6 +293,12 @@ then #================================================= exec_occ config:system:set overwrite.cli.url --value="https://${domain}${path}" + + #================================================= + # ENABLE OR DISABLE SYSTEM ADDRESS BOOK + #================================================= + + exec_occ config:app:set dav system_addressbook_exposed --value="$system_addressbook_exposed" #================================================= # MOUNT HOME FOLDERS AS EXTERNAL STORAGE From ae916549cac44773ce448764a64e7310592491aa Mon Sep 17 00:00:00 2001 From: Kayou Date: Mon, 29 Jul 2024 15:39:44 +0200 Subject: [PATCH 157/354] zblerg, do not modify system_addressbook_exposed config value in the upgrade script --- scripts/upgrade | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 4db95980..e36d62e1 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -11,17 +11,17 @@ upgrade_type=$(ynh_check_app_version_changed) ynh_script_progression --message="Ensuring downward compatibility..." if [ -z ${system_addressbook_exposed:-} ]; then - ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=0 + ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=0 system_addressbook_exposed=0 fi # Fix system_addressbook_exposed as a boolean if [ "${system_addressbook_exposed,,}" = "yes" ]; then - ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=1 - system_addressbook_exposed=1 + ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=1 + system_addressbook_exposed=1 elif [ "${system_addressbook_exposed,,}" = "no" ]; then - ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=0 - system_addressbook_exposed=0 + ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=0 + system_addressbook_exposed=0 fi # Remove the option backup_core_only if it's in the settings.yml file @@ -293,12 +293,6 @@ then #================================================= exec_occ config:system:set overwrite.cli.url --value="https://${domain}${path}" - - #================================================= - # ENABLE OR DISABLE SYSTEM ADDRESS BOOK - #================================================= - - exec_occ config:app:set dav system_addressbook_exposed --value="$system_addressbook_exposed" #================================================= # MOUNT HOME FOLDERS AS EXTERNAL STORAGE From 4b9224fd9b35ad44b316a69538f8cecb8fd7a14f Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 30 Jul 2024 12:09:00 +0200 Subject: [PATCH 158/354] add redis-server as deps --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index d727ead0..7b855d6e 100644 --- a/manifest.toml +++ b/manifest.toml @@ -116,7 +116,7 @@ ram.runtime = "512M" api.allowed = ["visitors", "all_users"] [resources.apt] - packages = "mariadb-server, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, php8.3-fpm, php8.3-bz2, php8.3-imap, php8.3-gmp, php8.3-gd, php8.3-intl, php8.3-curl, php8.3-apcu, php8.3-redis, php8.3-ldap, php8.3-imagick, php8.3-zip, php8.3-mbstring, php8.3-xml, php8.3-mysql, php8.3-igbinary, php8.3-bcmath" + packages = "mariadb-server, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, redis-server, php8.3-fpm, php8.3-bz2, php8.3-imap, php8.3-gmp, php8.3-gd, php8.3-intl, php8.3-curl, php8.3-apcu, php8.3-redis, php8.3-ldap, php8.3-imagick, php8.3-zip, php8.3-mbstring, php8.3-xml, php8.3-mysql, php8.3-igbinary, php8.3-bcmath" [resources.database] type = "mysql" From cbc897140148c785460ac99ad7f1575bff76948a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:02:02 +0200 Subject: [PATCH 159/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 35f98e80..ee83dd17 100644 --- a/manifest.toml +++ b/manifest.toml @@ -116,7 +116,7 @@ ram.runtime = "512M" api.allowed = ["visitors", "all_users"] [resources.apt] - packages = "postgresql, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, php8.3-pgsql, php8.3-mysql, php8.3-fpm, php8.3-bz2, php8.3-imap, php8.3-gmp, php8.3-gd, php8.3-intl, php8.3-curl, php8.3-apcu, php8.3-redis, php8.3-ldap, php8.3-imagick, php8.3-zip, php8.3-mbstring, php8.3-xml, php8.3-igbinary, php8.3-bcmath" + packages = "postgresql, imagemagick, libmagickcore-6.q16-6-extra, acl, tar, smbclient, at, redis-server, php8.3-pgsql, php8.3-mysql, php8.3-fpm, php8.3-bz2, php8.3-imap, php8.3-gmp, php8.3-gd, php8.3-intl, php8.3-curl, php8.3-apcu, php8.3-redis, php8.3-ldap, php8.3-imagick, php8.3-zip, php8.3-mbstring, php8.3-xml, php8.3-igbinary, php8.3-bcmath" [resources.database] type = "postgresql" From de7afc994ceff84d112bdb7228209a91a31439e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:02:29 +0200 Subject: [PATCH 160/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index ee83dd17..94ada510 100644 --- a/manifest.toml +++ b/manifest.toml @@ -19,7 +19,7 @@ code = "https://github.com/nextcloud/server" cpe = "cpe:2.3:a:nextcloud:nextcloud" [integration] -yunohost = ">= 11.2" +yunohost = ">= 11.2.20" architectures = ["amd64", "arm64", "armhf"] multi_instance = true From e215d9c5c9889d8c69a056c67ad8997a5dd69646 Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 30 Jul 2024 16:52:31 +0200 Subject: [PATCH 161/354] find files before chown them --- scripts/install | 7 ++++--- scripts/restore | 4 ++-- scripts/upgrade | 10 ++++++---- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/scripts/install b/scripts/install index 88c1c0da..0e303198 100755 --- a/scripts/install +++ b/scripts/install @@ -64,7 +64,8 @@ exec_occ() { } # Set write access for the following commands -chown -R $app: "$install_dir" "$data_dir" +find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ +find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ # Define password in an intermediate var # The fact that it's called _password allows it to be @@ -234,8 +235,8 @@ ynh_multimedia_addaccess $app #================================================= # Fix app ownerships & permissions -chown -R $app:www-data "$install_dir" -chown -R $app: "$data_dir" +find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ +find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 diff --git a/scripts/restore b/scripts/restore index 1b0f63cd..da7848e9 100755 --- a/scripts/restore +++ b/scripts/restore @@ -79,8 +79,8 @@ ynh_restore_file --origin_path="$data_dir" --not_mandatory #================================================= # Fix app ownerships & permissions -chown -R $app:www-data "$install_dir" -chown -R $app: "$data_dir" +find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ +find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 diff --git a/scripts/upgrade b/scripts/upgrade index e36d62e1..5d704467 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -138,7 +138,8 @@ then ynh_script_progression --message="Upgrading $app..." --weight=3 # Set write access for the following commands - chown -R $app: "$install_dir" "$data_dir" + find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ + find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ # Print the current version number of Nextcloud exec_occ -V @@ -207,7 +208,8 @@ then mv "$tmpdir" "$install_dir" # Set write access for the following commands - chown -R $app: "$install_dir" "$data_dir" + find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ + find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) exec_occ maintenance:mode --off @@ -324,8 +326,8 @@ fi ynh_script_progression --message="Reapplying file permissions..." --weight=2 # Fix app ownerships & permissions -chown -R $app:www-data "$install_dir" -chown -R $app: "$data_dir" +find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ +find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 From 5dc5e8ba10f5eab37f8ae085ae4a56f3b9a44d2d Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 30 Jul 2024 18:30:19 +0200 Subject: [PATCH 162/354] chown the root folder too --- scripts/install | 4 ++++ scripts/restore | 2 ++ scripts/upgrade | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/scripts/install b/scripts/install index 0e303198..9b705b54 100755 --- a/scripts/install +++ b/scripts/install @@ -65,7 +65,9 @@ exec_occ() { # Set write access for the following commands find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ +chown $app:www-data "$install_dir" find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ +chown $app: "$data_dir" # Define password in an intermediate var # The fact that it's called _password allows it to be @@ -236,7 +238,9 @@ ynh_multimedia_addaccess $app # Fix app ownerships & permissions find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ +chown $app:www-data "$install_dir" find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ +chown $app: "$data_dir" find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 diff --git a/scripts/restore b/scripts/restore index da7848e9..5ef4f919 100755 --- a/scripts/restore +++ b/scripts/restore @@ -80,7 +80,9 @@ ynh_restore_file --origin_path="$data_dir" --not_mandatory # Fix app ownerships & permissions find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ +chown $app:www-data "$install_dir" find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ +chown $app: "$data_dir" find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 diff --git a/scripts/upgrade b/scripts/upgrade index 5d704467..76d424bd 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -139,7 +139,9 @@ then # Set write access for the following commands find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ + chown $app:www-data "$install_dir" find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ + chown $app: "$data_dir" # Print the current version number of Nextcloud exec_occ -V @@ -209,7 +211,9 @@ then # Set write access for the following commands find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ + chown $app:www-data "$install_dir" find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ + chown $app: "$data_dir" # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) exec_occ maintenance:mode --off @@ -327,7 +331,9 @@ ynh_script_progression --message="Reapplying file permissions..." --weight=2 # Fix app ownerships & permissions find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ +chown $app:www-data "$install_dir" find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ +chown $app: "$data_dir" find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 From 8d682cbdbcbd1579a9c901f71429dd7354449ae8 Mon Sep 17 00:00:00 2001 From: Kayou Date: Wed, 31 Jul 2024 11:56:49 +0200 Subject: [PATCH 163/354] fix find condition --- scripts/install | 12 ++++-------- scripts/restore | 6 ++---- scripts/upgrade | 18 ++++++------------ 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/scripts/install b/scripts/install index 9b705b54..d8ef9c07 100755 --- a/scripts/install +++ b/scripts/install @@ -64,10 +64,8 @@ exec_occ() { } # Set write access for the following commands -find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ -chown $app:www-data "$install_dir" -find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ -chown $app: "$data_dir" +find "$install_dir" -not \( -user $app -and -group www-data \) -exec chown $app:www-data {} \+ +find "$data_dir" -not \( -user $app -and -group $app \) -exec chown $app: {} \+ # Define password in an intermediate var # The fact that it's called _password allows it to be @@ -237,10 +235,8 @@ ynh_multimedia_addaccess $app #================================================= # Fix app ownerships & permissions -find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ -chown $app:www-data "$install_dir" -find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ -chown $app: "$data_dir" +find "$install_dir" -not \( -user $app -and -group www-data \) -exec chown $app:www-data {} \+ +find "$data_dir" -not \( -user $app -and -group $app \) -exec chown $app: {} \+ find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 diff --git a/scripts/restore b/scripts/restore index 5ef4f919..6ef7833f 100755 --- a/scripts/restore +++ b/scripts/restore @@ -79,10 +79,8 @@ ynh_restore_file --origin_path="$data_dir" --not_mandatory #================================================= # Fix app ownerships & permissions -find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ -chown $app:www-data "$install_dir" -find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ -chown $app: "$data_dir" +find "$install_dir" -not \( -user $app -and -group www-data \) -exec chown $app:www-data {} \+ +find "$data_dir" -not \( -user $app -and -group $app \) -exec chown $app: {} \+ find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 diff --git a/scripts/upgrade b/scripts/upgrade index 76d424bd..48a88891 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -138,10 +138,8 @@ then ynh_script_progression --message="Upgrading $app..." --weight=3 # Set write access for the following commands - find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ - chown $app:www-data "$install_dir" - find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ - chown $app: "$data_dir" + find "$install_dir" -not \( -user $app -and -group www-data \) -exec chown $app:www-data {} \+ + find "$data_dir" -not \( -user $app -and -group $app \) -exec chown $app: {} \+ # Print the current version number of Nextcloud exec_occ -V @@ -210,10 +208,8 @@ then mv "$tmpdir" "$install_dir" # Set write access for the following commands - find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ - chown $app:www-data "$install_dir" - find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ - chown $app: "$data_dir" + find "$install_dir" -not \( -user $app -and -group www-data \) -exec chown $app:www-data {} \+ + find "$data_dir" -not \( -user $app -and -group $app \) -exec chown $app: {} \+ # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) exec_occ maintenance:mode --off @@ -330,10 +326,8 @@ fi ynh_script_progression --message="Reapplying file permissions..." --weight=2 # Fix app ownerships & permissions -find "$install_dir" -not \( -user $app -or -group www-data \) -exec chown $app:www-data {} \+ -chown $app:www-data "$install_dir" -find "$data_dir" -not \( -user $app -or -group $app \) -exec chown $app: {} \+ -chown $app: "$data_dir" +find "$install_dir" -not \( -user $app -and -group www-data \) -exec chown $app:www-data {} \+ +find "$data_dir" -not \( -user $app -and -group $app \) -exec chown $app: {} \+ find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 From 706d5071c6f4e04af2050546b563400a4e2649f4 Mon Sep 17 00:00:00 2001 From: Kayou Date: Wed, 31 Jul 2024 14:59:55 +0200 Subject: [PATCH 164/354] find ... chmod is not faster, at least avoid to chown -R the data_dir in the upgrade script --- scripts/install | 8 ++++---- scripts/restore | 4 ++-- scripts/upgrade | 9 +++------ 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/scripts/install b/scripts/install index d8ef9c07..2f7b40aa 100755 --- a/scripts/install +++ b/scripts/install @@ -64,8 +64,8 @@ exec_occ() { } # Set write access for the following commands -find "$install_dir" -not \( -user $app -and -group www-data \) -exec chown $app:www-data {} \+ -find "$data_dir" -not \( -user $app -and -group $app \) -exec chown $app: {} \+ +chown -R $app:www-data "$install_dir" +chown -R $app: "$data_dir" # Define password in an intermediate var # The fact that it's called _password allows it to be @@ -235,8 +235,8 @@ ynh_multimedia_addaccess $app #================================================= # Fix app ownerships & permissions -find "$install_dir" -not \( -user $app -and -group www-data \) -exec chown $app:www-data {} \+ -find "$data_dir" -not \( -user $app -and -group $app \) -exec chown $app: {} \+ +chown -R $app:www-data "$install_dir" +chown -R $app: "$data_dir" find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 diff --git a/scripts/restore b/scripts/restore index 6ef7833f..1b0f63cd 100755 --- a/scripts/restore +++ b/scripts/restore @@ -79,8 +79,8 @@ ynh_restore_file --origin_path="$data_dir" --not_mandatory #================================================= # Fix app ownerships & permissions -find "$install_dir" -not \( -user $app -and -group www-data \) -exec chown $app:www-data {} \+ -find "$data_dir" -not \( -user $app -and -group $app \) -exec chown $app: {} \+ +chown -R $app:www-data "$install_dir" +chown -R $app: "$data_dir" find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 diff --git a/scripts/upgrade b/scripts/upgrade index 48a88891..9fb31573 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -138,8 +138,7 @@ then ynh_script_progression --message="Upgrading $app..." --weight=3 # Set write access for the following commands - find "$install_dir" -not \( -user $app -and -group www-data \) -exec chown $app:www-data {} \+ - find "$data_dir" -not \( -user $app -and -group $app \) -exec chown $app: {} \+ + chown -R $app:www-data "$install_dir" # Print the current version number of Nextcloud exec_occ -V @@ -208,8 +207,7 @@ then mv "$tmpdir" "$install_dir" # Set write access for the following commands - find "$install_dir" -not \( -user $app -and -group www-data \) -exec chown $app:www-data {} \+ - find "$data_dir" -not \( -user $app -and -group $app \) -exec chown $app: {} \+ + chown -R $app:www-data "$install_dir" # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) exec_occ maintenance:mode --off @@ -326,8 +324,7 @@ fi ynh_script_progression --message="Reapplying file permissions..." --weight=2 # Fix app ownerships & permissions -find "$install_dir" -not \( -user $app -and -group www-data \) -exec chown $app:www-data {} \+ -find "$data_dir" -not \( -user $app -and -group $app \) -exec chown $app: {} \+ +chown -R $app:www-data "$install_dir" find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 From d240d552b47d717fd23154e5cd1eb236b5c29126 Mon Sep 17 00:00:00 2001 From: Kayou Date: Wed, 31 Jul 2024 15:11:08 +0200 Subject: [PATCH 165/354] add a button in the config panel to run chown/chmod on data_dir --- config_panel.toml | 11 ++++++++--- scripts/config | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/config_panel.toml b/config_panel.toml index 4e458b6b..e5e88aed 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -3,14 +3,19 @@ version = "1.0" [main] name = "Nextcloud configuration" - [main.maintenance_mode] - name = "Maintenance mode" + [main.maintenance] + name = "Maintenance" - [main.maintenance_mode.maintenance_mode] + [main.maintenance.maintenance_mode] ask = "Enable maintenance mode" type = "boolean" default = "0" + [main.maintenance.set_permissions_button] + ask.en = "Set permissions for all data (Can take up to several hours if users have a lot of data)" + type = "button" + style = "success" + [main.addressbook] name = "Address book configuration" diff --git a/scripts/config b/scripts/config index 93ced20f..e2310095 100644 --- a/scripts/config +++ b/scripts/config @@ -105,6 +105,24 @@ set__fpm_free_footprint() { fi } +#================================================= +# SPECIFIC RUNNERS FOR TOML SHORT KEYS +#================================================= + +function run__set_permissions_button() { + local data_dir=$(ynh_app_setting_get --app=$app --key=data_dir) + ynh_print_info "Set permissions, it may take some time..." + chown -R $app:www-data "$install_dir" + chown -R $app: "$data_dir" + find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 + find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 + find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 + find $data_dir/data/ -type d -print0 | xargs -r0 chmod 0750 + chmod 640 "$install_dir/config/config.php" + chmod 755 /home/yunohost.app + chmod 750 $install_dir +} + #================================================= # GENERIC FINALIZATION #================================================= From 30b2d8123a13d315c803486d9abee3607cc2162f Mon Sep 17 00:00:00 2001 From: Kayou Date: Wed, 31 Jul 2024 15:13:04 +0200 Subject: [PATCH 166/354] we can avoid this chmod too i guess? --- scripts/upgrade | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 9fb31573..2a021507 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -327,8 +327,6 @@ ynh_script_progression --message="Reapplying file permissions..." --weight=2 chown -R $app:www-data "$install_dir" find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 -find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 -find $data_dir/data/ -type d -print0 | xargs -r0 chmod 0750 chmod 640 "$install_dir/config/config.php" chmod 755 /home/yunohost.app chmod 750 $install_dir From 55b5c7900fc0330c0a75252f464c1eade24f7ef2 Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 1 Aug 2024 00:16:45 +0200 Subject: [PATCH 167/354] only nextcloud is allowed to read the config file --- scripts/install | 3 ++- scripts/restore | 2 +- scripts/upgrade | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index 2f7b40aa..f2635e76 100755 --- a/scripts/install +++ b/scripts/install @@ -65,6 +65,7 @@ exec_occ() { # Set write access for the following commands chown -R $app:www-data "$install_dir" +chmod 600 "$install_dir/config/config.php" chown -R $app: "$data_dir" # Define password in an intermediate var @@ -241,7 +242,7 @@ find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 find $data_dir/data/ -type d -print0 | xargs -r0 chmod 0750 -chmod 640 "$install_dir/config/config.php" +chmod 600 "$install_dir/config/config.php" chmod 755 /home/yunohost.app chmod 750 $install_dir diff --git a/scripts/restore b/scripts/restore index 1b0f63cd..9ae36115 100755 --- a/scripts/restore +++ b/scripts/restore @@ -85,7 +85,7 @@ find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 find $data_dir/data/ -type f -print0 | xargs -r0 chmod 0640 find $data_dir/data/ -type d -print0 | xargs -r0 chmod 0750 -chmod 640 "$install_dir/config/config.php" +chmod 600 "$install_dir/config/config.php" chmod 755 /home/yunohost.app chmod 750 $install_dir diff --git a/scripts/upgrade b/scripts/upgrade index 2a021507..846c1d9c 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -139,6 +139,7 @@ then # Set write access for the following commands chown -R $app:www-data "$install_dir" + chmod 600 "$install_dir/config/config.php" # Print the current version number of Nextcloud exec_occ -V @@ -208,6 +209,7 @@ then # Set write access for the following commands chown -R $app:www-data "$install_dir" + chmod 600 "$install_dir/config/config.php" # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) exec_occ maintenance:mode --off @@ -327,7 +329,7 @@ ynh_script_progression --message="Reapplying file permissions..." --weight=2 chown -R $app:www-data "$install_dir" find $install_dir/ -type f -print0 | xargs -r0 chmod 0644 find $install_dir/ -type d -print0 | xargs -r0 chmod 0755 -chmod 640 "$install_dir/config/config.php" +chmod 600 "$install_dir/config/config.php" chmod 755 /home/yunohost.app chmod 750 $install_dir From 07f90a85f6e24d66dc4b863011b71484ab11ce2f Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 1 Aug 2024 09:30:49 +0200 Subject: [PATCH 168/354] zblerg, the config file doesn't exist before install --- scripts/install | 1 - scripts/upgrade | 2 -- 2 files changed, 3 deletions(-) diff --git a/scripts/install b/scripts/install index f2635e76..0987b848 100755 --- a/scripts/install +++ b/scripts/install @@ -65,7 +65,6 @@ exec_occ() { # Set write access for the following commands chown -R $app:www-data "$install_dir" -chmod 600 "$install_dir/config/config.php" chown -R $app: "$data_dir" # Define password in an intermediate var diff --git a/scripts/upgrade b/scripts/upgrade index 846c1d9c..074385b0 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -139,7 +139,6 @@ then # Set write access for the following commands chown -R $app:www-data "$install_dir" - chmod 600 "$install_dir/config/config.php" # Print the current version number of Nextcloud exec_occ -V @@ -209,7 +208,6 @@ then # Set write access for the following commands chown -R $app:www-data "$install_dir" - chmod 600 "$install_dir/config/config.php" # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) exec_occ maintenance:mode --off From 5556fb6549d8602ba0ccd8455f2c081065f6692d Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 1 Aug 2024 11:44:40 +0200 Subject: [PATCH 169/354] wait until nginx has actually remove the nextcloud conf during upgrade before checking the url_handled --- scripts/upgrade | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index e36d62e1..aa391c02 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -357,6 +357,15 @@ ynh_app_setting_delete --app=$app --key="checksum__etc_nginx_conf.d_$domain.d_$a # Wait untils NGINX has fully reloaded ynh_systemd_action --service_name=nginx --action=reload --line_match="Reloaded" --log_path="systemd" +# Nginx may take some time to support the new configuration, wait for the nextcloud configuration file to disappear from nginx before checking the CalDAV/CardDAV URL. +timeout=30 +for i in $(seq 1 $timeout); do + if ! ynh_exec_warn_less nginx -T | grep --quiet "# configuration file /etc/nginx/conf.d/$domain.d/$app.conf:"; then + break + fi + sleep 1 +done + # Check if .well-known is available for this domain if is_url_handled --domain="$domain" --path="/.well-known/caldav" || is_url_handled --domain="$domain" --path="/.well-known/carddav" then From d7f9b2c9fd77fac51d1d7dad0f6d0ff6572d2e71 Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 1 Aug 2024 11:53:16 +0200 Subject: [PATCH 170/354] create a function for that --- scripts/_common.sh | 13 +++++++++++++ scripts/upgrade | 9 +-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 65cce784..f060a27d 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -8,6 +8,19 @@ # EXPERIMENTAL HELPERS #================================================= +wait_nginx_reload() { + # Nginx may take some time to support the new configuration, + # wait for the nextcloud configuration file to disappear from nginx before checking the CalDAV/CardDAV URL. + timeout=30 + for i in $(seq 1 $timeout); do + if ! ynh_exec_warn_less nginx -T | grep --quiet "# configuration file /etc/nginx/conf.d/$domain.d/$app.conf:"; then + break + fi + sleep 1 +done +} + + # Check if an URL is already handled # usage: is_url_handled --domain=DOMAIN --path=PATH_URI is_url_handled() { diff --git a/scripts/upgrade b/scripts/upgrade index aa391c02..ad0e4c63 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -357,14 +357,7 @@ ynh_app_setting_delete --app=$app --key="checksum__etc_nginx_conf.d_$domain.d_$a # Wait untils NGINX has fully reloaded ynh_systemd_action --service_name=nginx --action=reload --line_match="Reloaded" --log_path="systemd" -# Nginx may take some time to support the new configuration, wait for the nextcloud configuration file to disappear from nginx before checking the CalDAV/CardDAV URL. -timeout=30 -for i in $(seq 1 $timeout); do - if ! ynh_exec_warn_less nginx -T | grep --quiet "# configuration file /etc/nginx/conf.d/$domain.d/$app.conf:"; then - break - fi - sleep 1 -done +wait_nginx_reload # Check if .well-known is available for this domain if is_url_handled --domain="$domain" --path="/.well-known/caldav" || is_url_handled --domain="$domain" --path="/.well-known/carddav" From 49ec72b6ef87e7a803ecf21793b275249ccd77e5 Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 1 Aug 2024 11:53:29 +0200 Subject: [PATCH 171/354] fix change-url dav detection --- scripts/change_url | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index aac12f0f..f43ed113 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -14,6 +14,16 @@ source /usr/share/yunohost/helpers #================================================= ynh_script_progression --message="Updating NGINX web server configuration..." --weight=2 +# Check if .well-known is available for this domain +if is_url_handled --domain="$new_domain" --path="/.well-known/caldav" || is_url_handled --domain="$new_domain" --path="/.well-known/carddav" +then + ynh_print_warn --message="Another app already uses the domain $new_domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." + + # Remove lines about .well-known/carddav and caldav with sed. + sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "/etc/nginx/conf.d/$domain.d/$app.conf" + ynh_store_file_checksum --file="/etc/nginx/conf.d/$domain.d/$app.conf" +fi + ynh_change_url_nginx_config #================================================= @@ -37,16 +47,6 @@ then # Reload php fpm, necessary for force nextcloud to re-read config.php, cf opcache.revalidate_freq ynh_systemd_action --service_name=php${phpversion}-fpm --action=reload - - # Check if .well-known is available for this domain - if is_url_handled --domain="$new_domain" --path="/.well-known/caldav" || is_url_handled --domain="$new_domain" --path="/.well-known/carddav" - then - ynh_print_warn --message="Another app already uses the domain $new_domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." - - # Remove lines about .well-known/carddav and caldav with sed. - sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "/etc/nginx/conf.d/$new_domain.d/$app.conf" - ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" - fi fi #================================================= From 73a3498b93011ea6dd897fa409944740a8f466fa Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 1 Aug 2024 11:54:17 +0200 Subject: [PATCH 172/354] only if domain has changed... --- scripts/change_url | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index f43ed113..8cadcea2 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -14,14 +14,17 @@ source /usr/share/yunohost/helpers #================================================= ynh_script_progression --message="Updating NGINX web server configuration..." --weight=2 -# Check if .well-known is available for this domain -if is_url_handled --domain="$new_domain" --path="/.well-known/caldav" || is_url_handled --domain="$new_domain" --path="/.well-known/carddav" +if [ $change_domain -eq 1 ] then - ynh_print_warn --message="Another app already uses the domain $new_domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." + # Check if .well-known is available for this domain + if is_url_handled --domain="$new_domain" --path="/.well-known/caldav" || is_url_handled --domain="$new_domain" --path="/.well-known/carddav" + then + ynh_print_warn --message="Another app already uses the domain $new_domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." - # Remove lines about .well-known/carddav and caldav with sed. - sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "/etc/nginx/conf.d/$domain.d/$app.conf" - ynh_store_file_checksum --file="/etc/nginx/conf.d/$domain.d/$app.conf" + # Remove lines about .well-known/carddav and caldav with sed. + sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "/etc/nginx/conf.d/$domain.d/$app.conf" + ynh_store_file_checksum --file="/etc/nginx/conf.d/$domain.d/$app.conf" + fi fi ynh_change_url_nginx_config From fa5da4fe666feee04e0988590e98a2944dc0188d Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 1 Aug 2024 14:07:39 +0200 Subject: [PATCH 173/354] Update scripts/_common.sh --- scripts/_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index f060a27d..653a0b05 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -17,7 +17,7 @@ wait_nginx_reload() { break fi sleep 1 -done + done } From 8a7f99d35470d7a6d0aec08ed56e6a0a6ade504e Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 1 Aug 2024 17:29:04 +0200 Subject: [PATCH 174/354] moar sleep --- scripts/_common.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 653a0b05..512b33a2 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -19,7 +19,8 @@ wait_nginx_reload() { sleep 1 done } - +# Wait untils nginx has fully reloaded (avoid curl fail with http2) +sleep 2 # Check if an URL is already handled # usage: is_url_handled --domain=DOMAIN --path=PATH_URI From 5e498ded58e927892af5a56cfbf48b2563023f76 Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 1 Aug 2024 17:29:50 +0200 Subject: [PATCH 175/354] oups --- scripts/_common.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 512b33a2..19c1859d 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -18,9 +18,9 @@ wait_nginx_reload() { fi sleep 1 done + # Wait untils nginx has fully reloaded (avoid curl fail with http2) + sleep 2 } -# Wait untils nginx has fully reloaded (avoid curl fail with http2) -sleep 2 # Check if an URL is already handled # usage: is_url_handled --domain=DOMAIN --path=PATH_URI From f985ed4be92c916bc0963e3d8cd30f2b992c1295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 3 Aug 2024 09:46:30 +0200 Subject: [PATCH 176/354] Update _common.sh --- scripts/_common.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 19c1859d..7afbec99 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -9,8 +9,8 @@ #================================================= wait_nginx_reload() { - # Nginx may take some time to support the new configuration, - # wait for the nextcloud configuration file to disappear from nginx before checking the CalDAV/CardDAV URL. + # NGINX may take some time to support the new configuration, + # wait for the Nextcloud configuration file to disappear from NGINX before checking the CalDAV/CardDAV URL. timeout=30 for i in $(seq 1 $timeout); do if ! ynh_exec_warn_less nginx -T | grep --quiet "# configuration file /etc/nginx/conf.d/$domain.d/$app.conf:"; then @@ -18,7 +18,7 @@ wait_nginx_reload() { fi sleep 1 done - # Wait untils nginx has fully reloaded (avoid curl fail with http2) + # Wait untils NGINX has fully reloaded (avoid cURL fail with http2) sleep 2 } @@ -33,22 +33,22 @@ is_url_handled() { # Manage arguments with getopts ynh_handle_getopts_args "$@" - # Try to get the url with curl, and keep the http code and an eventual redirection url. + # Try to get the URL with cURL, and keep the http code and an eventual redirection URL. local curl_output="$(curl --insecure --silent --output /dev/null \ --write-out '%{http_code};%{redirect_url}' https://127.0.0.1$path --header "Host: $domain" --resolve $domain:443:127.0.0.1)" # Cut the output and keep only the first part to keep the http code local http_code="${curl_output%%;*}" - # Do the same thing but keep the second part, the redirection url + # Do the same thing but keep the second part, the redirection URL local redirection="${curl_output#*;}" - # Return 1 if the url isn't handled. - # Which means either curl got a 404 (or the admin) or the sso. - # A handled url should redirect to a publicly accessible url. + # Return 1 if the URL isn't handled. + # Which means either cURL got a 404 (or the admin) or the SSO. + # A handled URL should redirect to a publicly accessible URL. # Return 1 if the url has returned 404 if [ "$http_code" = "404" ] || [[ $redirection =~ "/yunohost/admin" ]]; then return 1 - # Return 1 if the url is redirected to the SSO + # Return 1 if the URL is redirected to the SSO elif [[ $redirection =~ "/yunohost/sso" ]]; then return 1 fi From e83c680c54f667f669079405c22c1559245a5489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 3 Aug 2024 09:49:44 +0200 Subject: [PATCH 177/354] minor typos --- scripts/_common.sh | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 19c1859d..4cdc0189 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -9,8 +9,8 @@ #================================================= wait_nginx_reload() { - # Nginx may take some time to support the new configuration, - # wait for the nextcloud configuration file to disappear from nginx before checking the CalDAV/CardDAV URL. + # NGINX may take some time to support the new configuration, + # wait for the Nextcloud configuration file to disappear from NGINX before checking the CalDAV/CardDAV URL. timeout=30 for i in $(seq 1 $timeout); do if ! ynh_exec_warn_less nginx -T | grep --quiet "# configuration file /etc/nginx/conf.d/$domain.d/$app.conf:"; then @@ -18,7 +18,7 @@ wait_nginx_reload() { fi sleep 1 done - # Wait untils nginx has fully reloaded (avoid curl fail with http2) + # Wait untils NGINX has fully reloaded (avoid cURL fail with http2) sleep 2 } @@ -33,22 +33,22 @@ is_url_handled() { # Manage arguments with getopts ynh_handle_getopts_args "$@" - # Try to get the url with curl, and keep the http code and an eventual redirection url. + # Try to get the URL with cURL, and keep the http code and an eventual redirection URL. local curl_output="$(curl --insecure --silent --output /dev/null \ --write-out '%{http_code};%{redirect_url}' https://127.0.0.1$path --header "Host: $domain" --resolve $domain:443:127.0.0.1)" # Cut the output and keep only the first part to keep the http code local http_code="${curl_output%%;*}" - # Do the same thing but keep the second part, the redirection url + # Do the same thing but keep the second part, the redirection URL local redirection="${curl_output#*;}" - # Return 1 if the url isn't handled. - # Which means either curl got a 404 (or the admin) or the sso. - # A handled url should redirect to a publicly accessible url. - # Return 1 if the url has returned 404 + # Return 1 if the URL isn't handled. + # Which means either cURL got a 404 (or the admin) or the SSO. + # A handled URL should redirect to a publicly accessible URL. + # Return 1 if the URL has returned 404 if [ "$http_code" = "404" ] || [[ $redirection =~ "/yunohost/admin" ]]; then return 1 - # Return 1 if the url is redirected to the SSO + # Return 1 if the URL is redirected to the SSO elif [[ $redirection =~ "/yunohost/sso" ]]; then return 1 fi From a86e321c50f3c60e2c34842812b41b992277d2d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 3 Aug 2024 09:52:05 +0200 Subject: [PATCH 178/354] Update backup --- scripts/backup | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/scripts/backup b/scripts/backup index da8f1725..d56a518c 100755 --- a/scripts/backup +++ b/scripts/backup @@ -28,42 +28,28 @@ ynh_backup --src_path="$install_dir" ynh_backup --src_path="$data_dir" --is_big #================================================= -# BACKUP THE NGINX CONFIGURATION -#================================================= - -ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" - -#================================================= -# BACKUP THE PHP-FPM CONFIGURATION +# SYSTEM CONFIGURATION #================================================= +# Backup the PHP-FPM configuration ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -#================================================= -# SPECIFIC BACKUP -#================================================= -# BACKUP LOGROTATE -#================================================= +# Backup the nginx configuration +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" +# Backup the logrotate configuration ynh_backup --src_path="/etc/logrotate.d/$app" -#================================================= -# BACKUP FAIL2BAN CONFIGURATION -#================================================= - +# Backup the Fail2Ban config ynh_backup --src_path="/etc/fail2ban/jail.d/$app.conf" ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" #================================================= -# BACKUP THE CRON FILE +# BACKUP VARIOUS FILES #================================================= ynh_backup --src_path="/etc/cron.d/$app" -#================================================= -# BACKUP LOGS -#================================================= - ynh_backup --src_path="/var/log/$app" #================================================= From 31fd6a50f4b127432b680c7630776259eacb230d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 3 Aug 2024 09:53:16 +0200 Subject: [PATCH 179/354] minor typos --- scripts/change_url | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index 8cadcea2..27839329 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -48,7 +48,7 @@ then # Change hostname for activity notifications exec_occ config:system:set overwrite.cli.url --value="https://${new_domain}${new_path}" - # Reload php fpm, necessary for force nextcloud to re-read config.php, cf opcache.revalidate_freq + # Reload PHP-FPM, necessary for force Nextcloud to re-read config.php, cf opcache.revalidate_freq ynh_systemd_action --service_name=php${phpversion}-fpm --action=reload fi From 1c8a1ba2c8ee6ff20fd23fe4c788617fae305846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Richter?= <2268851+x3rAx@users.noreply.github.com> Date: Wed, 14 Aug 2024 00:27:37 +0200 Subject: [PATCH 180/354] Fix removing ACL permissions on uninstall According to `man setfacl`, for the `--remove` option "[o]nly ACL entries without the perms field are accepted as parameters". --- scripts/remove | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/remove b/scripts/remove index c39ac68c..664e4a09 100755 --- a/scripts/remove +++ b/scripts/remove @@ -30,7 +30,7 @@ ynh_secure_remove --file="/etc/cron.d/$app" for i in $(ls /home); do # Clean ACL in every directories in /home, except those which start with 'yunohost.' [[ ! $i == yunohost.* ]] \ - && setfacl --remove g:$app:rwx 2>&1 + && setfacl --remove g:$app 2>&1 done #================================================= From aae9736b4337cf6b2b09c0162f0f6f35621849c4 Mon Sep 17 00:00:00 2001 From: ^x3ro Date: Wed, 14 Aug 2024 00:56:32 +0200 Subject: [PATCH 181/354] Fix: Add missing `file` argument to `setfacl` --- scripts/remove | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/remove b/scripts/remove index 664e4a09..78490fc3 100755 --- a/scripts/remove +++ b/scripts/remove @@ -30,7 +30,7 @@ ynh_secure_remove --file="/etc/cron.d/$app" for i in $(ls /home); do # Clean ACL in every directories in /home, except those which start with 'yunohost.' [[ ! $i == yunohost.* ]] \ - && setfacl --remove g:$app 2>&1 + && setfacl --remove g:$app -- "$i" 2>&1 done #================================================= From abfb04de912770b4ac07ca3dc5a453294c5c3df1 Mon Sep 17 00:00:00 2001 From: ^x3ro Date: Wed, 14 Aug 2024 01:15:44 +0200 Subject: [PATCH 182/354] Fix: Use absolute path for removing ACL permissions --- scripts/remove | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/remove b/scripts/remove index 78490fc3..1682dfc7 100755 --- a/scripts/remove +++ b/scripts/remove @@ -27,10 +27,10 @@ ynh_remove_fail2ban_config ynh_secure_remove --file="/etc/cron.d/$app" # Cleaning ACL in home directories -for i in $(ls /home); do +for path in /home/*; do # Clean ACL in every directories in /home, except those which start with 'yunohost.' - [[ ! $i == yunohost.* ]] \ - && setfacl --remove g:$app -- "$i" 2>&1 + [[ ! $path == /home/yunohost.* ]] \ + && setfacl --remove g:$app -- "$path" 2>&1 done #================================================= From d8737dbf7366e568f9f82e4b1e08177b3dae697b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 20 Aug 2024 20:30:17 +0200 Subject: [PATCH 183/354] Update manifest.toml --- manifest.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manifest.toml b/manifest.toml index c3b09e05..b3e7d35c 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.4~ynh2" +version = "29.0.5~ynh1" maintainers = ["kay0u"] @@ -19,7 +19,7 @@ code = "https://github.com/nextcloud/server" cpe = "cpe:2.3:a:nextcloud:nextcloud" [integration] -yunohost = ">= 11.2.20" +yunohost = ">= 11.2.27" architectures = ["amd64", "arm64", "armhf"] multi_instance = true @@ -65,8 +65,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.4.tar.bz2' - sha256 = '19c469e264b31ee80400f8396460854546569e88db4c15fc0854e192f96027eb' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.5.tar.bz2' + sha256 = 'c7fe9c61e5ec30a5e599e8f152a1825df684d30e899db0caa8868c8d67b53a2c' [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.8.tar.bz2' From a531164d9d6993626677de43f787faee42bcea9d Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 20 Aug 2024 18:30:24 +0000 Subject: [PATCH 184/354] Auto-update READMEs --- ALL_README.md | 1 + README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_ru.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++ README_zh_Hans.md | 2 +- 9 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 README_ru.md diff --git a/ALL_README.md b/ALL_README.md index 4ed64dd4..e3c80d23 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -6,4 +6,5 @@ - [Lire le README en français](README_fr.md) - [Le o README en galego](README_gl.md) - [Baca README dalam bahasa bahasa Indonesia](README_id.md) +- [Прочитать README на русский](README_ru.md) - [阅读中文(简体)的 README](README_zh_Hans.md) diff --git a/README.md b/README.md index 81eb8a69..2530f573 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Shipped version:** 29.0.4~ynh1 +**Shipped version:** 29.0.5~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 9b75f1c2..33673b92 100644 --- a/README_es.md +++ b/README_es.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión actual:** 29.0.4~ynh1 +**Versión actual:** 29.0.5~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 8b722e45..f657a4ac 100644 --- a/README_eu.md +++ b/README_eu.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Paketatutako bertsioa:** 29.0.4~ynh1 +**Paketatutako bertsioa:** 29.0.5~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index f59d5831..064a9d9d 100644 --- a/README_fr.md +++ b/README_fr.md @@ -23,7 +23,7 @@ Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateu L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. -**Version incluse :** 29.0.4~ynh1 +**Version incluse :** 29.0.5~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 9a823a38..86d544fb 100644 --- a/README_gl.md +++ b/README_gl.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión proporcionada:** 29.0.4~ynh1 +**Versión proporcionada:** 29.0.5~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index 71cbfaaf..aa9d19a9 100644 --- a/README_id.md +++ b/README_id.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versi terkirim:** 29.0.4~ynh1 +**Versi terkirim:** 29.0.5~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md new file mode 100644 index 00000000..9442e138 --- /dev/null +++ b/README_ru.md @@ -0,0 +1,55 @@ + + +# Nextcloud для YunoHost + +[![Уровень интеграции](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Состояние работы](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Состояние сопровождения](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) + +[![Установите Nextcloud с YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) + +*[Прочтите этот README на других языках.](./ALL_README.md)* + +> *Этот пакет позволяет Вам установить Nextcloud быстро и просто на YunoHost-сервер.* +> *Если у Вас нет YunoHost, пожалуйста, посмотрите [инструкцию](https://yunohost.org/install), чтобы узнать, как установить его.* + +## Обзор + +Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. + +In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). + +The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. + + +**Поставляемая версия:** 29.0.5~ynh1 + +**Демо-версия:** + +## Снимки экрана + +![Снимок экрана Nextcloud](./doc/screenshots/screenshot.png) + +## Документация и ресурсы + +- Официальный веб-сайт приложения: +- Официальная документация пользователя: +- Официальная документация администратора: +- Репозиторий кода главной ветки приложения: +- Магазин YunoHost: +- Сообщите об ошибке: + +## Информация для разработчиков + +Пришлите Ваш запрос на слияние в [ветку `testing`](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing). + +Чтобы попробовать ветку `testing`, пожалуйста, сделайте что-то вроде этого: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +или +sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +``` + +**Больше информации о пакетировании приложений:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 465182e3..0d157c07 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**分发版本:** 29.0.4~ynh1 +**分发版本:** 29.0.5~ynh1 **演示:** From 79ef249b5bdd01cb77a6b40fde5f9dc8d2e78449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 20 Aug 2024 20:30:48 +0200 Subject: [PATCH 185/354] Update manifest.toml --- manifest.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manifest.toml b/manifest.toml index 1111f56f..8102692a 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.4~ynh2" +version = "29.0.5~ynh1" maintainers = ["kay0u"] @@ -19,7 +19,7 @@ code = "https://github.com/nextcloud/server" cpe = "cpe:2.3:a:nextcloud:nextcloud" [integration] -yunohost = ">= 11.2" +yunohost = ">= 11.2.27" architectures = ["amd64", "arm64", "armhf"] multi_instance = true @@ -65,8 +65,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.4.tar.bz2' - sha256 = '19c469e264b31ee80400f8396460854546569e88db4c15fc0854e192f96027eb' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.5.tar.bz2' + sha256 = 'c7fe9c61e5ec30a5e599e8f152a1825df684d30e899db0caa8868c8d67b53a2c' [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.8.tar.bz2' From 2794d04a6b96334b6d2385c7c8098b6ebb65a8be Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 20 Aug 2024 18:30:53 +0000 Subject: [PATCH 186/354] Auto-update READMEs --- ALL_README.md | 1 + README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_ru.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++ README_zh_Hans.md | 2 +- 9 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 README_ru.md diff --git a/ALL_README.md b/ALL_README.md index 4ed64dd4..e3c80d23 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -6,4 +6,5 @@ - [Lire le README en français](README_fr.md) - [Le o README en galego](README_gl.md) - [Baca README dalam bahasa bahasa Indonesia](README_id.md) +- [Прочитать README на русский](README_ru.md) - [阅读中文(简体)的 README](README_zh_Hans.md) diff --git a/README.md b/README.md index 81eb8a69..2530f573 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Shipped version:** 29.0.4~ynh1 +**Shipped version:** 29.0.5~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 9b75f1c2..33673b92 100644 --- a/README_es.md +++ b/README_es.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión actual:** 29.0.4~ynh1 +**Versión actual:** 29.0.5~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 8b722e45..f657a4ac 100644 --- a/README_eu.md +++ b/README_eu.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Paketatutako bertsioa:** 29.0.4~ynh1 +**Paketatutako bertsioa:** 29.0.5~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index f59d5831..064a9d9d 100644 --- a/README_fr.md +++ b/README_fr.md @@ -23,7 +23,7 @@ Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateu L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. -**Version incluse :** 29.0.4~ynh1 +**Version incluse :** 29.0.5~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 9a823a38..86d544fb 100644 --- a/README_gl.md +++ b/README_gl.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión proporcionada:** 29.0.4~ynh1 +**Versión proporcionada:** 29.0.5~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index 71cbfaaf..aa9d19a9 100644 --- a/README_id.md +++ b/README_id.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versi terkirim:** 29.0.4~ynh1 +**Versi terkirim:** 29.0.5~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md new file mode 100644 index 00000000..9442e138 --- /dev/null +++ b/README_ru.md @@ -0,0 +1,55 @@ + + +# Nextcloud для YunoHost + +[![Уровень интеграции](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Состояние работы](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Состояние сопровождения](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) + +[![Установите Nextcloud с YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) + +*[Прочтите этот README на других языках.](./ALL_README.md)* + +> *Этот пакет позволяет Вам установить Nextcloud быстро и просто на YunoHost-сервер.* +> *Если у Вас нет YunoHost, пожалуйста, посмотрите [инструкцию](https://yunohost.org/install), чтобы узнать, как установить его.* + +## Обзор + +Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. + +In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). + +The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. + + +**Поставляемая версия:** 29.0.5~ynh1 + +**Демо-версия:** + +## Снимки экрана + +![Снимок экрана Nextcloud](./doc/screenshots/screenshot.png) + +## Документация и ресурсы + +- Официальный веб-сайт приложения: +- Официальная документация пользователя: +- Официальная документация администратора: +- Репозиторий кода главной ветки приложения: +- Магазин YunoHost: +- Сообщите об ошибке: + +## Информация для разработчиков + +Пришлите Ваш запрос на слияние в [ветку `testing`](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing). + +Чтобы попробовать ветку `testing`, пожалуйста, сделайте что-то вроде этого: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +или +sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +``` + +**Больше информации о пакетировании приложений:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 465182e3..0d157c07 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**分发版本:** 29.0.4~ynh1 +**分发版本:** 29.0.5~ynh1 **演示:** From d7d24034cfb81c63ca63e9ee388faba53debd39d Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 27 Aug 2024 14:52:11 +0200 Subject: [PATCH 187/354] Add notify push option (#417) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add notify_push option * self-test notify_push * fix notify_app * new permission hpb, some fixes * fix the restore script * fix restore² * fix upgrade * fix socket path * Update doc/DISCLAIMER_fr.md * split nginx conf * use official helpers with modified args * Auto-update READMEs * update nginx conf, add new services * add tests * add arch var * tests: enable_notify_push is false by default * fix upgrade * final_path -> install_dir * fix socket nginx path * add notify_push nginx conf before, so the reload in ynh_add_nginx_config load it * fully functional version * readd a removed fix * run cron task after notify push setup * Auto-update READMEs * remove systemd files * add notify push in config panel * add cron again because to make notify push happy * fix indent * enable/disable the notify push path * fix path unit * exec only for nextcloud user * move sock file to /var/run * start notify-push after the watcher * ² * remove warning * cron can sometimes fail when the database is not fully initialized, retries the cron job several times and catch catch the error on failure * oupsie * Apply suggestions from code review Co-authored-by: eric_G <46165813+ericgaspar@users.noreply.github.com> --------- Co-authored-by: Éric Gaspar <46165813+ericgaspar@users.noreply.github.com> Co-authored-by: yunohost-bot --- conf/config.json | 3 +- conf/nginx.conf | 2 ++ conf/notify_push.conf | 8 +++++ conf/systemd.service | 13 +++++++ conf/watcher.path | 11 ++++++ conf/watcher.service | 15 ++++++++ config_panel.toml | 12 +++++-- doc/ADMIN.md | 4 +++ doc/ADMIN_fr.md | 4 +++ manifest.toml | 6 ++++ scripts/backup | 20 ++++++++++- scripts/change_url | 50 ++++++++++++++++++++++++-- scripts/config | 84 ++++++++++++++++++++++++++++++++++++++----- scripts/install | 53 +++++++++++++++++++++++++++ scripts/remove | 8 +++++ scripts/restore | 45 +++++++++++++++++++++++ scripts/upgrade | 66 ++++++++++++++++++++++++++++++++++ tests.toml | 9 +++++ 18 files changed, 398 insertions(+), 15 deletions(-) create mode 100644 conf/notify_push.conf create mode 100644 conf/systemd.service create mode 100644 conf/watcher.path create mode 100644 conf/watcher.service diff --git a/conf/config.json b/conf/config.json index 6e4790cc..02d85721 100644 --- a/conf/config.json +++ b/conf/config.json @@ -30,7 +30,8 @@ "verify_peer": false, "verify_peer_name": false } - } + }, + "trusted_proxies": [ "127.0.0.1", "::1" ] }, "apps": { "user_ldap": { diff --git a/conf/nginx.conf b/conf/nginx.conf index 5a4f22a3..aabd4471 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -165,6 +165,8 @@ location ^~ __PATH__/ { try_files $uri / __PATH__/index.php$request_uri; } + include conf.d/__DOMAIN__.d/__APP__.d/*.conf; + # show YunoHost panel access include conf.d/yunohost_panel.conf.inc; } diff --git a/conf/notify_push.conf b/conf/notify_push.conf new file mode 100644 index 00000000..f2fb0520 --- /dev/null +++ b/conf/notify_push.conf @@ -0,0 +1,8 @@ +location ^~ __PATH__/push/ { + proxy_pass http://unix:/var/run/__APP__/notify-push.sock:/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +} \ No newline at end of file diff --git a/conf/systemd.service b/conf/systemd.service new file mode 100644 index 00000000..855a294f --- /dev/null +++ b/conf/systemd.service @@ -0,0 +1,13 @@ +[Unit] +Description = Push daemon for Nextcloud clients + +[Service] +Environment=SOCKET_PATH=/var/run/__APP__/notify-push.sock +Environment=ALLOW_SELF_SIGNED=true +ExecStart=__INSTALL_DIR__/apps/notify_push/bin/__ARCH__/notify_push __INSTALL_DIR__/config/config.php +Type=notify +User=__APP__ +Group=__APP__ + +[Install] +WantedBy = multi-user.target \ No newline at end of file diff --git a/conf/watcher.path b/conf/watcher.path new file mode 100644 index 00000000..67a5298b --- /dev/null +++ b/conf/watcher.path @@ -0,0 +1,11 @@ +[Unit] +Description=Restart Push daemon for Nextcloud clients when it receives updates +Documentation=https://github.com/nextcloud/notify_push +PartOf=__APP__-notify-push-watcher.service + +[Path] +PathModified=/var/www/nextcloud/apps/notify_push/bin/__ARCH__/notify_push +Unit=__APP__-notify-push-watcher.service + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/conf/watcher.service b/conf/watcher.service new file mode 100644 index 00000000..e2d9cfdf --- /dev/null +++ b/conf/watcher.service @@ -0,0 +1,15 @@ +[Unit] +Description=Restart Push daemon for Nextcloud clients when it receives updates +Documentation=https://github.com/nextcloud/notify_push +#Requires=__APP__-notify-push.service +After=__APP__-notify-push.service +StartLimitIntervalSec=10 +StartLimitBurst=5 + +[Service] +Type=oneshot +ExecStartPre=/usr/bin/chmod u+x __INSTALL_DIR__/apps/notify_push/bin/__ARCH__/notify_push +ExecStart=/usr/bin/systemctl restart __APP__-notify-push.service + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/config_panel.toml b/config_panel.toml index e5e88aed..b583fb4f 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -9,7 +9,7 @@ name = "Nextcloud configuration" [main.maintenance.maintenance_mode] ask = "Enable maintenance mode" type = "boolean" - default = "0" + default = false [main.maintenance.set_permissions_button] ask.en = "Set permissions for all data (Can take up to several hours if users have a lot of data)" @@ -22,8 +22,14 @@ name = "Nextcloud configuration" [main.addressbook.system_addressbook_exposed] ask = "Should there be a system address book listing all users, accessible by all users?" type = "boolean" - yes = "yes" - no = "no" + + [main.notify_push] + name = "Notify Push configuration" + + [main.notify_push.enable_notify_push] + ask.en = "Configure the High Performance Backend?" + ask.fr = "Configurer le Backend Hautes Performances ?" + type = "boolean" [main.php_fpm_config] name = "PHP-FPM configuration" diff --git a/doc/ADMIN.md b/doc/ADMIN.md index 8d401d2f..9b19c1b2 100644 --- a/doc/ADMIN.md +++ b/doc/ADMIN.md @@ -12,6 +12,10 @@ Alternatively, you may open a 'Nextcloud shell' with `sudo yunohost app shell __ ONLYOFFICE is an online rich text document editor which can be integrated in Nextcloud +#### High Performance Backend + +High Performance Backend is an application on Nextcloud that should speed up the instance, more information here: https://github.com/nextcloud/notify_push#about + #### With YunoHost App (ARM64 support, better performance) For better performance and ARM64 support (Raspberry Pi, OLinuXino...), install the [OnlyOffice YunoHost app](https://apps.yunohost.org/app/onlyoffice) and connect it to Nextcloud, see the tutorial in the [doc of onlyoffice_ynh package](https://github.com/YunoHost-Apps/onlyoffice_ynh/blob/master/README_fr.md#configuration-de-onlyoffice-server) diff --git a/doc/ADMIN_fr.md b/doc/ADMIN_fr.md index 06b76b12..5b52928a 100644 --- a/doc/ADMIN_fr.md +++ b/doc/ADMIN_fr.md @@ -12,6 +12,10 @@ Ou bien, vous pouvez ouvrir un "shell Nextcloud" avec `sudo yunohost app shell _ ONLYOFFICE est un éditeur de texte enrichi en ligne qui peut s'intégrer dans Nextcloud +#### Backend Hautes Performances + +Le backend Hautes Performances est une application sur Nextcloud qui devrait accélérer l'instance, plus d'informations ici : https://github.com/nextcloud/notify_push#about + #### Avec l'application YunoHost (support ARM64, meilleures performances) Pour de meilleures performances et le support de ARM64 (Raspberry Pi, OLinuXino...), installez l'[app YunoHost OnlyOffice](https://apps.yunohost.org/app/onlyoffice), puis connectez-la à Nextcloud : voir le tutoriel dans la [doc du paquet onlyoffice_ynh](https://github.com/YunoHost-Apps/onlyoffice_ynh/blob/master/README_fr.md#configuration-de-onlyoffice-server) diff --git a/manifest.toml b/manifest.toml index 8102692a..692685d4 100644 --- a/manifest.toml +++ b/manifest.toml @@ -60,6 +60,12 @@ ram.runtime = "512M" type = "boolean" default = true + [install.enable_notify_push] + ask.en = "Configure the High Performance Backend?" + ask.fr = "Configurer le Backend Hautes Performances ?" + type = "boolean" + default = false + [resources] [resources.sources] diff --git a/scripts/backup b/scripts/backup index d56a518c..56e6e0b2 100755 --- a/scripts/backup +++ b/scripts/backup @@ -28,7 +28,14 @@ ynh_backup --src_path="$install_dir" ynh_backup --src_path="$data_dir" --is_big #================================================= -# SYSTEM CONFIGURATION +# BACKUP THE NGINX CONFIGURATION +#================================================= + +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.d" + +#================================================= +# BACKUP THE PHP-FPM CONFIGURATION #================================================= # Backup the PHP-FPM configuration @@ -59,6 +66,17 @@ ynh_print_info --message="Backing up the MySQL database..." ynh_mysql_dump_db --database="$db_name" --default_character_set="utf8mb4" > db.sql +#================================================= +# BACKUP THE NOTIFY_PUSH APP +#================================================= + +if [ $enable_notify_push -eq 1 ] +then + ynh_backup --src_path="/etc/systemd/system/${app}-notify-push.service" + ynh_backup --src_path="/etc/systemd/system/${app}-notify-push-watcher.service" + ynh_backup --src_path="/etc/systemd/system/${app}-notify-push-watcher.path" +fi + #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/change_url b/scripts/change_url index 27839329..326594f8 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -50,16 +50,62 @@ then # Reload PHP-FPM, necessary for force Nextcloud to re-read config.php, cf opcache.revalidate_freq ynh_systemd_action --service_name=php${phpversion}-fpm --action=reload + + mv /etc/nginx/conf.d/$old_domain.d/$app.d /etc/nginx/conf.d/$new_domain.d/$app.d +fi + +#================================================= +# CONFIGURE NOTIFY_PUSH APP +#================================================= + +if [ $enable_notify_push -eq 1 ] +then + domain="$new_domain" + path_url="$new_path" + + ynh_add_config --template="notify_push.conf" --destination="/etc/nginx/conf.d/$domain.d/$app.d/notify_push.conf" + + ynh_systemd_action --service_name=nginx --action=reload + + case $YNH_ARCH in + amd64) arch="x86_64";; + arm64) arch="aarch64";; + armel|armhf) arch="armv7";; + esac + + ynh_add_config --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_add_systemd_config --service="${app}-notify-push-watcher" --template="watcher.service" + systemctl enable --now ${app}-notify-push-watcher.path + ynh_add_systemd_config --service="${app}-notify-push" + + count=0 + while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] + do + sleep 1 + count=$((count + 1)) + done + + ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" --action=restart + + exec_occ config:app:set notify_push base_endpoint --value https://$domain${path_url%/}/push + + if ! exec_occ notify_push:self-test; then + ynh_print_warn --message="The High Performance Backend service is still not working properly. Please log in with a user to your NextCloud instance, restart the High Performance Backend service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + fi fi #================================================= -# SETUP SSOWAT +# GENERIC FINALISATION #================================================= -ynh_script_progression --message="Configuring permissions..." +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." # Temporary fix for the API permission (workaround for https://github.com/YunoHost/issues/issues/2294 ) ynh_permission_url --permission="api" --url="re:$new_domain\/.well-known\/.*" --auth_header="false" --clear_urls +ynh_systemd_action --service_name=nginx --action=reload + #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/config b/scripts/config index e2310095..189c4489 100644 --- a/scripts/config +++ b/scripts/config @@ -18,6 +18,11 @@ ynh_abort_if_errors phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) current_fpm_footprint=$(ynh_app_setting_get --app=$app --key=fpm_footprint) +exec_occ() { + (cd "$install_dir" && ynh_exec_as "$app" \ + php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") +} + #================================================= # SPECIFIC GETTERS FOR TOML SHORT KEY #================================================= @@ -39,8 +44,7 @@ get__maintenance_mode() { } get__system_addressbook_exposed() { - echo $(cd "$install_dir" && ynh_exec_as "$app" \ - php${phpversion} --define apc.enable_cli=1 occ config:app:get dav system_addressbook_exposed) + echo $(exec_occ config:app:get dav system_addressbook_exposed) } get__fpm_footprint() { @@ -73,24 +77,88 @@ get__fpm_free_footprint() { set__maintenance_mode() { if [ "$maintenance_mode" -eq "0" ]; then # If maintenance_mode was set to 0, disable maintenance mode - (cd "$install_dir" && ynh_exec_as "$app" \ - php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi maintenance:mode --off) + exec_occ maintenance:mode --off ynh_print_info "Maintenance mode disabled" elif [ "$maintenance_mode" -eq "1" ]; then # If maintenance_mode was set to 1, enable maintenance mode - (cd "$install_dir" && ynh_exec_as "$app" \ - php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi maintenance:mode --on) + exec_occ maintenance:mode --on ynh_print_info "Maintenance mode enabled" fi ynh_app_setting_set --app=$app --key=maintenance_mode --value="$maintenance_mode" } set__system_addressbook_exposed() { - (cd "$install_dir" && ynh_exec_as "$app" \ - php${phpversion} --define apc.enable_cli=1 occ config:app:set dav system_addressbook_exposed --value="$system_addressbook_exposed") + exec_occ config:app:set dav system_addressbook_exposed --value="$system_addressbook_exposed" ynh_print_info "System addressbook is exposed: $system_addressbook_exposed" } + +set__enable_notify_push() { + if [ "$enable_notify_push" -eq "0" ]; then + nginx_extra_conf_dir="/etc/nginx/conf.d/$domain.d/$app.d" + ynh_secure_remove --file="$nginx_extra_conf_dir/notify_push.conf" + ynh_systemd_action --service_name="nginx" --action=reload + + # If notify_push is enabled, disable it + if exec_occ app:list | awk '/Enabled/{f=1;next} f' | grep -q -w notify_push; then + exec_occ app:disable notify_push + fi + + ynh_remove_systemd_config --service="${app}-notify-push" + systemctl disable --now "${app}-notify-push-watcher.path" + ynh_secure_remove --file="/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_remove_systemd_config --service="${app}-notify-push-watcher" + + ynh_print_info "Notify push disabled" + elif [ "$enable_notify_push" -eq "1" ]; then + nginx_extra_conf_dir="/etc/nginx/conf.d/$domain.d/$app.d" + mkdir -p "$nginx_extra_conf_dir" + + ynh_add_config --template="notify_push.conf" --destination="$nginx_extra_conf_dir/notify_push.conf" + + ynh_systemd_action --service_name="nginx" --action=reload + + # If notify_push is disabled, reenable it + if exec_occ app:list | awk '/Disabled/{f=1;next} f' | grep -q -w notify_push; then + exec_occ app:enable notify_push + # If notify_push is not installed, install it + elif ! exec_occ app:list | awk '/Enabled/{f=1;next} /Disabled/{f=0} f' | grep -q -w notify_push; then + exec_occ app:install notify_push + fi + exec_occ config:app:set notify_push base_endpoint --value https://$domain${path_url%/}/push + + mkdir -p /var/run/$app/ + chown $app: /var/run/$app/ + + case $YNH_ARCH in + amd64) arch="x86_64";; + arm64) arch="aarch64";; + armel|armhf) arch="armv7";; + esac + + ynh_add_config --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_add_systemd_config --service="${app}-notify-push-watcher" --template="watcher.service" + systemctl enable --now ${app}-notify-push-watcher.path + ynh_add_systemd_config --service="${app}-notify-push" + + count=0 + while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] + do + sleep 1 + count=$((count + 1)) + done + + ynh_systemd_action --service_name="${app}-notify-push-watcher" --action=restart + ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" + + if ! exec_occ notify_push:self-test; then + ynh_print_warn --message="The High Performance Backend service is still not working properly. Please log in with a user to your NextCloud instance, restart the High Performance Backend service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + fi + ynh_print_info "Notify push enabled" + fi + ynh_app_setting_set --app=$app --key=enable_notify_push --value="$enable_notify_push" +} + set__fpm_footprint() { if [ "$fpm_footprint" != "specific" ] then diff --git a/scripts/install b/scripts/install index 0987b848..2df768af 100755 --- a/scripts/install +++ b/scripts/install @@ -49,6 +49,14 @@ then sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "../conf/nginx.conf" fi +nginx_extra_conf_dir="/etc/nginx/conf.d/$domain.d/$app.d" +mkdir -p "$nginx_extra_conf_dir" + +if [ $enable_notify_push -eq 1 ] +then + ynh_add_config --template="notify_push.conf" --destination="$nginx_extra_conf_dir/notify_push.conf" +fi + # Create a dedicated NGINX config ynh_add_nginx_config @@ -195,6 +203,30 @@ exec_occ config:app:set dav system_addressbook_exposed --value="$system_addressb # Calculate and store the config file checksum into the app settings ynh_store_file_checksum --file="$install_dir/config/config.php" +#================================================= +# CONFIGURE NOTIFY_PUSH APP +#================================================= + +if [ $enable_notify_push -eq 1 ] +then + exec_occ app:install notify_push + exec_occ config:app:set notify_push base_endpoint --value https://$domain${path_url%/}/push + + mkdir -p /var/run/$app/ + chown $app: /var/run/$app/ + + case $YNH_ARCH in + amd64) arch="x86_64";; + arm64) arch="aarch64";; + armel|armhf) arch="armv7";; + esac + + ynh_add_config --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_add_systemd_config --service="${app}-notify-push-watcher" --template="watcher.service" + systemctl enable --now ${app}-notify-push-watcher.path + ynh_add_systemd_config --service="${app}-notify-push" +fi + #================================================= # ADD A CRON JOB #================================================= @@ -261,6 +293,27 @@ ynh_script_progression --message="Configuring Fail2Ban..." --weight=8 # Create a dedicated Fail2Ban config ynh_add_fail2ban_config --logpath="/var/log/$app/nextcloud.log" --failregex="^.*Login failed: '.*' \(Remote IP: ''.*$" --max_retry=5 +#================================================= +# CHECK IF NOTIFY_PUSH WORKS +#================================================= + +if [ $enable_notify_push -eq 1 ] +then + count=0 + while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] + do + sleep 1 + count=$((count + 1)) + done + + ynh_systemd_action --service_name="${app}-notify-push-watcher" --action=restart + ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" + + if ! exec_occ notify_push:self-test; then + ynh_print_warn --message="The High Performance Backend service is still not working properly. Please log in with a user to your NextCloud instance, restart the High Performance Backend service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + fi +fi + #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/remove b/scripts/remove index c39ac68c..0cc72dba 100755 --- a/scripts/remove +++ b/scripts/remove @@ -12,6 +12,7 @@ ynh_script_progression --message="Removing system configurations related to $app # Remove the dedicated NGINX config ynh_remove_nginx_config +ynh_secure_remove --file="/etc/nginx/conf.d/$domain.d/$app.d" # Remove the dedicated PHP-FPM config ynh_remove_fpm_config @@ -22,6 +23,13 @@ ynh_remove_logrotate # Remove the dedicated Fail2Ban config ynh_remove_fail2ban_config +# Remove notify push +ynh_remove_systemd_config --service="${app}-notify-push" +ynh_exec_warn_less systemctl disable --now ${app}-notify-push-watcher.path +ynh_secure_remove --file="/etc/systemd/system/${app}-notify-push-watcher.path" +ynh_remove_systemd_config --service="${app}-notify-push-watcher" +ynh_secure_remove --file="/var/run/$app" + # Remove a cron file # TODO: Ensure that cron job is not running (How !?) ynh_secure_remove --file="/etc/cron.d/$app" diff --git a/scripts/restore b/scripts/restore index 9ae36115..1393ae34 100755 --- a/scripts/restore +++ b/scripts/restore @@ -36,6 +36,7 @@ ynh_add_fpm_config #================================================= ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.d" # Check if .well-known is available for this domain if is_url_handled --domain="$domain" --path="/.well-known/caldav" || is_url_handled --domain="$domain" --path="/.well-known/carddav" @@ -123,6 +124,24 @@ fi ynh_systemd_action --action=restart --service_name=fail2ban +#================================================= +# RESTORE THE NOTIFY_PUSH APP +#================================================= + +if [ $enable_notify_push -eq 1 ] +then + mkdir -p /var/run/$app/ + chown $app: /var/run/$app/ + + ynh_restore_file --origin_path="/etc/systemd/system/${app}-notify-push.service" + ynh_restore_file --origin_path="/etc/systemd/system/${app}-notify-push-watcher.service" + ynh_restore_file --origin_path="/etc/systemd/system/${app}-notify-push-watcher.path" + + systemctl enable --now "${app}-notify-push-watcher.service" --quiet + systemctl enable --now "${app}-notify-push-watcher.path" --quiet + systemctl enable --now "${app}-notify-push.service" --quiet +fi + #================================================= # GENERIC FINALIZATION #================================================= @@ -132,6 +151,32 @@ ynh_script_progression --message="Reloading NGINX web server..." --weight=3 ynh_systemd_action --service_name=nginx --action=reload +#================================================= +# CHECK IF NOTIFY_PUSH WORKS +#================================================= + +exec_occ() { + (cd "$install_dir" && ynh_exec_as "$app" \ + php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") +} + +if [ $enable_notify_push -eq 1 ] +then + count=0 + while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] + do + sleep 1 + count=$((count + 1)) + done + + ynh_systemd_action --service_name="${app}-notify-push-watcher" --action=restart + ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" --action=restart + + if ! exec_occ notify_push:self-test; then + ynh_print_warn --message="The High Performance Backend service is still not working properly. Please log in with a user to your NextCloud instance, restart the High Performance Backend service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + fi +fi + #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index c4b764cd..7706d059 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -24,6 +24,11 @@ elif [ "${system_addressbook_exposed,,}" = "no" ]; then system_addressbook_exposed=0 fi +if [ -z ${enable_notify_push:-} ]; then + ynh_app_setting_set --app=$app --key=enable_notify_push --value=0 + enable_notify_push=0 +fi + # Remove the option backup_core_only if it's in the settings.yml file ynh_app_setting_delete --app=$app --key=backup_core_only @@ -365,9 +370,49 @@ then sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "../conf/nginx.conf" fi +# Create a dedicated NGINX config +nginx_extra_conf_dir="/etc/nginx/conf.d/$domain.d/$app.d" +mkdir -p "$nginx_extra_conf_dir" + +if [ $enable_notify_push -eq 1 ] +then + ynh_add_config --template="notify_push.conf" --destination="$nginx_extra_conf_dir/notify_push.conf" +fi + # Create a dedicated NGINX config ynh_add_nginx_config +#================================================= +# CONFIGURE NOTIFY_PUSH APP +#================================================= + +if [ $enable_notify_push -eq 1 ] +then + # If notify_push is disabled, reenable it + if exec_occ app:list | awk '/Disabled/{f=1;next} f' | grep -q -w notify_push; then + exec_occ app:enable notify_push + # If notify_push is not installed, install it + elif ! exec_occ app:list | awk '/Enabled/{f=1;next} /Disabled/{f=0} f' | grep -q -w notify_push; then + exec_occ app:install notify_push + fi + exec_occ config:app:set notify_push base_endpoint --value https://$domain${path_url%/}/push + + mkdir -p /var/run/$app/ + chown $app: /var/run/$app/ + + case $YNH_ARCH in + amd64) arch="x86_64";; + arm64) arch="aarch64";; + armel|armhf) arch="armv7";; + esac + + ynh_add_config --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_add_systemd_config --service="${app}-notify-push-watcher" --template="watcher.service" + systemctl enable --now ${app}-notify-push-watcher.path + ynh_add_systemd_config --service="${app}-notify-push" +fi + + #================================================= # CRON JOB #================================================= @@ -392,6 +437,27 @@ ynh_use_logrotate --non-append # Create a dedicated Fail2Ban config ynh_add_fail2ban_config --logpath="/var/log/$app/nextcloud.log" --failregex="^.*Login failed: '.*' \(Remote IP: ''.*$" --max_retry=5 +#================================================= +# CHECK IF NOTIFY_PUSH WORKS +#================================================= + +if [ $enable_notify_push -eq 1 ] +then + count=0 + while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] + do + sleep 1 + count=$((count + 1)) + done + + ynh_systemd_action --service_name="${app}-notify-push-watcher" --action=restart + ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" --action=restart + + if ! exec_occ notify_push:self-test; then + ynh_print_warn --message="The High Performance Backend service is still not working properly. Please log in with a user to your NextCloud instance, restart the High Performance Backend service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + fi +fi + #================================================= # END OF SCRIPT #================================================= diff --git a/tests.toml b/tests.toml index cdd5e776..a7671f20 100644 --- a/tests.toml +++ b/tests.toml @@ -2,6 +2,8 @@ test_format = 1.0 [default] + args.enable_notify_push = "0" + # ------------------------------- # Commits to test upgrade from # ------------------------------- @@ -11,3 +13,10 @@ test_format = 1.0 test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" + +[notify_push_test] + + args.enable_notify_push = "1" + test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" + test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" + From aca04bd274698ebd90e7ee53e9b8f669eecc7b83 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Date: Fri, 30 Aug 2024 18:52:13 +0200 Subject: [PATCH 188/354] Remove ~duplicate pre-upgrade message (#723) --- doc/PRE_UPGRADE.d/28.0.3~ynh1.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 doc/PRE_UPGRADE.d/28.0.3~ynh1.md diff --git a/doc/PRE_UPGRADE.d/28.0.3~ynh1.md b/doc/PRE_UPGRADE.d/28.0.3~ynh1.md deleted file mode 100644 index 663bc771..00000000 --- a/doc/PRE_UPGRADE.d/28.0.3~ynh1.md +++ /dev/null @@ -1,3 +0,0 @@ -If you are upgrading to a new major version of Nextcloud, please make sure that your Nextcloud apps are up to date from Nextcloud's administration panel beforehand. - -Additionally, if you installed specific Nextcloud apps, we recommend making sure that they are compatible with the new major version. YunoHost will attempt to check this automatically at the very beginning of the upgrade, but a manual check doesn't hurt either. For Nextcloud 28, this forum thread might be helpful : . From 19ae3b021f4395d4543181836aee1a1ce4932919 Mon Sep 17 00:00:00 2001 From: Kayou Date: Sun, 1 Sep 2024 10:51:41 +0200 Subject: [PATCH 189/354] Fix notify_push after reboot/restart the service, create the folder /var/run/nextcloud via systemd --- conf/systemd.service | 1 + scripts/config | 3 --- scripts/install | 3 --- scripts/remove | 1 - scripts/restore | 3 --- scripts/upgrade | 3 --- 6 files changed, 1 insertion(+), 13 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index 855a294f..bbe65732 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -4,6 +4,7 @@ Description = Push daemon for Nextcloud clients [Service] Environment=SOCKET_PATH=/var/run/__APP__/notify-push.sock Environment=ALLOW_SELF_SIGNED=true +RuntimeDirectory=__APP__ ExecStart=__INSTALL_DIR__/apps/notify_push/bin/__ARCH__/notify_push __INSTALL_DIR__/config/config.php Type=notify User=__APP__ diff --git a/scripts/config b/scripts/config index 189c4489..d756fa9f 100644 --- a/scripts/config +++ b/scripts/config @@ -127,9 +127,6 @@ set__enable_notify_push() { fi exec_occ config:app:set notify_push base_endpoint --value https://$domain${path_url%/}/push - mkdir -p /var/run/$app/ - chown $app: /var/run/$app/ - case $YNH_ARCH in amd64) arch="x86_64";; arm64) arch="aarch64";; diff --git a/scripts/install b/scripts/install index 2df768af..a4ef70aa 100755 --- a/scripts/install +++ b/scripts/install @@ -212,9 +212,6 @@ then exec_occ app:install notify_push exec_occ config:app:set notify_push base_endpoint --value https://$domain${path_url%/}/push - mkdir -p /var/run/$app/ - chown $app: /var/run/$app/ - case $YNH_ARCH in amd64) arch="x86_64";; arm64) arch="aarch64";; diff --git a/scripts/remove b/scripts/remove index 7f67cf5b..4bf6421b 100755 --- a/scripts/remove +++ b/scripts/remove @@ -28,7 +28,6 @@ ynh_remove_systemd_config --service="${app}-notify-push" ynh_exec_warn_less systemctl disable --now ${app}-notify-push-watcher.path ynh_secure_remove --file="/etc/systemd/system/${app}-notify-push-watcher.path" ynh_remove_systemd_config --service="${app}-notify-push-watcher" -ynh_secure_remove --file="/var/run/$app" # Remove a cron file # TODO: Ensure that cron job is not running (How !?) diff --git a/scripts/restore b/scripts/restore index 1393ae34..d9544306 100755 --- a/scripts/restore +++ b/scripts/restore @@ -130,9 +130,6 @@ ynh_systemd_action --action=restart --service_name=fail2ban if [ $enable_notify_push -eq 1 ] then - mkdir -p /var/run/$app/ - chown $app: /var/run/$app/ - ynh_restore_file --origin_path="/etc/systemd/system/${app}-notify-push.service" ynh_restore_file --origin_path="/etc/systemd/system/${app}-notify-push-watcher.service" ynh_restore_file --origin_path="/etc/systemd/system/${app}-notify-push-watcher.path" diff --git a/scripts/upgrade b/scripts/upgrade index 7706d059..53131094 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -397,9 +397,6 @@ then fi exec_occ config:app:set notify_push base_endpoint --value https://$domain${path_url%/}/push - mkdir -p /var/run/$app/ - chown $app: /var/run/$app/ - case $YNH_ARCH in amd64) arch="x86_64";; arm64) arch="aarch64";; From aa5842d2b6aa3ffbbd54f967784e7016d74a01ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:24:36 +0200 Subject: [PATCH 190/354] Update manifest.toml --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 692685d4..78d412b0 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.5~ynh1" +version = "29.0.6~ynh1" maintainers = ["kay0u"] @@ -71,8 +71,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.5.tar.bz2' - sha256 = 'c7fe9c61e5ec30a5e599e8f152a1825df684d30e899db0caa8868c8d67b53a2c' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.6.tar.bz2' + sha256 = 'dc60be03fd17e30bafef2a4d4feb2d096aa77a4c6b4f21c985760e537f8401e3' [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.8.tar.bz2' From 6f7509a790bcdf0fc067f9bc0b4c73ed7605948c Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 3 Sep 2024 12:24:41 +0000 Subject: [PATCH 191/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2530f573..759443d9 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Shipped version:** 29.0.5~ynh1 +**Shipped version:** 29.0.6~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 33673b92..6b7c9c72 100644 --- a/README_es.md +++ b/README_es.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión actual:** 29.0.5~ynh1 +**Versión actual:** 29.0.6~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index f657a4ac..5f56146e 100644 --- a/README_eu.md +++ b/README_eu.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Paketatutako bertsioa:** 29.0.5~ynh1 +**Paketatutako bertsioa:** 29.0.6~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index 064a9d9d..f325e31b 100644 --- a/README_fr.md +++ b/README_fr.md @@ -23,7 +23,7 @@ Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateu L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. -**Version incluse :** 29.0.5~ynh1 +**Version incluse :** 29.0.6~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 86d544fb..7caea123 100644 --- a/README_gl.md +++ b/README_gl.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión proporcionada:** 29.0.5~ynh1 +**Versión proporcionada:** 29.0.6~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index aa9d19a9..5cb871a2 100644 --- a/README_id.md +++ b/README_id.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versi terkirim:** 29.0.5~ynh1 +**Versi terkirim:** 29.0.6~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md index 9442e138..782ca443 100644 --- a/README_ru.md +++ b/README_ru.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Поставляемая версия:** 29.0.5~ynh1 +**Поставляемая версия:** 29.0.6~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 0d157c07..02dce2c7 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**分发版本:** 29.0.5~ynh1 +**分发版本:** 29.0.6~ynh1 **演示:** From 46bffb07976b445c65ab6555c3055dde3b6172d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:38:33 +0200 Subject: [PATCH 192/354] Update backup --- scripts/backup | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/backup b/scripts/backup index 56e6e0b2..d9ecab9b 100755 --- a/scripts/backup +++ b/scripts/backup @@ -35,7 +35,7 @@ ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.d" #================================================= -# BACKUP THE PHP-FPM CONFIGURATION +# SYSTEM CONFIGURATION #================================================= # Backup the PHP-FPM configuration From 294298df8dbb4dde40e95e0f41fabb9bd4371564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:51:44 +0200 Subject: [PATCH 193/354] Update upgrade --- scripts/upgrade | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index c31d60f2..88d36e4c 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -299,6 +299,12 @@ then # Then remove the config file ynh_secure_remove --file="$nc_conf" + # Occasionally new mimetypes are added to better handle certain file types. + # Migrating the mimetypes take a long time on larger instances + # so this is not done automatically during upgrades. + # Use the command `occ maintenance:repair --include-expensive` to perform the migrations. + exec_occ maintenance:repair --include-expensive + #================================================= # ALLOW USERS TO DISCONNECT FROM NEXTCLOUD #================================================= From 4e0a6356b87550ab134b8c15c3da3e55569086c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:58:06 +0200 Subject: [PATCH 194/354] Update upgrade --- scripts/upgrade | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 88d36e4c..4c198021 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -302,9 +302,8 @@ then # Occasionally new mimetypes are added to better handle certain file types. # Migrating the mimetypes take a long time on larger instances # so this is not done automatically during upgrades. - # Use the command `occ maintenance:repair --include-expensive` to perform the migrations. exec_occ maintenance:repair --include-expensive - + #================================================= # ALLOW USERS TO DISCONNECT FROM NEXTCLOUD #================================================= From 090070c80c33b30c35876a93db44b3878ac6b5bc Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 12 Sep 2024 13:35:01 +0000 Subject: [PATCH 195/354] Auto-update READMEs --- ALL_README.md | 1 + README_es.md | 2 +- README_nl.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 README_nl.md diff --git a/ALL_README.md b/ALL_README.md index e3c80d23..df3708bc 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -6,5 +6,6 @@ - [Lire le README en français](README_fr.md) - [Le o README en galego](README_gl.md) - [Baca README dalam bahasa bahasa Indonesia](README_id.md) +- [Lees de README in het Nederlands](README_nl.md) - [Прочитать README на русский](README_ru.md) - [阅读中文(简体)的 README](README_zh_Hans.md) diff --git a/README_es.md b/README_es.md index 6b7c9c72..1351d703 100644 --- a/README_es.md +++ b/README_es.md @@ -42,7 +42,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD ## Información para desarrolladores -Por favor enviar sus correcciones a la [`branch testing`](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing +Por favor enviar sus correcciones a la [rama `testing`](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing). Para probar la rama `testing`, sigue asÍ: diff --git a/README_nl.md b/README_nl.md new file mode 100644 index 00000000..0053c10e --- /dev/null +++ b/README_nl.md @@ -0,0 +1,55 @@ + + +# Nextcloud voor Yunohost + +[![Integratieniveau](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Mate van functioneren](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Onderhoudsstatus](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) + +[![Nextcloud met Yunohost installeren](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) + +*[Deze README in een andere taal lezen.](./ALL_README.md)* + +> *Met dit pakket kun je Nextcloud snel en eenvoudig op een YunoHost-server installeren.* +> *Als je nog geen YunoHost hebt, lees dan [de installatiehandleiding](https://yunohost.org/install), om te zien hoe je 'm installeert.* + +## Overzicht + +Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. + +In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). + +The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. + + +**Geleverde versie:** 29.0.6~ynh1 + +**Demo:** + +## Schermafdrukken + +![Schermafdrukken van Nextcloud](./doc/screenshots/screenshot.png) + +## Documentatie en bronnen + +- Officiele website van de app: +- Officiele gebruikersdocumentatie: +- Officiele beheerdersdocumentatie: +- Upstream app codedepot: +- YunoHost-store: +- Meld een bug: + +## Ontwikkelaarsinformatie + +Stuur je pull request alsjeblieft naar de [`testing`-branch](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing). + +Om de `testing`-branch uit te proberen, ga als volgt te werk: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +of +sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +``` + +**Verdere informatie over app-packaging:** From af3a5717eacafe7ebe92bb5616ab74c6cbd74d45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Sep 2024 18:17:29 +0200 Subject: [PATCH 196/354] 29.0.7 --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 78d412b0..286d942b 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.6~ynh1" +version = "29.0.7~ynh1" maintainers = ["kay0u"] @@ -71,8 +71,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.6.tar.bz2' - sha256 = 'dc60be03fd17e30bafef2a4d4feb2d096aa77a4c6b4f21c985760e537f8401e3' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.7.tar.bz2' + sha256 = 'f532ffc31be5a8374b5e072b86fff8765ec19fda0c8509cee39873081db2c544' [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.8.tar.bz2' From f43dc34f941f0328ea6519a4d9019eb7b4f68f1b Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 12 Sep 2024 16:17:37 +0000 Subject: [PATCH 197/354] Auto-update READMEs --- ALL_README.md | 1 + README.md | 2 +- README_es.md | 4 ++-- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++ README_ru.md | 2 +- README_zh_Hans.md | 2 +- 10 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 README_nl.md diff --git a/ALL_README.md b/ALL_README.md index e3c80d23..df3708bc 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -6,5 +6,6 @@ - [Lire le README en français](README_fr.md) - [Le o README en galego](README_gl.md) - [Baca README dalam bahasa bahasa Indonesia](README_id.md) +- [Lees de README in het Nederlands](README_nl.md) - [Прочитать README на русский](README_ru.md) - [阅读中文(简体)的 README](README_zh_Hans.md) diff --git a/README.md b/README.md index 759443d9..16c56456 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Shipped version:** 29.0.6~ynh1 +**Shipped version:** 29.0.7~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 6b7c9c72..9b89abb8 100644 --- a/README_es.md +++ b/README_es.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión actual:** 29.0.6~ynh1 +**Versión actual:** 29.0.7~ynh1 **Demo:** @@ -42,7 +42,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD ## Información para desarrolladores -Por favor enviar sus correcciones a la [`branch testing`](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing +Por favor enviar sus correcciones a la [rama `testing`](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing). Para probar la rama `testing`, sigue asÍ: diff --git a/README_eu.md b/README_eu.md index 5f56146e..6fe3a99b 100644 --- a/README_eu.md +++ b/README_eu.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Paketatutako bertsioa:** 29.0.6~ynh1 +**Paketatutako bertsioa:** 29.0.7~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index f325e31b..6dfdf439 100644 --- a/README_fr.md +++ b/README_fr.md @@ -23,7 +23,7 @@ Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateu L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. -**Version incluse :** 29.0.6~ynh1 +**Version incluse :** 29.0.7~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 7caea123..4afd44f6 100644 --- a/README_gl.md +++ b/README_gl.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión proporcionada:** 29.0.6~ynh1 +**Versión proporcionada:** 29.0.7~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index 5cb871a2..a8125924 100644 --- a/README_id.md +++ b/README_id.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versi terkirim:** 29.0.6~ynh1 +**Versi terkirim:** 29.0.7~ynh1 **Demo:** diff --git a/README_nl.md b/README_nl.md new file mode 100644 index 00000000..2de2e2ab --- /dev/null +++ b/README_nl.md @@ -0,0 +1,55 @@ + + +# Nextcloud voor Yunohost + +[![Integratieniveau](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Mate van functioneren](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Onderhoudsstatus](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) + +[![Nextcloud met Yunohost installeren](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) + +*[Deze README in een andere taal lezen.](./ALL_README.md)* + +> *Met dit pakket kun je Nextcloud snel en eenvoudig op een YunoHost-server installeren.* +> *Als je nog geen YunoHost hebt, lees dan [de installatiehandleiding](https://yunohost.org/install), om te zien hoe je 'm installeert.* + +## Overzicht + +Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. + +In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). + +The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. + + +**Geleverde versie:** 29.0.7~ynh1 + +**Demo:** + +## Schermafdrukken + +![Schermafdrukken van Nextcloud](./doc/screenshots/screenshot.png) + +## Documentatie en bronnen + +- Officiele website van de app: +- Officiele gebruikersdocumentatie: +- Officiele beheerdersdocumentatie: +- Upstream app codedepot: +- YunoHost-store: +- Meld een bug: + +## Ontwikkelaarsinformatie + +Stuur je pull request alsjeblieft naar de [`testing`-branch](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing). + +Om de `testing`-branch uit te proberen, ga als volgt te werk: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +of +sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +``` + +**Verdere informatie over app-packaging:** diff --git a/README_ru.md b/README_ru.md index 782ca443..de39df71 100644 --- a/README_ru.md +++ b/README_ru.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Поставляемая версия:** 29.0.6~ynh1 +**Поставляемая версия:** 29.0.7~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 02dce2c7..d94cc152 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**分发版本:** 29.0.6~ynh1 +**分发版本:** 29.0.7~ynh1 **演示:** From fd7cfa6d1b44d28abbd01cb65d9370e89f9beaf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 14 Sep 2024 12:11:49 +0200 Subject: [PATCH 198/354] 30.0.0 --- manifest.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index c3d74451..b7c444de 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.7~ynh1" +version = "30.0.0~ynh1" maintainers = ["kay0u"] @@ -70,6 +70,10 @@ ram.runtime = "512M" [resources.sources] + [resources.sources.main] + url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.0.tar.bz2' + sha256 = '18d7a80957bb53e94fb04492f6b5213434dda3e9da12d9f789997687c8564e60' + [resources.sources.main] url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.7.tar.bz2' sha256 = 'f532ffc31be5a8374b5e072b86fff8765ec19fda0c8509cee39873081db2c544' From 9b0133fc5339b177abaf1b8266074bcf116b6489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 14 Sep 2024 12:13:23 +0200 Subject: [PATCH 199/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index b7c444de..617cd870 100644 --- a/manifest.toml +++ b/manifest.toml @@ -74,7 +74,7 @@ ram.runtime = "512M" url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.0.tar.bz2' sha256 = '18d7a80957bb53e94fb04492f6b5213434dda3e9da12d9f789997687c8564e60' - [resources.sources.main] + [resources.sources.29] url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.7.tar.bz2' sha256 = 'f532ffc31be5a8374b5e072b86fff8765ec19fda0c8509cee39873081db2c544' From 68d6833b5d4dfd5898bbade2f2df05cf7208f86f Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sat, 14 Sep 2024 10:13:29 +0000 Subject: [PATCH 200/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 16c56456..8ed124c8 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Shipped version:** 29.0.7~ynh1 +**Shipped version:** 30.0.0~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 9b89abb8..bd0d84ba 100644 --- a/README_es.md +++ b/README_es.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión actual:** 29.0.7~ynh1 +**Versión actual:** 30.0.0~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 6fe3a99b..ac5294b9 100644 --- a/README_eu.md +++ b/README_eu.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Paketatutako bertsioa:** 29.0.7~ynh1 +**Paketatutako bertsioa:** 30.0.0~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index 6dfdf439..d108bc9b 100644 --- a/README_fr.md +++ b/README_fr.md @@ -23,7 +23,7 @@ Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateu L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. -**Version incluse :** 29.0.7~ynh1 +**Version incluse :** 30.0.0~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 4afd44f6..cbef464e 100644 --- a/README_gl.md +++ b/README_gl.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión proporcionada:** 29.0.7~ynh1 +**Versión proporcionada:** 30.0.0~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index a8125924..d7493511 100644 --- a/README_id.md +++ b/README_id.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versi terkirim:** 29.0.7~ynh1 +**Versi terkirim:** 30.0.0~ynh1 **Demo:** diff --git a/README_nl.md b/README_nl.md index 2de2e2ab..6b867efe 100644 --- a/README_nl.md +++ b/README_nl.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Geleverde versie:** 29.0.7~ynh1 +**Geleverde versie:** 30.0.0~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md index de39df71..fc67d65e 100644 --- a/README_ru.md +++ b/README_ru.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Поставляемая версия:** 29.0.7~ynh1 +**Поставляемая версия:** 30.0.0~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index d94cc152..f47f80c8 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**分发版本:** 29.0.7~ynh1 +**分发版本:** 30.0.0~ynh1 **演示:** From 6c8718d7cd93c0978d1d7c497fa4f99b4d1d92ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 15 Sep 2024 19:06:39 +0200 Subject: [PATCH 201/354] cleaning --- scripts/backup | 2 -- scripts/change_url | 4 ---- scripts/config | 2 -- scripts/install | 2 -- scripts/remove | 2 -- scripts/restore | 4 ---- scripts/upgrade | 2 -- 7 files changed, 18 deletions(-) diff --git a/scripts/backup b/scripts/backup index 733f4b1b..ec645973 100755 --- a/scripts/backup +++ b/scripts/backup @@ -1,7 +1,5 @@ #!/bin/bash -#================================================= -# GENERIC START #================================================= # IMPORT GENERIC HELPERS #================================================= diff --git a/scripts/change_url b/scripts/change_url index 326594f8..ae966b1e 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -1,7 +1,5 @@ #!/bin/bash -#================================================= -# GENERIC STARTING #================================================= # IMPORT GENERIC HELPERS #================================================= @@ -94,8 +92,6 @@ then fi fi -#================================================= -# GENERIC FINALISATION #================================================= # RELOAD NGINX #================================================= diff --git a/scripts/config b/scripts/config index d756fa9f..b1a699b8 100644 --- a/scripts/config +++ b/scripts/config @@ -1,7 +1,5 @@ #!/bin/bash -#================================================= -# GENERIC STARTING #================================================= # IMPORT GENERIC HELPERS #================================================= diff --git a/scripts/install b/scripts/install index f1ef3154..cf23789c 100755 --- a/scripts/install +++ b/scripts/install @@ -251,8 +251,6 @@ create_external_storage "/home/yunohost.multimedia/share" "Shared multimedia" # Allow nextcloud to write into these directories ynh_multimedia_addaccess $app -#================================================= -# GENERIC FINALIZATION #================================================= # SECURE FILES AND DIRECTORIES #================================================= diff --git a/scripts/remove b/scripts/remove index b4d1786f..86371bff 100755 --- a/scripts/remove +++ b/scripts/remove @@ -6,8 +6,6 @@ source /usr/share/yunohost/helpers #================================================= # REMOVE SYSTEM CONFIGURATIONS #================================================= -# REMOVE SYSTEMD SERVICE -#================================================= ynh_script_progression --message="Removing system configurations related to $app..." --weight=10 # Remove the dedicated NGINX config diff --git a/scripts/restore b/scripts/restore index ce14c425..8ab34e68 100755 --- a/scripts/restore +++ b/scripts/restore @@ -3,8 +3,6 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# STANDARD RESTORATION STEPS #================================================= # RESTORE THE APP MAIN DIR #================================================= @@ -138,8 +136,6 @@ then systemctl enable --now "${app}-notify-push.service" --quiet fi -#================================================= -# GENERIC FINALIZATION #================================================= # RELOAD NGINX #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 4c198021..88527b1b 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -40,8 +40,6 @@ then ynh_die --message="Upgrading from Nextcloud < 22.2 is not supported anymore. You should first upgrade to 22.2 using: yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/41f5f902e7c7cd3c30a6793020562ba98b9bf3e9" fi -#================================================= -# SPECIFIC UPGRADE #================================================= # MAKE SEQUENTIAL UPGRADES FROM EACH MAJOR # VERSION TO THE NEXT ONE From 63cf35deb9c0d728189a4402801d92ccb92900d2 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 18 Sep 2024 16:12:10 +0200 Subject: [PATCH 202/354] Add comment about the cron check for high perf backend --- scripts/change_url | 1 + scripts/config | 1 + scripts/install | 1 + scripts/restore | 1 + scripts/upgrade | 1 + 5 files changed, 5 insertions(+) diff --git a/scripts/change_url b/scripts/change_url index 326594f8..15eaee94 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -79,6 +79,7 @@ then ynh_add_systemd_config --service="${app}-notify-push" count=0 + # cron can sometimes fail when the database is not fully initialized, hence it's retried several times, see https://github.com/YunoHost-Apps/nextcloud_ynh/pull/720 while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 diff --git a/scripts/config b/scripts/config index d756fa9f..d9ae635b 100644 --- a/scripts/config +++ b/scripts/config @@ -139,6 +139,7 @@ set__enable_notify_push() { ynh_add_systemd_config --service="${app}-notify-push" count=0 + # cron can sometimes fail when the database is not fully initialized, hence it's retried several times, see https://github.com/YunoHost-Apps/nextcloud_ynh/pull/720 while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 diff --git a/scripts/install b/scripts/install index a4ef70aa..324381ce 100755 --- a/scripts/install +++ b/scripts/install @@ -297,6 +297,7 @@ ynh_add_fail2ban_config --logpath="/var/log/$app/nextcloud.log" --failregex="^.* if [ $enable_notify_push -eq 1 ] then count=0 + # cron can sometimes fail when the database is not fully initialized, hence it's retried several times, see https://github.com/YunoHost-Apps/nextcloud_ynh/pull/720 while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 diff --git a/scripts/restore b/scripts/restore index d9544306..63581144 100755 --- a/scripts/restore +++ b/scripts/restore @@ -160,6 +160,7 @@ exec_occ() { if [ $enable_notify_push -eq 1 ] then count=0 + # cron can sometimes fail when the database is not fully initialized, hence it's retried several times, see https://github.com/YunoHost-Apps/nextcloud_ynh/pull/720 while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 diff --git a/scripts/upgrade b/scripts/upgrade index 53131094..657a10c0 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -441,6 +441,7 @@ ynh_add_fail2ban_config --logpath="/var/log/$app/nextcloud.log" --failregex="^.* if [ $enable_notify_push -eq 1 ] then count=0 + # cron can sometimes fail when the database is not fully initialized, hence it's retried several times, see https://github.com/YunoHost-Apps/nextcloud_ynh/pull/720 while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 From 7a1274d831eaa1d166effeac66daaebb6726b95a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 18 Sep 2024 16:17:57 +0200 Subject: [PATCH 203/354] Add extended description of the notify push option --- config_panel.toml | 3 +++ manifest.toml | 2 ++ 2 files changed, 5 insertions(+) diff --git a/config_panel.toml b/config_panel.toml index b583fb4f..c408eadc 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -30,6 +30,9 @@ name = "Nextcloud configuration" ask.en = "Configure the High Performance Backend?" ask.fr = "Configurer le Backend Hautes Performances ?" type = "boolean" + help.en = "Also called 'notify push' and corresponds to a mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new and adds complexity to the setup)" + help.fr = "Aussi appelé 'notifications push' et corresponds à un mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle, et augmente la complexité de l'installation)" + [main.php_fpm_config] name = "PHP-FPM configuration" diff --git a/manifest.toml b/manifest.toml index 286d942b..9525bc9d 100644 --- a/manifest.toml +++ b/manifest.toml @@ -65,6 +65,8 @@ ram.runtime = "512M" ask.fr = "Configurer le Backend Hautes Performances ?" type = "boolean" default = false + help.en = "Also called 'notify push' and corresponds to a mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new and adds complexity to the setup)" + help.fr = "Aussi appelé 'notifications push' et corresponds à un mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle, et augmente la complexité de l'installation)" [resources] From e7c5a94e05774f4bfbc7aea6b2c80ad3cfc70317 Mon Sep 17 00:00:00 2001 From: orhtej2 <2871798+orhtej2@users.noreply.github.com> Date: Wed, 25 Sep 2024 13:18:57 +0200 Subject: [PATCH 204/354] Fixed backup (#732) * Update backup * Update manifest.toml --- manifest.toml | 2 +- scripts/backup | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/manifest.toml b/manifest.toml index 9525bc9d..7e35930b 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.7~ynh1" +version = "29.0.7~ynh2" maintainers = ["kay0u"] diff --git a/scripts/backup b/scripts/backup index d9ecab9b..d6942ed2 100755 --- a/scripts/backup +++ b/scripts/backup @@ -41,9 +41,6 @@ ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.d" # Backup the PHP-FPM configuration ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -# Backup the nginx configuration -ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" - # Backup the logrotate configuration ynh_backup --src_path="/etc/logrotate.d/$app" From 77e3ed59a46cd3c6d77c4842bc8831808fac81ed Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 25 Sep 2024 11:19:09 +0000 Subject: [PATCH 205/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 16c56456..83bac72e 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Shipped version:** 29.0.7~ynh1 +**Shipped version:** 29.0.7~ynh2 **Demo:** diff --git a/README_es.md b/README_es.md index 9b89abb8..15930ab6 100644 --- a/README_es.md +++ b/README_es.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión actual:** 29.0.7~ynh1 +**Versión actual:** 29.0.7~ynh2 **Demo:** diff --git a/README_eu.md b/README_eu.md index 6fe3a99b..1207b069 100644 --- a/README_eu.md +++ b/README_eu.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Paketatutako bertsioa:** 29.0.7~ynh1 +**Paketatutako bertsioa:** 29.0.7~ynh2 **Demoa:** diff --git a/README_fr.md b/README_fr.md index 6dfdf439..98a51cf1 100644 --- a/README_fr.md +++ b/README_fr.md @@ -23,7 +23,7 @@ Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateu L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. -**Version incluse :** 29.0.7~ynh1 +**Version incluse :** 29.0.7~ynh2 **Démo :** diff --git a/README_gl.md b/README_gl.md index 4afd44f6..f5b88bf2 100644 --- a/README_gl.md +++ b/README_gl.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión proporcionada:** 29.0.7~ynh1 +**Versión proporcionada:** 29.0.7~ynh2 **Demo:** diff --git a/README_id.md b/README_id.md index a8125924..6820e080 100644 --- a/README_id.md +++ b/README_id.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versi terkirim:** 29.0.7~ynh1 +**Versi terkirim:** 29.0.7~ynh2 **Demo:** diff --git a/README_nl.md b/README_nl.md index 2de2e2ab..5b7ac74e 100644 --- a/README_nl.md +++ b/README_nl.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Geleverde versie:** 29.0.7~ynh1 +**Geleverde versie:** 29.0.7~ynh2 **Demo:** diff --git a/README_ru.md b/README_ru.md index de39df71..63661d61 100644 --- a/README_ru.md +++ b/README_ru.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Поставляемая версия:** 29.0.7~ynh1 +**Поставляемая версия:** 29.0.7~ynh2 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index d94cc152..73eb98d9 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**分发版本:** 29.0.7~ynh1 +**分发版本:** 29.0.7~ynh2 **演示:** From ab2df754a28c9ec7e8d8aec099c8665f6cd52859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 25 Sep 2024 13:20:11 +0200 Subject: [PATCH 206/354] Update backup --- scripts/backup | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/scripts/backup b/scripts/backup index d6942ed2..e36d8e48 100755 --- a/scripts/backup +++ b/scripts/backup @@ -27,24 +27,17 @@ ynh_backup --src_path="$install_dir" ynh_backup --src_path="$data_dir" --is_big -#================================================= -# BACKUP THE NGINX CONFIGURATION -#================================================= - -ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" -ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.d" - #================================================= # SYSTEM CONFIGURATION #================================================= -# Backup the PHP-FPM configuration ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -# Backup the logrotate configuration +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.d" + ynh_backup --src_path="/etc/logrotate.d/$app" -# Backup the Fail2Ban config ynh_backup --src_path="/etc/fail2ban/jail.d/$app.conf" ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" From 28ac86d30a0336a3e3d228e17347880420795ad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 25 Sep 2024 13:21:03 +0200 Subject: [PATCH 207/354] cleaning --- scripts/backup | 6 ------ scripts/remove | 2 -- 2 files changed, 8 deletions(-) diff --git a/scripts/backup b/scripts/backup index e36d8e48..96d5808b 100755 --- a/scripts/backup +++ b/scripts/backup @@ -1,11 +1,5 @@ #!/bin/bash -#================================================= -# GENERIC START -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers source ../settings/scripts/_ynh_mysql_dump_db.sh diff --git a/scripts/remove b/scripts/remove index 4bf6421b..5b503421 100755 --- a/scripts/remove +++ b/scripts/remove @@ -6,8 +6,6 @@ source /usr/share/yunohost/helpers #================================================= # REMOVE SYSTEM CONFIGURATIONS #================================================= -# REMOVE SYSTEMD SERVICE -#================================================= ynh_script_progression --message="Removing system configurations related to $app..." --weight=5 # Remove the dedicated NGINX config From 3c23d05b58556379c5256a78970f0e1e236bbfa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 27 Sep 2024 16:16:18 +0200 Subject: [PATCH 208/354] cleaning --- scripts/change_url | 4 ---- scripts/remove | 4 ---- scripts/upgrade | 2 -- 3 files changed, 10 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 0a436c89..2ab59aa1 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -1,9 +1,5 @@ #!/bin/bash -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - source _common.sh source /usr/share/yunohost/helpers diff --git a/scripts/remove b/scripts/remove index 86371bff..9f44fd35 100755 --- a/scripts/remove +++ b/scripts/remove @@ -8,17 +8,13 @@ source /usr/share/yunohost/helpers #================================================= ynh_script_progression --message="Removing system configurations related to $app..." --weight=10 -# Remove the dedicated NGINX config ynh_remove_nginx_config ynh_secure_remove --file="/etc/nginx/conf.d/$domain.d/$app.d" -# Remove the dedicated PHP-FPM config ynh_remove_fpm_config -# Remove the app-specific logrotate config ynh_remove_logrotate -# Remove the dedicated Fail2Ban config ynh_remove_fail2ban_config # Remove notify push diff --git a/scripts/upgrade b/scripts/upgrade index 6e753403..0188c167 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -407,7 +407,6 @@ then ynh_add_config --template="notify_push.conf" --destination="$nginx_extra_conf_dir/notify_push.conf" fi -# Create a dedicated NGINX config ynh_add_nginx_config #================================================= @@ -459,7 +458,6 @@ ynh_use_logrotate --non-append # FAIL2BAN #================================================= -# Create a dedicated Fail2Ban config ynh_add_fail2ban_config --logpath="/var/log/$app/nextcloud.log" --failregex="^.*Login failed: '.*' \(Remote IP: ''.*$" --max_retry=5 #================================================= From d1d315cb6931a110e55641a96f5e8dd0fe605a38 Mon Sep 17 00:00:00 2001 From: tomdereub Date: Mon, 30 Sep 2024 09:51:18 +0200 Subject: [PATCH 209/354] Update ADMIN.md (#734) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit J'ai sorti High Performance Backend, qui était dans la section Onlyoffice, alors que c'est indépendant. --- doc/ADMIN.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/ADMIN.md b/doc/ADMIN.md index 9b19c1b2..4a68583a 100644 --- a/doc/ADMIN.md +++ b/doc/ADMIN.md @@ -8,13 +8,13 @@ sudo -u __APP__ php__PHPVERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ Alternatively, you may open a 'Nextcloud shell' with `sudo yunohost app shell __APP__`, then run `php occ ...` -### ONLYOFFICE integration +### High Performance Backend -ONLYOFFICE is an online rich text document editor which can be integrated in Nextcloud +High Performance Backend is an application on Nextcloud that should speed up the instance, more information here: https://github.com/nextcloud/notify_push#about -#### High Performance Backend +### ONLYOFFICE integration -High Performance Backend is an application on Nextcloud that should speed up the instance, more information here: https://github.com/nextcloud/notify_push#about +ONLYOFFICE is an online rich text document editor which can be integrated in Nextcloud #### With YunoHost App (ARM64 support, better performance) From 616b11b7363bf1f170f7e21ee24ba78ebd412c0e Mon Sep 17 00:00:00 2001 From: tomdereub Date: Mon, 30 Sep 2024 09:51:18 +0200 Subject: [PATCH 210/354] Update ADMIN.md (#734) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit J'ai sorti High Performance Backend, qui était dans la section Onlyoffice, alors que c'est indépendant. --- doc/ADMIN.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/ADMIN.md b/doc/ADMIN.md index 9b19c1b2..4a68583a 100644 --- a/doc/ADMIN.md +++ b/doc/ADMIN.md @@ -8,13 +8,13 @@ sudo -u __APP__ php__PHPVERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ Alternatively, you may open a 'Nextcloud shell' with `sudo yunohost app shell __APP__`, then run `php occ ...` -### ONLYOFFICE integration +### High Performance Backend -ONLYOFFICE is an online rich text document editor which can be integrated in Nextcloud +High Performance Backend is an application on Nextcloud that should speed up the instance, more information here: https://github.com/nextcloud/notify_push#about -#### High Performance Backend +### ONLYOFFICE integration -High Performance Backend is an application on Nextcloud that should speed up the instance, more information here: https://github.com/nextcloud/notify_push#about +ONLYOFFICE is an online rich text document editor which can be integrated in Nextcloud #### With YunoHost App (ARM64 support, better performance) From 978e71f00ae691e2c47a13607bdf470be5266ae4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 24 Aug 2024 19:43:16 +0200 Subject: [PATCH 211/354] Add experimental curl tests --- tests.toml | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/tests.toml b/tests.toml index a7671f20..bd538ce0 100644 --- a/tests.toml +++ b/tests.toml @@ -14,9 +14,32 @@ test_format = 1.0 test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" + [default.curl_tests] + #home.path = "/" + home.expect_title = "Login - Nextcloud" + home.auto_test_assets = true + + #dash.path = "/" + dash.logged_on_sso = true + dash.expect_title = "Dashboard - Nextcloud" + + admin.path = "/settings/admin" + admin.logged_on_sso = true + admin.expect_title = "Administration settings - Nextcloud" + + asset.path = "/core/img/logo/logo.svg" + + file.path = "/remote.php/dav/files/__USER__/Readme.md" + file.logged_on_sso = true + file.expect_content = "# Welcome to Nextcloud!" + + caldav.base_url = "https://__DOMAIN__" + caldav.path = "/.well-known/caldav" + caldav.logged_on_sso = true + caldav.expect_content = "This is the WebDAV interface." + [notify_push_test] args.enable_notify_push = "1" test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" - From f1cd3930912213ee902c57982f54b166843a768c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 1 Oct 2024 09:45:54 +0200 Subject: [PATCH 212/354] Update tests.toml --- tests.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/tests.toml b/tests.toml index bd538ce0..63bd623f 100644 --- a/tests.toml +++ b/tests.toml @@ -12,6 +12,7 @@ test_format = 1.0 test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" + test_upgrade_from.e9f82ab7.name = "Upgrade from 29.0.7" test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" [default.curl_tests] From 50703260bb4774c2ebcbd41b69d6192a371b3ff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 1 Oct 2024 09:46:38 +0200 Subject: [PATCH 213/354] Update tests.toml --- tests.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests.toml b/tests.toml index 63bd623f..4fa7d008 100644 --- a/tests.toml +++ b/tests.toml @@ -12,7 +12,7 @@ test_format = 1.0 test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" - test_upgrade_from.e9f82ab7.name = "Upgrade from 29.0.7" + test_upgrade_from.bf8c0f95.name = "Upgrade from 29.0.7" test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" [default.curl_tests] From cca6695ff3bbdc905ca4fb8aac7acc36053d9ae2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 2 Oct 2024 09:34:25 +0200 Subject: [PATCH 214/354] Update config --- scripts/config | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/config b/scripts/config index e5966a0f..64682638 100644 --- a/scripts/config +++ b/scripts/config @@ -1,9 +1,5 @@ #!/bin/bash -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - source _common.sh source /usr/share/yunohost/helpers From 7a23074a5c2fd386915806052a23a609997f9da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 10 Oct 2024 17:58:26 +0200 Subject: [PATCH 215/354] 29.0.8 --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 7e35930b..9bbb5d49 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.7~ynh2" +version = "29.0.8~ynh1" maintainers = ["kay0u"] @@ -73,8 +73,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.7.tar.bz2' - sha256 = 'f532ffc31be5a8374b5e072b86fff8765ec19fda0c8509cee39873081db2c544' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.8.tar.bz2' + sha256 = '0ab54b517f76cd26f2bd38b6fe184b9fbaed32f734246c58c1acf83473c0a4b9' [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.8.tar.bz2' From fa49faa69dfba538770db849bc2f14de8cebed93 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 10 Oct 2024 17:58:31 +0200 Subject: [PATCH 216/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 83bac72e..079d63d6 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Shipped version:** 29.0.7~ynh2 +**Shipped version:** 29.0.8~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 15930ab6..51e82f2c 100644 --- a/README_es.md +++ b/README_es.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión actual:** 29.0.7~ynh2 +**Versión actual:** 29.0.8~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 1207b069..c54ea437 100644 --- a/README_eu.md +++ b/README_eu.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Paketatutako bertsioa:** 29.0.7~ynh2 +**Paketatutako bertsioa:** 29.0.8~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index 98a51cf1..9c3a02aa 100644 --- a/README_fr.md +++ b/README_fr.md @@ -23,7 +23,7 @@ Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateu L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. -**Version incluse :** 29.0.7~ynh2 +**Version incluse :** 29.0.8~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index f5b88bf2..3f58552e 100644 --- a/README_gl.md +++ b/README_gl.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión proporcionada:** 29.0.7~ynh2 +**Versión proporcionada:** 29.0.8~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index 6820e080..ee5cee4b 100644 --- a/README_id.md +++ b/README_id.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versi terkirim:** 29.0.7~ynh2 +**Versi terkirim:** 29.0.8~ynh1 **Demo:** diff --git a/README_nl.md b/README_nl.md index 5b7ac74e..18d16fbc 100644 --- a/README_nl.md +++ b/README_nl.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Geleverde versie:** 29.0.7~ynh2 +**Geleverde versie:** 29.0.8~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md index 63661d61..587b92aa 100644 --- a/README_ru.md +++ b/README_ru.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Поставляемая версия:** 29.0.7~ynh2 +**Поставляемая версия:** 29.0.8~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 73eb98d9..2e29df22 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**分发版本:** 29.0.7~ynh2 +**分发版本:** 29.0.8~ynh1 **演示:** From 9cee1eb27c0904c9fe5ac50e75d078c929230d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:45:27 +0200 Subject: [PATCH 217/354] fix linter --- scripts/install | 2 +- scripts/upgrade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 324381ce..43455101 100755 --- a/scripts/install +++ b/scripts/install @@ -220,7 +220,7 @@ then ynh_add_config --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" ynh_add_systemd_config --service="${app}-notify-push-watcher" --template="watcher.service" - systemctl enable --now ${app}-notify-push-watcher.path + systemctl enable --now --quiet ${app}-notify-push-watcher.path ynh_add_systemd_config --service="${app}-notify-push" fi diff --git a/scripts/upgrade b/scripts/upgrade index 657a10c0..37121476 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -405,7 +405,7 @@ then ynh_add_config --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" ynh_add_systemd_config --service="${app}-notify-push-watcher" --template="watcher.service" - systemctl enable --now ${app}-notify-push-watcher.path + systemctl enable --now --quiet ${app}-notify-push-watcher.path ynh_add_systemd_config --service="${app}-notify-push" fi From e317420f65f8e56f883d0e9fafbad7e2f4670901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:46:02 +0200 Subject: [PATCH 218/354] fix linter --- scripts/install | 2 +- scripts/upgrade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 955432fc..54782a2f 100755 --- a/scripts/install +++ b/scripts/install @@ -212,7 +212,7 @@ then ynh_add_config --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" ynh_add_systemd_config --service="${app}-notify-push-watcher" --template="watcher.service" - systemctl enable --now ${app}-notify-push-watcher.path + systemctl enable --now --quiet ${app}-notify-push-watcher.path ynh_add_systemd_config --service="${app}-notify-push" fi diff --git a/scripts/upgrade b/scripts/upgrade index 0188c167..f7b3d361 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -432,7 +432,7 @@ then ynh_add_config --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" ynh_add_systemd_config --service="${app}-notify-push-watcher" --template="watcher.service" - systemctl enable --now ${app}-notify-push-watcher.path + systemctl enable --now --quiet ${app}-notify-push-watcher.path ynh_add_systemd_config --service="${app}-notify-push" fi From d0804d6405c5ad626925acb324dcc45e719e1f91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:48:58 +0200 Subject: [PATCH 219/354] Update manifest.toml --- manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.toml b/manifest.toml index 1dd0b4cd..13cf9031 100644 --- a/manifest.toml +++ b/manifest.toml @@ -77,8 +77,8 @@ ram.runtime = "512M" sha256 = '18d7a80957bb53e94fb04492f6b5213434dda3e9da12d9f789997687c8564e60' [resources.sources.29] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.7.tar.bz2' - sha256 = 'f532ffc31be5a8374b5e072b86fff8765ec19fda0c8509cee39873081db2c544' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.8.tar.bz2' + sha256 = '0ab54b517f76cd26f2bd38b6fe184b9fbaed32f734246c58c1acf83473c0a4b9' [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.8.tar.bz2' From 7d6591f24f1701986608feaedfb63ecc415baa0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:54:49 +0200 Subject: [PATCH 220/354] cleaning --- manifest.toml | 4 +--- scripts/remove | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/manifest.toml b/manifest.toml index 13cf9031..4a13f11c 100644 --- a/manifest.toml +++ b/manifest.toml @@ -19,12 +19,10 @@ code = "https://github.com/nextcloud/server" cpe = "cpe:2.3:a:nextcloud:nextcloud" [integration] -yunohost = ">= 11.2.27" +yunohost = ">= 11.2.30" architectures = ["amd64", "arm64", "armhf"] multi_instance = true - ldap = true - sso = true disk = "650M" diff --git a/scripts/remove b/scripts/remove index 9f44fd35..0414296a 100755 --- a/scripts/remove +++ b/scripts/remove @@ -19,7 +19,7 @@ ynh_remove_fail2ban_config # Remove notify push ynh_remove_systemd_config --service="${app}-notify-push" -ynh_exec_warn_less systemctl disable --now ${app}-notify-push-watcher.path +systemctl disable --now --quiet ${app}-notify-push-watcher.path ynh_secure_remove --file="/etc/systemd/system/${app}-notify-push-watcher.path" ynh_remove_systemd_config --service="${app}-notify-push-watcher" From 12bca635fc471a267370c519b5fe53703e1da957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 11 Oct 2024 11:55:30 +0200 Subject: [PATCH 221/354] Update remove --- scripts/remove | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/remove b/scripts/remove index 5b503421..20a29598 100755 --- a/scripts/remove +++ b/scripts/remove @@ -23,7 +23,7 @@ ynh_remove_fail2ban_config # Remove notify push ynh_remove_systemd_config --service="${app}-notify-push" -ynh_exec_warn_less systemctl disable --now ${app}-notify-push-watcher.path +systemctl disable --now --quiet ${app}-notify-push-watcher.path ynh_secure_remove --file="/etc/systemd/system/${app}-notify-push-watcher.path" ynh_remove_systemd_config --service="${app}-notify-push-watcher" From b3ac029daa919d160e0f802bf1e7c25975303fc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 14 Oct 2024 08:53:59 +0200 Subject: [PATCH 222/354] Update tests.toml --- tests.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests.toml b/tests.toml index bd538ce0..edbf2ab4 100644 --- a/tests.toml +++ b/tests.toml @@ -8,11 +8,11 @@ test_format = 1.0 # Commits to test upgrade from # ------------------------------- - test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" + #test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" - test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" - test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" + #test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" + #test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" [default.curl_tests] #home.path = "/" From 219ede24f4afd7c813064846de118ccd5f0ab78b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 17 Oct 2024 14:34:42 +0200 Subject: [PATCH 223/354] Update manifest.toml --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 4a13f11c..a7284bfd 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "30.0.0~ynh1" +version = "30.0.1~ynh1" maintainers = ["kay0u"] @@ -71,8 +71,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.0.tar.bz2' - sha256 = '18d7a80957bb53e94fb04492f6b5213434dda3e9da12d9f789997687c8564e60' + url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.1.tar.bz2' + sha256 = '79ec2ffad6231bd8fcc4abaacc12e5ac51e670d089affb379483592cda0fdccb' [resources.sources.29] url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.8.tar.bz2' From eea5c596b8eab3aeb0beed14f0503269adc39345 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 17 Oct 2024 14:34:47 +0200 Subject: [PATCH 224/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 8ed124c8..996dd2de 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Shipped version:** 30.0.0~ynh1 +**Shipped version:** 30.0.1~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index bd0d84ba..adec6f9a 100644 --- a/README_es.md +++ b/README_es.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión actual:** 30.0.0~ynh1 +**Versión actual:** 30.0.1~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index ac5294b9..1654f23e 100644 --- a/README_eu.md +++ b/README_eu.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Paketatutako bertsioa:** 30.0.0~ynh1 +**Paketatutako bertsioa:** 30.0.1~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index d108bc9b..12aea1c0 100644 --- a/README_fr.md +++ b/README_fr.md @@ -23,7 +23,7 @@ Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateu L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. -**Version incluse :** 30.0.0~ynh1 +**Version incluse :** 30.0.1~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index cbef464e..1f6aba90 100644 --- a/README_gl.md +++ b/README_gl.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versión proporcionada:** 30.0.0~ynh1 +**Versión proporcionada:** 30.0.1~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index d7493511..e15c771b 100644 --- a/README_id.md +++ b/README_id.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Versi terkirim:** 30.0.0~ynh1 +**Versi terkirim:** 30.0.1~ynh1 **Demo:** diff --git a/README_nl.md b/README_nl.md index 6b867efe..dcb88339 100644 --- a/README_nl.md +++ b/README_nl.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Geleverde versie:** 30.0.0~ynh1 +**Geleverde versie:** 30.0.1~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md index fc67d65e..6f300d31 100644 --- a/README_ru.md +++ b/README_ru.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**Поставляемая версия:** 30.0.0~ynh1 +**Поставляемая версия:** 30.0.1~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index f47f80c8..7ddc4116 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -23,7 +23,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO / user portal (Yun The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -**分发版本:** 30.0.0~ynh1 +**分发版本:** 30.0.1~ynh1 **演示:** From 12737f21d6fbf90ec8be88ee4caba550d90d996b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 25 Oct 2024 11:03:23 +0200 Subject: [PATCH 225/354] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 54782a2f..eedeef87 100755 --- a/scripts/install +++ b/scripts/install @@ -85,7 +85,7 @@ exec_occ maintenance:install \ ynh_script_progression --message="Configuring $app..." --weight=8 # Set the mysql.utf8mb4 config to true in config.php -exec_occ config:system:set mysql.utf8mb4 --type boolean --value="true" +#exec_occ config:system:set mysql.utf8mb4 --type boolean --value="true" # move the logs from the data_dir to the standard /var/log exec_occ config:system:set logfile --value="/var/log/$app/nextcloud.log" From 1b9777c3267d49d5c82fd92de3d3c0890114bf4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 25 Oct 2024 11:05:07 +0200 Subject: [PATCH 226/354] Update install --- scripts/install | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/install b/scripts/install index eedeef87..5aee6861 100755 --- a/scripts/install +++ b/scripts/install @@ -14,6 +14,7 @@ ynh_script_progression --message="Setting up source files..." --weight=5 # Enable YunoHost patches on Nextcloud sources cp -a ../sources/patches_last_version/* ../sources/patches + # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$install_dir" From 53012e454d67604c53f64d7c3fb6c5af019358b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 25 Oct 2024 12:07:19 +0200 Subject: [PATCH 227/354] Update config_panel.toml --- config_panel.toml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/config_panel.toml b/config_panel.toml index c408eadc..4b9e0c99 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -7,12 +7,14 @@ name = "Nextcloud configuration" name = "Maintenance" [main.maintenance.maintenance_mode] - ask = "Enable maintenance mode" + ask.en = "Enable maintenance mode" + ask.fr = "Activer le mode maintenance" type = "boolean" default = false [main.maintenance.set_permissions_button] ask.en = "Set permissions for all data (Can take up to several hours if users have a lot of data)" + ask.fr = "Définir des autorisations pour toutes les données (cela peut prendre jusqu'à plusieurs heures si les utilisateurs ont beaucoup de données)" type = "button" style = "success" @@ -20,7 +22,8 @@ name = "Nextcloud configuration" name = "Address book configuration" [main.addressbook.system_addressbook_exposed] - ask = "Should there be a system address book listing all users, accessible by all users?" + ask.en = "Should there be a system address book listing all users, accessible by all users?" + ask.fr = "Devrait-il y avoir un carnet d’adresses système répertoriant tous les utilisateurs, accessible par tous les utilisateurs ?" type = "boolean" [main.notify_push] From cc04eb60034cbf633190bd746d35a1d284486bac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 25 Oct 2024 12:13:51 +0200 Subject: [PATCH 228/354] Add fr translation --- config_panel.toml | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/config_panel.toml b/config_panel.toml index c408eadc..517f06d9 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -1,30 +1,36 @@ version = "1.0" [main] -name = "Nextcloud configuration" +name.en = "Nextcloud configuration" +name.fr = "Configuration Nextcloud" [main.maintenance] name = "Maintenance" [main.maintenance.maintenance_mode] - ask = "Enable maintenance mode" + ask.en = "Enable maintenance mode" + ask.fr = "Activer le mode maintenance" type = "boolean" default = false [main.maintenance.set_permissions_button] ask.en = "Set permissions for all data (Can take up to several hours if users have a lot of data)" + ask.fr = "Définir des autorisations pour toutes les données (cela peut prendre jusqu'à plusieurs heures)" type = "button" style = "success" [main.addressbook] - name = "Address book configuration" + name.en = "Address book configuration" + name.fr = "Configuration du carnet d'adresses" [main.addressbook.system_addressbook_exposed] - ask = "Should there be a system address book listing all users, accessible by all users?" + ask.en = "Should there be a system address book listing all users, accessible by all users?" + ask.fr = "Devrait-il y avoir un carnet d’adresses système répertoriant tous les utilisateurs, accessible par tous les utilisateurs ?" type = "boolean" [main.notify_push] - name = "Notify Push configuration" + name.en = "Notify Push configuration" + name.fr = "Configuration de la notification push" [main.notify_push.enable_notify_push] ask.en = "Configure the High Performance Backend?" @@ -35,7 +41,8 @@ name = "Nextcloud configuration" [main.php_fpm_config] - name = "PHP-FPM configuration" + name.en = "PHP-FPM configuration" + name.fr = "Configuration de PHP-FPM" [main.php_fpm_config.fpm_footprint] ask = "Memory footprint" From e8e04de9d777486d88a1620cc230e7cda7d02ec5 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 25 Oct 2024 12:16:01 +0200 Subject: [PATCH 229/354] remove duplicate extension "js" (#742) --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index aabd4471..6b01ab59 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -4,7 +4,7 @@ # only for Nextcloud like below: include mime.types; types { - text/javascript js mjs; + text/javascript mjs; } location ^~ /.well-known { From 8f8a3afc25f15a471afc053a3dbd1f7484829375 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 25 Oct 2024 23:16:19 +0200 Subject: [PATCH 230/354] Update config_panel.toml --- config_panel.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_panel.toml b/config_panel.toml index 517f06d9..31ceb80d 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -2,7 +2,7 @@ version = "1.0" [main] name.en = "Nextcloud configuration" -name.fr = "Configuration Nextcloud" +name.fr = "Configuration de Nextcloud" [main.maintenance] name = "Maintenance" From 83dd697b14dd47f8282e1d4231d7e7f7a2418a72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 31 Oct 2024 16:42:13 +0100 Subject: [PATCH 231/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 9bbb5d49..acf562e1 100644 --- a/manifest.toml +++ b/manifest.toml @@ -19,7 +19,7 @@ code = "https://github.com/nextcloud/server" cpe = "cpe:2.3:a:nextcloud:nextcloud" [integration] -yunohost = ">= 11.2.27" +yunohost = ">= 11.3.0" architectures = ["amd64", "arm64", "armhf"] multi_instance = true From 960a061e86a37f5ea72875dfd19333038b476e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 09:38:21 +0100 Subject: [PATCH 232/354] fix translations --- config_panel.toml | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/config_panel.toml b/config_panel.toml index 31ceb80d..d0afdc14 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -24,20 +24,22 @@ name.fr = "Configuration de Nextcloud" name.fr = "Configuration du carnet d'adresses" [main.addressbook.system_addressbook_exposed] - ask.en = "Should there be a system address book listing all users, accessible by all users?" - ask.fr = "Devrait-il y avoir un carnet d’adresses système répertoriant tous les utilisateurs, accessible par tous les utilisateurs ?" + ask.en = "Enable address book" + ask.fr = "Activer le carnet d’adresses" type = "boolean" + help.en = "Should there be a system address book listing all users, accessible by all users?" + help.fr = "Devrait-il y avoir un carnet d’adresses système répertoriant tous les utilisateurs, accessible par tous les utilisateurs ?" [main.notify_push] name.en = "Notify Push configuration" - name.fr = "Configuration de la notification push" + name.fr = "Configuration Notification Push" [main.notify_push.enable_notify_push] - ask.en = "Configure the High Performance Backend?" - ask.fr = "Configurer le Backend Hautes Performances ?" + ask.en = "Enable Notify Push" + ask.fr = "Activer la Notification Push" type = "boolean" - help.en = "Also called 'notify push' and corresponds to a mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new and adds complexity to the setup)" - help.fr = "Aussi appelé 'notifications push' et corresponds à un mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle, et augmente la complexité de l'installation)" + help.en = "Mechanism allowing more instantaneous notifications and reduce server load." + help.fr = "Mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur." [main.php_fpm_config] @@ -45,7 +47,8 @@ name.fr = "Configuration de Nextcloud" name.fr = "Configuration de PHP-FPM" [main.php_fpm_config.fpm_footprint] - ask = "Memory footprint" + ask.en = "Memory footprint" + ask.fr = "Empreinte mémoire" type = "select" choices.low = "Low, <= 20Mb per pool" choices.medium = "Medium, between 20Mb and 40Mb per pool" @@ -61,8 +64,11 @@ name.fr = "Configuration de Nextcloud" 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" + ask.en = "Expected usage" + ask.fr = "Utilisation prévue" type = "select" 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." + help.en = "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." + help.fr = "low : utilisation personnelle, derrière le SSO. Pas d'empreinte RAM lorsqu'il n'est pas utilisé, mais l'impact sur le processeur peut être élevé si de nombreux utilisateurs utilisent le service.
medium : faible utilisation, peu de personnes ou/et accessible au public. Faible empreinte RAM, empreinte processeur moyenne lorsqu'il est utilisé.
high : utilisation élevée, site Web fréquemment visité. Empreinte RAM élevée, mais utilisation du processeur plus faible et réponse rapide." + From 13f1a40bc02affbd01f2ffc01e47c6e36df006da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 10:17:24 +0100 Subject: [PATCH 233/354] Update config_panel.toml --- config_panel.toml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config_panel.toml b/config_panel.toml index d0afdc14..ca86708c 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -14,10 +14,12 @@ name.fr = "Configuration de Nextcloud" default = false [main.maintenance.set_permissions_button] - ask.en = "Set permissions for all data (Can take up to several hours if users have a lot of data)" - ask.fr = "Définir des autorisations pour toutes les données (cela peut prendre jusqu'à plusieurs heures)" + ask.en = "Reset permissions" + ask.fr = "Redéfinir les autorisations" type = "button" style = "success" + help.en = "This action sets permissions for all data. Beware, this action can take up to several hours if users have a lot of data." + help.fr = "Cette action définit les autorisations pour toutes les données. Attention, cette action peut prendre jusqu'à plusieurs heures si les utilisateurs ont beaucoup de données." [main.addressbook] name.en = "Address book configuration" From ccbdda19e39b2b3392e9c37ad9fe3672a4d391de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 10:18:12 +0100 Subject: [PATCH 234/354] Update config_panel.toml --- config_panel.toml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config_panel.toml b/config_panel.toml index d0afdc14..ca86708c 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -14,10 +14,12 @@ name.fr = "Configuration de Nextcloud" default = false [main.maintenance.set_permissions_button] - ask.en = "Set permissions for all data (Can take up to several hours if users have a lot of data)" - ask.fr = "Définir des autorisations pour toutes les données (cela peut prendre jusqu'à plusieurs heures)" + ask.en = "Reset permissions" + ask.fr = "Redéfinir les autorisations" type = "button" style = "success" + help.en = "This action sets permissions for all data. Beware, this action can take up to several hours if users have a lot of data." + help.fr = "Cette action définit les autorisations pour toutes les données. Attention, cette action peut prendre jusqu'à plusieurs heures si les utilisateurs ont beaucoup de données." [main.addressbook] name.en = "Address book configuration" From fb7614748957400279feca8769351469c90fbace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 10:22:23 +0100 Subject: [PATCH 235/354] Update config_panel.toml --- config_panel.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config_panel.toml b/config_panel.toml index ca86708c..dad78a1d 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -13,7 +13,10 @@ name.fr = "Configuration de Nextcloud" type = "boolean" default = false - [main.maintenance.set_permissions_button] + [main.permissions] + name = "Permissions" + + [main.permissions.set_permissions_button] ask.en = "Reset permissions" ask.fr = "Redéfinir les autorisations" type = "button" From fc030062c2ad8071e0387a06af166ffae3a5e6b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 10:27:59 +0100 Subject: [PATCH 236/354] Update config_panel.toml --- config_panel.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config_panel.toml b/config_panel.toml index dad78a1d..a22d2cb1 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -14,7 +14,8 @@ name.fr = "Configuration de Nextcloud" default = false [main.permissions] - name = "Permissions" + name.en = "Permissions" + name.fr = "Autorisations" [main.permissions.set_permissions_button] ask.en = "Reset permissions" From c52350016024bd0ab3f3a532680a80a77c9d1ceb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 10:28:27 +0100 Subject: [PATCH 237/354] Update config_panel.toml --- config_panel.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/config_panel.toml b/config_panel.toml index ca86708c..a22d2cb1 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -13,7 +13,11 @@ name.fr = "Configuration de Nextcloud" type = "boolean" default = false - [main.maintenance.set_permissions_button] + [main.permissions] + name.en = "Permissions" + name.fr = "Autorisations" + + [main.permissions.set_permissions_button] ask.en = "Reset permissions" ask.fr = "Redéfinir les autorisations" type = "button" From b100f029915d454c05e611d3ab5f914bff1a6793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 10:41:04 +0100 Subject: [PATCH 238/354] Update manifest.toml --- manifest.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/manifest.toml b/manifest.toml index acf562e1..d27bbbff 100644 --- a/manifest.toml +++ b/manifest.toml @@ -49,8 +49,8 @@ ram.runtime = "512M" default = "visitors" [install.user_home] - ask.en = "Access the users home folder from Nextcloud?" - ask.fr = "Accéder au dossier personnel des utilisateurs depuis Nextcloud ?" + ask.en = "Access the users home folder from Nextcloud" + ask.fr = "Accéder au dossier personnel des utilisateurs depuis Nextcloud" type = "boolean" default = false @@ -61,12 +61,12 @@ ram.runtime = "512M" default = true [install.enable_notify_push] - ask.en = "Configure the High Performance Backend?" - ask.fr = "Configurer le Backend Hautes Performances ?" + ask.en = "Enable Notify Push" + ask.fr = "Activer la Notification Push" type = "boolean" default = false - help.en = "Also called 'notify push' and corresponds to a mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new and adds complexity to the setup)" - help.fr = "Aussi appelé 'notifications push' et corresponds à un mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle, et augmente la complexité de l'installation)" + help.en = "Mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new and adds complexity to the setup)" + help.fr = "Mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle, et augmente la complexité de l'installation)" [resources] From 801b5b1f9ea45c334c431c9f9928ab98274bd07b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 10:41:34 +0100 Subject: [PATCH 239/354] Update manifest.toml --- manifest.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manifest.toml b/manifest.toml index fd61a849..a2930ef2 100644 --- a/manifest.toml +++ b/manifest.toml @@ -59,12 +59,12 @@ ram.runtime = "512M" default = true [install.enable_notify_push] - ask.en = "Configure the High Performance Backend?" - ask.fr = "Configurer le Backend Hautes Performances ?" + ask.en = "Enable Notify Push" + ask.fr = "Activer la Notification Push" type = "boolean" default = false - help.en = "Also called 'notify push' and corresponds to a mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new and adds complexity to the setup)" - help.fr = "Aussi appelé 'notifications push' et corresponds à un mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle, et augmente la complexité de l'installation)" + help.en = "Mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new and adds complexity to the setup)" + help.fr = "Mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle, et augmente la complexité de l'installation)" [resources] From c7380875ebd2a6920d279a13f96ea532338673b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 10:45:44 +0100 Subject: [PATCH 240/354] Update manifest.toml --- manifest.toml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/manifest.toml b/manifest.toml index a2930ef2..2ae1d972 100644 --- a/manifest.toml +++ b/manifest.toml @@ -47,16 +47,18 @@ ram.runtime = "512M" default = "visitors" [install.user_home] - ask.en = "Access the users home folder from Nextcloud?" - ask.fr = "Accéder au dossier personnel des utilisateurs depuis Nextcloud ?" + ask.en = "Access the users home folder from Nextcloud" + ask.fr = "Accéder au dossier personnel des utilisateurs depuis Nextcloud" type = "boolean" default = false [install.system_addressbook_exposed] - ask.en = "Should there be a system address book listing all users, accessible by all users?" - ask.fr = "Devrait-il y avoir un carnet d'adresses système listant tous les comptes, accessible par tous les comptes ?" + ask.en = "Enable address book" + ask.fr = "Activer le carnet d’adresses" type = "boolean" default = true + help.en = "Should there be a system address book listing all users, accessible by all users?" + help.fr = "Devrait-il y avoir un carnet d’adresses système répertoriant tous les utilisateurs, accessible par tous les utilisateurs ?" [install.enable_notify_push] ask.en = "Enable Notify Push" From bd68f75e17ca8a4cf670d09b2732544976a901af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 10:46:44 +0100 Subject: [PATCH 241/354] Update manifest.toml --- manifest.toml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/manifest.toml b/manifest.toml index d27bbbff..476a1d76 100644 --- a/manifest.toml +++ b/manifest.toml @@ -55,10 +55,13 @@ ram.runtime = "512M" default = false [install.system_addressbook_exposed] - ask.en = "Should there be a system address book listing all users, accessible by all users?" - ask.fr = "Devrait-il y avoir un carnet d'adresses système listant tous les comptes, accessible par tous les comptes ?" + ask.en = "Enable address book" + ask.fr = "Activer le carnet d’adresses" type = "boolean" default = true + help.en = "Should there be a system address book listing all users, accessible by all users?" + help.fr = "Devrait-il y avoir un carnet d’adresses système répertoriant tous les utilisateurs, accessible par tous les utilisateurs ?" + [install.enable_notify_push] ask.en = "Enable Notify Push" From c9b8e60b07563612b10a406d18694c39cd10bddc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 10:47:54 +0100 Subject: [PATCH 242/354] Update manifest.toml --- manifest.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 476a1d76..05180f83 100644 --- a/manifest.toml +++ b/manifest.toml @@ -62,7 +62,6 @@ ram.runtime = "512M" help.en = "Should there be a system address book listing all users, accessible by all users?" help.fr = "Devrait-il y avoir un carnet d’adresses système répertoriant tous les utilisateurs, accessible par tous les utilisateurs ?" - [install.enable_notify_push] ask.en = "Enable Notify Push" ask.fr = "Activer la Notification Push" From 81958af8fd59556b3cf5af6b64dddd7799a33605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 11:38:55 +0100 Subject: [PATCH 243/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 05180f83..575945cc 100644 --- a/manifest.toml +++ b/manifest.toml @@ -19,7 +19,7 @@ code = "https://github.com/nextcloud/server" cpe = "cpe:2.3:a:nextcloud:nextcloud" [integration] -yunohost = ">= 11.3.0" +yunohost = ">= 11.2.30" architectures = ["amd64", "arm64", "armhf"] multi_instance = true From e454580485e38e5da82c882482a3fce5a6d45e35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 11:46:34 +0100 Subject: [PATCH 244/354] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 43455101..26020d18 100755 --- a/scripts/install +++ b/scripts/install @@ -308,7 +308,7 @@ then ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" if ! exec_occ notify_push:self-test; then - ynh_print_warn --message="The High Performance Backend service is still not working properly. Please log in with a user to your NextCloud instance, restart the High Performance Backend service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + ynh_print_warn --message="The Notify Push service is still not working properly. Please log in with a user to your NextCloud instance, restart the Notify Push service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." fi fi From 1456e669b2bcfdffca75c80c557d23b353e42b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 11:47:46 +0100 Subject: [PATCH 245/354] cleaning --- scripts/restore | 2 +- scripts/upgrade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/restore b/scripts/restore index 63581144..90c74d5a 100755 --- a/scripts/restore +++ b/scripts/restore @@ -171,7 +171,7 @@ then ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" --action=restart if ! exec_occ notify_push:self-test; then - ynh_print_warn --message="The High Performance Backend service is still not working properly. Please log in with a user to your NextCloud instance, restart the High Performance Backend service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + ynh_print_warn --message="The Notify Push service is still not working properly. Please log in with a user to your NextCloud instance, restart the Notify Push service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." fi fi diff --git a/scripts/upgrade b/scripts/upgrade index 37121476..ab9b0309 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -452,7 +452,7 @@ then ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" --action=restart if ! exec_occ notify_push:self-test; then - ynh_print_warn --message="The High Performance Backend service is still not working properly. Please log in with a user to your NextCloud instance, restart the High Performance Backend service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + ynh_print_warn --message="The Notify Push service is still not working properly. Please log in with a user to your NextCloud instance, restart the Notify Push service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." fi fi From 3195268297bca273a15eac3561aa1af8c48c9484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 3 Nov 2024 11:48:41 +0100 Subject: [PATCH 246/354] cleaning --- doc/ADMIN.md | 4 ++-- doc/ADMIN_fr.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/ADMIN.md b/doc/ADMIN.md index 4a68583a..2262f3d7 100644 --- a/doc/ADMIN.md +++ b/doc/ADMIN.md @@ -8,9 +8,9 @@ sudo -u __APP__ php__PHPVERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ Alternatively, you may open a 'Nextcloud shell' with `sudo yunohost app shell __APP__`, then run `php occ ...` -### High Performance Backend +### Notify Push -High Performance Backend is an application on Nextcloud that should speed up the instance, more information here: https://github.com/nextcloud/notify_push#about +Notify Push is an application on Nextcloud that should speed up the instance, more information here: https://github.com/nextcloud/notify_push#about ### ONLYOFFICE integration diff --git a/doc/ADMIN_fr.md b/doc/ADMIN_fr.md index 5b52928a..ed3c619b 100644 --- a/doc/ADMIN_fr.md +++ b/doc/ADMIN_fr.md @@ -12,9 +12,9 @@ Ou bien, vous pouvez ouvrir un "shell Nextcloud" avec `sudo yunohost app shell _ ONLYOFFICE est un éditeur de texte enrichi en ligne qui peut s'intégrer dans Nextcloud -#### Backend Hautes Performances +#### Notify Push -Le backend Hautes Performances est une application sur Nextcloud qui devrait accélérer l'instance, plus d'informations ici : https://github.com/nextcloud/notify_push#about +Notify Push est une application sur Nextcloud qui devrait accélérer l'instance, plus d'informations ici : https://github.com/nextcloud/notify_push#about #### Avec l'application YunoHost (support ARM64, meilleures performances) From 62ed82cff2ad7c06ab106d33d209a659ea4da2c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 4 Nov 2024 11:52:35 +0100 Subject: [PATCH 247/354] cleaning --- doc/ADMIN.md | 19 ------------------- doc/ADMIN_fr.md | 19 ------------------- manifest.toml | 4 ++-- 3 files changed, 2 insertions(+), 40 deletions(-) diff --git a/doc/ADMIN.md b/doc/ADMIN.md index 2262f3d7..a48d167d 100644 --- a/doc/ADMIN.md +++ b/doc/ADMIN.md @@ -7,22 +7,3 @@ sudo -u __APP__ php__PHPVERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ``` Alternatively, you may open a 'Nextcloud shell' with `sudo yunohost app shell __APP__`, then run `php occ ...` - -### Notify Push - -Notify Push is an application on Nextcloud that should speed up the instance, more information here: https://github.com/nextcloud/notify_push#about - -### ONLYOFFICE integration - -ONLYOFFICE is an online rich text document editor which can be integrated in Nextcloud - -#### With YunoHost App (ARM64 support, better performance) - -For better performance and ARM64 support (Raspberry Pi, OLinuXino...), install the [OnlyOffice YunoHost app](https://apps.yunohost.org/app/onlyoffice) and connect it to Nextcloud, see the tutorial in the [doc of onlyoffice_ynh package](https://github.com/YunoHost-Apps/onlyoffice_ynh/blob/master/README_fr.md#configuration-de-onlyoffice-server) - -#### Alternative: With Nextcloud App (no ARM support, lower performance) - -Nextcloud features a direct integration of ONLYOFFICE through a Nextcloud app. -- Install *Community Document Server* application in your Nextcloud. That's the part that runs ONLYOFFICE server. -- Install *ONLYOFFICE* application. That's the client part that will connect to an ONLYOFFICE server. -- Then in Settings -> ONLYOFFICE (`https://__DOMAIN____PATH__/settings/admin/onlyoffice`), if you want to configure which file formats should be opened by ONLYOFFICE. diff --git a/doc/ADMIN_fr.md b/doc/ADMIN_fr.md index ed3c619b..ada48ad9 100644 --- a/doc/ADMIN_fr.md +++ b/doc/ADMIN_fr.md @@ -7,22 +7,3 @@ sudo -u __APP__ php__PHPVERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ``` Ou bien, vous pouvez ouvrir un "shell Nextcloud" avec `sudo yunohost app shell __APP__`, puis lancer `php occ ...` - -### Intégration d'ONLYOFFICE - -ONLYOFFICE est un éditeur de texte enrichi en ligne qui peut s'intégrer dans Nextcloud - -#### Notify Push - -Notify Push est une application sur Nextcloud qui devrait accélérer l'instance, plus d'informations ici : https://github.com/nextcloud/notify_push#about - -#### Avec l'application YunoHost (support ARM64, meilleures performances) - -Pour de meilleures performances et le support de ARM64 (Raspberry Pi, OLinuXino...), installez l'[app YunoHost OnlyOffice](https://apps.yunohost.org/app/onlyoffice), puis connectez-la à Nextcloud : voir le tutoriel dans la [doc du paquet onlyoffice_ynh](https://github.com/YunoHost-Apps/onlyoffice_ynh/blob/master/README_fr.md#configuration-de-onlyoffice-server) - -#### Alternative: avec l'application Nextcloud (pas de support ARM, performances limitées) - -Nextcloud inclut une intégration directe via une application Nextcloud. -- Installez l'application *Community Document Server* dans votre Nextcloud. C'est la partie qui fait tourner un serveur ONLYOFFICE. -- Installez l'application *ONLYOFFICE*. C'est la partie cliente qui va se connecter au serveur ONLYOFFICE. -- Ensuite dans les Paramètres -> ONLYOFFICE (`https://__DOMAIN____PATH__/settings/admin/onlyoffice`), si vous voulez configurer quels formats de fichier s'ouvrent avec ONLYOFFICE. diff --git a/manifest.toml b/manifest.toml index fd8a3784..99cdfc55 100644 --- a/manifest.toml +++ b/manifest.toml @@ -65,8 +65,8 @@ ram.runtime = "512M" ask.fr = "Activer la Notification Push" type = "boolean" default = false - help.en = "Mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new and adds complexity to the setup)" - help.fr = "Mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle, et augmente la complexité de l'installation)" + help.en = "Notify Push is a mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new and adds complexity to the setup)" + help.fr = "Notify Push est un mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle, et augmente la complexité de l'installation)" [resources] From 67ea5d8100af382b64ac39db1588532b0d020eb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 4 Nov 2024 11:54:59 +0100 Subject: [PATCH 248/354] cleaning --- doc/DESCRIPTION.md | 2 +- doc/DESCRIPTION_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 67150c8f..1eec5bc3 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1,5 +1,5 @@ Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/user portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. diff --git a/doc/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md index b9229dc0..66a4623f 100644 --- a/doc/DESCRIPTION_fr.md +++ b/doc/DESCRIPTION_fr.md @@ -1,5 +1,5 @@ Nextcloud permet de rendre accessible et de synchroniser ses données, fichiers, contacts, agendas entre différents appareils (ordinateurs ou mobiles), ou de les partager avec d'autres personnes (avec ou sans comptes), et propose également des fonctionnalités avancées de communication et de travail collaboratif. Nextcloud dispose de son propre mécanisme d'applications (voir aussi [le store d'apps de Nextcloud](https://apps.nextcloud.com/)) pour disposer des fonctionnalités spécifiques. -Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateur (les comptes YunoHost sont automatiquements connectés à Nextcloud). +Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO/portail utilisateur (les comptes YunoHost sont automatiquements connectés à Nextcloud). L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. From 3fce63ed265b1e4a7789a0b10c0050b89dd0c7c5 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 4 Nov 2024 11:55:04 +0100 Subject: [PATCH 249/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 996dd2de..0d8886b1 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ It shall NOT be edited by hand. Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/user portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. diff --git a/README_es.md b/README_es.md index adec6f9a..4a7a7959 100644 --- a/README_es.md +++ b/README_es.md @@ -18,7 +18,7 @@ No se debe editar a mano. Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/user portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. diff --git a/README_eu.md b/README_eu.md index 1654f23e..a2116462 100644 --- a/README_eu.md +++ b/README_eu.md @@ -18,7 +18,7 @@ EZ editatu eskuz. Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/user portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. diff --git a/README_fr.md b/README_fr.md index 12aea1c0..8b93d822 100644 --- a/README_fr.md +++ b/README_fr.md @@ -18,7 +18,7 @@ Il NE doit PAS être modifié à la main. Nextcloud permet de rendre accessible et de synchroniser ses données, fichiers, contacts, agendas entre différents appareils (ordinateurs ou mobiles), ou de les partager avec d'autres personnes (avec ou sans comptes), et propose également des fonctionnalités avancées de communication et de travail collaboratif. Nextcloud dispose de son propre mécanisme d'applications (voir aussi [le store d'apps de Nextcloud](https://apps.nextcloud.com/)) pour disposer des fonctionnalités spécifiques. -Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateur (les comptes YunoHost sont automatiquements connectés à Nextcloud). +Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO/portail utilisateur (les comptes YunoHost sont automatiquements connectés à Nextcloud). L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. diff --git a/README_gl.md b/README_gl.md index 1f6aba90..d9acf3fb 100644 --- a/README_gl.md +++ b/README_gl.md @@ -18,7 +18,7 @@ NON debe editarse manualmente. Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/user portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. diff --git a/README_id.md b/README_id.md index e15c771b..9732cd3e 100644 --- a/README_id.md +++ b/README_id.md @@ -18,7 +18,7 @@ Ini TIDAK boleh diedit dengan tangan. Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/user portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. diff --git a/README_nl.md b/README_nl.md index dcb88339..11cc8c2f 100644 --- a/README_nl.md +++ b/README_nl.md @@ -18,7 +18,7 @@ Hij mag NIET handmatig aangepast worden. Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/user portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. diff --git a/README_ru.md b/README_ru.md index 6f300d31..e5f6689a 100644 --- a/README_ru.md +++ b/README_ru.md @@ -18,7 +18,7 @@ Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/user portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 7ddc4116..ea555c5c 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -18,7 +18,7 @@ Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/user portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. From 278140470a66eb6b79fc58a08f1451c46d8ce682 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 4 Nov 2024 12:10:17 +0100 Subject: [PATCH 250/354] add link to the help menu --- doc/ADMIN.md | 4 ---- doc/ADMIN_fr.md | 4 ---- manifest.toml | 4 ++-- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/doc/ADMIN.md b/doc/ADMIN.md index 2262f3d7..8d401d2f 100644 --- a/doc/ADMIN.md +++ b/doc/ADMIN.md @@ -8,10 +8,6 @@ sudo -u __APP__ php__PHPVERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ Alternatively, you may open a 'Nextcloud shell' with `sudo yunohost app shell __APP__`, then run `php occ ...` -### Notify Push - -Notify Push is an application on Nextcloud that should speed up the instance, more information here: https://github.com/nextcloud/notify_push#about - ### ONLYOFFICE integration ONLYOFFICE is an online rich text document editor which can be integrated in Nextcloud diff --git a/doc/ADMIN_fr.md b/doc/ADMIN_fr.md index ed3c619b..06b76b12 100644 --- a/doc/ADMIN_fr.md +++ b/doc/ADMIN_fr.md @@ -12,10 +12,6 @@ Ou bien, vous pouvez ouvrir un "shell Nextcloud" avec `sudo yunohost app shell _ ONLYOFFICE est un éditeur de texte enrichi en ligne qui peut s'intégrer dans Nextcloud -#### Notify Push - -Notify Push est une application sur Nextcloud qui devrait accélérer l'instance, plus d'informations ici : https://github.com/nextcloud/notify_push#about - #### Avec l'application YunoHost (support ARM64, meilleures performances) Pour de meilleures performances et le support de ARM64 (Raspberry Pi, OLinuXino...), installez l'[app YunoHost OnlyOffice](https://apps.yunohost.org/app/onlyoffice), puis connectez-la à Nextcloud : voir le tutoriel dans la [doc du paquet onlyoffice_ynh](https://github.com/YunoHost-Apps/onlyoffice_ynh/blob/master/README_fr.md#configuration-de-onlyoffice-server) diff --git a/manifest.toml b/manifest.toml index 575945cc..fa7717ce 100644 --- a/manifest.toml +++ b/manifest.toml @@ -67,8 +67,8 @@ ram.runtime = "512M" ask.fr = "Activer la Notification Push" type = "boolean" default = false - help.en = "Mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new and adds complexity to the setup)" - help.fr = "Mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle, et augmente la complexité de l'installation)" + help.en = "Notify Push is a mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new)" + help.fr = "Notify Push est un mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle)" [resources] From 6f868da54a3dd64aca2d342771e9475e6a210273 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 4 Nov 2024 13:12:37 +0100 Subject: [PATCH 251/354] remove onlyoffice doc (#743) --- doc/ADMIN.md | 15 --------------- doc/ADMIN_fr.md | 15 --------------- 2 files changed, 30 deletions(-) diff --git a/doc/ADMIN.md b/doc/ADMIN.md index 8d401d2f..a48d167d 100644 --- a/doc/ADMIN.md +++ b/doc/ADMIN.md @@ -7,18 +7,3 @@ sudo -u __APP__ php__PHPVERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ``` Alternatively, you may open a 'Nextcloud shell' with `sudo yunohost app shell __APP__`, then run `php occ ...` - -### ONLYOFFICE integration - -ONLYOFFICE is an online rich text document editor which can be integrated in Nextcloud - -#### With YunoHost App (ARM64 support, better performance) - -For better performance and ARM64 support (Raspberry Pi, OLinuXino...), install the [OnlyOffice YunoHost app](https://apps.yunohost.org/app/onlyoffice) and connect it to Nextcloud, see the tutorial in the [doc of onlyoffice_ynh package](https://github.com/YunoHost-Apps/onlyoffice_ynh/blob/master/README_fr.md#configuration-de-onlyoffice-server) - -#### Alternative: With Nextcloud App (no ARM support, lower performance) - -Nextcloud features a direct integration of ONLYOFFICE through a Nextcloud app. -- Install *Community Document Server* application in your Nextcloud. That's the part that runs ONLYOFFICE server. -- Install *ONLYOFFICE* application. That's the client part that will connect to an ONLYOFFICE server. -- Then in Settings -> ONLYOFFICE (`https://__DOMAIN____PATH__/settings/admin/onlyoffice`), if you want to configure which file formats should be opened by ONLYOFFICE. diff --git a/doc/ADMIN_fr.md b/doc/ADMIN_fr.md index 06b76b12..ada48ad9 100644 --- a/doc/ADMIN_fr.md +++ b/doc/ADMIN_fr.md @@ -7,18 +7,3 @@ sudo -u __APP__ php__PHPVERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ``` Ou bien, vous pouvez ouvrir un "shell Nextcloud" avec `sudo yunohost app shell __APP__`, puis lancer `php occ ...` - -### Intégration d'ONLYOFFICE - -ONLYOFFICE est un éditeur de texte enrichi en ligne qui peut s'intégrer dans Nextcloud - -#### Avec l'application YunoHost (support ARM64, meilleures performances) - -Pour de meilleures performances et le support de ARM64 (Raspberry Pi, OLinuXino...), installez l'[app YunoHost OnlyOffice](https://apps.yunohost.org/app/onlyoffice), puis connectez-la à Nextcloud : voir le tutoriel dans la [doc du paquet onlyoffice_ynh](https://github.com/YunoHost-Apps/onlyoffice_ynh/blob/master/README_fr.md#configuration-de-onlyoffice-server) - -#### Alternative: avec l'application Nextcloud (pas de support ARM, performances limitées) - -Nextcloud inclut une intégration directe via une application Nextcloud. -- Installez l'application *Community Document Server* dans votre Nextcloud. C'est la partie qui fait tourner un serveur ONLYOFFICE. -- Installez l'application *ONLYOFFICE*. C'est la partie cliente qui va se connecter au serveur ONLYOFFICE. -- Ensuite dans les Paramètres -> ONLYOFFICE (`https://__DOMAIN____PATH__/settings/admin/onlyoffice`), si vous voulez configurer quels formats de fichier s'ouvrent avec ONLYOFFICE. From 96c0aaf02aaccd95dc3ea79dbeeed2ae795300ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 4 Nov 2024 13:58:01 +0100 Subject: [PATCH 252/354] cleaning --- doc/DESCRIPTION.md | 4 +++- doc/DESCRIPTION_fr.md | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 67150c8f..9565b929 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1,5 +1,7 @@ Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. + +The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. \ No newline at end of file diff --git a/doc/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md index b9229dc0..4300e3f4 100644 --- a/doc/DESCRIPTION_fr.md +++ b/doc/DESCRIPTION_fr.md @@ -1,5 +1,7 @@ Nextcloud permet de rendre accessible et de synchroniser ses données, fichiers, contacts, agendas entre différents appareils (ordinateurs ou mobiles), ou de les partager avec d'autres personnes (avec ou sans comptes), et propose également des fonctionnalités avancées de communication et de travail collaboratif. Nextcloud dispose de son propre mécanisme d'applications (voir aussi [le store d'apps de Nextcloud](https://apps.nextcloud.com/)) pour disposer des fonctionnalités spécifiques. -Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateur (les comptes YunoHost sont automatiquements connectés à Nextcloud). +Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO/portail utilisateur (les comptes YunoHost sont automatiquements connectés à Nextcloud). L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. + +Le catalogue YunoHost dispose de deux suites bureautiques collaboratives, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) et [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), qui peuvent être intégrées à Nextcloud. From 2a296b79fe2fdadfc5041f8c5b57529a1eb45fa4 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 4 Nov 2024 13:58:06 +0100 Subject: [PATCH 253/354] Auto-update READMEs --- README.md | 3 ++- README_es.md | 3 ++- README_eu.md | 3 ++- README_fr.md | 4 +++- README_gl.md | 3 ++- README_id.md | 3 ++- README_nl.md | 3 ++- README_ru.md | 3 ++- README_zh_Hans.md | 3 ++- 9 files changed, 19 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 079d63d6..bc402ccc 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,11 @@ It shall NOT be edited by hand. Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. +The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Shipped version:** 29.0.8~ynh1 diff --git a/README_es.md b/README_es.md index 51e82f2c..9318cc2b 100644 --- a/README_es.md +++ b/README_es.md @@ -18,10 +18,11 @@ No se debe editar a mano. Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. +The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Versión actual:** 29.0.8~ynh1 diff --git a/README_eu.md b/README_eu.md index c54ea437..75e33e05 100644 --- a/README_eu.md +++ b/README_eu.md @@ -18,10 +18,11 @@ EZ editatu eskuz. Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. +The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Paketatutako bertsioa:** 29.0.8~ynh1 diff --git a/README_fr.md b/README_fr.md index 9c3a02aa..0f754fee 100644 --- a/README_fr.md +++ b/README_fr.md @@ -18,10 +18,12 @@ Il NE doit PAS être modifié à la main. Nextcloud permet de rendre accessible et de synchroniser ses données, fichiers, contacts, agendas entre différents appareils (ordinateurs ou mobiles), ou de les partager avec d'autres personnes (avec ou sans comptes), et propose également des fonctionnalités avancées de communication et de travail collaboratif. Nextcloud dispose de son propre mécanisme d'applications (voir aussi [le store d'apps de Nextcloud](https://apps.nextcloud.com/)) pour disposer des fonctionnalités spécifiques. -Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO / portail utilisateur (les comptes YunoHost sont automatiquements connectés à Nextcloud). +Dans le cadre de YunoHost, Nextcloud s'intègre avec le SSO/portail utilisateur (les comptes YunoHost sont automatiquements connectés à Nextcloud). L'adresse `/.well-known` sera automatiquement configuré pour la synchronisation CalDAV et CardDAV si aucun autre service tel que Baïkal ne l'utilise déjà. +Le catalogue YunoHost dispose de deux suites bureautiques collaboratives, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) et [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), qui peuvent être intégrées à Nextcloud. + **Version incluse :** 29.0.8~ynh1 diff --git a/README_gl.md b/README_gl.md index 3f58552e..34ebbd96 100644 --- a/README_gl.md +++ b/README_gl.md @@ -18,10 +18,11 @@ NON debe editarse manualmente. Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. +The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Versión proporcionada:** 29.0.8~ynh1 diff --git a/README_id.md b/README_id.md index ee5cee4b..c46f5fe2 100644 --- a/README_id.md +++ b/README_id.md @@ -18,10 +18,11 @@ Ini TIDAK boleh diedit dengan tangan. Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. +The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Versi terkirim:** 29.0.8~ynh1 diff --git a/README_nl.md b/README_nl.md index 18d16fbc..de8dc8d6 100644 --- a/README_nl.md +++ b/README_nl.md @@ -18,10 +18,11 @@ Hij mag NIET handmatig aangepast worden. Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. +The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Geleverde versie:** 29.0.8~ynh1 diff --git a/README_ru.md b/README_ru.md index 587b92aa..6593d6c9 100644 --- a/README_ru.md +++ b/README_ru.md @@ -18,10 +18,11 @@ Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. +The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Поставляемая версия:** 29.0.8~ynh1 diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 2e29df22..4c5759bf 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -18,10 +18,11 @@ Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. -In the context of YunoHost, Nextcloud integrates with the SSO / user portal (YunoHost accounts are automatically connected to Nextcloud). +In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoHost accounts are automatically connected to Nextcloud). The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. +The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **分发版本:** 29.0.8~ynh1 From f235e0dc26fa3789100108b49426e0837139a41f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 4 Nov 2024 13:58:21 +0100 Subject: [PATCH 254/354] Update DESCRIPTION.md --- doc/DESCRIPTION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 9565b929..4c681db5 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -4,4 +4,4 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. \ No newline at end of file +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. \ No newline at end of file From b48322e45024ee9b681f706051938c0d8784b303 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 4 Nov 2024 13:58:38 +0100 Subject: [PATCH 255/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index bc402ccc..d608f468 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Shipped version:** 29.0.8~ynh1 diff --git a/README_es.md b/README_es.md index 9318cc2b..2cd59a4e 100644 --- a/README_es.md +++ b/README_es.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Versión actual:** 29.0.8~ynh1 diff --git a/README_eu.md b/README_eu.md index 75e33e05..4f8f9c6e 100644 --- a/README_eu.md +++ b/README_eu.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Paketatutako bertsioa:** 29.0.8~ynh1 diff --git a/README_gl.md b/README_gl.md index 34ebbd96..ab48ea3f 100644 --- a/README_gl.md +++ b/README_gl.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Versión proporcionada:** 29.0.8~ynh1 diff --git a/README_id.md b/README_id.md index c46f5fe2..f06ecd5c 100644 --- a/README_id.md +++ b/README_id.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Versi terkirim:** 29.0.8~ynh1 diff --git a/README_nl.md b/README_nl.md index de8dc8d6..dace8128 100644 --- a/README_nl.md +++ b/README_nl.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Geleverde versie:** 29.0.8~ynh1 diff --git a/README_ru.md b/README_ru.md index 6593d6c9..f0d9f773 100644 --- a/README_ru.md +++ b/README_ru.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Поставляемая версия:** 29.0.8~ynh1 diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 4c5759bf..17ecba4e 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **分发版本:** 29.0.8~ynh1 From 51b65ef834a58932da1977a4dab62d21afae42fc Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 4 Nov 2024 14:01:11 +0100 Subject: [PATCH 256/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 93826d04..22fcbfcd 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Shipped version:** 30.0.1~ynh1 diff --git a/README_es.md b/README_es.md index face6312..4366d023 100644 --- a/README_es.md +++ b/README_es.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Versión actual:** 30.0.1~ynh1 diff --git a/README_eu.md b/README_eu.md index b7b10985..ba3c34c8 100644 --- a/README_eu.md +++ b/README_eu.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Paketatutako bertsioa:** 30.0.1~ynh1 diff --git a/README_gl.md b/README_gl.md index 6f7b6f62..6911e390 100644 --- a/README_gl.md +++ b/README_gl.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Versión proporcionada:** 30.0.1~ynh1 diff --git a/README_id.md b/README_id.md index d5d177d0..01ba0f24 100644 --- a/README_id.md +++ b/README_id.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Versi terkirim:** 30.0.1~ynh1 diff --git a/README_nl.md b/README_nl.md index 6eb20021..65dc0a21 100644 --- a/README_nl.md +++ b/README_nl.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Geleverde versie:** 30.0.1~ynh1 diff --git a/README_ru.md b/README_ru.md index d861f41d..50916350 100644 --- a/README_ru.md +++ b/README_ru.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **Поставляемая версия:** 30.0.1~ynh1 diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 24975c12..0ea9c3ce 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -22,7 +22,7 @@ In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoH The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. -The Yunohost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. **分发版本:** 30.0.1~ynh1 From 577521347e57f2f6f94f3f85e98fca7c4e1af156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 4 Nov 2024 15:07:28 +0100 Subject: [PATCH 257/354] cleaning --- config_panel.toml | 5 ++--- manifest.toml | 16 ---------------- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/config_panel.toml b/config_panel.toml index a22d2cb1..60afd22a 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -44,9 +44,8 @@ name.fr = "Configuration de Nextcloud" ask.en = "Enable Notify Push" ask.fr = "Activer la Notification Push" type = "boolean" - help.en = "Mechanism allowing more instantaneous notifications and reduce server load." - help.fr = "Mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur." - + help.en = "Notify Push is a mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new)" + help.fr = "Notify Push est un mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle)" [main.php_fpm_config] name.en = "PHP-FPM configuration" diff --git a/manifest.toml b/manifest.toml index 17d11e06..028415c1 100644 --- a/manifest.toml +++ b/manifest.toml @@ -52,22 +52,6 @@ ram.runtime = "512M" type = "boolean" default = false - [install.system_addressbook_exposed] - ask.en = "Enable address book" - ask.fr = "Activer le carnet d’adresses" - type = "boolean" - default = true - help.en = "Should there be a system address book listing all users, accessible by all users?" - help.fr = "Devrait-il y avoir un carnet d’adresses système répertoriant tous les utilisateurs, accessible par tous les utilisateurs ?" - - [install.enable_notify_push] - ask.en = "Enable Notify Push" - ask.fr = "Activer la Notification Push" - type = "boolean" - default = false - help.en = "Notify Push is a mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new)" - help.fr = "Notify Push est un mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle)" - [resources] [resources.sources] From f713adf5a80f0813fd7c3352f5c8571afdf57a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 4 Nov 2024 15:07:59 +0100 Subject: [PATCH 258/354] Update install --- scripts/install | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 3ba51e9a..3a228c91 100755 --- a/scripts/install +++ b/scripts/install @@ -3,10 +3,19 @@ source _common.sh source /usr/share/yunohost/helpers -phpflags="--define apc.enable_cli=1" +#================================================= +# INITIALIZE AND STORE SETTINGS +#================================================= +phpflags="--define apc.enable_cli=1" ynh_app_setting_set --app=$app --key=phpflags --value="$phpflags" +enable_notify_push="0" +ynh_app_setting_set --app=$app --key=enable_notify_push --value=0 + +system_addressbook_exposed="0" +ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=0 + #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= From 6fdae3408f3d801f085eb1e6c17a2fdffd346875 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 4 Nov 2024 18:01:57 +0100 Subject: [PATCH 259/354] cleaning options (#744) --- manifest.toml | 16 ---------------- scripts/install | 11 ++++++++++- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/manifest.toml b/manifest.toml index fa7717ce..0d380960 100644 --- a/manifest.toml +++ b/manifest.toml @@ -54,22 +54,6 @@ ram.runtime = "512M" type = "boolean" default = false - [install.system_addressbook_exposed] - ask.en = "Enable address book" - ask.fr = "Activer le carnet d’adresses" - type = "boolean" - default = true - help.en = "Should there be a system address book listing all users, accessible by all users?" - help.fr = "Devrait-il y avoir un carnet d’adresses système répertoriant tous les utilisateurs, accessible par tous les utilisateurs ?" - - [install.enable_notify_push] - ask.en = "Enable Notify Push" - ask.fr = "Activer la Notification Push" - type = "boolean" - default = false - help.en = "Notify Push is a mechanism allowing more instantaneous notifications and reduce server load. (However, it is still a bit new)" - help.fr = "Notify Push est un mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur. (Cependant, cette fonctionnalité reste relativement nouvelle)" - [resources] [resources.sources] diff --git a/scripts/install b/scripts/install index 26020d18..8af39aee 100755 --- a/scripts/install +++ b/scripts/install @@ -4,10 +4,19 @@ source _common.sh source /usr/share/yunohost/helpers source _ynh_mysql_connect_as.sh -phpflags="--define apc.enable_cli=1" +#================================================= +# INITIALIZE AND STORE SETTINGS +#================================================= +phpflags="--define apc.enable_cli=1" ynh_app_setting_set --app=$app --key=phpflags --value="$phpflags" +enable_notify_push="0" +ynh_app_setting_set --app=$app --key=enable_notify_push --value=0 + +system_addressbook_exposed="0" +ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=0 + #================================================= # CREATE A MYSQL DATABASE #================================================= From 6adab0f22dd085aa1945aae9772b31418c02e353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 4 Nov 2024 22:07:19 +0100 Subject: [PATCH 260/354] Update remove --- scripts/remove | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/remove b/scripts/remove index 20a29598..93a0e5f7 100755 --- a/scripts/remove +++ b/scripts/remove @@ -22,10 +22,12 @@ ynh_remove_logrotate ynh_remove_fail2ban_config # Remove notify push -ynh_remove_systemd_config --service="${app}-notify-push" -systemctl disable --now --quiet ${app}-notify-push-watcher.path -ynh_secure_remove --file="/etc/systemd/system/${app}-notify-push-watcher.path" -ynh_remove_systemd_config --service="${app}-notify-push-watcher" +if [ $enable_notify_push -eq 1 ]; then + ynh_remove_systemd_config --service="${app}-notify-push" + systemctl disable --now --quiet ${app}-notify-push-watcher.path + ynh_secure_remove --file="/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_remove_systemd_config --service="${app}-notify-push-watcher" +fi # Remove a cron file # TODO: Ensure that cron job is not running (How !?) From f8300384b7308a0f04f6960dd63cbba0ed62000c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 5 Nov 2024 15:32:14 +0100 Subject: [PATCH 261/354] Update tests.toml --- tests.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests.toml b/tests.toml index edbf2ab4..57ee4846 100644 --- a/tests.toml +++ b/tests.toml @@ -9,8 +9,8 @@ test_format = 1.0 # ------------------------------- #test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" - test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" - test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" + #test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" + #test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" #test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" #test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" From 0b374b1151851b606bbb8c5afd56ebbb2530eec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 6 Nov 2024 09:11:42 +0100 Subject: [PATCH 262/354] Update tests.toml --- tests.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests.toml b/tests.toml index 57ee4846..bd538ce0 100644 --- a/tests.toml +++ b/tests.toml @@ -8,11 +8,11 @@ test_format = 1.0 # Commits to test upgrade from # ------------------------------- - #test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" - #test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" - #test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" - #test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" - #test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" + test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" + test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" + test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" + test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" + test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" [default.curl_tests] #home.path = "/" From 41ecf07575f50d851d064d4e312dedd47d29f21b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 7 Nov 2024 10:01:19 +0100 Subject: [PATCH 263/354] Update manifest.toml --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 028415c1..ad0b0164 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "30.0.1~ynh1" +version = "30.0.2~ynh1" maintainers = ["kay0u"] @@ -57,8 +57,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.1.tar.bz2' - sha256 = '79ec2ffad6231bd8fcc4abaacc12e5ac51e670d089affb379483592cda0fdccb' + url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.2.tar.bz2' + sha256 = '929bb8045e96216fe22a65dcd66279e5bd7ba1abb29d99bf401d423b646a445f' [resources.sources.29] url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.8.tar.bz2' From ee4888004780fb89a97588678a01d41372c88543 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 7 Nov 2024 10:02:20 +0100 Subject: [PATCH 264/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 22fcbfcd..a3362adb 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Shipped version:** 30.0.1~ynh1 +**Shipped version:** 30.0.2~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 4366d023..2ad07b4c 100644 --- a/README_es.md +++ b/README_es.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión actual:** 30.0.1~ynh1 +**Versión actual:** 30.0.2~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index ba3c34c8..3497e0f5 100644 --- a/README_eu.md +++ b/README_eu.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Paketatutako bertsioa:** 30.0.1~ynh1 +**Paketatutako bertsioa:** 30.0.2~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index f5bb11a6..961b66d7 100644 --- a/README_fr.md +++ b/README_fr.md @@ -25,7 +25,7 @@ L'adresse `/.well-known` sera automatiquement configuré pour la synchronisatio Le catalogue YunoHost dispose de deux suites bureautiques collaboratives, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) et [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), qui peuvent être intégrées à Nextcloud. -**Version incluse :** 30.0.1~ynh1 +**Version incluse :** 30.0.2~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 6911e390..3df812e9 100644 --- a/README_gl.md +++ b/README_gl.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión proporcionada:** 30.0.1~ynh1 +**Versión proporcionada:** 30.0.2~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index 01ba0f24..1ab90c21 100644 --- a/README_id.md +++ b/README_id.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versi terkirim:** 30.0.1~ynh1 +**Versi terkirim:** 30.0.2~ynh1 **Demo:** diff --git a/README_nl.md b/README_nl.md index 65dc0a21..3b30af19 100644 --- a/README_nl.md +++ b/README_nl.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Geleverde versie:** 30.0.1~ynh1 +**Geleverde versie:** 30.0.2~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md index 50916350..ad911990 100644 --- a/README_ru.md +++ b/README_ru.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Поставляемая версия:** 30.0.1~ynh1 +**Поставляемая версия:** 30.0.2~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 0ea9c3ce..66d266c6 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**分发版本:** 30.0.1~ynh1 +**分发版本:** 30.0.2~ynh1 **演示:** From 47fe09a5c2bb0cd8b051b7ffc7df185368b7fc4b Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 7 Nov 2024 10:18:51 +0100 Subject: [PATCH 265/354] 29.0.9 (#747) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Testing (#735) * Update ADMIN.md (#734) J'ai sorti High Performance Backend, qui était dans la section Onlyoffice, alors que c'est indépendant. * Add experimental curl tests * 29.0.8 * Auto-update READMEs * fix linter * Update remove * Update tests.toml * Add fr translation * remove duplicate extension "js" (#742) * Update config_panel.toml * Update manifest.toml * fix translations * Update config_panel.toml * Update config_panel.toml * Update manifest.toml * Update manifest.toml * Update manifest.toml * Update manifest.toml * Update install * cleaning * cleaning * add link to the help menu * remove onlyoffice doc (#743) * cleaning * Auto-update READMEs * Update DESCRIPTION.md * Auto-update READMEs * cleaning options (#744) * Update remove * Update tests.toml * Update tests.toml --------- Co-authored-by: tomdereub Co-authored-by: Alexandre Aubin Co-authored-by: yunohost-bot * Update manifest.toml * Auto-update READMEs --------- Co-authored-by: tomdereub Co-authored-by: Alexandre Aubin Co-authored-by: yunohost-bot --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- manifest.toml | 6 +++--- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index d608f468..4a80eb97 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Shipped version:** 29.0.8~ynh1 +**Shipped version:** 29.0.9~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 2cd59a4e..7f5d29a1 100644 --- a/README_es.md +++ b/README_es.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión actual:** 29.0.8~ynh1 +**Versión actual:** 29.0.9~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 4f8f9c6e..952bf791 100644 --- a/README_eu.md +++ b/README_eu.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Paketatutako bertsioa:** 29.0.8~ynh1 +**Paketatutako bertsioa:** 29.0.9~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index 0f754fee..962b45f2 100644 --- a/README_fr.md +++ b/README_fr.md @@ -25,7 +25,7 @@ L'adresse `/.well-known` sera automatiquement configuré pour la synchronisatio Le catalogue YunoHost dispose de deux suites bureautiques collaboratives, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) et [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), qui peuvent être intégrées à Nextcloud. -**Version incluse :** 29.0.8~ynh1 +**Version incluse :** 29.0.9~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index ab48ea3f..8aabca61 100644 --- a/README_gl.md +++ b/README_gl.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión proporcionada:** 29.0.8~ynh1 +**Versión proporcionada:** 29.0.9~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index f06ecd5c..6d62855e 100644 --- a/README_id.md +++ b/README_id.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versi terkirim:** 29.0.8~ynh1 +**Versi terkirim:** 29.0.9~ynh1 **Demo:** diff --git a/README_nl.md b/README_nl.md index dace8128..28216f3d 100644 --- a/README_nl.md +++ b/README_nl.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Geleverde versie:** 29.0.8~ynh1 +**Geleverde versie:** 29.0.9~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md index f0d9f773..7a76178e 100644 --- a/README_ru.md +++ b/README_ru.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Поставляемая версия:** 29.0.8~ynh1 +**Поставляемая версия:** 29.0.9~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 17ecba4e..6b1dc244 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**分发版本:** 29.0.8~ynh1 +**分发版本:** 29.0.9~ynh1 **演示:** diff --git a/manifest.toml b/manifest.toml index 0d380960..cefe1995 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.8~ynh1" +version = "29.0.9~ynh1" maintainers = ["kay0u"] @@ -59,8 +59,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.8.tar.bz2' - sha256 = '0ab54b517f76cd26f2bd38b6fe184b9fbaed32f734246c58c1acf83473c0a4b9' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.9.tar.bz2' + sha256 = 'f14e8f497c6d6b2b0da5cd0ad116f0c99f720c4eb05e64432fbd86e09cfb4141' [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.8.tar.bz2' From 8e9d4a16ceb4bbf4972749fce00004932c964eb9 Mon Sep 17 00:00:00 2001 From: grenagit <46225780+grenagit@users.noreply.github.com> Date: Mon, 11 Nov 2024 17:03:31 +0100 Subject: [PATCH 266/354] Update restore --- scripts/restore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/restore b/scripts/restore index 90c74d5a..6b9db07c 100755 --- a/scripts/restore +++ b/scripts/restore @@ -61,7 +61,7 @@ ynh_restore_file --origin_path="/etc/cron.d/$app" ynh_restore_file --origin_path="/var/log/$app" #================================================= -# BACKUP THE LOGROTATE CONFIGURATION +# RESTORE THE LOGROTATE CONFIGURATION #================================================= ynh_script_progression --message="Restoring the logrotate configuration..." --weight=1 From be0378ec16f0ee438ba6d1808b4428f978146ca8 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 17 Nov 2024 08:59:31 +0100 Subject: [PATCH 267/354] 30.0.2 (#729) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update manifest.toml * Auto-update READMEs * add pre upgrade warning for NC 29 * update to PHP8.3 * Auto-update READMEs * Update manifest.toml * Auto-update READMEs * Fix space splitting in phpflags on install (#690) * Auto-update READMEs * Update upgrade * Update manifest.toml * Auto-update READMEs * Fix phpflags (#691) * Fix upgrade: php version is 8.3 starting from 29.x ? (#692) * Update manifest.toml * Auto-update READMEs * Update tests.toml * [autopatch] Do not delete logs on app removal (#697) * [autopatch] Do not delete logs on app removal (#698) Co-authored-by: Yunohost-Bot <> * 29.0.3 * Auto-update READMEs * Update remove * Indent * Fix again upgrade ending with Nextcloud being in PHP 8.2 ? * Auto-update READMEs * Update nginx.conf * Update manifest.toml * Auto-update READMEs * Rework DESCRIPTION.md (#707) * Update DESCRIPTION_fr.md * Auto-update READMEs * Update DESCRIPTION.md * Auto-update READMEs * Update DESCRIPTION_fr.md * Auto-update READMEs --------- Co-authored-by: yunohost-bot * bump all old versions * oupsie * Auto-update READMEs * system_addressbook_exposed is a boolean * Auto-update READMEs * migrate system_addressbook_exposed to boolean, fix upgrade test * another fix for system_addressbook_exposed, update the dav conf accordingly * zblerg, do not modify system_addressbook_exposed config value in the upgrade script * add redis-server as deps * find files before chown them * chown the root folder too * fix find condition * find ... chmod is not faster, at least avoid to chown -R the data_dir in the upgrade script * add a button in the config panel to run chown/chmod on data_dir * we can avoid this chmod too i guess? * only nextcloud is allowed to read the config file * zblerg, the config file doesn't exist before install * wait until nginx has actually remove the nextcloud conf during upgrade before checking the url_handled * create a function for that * fix change-url dav detection * only if domain has changed... * Update scripts/_common.sh * moar sleep * oups * minor typos * Update backup * minor typos * Fix removing ACL permissions on uninstall According to `man setfacl`, for the `--remove` option "[o]nly ACL entries without the perms field are accepted as parameters". * Fix: Add missing `file` argument to `setfacl` * Fix: Use absolute path for removing ACL permissions * Update manifest.toml * Auto-update READMEs * Add notify push option (#417) * add notify_push option * self-test notify_push * fix notify_app * new permission hpb, some fixes * fix the restore script * fix restore² * fix upgrade * fix socket path * Update doc/DISCLAIMER_fr.md * split nginx conf * use official helpers with modified args * Auto-update READMEs * update nginx conf, add new services * add tests * add arch var * tests: enable_notify_push is false by default * fix upgrade * final_path -> install_dir * fix socket nginx path * add notify_push nginx conf before, so the reload in ynh_add_nginx_config load it * fully functional version * readd a removed fix * run cron task after notify push setup * Auto-update READMEs * remove systemd files * add notify push in config panel * add cron again because to make notify push happy * fix indent * enable/disable the notify push path * fix path unit * exec only for nextcloud user * move sock file to /var/run * start notify-push after the watcher * ² * remove warning * cron can sometimes fail when the database is not fully initialized, retries the cron job several times and catch catch the error on failure * oupsie * Apply suggestions from code review Co-authored-by: eric_G <46165813+ericgaspar@users.noreply.github.com> --------- Co-authored-by: Éric Gaspar <46165813+ericgaspar@users.noreply.github.com> Co-authored-by: yunohost-bot * Remove ~duplicate pre-upgrade message (#723) * Fix notify_push after reboot/restart the service, create the folder /var/run/nextcloud via systemd * Update manifest.toml * Auto-update READMEs * Update backup * 29.0.7 * Auto-update READMEs * 30.0.0 * Auto-update READMEs * Update manifest.toml * Auto-update READMEs * Update tests.toml * Update manifest.toml * Update screenshot.png * cleaning * cleaning * Update tests.toml * Update manifest.toml * Auto-update READMEs * Auto-update READMEs * Update manifest.toml --------- Co-authored-by: yunohost-bot Co-authored-by: OniriCorpe Co-authored-by: lyyn <79758863+lyynd@users.noreply.github.com> Co-authored-by: tituspijean Co-authored-by: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Co-authored-by: YunoHost Bot Co-authored-by: Alexandre Aubin Co-authored-by: Kayou Co-authored-by: Björn Richter <2268851+x3rAx@users.noreply.github.com> Co-authored-by: ^x3ro --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- config_panel.toml | 5 ++--- doc/screenshots/screenshot.png | Bin 79212 -> 303067 bytes manifest.toml | 11 +++++++---- scripts/backup | 7 +++++++ scripts/change_url | 5 ----- scripts/config | 1 - scripts/install | 1 - scripts/restore | 5 ----- scripts/upgrade | 3 --- tests.toml | 10 +++++----- 19 files changed, 30 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 4a80eb97..a3362adb 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Shipped version:** 29.0.9~ynh1 +**Shipped version:** 30.0.2~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 7f5d29a1..2ad07b4c 100644 --- a/README_es.md +++ b/README_es.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión actual:** 29.0.9~ynh1 +**Versión actual:** 30.0.2~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index 952bf791..3497e0f5 100644 --- a/README_eu.md +++ b/README_eu.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Paketatutako bertsioa:** 29.0.9~ynh1 +**Paketatutako bertsioa:** 30.0.2~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index 962b45f2..961b66d7 100644 --- a/README_fr.md +++ b/README_fr.md @@ -25,7 +25,7 @@ L'adresse `/.well-known` sera automatiquement configuré pour la synchronisatio Le catalogue YunoHost dispose de deux suites bureautiques collaboratives, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) et [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), qui peuvent être intégrées à Nextcloud. -**Version incluse :** 29.0.9~ynh1 +**Version incluse :** 30.0.2~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 8aabca61..3df812e9 100644 --- a/README_gl.md +++ b/README_gl.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión proporcionada:** 29.0.9~ynh1 +**Versión proporcionada:** 30.0.2~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index 6d62855e..1ab90c21 100644 --- a/README_id.md +++ b/README_id.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versi terkirim:** 29.0.9~ynh1 +**Versi terkirim:** 30.0.2~ynh1 **Demo:** diff --git a/README_nl.md b/README_nl.md index 28216f3d..3b30af19 100644 --- a/README_nl.md +++ b/README_nl.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Geleverde versie:** 29.0.9~ynh1 +**Geleverde versie:** 30.0.2~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md index 7a76178e..ad911990 100644 --- a/README_ru.md +++ b/README_ru.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Поставляемая версия:** 29.0.9~ynh1 +**Поставляемая версия:** 30.0.2~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 6b1dc244..66d266c6 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -24,7 +24,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**分发版本:** 29.0.9~ynh1 +**分发版本:** 30.0.2~ynh1 **演示:** diff --git a/config_panel.toml b/config_panel.toml index a22d2cb1..dfbf1c41 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -44,9 +44,8 @@ name.fr = "Configuration de Nextcloud" ask.en = "Enable Notify Push" ask.fr = "Activer la Notification Push" type = "boolean" - help.en = "Mechanism allowing more instantaneous notifications and reduce server load." - help.fr = "Mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur." - + help.en = "Notify Push is a mechanism allowing more instantaneous notifications and reduce server load." + help.fr = "Notify Push est un mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur." [main.php_fpm_config] name.en = "PHP-FPM configuration" diff --git a/doc/screenshots/screenshot.png b/doc/screenshots/screenshot.png index 1cce4ec675b6b27d7fbb03a87d6f2bddde50ba59..1e0e871764ecc5369c744bafac62149413189cba 100644 GIT binary patch literal 303067 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

UVB*fq{dnRe1YEJ} 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%0D4Gj=Z}%WtLC~`=M+U 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

`Bp@c}*NXq7rbquk@u=Lj;(ESLRq@JSb1O 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 diff --git a/manifest.toml b/manifest.toml index cefe1995..f5aaa418 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "29.0.9~ynh1" +version = "30.0.2~ynh1" maintainers = ["kay0u"] @@ -24,7 +24,6 @@ architectures = ["amd64", "arm64", "armhf"] multi_instance = true ldap = true - sso = true disk = "650M" @@ -59,8 +58,12 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.9.tar.bz2' - sha256 = 'f14e8f497c6d6b2b0da5cd0ad116f0c99f720c4eb05e64432fbd86e09cfb4141' + url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.2.tar.bz2' + sha256 = '929bb8045e96216fe22a65dcd66279e5bd7ba1abb29d99bf401d423b646a445f' + + [resources.sources.29] + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.8.tar.bz2' + sha256 = '0ab54b517f76cd26f2bd38b6fe184b9fbaed32f734246c58c1acf83473c0a4b9' [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.8.tar.bz2' diff --git a/scripts/backup b/scripts/backup index 96d5808b..1407a99c 100755 --- a/scripts/backup +++ b/scripts/backup @@ -21,6 +21,13 @@ ynh_backup --src_path="$install_dir" ynh_backup --src_path="$data_dir" --is_big +#================================================= +# BACKUP THE NGINX CONFIGURATION +#================================================= + +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.d" + #================================================= # SYSTEM CONFIGURATION #================================================= diff --git a/scripts/change_url b/scripts/change_url index 15eaee94..ae966b1e 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -1,7 +1,5 @@ #!/bin/bash -#================================================= -# GENERIC STARTING #================================================= # IMPORT GENERIC HELPERS #================================================= @@ -79,7 +77,6 @@ then ynh_add_systemd_config --service="${app}-notify-push" count=0 - # cron can sometimes fail when the database is not fully initialized, hence it's retried several times, see https://github.com/YunoHost-Apps/nextcloud_ynh/pull/720 while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 @@ -95,8 +92,6 @@ then fi fi -#================================================= -# GENERIC FINALISATION #================================================= # RELOAD NGINX #================================================= diff --git a/scripts/config b/scripts/config index d9ae635b..d756fa9f 100644 --- a/scripts/config +++ b/scripts/config @@ -139,7 +139,6 @@ set__enable_notify_push() { ynh_add_systemd_config --service="${app}-notify-push" count=0 - # cron can sometimes fail when the database is not fully initialized, hence it's retried several times, see https://github.com/YunoHost-Apps/nextcloud_ynh/pull/720 while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 diff --git a/scripts/install b/scripts/install index 8af39aee..4229e7a8 100755 --- a/scripts/install +++ b/scripts/install @@ -306,7 +306,6 @@ ynh_add_fail2ban_config --logpath="/var/log/$app/nextcloud.log" --failregex="^.* if [ $enable_notify_push -eq 1 ] then count=0 - # cron can sometimes fail when the database is not fully initialized, hence it's retried several times, see https://github.com/YunoHost-Apps/nextcloud_ynh/pull/720 while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 diff --git a/scripts/restore b/scripts/restore index 6b9db07c..6a0bf604 100755 --- a/scripts/restore +++ b/scripts/restore @@ -4,8 +4,6 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers source ../settings/scripts/_ynh_mysql_connect_as.sh -#================================================= -# STANDARD RESTORATION STEPS #================================================= # RESTORE THE APP MAIN DIR #================================================= @@ -139,8 +137,6 @@ then systemctl enable --now "${app}-notify-push.service" --quiet fi -#================================================= -# GENERIC FINALIZATION #================================================= # RELOAD NGINX #================================================= @@ -160,7 +156,6 @@ exec_occ() { if [ $enable_notify_push -eq 1 ] then count=0 - # cron can sometimes fail when the database is not fully initialized, hence it's retried several times, see https://github.com/YunoHost-Apps/nextcloud_ynh/pull/720 while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 diff --git a/scripts/upgrade b/scripts/upgrade index ab9b0309..1871d924 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -40,8 +40,6 @@ then ynh_die --message="Upgrading from Nextcloud < 22.2 is not supported anymore. You should first upgrade to 22.2 using: yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/41f5f902e7c7cd3c30a6793020562ba98b9bf3e9" fi -#================================================= -# SPECIFIC UPGRADE #================================================= # MAKE SEQUENTIAL UPGRADES FROM EACH MAJOR # VERSION TO THE NEXT ONE @@ -441,7 +439,6 @@ ynh_add_fail2ban_config --logpath="/var/log/$app/nextcloud.log" --failregex="^.* if [ $enable_notify_push -eq 1 ] then count=0 - # cron can sometimes fail when the database is not fully initialized, hence it's retried several times, see https://github.com/YunoHost-Apps/nextcloud_ynh/pull/720 while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 diff --git a/tests.toml b/tests.toml index bd538ce0..3b5943a1 100644 --- a/tests.toml +++ b/tests.toml @@ -12,7 +12,7 @@ test_format = 1.0 test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" - test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" + test_upgrade_from.541f5fde.name = "Upgrade from 29.0.8" [default.curl_tests] #home.path = "/" @@ -38,8 +38,8 @@ test_format = 1.0 caldav.logged_on_sso = true caldav.expect_content = "This is the WebDAV interface." -[notify_push_test] +#[notify_push_test] - args.enable_notify_push = "1" - test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" - test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" +# args.enable_notify_push = "1" +# test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" +# test_upgrade_from.e9f82ab7.args.system_addressbook_exposed = "yes" From 2b41e99db9faf188e7202fedabd73ce1e24b9d30 Mon Sep 17 00:00:00 2001 From: Thatoo Date: Sun, 17 Nov 2024 12:47:12 +0100 Subject: [PATCH 268/354] [comit] Forward Email? --- config_panel.toml | 11 +++++++++++ scripts/config | 24 +++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/config_panel.toml b/config_panel.toml index dfbf1c41..1beca79e 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -47,6 +47,17 @@ name.fr = "Configuration de Nextcloud" help.en = "Notify Push is a mechanism allowing more instantaneous notifications and reduce server load." help.fr = "Notify Push est un mécanisme qui permet d'avoir des notifications plus rapides et de réduire la charge du serveur." + [main.forward_email] + name.en = "Forward Email?" + name.fr = "Emails de transfert?" + + [main.forward_email.enable_forward_email] + ask.en = "Set yunohost user's forward email instead of yunohost user's main email?" + ask.fr = "Utiliser les emails de transfert des utilisateurs de yunohost plutôt que les emails principaux ?" + type = "boolean" + help.en = "If all your users have set a forward email and aren't using yunohost emails, you may choose to set their forward email as their nextcloud email setting." + help.fr = "Si tous vos utilisateurs ont paramétré un email de transfert et n'utilise pas du tout les emails de leur compte yunohost, vous pouvez paramétrer nextcloud d'utiliser les emails de transfert." + [main.php_fpm_config] name.en = "PHP-FPM configuration" name.fr = "Configuration de PHP-FPM" diff --git a/scripts/config b/scripts/config index d756fa9f..1038e7af 100644 --- a/scripts/config +++ b/scripts/config @@ -47,6 +47,16 @@ get__system_addressbook_exposed() { echo $(exec_occ config:app:get dav system_addressbook_exposed) } +get__enable_forward_email() { + ldapEmail=$(exec_occ ldap:show-config | grep ldapEmailAttribute) + if [ $(echo $ldapEmail | grep -Po "maildrop") = "maildrop" ] + then + echo "1" + else + echo "0" + fi +} + get__fpm_footprint() { # Free footprint value for php-fpm # Check if current_fpm_footprint is an integer @@ -92,7 +102,6 @@ set__system_addressbook_exposed() { ynh_print_info "System addressbook is exposed: $system_addressbook_exposed" } - set__enable_notify_push() { if [ "$enable_notify_push" -eq "0" ]; then nginx_extra_conf_dir="/etc/nginx/conf.d/$domain.d/$app.d" @@ -156,6 +165,19 @@ set__enable_notify_push() { ynh_app_setting_set --app=$app --key=enable_notify_push --value="$enable_notify_push" } +set__enable_forward_email() { + if [ "$enable_forward_email" -eq "0" ]; then + exec_occ ldap:set-config "" ldapEmailAttribute "mail" + ynh_replace_string --match_string="\$this->updateEmail(\$ldapEntry\[\$attr\]\[1\]);" --replace_string="\$this->updateEmail(\$ldapEntry\[\$attr\]\[0\]);" --target_file="$install_dir/apps/user_ldap/lib/User/User.php" + ynh_store_file_checksum --file="$install_dir/apps/user_ldap/lib/User/User.php" + elif [ "$enable_forward_email" -eq "1" ]; then + exec_occ ldap:set-config "" ldapEmailAttribute "maildrop" + ynh_replace_string --match_string="\$this->updateEmail(\$ldapEntry\[\$attr\]\[0\]);" --replace_string="\$this->updateEmail(\$ldapEntry\[\$attr\]\[1\]);" --target_file="$install_dir/apps/user_ldap/lib/User/User.php" + ynh_store_file_checksum --file="$install_dir/apps/user_ldap/lib/User/User.php" + fi + ynh_app_setting_set --app=$app --key=enable_forward_email --value="$enable_forward_email" +} + set__fpm_footprint() { if [ "$fpm_footprint" != "specific" ] then From 383f3b706a3acb82335613fe8c3815867d7b5665 Mon Sep 17 00:00:00 2001 From: Thatoo Date: Sun, 17 Nov 2024 13:54:59 +0100 Subject: [PATCH 269/354] Update config_panel.toml Co-authored-by: eric_G <46165813+ericgaspar@users.noreply.github.com> --- config_panel.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_panel.toml b/config_panel.toml index 1beca79e..1745278d 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -49,7 +49,7 @@ name.fr = "Configuration de Nextcloud" [main.forward_email] name.en = "Forward Email?" - name.fr = "Emails de transfert?" + name.fr = "E-mails de transfert?" [main.forward_email.enable_forward_email] ask.en = "Set yunohost user's forward email instead of yunohost user's main email?" From c7f704348e4e2e33a5a9edf432d5137ef20f567e Mon Sep 17 00:00:00 2001 From: Thatoo Date: Sun, 17 Nov 2024 13:55:12 +0100 Subject: [PATCH 270/354] Update config_panel.toml Co-authored-by: eric_G <46165813+ericgaspar@users.noreply.github.com> --- config_panel.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_panel.toml b/config_panel.toml index 1745278d..b58d90e1 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -52,7 +52,7 @@ name.fr = "Configuration de Nextcloud" name.fr = "E-mails de transfert?" [main.forward_email.enable_forward_email] - ask.en = "Set yunohost user's forward email instead of yunohost user's main email?" + ask.en = "Set YunoHost user's forward email instead of YunoHost user's main email?" ask.fr = "Utiliser les emails de transfert des utilisateurs de yunohost plutôt que les emails principaux ?" type = "boolean" help.en = "If all your users have set a forward email and aren't using yunohost emails, you may choose to set their forward email as their nextcloud email setting." From 16b503064f7da91125f2123655497eee1fde9dd8 Mon Sep 17 00:00:00 2001 From: Thatoo Date: Sun, 17 Nov 2024 13:55:21 +0100 Subject: [PATCH 271/354] Update config_panel.toml Co-authored-by: eric_G <46165813+ericgaspar@users.noreply.github.com> --- config_panel.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_panel.toml b/config_panel.toml index b58d90e1..9578acd4 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -53,7 +53,7 @@ name.fr = "Configuration de Nextcloud" [main.forward_email.enable_forward_email] ask.en = "Set YunoHost user's forward email instead of YunoHost user's main email?" - ask.fr = "Utiliser les emails de transfert des utilisateurs de yunohost plutôt que les emails principaux ?" + ask.fr = "Utiliser les e-mails de transfert des utilisateurs de YunoHost plutôt que les e-mails principaux ?" type = "boolean" help.en = "If all your users have set a forward email and aren't using yunohost emails, you may choose to set their forward email as their nextcloud email setting." help.fr = "Si tous vos utilisateurs ont paramétré un email de transfert et n'utilise pas du tout les emails de leur compte yunohost, vous pouvez paramétrer nextcloud d'utiliser les emails de transfert." From e9082239914cb7f30c048316fc8cea4b79567a2c Mon Sep 17 00:00:00 2001 From: Thatoo Date: Sun, 17 Nov 2024 13:55:30 +0100 Subject: [PATCH 272/354] Update config_panel.toml Co-authored-by: eric_G <46165813+ericgaspar@users.noreply.github.com> --- config_panel.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_panel.toml b/config_panel.toml index 9578acd4..e76eafb5 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -55,7 +55,7 @@ name.fr = "Configuration de Nextcloud" ask.en = "Set YunoHost user's forward email instead of YunoHost user's main email?" ask.fr = "Utiliser les e-mails de transfert des utilisateurs de YunoHost plutôt que les e-mails principaux ?" type = "boolean" - help.en = "If all your users have set a forward email and aren't using yunohost emails, you may choose to set their forward email as their nextcloud email setting." + help.en = "If all your users have set a forward email and aren't using YunoHost emails, you may choose to set their forward email as their Nextcloud email setting." help.fr = "Si tous vos utilisateurs ont paramétré un email de transfert et n'utilise pas du tout les emails de leur compte yunohost, vous pouvez paramétrer nextcloud d'utiliser les emails de transfert." [main.php_fpm_config] From 9790ea9ab35df702b3a46ca072860311ce58ec17 Mon Sep 17 00:00:00 2001 From: Thatoo Date: Sun, 17 Nov 2024 13:55:38 +0100 Subject: [PATCH 273/354] Update config_panel.toml Co-authored-by: eric_G <46165813+ericgaspar@users.noreply.github.com> --- config_panel.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_panel.toml b/config_panel.toml index e76eafb5..90a43dd8 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -56,7 +56,7 @@ name.fr = "Configuration de Nextcloud" ask.fr = "Utiliser les e-mails de transfert des utilisateurs de YunoHost plutôt que les e-mails principaux ?" type = "boolean" help.en = "If all your users have set a forward email and aren't using YunoHost emails, you may choose to set their forward email as their Nextcloud email setting." - help.fr = "Si tous vos utilisateurs ont paramétré un email de transfert et n'utilise pas du tout les emails de leur compte yunohost, vous pouvez paramétrer nextcloud d'utiliser les emails de transfert." + help.fr = "Si tous vos utilisateurs ont paramétré un e-mail de transfert et n'utilise pas du tout les e-mails de leur compte YunoHost, vous pouvez paramétrer Nextcloud d'utiliser les e-mails de transfert." [main.php_fpm_config] name.en = "PHP-FPM configuration" From 866fb3c53e835c523476c4d3e6aa9436e9a52054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 27 Nov 2024 15:22:51 +0100 Subject: [PATCH 274/354] Update tests.toml --- tests.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests.toml b/tests.toml index 3b5943a1..2b893c03 100644 --- a/tests.toml +++ b/tests.toml @@ -8,10 +8,10 @@ test_format = 1.0 # Commits to test upgrade from # ------------------------------- - test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" - test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" - test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" - test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" + #test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" + #test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" + #test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" + #test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" test_upgrade_from.541f5fde.name = "Upgrade from 29.0.8" [default.curl_tests] From cbc06de0f155726f499b94c6d4952480a1e1afd9 Mon Sep 17 00:00:00 2001 From: Thatoo Date: Mon, 2 Dec 2024 00:08:08 +0100 Subject: [PATCH 275/354] add name nextcloud LDAP config to get__enable_forward_email --- scripts/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/config b/scripts/config index 1038e7af..0eb4d671 100644 --- a/scripts/config +++ b/scripts/config @@ -48,7 +48,7 @@ get__system_addressbook_exposed() { } get__enable_forward_email() { - ldapEmail=$(exec_occ ldap:show-config | grep ldapEmailAttribute) + ldapEmail=$(exec_occ ldap:show-config "" | grep ldapEmailAttribute) if [ $(echo $ldapEmail | grep -Po "maildrop") = "maildrop" ] then echo "1" From 9e5bcc19d8c9aec2ba44f5c9e1b5b11ee8d55e87 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Date: Tue, 3 Dec 2024 21:55:40 +0100 Subject: [PATCH 276/354] Add quote in if [ $(cmd) = value ] because i'm paranoid about [ syntax ... --- scripts/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/config b/scripts/config index 0eb4d671..ed7b10f5 100644 --- a/scripts/config +++ b/scripts/config @@ -49,7 +49,7 @@ get__system_addressbook_exposed() { get__enable_forward_email() { ldapEmail=$(exec_occ ldap:show-config "" | grep ldapEmailAttribute) - if [ $(echo $ldapEmail | grep -Po "maildrop") = "maildrop" ] + if [ "$(echo $ldapEmail | grep -Po "maildrop")" = "maildrop" ] then echo "1" else From b9354d0386001c23269ac295c01334b44c0c9ad9 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 3 Dec 2024 22:03:04 +0100 Subject: [PATCH 277/354] Auto-update READMEs --- ALL_README.md | 1 + README.md | 4 +++- README_es.md | 4 +++- README_eu.md | 4 +++- README_fr.md | 4 +++- README_gl.md | 4 +++- README_id.md | 4 +++- README_nl.md | 4 +++- README_pl.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++ README_ru.md | 4 +++- README_zh_Hans.md | 4 +++- 11 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 README_pl.md diff --git a/ALL_README.md b/ALL_README.md index df3708bc..c93d6202 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -7,5 +7,6 @@ - [Le o README en galego](README_gl.md) - [Baca README dalam bahasa bahasa Indonesia](README_id.md) - [Lees de README in het Nederlands](README_nl.md) +- [Przeczytaj README w języku polski](README_pl.md) - [Прочитать README на русский](README_ru.md) - [阅读中文(简体)的 README](README_zh_Hans.md) diff --git a/README.md b/README.md index a3362adb..f645d760 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,9 @@ It shall NOT be edited by hand. # Nextcloud for YunoHost -[![Integration level](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Working status](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Integration level](https://apps.yunohost.org/badge/integration/nextcloud)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) +![Working status](https://apps.yunohost.org/badge/state/nextcloud) +![Maintenance status](https://apps.yunohost.org/badge/maintained/nextcloud) [![Install Nextcloud with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_es.md b/README_es.md index 2ad07b4c..7dd382f9 100644 --- a/README_es.md +++ b/README_es.md @@ -5,7 +5,9 @@ No se debe editar a mano. # Nextcloud para Yunohost -[![Nivel de integración](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Estado funcional](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Estado En Mantención](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Nivel de integración](https://apps.yunohost.org/badge/integration/nextcloud)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) +![Estado funcional](https://apps.yunohost.org/badge/state/nextcloud) +![Estado En Mantención](https://apps.yunohost.org/badge/maintained/nextcloud) [![Instalar Nextcloud con Yunhost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_eu.md b/README_eu.md index 3497e0f5..dfce54f4 100644 --- a/README_eu.md +++ b/README_eu.md @@ -5,7 +5,9 @@ EZ editatu eskuz. # Nextcloud YunoHost-erako -[![Integrazio maila](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Funtzionamendu egoera](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Mantentze egoera](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Integrazio maila](https://apps.yunohost.org/badge/integration/nextcloud)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) +![Funtzionamendu egoera](https://apps.yunohost.org/badge/state/nextcloud) +![Mantentze egoera](https://apps.yunohost.org/badge/maintained/nextcloud) [![Instalatu Nextcloud YunoHost-ekin](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_fr.md b/README_fr.md index 961b66d7..d211d8c2 100644 --- a/README_fr.md +++ b/README_fr.md @@ -5,7 +5,9 @@ Il NE doit PAS être modifié à la main. # Nextcloud pour YunoHost -[![Niveau d’intégration](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Niveau d’intégration](https://apps.yunohost.org/badge/integration/nextcloud)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) +![Statut du fonctionnement](https://apps.yunohost.org/badge/state/nextcloud) +![Statut de maintenance](https://apps.yunohost.org/badge/maintained/nextcloud) [![Installer Nextcloud avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_gl.md b/README_gl.md index 3df812e9..6ac9c635 100644 --- a/README_gl.md +++ b/README_gl.md @@ -5,7 +5,9 @@ NON debe editarse manualmente. # Nextcloud para YunoHost -[![Nivel de integración](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Estado de funcionamento](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Estado de mantemento](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Nivel de integración](https://apps.yunohost.org/badge/integration/nextcloud)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) +![Estado de funcionamento](https://apps.yunohost.org/badge/state/nextcloud) +![Estado de mantemento](https://apps.yunohost.org/badge/maintained/nextcloud) [![Instalar Nextcloud con YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_id.md b/README_id.md index 1ab90c21..17f53464 100644 --- a/README_id.md +++ b/README_id.md @@ -5,7 +5,9 @@ Ini TIDAK boleh diedit dengan tangan. # Nextcloud untuk YunoHost -[![Tingkat integrasi](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Status kerja](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Status pemeliharaan](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Tingkat integrasi](https://apps.yunohost.org/badge/integration/nextcloud)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) +![Status kerja](https://apps.yunohost.org/badge/state/nextcloud) +![Status pemeliharaan](https://apps.yunohost.org/badge/maintained/nextcloud) [![Pasang Nextcloud dengan YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_nl.md b/README_nl.md index 3b30af19..a74b7899 100644 --- a/README_nl.md +++ b/README_nl.md @@ -5,7 +5,9 @@ Hij mag NIET handmatig aangepast worden. # Nextcloud voor Yunohost -[![Integratieniveau](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Mate van functioneren](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Onderhoudsstatus](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Integratieniveau](https://apps.yunohost.org/badge/integration/nextcloud)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) +![Mate van functioneren](https://apps.yunohost.org/badge/state/nextcloud) +![Onderhoudsstatus](https://apps.yunohost.org/badge/maintained/nextcloud) [![Nextcloud met Yunohost installeren](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_pl.md b/README_pl.md new file mode 100644 index 00000000..d2ffb069 --- /dev/null +++ b/README_pl.md @@ -0,0 +1,58 @@ + + +# Nextcloud dla YunoHost + +[![Poziom integracji](https://apps.yunohost.org/badge/integration/nextcloud)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) +![Status działania](https://apps.yunohost.org/badge/state/nextcloud) +![Status utrzymania](https://apps.yunohost.org/badge/maintained/nextcloud) + +[![Zainstaluj Nextcloud z YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) + +*[Przeczytaj plik README w innym języku.](./ALL_README.md)* + +> *Ta aplikacja pozwala na szybką i prostą instalację Nextcloud na serwerze YunoHost.* +> *Jeżeli nie masz YunoHost zapoznaj się z [poradnikiem](https://yunohost.org/install) instalacji.* + +## Przegląd + +Nextcloud lets you access and synchronize data, files, contacts and calendars between different devices (PCs or mobiles), or share them with other people (with or without accounts), and also offers advanced communication and collaborative working features. Nextcloud features its own application mechanism (see also [Nextcloud's app store](https://apps.nextcloud.com/)) for specific functionalities. + +In the context of YunoHost, Nextcloud integrates with the SSO/User Portal (YunoHost accounts are automatically connected to Nextcloud). + +The `/.well-known` address will be automatically configured for CalDAV and CardDAV synchronization if no other service such as Baïkal is already using it. + +The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. + +**Dostarczona wersja:** 30.0.2~ynh1 + +**Demo:** + +## Zrzuty ekranu + +![Zrzut ekranu z Nextcloud](./doc/screenshots/screenshot.png) + +## Dokumentacja i zasoby + +- Oficjalna strona aplikacji: +- Oficjalna dokumentacja: +- Oficjalna dokumentacja dla administratora: +- Repozytorium z kodem źródłowym: +- Sklep YunoHost: +- Zgłaszanie błędów: + +## Informacje od twórców + +Wyślij swój pull request do [gałęzi `testing`](https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing). + +Aby wypróbować gałąź `testing` postępuj zgodnie z instrukcjami: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +lub +sudo yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/testing --debug +``` + +**Więcej informacji o tworzeniu paczek aplikacji:** diff --git a/README_ru.md b/README_ru.md index ad911990..4c845b78 100644 --- a/README_ru.md +++ b/README_ru.md @@ -5,7 +5,9 @@ # Nextcloud для YunoHost -[![Уровень интеграции](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![Состояние работы](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![Состояние сопровождения](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![Уровень интеграции](https://apps.yunohost.org/badge/integration/nextcloud)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) +![Состояние работы](https://apps.yunohost.org/badge/state/nextcloud) +![Состояние сопровождения](https://apps.yunohost.org/badge/maintained/nextcloud) [![Установите Nextcloud с YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 66d266c6..6c07a52f 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -5,7 +5,9 @@ # YunoHost 上的 Nextcloud -[![集成程度](https://dash.yunohost.org/integration/nextcloud.svg)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) ![工作状态](https://ci-apps.yunohost.org/ci/badges/nextcloud.status.svg) ![维护状态](https://ci-apps.yunohost.org/ci/badges/nextcloud.maintain.svg) +[![集成程度](https://apps.yunohost.org/badge/integration/nextcloud)](https://ci-apps.yunohost.org/ci/apps/nextcloud/) +![工作状态](https://apps.yunohost.org/badge/state/nextcloud) +![维护状态](https://apps.yunohost.org/badge/maintained/nextcloud) [![使用 YunoHost 安装 Nextcloud](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=nextcloud) From f4624019075f92a3b8f03fbae162b7fa77827188 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Date: Tue, 3 Dec 2024 22:05:35 +0100 Subject: [PATCH 278/354] Update manifest.toml: revert to 29.0.8 with prefetch = false to fix tests --- manifest.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/manifest.toml b/manifest.toml index c467335d..629802bf 100644 --- a/manifest.toml +++ b/manifest.toml @@ -62,8 +62,9 @@ ram.runtime = "512M" sha256 = '929bb8045e96216fe22a65dcd66279e5bd7ba1abb29d99bf401d423b646a445f' [resources.sources.29] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.9.tar.bz2' - sha256 = 'f14e8f497c6d6b2b0da5cd0ad116f0c99f720c4eb05e64432fbd86e09cfb4141' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.8.tar.bz2' + sha256 = '0ab54b517f76cd26f2bd38b6fe184b9fbaed32f734246c58c1acf83473c0a4b9' + prefetch = false [resources.sources.28] url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.8.tar.bz2' From b7b5f3422a4328f1cf00bdb388ed6582a147f934 Mon Sep 17 00:00:00 2001 From: tituspijean Date: Tue, 3 Dec 2024 22:19:10 +0100 Subject: [PATCH 279/354] Disable output buffering (#758) --- conf/extra_php-fpm.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf index fd92447d..798265ba 100644 --- a/conf/extra_php-fpm.conf +++ b/conf/extra_php-fpm.conf @@ -15,6 +15,8 @@ php_value[opcache.max_accelerated_files]=10000 php_value[opcache.memory_consumption]=128 php_value[opcache.save_comments]=1 php_value[opcache.revalidate_freq]=60 +; https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/big_file_upload_configuration.html#configuring-php +php_value[output_buffering]=0 ; https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/caching_configuration.html#id1 php_value[apc.enabled]=1 php_value[apc.enable_cli]=1 From aea6a8de9e770b6becdbc4b3f47c1c3c1c1aca13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 3 Dec 2024 22:49:57 +0100 Subject: [PATCH 280/354] Update backup --- scripts/backup | 7 ------- 1 file changed, 7 deletions(-) diff --git a/scripts/backup b/scripts/backup index 1407a99c..96d5808b 100755 --- a/scripts/backup +++ b/scripts/backup @@ -21,13 +21,6 @@ ynh_backup --src_path="$install_dir" ynh_backup --src_path="$data_dir" --is_big -#================================================= -# BACKUP THE NGINX CONFIGURATION -#================================================= - -ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" -ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.d" - #================================================= # SYSTEM CONFIGURATION #================================================= From 4ec797a604638d3a4e18336689779ce96458f95b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 5 Dec 2024 20:02:37 +0100 Subject: [PATCH 281/354] Update manifest.toml --- manifest.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/manifest.toml b/manifest.toml index 629802bf..9aaa619e 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "30.0.2~ynh1" +version = "30.0.3~ynh1" maintainers = ["kay0u"] @@ -58,12 +58,12 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.2.tar.bz2' - sha256 = '929bb8045e96216fe22a65dcd66279e5bd7ba1abb29d99bf401d423b646a445f' + url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.3.tar.bz2' + sha256 = 'e3daa583a8c139a4781ff71dd20d4b98f90c7d881c2a49c2d236e785a0bd08d5' [resources.sources.29] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.8.tar.bz2' - sha256 = '0ab54b517f76cd26f2bd38b6fe184b9fbaed32f734246c58c1acf83473c0a4b9' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.10.tar.bz2' + sha256 = 'a5863d9f13af177f27d883317f96c3d176e7b1ca70b0ddd7958494582b494577' prefetch = false [resources.sources.28] From e4b820d271d301f1640b8223f1e22a631a038677 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 5 Dec 2024 20:02:42 +0100 Subject: [PATCH 282/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_pl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index f645d760..c48a61d0 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Shipped version:** 30.0.2~ynh1 +**Shipped version:** 30.0.3~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 7dd382f9..0d0fc133 100644 --- a/README_es.md +++ b/README_es.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión actual:** 30.0.2~ynh1 +**Versión actual:** 30.0.3~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index dfce54f4..fcaf24a0 100644 --- a/README_eu.md +++ b/README_eu.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Paketatutako bertsioa:** 30.0.2~ynh1 +**Paketatutako bertsioa:** 30.0.3~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index d211d8c2..1ef173bd 100644 --- a/README_fr.md +++ b/README_fr.md @@ -27,7 +27,7 @@ L'adresse `/.well-known` sera automatiquement configuré pour la synchronisatio Le catalogue YunoHost dispose de deux suites bureautiques collaboratives, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) et [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), qui peuvent être intégrées à Nextcloud. -**Version incluse :** 30.0.2~ynh1 +**Version incluse :** 30.0.3~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 6ac9c635..5d1caf92 100644 --- a/README_gl.md +++ b/README_gl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión proporcionada:** 30.0.2~ynh1 +**Versión proporcionada:** 30.0.3~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index 17f53464..3d193b94 100644 --- a/README_id.md +++ b/README_id.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versi terkirim:** 30.0.2~ynh1 +**Versi terkirim:** 30.0.3~ynh1 **Demo:** diff --git a/README_nl.md b/README_nl.md index a74b7899..aaace92f 100644 --- a/README_nl.md +++ b/README_nl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Geleverde versie:** 30.0.2~ynh1 +**Geleverde versie:** 30.0.3~ynh1 **Demo:** diff --git a/README_pl.md b/README_pl.md index d2ffb069..e741bf8b 100644 --- a/README_pl.md +++ b/README_pl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Dostarczona wersja:** 30.0.2~ynh1 +**Dostarczona wersja:** 30.0.3~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md index 4c845b78..70963663 100644 --- a/README_ru.md +++ b/README_ru.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Поставляемая версия:** 30.0.2~ynh1 +**Поставляемая версия:** 30.0.3~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 6c07a52f..7b6c6328 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**分发版本:** 30.0.2~ynh1 +**分发版本:** 30.0.3~ynh1 **演示:** From 9c62179b77add157ed81f9d2e6fd391decac3f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 5 Dec 2024 20:03:02 +0100 Subject: [PATCH 283/354] Update manifest.toml --- manifest.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/manifest.toml b/manifest.toml index 0d8bec49..43384083 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "30.0.2~ynh1" +version = "30.0.3~ynh1" maintainers = ["kay0u"] @@ -57,12 +57,12 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.2.tar.bz2' - sha256 = '929bb8045e96216fe22a65dcd66279e5bd7ba1abb29d99bf401d423b646a445f' + url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.3.tar.bz2' + sha256 = 'e3daa583a8c139a4781ff71dd20d4b98f90c7d881c2a49c2d236e785a0bd08d5' [resources.sources.29] - url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.8.tar.bz2' - sha256 = '0ab54b517f76cd26f2bd38b6fe184b9fbaed32f734246c58c1acf83473c0a4b9' + url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.10.tar.bz2' + sha256 = 'a5863d9f13af177f27d883317f96c3d176e7b1ca70b0ddd7958494582b494577' prefetch = false [resources.sources.28] From bb2c68f58339307b015cf5d4af1fb57662e08abd Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 5 Dec 2024 20:03:08 +0100 Subject: [PATCH 284/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_pl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index f645d760..c48a61d0 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Shipped version:** 30.0.2~ynh1 +**Shipped version:** 30.0.3~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 7dd382f9..0d0fc133 100644 --- a/README_es.md +++ b/README_es.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión actual:** 30.0.2~ynh1 +**Versión actual:** 30.0.3~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index dfce54f4..fcaf24a0 100644 --- a/README_eu.md +++ b/README_eu.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Paketatutako bertsioa:** 30.0.2~ynh1 +**Paketatutako bertsioa:** 30.0.3~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index d211d8c2..1ef173bd 100644 --- a/README_fr.md +++ b/README_fr.md @@ -27,7 +27,7 @@ L'adresse `/.well-known` sera automatiquement configuré pour la synchronisatio Le catalogue YunoHost dispose de deux suites bureautiques collaboratives, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) et [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), qui peuvent être intégrées à Nextcloud. -**Version incluse :** 30.0.2~ynh1 +**Version incluse :** 30.0.3~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 6ac9c635..5d1caf92 100644 --- a/README_gl.md +++ b/README_gl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión proporcionada:** 30.0.2~ynh1 +**Versión proporcionada:** 30.0.3~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index 17f53464..3d193b94 100644 --- a/README_id.md +++ b/README_id.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versi terkirim:** 30.0.2~ynh1 +**Versi terkirim:** 30.0.3~ynh1 **Demo:** diff --git a/README_nl.md b/README_nl.md index a74b7899..aaace92f 100644 --- a/README_nl.md +++ b/README_nl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Geleverde versie:** 30.0.2~ynh1 +**Geleverde versie:** 30.0.3~ynh1 **Demo:** diff --git a/README_pl.md b/README_pl.md index d2ffb069..e741bf8b 100644 --- a/README_pl.md +++ b/README_pl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Dostarczona wersja:** 30.0.2~ynh1 +**Dostarczona wersja:** 30.0.3~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md index 4c845b78..70963663 100644 --- a/README_ru.md +++ b/README_ru.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Поставляемая версия:** 30.0.2~ynh1 +**Поставляемая версия:** 30.0.3~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 6c07a52f..7b6c6328 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**分发版本:** 30.0.2~ynh1 +**分发版本:** 30.0.3~ynh1 **演示:** From f7b29ecb9f075dced1bf922bfddbfec586d5dc70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 5 Dec 2024 20:18:43 +0100 Subject: [PATCH 285/354] Update manifest.toml --- manifest.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.toml b/manifest.toml index 9aaa619e..086012f7 100644 --- a/manifest.toml +++ b/manifest.toml @@ -67,8 +67,8 @@ ram.runtime = "512M" prefetch = false [resources.sources.28] - url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.8.tar.bz2' - sha256 = '55a2f745fcc8f01b5816b23333f1e3014d2040a66794e132ddd0d219a37be53a' + url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.13.tar.bz2' + sha256 = '989130cac091c1adb9696f97956e69e5cdd07176d292c3fb086db9c62cf71db5' prefetch = false [resources.sources.27] From a40c87d40301ece82a7f3594461d8ab2064c392c Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 5 Dec 2024 22:40:14 +0100 Subject: [PATCH 286/354] Auto-update READMEs --- README_es.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README_es.md b/README_es.md index 74f68078..0d0fc133 100644 --- a/README_es.md +++ b/README_es.md @@ -26,7 +26,6 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. - **Versión actual:** 30.0.3~ynh1 **Demo:** From 0963e9febe62794a44cd95db1714e4668bfca964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 5 Dec 2024 22:44:44 +0100 Subject: [PATCH 287/354] Update upgrade --- scripts/upgrade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 1340e62c..90e76a22 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -56,7 +56,7 @@ filter_boring_occ_warnings() { current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) current_major_version=${current_version%%.*} -last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9]') +last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9][0-9]') last_major_version=${last_version%%.*} # Define a function to execute commands with `occ` @@ -158,7 +158,7 @@ function list_installed_apps_not_compatible_with_future_version() #current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) #current_major_version=${current_version%%.*} -#last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9]') +#last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9][0-9]') #last_major_version=${last_version%%.*} if [[ "$last_major_version" != "$current_major_version" ]] From c8bf2fa2fd33c6a82417b1be6bf63e08adac85d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Fri, 6 Dec 2024 12:22:56 +0100 Subject: [PATCH 288/354] Update tests.toml --- tests.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests.toml b/tests.toml index 2b893c03..3af71181 100644 --- a/tests.toml +++ b/tests.toml @@ -10,8 +10,8 @@ test_format = 1.0 #test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" #test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" - #test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" - #test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" + test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" + test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" test_upgrade_from.541f5fde.name = "Upgrade from 29.0.8" [default.curl_tests] From 53e1dac0a0d52932f01c0671712040d55b3402f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sat, 7 Dec 2024 16:24:22 +0100 Subject: [PATCH 289/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 62001c83..97bbdc6c 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -124,7 +124,7 @@ function list_installed_apps_not_compatible_with_future_version() current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) current_major_version=${current_version%%.*} -last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9][0-9]') +last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9]+') last_major_version=${last_version%%.*} if [[ "$last_major_version" != "$current_major_version" ]] From daae8417cb2cc5e1875104e7adedf700a11b16b1 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Date: Tue, 10 Dec 2024 19:52:37 +0100 Subject: [PATCH 290/354] Update scripts/upgrade: gotta use -E for grep to recognize the + quantifier --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 97bbdc6c..b28f0e94 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -124,7 +124,7 @@ function list_installed_apps_not_compatible_with_future_version() current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) current_major_version=${current_version%%.*} -last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9]+') +last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -Eo '[0-9][0-9]\.[0-9]\.[0-9]+') last_major_version=${last_version%%.*} if [[ "$last_major_version" != "$current_major_version" ]] From a29f99583371f568e65165b5f10ae8b649b81bd7 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 10 Dec 2024 22:46:45 +0100 Subject: [PATCH 291/354] Helpers 2.1 (v30.0.3) (#746) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update manifest.toml * Auto-update READMEs * add pre upgrade warning for NC 29 * update to PHP8.3 * Auto-update READMEs * Update manifest.toml * Auto-update READMEs * Fix space splitting in phpflags on install (#690) * Auto-update READMEs * Update upgrade * Update manifest.toml * Auto-update READMEs * Fix phpflags (#691) * Fix upgrade: php version is 8.3 starting from 29.x ? (#692) * Update manifest.toml * Auto-update READMEs * Update tests.toml * [autopatch] Do not delete logs on app removal (#697) * [autopatch] Do not delete logs on app removal (#698) Co-authored-by: Yunohost-Bot <> * 29.0.3 * Auto-update READMEs * Update remove * Indent * Fix again upgrade ending with Nextcloud being in PHP 8.2 ? * Auto-update READMEs * Update nginx.conf * Update manifest.toml * Auto-update READMEs * Rework DESCRIPTION.md (#707) * Update DESCRIPTION_fr.md * Auto-update READMEs * Update DESCRIPTION.md * Auto-update READMEs * Update DESCRIPTION_fr.md * Auto-update READMEs --------- Co-authored-by: yunohost-bot * bump all old versions * oupsie * Auto-update READMEs * system_addressbook_exposed is a boolean * Auto-update READMEs * migrate system_addressbook_exposed to boolean, fix upgrade test * another fix for system_addressbook_exposed, update the dav conf accordingly * zblerg, do not modify system_addressbook_exposed config value in the upgrade script * add redis-server as deps * find files before chown them * chown the root folder too * fix find condition * find ... chmod is not faster, at least avoid to chown -R the data_dir in the upgrade script * add a button in the config panel to run chown/chmod on data_dir * we can avoid this chmod too i guess? * only nextcloud is allowed to read the config file * zblerg, the config file doesn't exist before install * wait until nginx has actually remove the nextcloud conf during upgrade before checking the url_handled * create a function for that * fix change-url dav detection * only if domain has changed... * Update scripts/_common.sh * moar sleep * oups * minor typos * Update backup * minor typos * Fix removing ACL permissions on uninstall According to `man setfacl`, for the `--remove` option "[o]nly ACL entries without the perms field are accepted as parameters". * Fix: Add missing `file` argument to `setfacl` * Fix: Use absolute path for removing ACL permissions * Update manifest.toml * Auto-update READMEs * Add notify push option (#417) * add notify_push option * self-test notify_push * fix notify_app * new permission hpb, some fixes * fix the restore script * fix restore² * fix upgrade * fix socket path * Update doc/DISCLAIMER_fr.md * split nginx conf * use official helpers with modified args * Auto-update READMEs * update nginx conf, add new services * add tests * add arch var * tests: enable_notify_push is false by default * fix upgrade * final_path -> install_dir * fix socket nginx path * add notify_push nginx conf before, so the reload in ynh_add_nginx_config load it * fully functional version * readd a removed fix * run cron task after notify push setup * Auto-update READMEs * remove systemd files * add notify push in config panel * add cron again because to make notify push happy * fix indent * enable/disable the notify push path * fix path unit * exec only for nextcloud user * move sock file to /var/run * start notify-push after the watcher * ² * remove warning * cron can sometimes fail when the database is not fully initialized, retries the cron job several times and catch catch the error on failure * oupsie * Apply suggestions from code review Co-authored-by: eric_G <46165813+ericgaspar@users.noreply.github.com> --------- Co-authored-by: Éric Gaspar <46165813+ericgaspar@users.noreply.github.com> Co-authored-by: yunohost-bot * Remove ~duplicate pre-upgrade message (#723) * Fix notify_push after reboot/restart the service, create the folder /var/run/nextcloud via systemd * Update manifest.toml * Auto-update READMEs * Update backup * 29.0.7 * Auto-update READMEs * 30.0.0 * Auto-update READMEs * Update manifest.toml * Auto-update READMEs * Update tests.toml * Update manifest.toml * Update screenshot.png * cleaning * cleaning * Update tests.toml * helpers * cleaning * Update config * Update config * fix * Create .gitignore * Update install * Update upgrade * Update install * Update _common.sh * cleaning * Update backup * Update upgrade * Auto-update READMEs * Update config * Update config_panel.toml * Update tests.toml * Update backup * Update scripts/config Co-authored-by: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> * Update scripts/change_url Co-authored-by: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> * Fix patch handling, no more trick required because patches are now well identified as being meant for the 'main' (=latest) source * Update scripts/restore Co-authored-by: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> * Update upgrade * Remove the need for custom mysql helper (requires yunohost 12.0. ... 8 ?) * fix * Update install * Update upgrade * Update upgrade * Update upgrade * Update manifest.toml * Update manifest.toml: bump again yunohost requirement to 12.0.8.2 * Update upgrade * Update manifest.toml: sources for 30.0.3 disappeared again so we have to fucking revert to 30.0.2 zzzzzz * Auto-update READMEs * Update 00-add-logout_url-conf.patch * Update 01-disable-CSPv3-nonce_and_allow-YNH-fonts.patch * Update 01-disable-CSPv3-nonce_and_allow-YNH-fonts.patch * Delete sources/patches/.gitignore * Update upgrade * Update scripts/upgrade: gotta use -E for grep to recognize the + quantifier * Update manifest.toml --------- Co-authored-by: yunohost-bot Co-authored-by: OniriCorpe Co-authored-by: lyyn <79758863+lyynd@users.noreply.github.com> Co-authored-by: tituspijean Co-authored-by: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> Co-authored-by: YunoHost Bot Co-authored-by: Alexandre Aubin Co-authored-by: Kayou Co-authored-by: Björn Richter <2268851+x3rAx@users.noreply.github.com> Co-authored-by: ^x3ro --- .gitignore | 1 + README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_pl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- conf/config.json | 126 +++++++++--------- conf/extra_php-fpm.conf | 3 - conf/nextcloud.cron | 2 +- conf/nginx.conf | 2 +- config_panel.toml | 31 ----- doc/ADMIN.md | 2 +- doc/ADMIN_fr.md | 2 +- hooks/post_user_delete | 6 +- manifest.toml | 15 ++- .../main/00-add-logout_url-conf.patch | 22 ++- ...able-CSPv3-nonce_and_allow-YNH-fonts.patch | 28 ++-- ...eval-in-JS-scripts-for-YunoHost-tile.patch | 0 scripts/_common.sh | 15 +-- scripts/_ynh_mysql_connect_as.sh | 36 ----- scripts/_ynh_mysql_dump_db.sh | 37 ----- scripts/backup | 38 +++--- scripts/change_url | 38 +++--- scripts/config | 120 ++++------------- scripts/install | 101 +++++++------- scripts/remove | 27 ++-- scripts/restore | 72 +++++----- scripts/upgrade | 125 +++++++++-------- sources/patches/.gitignore | 0 34 files changed, 333 insertions(+), 536 deletions(-) rename sources/patches_last_version/app-00-add-logout_url-conf.patch => patches/main/00-add-logout_url-conf.patch (67%) rename sources/patches_last_version/app-01-disable-CSPv3-nonce_and_allow-YNH-fonts.patch => patches/main/01-disable-CSPv3-nonce_and_allow-YNH-fonts.patch (63%) rename sources/patches_last_version/app-02-Allow-for-eval-in-JS-scripts-for-YunoHost-tile.patch => patches/main/02-Allow-for-eval-in-JS-scripts-for-YunoHost-tile.patch (100%) delete mode 100644 scripts/_ynh_mysql_connect_as.sh delete mode 100644 scripts/_ynh_mysql_dump_db.sh delete mode 100644 sources/patches/.gitignore diff --git a/.gitignore b/.gitignore index 783a4aee..8f144f36 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *~ *.sw[op] +.DS_Store diff --git a/README.md b/README.md index c48a61d0..f645d760 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Shipped version:** 30.0.3~ynh1 +**Shipped version:** 30.0.2~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 0d0fc133..7dd382f9 100644 --- a/README_es.md +++ b/README_es.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión actual:** 30.0.3~ynh1 +**Versión actual:** 30.0.2~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index fcaf24a0..dfce54f4 100644 --- a/README_eu.md +++ b/README_eu.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Paketatutako bertsioa:** 30.0.3~ynh1 +**Paketatutako bertsioa:** 30.0.2~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index 1ef173bd..d211d8c2 100644 --- a/README_fr.md +++ b/README_fr.md @@ -27,7 +27,7 @@ L'adresse `/.well-known` sera automatiquement configuré pour la synchronisatio Le catalogue YunoHost dispose de deux suites bureautiques collaboratives, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) et [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), qui peuvent être intégrées à Nextcloud. -**Version incluse :** 30.0.3~ynh1 +**Version incluse :** 30.0.2~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 5d1caf92..6ac9c635 100644 --- a/README_gl.md +++ b/README_gl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión proporcionada:** 30.0.3~ynh1 +**Versión proporcionada:** 30.0.2~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index 3d193b94..17f53464 100644 --- a/README_id.md +++ b/README_id.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versi terkirim:** 30.0.3~ynh1 +**Versi terkirim:** 30.0.2~ynh1 **Demo:** diff --git a/README_nl.md b/README_nl.md index aaace92f..a74b7899 100644 --- a/README_nl.md +++ b/README_nl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Geleverde versie:** 30.0.3~ynh1 +**Geleverde versie:** 30.0.2~ynh1 **Demo:** diff --git a/README_pl.md b/README_pl.md index e741bf8b..d2ffb069 100644 --- a/README_pl.md +++ b/README_pl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Dostarczona wersja:** 30.0.3~ynh1 +**Dostarczona wersja:** 30.0.2~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md index 70963663..4c845b78 100644 --- a/README_ru.md +++ b/README_ru.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Поставляемая версия:** 30.0.3~ynh1 +**Поставляемая версия:** 30.0.2~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 7b6c6328..6c07a52f 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**分发版本:** 30.0.3~ynh1 +**分发版本:** 30.0.2~ynh1 **演示:** diff --git a/conf/config.json b/conf/config.json index 02d85721..bb800325 100644 --- a/conf/config.json +++ b/conf/config.json @@ -1,63 +1,63 @@ -{ - "system": { - "updatechecker": false, - "memcache.local": "\\OC\\Memcache\\APCu", - "integrity.check.disabled": true, - "filelocking.enabled": true, - "memcache.locking": "\\OC\\Memcache\\Redis", - "redis": { - "host": "localhost", - "port": "6379", - "timeout": "0.0", - "password": "" - }, - "hashing_default_password": true, - "localstorage.allowsymlinks": true, - "simpleSignUpLink.shown": false, - "maintenance_window_start": 1, - "mail_smtpmode": "smtp", - "mail_smtpport": "25", - "mail_smtpauth": 1, - "mail_smtpname": "__APP__", - "mail_smtppassword": "__MAIL_PWD__", - "mail_sendmailmode": "smtp", - "mail_from_address": "__APP__", - "mail_domain": "__DOMAIN__", - "mail_smtphost": "localhost", - "mail_smtpstreamoptions": { - "ssl": { - "allow_self_signed": true, - "verify_peer": false, - "verify_peer_name": false - } - }, - "trusted_proxies": [ "127.0.0.1", "::1" ] - }, - "apps": { - "user_ldap": { - "ldap_base": "dc=yunohost,dc=org", - "ldap_base_groups": "ou=groups,dc=yunohost,dc=org", - "ldap_base_users": "ou=users,dc=yunohost,dc=org", - "ldap_cache_ttl": "600", - "ldap_configuration_active": "1", - "ldap_display_name": "displayname", - "ldap_email_attr": "mail", - "ldap_expert_username_attr": "uid", - "ldap_group_display_name": "cn", - "ldap_group_filter": "(&(objectclass=top)(memberUid=*))", - "ldap_group_filter_mode": "0", - "ldap_groupfilter_objectclass": "posixGroup", - "ldap_group_member_assoc_attribute": "memberUid", - "ldap_host": "localhost", - "ldap_login_filter": "(&(|(objectclass=posixAccount))(uid=%uid)(permission=cn=__APP__.main,ou=permission,dc=yunohost,dc=org))", - "ldap_login_filter_mode": "0", - "ldap_port": "389", - "ldap_quota_attr": "userquota", - "ldap_tls": "0", - "ldap_user_display_name": "cn", - "ldap_user_filter_mode": "0", - "ldap_userfilter_objectclass": "posixAccount", - "ldap_userlist_filter": "objectclass=posixAccount" - } - } -} +{ + "system": { + "updatechecker": false, + "memcache.local": "\\OC\\Memcache\\APCu", + "integrity.check.disabled": true, + "filelocking.enabled": true, + "memcache.locking": "\\OC\\Memcache\\Redis", + "redis": { + "host": "localhost", + "port": "6379", + "timeout": "0.0", + "password": "" + }, + "hashing_default_password": true, + "localstorage.allowsymlinks": true, + "simpleSignUpLink.shown": false, + "maintenance_window_start": 1, + "mail_smtpmode": "smtp", + "mail_smtpport": "25", + "mail_smtpauth": 1, + "mail_smtpname": "__APP__", + "mail_smtppassword": "__MAIL_PWD__", + "mail_sendmailmode": "smtp", + "mail_from_address": "__APP__", + "mail_domain": "__DOMAIN__", + "mail_smtphost": "localhost", + "mail_smtpstreamoptions": { + "ssl": { + "allow_self_signed": true, + "verify_peer": false, + "verify_peer_name": false + } + }, + "trusted_proxies": [ "127.0.0.1", "::1" ] + }, + "apps": { + "user_ldap": { + "ldap_base": "dc=yunohost,dc=org", + "ldap_base_groups": "ou=groups,dc=yunohost,dc=org", + "ldap_base_users": "ou=users,dc=yunohost,dc=org", + "ldap_cache_ttl": "600", + "ldap_configuration_active": "1", + "ldap_display_name": "displayname", + "ldap_email_attr": "mail", + "ldap_expert_username_attr": "uid", + "ldap_group_display_name": "cn", + "ldap_group_filter": "(&(objectclass=top)(memberUid=*))", + "ldap_group_filter_mode": "0", + "ldap_groupfilter_objectclass": "posixGroup", + "ldap_group_member_assoc_attribute": "memberUid", + "ldap_host": "localhost", + "ldap_login_filter": "(&(|(objectclass=posixAccount))(uid=%uid)(permission=cn=__APP__.main,ou=permission,dc=yunohost,dc=org))", + "ldap_login_filter_mode": "0", + "ldap_port": "389", + "ldap_quota_attr": "userquota", + "ldap_tls": "0", + "ldap_user_display_name": "cn", + "ldap_user_filter_mode": "0", + "ldap_userfilter_objectclass": "posixAccount", + "ldap_userlist_filter": "objectclass=posixAccount" + } + } +} diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf index 798265ba..a762cd02 100644 --- a/conf/extra_php-fpm.conf +++ b/conf/extra_php-fpm.conf @@ -1,9 +1,6 @@ ; Additional php.ini defines, specific to this pool of workers. env[PATH] = $PATH -php_admin_value[memory_limit] = 512M -php_value[upload_max_filesize] = 10G -php_value[post_max_size] = 10G php_value[default_charset] = UTF-8 ; OPcache is already activated by default ; php_value[opcache.enable]=1 diff --git a/conf/nextcloud.cron b/conf/nextcloud.cron index 31bfe2f0..29c313cc 100644 --- a/conf/nextcloud.cron +++ b/conf/nextcloud.cron @@ -1 +1 @@ -*/5 * * * * __APP__ /usr/bin/php__PHPVERSION__ --define apc.enable_cli=1 -f __INSTALL_DIR__/cron.php +*/5 * * * * __APP__ /usr/bin/php__PHP_VERSION__ --define apc.enable_cli=1 -f __INSTALL_DIR__/cron.php diff --git a/conf/nginx.conf b/conf/nginx.conf index 6b01ab59..b8bf1772 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -117,7 +117,7 @@ location ^~ __PATH__/ { fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice fastcgi_param front_controller_active true; # Enable pretty urls fastcgi_param HTTP_ACCEPT_ENCODING ""; # Disable encoding of Nextcloud response to inject ynh scripts - fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; + fastcgi_pass unix:/var/run/php/php__PHP_VERSION__-fpm-__APP__.sock; fastcgi_intercept_errors on; fastcgi_request_buffering off; diff --git a/config_panel.toml b/config_panel.toml index 90a43dd8..0d4f160d 100644 --- a/config_panel.toml +++ b/config_panel.toml @@ -57,34 +57,3 @@ name.fr = "Configuration de Nextcloud" type = "boolean" help.en = "If all your users have set a forward email and aren't using YunoHost emails, you may choose to set their forward email as their Nextcloud email setting." help.fr = "Si tous vos utilisateurs ont paramétré un e-mail de transfert et n'utilise pas du tout les e-mails de leur compte YunoHost, vous pouvez paramétrer Nextcloud d'utiliser les e-mails de transfert." - - [main.php_fpm_config] - name.en = "PHP-FPM configuration" - name.fr = "Configuration de PHP-FPM" - - [main.php_fpm_config.fpm_footprint] - ask.en = "Memory footprint" - ask.fr = "Empreinte mémoire" - type = "select" - choices.low = "Low, <= 20Mb per pool" - choices.medium = "Medium, between 20Mb and 40Mb per pool" - choices.high = "High, > 40Mb per pool" - choices.specific = "Use specific value" - default = "low" - - [main.php_fpm_config.fpm_free_footprint] - visible = "fpm_footprint == 'specific'" - 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.en = "Expected usage" - ask.fr = "Utilisation prévue" - type = "select" - choices = ["low", "medium", "high"] - default = "low" - help.en = "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." - help.fr = "low : utilisation personnelle, derrière le SSO. Pas d'empreinte RAM lorsqu'il n'est pas utilisé, mais l'impact sur le processeur peut être élevé si de nombreux utilisateurs utilisent le service.
medium : faible utilisation, peu de personnes ou/et accessible au public. Faible empreinte RAM, empreinte processeur moyenne lorsqu'il est utilisé.
high : utilisation élevée, site Web fréquemment visité. Empreinte RAM élevée, mais utilisation du processeur plus faible et réponse rapide." - diff --git a/doc/ADMIN.md b/doc/ADMIN.md index a48d167d..7e04712d 100644 --- a/doc/ADMIN.md +++ b/doc/ADMIN.md @@ -3,7 +3,7 @@ You can run Nextcloud commands from the command line using: ``` -sudo -u __APP__ php__PHPVERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ... +sudo -u __APP__ php__PHP_VERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ... ``` Alternatively, you may open a 'Nextcloud shell' with `sudo yunohost app shell __APP__`, then run `php occ ...` diff --git a/doc/ADMIN_fr.md b/doc/ADMIN_fr.md index ada48ad9..4a9e8789 100644 --- a/doc/ADMIN_fr.md +++ b/doc/ADMIN_fr.md @@ -3,7 +3,7 @@ Vous pouvez lancer des commandes Nextcloud depuis la ligne de commande avec: ``` -sudo -u __APP__ php__PHPVERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ... +sudo -u __APP__ php__PHP_VERSION__ --define apc.enable_cli=1 __INSTALL_DIR__/occ ... ``` Ou bien, vous pouvez ouvrir un "shell Nextcloud" avec `sudo yunohost app shell __APP__`, puis lancer `php occ ...` diff --git a/hooks/post_user_delete b/hooks/post_user_delete index d824c122..7d49d24b 100644 --- a/hooks/post_user_delete +++ b/hooks/post_user_delete @@ -5,12 +5,12 @@ source /usr/share/yunohost/helpers user="$1" app="$(basename $0 | cut -d- -f 2-)" # Extract the app name from the script name, which is supposed to be something like "50-app_id" install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +php_version=$(ynh_app_setting_get --app=$app --key=php_version) # Define a function to execute commands with `occ` exec_occ() { - (cd "$install_dir" && ynh_exec_as "$app" \ - php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") + (cd "$install_dir" && ynh_exec_as_app \ + php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") } exec_occ user:delete $user diff --git a/manifest.toml b/manifest.toml index 086012f7..7a796b21 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "30.0.3~ynh1" +version = "30.0.2~ynh1" maintainers = ["kay0u"] @@ -19,7 +19,8 @@ code = "https://github.com/nextcloud/server" cpe = "cpe:2.3:a:nextcloud:nextcloud" [integration] -yunohost = ">= 11.2.30" +yunohost = ">= 12.0.8.2" +helpers_version = "2.1" architectures = ["amd64", "arm64", "armhf"] multi_instance = true @@ -58,8 +59,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.3.tar.bz2' - sha256 = 'e3daa583a8c139a4781ff71dd20d4b98f90c7d881c2a49c2d236e785a0bd08d5' + url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.2.tar.bz2' + sha256 = '929bb8045e96216fe22a65dcd66279e5bd7ba1abb29d99bf401d423b646a445f' [resources.sources.29] url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.10.tar.bz2' @@ -67,8 +68,8 @@ ram.runtime = "512M" prefetch = false [resources.sources.28] - url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.13.tar.bz2' - sha256 = '989130cac091c1adb9696f97956e69e5cdd07176d292c3fb086db9c62cf71db5' + url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.12.tar.bz2' + sha256 = '2a00ca4f799360f0987fcbc85d99b2c258f7d2ccf7e6f7e0c4ccf17a127f0105' prefetch = false [resources.sources.27] @@ -100,6 +101,7 @@ ram.runtime = "512M" allow_email = true [resources.install_dir] + group = "www-data:r-x" [resources.data_dir] subdirs = ["data"] @@ -118,4 +120,3 @@ ram.runtime = "512M" [resources.database] type = "mysql" - diff --git a/sources/patches_last_version/app-00-add-logout_url-conf.patch b/patches/main/00-add-logout_url-conf.patch similarity index 67% rename from sources/patches_last_version/app-00-add-logout_url-conf.patch rename to patches/main/00-add-logout_url-conf.patch index 03f7fc29..8628b783 100644 --- a/sources/patches_last_version/app-00-add-logout_url-conf.patch +++ b/patches/main/00-add-logout_url-conf.patch @@ -1,32 +1,30 @@ diff --git a/core/Controller/LoginController.php b/core/Controller/LoginController.php -index aa6617c..eb47b80 100644 +index d4d6a17db79..f587f805683 100644 --- a/core/Controller/LoginController.php +++ b/core/Controller/LoginController.php -@@ -111,16 +111,20 @@ class LoginController extends Controller { - #[UseSession] +@@ -75,15 +75,21 @@ class LoginController extends Controller { + #[FrontpageRoute(verb: 'GET', url: '/logout')] public function logout() { $loginToken = $this->request->getCookie('nc_token'); + $uuidUser = $this->userSession->getUser()->getUID(); -+ $isLdapUser = $this->config->getUserValue($uuidUser, 'user_ldap', 'uid'); ++ $isLdapUser = $this->config->getUserValue($uuidUser, 'user_ldap', 'uid'); if (!is_null($loginToken)) { - $this->config->deleteUserValue($this->userSession->getUser()->getUID(), 'login_token', $loginToken); + $this->config->deleteUserValue($uuidUser, 'login_token', $loginToken); } $this->userSession->logout(); -- + - $response = new RedirectResponse($this->urlGenerator->linkToRouteAbsolute( -- 'core.login.showLoginForm', ++ $redirectUrl = $this->urlGenerator->linkToRouteAbsolute( + 'core.login.showLoginForm', - ['clear' => true] // this param the code in login.js may be removed when the "Clear-Site-Data" is working in the browsers - )); -- -+ $redirectUrl = $this->urlGenerator->linkToRouteAbsolute( -+ 'core.login.showLoginForm', -+ ['clear' => true] // this param the code in login.js may be removed when the "Clear-Site-Data" is working in the browsers) ++ ['clear' => true] // this param the code in login.js may be removed when the "Clear-Site-Data" is working in the browsers) + ); + if (!is_null($isLdapUser)) { -+ $redirectUrl = $this->config->getSystemValue('logout_url', $redirectUrl); ++ $redirectUrl = $this->config->getSystemValue('logout_url', $redirectUrl); + } + $response = new RedirectResponse($redirectUrl); + $this->session->set('clearingExecutionContexts', '1'); $this->session->close(); - diff --git a/sources/patches_last_version/app-01-disable-CSPv3-nonce_and_allow-YNH-fonts.patch b/patches/main/01-disable-CSPv3-nonce_and_allow-YNH-fonts.patch similarity index 63% rename from sources/patches_last_version/app-01-disable-CSPv3-nonce_and_allow-YNH-fonts.patch rename to patches/main/01-disable-CSPv3-nonce_and_allow-YNH-fonts.patch index d5a609a7..1cbbd31a 100644 --- a/sources/patches_last_version/app-01-disable-CSPv3-nonce_and_allow-YNH-fonts.patch +++ b/patches/main/01-disable-CSPv3-nonce_and_allow-YNH-fonts.patch @@ -1,33 +1,29 @@ - .../Security/CSP/ContentSecurityPolicyNonceManager.php | 4 ++++ - lib/public/AppFramework/Http/EmptyContentSecurityPolicy.php | 3 ++- - 2 files changed, 6 insertions(+), 1 deletion(-) - diff --git a/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php b/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php -index 795d8cc864..5f3c961445 100644 +index 993f74ae0e4..c85aadc49db 100644 --- a/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php +++ b/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php -@@ -70,6 +70,10 @@ class ContentSecurityPolicyNonceManager { - * @return bool +@@ -47,6 +47,10 @@ class ContentSecurityPolicyNonceManager { + * Check if the browser supports CSP v3 */ public function browserSupportsCspV3(): bool { + // YunoHost patch: disable CSPv3 nonces to: + // - avoid white page on first login from YunoHost portal + // - allow YunoHost tile display + return false; - $browserWhitelist = [ - Request::USER_AGENT_CHROME, - // Firefox 45+ + $browserBlocklist = [ + Request::USER_AGENT_IE, + ]; diff --git a/lib/public/AppFramework/Http/EmptyContentSecurityPolicy.php b/lib/public/AppFramework/Http/EmptyContentSecurityPolicy.php -index 3fcef1d0ef..7ce01a68fc 100644 +index b8bbfdb7d67..a51a15ca0e6 100644 --- a/lib/public/AppFramework/Http/EmptyContentSecurityPolicy.php +++ b/lib/public/AppFramework/Http/EmptyContentSecurityPolicy.php -@@ -449,7 +449,8 @@ class EmptyContentSecurityPolicy { - - if(!empty($this->allowedFontDomains)) { +@@ -493,7 +493,8 @@ class EmptyContentSecurityPolicy { + + if (!empty($this->allowedFontDomains)) { $policy .= 'font-src ' . implode(' ', $this->allowedFontDomains); - $policy .= ';'; + // YunoHost patch: extend font-src to load data fonts embedded in YunoHost tile script + $policy .= ' data:;'; } - - if(!empty($this->allowedConnectDomains)) { + + if (!empty($this->allowedConnectDomains)) { diff --git a/sources/patches_last_version/app-02-Allow-for-eval-in-JS-scripts-for-YunoHost-tile.patch b/patches/main/02-Allow-for-eval-in-JS-scripts-for-YunoHost-tile.patch similarity index 100% rename from sources/patches_last_version/app-02-Allow-for-eval-in-JS-scripts-for-YunoHost-tile.patch rename to patches/main/02-Allow-for-eval-in-JS-scripts-for-YunoHost-tile.patch diff --git a/scripts/_common.sh b/scripts/_common.sh index 4cdc0189..33c1736a 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1,11 +1,7 @@ #!/bin/bash #================================================= -# COMMON VARIABLES -#================================================= - -#================================================= -# EXPERIMENTAL HELPERS +# COMMON VARIABLES AND CUSTOM HELPERS #================================================= wait_nginx_reload() { @@ -13,12 +9,13 @@ wait_nginx_reload() { # wait for the Nextcloud configuration file to disappear from NGINX before checking the CalDAV/CardDAV URL. timeout=30 for i in $(seq 1 $timeout); do - if ! ynh_exec_warn_less nginx -T | grep --quiet "# configuration file /etc/nginx/conf.d/$domain.d/$app.conf:"; then + if ! ynh_hide_warnings nginx -T | grep --quiet "# configuration file /etc/nginx/conf.d/$domain.d/$app.conf:"; then break fi sleep 1 done - # Wait untils NGINX has fully reloaded (avoid cURL fail with http2) + # Wait untils NGINX has fully reloaded (avoid cURL fail with http2) + sleep 2 } @@ -53,7 +50,3 @@ is_url_handled() { return 1 fi } - -#================================================= -# FUTURE OFFICIAL HELPERS -#================================================= diff --git a/scripts/_ynh_mysql_connect_as.sh b/scripts/_ynh_mysql_connect_as.sh deleted file mode 100644 index a22963e8..00000000 --- a/scripts/_ynh_mysql_connect_as.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -# Open a connection as a user -# -# example: ynh_mysql_connect_as --user="user" --password="pass" <<< "UPDATE ...;" -# example: ynh_mysql_connect_as --user="user" --password="pass" --default_character_set="utf8mb4" < /path/to/file.sql -# -# usage: ynh_mysql_connect_as --user=user --password=password [--database=database] [--default_character_set=character-set] -# | arg: -u, --user= - the user name to connect as -# | arg: -p, --password= - the user password -# | arg: -d, --database= - the database to connect to -# | arg: -c, --default_character_set= - the charset to use -# -# Requires YunoHost version 2.2.4 or higher. -ynh_mysql_connect_as() { - # Declare an array to define the options of this helper. - local legacy_args=updc - local -A args_array=( [u]=user= [p]=password= [d]=database= [c]=default_character_set= ) - local user - local password - local database - local default_character_set - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - database="${database:-}" - default_character_set="${default_character_set:-}" - - if [ -n "$default_character_set" ] - then - default_character_set="--default-character-set=$default_character_set" - else - default_character_set="--default-character-set=latin1" - fi - - mysql --user="$user" --password="$password" "$default_character_set" --batch "$database" -} \ No newline at end of file diff --git a/scripts/_ynh_mysql_dump_db.sh b/scripts/_ynh_mysql_dump_db.sh deleted file mode 100644 index 3b922bb8..00000000 --- a/scripts/_ynh_mysql_dump_db.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -# Dump a database -# -# example: ynh_mysql_dump_db --database=roundcube --default_character_set="utf8mb4" > ./dump.sql -# -# usage: ynh_mysql_dump_db --database=database -# | arg: -d, --database= - the database name to dump -# | arg: -c, --default_character_set= - the charset to use -# | ret: the mysqldump output -# -# Requires YunoHost version 2.2.4 or higher. -ynh_mysql_dump_db() { - # Declare an array to define the options of this helper. - local legacy_args=dc - local -A args_array=( [d]=database= [c]=default_character_set= ) - local database - local default_character_set - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - default_character_set="${default_character_set:-}" - MYSQL_ROOT_PWD_FILE=/etc/yunohost/mysql - - if [ -n "$default_character_set" ] - then - default_character_set="--default-character-set=$default_character_set" - else - # By default, default character set is "latin1" - default_character_set="--default-character-set=latin1" - fi - - if [ -f "$MYSQL_ROOT_PWD_FILE" ]; then - mysqldump --user="root" --password="$(cat $MYSQL_ROOT_PWD_FILE)" --single-transaction --skip-dump-date "$default_character_set" "$database" - else - mysqldump --single-transaction --skip-dump-date "$default_character_set" "$database" - fi -} \ No newline at end of file diff --git a/scripts/backup b/scripts/backup index 96d5808b..33c0c7f1 100755 --- a/scripts/backup +++ b/scripts/backup @@ -2,53 +2,49 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -source ../settings/scripts/_ynh_mysql_dump_db.sh -#================================================= -# DECLARE DATA AND CONF FILES TO BACKUP -#================================================= -ynh_print_info --message="Declaring files to be backed up..." +ynh_print_info "Declaring files to be backed up..." #================================================= # BACKUP THE APP MAIN DIR #================================================= -ynh_backup --src_path="$install_dir" +ynh_backup "$install_dir" #================================================= # BACKUP THE DATA DIRECTORY #================================================= -ynh_backup --src_path="$data_dir" --is_big +ynh_backup "$data_dir" #================================================= # SYSTEM CONFIGURATION #================================================= -ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" +ynh_backup "/etc/php/$php_version/fpm/pool.d/$app.conf" -ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" -ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.d" +ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" +ynh_backup "/etc/nginx/conf.d/$domain.d/$app.d" -ynh_backup --src_path="/etc/logrotate.d/$app" +ynh_backup "/etc/logrotate.d/$app" -ynh_backup --src_path="/etc/fail2ban/jail.d/$app.conf" -ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" +ynh_backup "/etc/fail2ban/jail.d/$app.conf" +ynh_backup "/etc/fail2ban/filter.d/$app.conf" #================================================= # BACKUP VARIOUS FILES #================================================= -ynh_backup --src_path="/etc/cron.d/$app" +ynh_backup "/etc/cron.d/$app" -ynh_backup --src_path="/var/log/$app" +ynh_backup "/var/log/$app" #================================================= # BACKUP THE MYSQL DATABASE #================================================= -ynh_print_info --message="Backing up the MySQL database..." +ynh_print_info "Backing up the MySQL database..." -ynh_mysql_dump_db --database="$db_name" --default_character_set="utf8mb4" > db.sql +ynh_mysql_dump_db > db.sql #================================================= # BACKUP THE NOTIFY_PUSH APP @@ -56,13 +52,13 @@ ynh_mysql_dump_db --database="$db_name" --default_character_set="utf8mb4" > db.s if [ $enable_notify_push -eq 1 ] then - ynh_backup --src_path="/etc/systemd/system/${app}-notify-push.service" - ynh_backup --src_path="/etc/systemd/system/${app}-notify-push-watcher.service" - ynh_backup --src_path="/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_backup "/etc/systemd/system/${app}-notify-push.service" + ynh_backup "/etc/systemd/system/${app}-notify-push-watcher.service" + ynh_backup "/etc/systemd/system/${app}-notify-push-watcher.path" fi #================================================= # END OF SCRIPT #================================================= -ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." +ynh_print_info "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 ae966b1e..6b1208ef 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -10,32 +10,32 @@ source /usr/share/yunohost/helpers #================================================= # MODIFY URL IN NGINX CONF #================================================= -ynh_script_progression --message="Updating NGINX web server configuration..." --weight=2 +ynh_script_progression "Updating NGINX web server configuration..." if [ $change_domain -eq 1 ] then # Check if .well-known is available for this domain if is_url_handled --domain="$new_domain" --path="/.well-known/caldav" || is_url_handled --domain="$new_domain" --path="/.well-known/carddav" then - ynh_print_warn --message="Another app already uses the domain $new_domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." + ynh_print_warn "Another app already uses the domain $new_domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." # Remove lines about .well-known/carddav and caldav with sed. sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "/etc/nginx/conf.d/$domain.d/$app.conf" - ynh_store_file_checksum --file="/etc/nginx/conf.d/$domain.d/$app.conf" + ynh_store_file_checksum "/etc/nginx/conf.d/$domain.d/$app.conf" fi fi -ynh_change_url_nginx_config +ynh_config_change_url_nginx #================================================= # SPECIFIC MODIFICATIONS #================================================= -ynh_script_progression --message="Applying $app specific modifications..." --weight=2 +ynh_script_progression "Applying $app specific modifications..." # Define a function to execute commands with `occ` exec_occ() { - (cd "$install_dir" && ynh_exec_as "$app" \ - php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") + (cd "$install_dir" && ynh_exec_as_app \ + php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") } if [ $change_domain -eq 1 ] @@ -47,7 +47,7 @@ then exec_occ config:system:set overwrite.cli.url --value="https://${new_domain}${new_path}" # Reload PHP-FPM, necessary for force Nextcloud to re-read config.php, cf opcache.revalidate_freq - ynh_systemd_action --service_name=php${phpversion}-fpm --action=reload + ynh_systemctl --service=php${php_version}-fpm --action=reload mv /etc/nginx/conf.d/$old_domain.d/$app.d /etc/nginx/conf.d/$new_domain.d/$app.d fi @@ -61,9 +61,9 @@ then domain="$new_domain" path_url="$new_path" - ynh_add_config --template="notify_push.conf" --destination="/etc/nginx/conf.d/$domain.d/$app.d/notify_push.conf" + ynh_config_add --template="notify_push.conf" --destination="/etc/nginx/conf.d/$domain.d/$app.d/notify_push.conf" - ynh_systemd_action --service_name=nginx --action=reload + ynh_systemctl --service=nginx --action=reload case $YNH_ARCH in amd64) arch="x86_64";; @@ -71,39 +71,39 @@ then armel|armhf) arch="armv7";; esac - ynh_add_config --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" - ynh_add_systemd_config --service="${app}-notify-push-watcher" --template="watcher.service" + ynh_config_add --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_config_add_systemd --service="${app}-notify-push-watcher" --template="watcher.service" systemctl enable --now ${app}-notify-push-watcher.path - ynh_add_systemd_config --service="${app}-notify-push" + ynh_config_add_systemd --service="${app}-notify-push" count=0 - while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] + while ! ynh_exec_as_app php${php_version} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 count=$((count + 1)) done - ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" --action=restart + ynh_systemctl --service="${app}-notify-push" --action=restart --wait_until="Push daemon for Nextcloud clients." --log_path="systemd" --action=restart exec_occ config:app:set notify_push base_endpoint --value https://$domain${path_url%/}/push if ! exec_occ notify_push:self-test; then - ynh_print_warn --message="The High Performance Backend service is still not working properly. Please log in with a user to your NextCloud instance, restart the High Performance Backend service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + ynh_print_warn "The High Performance Backend service is still not working properly. Please log in with a user to your NextCloud instance, restart the High Performance Backend service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${php_version} $install_dir/occ notify_push:self-test\" to verify that everything is green." fi fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." +ynh_script_progression "Reloading NGINX web server..." # Temporary fix for the API permission (workaround for https://github.com/YunoHost/issues/issues/2294 ) ynh_permission_url --permission="api" --url="re:$new_domain\/.well-known\/.*" --auth_header="false" --clear_urls -ynh_systemd_action --service_name=nginx --action=reload +ynh_systemctl --service=nginx --action=reload #================================================= # END OF SCRIPT #================================================= -ynh_script_progression --message="Change of URL completed for $app" --last +ynh_script_progression "Change of URL completed for $app" diff --git a/scripts/config b/scripts/config index ed7b10f5..fc45c353 100644 --- a/scripts/config +++ b/scripts/config @@ -1,26 +1,18 @@ #!/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) +php_version=$(ynh_app_setting_get --key=php_version) +current_fpm_footprint=$(ynh_app_setting_get --key=fpm_footprint) exec_occ() { - (cd "$install_dir" && ynh_exec_as "$app" \ - php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") + (cd "$install_dir" && ynh_exec_as_app \ + php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") } #================================================= @@ -29,8 +21,8 @@ exec_occ() { get__maintenance_mode() { # Maintenance mode status - maintenance_mode_status="$(cd "$install_dir" && ynh_exec_as "$app" \ - php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi maintenance:mode)" 2> /dev/null + maintenance_mode_status="$(cd "$install_dir" && ynh_exec_as_app \ + php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi maintenance:mode)" 2> /dev/null if echo $maintenance_mode_status | grep -q "disabled" then echo "0" @@ -38,7 +30,7 @@ get__maintenance_mode() { then echo "1" else - ynh_print_err --message="Unexpected output from maintenance status check command." + ynh_print_warn "Unexpected output from maintenance status check command." exit 0 fi } @@ -57,29 +49,6 @@ get__enable_forward_email() { fi } -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__fpm_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 #================================================= @@ -94,7 +63,7 @@ set__maintenance_mode() { exec_occ maintenance:mode --on ynh_print_info "Maintenance mode enabled" fi - ynh_app_setting_set --app=$app --key=maintenance_mode --value="$maintenance_mode" + ynh_app_setting_set --key=maintenance_mode --value="$maintenance_mode" } set__system_addressbook_exposed() { @@ -105,27 +74,27 @@ set__system_addressbook_exposed() { set__enable_notify_push() { if [ "$enable_notify_push" -eq "0" ]; then nginx_extra_conf_dir="/etc/nginx/conf.d/$domain.d/$app.d" - ynh_secure_remove --file="$nginx_extra_conf_dir/notify_push.conf" - ynh_systemd_action --service_name="nginx" --action=reload + ynh_safe_rm "$nginx_extra_conf_dir/notify_push.conf" + ynh_systemctl --service="nginx" --action=reload # If notify_push is enabled, disable it if exec_occ app:list | awk '/Enabled/{f=1;next} f' | grep -q -w notify_push; then exec_occ app:disable notify_push fi - ynh_remove_systemd_config --service="${app}-notify-push" + ynh_config_remove_systemd"${app}-notify-push" systemctl disable --now "${app}-notify-push-watcher.path" - ynh_secure_remove --file="/etc/systemd/system/${app}-notify-push-watcher.path" - ynh_remove_systemd_config --service="${app}-notify-push-watcher" + ynh_safe_rm "/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_config_remove_systemd"${app}-notify-push-watcher" ynh_print_info "Notify push disabled" elif [ "$enable_notify_push" -eq "1" ]; then nginx_extra_conf_dir="/etc/nginx/conf.d/$domain.d/$app.d" mkdir -p "$nginx_extra_conf_dir" - ynh_add_config --template="notify_push.conf" --destination="$nginx_extra_conf_dir/notify_push.conf" + ynh_config_add --template="notify_push.conf" --destination="$nginx_extra_conf_dir/notify_push.conf" - ynh_systemd_action --service_name="nginx" --action=reload + ynh_systemctl --service="nginx" --action=reload # If notify_push is disabled, reenable it if exec_occ app:list | awk '/Disabled/{f=1;next} f' | grep -q -w notify_push; then @@ -142,27 +111,27 @@ set__enable_notify_push() { armel|armhf) arch="armv7";; esac - ynh_add_config --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" - ynh_add_systemd_config --service="${app}-notify-push-watcher" --template="watcher.service" + ynh_config_add --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_config_add_systemd --service="${app}-notify-push-watcher" --template="watcher.service" systemctl enable --now ${app}-notify-push-watcher.path - ynh_add_systemd_config --service="${app}-notify-push" - + ynh_config_add_systemd --service="${app}-notify-push" + count=0 - while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] + while ! ynh_exec_as_app php${php_version} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 count=$((count + 1)) done - ynh_systemd_action --service_name="${app}-notify-push-watcher" --action=restart - ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" - + ynh_systemctl --service="${app}-notify-push-watcher" --action=restart + ynh_systemctl --service="${app}-notify-push" --action=restart --wait_until="Push daemon for Nextcloud clients." --log_path="systemd" + if ! exec_occ notify_push:self-test; then - ynh_print_warn --message="The High Performance Backend service is still not working properly. Please log in with a user to your NextCloud instance, restart the High Performance Backend service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + ynh_print_warn "The High Performance Backend service is still not working properly. Please log in with a user to your NextCloud instance, restart the High Performance Backend service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${php_version} $install_dir/occ notify_push:self-test\" to verify that everything is green." fi ynh_print_info "Notify push enabled" fi - ynh_app_setting_set --app=$app --key=enable_notify_push --value="$enable_notify_push" + ynh_app_setting_set --key=enable_notify_push --value="$enable_notify_push" } set__enable_forward_email() { @@ -178,26 +147,12 @@ set__enable_forward_email() { ynh_app_setting_set --app=$app --key=enable_forward_email --value="$enable_forward_email" } -set__fpm_footprint() { - if [ "$fpm_footprint" != "specific" ] - then - ynh_app_setting_set --app=$app --key=fpm_footprint --value="$fpm_footprint" - fi -} - -set__fpm_free_footprint() { - if [ "$fpm_footprint" = "specific" ] - then - ynh_app_setting_set --app=$app --key=fpm_footprint --value="$fpm_free_footprint" - fi -} - #================================================= # SPECIFIC RUNNERS FOR TOML SHORT KEYS #================================================= function run__set_permissions_button() { - local data_dir=$(ynh_app_setting_get --app=$app --key=data_dir) + local data_dir=$(ynh_app_setting_get --key=data_dir) ynh_print_info "Set permissions, it may take some time..." chown -R $app:www-data "$install_dir" chown -R $app: "$data_dir" @@ -211,32 +166,11 @@ function run__set_permissions_button() { } #================================================= -# GENERIC FINALIZATION -#================================================= - -ynh_app_config_validate() { - _ynh_app_config_validate - - if [ "${changed[fpm_usage]}" == "true" ] || [ "${changed[fpm_footprint]}" == "true" ] || [ "${changed[fpm_free_footprint]}" == "true" ]; then - # If fpm_footprint is set to 'specific', use $fpm_free_footprint value. - if [ "$fpm_footprint" = "specific" ] - then - fpm_footprint=$fpm_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 + ynh_config_add_phpfpm } ynh_app_config_run $1 diff --git a/scripts/install b/scripts/install index 4229e7a8..47ec0e1b 100755 --- a/scripts/install +++ b/scripts/install @@ -2,57 +2,56 @@ source _common.sh source /usr/share/yunohost/helpers -source _ynh_mysql_connect_as.sh + +ynh_app_setting_set --key=php_upload_max_filesize --value=10G +ynh_app_setting_set --key=php_memory_limit --value=512M #================================================= # INITIALIZE AND STORE SETTINGS #================================================= phpflags="--define apc.enable_cli=1" -ynh_app_setting_set --app=$app --key=phpflags --value="$phpflags" +ynh_app_setting_set --key=phpflags --value="$phpflags" enable_notify_push="0" -ynh_app_setting_set --app=$app --key=enable_notify_push --value=0 +ynh_app_setting_set --key=enable_notify_push --value=0 system_addressbook_exposed="0" -ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=0 +ynh_app_setting_set --key=system_addressbook_exposed --value=0 #================================================= # CREATE A MYSQL DATABASE #================================================= -ynh_script_progression --message="Migrate MySQL database to utf8..." --weight=2 +ynh_script_progression "Migrate MySQL database to utf8..." -ynh_mysql_connect_as --user=$db_user --password="$db_pwd" --database=$db_name \ - <<< "ALTER DATABASE $db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" +ynh_mysql_db_shell <<< "ALTER DATABASE $db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= -ynh_script_progression --message="Setting up source files..." --weight=5 +ynh_script_progression "Setting up source files..." -# Enable YunoHost patches on Nextcloud sources -cp -a ../sources/patches_last_version/* ../sources/patches # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$install_dir" #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Configuring PHP-FPM..." --weight=5 +ynh_script_progression "Configuring PHP-FPM..." -ynh_app_setting_set --app=$app --key=fpm_footprint --value=high -ynh_app_setting_set --app=$app --key=fpm_usage --value=medium -ynh_add_fpm_config +ynh_app_setting_set --key=fpm_footprint --value=high +ynh_app_setting_set --key=fpm_usage --value=medium +ynh_config_add_phpfpm #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Configuring NGINX web server..." --weight=2 +ynh_script_progression "Configuring NGINX web server..." # Check if .well-known is available for this domain if is_url_handled --domain="$domain" --path="/.well-known/caldav" || is_url_handled --domain="$domain" --path="/.well-known/carddav" then - ynh_print_warn --message="Another app already uses the domain $domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." + ynh_print_warn "Another app already uses the domain $domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." # Remove lines about .well-known/carddav and caldav with sed. sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "../conf/nginx.conf" @@ -63,21 +62,21 @@ mkdir -p "$nginx_extra_conf_dir" if [ $enable_notify_push -eq 1 ] then - ynh_add_config --template="notify_push.conf" --destination="$nginx_extra_conf_dir/notify_push.conf" + ynh_config_add --template="notify_push.conf" --destination="$nginx_extra_conf_dir/notify_push.conf" fi # Create a dedicated NGINX config -ynh_add_nginx_config +ynh_config_add_nginx #================================================= # INSTALL NEXTCLOUD #================================================= -ynh_script_progression --message="Installing $app..." --weight=30 +ynh_script_progression "Installing $app..." # Define a function to execute commands with `occ` exec_occ() { - (cd "$install_dir" && ynh_exec_as "$app" \ - php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") + (cd "$install_dir" && ynh_exec_as_app \ + php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") } # Set write access for the following commands @@ -95,12 +94,12 @@ exec_occ maintenance:install \ --database-user $db_user --database-pass "$db_pwd" \ --admin-user "admin" --admin-pass "$admin_password" \ --data-dir "$data_dir/data" \ - || ynh_die --message="Unable to install $app" + || ynh_die "Unable to install $app" #================================================= # CONFIGURE NEXTCLOUD #================================================= -ynh_script_progression --message="Configuring $app..." --weight=8 +ynh_script_progression "Configuring $app..." # Set the mysql.utf8mb4 config to true in config.php exec_occ config:system:set mysql.utf8mb4 --type boolean --value="true" @@ -117,29 +116,28 @@ exec_occ ldap:create-empty-config # Load the installation config file in Nextcloud nc_conf="$install_dir/config_install.json" -ynh_add_config --template="config_install.json" --destination="$nc_conf" +ynh_config_add --template="config_install.json" --destination="$nc_conf" exec_occ config:import "$nc_conf" # Then remove the config file -ynh_secure_remove --file="$nc_conf" +ynh_safe_rm "$nc_conf" # Load the additional config file (used also for upgrade) nc_conf="$install_dir/config.json" -ynh_add_config --template="config.json" --destination="$nc_conf" +ynh_config_add --template="config.json" --destination="$nc_conf" exec_occ config:import "$nc_conf" # Then remove the config file -ynh_secure_remove --file="$nc_conf" +ynh_safe_rm "$nc_conf" #================================================= # CHECK THE LDAP CONFIG #================================================= # Check LDAP configuration to see if everything worked well -exec_occ ldap:test-config '' \ - || ynh_die --message="An error occured during LDAP configuration" +exec_occ ldap:test-config '' || ynh_die "An error occured during LDAP configuration" #================================================= # MOUNT HOME FOLDERS AS EXTERNAL STORAGE @@ -153,7 +151,7 @@ create_external_storage() { local mount_id=`exec_occ files_external:create --output=json \ "$mount_name" 'local' 'null::null' -c "datadir=$mount_dir" || true` ! [[ $mount_id =~ ^[0-9]+$ ]] \ - && ynh_print_warn --message="Unable to create external storage" \ + && ynh_print_warn "Unable to create external storage" \ || exec_occ files_external:option "$mount_id" enable_sharing true } @@ -194,8 +192,8 @@ exec_occ config:system:set overwrite.cli.url --value="https://${domain}${path}" #================================================= # Set the user as admin -ynh_mysql_connect_as --user=$db_name --password="$db_pwd" --database=$db_name --default_character_set="utf8mb4" \ - <<< "INSERT INTO oc_group_user VALUES ('admin','$admin');" +ynh_mysql_db_shell <<< "INSERT INTO oc_group_user VALUES ('admin','$admin');" + # And delete admin user exec_occ user:delete admin @@ -210,7 +208,7 @@ exec_occ config:app:set dav system_addressbook_exposed --value="$system_addressb #================================================= # Calculate and store the config file checksum into the app settings -ynh_store_file_checksum --file="$install_dir/config/config.php" +ynh_store_file_checksum "$install_dir/config/config.php" #================================================= # CONFIGURE NOTIFY_PUSH APP @@ -227,20 +225,19 @@ then armel|armhf) arch="armv7";; esac - ynh_add_config --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" - ynh_add_systemd_config --service="${app}-notify-push-watcher" --template="watcher.service" + ynh_config_add --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_config_add_systemd --service="${app}-notify-push-watcher" --template="watcher.service" systemctl enable --now --quiet ${app}-notify-push-watcher.path - ynh_add_systemd_config --service="${app}-notify-push" + ynh_config_add_systemd --service="${app}-notify-push" fi #================================================= # ADD A CRON JOB #================================================= -cron_path="/etc/cron.d/$app" -ynh_add_config --template="nextcloud.cron" --destination="$cron_path" -chown root: "$cron_path" -chmod 644 "$cron_path" +ynh_config_add --template="nextcloud.cron" --destination="/etc/cron.d/$app" +chown root: "/etc/cron.d/$app" +chmod 644 "/etc/cron.d/$app" exec_occ background:cron @@ -255,7 +252,7 @@ exec_occ db:convert-filecache-bigint -n #================================================= # YUNOHOST MULTIMEDIA INTEGRATION #================================================= -ynh_script_progression --message="Adding multimedia directories..." --weight=6 +ynh_script_progression "Adding multimedia directories..." # Build YunoHost multimedia directories ynh_multimedia_build_main_dir @@ -266,8 +263,6 @@ create_external_storage "/home/yunohost.multimedia/share" "Shared multimedia" # Allow nextcloud to write into these directories ynh_multimedia_addaccess $app -#================================================= -# GENERIC FINALIZATION #================================================= # SECURE FILES AND DIRECTORIES #================================================= @@ -286,18 +281,18 @@ chmod 750 $install_dir #================================================= # SETUP LOGROTATE #================================================= -ynh_script_progression --message="Configuring log rotation..." --weight=1 +ynh_script_progression "Configuring log rotation..." # Use logrotate to manage application logfile(s) -ynh_use_logrotate +ynh_config_add_logrotate #================================================= # SETUP FAIL2BAN #================================================= -ynh_script_progression --message="Configuring Fail2Ban..." --weight=8 +ynh_script_progression "Configuring Fail2Ban..." # Create a dedicated Fail2Ban config -ynh_add_fail2ban_config --logpath="/var/log/$app/nextcloud.log" --failregex="^.*Login failed: '.*' \(Remote IP: ''.*$" --max_retry=5 +ynh_config_add_fail2ban --logpath="/var/log/$app/nextcloud.log" --failregex="^.*Login failed: '.*' \(Remote IP: ''.*$" #================================================= # CHECK IF NOTIFY_PUSH WORKS @@ -306,17 +301,17 @@ ynh_add_fail2ban_config --logpath="/var/log/$app/nextcloud.log" --failregex="^.* if [ $enable_notify_push -eq 1 ] then count=0 - while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] + while ! ynh_exec_as_app php${php_version} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 count=$((count + 1)) done - ynh_systemd_action --service_name="${app}-notify-push-watcher" --action=restart - ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" - + ynh_systemctl --service="${app}-notify-push-watcher" --action=restart + ynh_systemctl --service="${app}-notify-push" --action=restart --wait_until="Push daemon for Nextcloud clients." --log_path="systemd" + if ! exec_occ notify_push:self-test; then - ynh_print_warn --message="The Notify Push service is still not working properly. Please log in with a user to your NextCloud instance, restart the Notify Push service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + ynh_print_warn "The Notify Push service is still not working properly. Please log in with a user to your NextCloud instance, restart the Notify Push service with \"systemctl restart ${app}-notify-push.service\", and run \"ynh_exec_as_app php${php_version} $install_dir/occ notify_push:self-test\" to verify that everything is green." fi fi @@ -324,4 +319,4 @@ fi # END OF SCRIPT #================================================= -ynh_script_progression --message="Installation of $app completed" --last +ynh_script_progression "Installation of $app completed" diff --git a/scripts/remove b/scripts/remove index 93a0e5f7..f7bb7cb2 100755 --- a/scripts/remove +++ b/scripts/remove @@ -6,32 +6,29 @@ source /usr/share/yunohost/helpers #================================================= # REMOVE SYSTEM CONFIGURATIONS #================================================= -ynh_script_progression --message="Removing system configurations related to $app..." --weight=5 +ynh_script_progression "Removing system configurations related to $app..." -# Remove the dedicated NGINX config -ynh_remove_nginx_config -ynh_secure_remove --file="/etc/nginx/conf.d/$domain.d/$app.d" +ynh_config_remove_nginx +ynh_safe_rm "/etc/nginx/conf.d/$domain.d/$app.d" -# Remove the dedicated PHP-FPM config -ynh_remove_fpm_config +ynh_config_remove_phpfpm -# Remove the app-specific logrotate config -ynh_remove_logrotate +ynh_config_remove_logrotate -# Remove the dedicated Fail2Ban config -ynh_remove_fail2ban_config +ynh_config_remove_fail2ban # Remove notify push if [ $enable_notify_push -eq 1 ]; then - ynh_remove_systemd_config --service="${app}-notify-push" + ynh_config_remove_systemd"${app}-notify-push" systemctl disable --now --quiet ${app}-notify-push-watcher.path - ynh_secure_remove --file="/etc/systemd/system/${app}-notify-push-watcher.path" - ynh_remove_systemd_config --service="${app}-notify-push-watcher" + ynh_safe_rm "/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_config_remove_systemd"${app}-notify-push-watcher" + fi # Remove a cron file # TODO: Ensure that cron job is not running (How !?) -ynh_secure_remove --file="/etc/cron.d/$app" +ynh_safe_rm "/etc/cron.d/$app" # Cleaning ACL in home directories for path in /home/*; do @@ -44,4 +41,4 @@ done # END OF SCRIPT #================================================= -ynh_script_progression --message="Removal of $app completed" --last +ynh_script_progression "Removal of $app completed" diff --git a/scripts/restore b/scripts/restore index 6a0bf604..9be6e2b8 100755 --- a/scripts/restore +++ b/scripts/restore @@ -2,44 +2,43 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -source ../settings/scripts/_ynh_mysql_connect_as.sh #================================================= # RESTORE THE APP MAIN DIR #================================================= -ynh_script_progression --message="Restoring the app main directory..." +ynh_script_progression "Restoring the app main directory..." -ynh_restore_file --origin_path="$install_dir" +ynh_restore "$install_dir" #================================================= # RESTORE THE MYSQL DATABASE #================================================= -ynh_script_progression --message="Restoring the MySQL database..." --weight=9 +ynh_script_progression "Restoring the MySQL database..." -ynh_mysql_connect_as --user=$db_name --password=$db_pwd --database=$db_name --default_character_set="utf8mb4" < ./db.sql +ynh_mysql_db_shell < ./db.sql #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=50 +ynh_script_progression "Reconfiguring PHP-FPM..." # Restore the file first, so it can have a backup if different -ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" +ynh_restore "/etc/php/$php_version/fpm/pool.d/$app.conf" # Recreate a dedicated PHP-FPM config -ynh_add_fpm_config +ynh_config_add_phpfpm #================================================= # RESTORE THE NGINX CONFIGURATION #================================================= -ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" -ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.d" +ynh_restore "/etc/nginx/conf.d/$domain.d/$app.conf" +ynh_restore "/etc/nginx/conf.d/$domain.d/$app.d" # Check if .well-known is available for this domain if is_url_handled --domain="$domain" --path="/.well-known/caldav" || is_url_handled --domain="$domain" --path="/.well-known/carddav" then - ynh_print_warn --message="Another app already uses the domain $domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." + ynh_print_warn "Another app already uses the domain $domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." # Remove lines about .well-known/CardDAV and CalDAV with sed. sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "/etc/nginx/conf.d/$domain.d/$app.conf" @@ -48,30 +47,29 @@ fi #================================================= # RESTORE THE CRON FILE #================================================= -ynh_script_progression --message="Restoring cron job..." --weight=1 +ynh_script_progression "Restoring cron job..." -ynh_restore_file --origin_path="/etc/cron.d/$app" +ynh_restore "/etc/cron.d/$app" #================================================= # RESTORE LOGS #================================================= -ynh_restore_file --origin_path="/var/log/$app" +ynh_restore "/var/log/$app" #================================================= # RESTORE THE LOGROTATE CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the logrotate configuration..." --weight=1 +ynh_script_progression "Restoring the logrotate configuration..." -ynh_restore_file --origin_path="/etc/logrotate.d/$app" +ynh_restore "/etc/logrotate.d/$app" #================================================= # RESTORE THE DATA DIRECTORY #================================================= -ynh_script_progression --message="Restoring data directory..." --weight=2 +ynh_script_progression "Restoring data directory..." -# Use --not_mandatory for the data directory, because if the backup has been made with BACKUP_CORE_ONLY, there's no data into the backup. -ynh_restore_file --origin_path="$data_dir" --not_mandatory +ynh_restore "$data_dir" #================================================= # RESTORE USER RIGHTS @@ -98,7 +96,7 @@ done #================================================= # YUNOHOST MULTIMEDIA INTEGRATION #================================================= -ynh_script_progression --message="Adding multimedia directories..." --weight=4 +ynh_script_progression "Adding multimedia directories..." # Build YunoHost multimedia directories ynh_multimedia_build_main_dir @@ -108,10 +106,10 @@ ynh_multimedia_addaccess $app #================================================= # RESTORE THE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=7 +ynh_script_progression "Restoring the Fail2Ban configuration..." -ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" -ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" +ynh_restore "/etc/fail2ban/jail.d/$app.conf" +ynh_restore "/etc/fail2ban/filter.d/$app.conf" # Make sure a log file exists (mostly for CI tests) logfile="/var/log/$app/nextcloud.log" @@ -120,7 +118,7 @@ if [ ! -f "$logfile" ]; then chown "$app:" "$logfile" fi -ynh_systemd_action --action=restart --service_name=fail2ban +ynh_systemctl --action=restart --service=fail2ban #================================================= # RESTORE THE NOTIFY_PUSH APP @@ -128,9 +126,9 @@ ynh_systemd_action --action=restart --service_name=fail2ban if [ $enable_notify_push -eq 1 ] then - ynh_restore_file --origin_path="/etc/systemd/system/${app}-notify-push.service" - ynh_restore_file --origin_path="/etc/systemd/system/${app}-notify-push-watcher.service" - ynh_restore_file --origin_path="/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_restore "/etc/systemd/system/${app}-notify-push.service" + ynh_restore "/etc/systemd/system/${app}-notify-push-watcher.service" + ynh_restore "/etc/systemd/system/${app}-notify-push-watcher.path" systemctl enable --now "${app}-notify-push-watcher.service" --quiet systemctl enable --now "${app}-notify-push-watcher.path" --quiet @@ -140,33 +138,33 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=3 +ynh_script_progression "Reloading NGINX web server..." -ynh_systemd_action --service_name=nginx --action=reload +ynh_systemctl --service=nginx --action=reload #================================================= # CHECK IF NOTIFY_PUSH WORKS #================================================= exec_occ() { - (cd "$install_dir" && ynh_exec_as "$app" \ - php${phpversion} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") + (cd "$install_dir" && ynh_exec_as_app \ + php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") } if [ $enable_notify_push -eq 1 ] then count=0 - while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] + while ! ynh_exec_as_app php${php_version} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 count=$((count + 1)) done - ynh_systemd_action --service_name="${app}-notify-push-watcher" --action=restart - ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" --action=restart - + ynh_systemctl --service="${app}-notify-push-watcher" --action=restart + ynh_systemctl --service="${app}-notify-push" --action=restart --wait_until="Push daemon for Nextcloud clients." --log_path="systemd" --action=restart + if ! exec_occ notify_push:self-test; then - ynh_print_warn --message="The Notify Push service is still not working properly. Please log in with a user to your NextCloud instance, restart the Notify Push service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + ynh_print_warn "The Notify Push service is still not working properly. Please log in with a user to your NextCloud instance, restart the Notify Push service with \"systemctl restart ${app}-notify-push.service\", and run \"ynh_exec_as_app php${php_version} $install_dir/occ notify_push:self-test\" to verify that everything is green." fi fi @@ -174,4 +172,4 @@ fi # END OF SCRIPT #================================================= -ynh_script_progression --message="Restoration completed for $app" --last +ynh_script_progression "Restoration completed for $app" diff --git a/scripts/upgrade b/scripts/upgrade index b28f0e94..dcab5362 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -3,41 +3,42 @@ source _common.sh source /usr/share/yunohost/helpers -upgrade_type=$(ynh_check_app_version_changed) +ynh_app_setting_set_default --key=php_upload_max_filesize --value=10G +ynh_app_setting_set_default --key=php_memory_limit --value=512M #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= -ynh_script_progression --message="Ensuring downward compatibility..." +ynh_script_progression "Ensuring downward compatibility..." if [ -z ${system_addressbook_exposed:-} ]; then - ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=0 + ynh_app_setting_set --key=system_addressbook_exposed --value=0 system_addressbook_exposed=0 fi # Fix system_addressbook_exposed as a boolean if [ "${system_addressbook_exposed,,}" = "yes" ]; then - ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=1 + ynh_app_setting_set --key=system_addressbook_exposed --value=1 system_addressbook_exposed=1 elif [ "${system_addressbook_exposed,,}" = "no" ]; then - ynh_app_setting_set --app=$app --key=system_addressbook_exposed --value=0 + ynh_app_setting_set --key=system_addressbook_exposed --value=0 system_addressbook_exposed=0 fi if [ -z ${enable_notify_push:-} ]; then - ynh_app_setting_set --app=$app --key=enable_notify_push --value=0 + ynh_app_setting_set --key=enable_notify_push --value=0 enable_notify_push=0 fi # Remove the option backup_core_only if it's in the settings.yml file -ynh_app_setting_delete --app=$app --key=backup_core_only +ynh_app_setting_delete --key=backup_core_only phpflags="--define apc.enable_cli=1" -ynh_app_setting_set --app=$app --key=phpflags --value="$phpflags" +ynh_app_setting_set --key=phpflags --value="$phpflags" -if ynh_compare_current_package_version --comparison lt --version 22.2~ynh1 +if ynh_app_upgrading_from_version_before 22.2~ynh1 then - ynh_die --message="Upgrading from Nextcloud < 22.2 is not supported anymore. You should first upgrade to 22.2 using: yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/41f5f902e7c7cd3c30a6793020562ba98b9bf3e9" + ynh_die "Upgrading from Nextcloud < 22.2 is not supported anymore. You should first upgrade to 22.2 using: yunohost app upgrade nextcloud -u https://github.com/YunoHost-Apps/nextcloud_ynh/tree/41f5f902e7c7cd3c30a6793020562ba98b9bf3e9" fi #================================================= @@ -69,19 +70,20 @@ exec_occ() { NEXTCLOUD_PHP_VERSION="7.4" fi - # NB : be super careful when designing this part of the code, because calling ynh_install_app_dependencies - # will do magic regarding php configuration and $phpversion when the php version of the dependencies changes ... - phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) - if [[ "$NEXTCLOUD_PHP_VERSION" != "$phpversion" ]]; then + # NB: be super careful when designing this part of the code, because calling ynh_apt_install_dependencies + # will do magic regarding php configuration and $php_version when the php version of the dependencies changes ... + php_version=$(ynh_app_setting_get --key=php_version) + if [[ "$NEXTCLOUD_PHP_VERSION" != "$php_version" ]]; then local pkg_dependencies="$(dpkg-query --show --showformat='${Depends}' ${app}-ynh-deps)" - pkg_dependencies="${pkg_dependencies//$phpversion/$NEXTCLOUD_PHP_VERSION}" - # Packaging v1 ~legacy : ynh_install_app_dependencies is designed to be called several times + pkg_dependencies="${pkg_dependencies//$php_version/$NEXTCLOUD_PHP_VERSION}" + # Packaging v1 ~legacy : ynh_apt_install_dependencies is designed to be called several times # but the second time it will *append* the list of dependencies rather than replace the existing dependencies # resulting in a crash when parsing what's the php version the app uses, hence we need to force the full-replacement YNH_INSTALL_APP_DEPENDENCIES_REPLACE=true - ynh_install_app_dependencies "$pkg_dependencies" + ynh_apt_install_dependencies "$pkg_dependencies" fi -(cd "$install_dir" && ynh_exec_as "$app" \ + +(cd "$install_dir" && ynh_exec_as_app \ php$NEXTCLOUD_PHP_VERSION --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") 2> >(filter_boring_occ_warnings >&2) } @@ -93,7 +95,7 @@ create_external_storage() { local mount_id=$(exec_occ files_external:create --output=json \ "$mount_name" 'local' 'null::null' -c "datadir=$mount_dir" || true) ! [[ $mount_id =~ ^[0-9]+$ ]] \ - && ynh_print_warn --message="Unable to create external storage" \ + && ynh_print_warn "Unable to create external storage" \ || exec_occ files_external:option "$mount_id" enable_sharing true } @@ -120,11 +122,10 @@ function list_installed_apps_not_compatible_with_future_version() comm -23 <(comm -23 $installed_apps $core_apps_in_current_version) $nextcloud_destination_appcatalog } - current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) current_major_version=${current_version%%.*} -last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -Eo '[0-9][0-9]\.[0-9]\.[0-9]+') +last_version=$(ynh_read_manifest "resources.sources.main.url" | grep -Eo '[0-9][0-9]\.[0-9]\.[0-9]+') last_major_version=${last_version%%.*} if [[ "$last_major_version" != "$current_major_version" ]] @@ -132,25 +133,24 @@ then installed_apps_not_compatible_with_future_version="$(list_installed_apps_not_compatible_with_future_version $last_major_version)" if [[ -n "$installed_apps_not_compatible_with_future_version" ]] then - ynh_die --message="The following apps are not (yet?) compatible with Nextcloud $last_major_version. You should make sure to upgrade the app, or disable it, or wait for it to become compatible before running this upgrade : $installed_apps_not_compatible_with_future_version" + ynh_die "The following apps are not (yet?) compatible with Nextcloud $last_major_version. You should make sure to upgrade the app, or disable it, or wait for it to become compatible before running this upgrade : $installed_apps_not_compatible_with_future_version" fi fi -if [ "$upgrade_type" == "UPGRADE_APP" ] +# FIXME: this is still supported but the recommendation is now to *always* re-setup the app sources wether or not the upstream sources changed +if ynh_app_upstream_version_changed then - ynh_script_progression --message="Upgrading $app..." --weight=3 + ynh_script_progression "Upgrading $app..." # Set write access for the following commands chown -R $app:www-data "$install_dir" - # Print the current version number of Nextcloud exec_occ -V if [ "$(exec_occ config:system:get mysql.utf8mb4)" != "true" ]; then - db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) + db_pwd=$(ynh_app_setting_get --key=db_pwd) # Change your databases character set and collation - ynh_mysql_connect_as --user=$db_user --password="$db_pwd" --database=$db_name \ - <<< "ALTER DATABASE $db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" + ynh_mysql_db_shell <<< "ALTER DATABASE $db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" # Set the mysql.utf8mb4 config to true in config.php exec_occ config:system:set mysql.utf8mb4 --type boolean --value="true" exec_occ maintenance:repair @@ -172,11 +172,10 @@ then next_major_version="$(( $current_major_version + 1 ))" if [[ "$next_major_version" -ge "$last_major_version" ]]; then - ynh_print_info --message="Upgrading to Nextcloud $last_version" - cp -a ../sources/patches_last_version/* ../sources/patches + ynh_print_info "Upgrading to Nextcloud $last_version" source_id="main" else - ynh_print_info --message="Upgrading to Nextcloud $next_major_version" + ynh_print_info "Upgrading to Nextcloud $next_major_version" source_id="$next_major_version" fi @@ -206,16 +205,14 @@ then ) # Replace the old Nextcloud by the new one - ynh_secure_remove --file="$install_dir" + ynh_safe_rm "$install_dir" mv "$tmpdir" "$install_dir" # Set write access for the following commands chown -R $app:www-data "$install_dir" - # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) exec_occ maintenance:mode --off - exec_occ upgrade \ - || [ $? -eq 3 ] || ynh_die --message="Unable to upgrade $app" + exec_occ upgrade || [ $? -eq 3 ] || ynh_die "Unable to upgrade $app" # Get the new current version number current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) @@ -233,13 +230,13 @@ then #================================================= # CONFIGURE NEXTCLOUD #================================================= - ynh_script_progression --message="Reconfiguring $app..." --weight=9 + ynh_script_progression "Reconfiguring $app..." # Verify the checksum and backup the file if it's different - ynh_backup_if_checksum_is_different --file="$install_dir/config/config.php" + ynh_backup_if_checksum_is_different "$install_dir/config/config.php" nc_conf="${install_dir}/config.json" - ynh_add_config --template="config.json" --destination="$nc_conf" + ynh_config_add --template="config.json" --destination="$nc_conf" # Reneable the mail app if [ $mail_app_must_be_reactived -eq 1 ]; then @@ -270,7 +267,7 @@ then exec_occ config:import "$nc_conf" # Then remove the config file - ynh_secure_remove --file="$nc_conf" + ynh_safe_rm "$nc_conf" #================================================= # ALLOW USERS TO DISCONNECT FROM NEXTCLOUD @@ -318,13 +315,13 @@ then #================================================= # Calculate and store the config file checksum into the app settings - ynh_store_file_checksum --file="${install_dir}/config/config.php" + ynh_store_file_checksum "${install_dir}/config/config.php" fi #================================================= # REGEN PERMISSIONS #================================================= -ynh_script_progression --message="Reapplying file permissions..." --weight=2 +ynh_script_progression "Reapplying file permissions..." # Fix app ownerships & permissions chown -R $app:www-data "$install_dir" @@ -337,32 +334,32 @@ chmod 750 $install_dir #================================================= # REGEN SYSTEM CONFIGURATIONS #================================================= -ynh_script_progression --message="Regenerating system configurations for $app..." --weight=2 +ynh_script_progression "Regenerating system configurations for $app..." #------------------------------------------------- # PHP-FPM #------------------------------------------------- -ynh_add_fpm_config +ynh_config_add_phpfpm #------------------------------------------------- # NGINX #------------------------------------------------- # Delete current NGINX configuration to be able to check if .well-known is already served. -ynh_backup_if_checksum_is_different --file="/etc/nginx/conf.d/$domain.d/$app.conf" -ynh_remove_nginx_config -ynh_app_setting_delete --app=$app --key="checksum__etc_nginx_conf.d_$domain.d_$app.conf" +ynh_backup_if_checksum_is_different "/etc/nginx/conf.d/$domain.d/$app.conf" +ynh_config_remove_nginx +ynh_app_setting_delete --key="checksum__etc_nginx_conf.d_$domain.d_$app.conf" # Wait untils NGINX has fully reloaded -ynh_systemd_action --service_name=nginx --action=reload --line_match="Reloaded" --log_path="systemd" +ynh_systemctl --service=nginx --action=reload --wait_until="Reloaded" --log_path="systemd" wait_nginx_reload # Check if .well-known is available for this domain if is_url_handled --domain="$domain" --path="/.well-known/caldav" || is_url_handled --domain="$domain" --path="/.well-known/carddav" then - ynh_print_warn --message="Another app already uses the domain $domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." + ynh_print_warn "Another app already uses the domain $domain to serve a CalDAV/CardDAV feature. You may encounter issues when dealing with your calendar or address book." # Remove lines about .well-known/carddav and caldav with sed. sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "../conf/nginx.conf" @@ -374,11 +371,11 @@ mkdir -p "$nginx_extra_conf_dir" if [ $enable_notify_push -eq 1 ] then - ynh_add_config --template="notify_push.conf" --destination="$nginx_extra_conf_dir/notify_push.conf" + ynh_config_add --template="notify_push.conf" --destination="$nginx_extra_conf_dir/notify_push.conf" fi # Create a dedicated NGINX config -ynh_add_nginx_config +ynh_config_add_nginx #================================================= # CONFIGURE NOTIFY_PUSH APP @@ -401,21 +398,19 @@ then armel|armhf) arch="armv7";; esac - ynh_add_config --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" - ynh_add_systemd_config --service="${app}-notify-push-watcher" --template="watcher.service" + ynh_config_add --template="watcher.path" --destination="/etc/systemd/system/${app}-notify-push-watcher.path" + ynh_config_add_systemd --service="${app}-notify-push-watcher" --template="watcher.service" systemctl enable --now --quiet ${app}-notify-push-watcher.path - ynh_add_systemd_config --service="${app}-notify-push" + ynh_config_add_systemd --service="${app}-notify-push" fi - #================================================= # CRON JOB #================================================= -cron_path="/etc/cron.d/$app" -ynh_add_config --template="nextcloud.cron" --destination="$cron_path" -chown root: "$cron_path" -chmod 644 "$cron_path" +ynh_config_add --template="nextcloud.cron" --destination="/etc/cron.d/$app" +chown root: "/etc/cron.d/$app" +chmod 644 "/etc/cron.d/$app" exec_occ background:cron @@ -423,14 +418,14 @@ exec_occ background:cron # LOGROTATE #================================================= -ynh_use_logrotate --non-append +ynh_config_add_logrotate #================================================= # FAIL2BAN #================================================= # Create a dedicated Fail2Ban config -ynh_add_fail2ban_config --logpath="/var/log/$app/nextcloud.log" --failregex="^.*Login failed: '.*' \(Remote IP: ''.*$" --max_retry=5 +ynh_config_add_fail2ban --logpath="/var/log/$app/nextcloud.log" --failregex="^.*Login failed: '.*' \(Remote IP: ''.*$" #================================================= # CHECK IF NOTIFY_PUSH WORKS @@ -439,17 +434,17 @@ ynh_add_fail2ban_config --logpath="/var/log/$app/nextcloud.log" --failregex="^.* if [ $enable_notify_push -eq 1 ] then count=0 - while ! ynh_exec_as "$app" php${phpversion} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] + while ! ynh_exec_as_app php${php_version} --define apc.enable_cli=1 $install_dir/cron.php && [[ $count -lt 30 ]] do sleep 1 count=$((count + 1)) done - ynh_systemd_action --service_name="${app}-notify-push-watcher" --action=restart - ynh_systemd_action --service_name="${app}-notify-push" --action=restart --line_match="Push daemon for Nextcloud clients." --log_path="systemd" --action=restart + ynh_systemctl --service="${app}-notify-push-watcher" --action=restart + ynh_systemctl --service="${app}-notify-push" --action=restart --wait_until="Push daemon for Nextcloud clients." --log_path="systemd" --action=restart if ! exec_occ notify_push:self-test; then - ynh_print_warn --message="The Notify Push service is still not working properly. Please log in with a user to your NextCloud instance, restart the Notify Push service with \"systemctl restart ${app}-notify-push.service\", and run \"sudo -u $app php${phpversion} $install_dir/occ notify_push:self-test\" to verify that everything is green." + ynh_print_warn "The Notify Push service is still not working properly. Please log in with a user to your NextCloud instance, restart the Notify Push service with \"systemctl restart ${app}-notify-push.service\", and run \"ynh_exec_as_app php${php_version} $install_dir/occ notify_push:self-test\" to verify that everything is green." fi fi @@ -457,4 +452,4 @@ fi # END OF SCRIPT #================================================= -ynh_script_progression --message="Upgrade of $app completed" --last +ynh_script_progression "Upgrade of $app completed" diff --git a/sources/patches/.gitignore b/sources/patches/.gitignore deleted file mode 100644 index e69de29b..00000000 From e6ada49bcee7eb675608f366a3cfbd13d3930932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 09:05:28 +0100 Subject: [PATCH 292/354] fix --- scripts/install | 3 +-- scripts/upgrade | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index 9717fa6c..c6aefdb8 100755 --- a/scripts/install +++ b/scripts/install @@ -184,8 +184,7 @@ exec_occ config:system:set overwrite.cli.url --value="https://${domain}${path}" #================================================= # Set the user as admin -ynh_psql_connect_as --user=$db_user --password="$db_pwd" --database=$db_name \ - <<< "INSERT INTO oc_group_user VALUES ('admin','$admin');" +ynh_psql_db_shell <<< "INSERT INTO oc_group_user VALUES ('admin','$admin');" # And delete admin user exec_occ user:delete admin diff --git a/scripts/upgrade b/scripts/upgrade index e56284b6..013a32fd 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -105,7 +105,7 @@ then then ynh_print_warn "Uhoh? The Nextcloud MySQL DB doesn't exist? We are supposed to move it to PostgreSQL... Maybe it was already migrated?" # Double check the psql is not empty, otherwise big whoops? - if [[ "$(ynh_psql_execute_as_root --database=$db_name --sql="\dt" 2>/dev/null | wc -l)" == 0 ]] + if [[ "$(ynh_psql_db_shell --database=$db_name --sql="\dt" 2>/dev/null | wc -l)" == 0 ]] then ynh_die "Apparently the PostgreSQL DB is also empty, this is kind of worrying, what happened?!" else From be5f0d35e42b2ac34d1e9cb534b857d75c9910f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 09:47:14 +0100 Subject: [PATCH 293/354] fix --- scripts/backup | 2 +- scripts/restore | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/backup b/scripts/backup index ff0fc4f1..00bd769d 100755 --- a/scripts/backup +++ b/scripts/backup @@ -44,7 +44,7 @@ ynh_backup "/var/log/$app" #================================================= ynh_print_info --message="Backing up the PostgreSQL database..." -ynh_psql_dump_db --database="$db_name" > db.sql +ynh_psql_dump_db > db.sql #================================================= # BACKUP THE NOTIFY_PUSH APP diff --git a/scripts/restore b/scripts/restore index 88d38dbf..3018f6e4 100755 --- a/scripts/restore +++ b/scripts/restore @@ -15,7 +15,7 @@ ynh_restore "$install_dir" #================================================= ynh_script_progression "Restoring the PostgreSQL database..." -ynh_psql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql +ynh_psql_db_shell < ./db.sql #================================================= # RESTORE THE PHP-FPM CONFIGURATION From e13f8b0f7e8a8d9636b62d6f9fcdf80396810dab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 09:51:25 +0100 Subject: [PATCH 294/354] Update install --- scripts/install | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index c6aefdb8..33ee1eb8 100755 --- a/scripts/install +++ b/scripts/install @@ -9,6 +9,8 @@ source /usr/share/yunohost/helpers ynh_app_setting_set --key=php_upload_max_filesize --value=10G ynh_app_setting_set --key=php_memory_limit --value=512M +ynh_app_setting_set --key=fpm_footprint --value=high +ynh_app_setting_set --key=fpm_usage --value=medium phpflags="--define apc.enable_cli=1" ynh_app_setting_set --key=phpflags --value="$phpflags" @@ -31,8 +33,6 @@ ynh_setup_source --dest_dir="$install_dir" #================================================= ynh_script_progression "Configuring PHP-FPM..." -ynh_app_setting_set --key=fpm_footprint --value=high -ynh_app_setting_set --key=fpm_usage --value=medium ynh_config_add_phpfpm #================================================= From befff2c024213206b0b63bb5fd2102087799227d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 09:54:34 +0100 Subject: [PATCH 295/354] Update upgrade --- scripts/upgrade | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 013a32fd..5d5f8254 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -54,11 +54,11 @@ filter_boring_occ_warnings() { sed -E 's@\s*([0-9]+\/[0-9]+\s+\[(-|>|=)+\]\s+[0-9]+%|\s*Starting ...|Nextcloud or one of the apps require upgrade - only a limited number of commands are available|You may use your browser or the occ upgrade command to do the upgrade)@@g' } -#current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) -#current_major_version=${current_version%%.*} +current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) +current_major_version=${current_version%%.*} -#last_version=$(ynh_read_manifest --manifest_key="resources.sources.main.url" | grep -o '[0-9][0-9]\.[0-9]\.[0-9][0-9]') -#last_major_version=${last_version%%.*} +last_version=$(ynh_read_manifest "resources.sources.main.url" | grep -Eo '[0-9][0-9]\.[0-9]\.[0-9]+') +last_major_version=${last_version%%.*} # Define a function to execute commands with `occ` exec_occ() { @@ -157,11 +157,7 @@ function list_installed_apps_not_compatible_with_future_version() comm -23 <(comm -23 $installed_apps $core_apps_in_current_version) $nextcloud_destination_appcatalog } -current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) -current_major_version=${current_version%%.*} -last_version=$(ynh_read_manifest "resources.sources.main.url" | grep -Eo '[0-9][0-9]\.[0-9]\.[0-9]+') -last_major_version=${last_version%%.*} if [[ "$last_major_version" != "$current_major_version" ]] then From 099d3f5fa87d63f4085e24d30cd5e8a2b23a6932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 10:13:30 +0100 Subject: [PATCH 296/354] Update upgrade --- scripts/upgrade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 5d5f8254..94c67bfc 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -97,8 +97,8 @@ exec_occ() { # HANDLE DATABASE MIGRATION FROM MYSL TO PSQL #================================================= -# If we're moving through version 29.0.3~ynh1 (in which the switch to psql is made) -if ynh_compare_current_package_version --comparison lt --version 29.0.3~ynh1 +# If we're moving through version 29.0.13~ynh1 (in which the switch to psql is made) +if ynh_app_upgrading_from_version_before 29.0.13~ynh1 then # Double-check the MySQL DB is here if ! mysql -e "USE $db_name" 2>/dev/null From 2d4c475f17a777d5f334b874bf620d9674b59ec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 10:13:58 +0100 Subject: [PATCH 297/354] Update upgrade --- scripts/upgrade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 94c67bfc..89273f97 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -97,8 +97,8 @@ exec_occ() { # HANDLE DATABASE MIGRATION FROM MYSL TO PSQL #================================================= -# If we're moving through version 29.0.13~ynh1 (in which the switch to psql is made) -if ynh_app_upgrading_from_version_before 29.0.13~ynh1 +# If we're moving through version 29.0.10~ynh1 (in which the switch to psql is made) +if ynh_app_upgrading_from_version_before 29.0.10~ynh1 then # Double-check the MySQL DB is here if ! mysql -e "USE $db_name" 2>/dev/null From 079f46df2c059bbdc09e908c115c4c587b81476c Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 10:15:35 +0100 Subject: [PATCH 298/354] fix linter (#761) --- conf/systemd.service | 40 +++++++++++++++++++++++++++++++++++++--- conf/watcher.service | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index bbe65732..54bd669c 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -2,13 +2,47 @@ Description = Push daemon for Nextcloud clients [Service] +Type=notify +User=__APP__ +Group=__APP__ Environment=SOCKET_PATH=/var/run/__APP__/notify-push.sock Environment=ALLOW_SELF_SIGNED=true RuntimeDirectory=__APP__ ExecStart=__INSTALL_DIR__/apps/notify_push/bin/__ARCH__/notify_push __INSTALL_DIR__/config/config.php -Type=notify -User=__APP__ -Group=__APP__ + +### Depending on specificities of your service/app, you may need to tweak these +### .. but this should be a good baseline +# Sandboxing options to harden security +# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html +NoNewPrivileges=yes +PrivateTmp=yes +PrivateDevices=yes +RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK +RestrictNamespaces=yes +RestrictRealtime=yes +DevicePolicy=closed +ProtectClock=yes +ProtectHostname=yes +ProtectProc=invisible +ProtectSystem=full +ProtectControlGroups=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +LockPersonality=yes +SystemCallArchitectures=native +SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap @cpu-emulation @privileged + +# Denying access to capabilities that should not be relevant for webapps +# Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html +CapabilityBoundingSet=~CAP_RAWIO CAP_MKNOD +CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE +CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_PACCT +CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK +CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM +CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG +CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE +CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW +CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG [Install] WantedBy = multi-user.target \ No newline at end of file diff --git a/conf/watcher.service b/conf/watcher.service index e2d9cfdf..5c7670c0 100644 --- a/conf/watcher.service +++ b/conf/watcher.service @@ -8,8 +8,43 @@ StartLimitBurst=5 [Service] Type=oneshot +User=__APP__ ExecStartPre=/usr/bin/chmod u+x __INSTALL_DIR__/apps/notify_push/bin/__ARCH__/notify_push ExecStart=/usr/bin/systemctl restart __APP__-notify-push.service +### Depending on specificities of your service/app, you may need to tweak these +### .. but this should be a good baseline +# Sandboxing options to harden security +# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html +NoNewPrivileges=yes +PrivateTmp=yes +PrivateDevices=yes +RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK +RestrictNamespaces=yes +RestrictRealtime=yes +DevicePolicy=closed +ProtectClock=yes +ProtectHostname=yes +ProtectProc=invisible +ProtectSystem=full +ProtectControlGroups=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +LockPersonality=yes +SystemCallArchitectures=native +SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap @cpu-emulation @privileged + +# Denying access to capabilities that should not be relevant for webapps +# Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html +CapabilityBoundingSet=~CAP_RAWIO CAP_MKNOD +CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE +CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_PACCT +CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK +CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM +CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG +CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE +CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW +CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG + [Install] WantedBy=multi-user.target \ No newline at end of file From 738d34084f6330f28073d2e9f76f8cc26cbfd4bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 11:44:07 +0100 Subject: [PATCH 299/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 89273f97..8a9bf1cb 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -113,7 +113,7 @@ then fi else ynh_print_info --message="Migrating to PostgreSQL database..." - ynh_exec_warn_less exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n + exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name fi fi From f1d20fab38e8cc259b9e16542e2069c1449a0882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 12:42:00 +0100 Subject: [PATCH 300/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 8a9bf1cb..d81c9480 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -114,7 +114,7 @@ then else ynh_print_info --message="Migrating to PostgreSQL database..." exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n - ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name + ynh_mysql_drop_db --db_user=$db_user --db_name=$db_name fi fi From 0819230854b25201c8424ea7e3e8ce95da24d33d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:04:49 +0100 Subject: [PATCH 301/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index d81c9480..1caba929 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -114,7 +114,7 @@ then else ynh_print_info --message="Migrating to PostgreSQL database..." exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n - ynh_mysql_drop_db --db_user=$db_user --db_name=$db_name + ynh_mysql_drop_db $db_name fi fi From d4a85b78261d7004254af2f330b3bb620a446f56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:06:01 +0100 Subject: [PATCH 302/354] Update upgrade --- scripts/upgrade | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 1caba929..31b73192 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -97,19 +97,19 @@ exec_occ() { # HANDLE DATABASE MIGRATION FROM MYSL TO PSQL #================================================= -# If we're moving through version 29.0.10~ynh1 (in which the switch to psql is made) +# If we're moving through version 29.0.10~ynh1 (in which the switch to PostgreSQL is made) if ynh_app_upgrading_from_version_before 29.0.10~ynh1 then - # Double-check the MySQL DB is here + # Double-check the MySQL database is here if ! mysql -e "USE $db_name" 2>/dev/null then - ynh_print_warn "Uhoh? The Nextcloud MySQL DB doesn't exist? We are supposed to move it to PostgreSQL... Maybe it was already migrated?" + ynh_print_warn "Uhoh? The Nextcloud MySQL database doesn't exist? We are supposed to move it to PostgreSQL... Maybe it was already migrated?" # Double check the psql is not empty, otherwise big whoops? if [[ "$(ynh_psql_db_shell --database=$db_name --sql="\dt" 2>/dev/null | wc -l)" == 0 ]] then - ynh_die "Apparently the PostgreSQL DB is also empty, this is kind of worrying, what happened?!" + ynh_die "Apparently the PostgreSQL database is also empty, this is kind of worrying, what happened?!" else - ynh_print_warn "Apparently the PostgreSQL DB is not empty, so this is probably OK?" + ynh_print_warn "Apparently the PostgreSQL database is not empty, so this is probably OK?" fi else ynh_print_info --message="Migrating to PostgreSQL database..." From ec2054442bee2763880f1223d059fc2a0eb7bcf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:26:34 +0100 Subject: [PATCH 303/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index 6dab8f6f..bf6df343 100644 --- a/manifest.toml +++ b/manifest.toml @@ -27,7 +27,7 @@ multi_instance = true ldap = true sso = true -disk = "650M" +disk = "850M" ram.build = "250M" ram.runtime = "512M" From 765e53c37747fbb08e2bd593b233e54947b2aa98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:30:16 +0100 Subject: [PATCH 304/354] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 31b73192..f99bfefb 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -112,7 +112,7 @@ then ynh_print_warn "Apparently the PostgreSQL database is not empty, so this is probably OK?" fi else - ynh_print_info --message="Migrating to PostgreSQL database..." + ynh_print_info "Migrating to PostgreSQL database..." exec_occ db:convert-type --all-apps --clear-schema pgsql $db_name 127.0.0.1 $db_name --password=$db_pwd -n ynh_mysql_drop_db $db_name fi From 393c62fe30c3843641dc01ffb126c3204da799d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:32:19 +0100 Subject: [PATCH 305/354] Update backup --- scripts/backup | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/backup b/scripts/backup index 00bd769d..7c48d677 100755 --- a/scripts/backup +++ b/scripts/backup @@ -42,7 +42,7 @@ ynh_backup "/var/log/$app" #================================================= # BACKUP THE POSTGRESQL DATABASE #================================================= -ynh_print_info --message="Backing up the PostgreSQL database..." +ynh_print_info "Backing up the PostgreSQL database..." ynh_psql_dump_db > db.sql From 3681366ca5cf3a4de0927ab460f7f61901740ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:33:27 +0100 Subject: [PATCH 306/354] Update install --- scripts/install | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/install b/scripts/install index 33ee1eb8..ffea9777 100755 --- a/scripts/install +++ b/scripts/install @@ -93,9 +93,6 @@ exec_occ maintenance:install \ #================================================= ynh_script_progression "Configuring $app..." -# Set the mysql.utf8mb4 config to true in config.php -#exec_occ config:system:set mysql.utf8mb4 --type boolean --value="true" - # move the logs from the data_dir to the standard /var/log exec_occ config:system:set logfile --value="/var/log/$app/nextcloud.log" From b4a983491bddb4a6a646bc09b8d35820becc5219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:59:50 +0100 Subject: [PATCH 307/354] cleaning --- scripts/change_url | 4 ---- scripts/install | 27 ++++++++++++--------------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 6b1208ef..509b92dc 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -1,9 +1,5 @@ #!/bin/bash -#================================================= -# IMPORT GENERIC HELPERS -#================================================= - source _common.sh source /usr/share/yunohost/helpers diff --git a/scripts/install b/scripts/install index 47ec0e1b..cd270cc0 100755 --- a/scripts/install +++ b/scripts/install @@ -3,13 +3,16 @@ source _common.sh source /usr/share/yunohost/helpers -ynh_app_setting_set --key=php_upload_max_filesize --value=10G -ynh_app_setting_set --key=php_memory_limit --value=512M - #================================================= # INITIALIZE AND STORE SETTINGS #================================================= +ynh_app_setting_set --key=php_upload_max_filesize --value=10G +ynh_app_setting_set --key=php_memory_limit --value=512M + +ynh_app_setting_set --key=fpm_footprint --value=high +ynh_app_setting_set --key=fpm_usage --value=medium + phpflags="--define apc.enable_cli=1" ynh_app_setting_set --key=phpflags --value="$phpflags" @@ -31,7 +34,6 @@ ynh_mysql_db_shell <<< "ALTER DATABASE $db_name CHARACTER SET utf8mb4 COLLATE ut #================================================= ynh_script_progression "Setting up source files..." -# Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$install_dir" #================================================= @@ -39,8 +41,6 @@ ynh_setup_source --dest_dir="$install_dir" #================================================= ynh_script_progression "Configuring PHP-FPM..." -ynh_app_setting_set --key=fpm_footprint --value=high -ynh_app_setting_set --key=fpm_usage --value=medium ynh_config_add_phpfpm #================================================= @@ -65,7 +65,6 @@ then ynh_config_add --template="notify_push.conf" --destination="$nginx_extra_conf_dir/notify_push.conf" fi -# Create a dedicated NGINX config ynh_config_add_nginx #================================================= @@ -115,22 +114,20 @@ exec_occ app:enable user_ldap exec_occ ldap:create-empty-config # Load the installation config file in Nextcloud -nc_conf="$install_dir/config_install.json" -ynh_config_add --template="config_install.json" --destination="$nc_conf" +ynh_config_add --template="config_install.json" --destination="$install_dir/config_install.json" -exec_occ config:import "$nc_conf" +exec_occ config:import "$install_dir/config_install.json" # Then remove the config file -ynh_safe_rm "$nc_conf" +ynh_safe_rm "$install_dir/config_install.json" # Load the additional config file (used also for upgrade) -nc_conf="$install_dir/config.json" -ynh_config_add --template="config.json" --destination="$nc_conf" +ynh_config_add --template="config.json" --destination="$install_dir/config.json" -exec_occ config:import "$nc_conf" +exec_occ config:import "$install_dir/config.json" # Then remove the config file -ynh_safe_rm "$nc_conf" +ynh_safe_rm "$install_dir/config.json" #================================================= # CHECK THE LDAP CONFIG From ddbd0d2e2fff6577d1338bef723d95e9f8ab8d0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 17:31:59 +0100 Subject: [PATCH 308/354] Fix linter --- conf/systemd.service | 40 +++++++++++++++++++++++++++++++++++++--- conf/watcher.service | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index bbe65732..54bd669c 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -2,13 +2,47 @@ Description = Push daemon for Nextcloud clients [Service] +Type=notify +User=__APP__ +Group=__APP__ Environment=SOCKET_PATH=/var/run/__APP__/notify-push.sock Environment=ALLOW_SELF_SIGNED=true RuntimeDirectory=__APP__ ExecStart=__INSTALL_DIR__/apps/notify_push/bin/__ARCH__/notify_push __INSTALL_DIR__/config/config.php -Type=notify -User=__APP__ -Group=__APP__ + +### Depending on specificities of your service/app, you may need to tweak these +### .. but this should be a good baseline +# Sandboxing options to harden security +# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html +NoNewPrivileges=yes +PrivateTmp=yes +PrivateDevices=yes +RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK +RestrictNamespaces=yes +RestrictRealtime=yes +DevicePolicy=closed +ProtectClock=yes +ProtectHostname=yes +ProtectProc=invisible +ProtectSystem=full +ProtectControlGroups=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +LockPersonality=yes +SystemCallArchitectures=native +SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap @cpu-emulation @privileged + +# Denying access to capabilities that should not be relevant for webapps +# Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html +CapabilityBoundingSet=~CAP_RAWIO CAP_MKNOD +CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE +CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_PACCT +CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK +CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM +CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG +CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE +CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW +CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG [Install] WantedBy = multi-user.target \ No newline at end of file diff --git a/conf/watcher.service b/conf/watcher.service index e2d9cfdf..5c7670c0 100644 --- a/conf/watcher.service +++ b/conf/watcher.service @@ -8,8 +8,43 @@ StartLimitBurst=5 [Service] Type=oneshot +User=__APP__ ExecStartPre=/usr/bin/chmod u+x __INSTALL_DIR__/apps/notify_push/bin/__ARCH__/notify_push ExecStart=/usr/bin/systemctl restart __APP__-notify-push.service +### Depending on specificities of your service/app, you may need to tweak these +### .. but this should be a good baseline +# Sandboxing options to harden security +# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html +NoNewPrivileges=yes +PrivateTmp=yes +PrivateDevices=yes +RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK +RestrictNamespaces=yes +RestrictRealtime=yes +DevicePolicy=closed +ProtectClock=yes +ProtectHostname=yes +ProtectProc=invisible +ProtectSystem=full +ProtectControlGroups=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +LockPersonality=yes +SystemCallArchitectures=native +SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap @cpu-emulation @privileged + +# Denying access to capabilities that should not be relevant for webapps +# Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html +CapabilityBoundingSet=~CAP_RAWIO CAP_MKNOD +CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE +CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_PACCT +CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK +CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM +CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG +CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE +CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW +CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG + [Install] WantedBy=multi-user.target \ No newline at end of file From 00650324e6631b17eacc02bfeee493805140a192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:04:53 +0100 Subject: [PATCH 309/354] Update nginx.conf --- conf/nginx.conf | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 8ecbdaf0..edbc5190 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -137,17 +137,19 @@ location ^~ __PATH__/ { } # Serve static files - location ~ \.(?:css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map)$ { + location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { try_files $uri / __PATH__/index.php$request_uri; - expires 6M; # Cache-Control policy borrowed from `.htaccess` + more_set_headers "Cache-Control: public, max-age=15778463$asset_immutable"; + more_set_headers "Referrer-Policy: no-referrer"; + more_set_headers "X-Content-Type-Options: nosniff"; + more_set_headers "X-Frame-Options: SAMEORIGIN"; + more_set_headers "X-Permitted-Cross-Domain-Policies: none"; + more_set_headers "X-Robots-Tag: noindex, nofollow"; + more_set_headers "X-XSS-Protection: 1; mode=block"; access_log off; # Optional: Don't log access to assets - - location ~ \.wasm$ { - default_type application/wasm; - } } - location ~ \.woff2?$ { + location ~ \.(otf|woff2?)$ { try_files $uri / __PATH__/index.php$request_uri; expires 7d; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets @@ -158,7 +160,7 @@ location ^~ __PATH__/ { return 301 __PATH__/remote.php$request_uri; } - location ~ / { + location __PATH__/ { if ($request_method ~ ^(PUT|DELETE|PATCH|PROPFIND|PROPPATCH)$) { rewrite ^ __PATH__/index.php$request_uri last; } @@ -166,7 +168,4 @@ location ^~ __PATH__/ { } include conf.d/__DOMAIN__.d/__APP__.d/*.conf; - - # show YunoHost panel access - include conf.d/yunohost_panel.conf.inc; } From 7a3de9382a1ba410e2a381de8ebb1f828e790a38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:05:33 +0100 Subject: [PATCH 310/354] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index b8bf1772..81c0bf46 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -147,7 +147,7 @@ location ^~ __PATH__/ { } } - location ~ \.woff2?$ { + location ~ \.(otf|woff2?)$ { try_files $uri / __PATH__/index.php$request_uri; expires 7d; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets From 7bd9ff879f2a4227057c0e7f30bff827f2614ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:09:13 +0100 Subject: [PATCH 311/354] Update nginx.conf --- conf/nginx.conf | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 81c0bf46..1c59b25e 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -137,13 +137,10 @@ location ^~ __PATH__/ { } # Serve static files - location ~ \.(?:css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map)$ { + location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { try_files $uri / __PATH__/index.php$request_uri; expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets - - location ~ \.wasm$ { - default_type application/wasm; } } @@ -166,7 +163,4 @@ location ^~ __PATH__/ { } include conf.d/__DOMAIN__.d/__APP__.d/*.conf; - - # show YunoHost panel access - include conf.d/yunohost_panel.conf.inc; } From 22449fe9f1b620e15904889d88c191cf8567c0aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:18:41 +0100 Subject: [PATCH 312/354] Update nginx.conf --- conf/nginx.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index edbc5190..f6f6ba4f 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -131,10 +131,10 @@ location ^~ __PATH__/ { send_timeout 600; } - location ~ ^__PATH__/(?:updater|ocs-provider)(?:$|/) { - try_files $uri/ =404; - index index.php; - } + #location ~ ^__PATH__/(?:updater|ocs-provider)(?:$|/) { + # try_files $uri/ =404; + # index index.php; + #} # Serve static files location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { From 9de599d1559261eb6c6f05ca0dd05fe5be9e90cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:23:31 +0100 Subject: [PATCH 313/354] Update nginx.conf --- conf/nginx.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 1c59b25e..3652c5c1 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -141,7 +141,6 @@ location ^~ __PATH__/ { try_files $uri / __PATH__/index.php$request_uri; expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets - } } location ~ \.(otf|woff2?)$ { From 125789f219be891aee4a82a437e9b1997879ae10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:26:29 +0100 Subject: [PATCH 314/354] Update nginx.conf --- conf/nginx.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 3652c5c1..dba5515c 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -131,10 +131,10 @@ location ^~ __PATH__/ { send_timeout 600; } - location ~ ^__PATH__/(?:updater|ocs-provider)(?:$|/) { - try_files $uri/ =404; - index index.php; - } + #location ~ ^__PATH__/(?:updater|ocs-provider)(?:$|/) { + # try_files $uri/ =404; + # index index.php; + #} # Serve static files location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { From 3acdd4eb2e2b68d04cae27366b2fb6618323741e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:28:16 +0100 Subject: [PATCH 315/354] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index dba5515c..3ac2e877 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -154,7 +154,7 @@ location ^~ __PATH__/ { return 301 __PATH__/remote.php$request_uri; } - location ~ / { + location ~ __PATH__/ { if ($request_method ~ ^(PUT|DELETE|PATCH|PROPFIND|PROPPATCH)$) { rewrite ^ __PATH__/index.php$request_uri last; } From f482f016442c0caba80aaf2853080330aa9d0b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:55:02 +0100 Subject: [PATCH 316/354] Update nginx.conf --- conf/nginx.conf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index f6f6ba4f..433482d3 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -139,13 +139,13 @@ location ^~ __PATH__/ { # Serve static files location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { try_files $uri / __PATH__/index.php$request_uri; - more_set_headers "Cache-Control: public, max-age=15778463$asset_immutable"; - more_set_headers "Referrer-Policy: no-referrer"; - more_set_headers "X-Content-Type-Options: nosniff"; - more_set_headers "X-Frame-Options: SAMEORIGIN"; - more_set_headers "X-Permitted-Cross-Domain-Policies: none"; - more_set_headers "X-Robots-Tag: noindex, nofollow"; - more_set_headers "X-XSS-Protection: 1; mode=block"; + #more_set_headers "Cache-Control: public, max-age=15778463$asset_immutable"; + #more_set_headers "Referrer-Policy: no-referrer"; + #more_set_headers "X-Content-Type-Options: nosniff"; + #more_set_headers "X-Frame-Options: SAMEORIGIN"; + #more_set_headers "X-Permitted-Cross-Domain-Policies: none"; + #more_set_headers "X-Robots-Tag: noindex, nofollow"; + #more_set_headers "X-XSS-Protection: 1; mode=block"; access_log off; # Optional: Don't log access to assets } From cfa6ef015c84dc96f869145de9528367da9d89f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 23:07:42 +0100 Subject: [PATCH 317/354] Update nginx.conf --- conf/nginx.conf | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 433482d3..31f5942d 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -139,13 +139,7 @@ location ^~ __PATH__/ { # Serve static files location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { try_files $uri / __PATH__/index.php$request_uri; - #more_set_headers "Cache-Control: public, max-age=15778463$asset_immutable"; - #more_set_headers "Referrer-Policy: no-referrer"; - #more_set_headers "X-Content-Type-Options: nosniff"; - #more_set_headers "X-Frame-Options: SAMEORIGIN"; - #more_set_headers "X-Permitted-Cross-Domain-Policies: none"; - #more_set_headers "X-Robots-Tag: noindex, nofollow"; - #more_set_headers "X-XSS-Protection: 1; mode=block"; + expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets } @@ -156,9 +150,9 @@ location ^~ __PATH__/ { } # Rule borrowed from `.htaccess` - location __PATH__/remote { - return 301 __PATH__/remote.php$request_uri; - } + location __PATH__/remote { + return 301 __PATH__/remote.php$request_uri; + } location __PATH__/ { if ($request_method ~ ^(PUT|DELETE|PATCH|PROPFIND|PROPPATCH)$) { From e0a2903dad66283e3e5d485f367bd11e0514f57c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 23:09:38 +0100 Subject: [PATCH 318/354] Update nginx.conf --- conf/nginx.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 3ac2e877..17a9355c 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -150,11 +150,11 @@ location ^~ __PATH__/ { } # Rule borrowed from `.htaccess` - location __PATH__/remote { - return 301 __PATH__/remote.php$request_uri; - } + location __PATH__/remote { + return 301 __PATH__/remote.php$request_uri; + } - location ~ __PATH__/ { + location __PATH__/ { if ($request_method ~ ^(PUT|DELETE|PATCH|PROPFIND|PROPPATCH)$) { rewrite ^ __PATH__/index.php$request_uri last; } From 6fa35e078fc24ce83284eeaf7685d85c285568e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 23:13:14 +0100 Subject: [PATCH 319/354] Update nginx.conf --- conf/nginx.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conf/nginx.conf b/conf/nginx.conf index 17a9355c..876e818b 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -141,6 +141,10 @@ location ^~ __PATH__/ { try_files $uri / __PATH__/index.php$request_uri; expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets + + location ~ \.wasm$ { + default_type application/wasm; + } } location ~ \.(otf|woff2?)$ { From 9b2178788801f2ab4b8206f353e96339bb772251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 23:14:19 +0100 Subject: [PATCH 320/354] Update nginx.conf --- conf/nginx.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conf/nginx.conf b/conf/nginx.conf index 31f5942d..0f260e33 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -141,6 +141,10 @@ location ^~ __PATH__/ { try_files $uri / __PATH__/index.php$request_uri; expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets + + location ~ \.wasm$ { + default_type application/wasm; + } } location ~ \.(otf|woff2?)$ { From 43a05feb2b305a44cf65ddaee245781462eceb5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 23:17:19 +0100 Subject: [PATCH 321/354] Update nginx.conf --- conf/nginx.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 0f260e33..41d42aaa 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -131,10 +131,10 @@ location ^~ __PATH__/ { send_timeout 600; } - #location ~ ^__PATH__/(?:updater|ocs-provider)(?:$|/) { - # try_files $uri/ =404; - # index index.php; - #} + location ~ ^__PATH__/(?:updater|ocs-provider)(?:$|/) { + try_files $uri/ =404; + index index.php; + } # Serve static files location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { From 27a0f35cb5cba6b646a9f7d9ccbf6ddd31c07919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 23:17:37 +0100 Subject: [PATCH 322/354] Update nginx.conf --- conf/nginx.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 876e818b..cfc4265e 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -131,10 +131,10 @@ location ^~ __PATH__/ { send_timeout 600; } - #location ~ ^__PATH__/(?:updater|ocs-provider)(?:$|/) { - # try_files $uri/ =404; - # index index.php; - #} + location ~ ^__PATH__/(?:updater|ocs-provider)(?:$|/) { + try_files $uri/ =404; + index index.php; + } # Serve static files location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { From 3792e6ae42495e126f797151832a62cf2e6ca1ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 23:18:25 +0100 Subject: [PATCH 323/354] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index cfc4265e..c355e126 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -158,7 +158,7 @@ location ^~ __PATH__/ { return 301 __PATH__/remote.php$request_uri; } - location __PATH__/ { + location ~ ^__PATH__/ { if ($request_method ~ ^(PUT|DELETE|PATCH|PROPFIND|PROPPATCH)$) { rewrite ^ __PATH__/index.php$request_uri last; } From 2405cc4fed8c10f0805e318400c8478aef8a87c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 23:18:39 +0100 Subject: [PATCH 324/354] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 41d42aaa..8edb5581 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -158,7 +158,7 @@ location ^~ __PATH__/ { return 301 __PATH__/remote.php$request_uri; } - location __PATH__/ { + location ~ ^__PATH__/ { if ($request_method ~ ^(PUT|DELETE|PATCH|PROPFIND|PROPPATCH)$) { rewrite ^ __PATH__/index.php$request_uri last; } From 0de16ba121322cbee5f0e1e45bd3069ca3165499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 11 Dec 2024 23:27:26 +0100 Subject: [PATCH 325/354] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index c355e126..8edb5581 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -74,7 +74,7 @@ location ^~ __PATH__/ { # that file is correctly served; if it doesn't, then the request is passed to # the front-end controller. This consistent behaviour means that we don't need # to specify custom rules for certain paths (e.g. images and other assets, - # `/updater`, `/ocm-provider`, `/ocs-provider`), and thus + # `/updater`, `/ocs-provider`), and thus # `try_files $uri $uri/ /nextcloud/index.php$request_uri` # always provides the desired behaviour. index index.php index.html __PATH__/index.php$request_uri; From 8bc0cff0c15a3353d6eba2e953fd8b371e6756e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Dec 2024 12:47:10 +0100 Subject: [PATCH 326/354] Update manifest.toml --- manifest.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/manifest.toml b/manifest.toml index 7a796b21..c11eb993 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "30.0.2~ynh1" +version = "30.0.4~ynh1" maintainers = ["kay0u"] @@ -59,8 +59,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.2.tar.bz2' - sha256 = '929bb8045e96216fe22a65dcd66279e5bd7ba1abb29d99bf401d423b646a445f' + url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.4.tar.bz2' + sha256 = 'eb6aaba9acef442f2b3e4a996b7ee8a5ed24442f9bba681237fb28ed970e1fa5' [resources.sources.29] url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.10.tar.bz2' @@ -68,8 +68,8 @@ ram.runtime = "512M" prefetch = false [resources.sources.28] - url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.12.tar.bz2' - sha256 = '2a00ca4f799360f0987fcbc85d99b2c258f7d2ccf7e6f7e0c4ccf17a127f0105' + url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.14.tar.bz2' + sha256 = '4a937f1882486426c9703e59ec4b293f621be8d080b7f85016f629903c3af336' prefetch = false [resources.sources.27] From 2e9a4c3b3052f0b623db9219e3fce8e19897d0e7 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 12 Dec 2024 12:47:15 +0100 Subject: [PATCH 327/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_pl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index f645d760..f9e03051 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Shipped version:** 30.0.2~ynh1 +**Shipped version:** 30.0.4~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 7dd382f9..19fc4b46 100644 --- a/README_es.md +++ b/README_es.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión actual:** 30.0.2~ynh1 +**Versión actual:** 30.0.4~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index dfce54f4..a97367ef 100644 --- a/README_eu.md +++ b/README_eu.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Paketatutako bertsioa:** 30.0.2~ynh1 +**Paketatutako bertsioa:** 30.0.4~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index d211d8c2..276d38be 100644 --- a/README_fr.md +++ b/README_fr.md @@ -27,7 +27,7 @@ L'adresse `/.well-known` sera automatiquement configuré pour la synchronisatio Le catalogue YunoHost dispose de deux suites bureautiques collaboratives, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) et [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), qui peuvent être intégrées à Nextcloud. -**Version incluse :** 30.0.2~ynh1 +**Version incluse :** 30.0.4~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 6ac9c635..50121dc0 100644 --- a/README_gl.md +++ b/README_gl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión proporcionada:** 30.0.2~ynh1 +**Versión proporcionada:** 30.0.4~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index 17f53464..5cf9feaa 100644 --- a/README_id.md +++ b/README_id.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versi terkirim:** 30.0.2~ynh1 +**Versi terkirim:** 30.0.4~ynh1 **Demo:** diff --git a/README_nl.md b/README_nl.md index a74b7899..00322ce2 100644 --- a/README_nl.md +++ b/README_nl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Geleverde versie:** 30.0.2~ynh1 +**Geleverde versie:** 30.0.4~ynh1 **Demo:** diff --git a/README_pl.md b/README_pl.md index d2ffb069..792231a2 100644 --- a/README_pl.md +++ b/README_pl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Dostarczona wersja:** 30.0.2~ynh1 +**Dostarczona wersja:** 30.0.4~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md index 4c845b78..6e60ecff 100644 --- a/README_ru.md +++ b/README_ru.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Поставляемая версия:** 30.0.2~ynh1 +**Поставляемая версия:** 30.0.4~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 6c07a52f..23f0f3a9 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**分发版本:** 30.0.2~ynh1 +**分发版本:** 30.0.4~ynh1 **演示:** From c291b2e2bd929e887ba3dfdc0e2509c89ff6b36e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Dec 2024 12:47:35 +0100 Subject: [PATCH 328/354] Update manifest.toml --- manifest.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manifest.toml b/manifest.toml index bf6df343..aed16ba2 100644 --- a/manifest.toml +++ b/manifest.toml @@ -59,8 +59,8 @@ ram.runtime = "512M" [resources.sources] [resources.sources.main] - url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.2.tar.bz2' - sha256 = '929bb8045e96216fe22a65dcd66279e5bd7ba1abb29d99bf401d423b646a445f' + url = 'https://download.nextcloud.com/server/releases/nextcloud-30.0.4.tar.bz2' + sha256 = 'eb6aaba9acef442f2b3e4a996b7ee8a5ed24442f9bba681237fb28ed970e1fa5' [resources.sources.29] url = 'https://download.nextcloud.com/server/releases/nextcloud-29.0.10.tar.bz2' @@ -68,8 +68,8 @@ ram.runtime = "512M" prefetch = false [resources.sources.28] - url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.12.tar.bz2' - sha256 = '2a00ca4f799360f0987fcbc85d99b2c258f7d2ccf7e6f7e0c4ccf17a127f0105' + url = 'https://download.nextcloud.com/server/releases/nextcloud-28.0.14.tar.bz2' + sha256 = '4a937f1882486426c9703e59ec4b293f621be8d080b7f85016f629903c3af336' prefetch = false [resources.sources.27] From 3aa9f9cac2e8d60025685894878a99b39f8d5556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Dec 2024 12:48:01 +0100 Subject: [PATCH 329/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index aed16ba2..eb0b9f2b 100644 --- a/manifest.toml +++ b/manifest.toml @@ -5,7 +5,7 @@ name = "Nextcloud" description.en = "Online storage, file sharing platform and various other applications" description.fr = "Stockage en ligne, plateforme de partage de fichiers et diverses autres applications" -version = "30.0.2~ynh1" +version = "30.0.4~ynh1" maintainers = ["kay0u"] From 807afd32161dc19f6f7095075125edcb47919f07 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Thu, 12 Dec 2024 12:48:05 +0100 Subject: [PATCH 330/354] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_id.md | 2 +- README_nl.md | 2 +- README_pl.md | 2 +- README_ru.md | 2 +- README_zh_Hans.md | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index f645d760..f9e03051 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Shipped version:** 30.0.2~ynh1 +**Shipped version:** 30.0.4~ynh1 **Demo:** diff --git a/README_es.md b/README_es.md index 7dd382f9..19fc4b46 100644 --- a/README_es.md +++ b/README_es.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión actual:** 30.0.2~ynh1 +**Versión actual:** 30.0.4~ynh1 **Demo:** diff --git a/README_eu.md b/README_eu.md index dfce54f4..a97367ef 100644 --- a/README_eu.md +++ b/README_eu.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Paketatutako bertsioa:** 30.0.2~ynh1 +**Paketatutako bertsioa:** 30.0.4~ynh1 **Demoa:** diff --git a/README_fr.md b/README_fr.md index d211d8c2..276d38be 100644 --- a/README_fr.md +++ b/README_fr.md @@ -27,7 +27,7 @@ L'adresse `/.well-known` sera automatiquement configuré pour la synchronisatio Le catalogue YunoHost dispose de deux suites bureautiques collaboratives, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) et [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), qui peuvent être intégrées à Nextcloud. -**Version incluse :** 30.0.2~ynh1 +**Version incluse :** 30.0.4~ynh1 **Démo :** diff --git a/README_gl.md b/README_gl.md index 6ac9c635..50121dc0 100644 --- a/README_gl.md +++ b/README_gl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versión proporcionada:** 30.0.2~ynh1 +**Versión proporcionada:** 30.0.4~ynh1 **Demo:** diff --git a/README_id.md b/README_id.md index 17f53464..5cf9feaa 100644 --- a/README_id.md +++ b/README_id.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Versi terkirim:** 30.0.2~ynh1 +**Versi terkirim:** 30.0.4~ynh1 **Demo:** diff --git a/README_nl.md b/README_nl.md index a74b7899..00322ce2 100644 --- a/README_nl.md +++ b/README_nl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Geleverde versie:** 30.0.2~ynh1 +**Geleverde versie:** 30.0.4~ynh1 **Demo:** diff --git a/README_pl.md b/README_pl.md index d2ffb069..792231a2 100644 --- a/README_pl.md +++ b/README_pl.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Dostarczona wersja:** 30.0.2~ynh1 +**Dostarczona wersja:** 30.0.4~ynh1 **Demo:** diff --git a/README_ru.md b/README_ru.md index 4c845b78..6e60ecff 100644 --- a/README_ru.md +++ b/README_ru.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**Поставляемая версия:** 30.0.2~ynh1 +**Поставляемая версия:** 30.0.4~ynh1 **Демо-версия:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 6c07a52f..23f0f3a9 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -26,7 +26,7 @@ The `/.well-known` address will be automatically configured for CalDAV and CardD The YunoHost catalog has two collaborative office suites, [OnlyOffice](https://github.com/YunoHost-Apps/onlyoffice_ynh) and [Collabora](https://github.com/YunoHost-Apps/collabora_ynh), which can be integrated with Nextcloud. -**分发版本:** 30.0.2~ynh1 +**分发版本:** 30.0.4~ynh1 **演示:** From 31bbb2545d0d6c5d2a1e628e96a6a7d87a5407a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Dec 2024 12:58:16 +0100 Subject: [PATCH 331/354] fix --- conf/systemd.service | 34 ---------------------------------- conf/watcher.service | 35 ----------------------------------- 2 files changed, 69 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index 54bd669c..a1f18b54 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -10,39 +10,5 @@ Environment=ALLOW_SELF_SIGNED=true RuntimeDirectory=__APP__ ExecStart=__INSTALL_DIR__/apps/notify_push/bin/__ARCH__/notify_push __INSTALL_DIR__/config/config.php -### Depending on specificities of your service/app, you may need to tweak these -### .. but this should be a good baseline -# Sandboxing options to harden security -# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html -NoNewPrivileges=yes -PrivateTmp=yes -PrivateDevices=yes -RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK -RestrictNamespaces=yes -RestrictRealtime=yes -DevicePolicy=closed -ProtectClock=yes -ProtectHostname=yes -ProtectProc=invisible -ProtectSystem=full -ProtectControlGroups=yes -ProtectKernelModules=yes -ProtectKernelTunables=yes -LockPersonality=yes -SystemCallArchitectures=native -SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap @cpu-emulation @privileged - -# Denying access to capabilities that should not be relevant for webapps -# Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html -CapabilityBoundingSet=~CAP_RAWIO CAP_MKNOD -CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE -CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_PACCT -CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK -CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM -CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG -CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE -CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW -CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG - [Install] WantedBy = multi-user.target \ No newline at end of file diff --git a/conf/watcher.service b/conf/watcher.service index 5c7670c0..e2d9cfdf 100644 --- a/conf/watcher.service +++ b/conf/watcher.service @@ -8,43 +8,8 @@ StartLimitBurst=5 [Service] Type=oneshot -User=__APP__ ExecStartPre=/usr/bin/chmod u+x __INSTALL_DIR__/apps/notify_push/bin/__ARCH__/notify_push ExecStart=/usr/bin/systemctl restart __APP__-notify-push.service -### Depending on specificities of your service/app, you may need to tweak these -### .. but this should be a good baseline -# Sandboxing options to harden security -# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html -NoNewPrivileges=yes -PrivateTmp=yes -PrivateDevices=yes -RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK -RestrictNamespaces=yes -RestrictRealtime=yes -DevicePolicy=closed -ProtectClock=yes -ProtectHostname=yes -ProtectProc=invisible -ProtectSystem=full -ProtectControlGroups=yes -ProtectKernelModules=yes -ProtectKernelTunables=yes -LockPersonality=yes -SystemCallArchitectures=native -SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap @cpu-emulation @privileged - -# Denying access to capabilities that should not be relevant for webapps -# Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html -CapabilityBoundingSet=~CAP_RAWIO CAP_MKNOD -CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE -CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_PACCT -CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK -CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM -CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG -CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE -CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW -CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG - [Install] WantedBy=multi-user.target \ No newline at end of file From 893daef1341bf7f7390cc474f19fdbe5bd71b210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Dec 2024 13:09:38 +0100 Subject: [PATCH 332/354] fix --- conf/systemd.service | 34 ---------------------------------- conf/watcher.service | 35 ----------------------------------- 2 files changed, 69 deletions(-) diff --git a/conf/systemd.service b/conf/systemd.service index 54bd669c..a1f18b54 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -10,39 +10,5 @@ Environment=ALLOW_SELF_SIGNED=true RuntimeDirectory=__APP__ ExecStart=__INSTALL_DIR__/apps/notify_push/bin/__ARCH__/notify_push __INSTALL_DIR__/config/config.php -### Depending on specificities of your service/app, you may need to tweak these -### .. but this should be a good baseline -# Sandboxing options to harden security -# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html -NoNewPrivileges=yes -PrivateTmp=yes -PrivateDevices=yes -RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK -RestrictNamespaces=yes -RestrictRealtime=yes -DevicePolicy=closed -ProtectClock=yes -ProtectHostname=yes -ProtectProc=invisible -ProtectSystem=full -ProtectControlGroups=yes -ProtectKernelModules=yes -ProtectKernelTunables=yes -LockPersonality=yes -SystemCallArchitectures=native -SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap @cpu-emulation @privileged - -# Denying access to capabilities that should not be relevant for webapps -# Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html -CapabilityBoundingSet=~CAP_RAWIO CAP_MKNOD -CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE -CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_PACCT -CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK -CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM -CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG -CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE -CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW -CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG - [Install] WantedBy = multi-user.target \ No newline at end of file diff --git a/conf/watcher.service b/conf/watcher.service index 5c7670c0..e2d9cfdf 100644 --- a/conf/watcher.service +++ b/conf/watcher.service @@ -8,43 +8,8 @@ StartLimitBurst=5 [Service] Type=oneshot -User=__APP__ ExecStartPre=/usr/bin/chmod u+x __INSTALL_DIR__/apps/notify_push/bin/__ARCH__/notify_push ExecStart=/usr/bin/systemctl restart __APP__-notify-push.service -### Depending on specificities of your service/app, you may need to tweak these -### .. but this should be a good baseline -# Sandboxing options to harden security -# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html -NoNewPrivileges=yes -PrivateTmp=yes -PrivateDevices=yes -RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK -RestrictNamespaces=yes -RestrictRealtime=yes -DevicePolicy=closed -ProtectClock=yes -ProtectHostname=yes -ProtectProc=invisible -ProtectSystem=full -ProtectControlGroups=yes -ProtectKernelModules=yes -ProtectKernelTunables=yes -LockPersonality=yes -SystemCallArchitectures=native -SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap @cpu-emulation @privileged - -# Denying access to capabilities that should not be relevant for webapps -# Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html -CapabilityBoundingSet=~CAP_RAWIO CAP_MKNOD -CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE -CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_PACCT -CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK -CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM -CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG -CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE -CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW -CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG - [Install] WantedBy=multi-user.target \ No newline at end of file From fc6f6d1d15120fba7fca0c3fcedaa2fa5d0e299b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 12 Dec 2024 15:52:59 +0100 Subject: [PATCH 333/354] cleaning --- scripts/remove | 1 - scripts/upgrade | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/scripts/remove b/scripts/remove index f7bb7cb2..c506c10c 100755 --- a/scripts/remove +++ b/scripts/remove @@ -23,7 +23,6 @@ if [ $enable_notify_push -eq 1 ]; then systemctl disable --now --quiet ${app}-notify-push-watcher.path ynh_safe_rm "/etc/systemd/system/${app}-notify-push-watcher.path" ynh_config_remove_systemd"${app}-notify-push-watcher" - fi # Remove a cron file diff --git a/scripts/upgrade b/scripts/upgrade index dcab5362..12fe5a7b 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -3,14 +3,14 @@ source _common.sh source /usr/share/yunohost/helpers -ynh_app_setting_set_default --key=php_upload_max_filesize --value=10G -ynh_app_setting_set_default --key=php_memory_limit --value=512M - #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= ynh_script_progression "Ensuring downward compatibility..." +ynh_app_setting_set_default --key=php_upload_max_filesize --value=10G +ynh_app_setting_set_default --key=php_memory_limit --value=512M + if [ -z ${system_addressbook_exposed:-} ]; then ynh_app_setting_set --key=system_addressbook_exposed --value=0 system_addressbook_exposed=0 From fb3b792407b499209a9539411045896e51b12012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 16 Dec 2024 18:42:22 +0100 Subject: [PATCH 334/354] cleaning --- scripts/_common.sh | 6 ++++++ scripts/change_url | 8 ++++---- scripts/config | 8 ++++---- scripts/install | 8 ++++---- scripts/restore | 8 ++++---- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 33c1736a..19c0decc 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,6 +4,12 @@ # COMMON VARIABLES AND CUSTOM HELPERS #================================================= +# Define a function to execute commands with `occ` +exec_occ() { + (cd "$install_dir" && ynh_exec_as_app \ + php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") +} + wait_nginx_reload() { # NGINX may take some time to support the new configuration, # wait for the Nextcloud configuration file to disappear from NGINX before checking the CalDAV/CardDAV URL. diff --git a/scripts/change_url b/scripts/change_url index 509b92dc..2277ed4f 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -29,10 +29,10 @@ ynh_config_change_url_nginx ynh_script_progression "Applying $app specific modifications..." # Define a function to execute commands with `occ` -exec_occ() { - (cd "$install_dir" && ynh_exec_as_app \ - php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -} +#exec_occ() { +# (cd "$install_dir" && ynh_exec_as_app \ +# php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") +#} if [ $change_domain -eq 1 ] then diff --git a/scripts/config b/scripts/config index fc45c353..447e3c34 100644 --- a/scripts/config +++ b/scripts/config @@ -10,10 +10,10 @@ source /usr/share/yunohost/helpers php_version=$(ynh_app_setting_get --key=php_version) current_fpm_footprint=$(ynh_app_setting_get --key=fpm_footprint) -exec_occ() { - (cd "$install_dir" && ynh_exec_as_app \ - php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -} +#exec_occ() { +# (cd "$install_dir" && ynh_exec_as_app \ +# php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") +#} #================================================= # SPECIFIC GETTERS FOR TOML SHORT KEY diff --git a/scripts/install b/scripts/install index ff68747b..eb866c50 100755 --- a/scripts/install +++ b/scripts/install @@ -66,10 +66,10 @@ ynh_config_add_nginx ynh_script_progression "Installing $app..." # Define a function to execute commands with `occ` -exec_occ() { - (cd "$install_dir" && ynh_exec_as_app \ - php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -} +#exec_occ() { +# (cd "$install_dir" && ynh_exec_as_app \ +# php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") +#} # Set write access for the following commands chown -R $app:www-data "$install_dir" diff --git a/scripts/restore b/scripts/restore index 3018f6e4..649374e3 100755 --- a/scripts/restore +++ b/scripts/restore @@ -146,10 +146,10 @@ ynh_systemctl --service=nginx --action=reload # CHECK IF NOTIFY_PUSH WORKS #================================================= -exec_occ() { - (cd "$install_dir" && ynh_exec_as_app \ - php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -} +#exec_occ() { +# (cd "$install_dir" && ynh_exec_as_app \ +# php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") +#} if [ $enable_notify_push -eq 1 ] then From d2da1e9ebfa9736b9cc634f28ceb3d1cd3a53803 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 16 Dec 2024 22:02:56 +0100 Subject: [PATCH 335/354] cleaning --- scripts/change_url | 6 - scripts/config | 6 - scripts/install | 6 - scripts/remove | 1 - scripts/restore | 66 ++++------ scripts/upgrade | 301 ++++++++++++++++++++++----------------------- 6 files changed, 171 insertions(+), 215 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 2277ed4f..449c14b4 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -28,12 +28,6 @@ ynh_config_change_url_nginx #================================================= ynh_script_progression "Applying $app specific modifications..." -# Define a function to execute commands with `occ` -#exec_occ() { -# (cd "$install_dir" && ynh_exec_as_app \ -# php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -#} - if [ $change_domain -eq 1 ] then # Change the trusted domain diff --git a/scripts/config b/scripts/config index 447e3c34..a2939758 100644 --- a/scripts/config +++ b/scripts/config @@ -8,12 +8,6 @@ source /usr/share/yunohost/helpers #================================================= php_version=$(ynh_app_setting_get --key=php_version) -current_fpm_footprint=$(ynh_app_setting_get --key=fpm_footprint) - -#exec_occ() { -# (cd "$install_dir" && ynh_exec_as_app \ -# php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -#} #================================================= # SPECIFIC GETTERS FOR TOML SHORT KEY diff --git a/scripts/install b/scripts/install index eb866c50..fc02e04e 100755 --- a/scripts/install +++ b/scripts/install @@ -65,12 +65,6 @@ ynh_config_add_nginx #================================================= ynh_script_progression "Installing $app..." -# Define a function to execute commands with `occ` -#exec_occ() { -# (cd "$install_dir" && ynh_exec_as_app \ -# php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -#} - # Set write access for the following commands chown -R $app:www-data "$install_dir" chown -R $app: "$data_dir" diff --git a/scripts/remove b/scripts/remove index 5a5ed392..5f0f2dff 100755 --- a/scripts/remove +++ b/scripts/remove @@ -27,7 +27,6 @@ if [ $enable_notify_push -eq 1 ]; then fi # Remove a cron file -# TODO: Ensure that cron job is not running (How !?) ynh_safe_rm "/etc/cron.d/$app" # Cleaning ACL in home directories diff --git a/scripts/restore b/scripts/restore index 649374e3..1eca4070 100755 --- a/scripts/restore +++ b/scripts/restore @@ -10,6 +10,13 @@ ynh_script_progression "Restoring the app main directory..." ynh_restore "$install_dir" +#================================================= +# RESTORE THE DATA DIRECTORY +#================================================= +ynh_script_progression "Restoring data directory..." + +ynh_restore "$data_dir" + #================================================= # RESTORE THE POSTGRESQL DATABASE #================================================= @@ -18,14 +25,12 @@ ynh_script_progression "Restoring the PostgreSQL database..." ynh_psql_db_shell < ./db.sql #================================================= -# RESTORE THE PHP-FPM CONFIGURATION +# RESTORE SYSTEM CONFIGURATIONS #================================================= -ynh_script_progression "Reconfiguring PHP-FPM..." +ynh_script_progression "Restoring system configurations related to $app..." -# Restore the file first, so it can have a backup if different ynh_restore "/etc/php/$php_version/fpm/pool.d/$app.conf" -# Recreate a dedicated PHP-FPM config ynh_config_add_phpfpm #================================================= @@ -44,32 +49,26 @@ then sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "/etc/nginx/conf.d/$domain.d/$app.conf" fi -#================================================= -# RESTORE THE CRON FILE -#================================================= -ynh_script_progression "Restoring cron job..." +ynh_restore "/etc/logrotate.d/$app" -ynh_restore "/etc/cron.d/$app" +ynh_restore "/etc/fail2ban/jail.d/$app.conf" +ynh_restore "/etc/fail2ban/filter.d/$app.conf" -#================================================= -# RESTORE LOGS -#================================================= +# Make sure a log file exists (mostly for CI tests) +if [ ! -f "/var/log/$app/nextcloud.log" ]; then + touch "/var/log/$app/nextcloud.log" + chown "$app:" "/var/log/$app/nextcloud.log" +fi -ynh_restore "/var/log/$app" +ynh_systemctl --action=restart --service=fail2ban #================================================= -# RESTORE THE LOGROTATE CONFIGURATION +# RESTORE VARIOUS FILES #================================================= -ynh_script_progression "Restoring the logrotate configuration..." - -ynh_restore "/etc/logrotate.d/$app" -#================================================= -# RESTORE THE DATA DIRECTORY -#================================================= -ynh_script_progression "Restoring data directory..." +ynh_restore "/etc/cron.d/$app" -ynh_restore "$data_dir" +ynh_restore "/var/log/$app" #================================================= # RESTORE USER RIGHTS @@ -100,26 +99,10 @@ ynh_script_progression "Adding multimedia directories..." # Build YunoHost multimedia directories ynh_multimedia_build_main_dir + # Allow nextcloud to write into these directories ynh_multimedia_addaccess $app -#================================================= -# RESTORE THE FAIL2BAN CONFIGURATION -#================================================= -ynh_script_progression "Restoring the Fail2Ban configuration..." - -ynh_restore "/etc/fail2ban/jail.d/$app.conf" -ynh_restore "/etc/fail2ban/filter.d/$app.conf" - -# Make sure a log file exists (mostly for CI tests) -logfile="/var/log/$app/nextcloud.log" -if [ ! -f "$logfile" ]; then - touch "$logfile" - chown "$app:" "$logfile" -fi - -ynh_systemctl --action=restart --service=fail2ban - #================================================= # RESTORE THE NOTIFY_PUSH APP #================================================= @@ -146,11 +129,6 @@ ynh_systemctl --service=nginx --action=reload # CHECK IF NOTIFY_PUSH WORKS #================================================= -#exec_occ() { -# (cd "$install_dir" && ynh_exec_as_app \ -# php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -#} - if [ $enable_notify_push -eq 1 ] then count=0 diff --git a/scripts/upgrade b/scripts/upgrade index f99bfefb..9388ba8d 100755 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -157,8 +157,6 @@ function list_installed_apps_not_compatible_with_future_version() comm -23 <(comm -23 $installed_apps $core_apps_in_current_version) $nextcloud_destination_appcatalog } - - if [[ "$last_major_version" != "$current_major_version" ]] then installed_apps_not_compatible_with_future_version="$(list_installed_apps_not_compatible_with_future_version $last_major_version)" @@ -168,183 +166,182 @@ then fi fi -# FIXME: this is still supported but the recommendation is now to *always* re-setup the app sources wether or not the upstream sources changed -if ynh_app_upstream_version_changed -then - ynh_script_progression "Upgrading $app..." +#================================================= +# UPGRADE NEXTCLOUD +#================================================= +ynh_script_progression "Upgrading $app..." - # Set write access for the following commands - chown -R $app:www-data "$install_dir" - # Print the current version number of Nextcloud - exec_occ -V +# Set write access for the following commands +chown -R $app:www-data "$install_dir" +# Print the current version number of Nextcloud +exec_occ -V + +# Upgrade may fail if this app is enabled +# Take all apps enabled, and check if mail is one of them +# Then temporary disable the mail app +mail_app_must_be_reactived=0 + +if exec_occ app:list | awk '/Enabled/{f=1;next} /Disabled/{f=0} f' | grep -q -w mail; then + exec_occ app:disable mail + mail_app_must_be_reactived=1 +fi - # Upgrade may fail if this app is enabled - # Take all apps enabled, and check if mail is one of them - # Then temporary disable the mail app - mail_app_must_be_reactived=0 +# While the current version is not the last version, do an upgrade +while [ "$last_version" != "$current_version" ] +do - if exec_occ app:list | awk '/Enabled/{f=1;next} /Disabled/{f=0} f' | grep -q -w mail; then - exec_occ app:disable mail - mail_app_must_be_reactived=1 + next_major_version="$(( $current_major_version + 1 ))" + if [[ "$next_major_version" -ge "$last_major_version" ]]; then + ynh_print_info "Upgrading to Nextcloud $last_version" + source_id="main" + else + ynh_print_info "Upgrading to Nextcloud $next_major_version" + source_id="$next_major_version" fi - # While the current version is not the last version, do an upgrade - while [ "$last_version" != "$current_version" ] - do + # Create a temporary directory + tmpdir="${install_dir}__tmp_upgrade" - next_major_version="$(( $current_major_version + 1 ))" - if [[ "$next_major_version" -ge "$last_major_version" ]]; then - ynh_print_info "Upgrading to Nextcloud $last_version" - source_id="main" - else - ynh_print_info "Upgrading to Nextcloud $next_major_version" - source_id="$next_major_version" - fi + ynh_setup_source --dest_dir="$tmpdir" --source_id="$source_id" - # Create a temporary directory - tmpdir="${install_dir}__tmp_upgrade" - - ynh_setup_source --dest_dir="$tmpdir" --source_id="$source_id" - - # Backup the config file in the temp dir - cp -a "$install_dir/config/config.php" "$tmpdir/config/config.php" - - # Enable maintenance mode - exec_occ maintenance:mode --on - - # Backup 3rd party applications from the current Nextcloud - # But do not overwrite if there is any upgrade - # (apps directory already exists in Nextcloud archive) - ( - cd $install_dir/apps - for nc_app_dir in */ - do - if [ ! -d "$tmpdir/apps/$nc_app_dir" ] - then - cp -a "$nc_app_dir" "$tmpdir/apps/$nc_app_dir" - fi - done - ) - - # Replace the old Nextcloud by the new one - ynh_safe_rm "$install_dir" - mv "$tmpdir" "$install_dir" - - # Set write access for the following commands - chown -R $app:www-data "$install_dir" - # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) - exec_occ maintenance:mode --off - exec_occ upgrade || [ $? -eq 3 ] || ynh_die "Unable to upgrade $app" - - # Get the new current version number - current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) - current_major_version=${current_version%%.*} - - # Print the current version number of Nextcloud - exec_occ -V + # Backup the config file in the temp dir + cp -a "$install_dir/config/config.php" "$tmpdir/config/config.php" + + # Enable maintenance mode + exec_occ maintenance:mode --on + + # Backup 3rd party applications from the current Nextcloud + # But do not overwrite if there is any upgrade + # (apps directory already exists in Nextcloud archive) + ( + cd $install_dir/apps + for nc_app_dir in */ + do + if [ ! -d "$tmpdir/apps/$nc_app_dir" ] + then + cp -a "$nc_app_dir" "$tmpdir/apps/$nc_app_dir" + fi done + ) - exec_occ db:add-missing-indices -n - exec_occ db:add-missing-columns -n - exec_occ db:add-missing-primary-keys -n - exec_occ db:convert-filecache-bigint -n + # Replace the old Nextcloud by the new one + ynh_safe_rm "$install_dir" + mv "$tmpdir" "$install_dir" - #================================================= - # CONFIGURE NEXTCLOUD - #================================================= - ynh_script_progression "Reconfiguring $app..." + # Set write access for the following commands + chown -R $app:www-data "$install_dir" + # Upgrade Nextcloud (SUCCESS = 0, UP_TO_DATE = 3) + exec_occ maintenance:mode --off + exec_occ upgrade || [ $? -eq 3 ] || ynh_die "Unable to upgrade $app" - # Verify the checksum and backup the file if it's different - ynh_backup_if_checksum_is_different "$install_dir/config/config.php" + # Get the new current version number + current_version=$(grep OC_VersionString "$install_dir/version.php" | cut -d\' -f2) + current_major_version=${current_version%%.*} - nc_conf="${install_dir}/config.json" - ynh_config_add --template="config.json" --destination="$nc_conf" + # Print the current version number of Nextcloud + exec_occ -V +done - # Reneable the mail app - if [ $mail_app_must_be_reactived -eq 1 ]; then - exec_occ app:enable mail - fi +exec_occ db:add-missing-indices -n +exec_occ db:add-missing-columns -n +exec_occ db:add-missing-primary-keys -n +exec_occ db:convert-filecache-bigint -n - # Ensure that UpdateNotification app is disabled - exec_occ app:disable updatenotification +#================================================= +# CONFIGURE NEXTCLOUD +#================================================= +ynh_script_progression "Reconfiguring $app..." - # Enable LDAP plugin - exec_occ app:enable user_ldap +# Verify the checksum and backup the file if it's different +ynh_backup_if_checksum_is_different "$install_dir/config/config.php" - # Update all installed apps - exec_occ app:update --all +nc_conf="${install_dir}/config.json" +ynh_config_add --template="config.json" --destination="$nc_conf" - # move the logs from the data_dir to the standard /var/log - # it would be better in the ENSURE DOWNWARD COMPATIBILITY section - # but it must be after the exec_occ() definition, so it's here - if [ -f "$data_dir/data/nextcloud.log" ]; then - mkdir -p "/var/log/$app" - chmod 750 "/var/log/$app" - mv "$data_dir"/data/nextcloud.log* "/var/log/$app" - # adapt the nextcloud config - exec_occ config:system:set logfile --value="/var/log/$app/nextcloud.log" - fi +# Reneable the mail app +if [ $mail_app_must_be_reactived -eq 1 ]; then + exec_occ app:enable mail +fi - # Load the config file in nextcloud - exec_occ config:import "$nc_conf" +# Ensure that UpdateNotification app is disabled +exec_occ app:disable updatenotification - # Then remove the config file - ynh_safe_rm "$nc_conf" +# Enable LDAP plugin +exec_occ app:enable user_ldap - # Occasionally new mimetypes are added to better handle certain file types. - # Migrating the mimetypes take a long time on larger instances - # so this is not done automatically during upgrades. - exec_occ maintenance:repair --include-expensive +# Update all installed apps +exec_occ app:update --all - #================================================= - # ALLOW USERS TO DISCONNECT FROM NEXTCLOUD - #================================================= +# move the logs from the data_dir to the standard /var/log +# it would be better in the ENSURE DOWNWARD COMPATIBILITY section +# but it must be after the exec_occ() definition, so it's here +if [ -f "$data_dir/data/nextcloud.log" ]; then + mkdir -p "/var/log/$app" + chmod 750 "/var/log/$app" + mv "$data_dir"/data/nextcloud.log* "/var/log/$app" + # adapt the nextcloud config + exec_occ config:system:set logfile --value="/var/log/$app/nextcloud.log" +fi - # Add dynamic logout URL to the config - url_base64="$(echo -n "https://$domain$path" | base64)" - old_logout_url="https://$(cat /etc/yunohost/current_host)/yunohost/sso/?action=logout" - current_logout_url="$(exec_occ config:system:get logout_url 2> /dev/null)" - if [[ "$current_logout_url" == "${old_logout_url}" ]] || [[ "$current_logout_url" == "" ]] - then - echo " - //-YunoHost- - // set logout_url according to main domain - \$main_domain = file_get_contents('/etc/yunohost/current_host'); - \$CONFIG['logout_url'] = 'https://'.\$main_domain.'/yunohost/sso/?action=logout&r=${url_base64}'; - //-YunoHost- - " >> "$install_dir/config/config.php" - fi +# Load the config file in nextcloud +exec_occ config:import "$nc_conf" - #================================================= - # CHANGE HOSTNAME FOR ACTIVITY NOTIFICATIONS - #================================================= - - exec_occ config:system:set overwrite.cli.url --value="https://${domain}${path}" - - #================================================= - # MOUNT HOME FOLDERS AS EXTERNAL STORAGE - #================================================= - - # Enable External Storage and create local mount to home folder as needed - if [ $user_home -eq 1 ]; then - exec_occ app:enable files_external - exec_occ files_external:list --output=json \ - | grep -q '"storage":"\\\\OC\\\\Files\\\\Storage\\\\Local"' \ - || create_external_storage "/home/\$user" "Home" - # Iterate over users to extend their home folder permissions - for u in $(ynh_user_list); do - setfacl --modify g:$app:rwx "/home/$u" || true - done - fi +# Then remove the config file +ynh_safe_rm "$nc_conf" - #================================================= - # STORE THE CHECKSUM OF THE CONFIG FILE - #================================================= +# Occasionally new mimetypes are added to better handle certain file types. +# Migrating the mimetypes take a long time on larger instances +# so this is not done automatically during upgrades. +exec_occ maintenance:repair --include-expensive - # Calculate and store the config file checksum into the app settings - ynh_store_file_checksum "${install_dir}/config/config.php" +#================================================= +# ALLOW USERS TO DISCONNECT FROM NEXTCLOUD +#================================================= + +# Add dynamic logout URL to the config +url_base64="$(echo -n "https://$domain$path" | base64)" +old_logout_url="https://$(cat /etc/yunohost/current_host)/yunohost/sso/?action=logout" +current_logout_url="$(exec_occ config:system:get logout_url 2> /dev/null)" +if [[ "$current_logout_url" == "${old_logout_url}" ]] || [[ "$current_logout_url" == "" ]] +then + echo " +//-YunoHost- +// set logout_url according to main domain +\$main_domain = file_get_contents('/etc/yunohost/current_host'); +\$CONFIG['logout_url'] = 'https://'.\$main_domain.'/yunohost/sso/?action=logout&r=${url_base64}'; +//-YunoHost- + " >> "$install_dir/config/config.php" fi +#================================================= +# CHANGE HOSTNAME FOR ACTIVITY NOTIFICATIONS +#================================================= + +exec_occ config:system:set overwrite.cli.url --value="https://${domain}${path}" + +#================================================= +# MOUNT HOME FOLDERS AS EXTERNAL STORAGE +#================================================= + +# Enable External Storage and create local mount to home folder as needed +if [ $user_home -eq 1 ]; then + exec_occ app:enable files_external + exec_occ files_external:list --output=json \ + | grep -q '"storage":"\\\\OC\\\\Files\\\\Storage\\\\Local"' \ + || create_external_storage "/home/\$user" "Home" + # Iterate over users to extend their home folder permissions + for u in $(ynh_user_list); do + setfacl --modify g:$app:rwx "/home/$u" || true + done +fi + +#================================================= +# STORE THE CHECKSUM OF THE CONFIG FILE +#================================================= + +# Calculate and store the config file checksum into the app settings +ynh_store_file_checksum "${install_dir}/config/config.php" + #================================================= # REGEN PERMISSIONS #================================================= From 76389919e84e84a08c0d2c128ac0f78fc1f72bad Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 16 Dec 2024 23:19:12 +0100 Subject: [PATCH 336/354] Update restore --- scripts/restore | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/scripts/restore b/scripts/restore index 1eca4070..52b47ff1 100755 --- a/scripts/restore +++ b/scripts/restore @@ -49,26 +49,25 @@ then sed --in-place --regexp-extended '/location = \/\.well\-known\/(caldav|carddav)/d' "/etc/nginx/conf.d/$domain.d/$app.conf" fi -ynh_restore "/etc/logrotate.d/$app" +#================================================= +# RESTORE THE CRON FILE +#================================================= +ynh_script_progression "Restoring cron job..." -ynh_restore "/etc/fail2ban/jail.d/$app.conf" -ynh_restore "/etc/fail2ban/filter.d/$app.conf" +ynh_restore "/etc/cron.d/$app" -# Make sure a log file exists (mostly for CI tests) -if [ ! -f "/var/log/$app/nextcloud.log" ]; then - touch "/var/log/$app/nextcloud.log" - chown "$app:" "/var/log/$app/nextcloud.log" -fi +#================================================= +# RESTORE LOGS +#================================================= -ynh_systemctl --action=restart --service=fail2ban +ynh_restore "/var/log/$app" #================================================= -# RESTORE VARIOUS FILES +# RESTORE THE LOGROTATE CONFIGURATION #================================================= +ynh_script_progression "Restoring the logrotate configuration..." -ynh_restore "/etc/cron.d/$app" - -ynh_restore "/var/log/$app" +ynh_restore "/etc/logrotate.d/$app" #================================================= # RESTORE USER RIGHTS @@ -103,6 +102,23 @@ ynh_multimedia_build_main_dir # Allow nextcloud to write into these directories ynh_multimedia_addaccess $app +#================================================= +# RESTORE THE FAIL2BAN CONFIGURATION +#================================================= +ynh_script_progression "Restoring the Fail2Ban configuration..." + +ynh_restore "/etc/fail2ban/jail.d/$app.conf" +ynh_restore "/etc/fail2ban/filter.d/$app.conf" + +# Make sure a log file exists (mostly for CI tests) +logfile="/var/log/$app/nextcloud.log" +if [ ! -f "$logfile" ]; then + touch "$logfile" + chown "$app:" "$logfile" +fi + +ynh_systemctl --action=restart --service=fail2ban + #================================================= # RESTORE THE NOTIFY_PUSH APP #================================================= From 21f3762dca41f3e68fa6d2e679078bb5689afb39 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Dec 2024 09:23:52 +0100 Subject: [PATCH 337/354] Update nginx.conf --- conf/nginx.conf | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 8edb5581..66b2f3a6 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,10 +1,11 @@ -# Add .mjs as a file extension for javascript +# Set .mjs and .wasm MIME types # Either include it in the default mime.types list -# or include you can include that list explicitly and add the file extension +# and include that list explicitly or add the file extension # only for Nextcloud like below: include mime.types; types { text/javascript mjs; + application/wasm wasm; } location ^~ /.well-known { @@ -54,8 +55,15 @@ location ^~ __PATH__/ { # for tunning hints client_body_buffer_size 512k; - # HTTP response headers borrowed from Nextcloud `.htaccess` + # HSTS settings + # WARNING: Only add the preload option once you read about + # the consequences in https://hstspreload.org/. This option + # will add the domain to a hardcoded list that is shipped + # in all major browsers and getting removed from this list + # could take several months. #more_set_headers "Strict-Transport-Security: max-age=15768000; includeSubDomains; preload;"; + + # HTTP response headers borrowed from Nextcloud `.htaccess` more_set_headers "Referrer-Policy: no-referrer"; more_set_headers "X-Content-Type-Options: nosniff"; more_set_headers "X-Download-Options: noopen"; @@ -139,11 +147,16 @@ location ^~ __PATH__/ { # Serve static files location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { try_files $uri / __PATH__/index.php$request_uri; - expires 6M; # Cache-Control policy borrowed from `.htaccess` + # HTTP response headers borrowed from Nextcloud `.htaccess` + #more_set_headers "Cache-Control: public, max-age=15778463$asset_immutable"; + #more_set_headers "Referrer-Policy: no-referrer"; + #more_set_headers "X-Content-Type-Options: nosniff"; + #more_set_headers "X-Frame-Options: SAMEORIGIN"; + #more_set_headers "X-Permitted-Cross-Domain-Policies: none"; + #more_set_headers "X-Robots-Tag: noindex, nofollow"; + #more_set_headersr "X-XSS-Protection: 1; mode=block"; + #expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets - - location ~ \.wasm$ { - default_type application/wasm; } } From ccb285287b22a7c3ac2f851e0a59f42916e86aa5 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:11:32 +0100 Subject: [PATCH 338/354] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 66b2f3a6..66a683be 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -154,7 +154,7 @@ location ^~ __PATH__/ { #more_set_headers "X-Frame-Options: SAMEORIGIN"; #more_set_headers "X-Permitted-Cross-Domain-Policies: none"; #more_set_headers "X-Robots-Tag: noindex, nofollow"; - #more_set_headersr "X-XSS-Protection: 1; mode=block"; + #more_set_headers "X-XSS-Protection: 1; mode=block"; #expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets } From d7f97a773d1e1963951c29a6f8a7a031e763b4f0 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:15:29 +0100 Subject: [PATCH 339/354] Update nginx.conf --- conf/nginx.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 66a683be..faf6ee6b 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -157,7 +157,6 @@ location ^~ __PATH__/ { #more_set_headers "X-XSS-Protection: 1; mode=block"; #expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets - } } location ~ \.(otf|woff2?)$ { From c159f38014bd135ebf29172a2a3126a73acd36f0 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:26:02 +0100 Subject: [PATCH 340/354] Update nginx.conf --- conf/nginx.conf | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index faf6ee6b..9d76dd48 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,11 +1,10 @@ -# Set .mjs and .wasm MIME types +# Set .mjs MIME types # Either include it in the default mime.types list # and include that list explicitly or add the file extension # only for Nextcloud like below: include mime.types; types { text/javascript mjs; - application/wasm wasm; } location ^~ /.well-known { @@ -148,21 +147,20 @@ location ^~ __PATH__/ { location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { try_files $uri / __PATH__/index.php$request_uri; # HTTP response headers borrowed from Nextcloud `.htaccess` - #more_set_headers "Cache-Control: public, max-age=15778463$asset_immutable"; - #more_set_headers "Referrer-Policy: no-referrer"; - #more_set_headers "X-Content-Type-Options: nosniff"; - #more_set_headers "X-Frame-Options: SAMEORIGIN"; - #more_set_headers "X-Permitted-Cross-Domain-Policies: none"; - #more_set_headers "X-Robots-Tag: noindex, nofollow"; - #more_set_headers "X-XSS-Protection: 1; mode=block"; - #expires 6M; # Cache-Control policy borrowed from `.htaccess` - access_log off; # Optional: Don't log access to assets + more_set_headers "Referrer-Policy: no-referrer"; + more_set_headers "X-Content-Type-Options: nosniff"; + more_set_headers "X-Frame-Options: SAMEORIGIN"; + more_set_headers "X-Permitted-Cross-Domain-Policies: none"; + more_set_headers "X-Robots-Tag: noindex, nofollow"; + more_set_headers "X-XSS-Protection: 1; mode=block"; + expires 6M; # Cache-Control policy borrowed from `.htaccess` + access_log off; # Optional: Don't log access to assets } location ~ \.(otf|woff2?)$ { try_files $uri / __PATH__/index.php$request_uri; - expires 7d; # Cache-Control policy borrowed from `.htaccess` - access_log off; # Optional: Don't log access to assets + expires 7d; # Cache-Control policy borrowed from `.htaccess` + access_log off; # Optional: Don't log access to assets } # Rule borrowed from `.htaccess` From a0cd8e2d4c802d727a9f521fa90cd1d1b870493b Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:31:03 +0100 Subject: [PATCH 341/354] Update nginx.conf --- conf/nginx.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 9d76dd48..a3fce304 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -147,13 +147,14 @@ location ^~ __PATH__/ { location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { try_files $uri / __PATH__/index.php$request_uri; # HTTP response headers borrowed from Nextcloud `.htaccess` + more_set_headers "Cache-Control : public, max-age=31536000, immutable"; # Cache 1 year more_set_headers "Referrer-Policy: no-referrer"; more_set_headers "X-Content-Type-Options: nosniff"; more_set_headers "X-Frame-Options: SAMEORIGIN"; more_set_headers "X-Permitted-Cross-Domain-Policies: none"; more_set_headers "X-Robots-Tag: noindex, nofollow"; more_set_headers "X-XSS-Protection: 1; mode=block"; - expires 6M; # Cache-Control policy borrowed from `.htaccess` + #expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets } From 8b0d66087a8a9ea0be0e3a5f4d05613df85d082b Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:31:23 +0100 Subject: [PATCH 342/354] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index a3fce304..8aa98ef2 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -147,7 +147,7 @@ location ^~ __PATH__/ { location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { try_files $uri / __PATH__/index.php$request_uri; # HTTP response headers borrowed from Nextcloud `.htaccess` - more_set_headers "Cache-Control : public, max-age=31536000, immutable"; # Cache 1 year + more_set_headers "Cache-Control: public, max-age=31536000, immutable"; # Cache 1 year more_set_headers "Referrer-Policy: no-referrer"; more_set_headers "X-Content-Type-Options: nosniff"; more_set_headers "X-Frame-Options: SAMEORIGIN"; From 9f434e513e3fe8195cad99c9cc3fda5036fab4da Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:41:13 +0100 Subject: [PATCH 343/354] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 8aa98ef2..7fa59706 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -147,7 +147,7 @@ location ^~ __PATH__/ { location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { try_files $uri / __PATH__/index.php$request_uri; # HTTP response headers borrowed from Nextcloud `.htaccess` - more_set_headers "Cache-Control: public, max-age=31536000, immutable"; # Cache 1 year + more_set_headers "Cache-Control: public, max-age=15778463, immutable"; more_set_headers "Referrer-Policy: no-referrer"; more_set_headers "X-Content-Type-Options: nosniff"; more_set_headers "X-Frame-Options: SAMEORIGIN"; From 6e5bf97053647229fa28b11423f277d186eb29ab Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:41:45 +0100 Subject: [PATCH 344/354] Update nginx.conf --- conf/nginx.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 7fa59706..143bfdef 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -154,7 +154,6 @@ location ^~ __PATH__/ { more_set_headers "X-Permitted-Cross-Domain-Policies: none"; more_set_headers "X-Robots-Tag: noindex, nofollow"; more_set_headers "X-XSS-Protection: 1; mode=block"; - #expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets } From e785d25614275a0894ec0bbbec60cc85377312b9 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Dec 2024 17:43:58 +0100 Subject: [PATCH 345/354] add headers (#763) * add headers * Update conf/nginx.conf Co-authored-by: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> --------- Co-authored-by: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> --- conf/nginx.conf | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 8edb5581..0b6c2fd1 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -139,12 +139,16 @@ location ^~ __PATH__/ { # Serve static files location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { try_files $uri / __PATH__/index.php$request_uri; - expires 6M; # Cache-Control policy borrowed from `.htaccess` - access_log off; # Optional: Don't log access to assets - - location ~ \.wasm$ { - default_type application/wasm; - } + # Adapted from https://github.com/nextcloud/documentation/blob/master/admin_manual/installation/nginx-root.conf.sample + # HTTP response headers borrowed from Nextcloud `.htaccess` + more_set_headers "Cache-Control: public, max-age=15778463, immutable"; + more_set_headers "Referrer-Policy: no-referrer"; + more_set_headers "X-Content-Type-Options: nosniff"; + more_set_headers "X-Frame-Options: SAMEORIGIN"; + more_set_headers "X-Permitted-Cross-Domain-Policies: none"; + more_set_headers "X-Robots-Tag: noindex, nofollow"; + more_set_headers "X-XSS-Protection: 1; mode=block"; + access_log off; # Optional: Don't log access to assets } location ~ \.(otf|woff2?)$ { From 2a8269b1dc4420c6cfe0f54e318d0c1b25a85bbc Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Dec 2024 18:29:27 +0100 Subject: [PATCH 346/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index c11eb993..6f32edfd 100644 --- a/manifest.toml +++ b/manifest.toml @@ -19,7 +19,7 @@ code = "https://github.com/nextcloud/server" cpe = "cpe:2.3:a:nextcloud:nextcloud" [integration] -yunohost = ">= 12.0.8.2" +yunohost = ">= 12.0.9" helpers_version = "2.1" architectures = ["amd64", "arm64", "armhf"] multi_instance = true From cc6a64f193ee16e7262aac6a824030879d6711c1 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Dec 2024 18:29:42 +0100 Subject: [PATCH 347/354] Update manifest.toml --- manifest.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.toml b/manifest.toml index eb0b9f2b..db4ff1e3 100644 --- a/manifest.toml +++ b/manifest.toml @@ -19,7 +19,7 @@ code = "https://github.com/nextcloud/server" cpe = "cpe:2.3:a:nextcloud:nextcloud" [integration] -yunohost = ">= 12.0.8.2" +yunohost = ">= 12.0.9" helpers_version = "2.1" architectures = ["amd64", "arm64", "armhf"] multi_instance = true From 43aae5d97731e8ce1315e285c1eaca78a4bdc885 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 17 Dec 2024 23:52:16 +0100 Subject: [PATCH 348/354] Update nginx.conf --- conf/nginx.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 36d145dd..12cbaabf 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -146,7 +146,6 @@ location ^~ __PATH__/ { # Serve static files location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ { try_files $uri / __PATH__/index.php$request_uri; - # Adapted from https://github.com/nextcloud/documentation/blob/master/admin_manual/installation/nginx-root.conf.sample # HTTP response headers borrowed from Nextcloud `.htaccess` more_set_headers "Cache-Control: public, max-age=15778463, immutable"; From f6be830d67c02b8ceab24fbfded266acde842215 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Wed, 18 Dec 2024 18:36:38 +0100 Subject: [PATCH 349/354] Update tests.toml Co-authored-by: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> --- tests.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests.toml b/tests.toml index 3af71181..3b5943a1 100644 --- a/tests.toml +++ b/tests.toml @@ -8,8 +8,8 @@ test_format = 1.0 # Commits to test upgrade from # ------------------------------- - #test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" - #test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" + test_upgrade_from.c5cf91ad.name = "Upgrade from 25.0.2" + test_upgrade_from.caf917f3.name = "Upgrade from 26.0.2" test_upgrade_from.9c6d1eea.name = "Upgrade from 27.1.4" test_upgrade_from.e9f82ab7.name = "Upgrade from 28.0.6" test_upgrade_from.541f5fde.name = "Upgrade from 29.0.8" From 0add99d5e010644ddf270c530b78b84836d0a12c Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:07:17 +0100 Subject: [PATCH 350/354] move function to common.sh (#764) * move function to common.sh * Update config --- scripts/_common.sh | 6 ++++++ scripts/change_url | 6 ------ scripts/config | 6 ------ scripts/install | 6 ------ scripts/restore | 5 ----- 5 files changed, 6 insertions(+), 23 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 33c1736a..19c0decc 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,6 +4,12 @@ # COMMON VARIABLES AND CUSTOM HELPERS #================================================= +# Define a function to execute commands with `occ` +exec_occ() { + (cd "$install_dir" && ynh_exec_as_app \ + php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") +} + wait_nginx_reload() { # NGINX may take some time to support the new configuration, # wait for the Nextcloud configuration file to disappear from NGINX before checking the CalDAV/CardDAV URL. diff --git a/scripts/change_url b/scripts/change_url index 509b92dc..449c14b4 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -28,12 +28,6 @@ ynh_config_change_url_nginx #================================================= ynh_script_progression "Applying $app specific modifications..." -# Define a function to execute commands with `occ` -exec_occ() { - (cd "$install_dir" && ynh_exec_as_app \ - php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -} - if [ $change_domain -eq 1 ] then # Change the trusted domain diff --git a/scripts/config b/scripts/config index fc45c353..a2939758 100644 --- a/scripts/config +++ b/scripts/config @@ -8,12 +8,6 @@ source /usr/share/yunohost/helpers #================================================= php_version=$(ynh_app_setting_get --key=php_version) -current_fpm_footprint=$(ynh_app_setting_get --key=fpm_footprint) - -exec_occ() { - (cd "$install_dir" && ynh_exec_as_app \ - php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -} #================================================= # SPECIFIC GETTERS FOR TOML SHORT KEY diff --git a/scripts/install b/scripts/install index cd270cc0..69d7ddce 100755 --- a/scripts/install +++ b/scripts/install @@ -72,12 +72,6 @@ ynh_config_add_nginx #================================================= ynh_script_progression "Installing $app..." -# Define a function to execute commands with `occ` -exec_occ() { - (cd "$install_dir" && ynh_exec_as_app \ - php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -} - # Set write access for the following commands chown -R $app:www-data "$install_dir" chown -R $app: "$data_dir" diff --git a/scripts/restore b/scripts/restore index 9be6e2b8..1ed03c8e 100755 --- a/scripts/restore +++ b/scripts/restore @@ -146,11 +146,6 @@ ynh_systemctl --service=nginx --action=reload # CHECK IF NOTIFY_PUSH WORKS #================================================= -exec_occ() { - (cd "$install_dir" && ynh_exec_as_app \ - php${php_version} --define apc.enable_cli=1 occ --no-interaction --no-ansi "$@") -} - if [ $enable_notify_push -eq 1 ] then count=0 From 1e41918c6c02951d6e1ec9254d21003990755972 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:11:25 +0100 Subject: [PATCH 351/354] add default_phone_region --- conf/config.json | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/config.json b/conf/config.json index bb800325..0063ee9a 100644 --- a/conf/config.json +++ b/conf/config.json @@ -14,6 +14,7 @@ "hashing_default_password": true, "localstorage.allowsymlinks": true, "simpleSignUpLink.shown": false, + "default_phone_region": "", "maintenance_window_start": 1, "mail_smtpmode": "smtp", "mail_smtpport": "25", From f7a653d0841a4c5e811a3d12ac1e9996f73aad1c Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:14:24 +0100 Subject: [PATCH 352/354] Update nginx.conf --- conf/nginx.conf | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 0b6c2fd1..f521457e 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,6 +1,7 @@ -# Add .mjs as a file extension for javascript +# Set .mjs MIME types # Either include it in the default mime.types list # or include you can include that list explicitly and add the file extension +# and include that list explicitly or add the file extension # only for Nextcloud like below: include mime.types; types { @@ -54,8 +55,15 @@ location ^~ __PATH__/ { # for tunning hints client_body_buffer_size 512k; - # HTTP response headers borrowed from Nextcloud `.htaccess` + # HSTS settings + # WARNING: Only add the preload option once you read about + # the consequences in https://hstspreload.org/. This option + # will add the domain to a hardcoded list that is shipped + # in all major browsers and getting removed from this list + # could take several months. #more_set_headers "Strict-Transport-Security: max-age=15768000; includeSubDomains; preload;"; + + # HTTP response headers borrowed from Nextcloud `.htaccess` more_set_headers "Referrer-Policy: no-referrer"; more_set_headers "X-Content-Type-Options: nosniff"; more_set_headers "X-Download-Options: noopen"; From 46b5d9a32f10e5c32007bb1b354efb08862d1413 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:16:14 +0100 Subject: [PATCH 353/354] Update nginx.conf --- conf/nginx.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/nginx.conf b/conf/nginx.conf index 12cbaabf..c7b51e84 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,5 +1,6 @@ # Set .mjs MIME types # Either include it in the default mime.types list +# or include you can include that list explicitly and add the file extension # and include that list explicitly or add the file extension # only for Nextcloud like below: include mime.types; From fa73bf69c50d55bdf3c7506a4b463ace1f698022 Mon Sep 17 00:00:00 2001 From: eric_G <46165813+ericgaspar@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:17:49 +0100 Subject: [PATCH 354/354] Update remove --- scripts/remove | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/remove b/scripts/remove index 5f0f2dff..2a50bdfd 100755 --- a/scripts/remove +++ b/scripts/remove @@ -9,7 +9,6 @@ source /usr/share/yunohost/helpers ynh_script_progression "Removing system configurations related to $app..." ynh_config_remove_nginx - ynh_safe_rm "/etc/nginx/conf.d/$domain.d/$app.d" ynh_config_remove_phpfpm