From 1b62ce024043399d3be998324c2d66e566a5f14f Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Fri, 11 Sep 2020 20:27:40 +0200 Subject: [PATCH 001/128] [fix] Reduce right given to ynh users with ssh (#1050) * [fix] Avoid ynh user to be able to use X11 forwarding * [fix] Avoid some bad situations * [fix] Remove chroot restrictions and x11 authorization * Update comments Co-authored-by: Alexandre Aubin --- data/templates/ssh/sshd_config | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/data/templates/ssh/sshd_config b/data/templates/ssh/sshd_config index bd3efdef3..84f06d4e5 100644 --- a/data/templates/ssh/sshd_config +++ b/data/templates/ssh/sshd_config @@ -66,12 +66,19 @@ AcceptEnv LANG LC_* # SFTP stuff Subsystem sftp internal-sftp -Match User sftpusers - ForceCommand internal-sftp - ChrootDirectory /home/%u - AllowTcpForwarding no - GatewayPorts no - X11Forwarding no + +# Forbid users from using their account SSH as a VPN (even if SSH login is disabled) +AllowTcpForwarding no +AllowStreamLocalForwarding no + +# Disable .ssh/rc, which could be edited (e.g. from Nextcloud or whatever) by users to execute arbitrary commands even if SSH login is disabled +PermitUserRC no + +Match User admin,root + AllowTcpForwarding yes + AllowStreamLocalForwarding yes + PermitUserRC yes + # root login is allowed on local networks # It's meant to be a backup solution in case LDAP is down and From 56644a5ffe66f65d75efa107f8bb987d0dc42cab Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 11 Sep 2020 20:36:29 +0200 Subject: [PATCH 002/128] Update changelog for 4.0.7.1 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 34d0da4dd..44f1d33ab 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (4.0.7.1) stable; urgency=low + + - Forbid users from using SSH as a VPN (even if SSH login is disabled) (#1050) + + -- Alexandre Aubin Fri, 11 Sep 2020 21:06:09 +0200 + yunohost (4.0.7) stable; urgency=low - [fix] Require explicitly php7.3-foo packages because in some cases Sury's php7.4- packages are installed and php7.3-fpm doesn't get installed ... (1288159a) From 8d4f36e13160f6002ecec4d99250c6f2ea2d9414 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 14 Sep 2020 17:06:40 +0200 Subject: [PATCH 003/128] Remove pipe char when trying to re-run apt with dry-run ... Because apt becomes absolutely crazy and make every package installed conflict with weird stuff --- data/helpers.d/apt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index 1a4a9f74a..1e880af76 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -198,7 +198,7 @@ ynh_package_install_from_equivs () { # (the following is ran inside { } to not start a subshell otherwise ynh_die wouldnt exit the original process) # Get the list of dependencies from the deb local dependencies="$(dpkg --info "$TMPDIR/${pkgname}_${pkgversion}_all.deb" | grep Depends | \ - sed 's/^ Depends: //' | sed 's/,//g')" + sed 's/^ Depends: //' | sed 's/,//g' | tr -d '|')" # Fake an install of those dependencies to see the errors # The sed command here is, Print only from '--fix-broken' to the end. ynh_package_install $dependencies --dry-run | sed --quiet '/--fix-broken/,$p' >&2 From 7dcf4b008b246ccecc15f802718f84639caa0b48 Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 15 Sep 2020 20:53:26 +0200 Subject: [PATCH 004/128] Epic bugfix --- data/helpers.d/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/helpers.d/php b/data/helpers.d/php index 489c448a8..c538d8688 100644 --- a/data/helpers.d/php +++ b/data/helpers.d/php @@ -219,7 +219,7 @@ ynh_add_fpm_config () { if [ -e "../conf/php-fpm.ini" ] then - ynh_print_warn -message="Packagers ! Please do not use a separate php ini file, merge your directives in the pool file instead." + ynh_print_warn --message="Packagers ! Please do not use a separate php ini file, merge your directives in the pool file instead." finalphpini="$fpm_config_dir/conf.d/20-$app.ini" ynh_backup_if_checksum_is_different "$finalphpini" cp ../conf/php-fpm.ini "$finalphpini" From d2c0cc9240cae8ac200559fb2ad94961768396a5 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 16 Sep 2020 15:24:09 +0200 Subject: [PATCH 005/128] Use php7.3 by default in CLI --- data/hooks/conf_regen/10-apt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/hooks/conf_regen/10-apt b/data/hooks/conf_regen/10-apt index 4ce838e4c..5446c262c 100755 --- a/data/hooks/conf_regen/10-apt +++ b/data/hooks/conf_regen/10-apt @@ -18,6 +18,9 @@ Pin-Priority: -1" >> "/etc/apt/preferences.d/extra_php_version" do_post_regen() { regen_conf_files=$1 + + # Make sure php7.3 is the default version when using php in cli + update-alternatives --set php /usr/bin/php7.3 } FORCE=${2:-0} From 532cd5e87ec96f762287dd917b2bfbbe9175f7b7 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 16 Sep 2020 15:27:32 +0200 Subject: [PATCH 006/128] Force locale to C during postgresql migration to avoid some stupid issue related to locale --- src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py b/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py index 955393c5b..ce12855d8 100644 --- a/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py +++ b/src/yunohost/data_migrations/0017_postgresql_9p6_to_11.py @@ -36,9 +36,9 @@ class MyMigration(Migration): raise YunohostError("migration_0017_not_enough_space", path="/var/lib/postgresql/") self.runcmd("systemctl stop postgresql") - self.runcmd("pg_dropcluster --stop 11 main || true") # We do not trigger an exception if the command fails because that probably means cluster 11 doesn't exists, which is fine because it's created during the pg_upgradecluster) - self.runcmd("pg_upgradecluster -m upgrade 9.6 main") - self.runcmd("pg_dropcluster --stop 9.6 main") + self.runcmd("LC_ALL=C pg_dropcluster --stop 11 main || true") # We do not trigger an exception if the command fails because that probably means cluster 11 doesn't exists, which is fine because it's created during the pg_upgradecluster) + self.runcmd("LC_ALL=C pg_upgradecluster -m upgrade 9.6 main") + self.runcmd("LC_ALL=C pg_dropcluster --stop 9.6 main") self.runcmd("systemctl start postgresql") def package_is_installed(self, package_name): From 92068590a202d06db1698d22c73012df2b69df79 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 16 Sep 2020 16:14:03 +0200 Subject: [PATCH 007/128] [enh] Better problematic apt dependencies auto-investigation mechanism (#1051) * [enh] Better problematic apt dependencies auto-investigation mechanism * Misc tweak / fixes following tests --- data/helpers.d/apt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index 1e880af76..59f233c60 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -191,17 +191,17 @@ ynh_package_install_from_equivs () { cp "$controlfile" "${TMPDIR}/control" (cd "$TMPDIR" LC_ALL=C equivs-build ./control 1> /dev/null - dpkg --force-depends --install "./${pkgname}_${pkgversion}_all.deb" 2>&1) + LC_ALL=C dpkg --force-depends --install "./${pkgname}_${pkgversion}_all.deb" 2>&1 | tee ./dpkg_log) ynh_package_install --fix-broken || \ { # If the installation failed # (the following is ran inside { } to not start a subshell otherwise ynh_die wouldnt exit the original process) - # Get the list of dependencies from the deb - local dependencies="$(dpkg --info "$TMPDIR/${pkgname}_${pkgversion}_all.deb" | grep Depends | \ - sed 's/^ Depends: //' | sed 's/,//g' | tr -d '|')" + # Parse the list of problematic dependencies from dpkg's log ... + # (relevant lines look like: "foo-ynh-deps depends on bar; however:") + local problematic_dependencies="$(cat $TMPDIR/dpkg_log | grep -oP '(?<=-ynh-deps depends on ).*(?=; however)' | tr '\n' ' ')" # Fake an install of those dependencies to see the errors - # The sed command here is, Print only from '--fix-broken' to the end. - ynh_package_install $dependencies --dry-run | sed --quiet '/--fix-broken/,$p' >&2 + # The sed command here is, Print only from 'Reading state info' to the end. + [[ -n "$problematic_dependencies" ]] && ynh_package_install $problematic_dependencies --dry-run 2>&1 | sed --quiet '/Reading state info/,$p' | grep -v "fix-broken\|Reading state info" >&2 ynh_die --message="Unable to install dependencies"; } [[ -n "$TMPDIR" ]] && rm --recursive --force $TMPDIR # Remove the temp dir. From b59ed4120b698c5efca05c3cf830ae47fdd0824f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 16 Sep 2020 16:18:10 +0200 Subject: [PATCH 008/128] Diagnose ssl libs installed from sury (#1053) * Small fix / syntax improvement in apt conf regen hook * Diagnose, report and add a tip if some ssl libs are installed from Sury (shouldnt happen with the new pinning strategy, but some user still encounter issues because of this because of legacy installs) --- data/hooks/conf_regen/10-apt | 5 +++-- data/hooks/diagnosis/00-basesystem.py | 23 +++++++++++++++++++++++ locales/en.json | 2 ++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/data/hooks/conf_regen/10-apt b/data/hooks/conf_regen/10-apt index 5446c262c..09789470b 100755 --- a/data/hooks/conf_regen/10-apt +++ b/data/hooks/conf_regen/10-apt @@ -7,12 +7,13 @@ do_pre_regen() { mkdir --parents "${pending_dir}/etc/apt/preferences.d" - for package in "php" "php-fpm" "php-mysql" "php-xml" "php-zip" "php-mbstring" "php-ldap" "php-gd" "php-curl" "php-bz2" "php-json" "php-sqlite3" "php-intl" "openssl" "libssl1.1" "libssl-dev" + packages_to_refuse_from_sury="php php-fpm php-mysql php-xml php-zip php-mbstring php-ldap php-gd php-curl php-bz2 php-json php-sqlite3 php-intl openssl libssl1.1 libssl-dev" + for package in $packages_to_refuse_from_sury do echo " Package: $package Pin: origin \"packages.sury.org\" -Pin-Priority: -1" >> "/etc/apt/preferences.d/extra_php_version" +Pin-Priority: -1" >> "${pending_dir}/etc/apt/preferences.d/extra_php_version" done } diff --git a/data/hooks/diagnosis/00-basesystem.py b/data/hooks/diagnosis/00-basesystem.py index ec802c870..95d6c0d24 100644 --- a/data/hooks/diagnosis/00-basesystem.py +++ b/data/hooks/diagnosis/00-basesystem.py @@ -83,6 +83,29 @@ class BaseSystemDiagnoser(Diagnoser): details=["diagnosis_security_vulnerable_to_meltdown_details"] ) + bad_sury_packages = list(self.bad_sury_packages()) + if bad_sury_packages: + cmd_to_fix = "apt install --allow-downgrades " \ + + " ".join(["%s=%s" % (package, version) for package, version in bad_sury_packages]) + yield dict(meta={"test": "packages_from_sury"}, + data={"cmd_to_fix": cmd_to_fix}, + status="WARNING", + summary="diagnosis_package_installed_from_sury", + details=["diagnosis_package_installed_from_sury_details"]) + + def bad_sury_packages(self): + + packages_to_check = ["openssl", "libssl1.1", "libssl-dev"] + for package in packages_to_check: + cmd = "dpkg --list | grep '^ii' | grep gbp | grep -q -w %s" % package + # If version currently installed is not from sury, nothing to report + if os.system(cmd) != 0: + continue + + cmd = "LC_ALL=C apt policy %s 2>&1 | grep http -B1 | tr -d '*' | grep '+deb' | grep -v 'gbp' | head -n 1 | awk '{print $1}'" % package + version_to_downgrade_to = check_output(cmd).strip() + yield (package, version_to_downgrade_to) + def is_vulnerable_to_meltdown(self): # meltdown CVE: https://security-tracker.debian.org/tracker/CVE-2017-5754 diff --git a/locales/en.json b/locales/en.json index 3240cffe7..9e54e4c44 100644 --- a/locales/en.json +++ b/locales/en.json @@ -143,6 +143,8 @@ "diagnosis_basesystem_ynh_single_version": "{package} version: {version} ({repo})", "diagnosis_basesystem_ynh_main_version": "Server is running YunoHost {main_version} ({repo})", "diagnosis_basesystem_ynh_inconsistent_versions": "You are running inconsistent versions of the YunoHost packages... most probably because of a failed or partial upgrade.", + "diagnosis_package_installed_from_sury": "Some system packages should be downgraded", + "diagnosis_package_installed_from_sury_details": "Some packages were inadvertendly installed from a third-party repository called Sury. The Yunohost team improved the strategy that handle these packages, but it's expected that some setups that installed PHP7.3 apps while still on Stretch have some remaining inconsistencies. To fix this situation, you should try running the following command: {cmd_to_fix}", "diagnosis_display_tip": "To see the issues found, you can go to the Diagnosis section of the webadmin, or run 'yunohost diagnosis show --issues' from the command-line.", "diagnosis_failed_for_category": "Diagnosis failed for category '{category}': {error}", "diagnosis_cache_still_valid": "(Cache still valid for {category} diagnosis. Won't re-diagnose it yet!)", From 776c1ab84bdbabb43014e6daacc34113ac924624 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 16 Sep 2020 16:27:49 +0200 Subject: [PATCH 009/128] Update changelog for 4.0.8 --- debian/changelog | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/debian/changelog b/debian/changelog index 44f1d33ab..949de67d7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,7 +1,21 @@ +yunohost (4.0.8) stable; urgency=low + + - [fix] Diagnose ssl libs installed from sury (#1053) + - [enh] Better problematic apt dependencies auto-investigation mechanism (#1051, 8d4f36e1) + - [fix] Force locale to C during postgresql migration to avoid some stupid issue related to locale (d532cd5e) + - [fix] Use php7.3 by default in CLI (82c0cc92) + - [fix] Typo in fpm_config helper led to install process hanging forever (7dcf4b00) + + Thanks to all contributors <3 ! (Kayou) + + -- Alexandre Aubin Wed, 16 Sep 2020 16:23:04 +0200 + yunohost (4.0.7.1) stable; urgency=low - Forbid users from using SSH as a VPN (even if SSH login is disabled) (#1050) + Thanks to all contributors <3 ! (ljf) + -- Alexandre Aubin Fri, 11 Sep 2020 21:06:09 +0200 yunohost (4.0.7) stable; urgency=low From cb1d02243e10c31c4dd59d1391068a82bab663a5 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 14 Oct 2020 01:31:01 +0200 Subject: [PATCH 010/128] Do not advertise upgrades for bad-quality apps --- src/yunohost/app.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 7d5d36c4d..8039d5a7f 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -182,19 +182,29 @@ def _app_upgradable(app_infos): from packaging import version # Determine upgradability - # In case there is neither update_time nor install_time, we assume the app can/has to be upgraded - # Firstly use the version to know if an upgrade is available - app_is_in_catalog = bool(app_infos.get("from_catalog")) + app_in_catalog = app_infos.get("from_catalog") installed_version = version.parse(app_infos.get("version", "0~ynh0")) version_in_catalog = version.parse(app_infos.get("from_catalog", {}).get("manifest", {}).get("version", "0~ynh0")) - if app_is_in_catalog and '~ynh' in str(installed_version) and '~ynh' in str(version_in_catalog): + if not app_in_catalog: + return "url_required" + + # Do not advertise upgrades for bad-quality apps + if not app_in_catalog.get("level", -1) >= 5 or app_in_catalog.get("state") != "working": + return "bad_quality" + + # If the app uses the standard version scheme, use it to determine + # upgradability + if '~ynh' in str(installed_version) and '~ynh' in str(version_in_catalog): if installed_version < version_in_catalog: return "yes" + else: + return "no" - if not app_is_in_catalog: - return "url_required" + # Legacy stuff for app with old / non-standard version numbers... + + # In case there is neither update_time nor install_time, we assume the app can/has to be upgraded if not app_infos["from_catalog"].get("lastUpdate") or not app_infos["from_catalog"].get("git"): return "url_required" From 337387ccbcbe857335225e168bdd200fab93ad0b Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 1 Nov 2020 18:59:23 +0100 Subject: [PATCH 011/128] Make sure the account key exists when renewing certificate (in particular because the account key is not backup/restored) --- src/yunohost/certificate.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index f213fd914..170e5eb3b 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -483,6 +483,10 @@ def _check_acme_challenge_configuration(domain): def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): + + if not os.path.exists(ACCOUNT_KEY_FILE): + _generate_account_key() + # Make sure tmp folder exists logger.debug("Making sure tmp folders exists...") From 5cfaa7d72c6c0e6832036439cc7ffbbdfde12777 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 2 Nov 2020 19:12:52 +0100 Subject: [PATCH 012/128] Fix tests --- src/yunohost/tests/test_appurl.py | 2 +- src/yunohost/tests/test_permission.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yunohost/tests/test_appurl.py b/src/yunohost/tests/test_appurl.py index 21939c411..11ee7b4f5 100644 --- a/src/yunohost/tests/test_appurl.py +++ b/src/yunohost/tests/test_appurl.py @@ -107,7 +107,7 @@ def test_normalize_permission_path_with_unknown_domain(): def test_normalize_permission_path_conflicting_path(): - app_install("./tests/apps/register_url_app_ynh", + app_install(os.path.join(get_test_apps_dir(), "register_url_app_ynh"), args="domain=%s&path=%s" % (maindomain, "/url/registerapp"), force=True) with pytest.raises(YunohostError): diff --git a/src/yunohost/tests/test_permission.py b/src/yunohost/tests/test_permission.py index fee691815..296717e46 100644 --- a/src/yunohost/tests/test_permission.py +++ b/src/yunohost/tests/test_permission.py @@ -891,7 +891,7 @@ def test_permission_app_change_url(): @pytest.mark.other_domains(number=1) def test_permission_protection_management_by_helper(): - app_install("./tests/apps/permissions_app_ynh", + app_install(os.path.join(get_test_apps_dir(), "permissions_app_ynh"), args="domain=%s&domain_2=%s&path=%s&admin=%s" % (maindomain, other_domains[0], "/urlpermissionapp", "alice"), force=True) res = user_permission_list(full=True)['permissions'] From 45f91fec24744dffce5de362c35faea6811f88dd Mon Sep 17 00:00:00 2001 From: Kay0u Date: Mon, 2 Nov 2020 19:45:04 +0100 Subject: [PATCH 013/128] Fix tests, again --- src/yunohost/tests/test_permission.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/tests/test_permission.py b/src/yunohost/tests/test_permission.py index 296717e46..1d3961585 100644 --- a/src/yunohost/tests/test_permission.py +++ b/src/yunohost/tests/test_permission.py @@ -899,7 +899,7 @@ def test_permission_protection_management_by_helper(): assert res['permissions_app.admin']['protected'] is True assert res['permissions_app.dev']['protected'] is False - app_upgrade(["permissions_app"], file="./tests/apps/permissions_app_ynh") + app_upgrade(["permissions_app"], file=os.path.join(get_test_apps_dir(), "permissions_app_ynh")) res = user_permission_list(full=True)['permissions'] assert res['permissions_app.main']['protected'] is False From d34d6b1949a0e3633d3b6e109207d31cd6ef1cbc Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 4 Nov 2020 17:22:37 +0100 Subject: [PATCH 014/128] App installs logs were still disclosing secrets when shared sometimes... --- locales/en.json | 1 - src/yunohost/app.py | 8 +++++++- src/yunohost/hook.py | 7 +------ src/yunohost/log.py | 1 + 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/locales/en.json b/locales/en.json index 9e54e4c44..e3b0c12a2 100644 --- a/locales/en.json +++ b/locales/en.json @@ -294,7 +294,6 @@ "dyndns_registration_failed": "Could not register DynDNS domain: {error:s}", "dyndns_domain_not_provided": "DynDNS provider {provider:s} cannot provide domain {domain:s}.", "dyndns_unavailable": "The domain '{domain:s}' is unavailable.", - "executing_command": "Executing command '{command:s}'...", "executing_script": "Executing script '{script:s}'...", "extracting": "Extracting...", "experimental_feature": "Warning: This feature is experimental and not considered stable, you should not use it unless you know what you are doing.", diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 00472744f..aca4a9354 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -743,7 +743,13 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu env_dict["YNH_APP_ID"] = app_id env_dict["YNH_APP_INSTANCE_NAME"] = app_instance_name env_dict["YNH_APP_INSTANCE_NUMBER"] = str(instance_number) - operation_logger.extra.update({'env': env_dict}) + + env_dict_for_logging = env_dict.copy() + for arg_name, arg_value_and_type in args_odict.items(): + if arg_value_and_type[1] == "password": + del env_dict_for_logging["YNH_APP_ARG_%s" % arg_name.upper()] + + operation_logger.extra.update({'env': env_dict_for_logging}) # We'll check that the app didn't brutally edit some system configuration manually_modified_files_before_install = manually_modified_files() diff --git a/src/yunohost/hook.py b/src/yunohost/hook.py index b57300f54..9ffe6e01c 100644 --- a/src/yunohost/hook.py +++ b/src/yunohost/hook.py @@ -398,12 +398,7 @@ def _hook_exec_bash(path, args, no_trace, chdir, env, user, return_format, logge for k, v in env.items()]), cmd) command.append(cmd.format(script=cmd_script, args=cmd_args)) - if logger.isEnabledFor(log.DEBUG): - logger.debug(m18n.n('executing_command', command=' '.join(command))) - else: - logger.debug(m18n.n('executing_script', script=path)) - - logger.debug("About to run the command '%s'" % command) + logger.debug("Executing command '%s'" % ' '.join(command)) returncode = call_async_output( command, loggers, shell=False, cwd=chdir, diff --git a/src/yunohost/log.py b/src/yunohost/log.py index c71de2ab3..615970b26 100644 --- a/src/yunohost/log.py +++ b/src/yunohost/log.py @@ -467,6 +467,7 @@ class OperationLogger(object): 'started_at': self.started_at, 'operation': self.operation, 'yunohost_version': get_ynh_package_version("yunohost")["version"], + 'interface': msettings.get('interface') == 'api', } if self.related_to is not None: data['related_to'] = self.related_to From d4813e137805d9502eb016a45bc503b4a82622b6 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 4 Nov 2020 17:26:31 +0100 Subject: [PATCH 015/128] Update changelog for 4.0.8.1 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 949de67d7..e2f35a9c4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (4.0.8.1) stable; urgency=low + + - [fix] App installs logs were still disclosing secrets when shared sometimes ... + + -- Alexandre Aubin Wed, 04 Nov 2020 17:24:52 +0100 + yunohost (4.0.8) stable; urgency=low - [fix] Diagnose ssl libs installed from sury (#1053) From 685da06703173bed12adccc13ed0dc197bf7fbdc Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 4 Nov 2020 18:22:32 +0100 Subject: [PATCH 016/128] Unused string --- locales/en.json | 1 - 1 file changed, 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index eff1c05ee..dd0f6268b 100644 --- a/locales/en.json +++ b/locales/en.json @@ -300,7 +300,6 @@ "dyndns_registration_failed": "Could not register DynDNS domain: {error:s}", "dyndns_domain_not_provided": "DynDNS provider {provider:s} cannot provide domain {domain:s}.", "dyndns_unavailable": "The domain '{domain:s}' is unavailable.", - "executing_script": "Executing script '{script:s}'...", "extracting": "Extracting...", "experimental_feature": "Warning: This feature is experimental and not considered stable, you should not use it unless you know what you are doing.", "field_invalid": "Invalid field '{:s}'", From ade6481ccbbaffe194b7f28a392bd2b5ed7183ce Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Wed, 14 Oct 2020 03:50:14 +0200 Subject: [PATCH 017/128] [fix] intermediate_certificate is now included in signed certificate Fixes #1644 --- src/yunohost/certificate.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index 882e37863..4a4ff8bb4 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -539,12 +539,6 @@ def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): raise YunohostError('certmanager_cert_signing_failed') - import requests # lazy loading this module for performance reasons - try: - intermediate_certificate = requests.get(INTERMEDIATE_CERTIFICATE_URL, timeout=30).text - except requests.exceptions.Timeout as e: - raise YunohostError('certmanager_couldnt_fetch_intermediate_cert') - # Now save the key and signed certificate logger.debug("Saving the key and signed certificate...") @@ -573,7 +567,6 @@ def _fetch_and_enable_new_certificate(domain, staging=False, no_checks=False): with open(domain_cert_file, "w") as f: f.write(signed_certificate) - f.write(intermediate_certificate) _set_permissions(domain_cert_file, "root", "ssl-cert", 0o640) From 8c735cdc07c7c5c4fc9f785169801ec148a79a37 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 14 Oct 2020 04:08:34 +0200 Subject: [PATCH 018/128] Remove stale code --- locales/en.json | 1 - src/yunohost/certificate.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/locales/en.json b/locales/en.json index e3b0c12a2..7c1d8d87e 100644 --- a/locales/en.json +++ b/locales/en.json @@ -121,7 +121,6 @@ "certmanager_cert_renew_success": "Let's Encrypt certificate renewed for the domain '{domain:s}'", "certmanager_cert_signing_failed": "Could not sign the new certificate", "certmanager_certificate_fetching_or_enabling_failed": "Trying to use the new certificate for {domain:s} did not work...", - "certmanager_couldnt_fetch_intermediate_cert": "Timed out when trying to fetch intermediate certificate from Let's Encrypt. Certificate installation/renewal aborted—please try again later.", "certmanager_domain_not_diagnosed_yet": "There is no diagnosis result for domain {domain} yet. Please re-run a diagnosis for categories 'DNS records' and 'Web' in the diagnosis section to check if the domain is ready for Let's Encrypt. (Or if you know what you are doing, use '--no-checks' to turn off those checks.)", "certmanager_domain_cert_not_selfsigned": "The certificate for domain {domain:s} is not self-signed. Are you sure you want to replace it? (Use '--force' to do so.)", "certmanager_domain_dns_ip_differs_from_public_ip": "The DNS records for domain '{domain:s}' is different from this server's IP. Please check the 'DNS records' (basic) category in the diagnosis for more info. If you recently modified your A record, please wait for it to propagate (some DNS propagation checkers are available online). (If you know what you are doing, use '--no-checks' to turn off those checks.)", diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index 4a4ff8bb4..2118037d9 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -66,8 +66,6 @@ STAGING_CERTIFICATION_AUTHORITY = "https://acme-staging.api.letsencrypt.org" # For prod PRODUCTION_CERTIFICATION_AUTHORITY = "https://acme-v02.api.letsencrypt.org" -INTERMEDIATE_CERTIFICATE_URL = "https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem" - # # Front-end stuff # # From c640c045d9f41d55de18337cecb5b09aea32dc47 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 4 Nov 2020 23:32:40 +0100 Subject: [PATCH 019/128] Update changelog for 4.0.8.2 --- debian/changelog | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index e2f35a9c4..846ab8adc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +yunohost (4.0.8.2) stable; urgency=low + + - [fix] intermediate_certificate is now included in signed certificate (#1067) + + Thanks to all contributors <3 ! (Bram) + + -- Alexandre Aubin Wed, 04 Nov 2020 23:32:16 +0100 + yunohost (4.0.8.1) stable; urgency=low - [fix] App installs logs were still disclosing secrets when shared sometimes ... From 0fa17ec2b1e12c355cd39d610c91a84611978888 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 7 Nov 2020 00:45:26 +0100 Subject: [PATCH 020/128] Typo in previous commit, we want the interface name directly.. --- src/yunohost/log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/log.py b/src/yunohost/log.py index 4ebc93faa..11b9034c6 100644 --- a/src/yunohost/log.py +++ b/src/yunohost/log.py @@ -565,7 +565,7 @@ class OperationLogger(object): 'operation': self.operation, 'parent': self.parent, 'yunohost_version': get_ynh_package_version("yunohost")["version"], - 'interface': msettings.get('interface') == 'api', + 'interface': msettings.get('interface'), } if self.related_to is not None: data['related_to'] = self.related_to From 9269c55cb04dc6542b0454b34581a36034c9d0da Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 8 Nov 2020 23:15:35 +0100 Subject: [PATCH 021/128] Upgrade n version to upstream --- data/helpers.d/nodejs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/helpers.d/nodejs b/data/helpers.d/nodejs index 75472c278..f84f908b4 100644 --- a/data/helpers.d/nodejs +++ b/data/helpers.d/nodejs @@ -1,6 +1,6 @@ #!/bin/bash -n_version=6.5.1 +n_version=6.7.0 n_install_dir="/opt/node_n" node_version_path="$n_install_dir/n/versions/node" # N_PREFIX is the directory of n, it needs to be loaded as a environment variable. @@ -18,7 +18,7 @@ ynh_install_n () { # Build an app.src for n mkdir --parents "../conf" echo "SOURCE_URL=https://github.com/tj/n/archive/v${n_version}.tar.gz -SOURCE_SUM=5833f15893b9951a9ed59487e87b6c181d96b83a525846255872c4f92f0d25dd" > "../conf/n.src" +SOURCE_SUM=92e00fa86d1c4e8dc6ca8df7e75fc93afe8f71949890ef67c40555df4efc4abe" > "../conf/n.src" # Download and extract n ynh_setup_source --dest_dir="$n_install_dir/git" --source_id=n # Install n From 144f98ad4446e3d133764b276d414c9fa3a348db Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 10 Nov 2020 17:09:23 +0100 Subject: [PATCH 022/128] Gotta define a default value to avoid unbound variable --- data/helpers.d/utils | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/helpers.d/utils b/data/helpers.d/utils index 4501dcf1b..75347cc7c 100644 --- a/data/helpers.d/utils +++ b/data/helpers.d/utils @@ -576,7 +576,7 @@ ynh_app_upstream_version () { # Declare an array to define the options of this helper. local legacy_args=m local -A args_array=( [m]=manifest= ) - local manifest + local manifest="" # Manage arguments with getopts ynh_handle_getopts_args "$@" From 0aaaeef807556540c29a0c7d6d9a1d8025b423d6 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 16 Nov 2020 18:41:31 +0100 Subject: [PATCH 023/128] Backup restore: Only ask that question about 'system already installed' if some system parts are actually going to be restored... --- src/yunohost/backup.py | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index cafe452ea..943fab592 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -2109,11 +2109,22 @@ def backup_restore(name, system=[], apps=[], force=False): system = [] apps = [] - # TODO don't ask this question when restoring apps only and certain system - # parts + # + # Initialize # + # - # Check if YunoHost is installed - if system is not None and os.path.isfile('/etc/yunohost/installed'): + restore_manager = RestoreManager(name) + + restore_manager.set_system_targets(system) + restore_manager.set_apps_targets(apps) + + restore_manager.assert_enough_free_space() + + # + # Add validation if restoring system parts on an already-installed system + # + + if restore_manager.targets.targets["system"] != [] and os.path.isfile('/etc/yunohost/installed'): logger.warning(m18n.n('yunohost_already_installed')) if not force: try: @@ -2128,20 +2139,6 @@ def backup_restore(name, system=[], apps=[], force=False): if not force: raise YunohostError('restore_failed') - # TODO Partial app restore could not work if ldap is not restored before - # TODO repair mysql if broken and it's a complete restore - - # - # Initialize # - # - - restore_manager = RestoreManager(name) - - restore_manager.set_system_targets(system) - restore_manager.set_apps_targets(apps) - - restore_manager.assert_enough_free_space() - # # Mount the archive then call the restore for each system part / app # # From 083b3ead74ede489a8fed1e555d3521e90fb162c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 16 Nov 2020 19:15:31 +0100 Subject: [PATCH 024/128] Gotta return here to not create a regular setting for legacy settings... --- src/yunohost/app.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 2eb44aa8d..076096eef 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1293,6 +1293,8 @@ def app_setting(app, key, value=None, delete=False): show_tile=False, protected=True) + return + # # Regular setting management # From 1cb75497c431dd635318c17a42e1c5f90103d5e9 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 17 Nov 2020 15:29:24 +0100 Subject: [PATCH 025/128] Increase ldap size limit? --- data/templates/slapd/ldap.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/templates/slapd/ldap.conf b/data/templates/slapd/ldap.conf index 09aeb8b4f..dfcb17e41 100644 --- a/data/templates/slapd/ldap.conf +++ b/data/templates/slapd/ldap.conf @@ -8,7 +8,7 @@ BASE dc=yunohost,dc=org URI ldap://localhost:389 -#SIZELIMIT 12 +SIZELIMIT 10000 #TIMELIMIT 15 #DEREF never From fe888dd8416faef7746bd2a210aaa6a5e87efd04 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 17 Nov 2020 18:57:28 +0100 Subject: [PATCH 026/128] Fix stupid fr translations --- locales/en.json | 4 ++-- locales/fr.json | 57 +++++++++++++++---------------------------------- 2 files changed, 19 insertions(+), 42 deletions(-) diff --git a/locales/en.json b/locales/en.json index dd0f6268b..8f173fcfc 100644 --- a/locales/en.json +++ b/locales/en.json @@ -526,7 +526,7 @@ "restore_already_installed_apps": "The following apps can't be restored because they are already installed: {apps}", "restore_app_failed": "Could not restore {app:s}", "restore_cleaning_failed": "Could not clean up the temporary restoration directory", - "restore_complete": "Restored", + "restore_complete": "Restoration completed", "restore_confirm_yunohost_installed": "Do you really want to restore an already installed system? [{answers:s}]", "restore_extracting": "Extracting needed files from the archive…", "restore_failed": "Could not restore system", @@ -584,7 +584,7 @@ "service_unknown": "Unknown service '{service:s}'", "show_tile_cant_be_enabled_for_url_not_defined": "You cannot enable 'show_tile' right now, because you must first define an URL for the permission '{permission}'", "show_tile_cant_be_enabled_for_regex": "You cannot enable 'show_tile' right no, because the URL for the permission '{permission}' is a regex", - "ssowat_conf_generated": "SSOwat configuration generated", + "ssowat_conf_generated": "SSOwat configuration regenerated", "ssowat_conf_updated": "SSOwat configuration updated", "system_upgraded": "System upgraded", "system_username_exists": "Username already exists in the list of system users", diff --git a/locales/fr.json b/locales/fr.json index 4ebdd649f..13a0b8c76 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -60,12 +60,12 @@ "downloading": "Téléchargement en cours …", "dyndns_cron_installed": "La tâche cron pour le domaine DynDNS a été créée", "dyndns_cron_remove_failed": "Impossible de supprimer la tâche cron DynDNS parce que : {error}", - "dyndns_cron_removed": "La tâche cron pour le domaine DynDNS enlevée", + "dyndns_cron_removed": "La tâche cron pour le domaine DynDNS a été enlevée", "dyndns_ip_update_failed": "Impossible de mettre à jour l’adresse IP sur le domaine DynDNS", "dyndns_ip_updated": "Mise à jour de votre IP pour le domaine DynDNS", "dyndns_key_generating": "Génération de la clé DNS..., cela peut prendre un certain temps.", "dyndns_key_not_found": "Clé DNS introuvable pour le domaine", - "dyndns_no_domain_registered": "Aucun domaine enregistré avec DynDNS", + "dyndns_no_domain_registered": "Aucun domaine n'a été enregistré avec DynDNS", "dyndns_registered": "Domaine DynDNS enregistré", "dyndns_registration_failed": "Impossible d’enregistrer le domaine DynDNS : {error:s}", "dyndns_unavailable": "Le domaine {domain:s} est indisponible.", @@ -84,7 +84,7 @@ "installation_failed": "Quelque chose s’est mal passé lors de l’installation", "ip6tables_unavailable": "Vous ne pouvez pas jouer avec ip6tables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le prend pas en charge", "iptables_unavailable": "Vous ne pouvez pas jouer avec iptables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le prend pas en charge", - "ldap_initialized": "L’annuaire LDAP initialisé", + "ldap_initialized": "L’annuaire LDAP a été initialisé", "mail_alias_remove_failed": "Impossible de supprimer l’alias de courriel '{mail:s}'", "mail_domain_unknown": "Le domaine '{domain:s}' de cette adresse de courriel n’est pas valide. Merci d’utiliser un domaine administré par ce serveur.", "mail_forward_remove_failed": "Impossible de supprimer le courriel de transfert '{mail:s}'", @@ -109,7 +109,7 @@ "restore_already_installed_app": "Une application est déjà installée avec l’identifiant '{app:s}'", "restore_app_failed": "Impossible de restaurer '{app:s}'", "restore_cleaning_failed": "Impossible de nettoyer le dossier temporaire de restauration", - "restore_complete": "Restauré", + "restore_complete": "Restauration terminée", "restore_confirm_yunohost_installed": "Voulez-vous vraiment restaurer un système déjà installé ? [{answers:s}]", "restore_failed": "Impossible de restaurer le système", "restore_hook_unavailable": "Le script de restauration '{part:s}' n’est pas disponible sur votre système, et ne l’est pas non plus dans l’archive", @@ -132,8 +132,8 @@ "service_stop_failed": "Impossible d’arrêter le service '{service:s}'\n\nJournaux historisés récents : {logs:s}", "service_stopped": "Le service « {service:s} » a été arrêté", "service_unknown": "Le service '{service:s}' est inconnu", - "ssowat_conf_generated": "La configuration de SSOwat générée", - "ssowat_conf_updated": "La configuration de SSOwat mise à jour", + "ssowat_conf_generated": "La configuration de SSOwat a été regénérée", + "ssowat_conf_updated": "La configuration de SSOwat a été mise à jour", "system_upgraded": "Système mis à jour", "system_username_exists": "Ce nom d’utilisateur existe déjà dans les utilisateurs système", "unbackup_app": "'{app:s}' ne sera pas sauvegardée", @@ -147,9 +147,9 @@ "upnp_disabled": "UPnP désactivé", "upnp_enabled": "UPnP activé", "upnp_port_open_failed": "Impossible d’ouvrir les ports UPnP", - "user_created": "L’utilisateur créé", + "user_created": "L’utilisateur a été créé", "user_creation_failed": "Impossible de créer l’utilisateur {user} : {error}", - "user_deleted": "L’utilisateur supprimé", + "user_deleted": "L’utilisateur a été supprimé", "user_deletion_failed": "Impossible de supprimer l’utilisateur {user} : {error}", "user_home_creation_failed": "Impossible de créer le dossier personnel de l’utilisateur", "user_unknown": "L’utilisateur {user:s} est inconnu", @@ -255,32 +255,9 @@ "app_make_default_location_already_used": "Impossible de configurer l’application '{app}' par défaut pour le domaine '{domain}' car il est déjà utilisé par l’application '{other_app}'", "app_upgrade_app_name": "Mise à jour de {app}...", "backup_output_symlink_dir_broken": "Votre répertoire d’archivage '{path:s}' est un lien symbolique brisé. Peut-être avez-vous oublié de re/monter ou de brancher le support de stockage sur lequel il pointe.", - "migrate_tsig_end": "La migration à HMAC-SHA-512 est terminée", - "migrate_tsig_failed": "La migration du domaine DynDNS {domain} à HMAC-SHA-512 a échoué. Annulation des modifications. Erreur : {error_code} - {error}", - "migrate_tsig_start": "L’algorithme de génération des clefs n’est pas suffisamment sécurisé pour la signature TSIG du domaine '{domain}', lancement de la migration vers HMAC-SHA-512 qui est plus sécurisé", - "migrate_tsig_wait": "Attendre trois minutes pour que le serveur DynDNS prenne en compte la nouvelle clef …", - "migrate_tsig_wait_2": "2 minutes …", - "migrate_tsig_wait_3": "1 minute …", - "migrate_tsig_wait_4": "30 secondes …", - "migrate_tsig_not_needed": "Il ne semble pas que vous utilisez un domaine DynDNS, donc aucune migration n’est nécessaire.", - "migration_description_0001_change_cert_group_to_sslcert": "Changement des permissions de groupe des certificats de « metronome » à « ssl-cert »", - "migration_description_0002_migrate_to_tsig_sha256": "Amélioration de la sécurité de DynDNS TSIG en utilisant SHA512 au lieu de MD5", - "migration_description_0003_migrate_to_stretch": "Mise à niveau du système vers Debian Stretch et YunoHost 3.0", - "migration_0003_start": "Démarrage de la migration vers Stretch. Les journaux seront disponibles dans {logfile}.", - "migration_0003_patching_sources_list": "Modification du fichier sources.lists …", - "migration_0003_main_upgrade": "Démarrage de la mise à niveau principale …", - "migration_0003_fail2ban_upgrade": "Démarrage de la mise à niveau de Fail2Ban …", - "migration_0003_restoring_origin_nginx_conf": "Votre fichier /etc/nginx/nginx.conf a été modifié d'une manière ou d’une autre. La migration va d’abord le réinitialiser à son état d'origine… Le fichier précédent sera disponible en tant que {backup_dest}.", - "migration_0003_yunohost_upgrade": "Démarrage de la mise à niveau du package YunoHost… La migration se terminera, mais la mise à niveau réelle aura lieu immédiatement après. Une fois l'opération terminée, vous devrez peut-être vous reconnecter à la page webadmin.", - "migration_0003_not_jessie": "La distribution Debian actuelle n’est pas Jessie !", - "migration_0003_system_not_fully_up_to_date": "Votre système n’est pas complètement à jour. Veuillez mener une mise à jour classique avant de lancer la migration à Stretch.", - "migration_0003_still_on_jessie_after_main_upgrade": "Quelque chose s’est mal passé pendant la mise à niveau principale : le système est toujours sur Debian Jessie !? Pour investiguer sur le problème, veuillez regarder les journaux {log}:s …", - "migration_0003_general_warning": "Veuillez noter que cette migration est une opération délicate. Si l’équipe YunoHost a fait de son mieux pour la relire et la tester, la migration pourrait tout de même casser des parties de votre système ou de vos applications.\n\nEn conséquence, nous vous recommandons :\n - de lancer une sauvegarde de vos données ou applications critiques. Plus d’informations sur https://yunohost.org/backup ;\n - d’être patient après avoir lancé la migration : selon votre connexion internet et matériel, cela pourrait prendre jusqu’à quelques heures pour que tout soit à niveau.\n\nEn outre, le port SMTP utilisé par les clients de messagerie externes comme (Thunderbird ou K9-Mail) a été changé de 465 (SSL/TLS) à 587 (STARTTLS). L’ancien port 465 sera automatiquement fermé et le nouveau port 587 sera ouvert dans le pare-feu. Vous et vos utilisateurs *devront* adapter la configuration de vos clients de messagerie en conséquence.", - "migration_0003_problematic_apps_warning": "Veuillez noter que les applications installées potentiellement problématiques suivantes ont été détectées. Il semble que celles-ci n’ont pas été installées à partir d’un catalogue d’applications, ou ne sont pas marquées comme \"fonctionnelle\". Par conséquent, il ne peut pas être garanti qu’ils fonctionneront toujours après la mise à niveau : {problematic_apps}", - "migration_0003_modified_files": "Veuillez noter que les fichiers suivants ont été détectés comme modifiés manuellement et pourraient être écrasés à la fin de la mise à niveau : {manually_modified_files}", "migrations_list_conflict_pending_done": "Vous ne pouvez pas utiliser --previous et --done simultanément.", "migrations_to_be_ran_manually": "La migration {id} doit être lancée manuellement. Veuillez aller dans Outils > Migrations dans l’interface admin, ou lancer `yunohost tools migrations migrate`.", - "migrations_need_to_accept_disclaimer": "Pour lancer la migration {id}, vous devez accepter cette clause de non-responsabilité :\n---\n{disclaimer}\n---\nSi vous acceptez de lancer la migration, veuillez relancer la commande avec l’option --accept-disclaimer.", + "migrations_need_to_accept_disclaimer": "Pour lancer la migration {id}, vous devez accepter cet avertissement :\n---\n{disclaimer}\n---\nSi vous acceptez de lancer la migration, veuillez relancer la commande avec l’option --accept-disclaimer.", "service_description_avahi-daemon": "Vous permet d’atteindre votre serveur en utilisant « yunohost.local » sur votre réseau local", "service_description_dnsmasq": "Gère la résolution des noms de domaine (DNS)", "service_description_dovecot": "Permet aux clients de messagerie d’accéder/récupérer les courriels (via IMAP et POP3)", @@ -340,8 +317,8 @@ "migration_0005_not_enough_space": "Laissez suffisamment d’espace disponible dans {path} pour exécuter la migration.", "service_description_php7.0-fpm": "Exécute des applications écrites en PHP avec NGINX", "users_available": "Liste des utilisateurs disponibles :", - "good_practices_about_admin_password": "Vous êtes maintenant sur le point de définir un nouveau mot de passe d'administration. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase de passe) et / ou d'utiliser une variation de caractères (majuscule, minuscule, chiffres et caractères spéciaux).", - "good_practices_about_user_password": "Vous êtes maintenant sur le point de définir un nouveau mot de passe utilisateur. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase secrète) et / ou une variation de caractères (majuscule, minuscule, chiffres et caractères spéciaux).", + "good_practices_about_admin_password": "Vous êtes sur le point de définir un nouveau mot de passe d'administration. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase de passe) et / ou d'utiliser une variation de caractères (majuscule, minuscule, chiffres et caractères spéciaux).", + "good_practices_about_user_password": "Vous êtes sur le point de définir un nouveau mot de passe utilisateur. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase secrète) et / ou une variation de caractères (majuscule, minuscule, chiffres et caractères spéciaux).", "migration_description_0006_sync_admin_and_root_passwords": "Synchroniser les mots de passe admin et root", "migration_0006_disclaimer": "YunoHost s’attend maintenant à ce que les mots de passe administrateur et racine soient synchronisés. Cette migration remplace votre mot de passe root par le mot de passe administrateur.", "password_listed": "Ce mot de passe fait partie des mots de passe les plus utilisés au monde. Veuillez choisir quelque chose de plus unique.", @@ -419,13 +396,13 @@ "service_regen_conf_is_deprecated": "'yunohost service regen-conf' est obsolète ! Veuillez plutôt utiliser 'yunohost tools regen-conf' à la place.", "tools_upgrade_at_least_one": "Veuillez spécifier '--apps' ou '--system'", "tools_upgrade_cant_both": "Impossible de mettre à niveau le système et les applications en même temps", - "tools_upgrade_cant_hold_critical_packages": "Impossibilité de maintenir les paquets critiques…", + "tools_upgrade_cant_hold_critical_packages": "Impossibilité d'ajouter le drapeau 'hold' pour les paquets critiques…", "tools_upgrade_regular_packages": "Mise à jour des paquets du système (non liés a YunoHost)…", "tools_upgrade_regular_packages_failed": "Impossible de mettre à jour les paquets suivants : {packages_list}", "tools_upgrade_special_packages": "Mise à jour des paquets 'spécifiques' (liés a YunoHost)…", "tools_upgrade_special_packages_completed": "La mise à jour des paquets de YunoHost est finie !\nPressez [Entrée] pour revenir à la ligne de commande", "dpkg_lock_not_available": "Cette commande ne peut pas être exécutée pour le moment car un autre programme semble utiliser le verrou de dpkg (le gestionnaire de package système)", - "tools_upgrade_cant_unhold_critical_packages": "Impossible de conserver les paquets critiques…", + "tools_upgrade_cant_unhold_critical_packages": "Impossible d'enlever le drapeau 'hold' pour les paquets critiques…", "tools_upgrade_special_packages_explanation": "La mise à niveau spécifique à YunoHost se poursuivra en arrière-plan. Veuillez ne pas lancer d'autres actions sur votre serveur pendant les 10 prochaines minutes (selon la vitesse du matériel). Après cela, vous devrez peut-être vous reconnecter à l'administrateur Web. Le journal de mise à niveau sera disponible dans Outils → Journal (dans le webadmin) ou en utilisant la « liste des journaux yunohost » (à partir de la ligne de commande).", "update_apt_cache_failed": "Impossible de mettre à jour le cache APT (gestionnaire de paquets Debian). Voici un extrait du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}", "update_apt_cache_warning": "Des erreurs se sont produites lors de la mise à jour du cache APT (gestionnaire de paquets Debian). Voici un extrait des lignes du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}", @@ -456,10 +433,10 @@ "migration_0011_rollback_success": "Système restauré.", "migration_0011_update_LDAP_database": "Mise à jour de la base de données LDAP...", "migration_0011_backup_before_migration": "Création d’une sauvegarde des paramètres de la base de données LDAP et des applications avant la migration.", - "permission_not_found": "Autorisation '{permission:s}' introuvable", - "permission_update_failed": "Impossible de mettre à jour l’autorisation '{permission}' : {error}", + "permission_not_found": "Permission '{permission:s}' introuvable", + "permission_update_failed": "Impossible de mettre à jour la permission '{permission}' : {error}", "permission_updated": "Permission '{permission:s}' mise à jour", - "permission_update_nothing_to_do": "Aucune autorisation pour mettre à jour", + "permission_update_nothing_to_do": "Aucune permission à mettre à jour", "dyndns_provider_unreachable": "Impossible d’atteindre le fournisseur DynDNS {provider} : votre YunoHost n’est pas correctement connecté à Internet ou le serveur Dynette est en panne.", "migration_0011_update_LDAP_schema": "Mise à jour du schéma LDAP...", "migrations_already_ran": "Ces migrations sont déjà effectuées : {ids}", @@ -482,7 +459,7 @@ "group_user_not_in_group": "L’utilisateur {user} n’est pas dans le groupe {group}", "log_permission_create": "Créer permission '{}'", "log_permission_delete": "Supprimer permission '{}'", - "log_user_group_create": "Créer '{}' groupe", + "log_user_group_create": "Créer le groupe '{}'", "log_user_permission_update": "Mise à jour des accès pour la permission '{}'", "log_user_permission_reset": "Réinitialiser la permission '{}'", "migration_0011_failed_to_remove_stale_object": "Impossible de supprimer un objet périmé {dn} : {error}", From 3f8b922e9256d146eb5d47441d89d1a5241b05e4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 21 Nov 2020 17:41:43 +0100 Subject: [PATCH 027/128] Automatically translate legacy rules in /etc/ssowat/conf.json.persistent --- src/yunohost/app.py | 3 ++ src/yunohost/utils/legacy.py | 68 +++++++++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 076096eef..0dedaae16 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1420,6 +1420,9 @@ def app_ssowatconf(): with open('/etc/ssowat/conf.json', 'w+') as f: json.dump(conf_dict, f, sort_keys=True, indent=4) + from utils.legacy import translate_legacy_rules_in_ssowant_conf_json_persistent + translate_legacy_rules_in_ssowant_conf_json_persistent() + logger.debug(m18n.n('ssowat_conf_generated')) diff --git a/src/yunohost/utils/legacy.py b/src/yunohost/utils/legacy.py index b21f0f25c..a90b9fd74 100644 --- a/src/yunohost/utils/legacy.py +++ b/src/yunohost/utils/legacy.py @@ -1,7 +1,8 @@ +import os from moulinette import m18n from yunohost.utils.error import YunohostError from moulinette.utils.log import getActionLogger -from moulinette.utils.filesystem import read_yaml +from moulinette.utils.filesystem import read_json, write_to_json, read_yaml from yunohost.user import user_list, user_group_create, user_group_update from yunohost.app import app_setting, _installed_apps, _get_app_settings, _set_app_settings @@ -206,3 +207,68 @@ def migrate_legacy_permission_settings(app=None): _set_app_settings(app, settings) permission_sync_to_user() + + +def translate_legacy_rules_in_ssowant_conf_json_persistent(): + + if not os.path.exists("/etc/ssowat/conf.json.persistent"): + return + + persistent = read_json("/etc/ssowat/conf.json.persistent") + + legacy_rules = [ + "skipped_urls", + "unprotected_urls", + "protected_urls", + "skipped_regex", + "unprotected_regex", + "protected_regex" + ] + + if not any(legacy_rule in persistent for legacy_rule in legacy_rules): + return + + if not isinstance(persistent.get("permissions"), dict): + persistent["permissions"] = {} + + skipped_urls = persistent.get("skipped_urls", []) + ["re:" + r for r in persistent.get("skipped_regex", [])] + protected_urls = persistent.get("protected_urls", []) + ["re:" + r for r in persistent.get("protected_regex", [])] + unprotected_urls = persistent.get("unprotected_urls", []) + ["re:" + r for r in persistent.get("unprotected_regex", [])] + + for legacy_rule in legacy_rules: + if legacy_rule in persistent: + del persistent[legacy_rule] + + if skipped_urls: + persistent["permissions"]['custom_skipped'] = { + "users": [], + "label": "Custom permissions - skipped", + "show_tile": False, + "auth_header": False, + "public": True, + "uris": skipped_urls + persistent["permissions"].get("custom_skipped", {}).get("uris", []), + } + + if unprotected_urls: + persistent["permissions"]['custom_unprotected'] = { + "users": [], + "label": "Custom permissions - unprotected", + "show_tile": False, + "auth_header": True, + "public": True, + "uris": unprotected_urls + persistent["permissions"].get("custom_unprotected", {}).get("uris", []), + } + + if protected_urls: + persistent["permissions"]['custom_protected'] = { + "users": [], + "label": "Custom permissions - protected", + "show_tile": False, + "auth_header": True, + "public": False, + "uris": protected_urls + persistent["permissions"].get("custom_protected", {}).get("uris", []), + } + + write_to_json("/etc/ssowat/conf.json.persistent", persistent) + + logger.warning("Yunohost automatically translated some legacy rules in /etc/ssowat/conf.json.persistent to match the new permission system") From 67e03e6f1b87d19ce9a3c7d43268d12cd21bc780 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Mon, 23 Nov 2020 09:59:43 +0100 Subject: [PATCH 028/128] [fix] Missing abuse@ --- src/yunohost/user.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yunohost/user.py b/src/yunohost/user.py index 64a30d821..67fd43a03 100644 --- a/src/yunohost/user.py +++ b/src/yunohost/user.py @@ -155,6 +155,7 @@ def user_create(operation_logger, username, firstname, lastname, domain, passwor 'admin@' + main_domain, 'webmaster@' + main_domain, 'postmaster@' + main_domain, + 'abuse@' + main_domain, ] if mail in aliases: From 4ce9e4a4462723aec386ec6b5dcde92e1a75ea1a Mon Sep 17 00:00:00 2001 From: Kay0u Date: Tue, 24 Nov 2020 23:10:57 +0100 Subject: [PATCH 029/128] set url when register and url --- src/yunohost/app.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 076096eef..0b9b5f32f 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1326,6 +1326,7 @@ def app_register_url(app, domain, path): domain -- The domain on which the app should be registered (e.g. your.domain.tld) path -- The path to be registered (e.g. /coffee) """ + from permission import permission_url domain, path = _normalize_domain_path(domain, path) @@ -1342,6 +1343,8 @@ def app_register_url(app, domain, path): app_setting(app, 'domain', value=domain) app_setting(app, 'path', value=path) + if domain and path: + permission_url(app + ".main", url='/') def app_ssowatconf(): From f495f1cf712cfaf4611288a22829ac8fd31db757 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 25 Nov 2020 02:11:06 +0100 Subject: [PATCH 030/128] default value (True) for sync_perm param in helpers --- data/helpers.d/setting | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/helpers.d/setting b/data/helpers.d/setting index af358d274..af52b8321 100644 --- a/data/helpers.d/setting +++ b/data/helpers.d/setting @@ -298,7 +298,7 @@ ynh_permission_create() { fi fi - yunohost tools shell -c "from yunohost.permission import permission_create; permission_create('$app.$permission' $url $additional_urls $auth_header $allowed $label $show_tile $protected , sync_perm=False)" + yunohost tools shell -c "from yunohost.permission import permission_create; permission_create('$app.$permission' $url $additional_urls $auth_header $allowed $label $show_tile $protected)" } # Remove a permission for the app (note that when the app is removed all permission is automatically removed) @@ -316,7 +316,7 @@ ynh_permission_delete() { local permission ynh_handle_getopts_args "$@" - yunohost tools shell -c "from yunohost.permission import permission_delete; permission_delete('$app.$permission', sync_perm=False)" + yunohost tools shell -c "from yunohost.permission import permission_delete; permission_delete('$app.$permission')" } # Check if a permission exists @@ -408,7 +408,7 @@ ynh_permission_url() { clear_urls=",clear_urls=True" fi - yunohost tools shell -c "from yunohost.permission import permission_url; permission_url('$app.$permission' $url $add_url $remove_url $auth_header $clear_urls )" + yunohost tools shell -c "from yunohost.permission import permission_url; permission_url('$app.$permission' $url $add_url $remove_url $auth_header $clear_urls)" } @@ -487,7 +487,7 @@ ynh_permission_update() { fi fi - yunohost tools shell -c "from yunohost.permission import user_permission_update; user_permission_update('$app.$permission' $add $remove $label $show_tile $protected , force=True, sync_perm=False)" + yunohost tools shell -c "from yunohost.permission import user_permission_update; user_permission_update('$app.$permission' $add $remove $label $show_tile $protected , force=True)" } # Check if a permission has an user From c39bfd309da6ba5da4e9acda05257da03979bf36 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 25 Nov 2020 03:22:48 +0100 Subject: [PATCH 031/128] Move all the webapp permissions handling at the end of app_install to app_register_url for the sake of clarity/consistency --- src/yunohost/app.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 0b9b5f32f..c87e11857 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -658,7 +658,7 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu from yunohost.hook import hook_add, hook_remove, hook_exec, hook_callback from yunohost.log import OperationLogger - from yunohost.permission import user_permission_list, user_permission_info, user_permission_update, permission_create, permission_url, permission_delete, permission_sync_to_user + from yunohost.permission import user_permission_list, permission_create, permission_delete, permission_sync_to_user from yunohost.regenconf import manually_modified_files # Fetch or extract sources @@ -822,7 +822,9 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu os.system('cp -R %s/%s %s' % (extracted_app_folder, file_to_copy, app_setting_path)) # Initialize the main permission for the app - # After the install, if apps don't have a domain and path defined, the default url '/' is removed from the permission + # The permission is initialized with no url associated, and with tile disabled + # For web app, the root path of the app will be added as url and the tile + # will be enabled during the app install. C.f. 'app_register_url()' below. permission_create(app_instance_name + ".main", allowed=["all_users"], label=label, show_tile=False, protected=False) # Execute the app install script @@ -944,17 +946,6 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu os.system('chown -R root: %s' % app_setting_path) os.system('chown -R admin: %s/scripts' % app_setting_path) - # If the app haven't set the url of the main permission and domain and path is set set / as main url - app_settings = _get_app_settings(app_instance_name) - domain = app_settings.get('domain', None) - path = app_settings.get('path', None) - if domain and path and user_permission_info(app_instance_name + '.main')['url'] is None: - permission_url(app_instance_name + ".main", url='/', sync_perm=False) - if domain and path: - user_permission_update(app_instance_name + ".main", show_tile=True, sync_perm=False) - - permission_sync_to_user() - logger.success(m18n.n('installation_complete')) hook_callback('post_app_install', args=args_list, env=env_dict) @@ -1326,7 +1317,7 @@ def app_register_url(app, domain, path): domain -- The domain on which the app should be registered (e.g. your.domain.tld) path -- The path to be registered (e.g. /coffee) """ - from permission import permission_url + from permission import permission_url, user_permission_update, permission_sync_to_user domain, path = _normalize_domain_path(domain, path) @@ -1343,8 +1334,16 @@ def app_register_url(app, domain, path): app_setting(app, 'domain', value=domain) app_setting(app, 'path', value=path) - if domain and path: - permission_url(app + ".main", url='/') + + # Initially, the .main permission is created with no url at all associated + # When the app register/books its web url, we also add the url '/' + # (meaning the root of the app, domain.tld/path/) + # and enable the tile to the SSO, and both of this should match 95% of apps + # For more specific cases, the app is free to change / add urls or disable + # the tile using the permission helpers. + permission_url(app + ".main", url='/', sync_perm=False) + user_permission_update(app + ".main", show_tile=True, sync_perm=False) + permission_sync_to_user() def app_ssowatconf(): From 2f19f3311ef7bc9b5a3b5d0bcccf2c7e0669064f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 25 Nov 2020 03:23:39 +0100 Subject: [PATCH 032/128] Uniformize imports (who knows if there's a completely unrelated python module called 'permission' or 'utils' maybe...) --- src/yunohost/app.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index c87e11857..1480b1592 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1211,7 +1211,7 @@ def app_setting(app, key, value=None, delete=False): if is_legacy_permission_setting: - from permission import user_permission_list, user_permission_update, permission_create, permission_delete, permission_url + from yunohost.permission import user_permission_list, user_permission_update, permission_create, permission_delete, permission_url permissions = user_permission_list(full=True)['permissions'] permission_name = "%s.legacy_%s_uris" % (app, key.split('_')[0]) permission = permissions.get(permission_name) @@ -1272,7 +1272,7 @@ def app_setting(app, key, value=None, delete=False): permission_url(permission_name, clear_urls=True, sync_perm=False) permission_url(permission_name, add_url=new_urls) else: - from utils.legacy import legacy_permission_label + from yunohost.utils.legacy import legacy_permission_label # Let's create a "special" permission for the legacy settings permission_create(permission=permission_name, # FIXME find a way to limit to only the user allowed to the main permission @@ -1317,7 +1317,7 @@ def app_register_url(app, domain, path): domain -- The domain on which the app should be registered (e.g. your.domain.tld) path -- The path to be registered (e.g. /coffee) """ - from permission import permission_url, user_permission_update, permission_sync_to_user + from yunohost.permission import permission_url, user_permission_update, permission_sync_to_user domain, path = _normalize_domain_path(domain, path) @@ -1426,7 +1426,7 @@ def app_ssowatconf(): def app_change_label(app, new_label): - from permission import user_permission_update + from yunohost.permission import user_permission_update installed = _is_installed(app) if not installed: raise YunohostError('app_not_installed', app=app, all_apps=_get_all_installed_apps_id()) From 6a550f9318e7db8192565d7ead9ec8c01434a859 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 25 Nov 2020 10:41:20 +0100 Subject: [PATCH 033/128] Add tests for optional args with empty input --- .../tests/test_apps_arguments_parsing.py | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/yunohost/tests/test_apps_arguments_parsing.py b/src/yunohost/tests/test_apps_arguments_parsing.py index 598eb9eec..5edd450d8 100644 --- a/src/yunohost/tests/test_apps_arguments_parsing.py +++ b/src/yunohost/tests/test_apps_arguments_parsing.py @@ -95,6 +95,15 @@ def test_parse_args_in_yunohost_format_string_optional_with_input(): assert _parse_args_in_yunohost_format(answers, questions) == expected_result +def test_parse_args_in_yunohost_format_string_optional_with_empty_input(): + questions = [{"name": "some_string", "ask": "some question", "optional": True, }] + answers = {} + expected_result = OrderedDict({"some_string": ("", "string")}) + + with patch.object(msignals, "prompt", return_value=""): + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + def test_parse_args_in_yunohost_format_string_optional_with_input_without_ask(): questions = [{"name": "some_string", "optional": True, }] answers = {} @@ -268,6 +277,22 @@ def test_parse_args_in_yunohost_format_password_optional_with_input(): assert _parse_args_in_yunohost_format(answers, questions) == expected_result +def test_parse_args_in_yunohost_format_password_optional_with_empty_input(): + questions = [ + { + "name": "some_password", + "ask": "some question", + "type": "password", + "optional": True, + } + ] + answers = {} + expected_result = OrderedDict({"some_password": ("", "password")}) + + with patch.object(msignals, "prompt", return_value=""): + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + def test_parse_args_in_yunohost_format_password_optional_with_input_without_ask(): questions = [{"name": "some_password", "type": "password", "optional": True, }] answers = {} @@ -444,6 +469,17 @@ def test_parse_args_in_yunohost_format_path_optional_with_input(): assert _parse_args_in_yunohost_format(answers, questions) == expected_result +def test_parse_args_in_yunohost_format_path_optional_with_empty_input(): + questions = [ + {"name": "some_path", "ask": "some question", "type": "path", "optional": True, } + ] + answers = {} + expected_result = OrderedDict({"some_path": ("", "path")}) + + with patch.object(msignals, "prompt", return_value=""): + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + def test_parse_args_in_yunohost_format_path_optional_with_input_without_ask(): questions = [{"name": "some_path", "type": "path", "optional": True, }] answers = {} @@ -663,6 +699,22 @@ def test_parse_args_in_yunohost_format_boolean_optional_with_input(): assert _parse_args_in_yunohost_format(answers, questions) == expected_result +def test_parse_args_in_yunohost_format_boolean_optional_with_empty_input(): + questions = [ + { + "name": "some_boolean", + "ask": "some question", + "type": "boolean", + "optional": True, + } + ] + answers = {} + expected_result = OrderedDict({"some_boolean": (0, "boolean")}) + + with patch.object(msignals, "prompt", return_value=""): + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + def test_parse_args_in_yunohost_format_boolean_optional_with_input_without_ask(): questions = [{"name": "some_boolean", "type": "boolean", "optional": True, }] answers = {} From 93fd101663b84e7f2310c9773c658f8b91724c8e Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 25 Nov 2020 11:14:15 +0100 Subject: [PATCH 034/128] check if password is strong enough only if it's not an optional argument --- src/yunohost/app.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 076096eef..1d103f00c 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -2498,8 +2498,9 @@ class PasswordArgumentParser(YunoHostArgumentFormatParser): if any(char in question.value for char in self.forbidden_chars): raise YunohostError('pattern_password_app', forbidden_chars=self.forbidden_chars) - from yunohost.utils.password import assert_password_is_strong_enough - assert_password_is_strong_enough('user', question.value) + if not question.optional: + from yunohost.utils.password import assert_password_is_strong_enough + assert_password_is_strong_enough('user', question.value) return super(PasswordArgumentParser, self)._post_parse_value(question) From f0d3d36365e26df52a0f80cd3c2b531855413edb Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 25 Nov 2020 11:41:00 +0100 Subject: [PATCH 035/128] An optional password should be either empty or strong enough --- src/yunohost/app.py | 3 ++- .../tests/test_apps_arguments_parsing.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 1d103f00c..432cabe67 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -2498,7 +2498,8 @@ class PasswordArgumentParser(YunoHostArgumentFormatParser): if any(char in question.value for char in self.forbidden_chars): raise YunohostError('pattern_password_app', forbidden_chars=self.forbidden_chars) - if not question.optional: + # If it's an optional argument the value should be empty or strong enough + if not question.optional or question.value: from yunohost.utils.password import assert_password_is_strong_enough assert_password_is_strong_enough('user', question.value) diff --git a/src/yunohost/tests/test_apps_arguments_parsing.py b/src/yunohost/tests/test_apps_arguments_parsing.py index 5edd450d8..646f7da58 100644 --- a/src/yunohost/tests/test_apps_arguments_parsing.py +++ b/src/yunohost/tests/test_apps_arguments_parsing.py @@ -418,6 +418,24 @@ def test_parse_args_in_yunohost_format_password_strong_enough(): _parse_args_in_yunohost_format({"some_password": "password"}, questions) +def test_parse_args_in_yunohost_format_password_optional_strong_enough(): + questions = [ + { + "name": "some_password", + "ask": "some question", + "type": "password", + "optional": True, + } + ] + + with pytest.raises(YunohostError): + # too short + _parse_args_in_yunohost_format({"some_password": "a"}, questions) + + with pytest.raises(YunohostError): + _parse_args_in_yunohost_format({"some_password": "password"}, questions) + + def test_parse_args_in_yunohost_format_path(): questions = [{"name": "some_path", "type": "path", }] answers = {"some_path": "some_value"} From 698d543c5656b634dbd0fc6e97049de99cfc8aa0 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 25 Nov 2020 11:47:57 +0100 Subject: [PATCH 036/128] Fix tests --- src/yunohost/tests/test_apps_arguments_parsing.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/yunohost/tests/test_apps_arguments_parsing.py b/src/yunohost/tests/test_apps_arguments_parsing.py index 646f7da58..c8203f2c5 100644 --- a/src/yunohost/tests/test_apps_arguments_parsing.py +++ b/src/yunohost/tests/test_apps_arguments_parsing.py @@ -256,9 +256,9 @@ def test_parse_args_in_yunohost_format_password_input_no_ask(): def test_parse_args_in_yunohost_format_password_no_input_optional(): questions = [{"name": "some_password", "type": "password", "optional": True, }] answers = {} + expected_result = OrderedDict({"some_password": ("", "password")}) - with pytest.raises(YunohostError): - _parse_args_in_yunohost_format(answers, questions) + assert _parse_args_in_yunohost_format(answers, questions) == expected_result def test_parse_args_in_yunohost_format_password_optional_with_input(): @@ -727,7 +727,7 @@ def test_parse_args_in_yunohost_format_boolean_optional_with_empty_input(): } ] answers = {} - expected_result = OrderedDict({"some_boolean": (0, "boolean")}) + expected_result = OrderedDict({"some_boolean": (0, "boolean")}) # default to false with patch.object(msignals, "prompt", return_value=""): assert _parse_args_in_yunohost_format(answers, questions) == expected_result From 233141bd47f26a10ef5d3c02f0adf7836b41d848 Mon Sep 17 00:00:00 2001 From: Kayou Date: Wed, 25 Nov 2020 15:41:16 +0100 Subject: [PATCH 037/128] Create a PR on new tags (for new YNH version) --- .gitlab/ci/doc.gitlab-ci.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.gitlab/ci/doc.gitlab-ci.yml b/.gitlab/ci/doc.gitlab-ci.yml index b246cc238..7227b8acb 100644 --- a/.gitlab/ci/doc.gitlab-ci.yml +++ b/.gitlab/ci/doc.gitlab-ci.yml @@ -6,9 +6,22 @@ generate-helpers-doc: stage: doc image: "before-install" needs: [] + before_script: + - apt-get update -y && apt-get install git hub -y + - git config --global user.email "yunohost@yunohost.org" + - git config --global user.name "$GITHUB_USER" script: - cd doc - python generate_helper_doc.py + - hub clone https://$GITHUB_TOKEN:x-oauth-basic@github.com/YunoHost/doc.git doc_repo + - cp helpers.html doc_repo/packaging_apps_helpers.md + - cd doc_repo + # replace ${CI_COMMIT_REF_NAME} with ${CI_COMMIT_TAG} ? + - hub checkout -b "${CI_COMMIT_REF_NAME}" + - hub commit -am "[CI] Helper for ${CI_COMMIT_REF_NAME}" + - hub pull-request -m "[CI] Helper for ${CI_COMMIT_REF_NAME}" -p # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd artifacts: paths: - doc/helpers.html + only: + - tags From ad4678362a179e1e050560f682659f57aedeaee4 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 25 Nov 2020 18:30:00 +0100 Subject: [PATCH 038/128] [fix] show config panel --- src/yunohost/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 076096eef..d205780c4 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1573,7 +1573,7 @@ def app_config_show_panel(operation_logger, app): option["default"] = parsed_values[generated_name] args_dict = _parse_args_in_yunohost_format( - [{option["name"]: parsed_values[generated_name]}], + {option["name"]: parsed_values[generated_name]}, [option] ) option["default"] = args_dict[option["name"]][0] From d79c9b4bf889508f783fc4a74d2197d8626d144e Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 25 Nov 2020 18:42:18 +0100 Subject: [PATCH 039/128] Add number arg parser --- locales/en.json | 1 + src/yunohost/app.py | 24 +++ .../tests/test_apps_arguments_parsing.py | 155 ++++++++++++++++++ 3 files changed, 180 insertions(+) diff --git a/locales/en.json b/locales/en.json index 8f173fcfc..8510cdf58 100644 --- a/locales/en.json +++ b/locales/en.json @@ -468,6 +468,7 @@ "migrations_success_forward": "Migration {id} completed", "migrations_to_be_ran_manually": "Migration {id} has to be run manually. Please go to Tools → Migrations on the webadmin page, or run `yunohost tools migrations migrate`.", "not_enough_disk_space": "Not enough free space on '{path:s}'", + "invalid_number": "Must be a number", "operation_interrupted": "The operation was manually interrupted?", "packages_upgrade_failed": "Could not upgrade all the packages", "password_listed": "This password is among the most used passwords in the world. Please choose something more unique.", diff --git a/src/yunohost/app.py b/src/yunohost/app.py index c42c5c3cb..ee3f22e95 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -2593,6 +2593,29 @@ class UserArgumentParser(YunoHostArgumentFormatParser): error=m18n.n('user_unknown', user=question.value)) +class NumberArgumentParser(YunoHostArgumentFormatParser): + argument_type = "number" + default_value = "" + + def parse_question(self, question, user_answers): + question = super(NumberArgumentParser, self).parse_question(question, user_answers) + + if question.default is None: + question.default = 0 + + return question + + def _post_parse_value(self, question): + if isinstance(question.value, int): + return super(NumberArgumentParser, self)._post_parse_value(question) + + try: + return int(question.value) + except ValueError: + raise YunohostError('app_argument_invalid', name=question.name, + error=m18n.n('invalid_number')) + + class DisplayTextArgumentParser(YunoHostArgumentFormatParser): argument_type = "display_text" @@ -2607,6 +2630,7 @@ ARGUMENTS_TYPE_PARSERS = { "boolean": BooleanArgumentParser, "domain": DomainArgumentParser, "user": UserArgumentParser, + "number": NumberArgumentParser, "display_text": DisplayTextArgumentParser, } diff --git a/src/yunohost/tests/test_apps_arguments_parsing.py b/src/yunohost/tests/test_apps_arguments_parsing.py index c8203f2c5..543e5a9b5 100644 --- a/src/yunohost/tests/test_apps_arguments_parsing.py +++ b/src/yunohost/tests/test_apps_arguments_parsing.py @@ -1091,6 +1091,161 @@ def test_parse_args_in_yunohost_format_user_two_users_default_input(): assert _parse_args_in_yunohost_format(answers, questions) == expected_result + +def test_parse_args_in_yunohost_format_number(): + questions = [{"name": "some_number", "type": "number", }] + answers = {"some_number": 1337} + expected_result = OrderedDict({"some_number": (1337, "number")}) + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + +def test_parse_args_in_yunohost_format_number_no_input(): + questions = [{"name": "some_number", "type": "number", }] + answers = {} + + expected_result = OrderedDict({"some_number": (0, "number")}) + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + +def test_parse_args_in_yunohost_format_number_bad_input(): + questions = [{"name": "some_number", "type": "number", }] + answers = {"some_number": "stuff"} + + with pytest.raises(YunohostError): + _parse_args_in_yunohost_format(answers, questions) + + +def test_parse_args_in_yunohost_format_number_input(): + questions = [{"name": "some_number", "type": "number", "ask": "some question", }] + answers = {} + + expected_result = OrderedDict({"some_number": (1337, "number")}) + with patch.object(msignals, "prompt", return_value="1337"): + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + with patch.object(msignals, "prompt", return_value=1337): + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + expected_result = OrderedDict({"some_number": (0, "number")}) + with patch.object(msignals, "prompt", return_value=""): + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + +def test_parse_args_in_yunohost_format_number_input_no_ask(): + questions = [{"name": "some_number", "type": "number", }] + answers = {} + expected_result = OrderedDict({"some_number": (1337, "number")}) + + with patch.object(msignals, "prompt", return_value="1337"): + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + +def test_parse_args_in_yunohost_format_number_no_input_optional(): + questions = [{"name": "some_number", "type": "number", "optional": True, }] + answers = {} + expected_result = OrderedDict({"some_number": (0, "number")}) # default to 0 + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + +def test_parse_args_in_yunohost_format_number_optional_with_input(): + questions = [ + { + "name": "some_number", + "ask": "some question", + "type": "number", + "optional": True, + } + ] + answers = {} + expected_result = OrderedDict({"some_number": (1337, "number")}) + + with patch.object(msignals, "prompt", return_value="1337"): + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + +def test_parse_args_in_yunohost_format_number_optional_with_input_without_ask(): + questions = [{"name": "some_number", "type": "number", "optional": True, }] + answers = {} + expected_result = OrderedDict({"some_number": (0, "number")}) + + with patch.object(msignals, "prompt", return_value="0"): + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + +def test_parse_args_in_yunohost_format_number_no_input_default(): + questions = [ + { + "name": "some_number", + "ask": "some question", + "type": "number", + "default": 1337, + } + ] + answers = {} + expected_result = OrderedDict({"some_number": (1337, "number")}) + assert _parse_args_in_yunohost_format(answers, questions) == expected_result + + +def test_parse_args_in_yunohost_format_number_bad_default(): + questions = [ + { + "name": "some_number", + "ask": "some question", + "type": "number", + "default": "bad default", + } + ] + answers = {} + with pytest.raises(YunohostError): + _parse_args_in_yunohost_format(answers, questions) + + +def test_parse_args_in_yunohost_format_number_input_test_ask(): + ask_text = "some question" + questions = [{"name": "some_number", "type": "number", "ask": ask_text, }] + answers = {} + + with patch.object(msignals, "prompt", return_value="1111") as prompt: + _parse_args_in_yunohost_format(answers, questions) + prompt.assert_called_with(ask_text, False) + + +def test_parse_args_in_yunohost_format_number_input_test_ask_with_default(): + ask_text = "some question" + default_value = 1337 + questions = [{"name": "some_number", "type": "number", "ask": ask_text, "default": default_value, }] + answers = {} + + with patch.object(msignals, "prompt", return_value="1111") as prompt: + _parse_args_in_yunohost_format(answers, questions) + prompt.assert_called_with("%s (default: %s)" % (ask_text, default_value), False) + + +@pytest.mark.skip # we should do something with this example +def test_parse_args_in_yunohost_format_number_input_test_ask_with_example(): + ask_text = "some question" + example_value = 1337 + questions = [{"name": "some_number", "type": "number", "ask": ask_text, "example": example_value, }] + answers = {} + + with patch.object(msignals, "prompt", return_value="1111") as prompt: + _parse_args_in_yunohost_format(answers, questions) + assert ask_text in prompt.call_args[0][0] + assert example_value in prompt.call_args[0][0] + + +@pytest.mark.skip # we should do something with this help +def test_parse_args_in_yunohost_format_number_input_test_ask_with_help(): + ask_text = "some question" + help_value = 1337 + questions = [{"name": "some_number", "type": "number", "ask": ask_text, "help": help_value, }] + answers = {} + + with patch.object(msignals, "prompt", return_value="1111") as prompt: + _parse_args_in_yunohost_format(answers, questions) + assert ask_text in prompt.call_args[0][0] + assert help_value in prompt.call_args[0][0] + def test_parse_args_in_yunohost_format_display_text(): questions = [{"name": "some_app", "type": "display_text", "ask": "foobar"}] answers = {} From 1ddca81f5ad22ec45523f08a692a737e78e49efb Mon Sep 17 00:00:00 2001 From: Kayou Date: Wed, 25 Nov 2020 19:13:50 +0100 Subject: [PATCH 040/128] Use isdigit --- src/yunohost/app.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index ee3f22e95..a67a4f1d2 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -2609,10 +2609,10 @@ class NumberArgumentParser(YunoHostArgumentFormatParser): if isinstance(question.value, int): return super(NumberArgumentParser, self)._post_parse_value(question) - try: + if isinstance(question.value, str) and question.value.isdigit(): return int(question.value) - except ValueError: - raise YunohostError('app_argument_invalid', name=question.name, + + raise YunohostError('app_argument_invalid', name=question.name, error=m18n.n('invalid_number')) From c45feb7cae2b78fafa8ab6ba0a2ebeb738b434ba Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 25 Nov 2020 20:17:25 +0100 Subject: [PATCH 041/128] fix test --- src/yunohost/tests/test_apps_arguments_parsing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/tests/test_apps_arguments_parsing.py b/src/yunohost/tests/test_apps_arguments_parsing.py index 543e5a9b5..1ca0fc421 100644 --- a/src/yunohost/tests/test_apps_arguments_parsing.py +++ b/src/yunohost/tests/test_apps_arguments_parsing.py @@ -1207,7 +1207,7 @@ def test_parse_args_in_yunohost_format_number_input_test_ask(): with patch.object(msignals, "prompt", return_value="1111") as prompt: _parse_args_in_yunohost_format(answers, questions) - prompt.assert_called_with(ask_text, False) + prompt.assert_called_with("%s (default: 0)" % (ask_text), False) def test_parse_args_in_yunohost_format_number_input_test_ask_with_default(): From 9bb94ebfdbf1ff893953aec843b64fcd939c0ef6 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Wed, 25 Nov 2020 20:23:04 +0100 Subject: [PATCH 042/128] add test with a float --- src/yunohost/tests/test_apps_arguments_parsing.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/yunohost/tests/test_apps_arguments_parsing.py b/src/yunohost/tests/test_apps_arguments_parsing.py index 1ca0fc421..88c235252 100644 --- a/src/yunohost/tests/test_apps_arguments_parsing.py +++ b/src/yunohost/tests/test_apps_arguments_parsing.py @@ -1114,6 +1114,10 @@ def test_parse_args_in_yunohost_format_number_bad_input(): with pytest.raises(YunohostError): _parse_args_in_yunohost_format(answers, questions) + answers = {"some_number": 1.5} + with pytest.raises(YunohostError): + _parse_args_in_yunohost_format(answers, questions) + def test_parse_args_in_yunohost_format_number_input(): questions = [{"name": "some_number", "type": "number", "ask": "some question", }] From 7a0aa851a69c3073b437b056afc981c5b824a10e Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 26 Nov 2020 11:00:24 +0100 Subject: [PATCH 043/128] Keep helpers consistent --- data/helpers.d/utils | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/helpers.d/utils b/data/helpers.d/utils index 75347cc7c..3ab56747e 100644 --- a/data/helpers.d/utils +++ b/data/helpers.d/utils @@ -576,9 +576,10 @@ ynh_app_upstream_version () { # Declare an array to define the options of this helper. local legacy_args=m local -A args_array=( [m]=manifest= ) - local manifest="" + local manifest # Manage arguments with getopts ynh_handle_getopts_args "$@" + manifest="${manifest:-}" if [[ "$manifest" != "" ]] && [[ -e "$manifest" ]]; then From bbb68e8ef90484cae9c7c47600f852da71fed0c2 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 26 Nov 2020 11:45:01 +0100 Subject: [PATCH 044/128] add branch name in the helper template --- doc/generate_helper_doc.py | 12 ++++++++++-- doc/helper_doc_template.html | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/doc/generate_helper_doc.py b/doc/generate_helper_doc.py index a97d424eb..c07877d9d 100644 --- a/doc/generate_helper_doc.py +++ b/doc/generate_helper_doc.py @@ -4,9 +4,17 @@ import os import glob import datetime +def get_current_git_branch(): + with open("../.git/HEAD", "r") as f: + head_file = f.readlines() + current_branch = head_file[0].split()[1].split("refs/heads/")[1] + + return current_branch def render(helpers): + current_branch = get_current_git_branch() + data = {"helpers": helpers, "date": datetime.datetime.now().strftime("%m/%d/%Y"), "version": open("../debian/changelog").readlines()[0].split()[1].strip("()") @@ -25,7 +33,7 @@ def render(helpers): template = open("helper_doc_template.html", "r").read() t = Template(template) t.globals['now'] = datetime.datetime.utcnow - result = t.render(data=data, convert=shell_to_html, shell_css=shell_css) + result = t.render(current_branch=current_branch, data=data, convert=shell_to_html, shell_css=shell_css) open("helpers.html", "w").write(result) ############################################################################## @@ -197,7 +205,7 @@ def main(): for helper_file in helper_files: category_name = os.path.basename(helper_file) - print "Parsing %s ..." % category_name + print("Parsing %s ..." % category_name) p = Parser(helper_file) p.parse_blocks() for b in p.blocks: diff --git a/doc/helper_doc_template.html b/doc/helper_doc_template.html index f96a0190e..4d73a6de9 100644 --- a/doc/helper_doc_template.html +++ b/doc/helper_doc_template.html @@ -2,7 +2,7 @@

App helpers

-

Doc auto-generated by this script on {{data.date}} (Yunohost version {{data.version}})

+

Doc auto-generated by this script on {{data.date}} (Yunohost version {{data.version}})

{% for category, helpers in data.helpers %} @@ -72,7 +72,7 @@

{% endif %}

- Dude, show me the code ! + Dude, show me the code !

From 146537dcc13c66d10aef86dabad0bbaff9bdcb1a Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 26 Nov 2020 14:12:45 +0100 Subject: [PATCH 045/128] fix error on generate helper script --- doc/generate_helper_doc.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/generate_helper_doc.py b/doc/generate_helper_doc.py index c07877d9d..2389fa0e1 100644 --- a/doc/generate_helper_doc.py +++ b/doc/generate_helper_doc.py @@ -3,12 +3,13 @@ import os import glob import datetime +import subprocess def get_current_git_branch(): - with open("../.git/HEAD", "r") as f: - head_file = f.readlines() - current_branch = head_file[0].split()[1].split("refs/heads/")[1] + p = subprocess.Popen("git branch -a --contains | grep remote | cut -d'/' -f3 ", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout, stderr = p.communicate() + current_branch = stdout.strip().decode('utf-8') return current_branch def render(helpers): From ae7efe820eab6756053e43ad5747cd620e009956 Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 26 Nov 2020 16:28:52 +0100 Subject: [PATCH 046/128] Use commit instead of the branch name --- doc/generate_helper_doc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/generate_helper_doc.py b/doc/generate_helper_doc.py index 2389fa0e1..51da47c21 100644 --- a/doc/generate_helper_doc.py +++ b/doc/generate_helper_doc.py @@ -6,7 +6,7 @@ import datetime import subprocess def get_current_git_branch(): - p = subprocess.Popen("git branch -a --contains | grep remote | cut -d'/' -f3 ", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + p = subprocess.Popen("git rev-parse --verify HEAD", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) stdout, stderr = p.communicate() current_branch = stdout.strip().decode('utf-8') From 96d7855de786d76172560c53daeb21144f7cf243 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 26 Nov 2020 16:40:51 +0100 Subject: [PATCH 047/128] current_branch -> current_commit --- doc/generate_helper_doc.py | 10 +++++----- doc/helper_doc_template.html | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/generate_helper_doc.py b/doc/generate_helper_doc.py index 51da47c21..bc9611c8f 100644 --- a/doc/generate_helper_doc.py +++ b/doc/generate_helper_doc.py @@ -5,16 +5,16 @@ import glob import datetime import subprocess -def get_current_git_branch(): +def get_current_commit(): p = subprocess.Popen("git rev-parse --verify HEAD", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) stdout, stderr = p.communicate() - current_branch = stdout.strip().decode('utf-8') - return current_branch + current_commit = stdout.strip().decode('utf-8') + return current_commit def render(helpers): - current_branch = get_current_git_branch() + current_commit = get_current_commit() data = {"helpers": helpers, "date": datetime.datetime.now().strftime("%m/%d/%Y"), @@ -34,7 +34,7 @@ def render(helpers): template = open("helper_doc_template.html", "r").read() t = Template(template) t.globals['now'] = datetime.datetime.utcnow - result = t.render(current_branch=current_branch, data=data, convert=shell_to_html, shell_css=shell_css) + result = t.render(current_commit=current_commit, data=data, convert=shell_to_html, shell_css=shell_css) open("helpers.html", "w").write(result) ############################################################################## diff --git a/doc/helper_doc_template.html b/doc/helper_doc_template.html index 4d73a6de9..60bfe0ecd 100644 --- a/doc/helper_doc_template.html +++ b/doc/helper_doc_template.html @@ -2,7 +2,7 @@

App helpers

-

Doc auto-generated by this script on {{data.date}} (Yunohost version {{data.version}})

+

Doc auto-generated by this script on {{data.date}} (Yunohost version {{data.version}})

{% for category, helpers in data.helpers %} @@ -72,7 +72,7 @@

{% endif %}

- Dude, show me the code ! + Dude, show me the code !

From 63166d05fad940db441edf922c4cfaf16120a643 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 28 Nov 2020 19:13:12 +0100 Subject: [PATCH 048/128] Catch stupid error if root is not in /etc/passwd --- src/yunohost/tools.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 132f8c668..8dab6bcff 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -163,7 +163,10 @@ def tools_adminpw(new_password, check_strength=True): with open('/etc/shadow', 'w') as after_file: after_file.write(before.replace("root:" + hash_root, "root:" + new_hash.replace('{CRYPT}', ''))) - except IOError: + # An IOError may be thrown if for some reason we can't read/write /etc/passwd + # A KeyError could also be thrown if 'root' is not in /etc/passwd in the first place (for example because no password defined ?) + # (c.f. the line about getspnam) + except IOError, KeyError: logger.warning(m18n.n('root_password_desynchronized')) return From d5563170efeb2a4bef7ba8019af638c6cf1c1beb Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 28 Nov 2020 19:39:18 +0100 Subject: [PATCH 049/128] Fix syntax issue found by linter --- src/yunohost/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/tools.py b/src/yunohost/tools.py index 8dab6bcff..96bd01ed6 100644 --- a/src/yunohost/tools.py +++ b/src/yunohost/tools.py @@ -166,7 +166,7 @@ def tools_adminpw(new_password, check_strength=True): # An IOError may be thrown if for some reason we can't read/write /etc/passwd # A KeyError could also be thrown if 'root' is not in /etc/passwd in the first place (for example because no password defined ?) # (c.f. the line about getspnam) - except IOError, KeyError: + except (IOError, KeyError): logger.warning(m18n.n('root_password_desynchronized')) return From dea78f693bee8dd992db3b80fd2f13becb080257 Mon Sep 17 00:00:00 2001 From: Christian Wehrli Date: Fri, 30 Oct 2020 19:26:28 +0000 Subject: [PATCH 050/128] Translated using Weblate (German) Currently translated at 56.8% (359 of 631 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/locales/de.json b/locales/de.json index da6262ca7..173e162db 100644 --- a/locales/de.json +++ b/locales/de.json @@ -1,7 +1,7 @@ { "action_invalid": "Ungültige Aktion '{action:s}'", "admin_password": "Administrator-Passwort", - "admin_password_change_failed": "Passwort kann nicht geändert werden", + "admin_password_change_failed": "Ändern des Passworts nicht möglich", "admin_password_changed": "Das Administrator-Kennwort wurde geändert", "app_already_installed": "{app:s} ist schon installiert", "app_argument_choice_invalid": "Wähle einen der folgenden Werte '{choices:s}' für das Argument '{name:s}'", @@ -465,5 +465,7 @@ "group_cannot_be_deleted": "Die Gruppe {group} kann nicht manuell entfernt werden.", "group_cannot_edit_primary_group": "Die Gruppe '{group}' kann nicht manuell bearbeitet werden. Es ist die primäre Gruppe, welche dazu gedacht ist, nur einen spezifischen Benutzer zu enthalten.", "diagnosis_processes_killed_by_oom_reaper": "Einige Prozesse wurden vom System beendet, weil nicht genügend Arbeitsspeicher vorhanden ist. Das passiert normalerweise, wenn das System nicht genügend Arbeitsspeicher zur Verfügung hat oder wenn ein Prozess zu viel Speicher verbraucht. Zusammenfassung der beendeten Prozesse: {kills_summary}", - "diagnosis_description_ports": "Offene Ports" + "diagnosis_description_ports": "Offene Ports", + "additional_urls_already_added": "Zusätzliche URL '{url:s}' bereits hinzugefügt in der zusätzlichen URL für Berechtigung '{permission:s}'", + "additional_urls_already_removed": "Zusätzliche URL '{url:s}' bereits entfernt in der zusätzlichen URL für Berechtigung '{permission:s}'" } From 321d5263dfd169e84d5c34e933dab95062964e33 Mon Sep 17 00:00:00 2001 From: Levin Herr Date: Sat, 31 Oct 2020 22:55:58 +0000 Subject: [PATCH 051/128] Translated using Weblate (German) Currently translated at 56.8% (359 of 631 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/de.json b/locales/de.json index 173e162db..c04b2b948 100644 --- a/locales/de.json +++ b/locales/de.json @@ -243,7 +243,7 @@ "app_start_remove": "{app} wird entfernt...", "app_start_install": "{app} wird installiert...", "app_not_upgraded": "Die App '{failed_app}' konnte nicht aktualisiert werden. Infolgedessen wurden die folgenden App-Upgrades abgebrochen: {apps}", - "app_make_default_location_already_used": "Die App \"{app}\" kann nicht als Standard für die Domain \"{domain}\" festgelegt werden. Sie wird bereits von der App \"{other_app}\" verwendet", + "app_make_default_location_already_used": "Die App \"{app}\" kann nicht als Standard für die Domain \"{domain}\" festgelegt werden. Sie wird bereits von \"{other_app}\" verwendet", "aborting": "Breche ab.", "app_action_cannot_be_ran_because_required_services_down": "Diese erforderlichen Dienste sollten zur Durchführung dieser Aktion laufen: {services}. Versuchen Sie, sie neu zu starten, um fortzufahren (und möglicherweise zu untersuchen, warum sie nicht verfügbar sind).", "already_up_to_date": "Nichts zu tun. Alles ist bereits auf dem neusten Stand.", @@ -467,5 +467,6 @@ "diagnosis_processes_killed_by_oom_reaper": "Einige Prozesse wurden vom System beendet, weil nicht genügend Arbeitsspeicher vorhanden ist. Das passiert normalerweise, wenn das System nicht genügend Arbeitsspeicher zur Verfügung hat oder wenn ein Prozess zu viel Speicher verbraucht. Zusammenfassung der beendeten Prozesse: {kills_summary}", "diagnosis_description_ports": "Offene Ports", "additional_urls_already_added": "Zusätzliche URL '{url:s}' bereits hinzugefügt in der zusätzlichen URL für Berechtigung '{permission:s}'", - "additional_urls_already_removed": "Zusätzliche URL '{url:s}' bereits entfernt in der zusätzlichen URL für Berechtigung '{permission:s}'" + "additional_urls_already_removed": "Zusätzliche URL '{url:s}' bereits entfernt in der zusätzlichen URL für Berechtigung '{permission:s}'", + "app_label_deprecated": "Dieser Befehl ist veraltet! Bitte nutzen Sie den neuen Befehl 'yunohost user permission update' um das Applabel zu verwalten." } From d333b3e427e19422ac5684c27bea11b3592d7a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quent=C3=AD?= Date: Sat, 31 Oct 2020 21:11:57 +0000 Subject: [PATCH 052/128] Translated using Weblate (Occitan) Currently translated at 53.7% (339 of 631 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/oc/ --- locales/oc.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locales/oc.json b/locales/oc.json index e1bd26706..1ef8348bd 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -559,17 +559,17 @@ "diagnosis_services_running": "Lo servici {service} es lançat !", "diagnosis_services_conf_broken": "La configuracion es copada pel servici {service} !", "diagnosis_ports_needed_by": "Es necessari qu’aqueste pòrt siá accessible pel servici {service}", - "diagnosis_diskusage_low": "Lo lòc d’emmagazinatge {mountpoint} (sul periferic {device}) a solament {free} ({free_percent}%). Siatz prudent.", + "diagnosis_diskusage_low": "Lo lòc d’emmagazinatge {mountpoint} (sul periferic {device}) a solament {free} ({free_percent}%). Siatz prudent.", "migration_description_0014_remove_app_status_json": "Suprimir los fichièrs d’aplicacion status.json eretats", "dyndns_provider_unreachable": "Impossible d’atenher lo provesidor Dyndns : siá vòstre YunoHost es pas corrèctament connectat a Internet siá lo servidor dynette es copat.", - "diagnosis_services_bad_status_tip": "Podètz ensajar de reaviar lo servici, e se non fonciona pas, podètz agachar los jornals en utilizant « yunohost service log {service} » o via la seccion « Servicis » de pas la pagina web d’administracion.", + "diagnosis_services_bad_status_tip": "Podètz ensajar de reaviar lo servici, e se non fonciona pas, podètz agachar los jornals de servici a la pagina web d’administracion(en linha de comanda podètz utilizar yunohost service restart {service} e yunohost service log {service}).", "diagnosis_http_connection_error": "Error de connexion : connexion impossibla al domeni demandat, benlèu qu’es pas accessible.", "group_user_already_in_group": "L’utilizaire {user} es ja dins lo grop « {group} »", "diagnosis_ip_broken_resolvconf": "La resolucion del nom de domeni sembla copada sul servidor, poiriá èsser ligada al fait que /etc/resolv.conf manda pas a 127.0.0.1.", "diagnosis_ip_weird_resolvconf": "La resolucion del nom de domeni sembla foncionar, mas siatz prudent en utilizant un fichièr /etc/resolv.con personalizat.", - "diagnosis_diskusage_verylow": "Lo lòc d’emmagazinatge {mountpoint} (sul periferic {device}) a solament {free} ({free_percent}%). Deuriatz considerar de liberar un pauc d’espaci.", + "diagnosis_diskusage_verylow": "Lo lòc d’emmagazinatge {mountpoint} (sul periferic {device}) a solament {free} ({free_percent}%). Deuriatz considerar de liberar un pauc d’espaci.", "global_settings_setting_pop3_enabled": "Activar lo protocòl POP3 pel servidor de corrièr", - "diagnosis_diskusage_ok": "Lo lòc d’emmagazinatge {mountpoint} (sul periferic {device}) a encara {free} ({free_percent}%) de liure !", + "diagnosis_diskusage_ok": "Lo lòc d’emmagazinatge {mountpoint} (sul periferic {device}) a encara {free} ({free_percent}%) de liure !", "diagnosis_swap_none": "Lo sistèma a pas cap de memòria d’escambi. Auriatz de considerar d’ajustar almens {recommended} d’escambi per evitar las situacions ont lo sistèma manca de memòria.", "diagnosis_swap_notsomuch": "Lo sistèma a solament {total} de memòria d’escambi. Auriatz de considerar d’ajustar almens {recommended} d’escambi per evitar las situacions ont lo sistèma manca de memòria.", "diagnosis_description_web": "Web", From c463cab8294308a519f8a92d3541bd0df95c27b6 Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 3 Nov 2020 12:33:03 +0000 Subject: [PATCH 053/128] Translated using Weblate (French) Currently translated at 94.4% (596 of 631 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index 13a0b8c76..2bb92cbd5 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -670,5 +670,6 @@ "app_argument_password_no_default": "Erreur lors de l'analyse de l'argument de mot de passe '{name}' : l'argument de mot de passe ne peut pas avoir de valeur par défaut pour des raisons de sécurité", "pattern_email_forward": "Il doit s'agir d'une adresse électronique valide, le symbole '+' étant accepté (par exemples : johndoe@exemple.com ou bien johndoe+yunohost@exemple.com)", "global_settings_setting_smtp_relay_password": "Mot de passe SMTP du serveur de courrier électronique", - "diagnosis_package_installed_from_sury": "Certains paquets du système devraient être rétrograder vers une version moins récente" + "diagnosis_package_installed_from_sury": "Certains paquets du système devraient être rétrograder vers une version moins récente", + "additional_urls_already_added": "URL supplémentaire '{url:s}' déjà ajoutée pour la permission '{permission:s}'" } From 1b5068f3137ee3caa6d7dbf01e5d4c502b7fa3d0 Mon Sep 17 00:00:00 2001 From: Christian Wehrli Date: Wed, 4 Nov 2020 19:22:45 +0000 Subject: [PATCH 054/128] Translated using Weblate (German) Currently translated at 57.0% (360 of 631 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/de.json b/locales/de.json index c04b2b948..d85879bf4 100644 --- a/locales/de.json +++ b/locales/de.json @@ -468,5 +468,6 @@ "diagnosis_description_ports": "Offene Ports", "additional_urls_already_added": "Zusätzliche URL '{url:s}' bereits hinzugefügt in der zusätzlichen URL für Berechtigung '{permission:s}'", "additional_urls_already_removed": "Zusätzliche URL '{url:s}' bereits entfernt in der zusätzlichen URL für Berechtigung '{permission:s}'", - "app_label_deprecated": "Dieser Befehl ist veraltet! Bitte nutzen Sie den neuen Befehl 'yunohost user permission update' um das Applabel zu verwalten." + "app_label_deprecated": "Dieser Befehl ist veraltet! Bitte nutzen Sie den neuen Befehl 'yunohost user permission update' um das Applabel zu verwalten.", + "diagnosis_http_hairpinning_issue_details": "Das ist wahrscheinlich aufgrund Ihrer ISP Box / Router. Als Konsequenz können Personen von ausserhalb Ihres Netzwerkes aber nicht von innerhalb Ihres lokalen Netzwerkes (wie wahrscheinlich Sie selber?) wie gewohnt auf Ihren Server zugreifen, wenn Sie ihre Domäne oder Ihre öffentliche IP verwenden. Sie können die Situation wahrscheinlich verbessern, indem Sie ein einen Blick in https://yunohost.org/dns_local_network werfen" } From 5fc83c1009520f4c249cd8d3d68524c425136e65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Villarreal?= Date: Thu, 5 Nov 2020 16:48:44 +0000 Subject: [PATCH 055/128] Translated using Weblate (Spanish) Currently translated at 75.9% (478 of 629 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/locales/es.json b/locales/es.json index cd0d1dc57..50d1a6e1b 100644 --- a/locales/es.json +++ b/locales/es.json @@ -605,5 +605,31 @@ "diagnosis_dns_point_to_doc": "Por favor, consulta la documentación en https://yunohost.org/dns_config si necesitas ayuda para configurar los registros DNS.", "diagnosis_ip_global": "IP Global: {global}", "diagnosis_mail_outgoing_port_25_ok": "El servidor de email SMTP puede mandar emails (puerto saliente 25 no está bloqueado).", - "diagnosis_mail_outgoing_port_25_blocked_details": "Deberías intentar desbloquear el puerto 25 saliente en la interfaz de tu router o en la interfaz de tu provedor de hosting. (Algunos hosting pueden necesitar que les abras un ticket de soporte para esto)." + "diagnosis_mail_outgoing_port_25_blocked_details": "Deberías intentar desbloquear el puerto 25 saliente en la interfaz de tu router o en la interfaz de tu provedor de hosting. (Algunos hosting pueden necesitar que les abras un ticket de soporte para esto).", + "diagnosis_swap_tip": "Por favor tenga cuidado y sepa que si el servidor contiene swap en una tarjeta SD o un disco duro de estado sólido, esto reducirá drásticamente la vida útil del dispositivo.", + "diagnosis_domain_expires_in": "{domain} expira en {days} días.", + "diagnosis_domain_expiration_error": "¡Algunos dominios expirarán MUY PRONTO!", + "diagnosis_domain_expiration_warning": "¡Algunos dominios expirarán pronto!", + "diagnosis_domain_expiration_success": "Sus dominios están registrados y no expirarán pronto.", + "diagnosis_domain_expiration_not_found_details": "¿Parece que la información de WHOIS para el dominio {domain} no contiene información sobre la fecha de expiración?", + "diagnosis_domain_not_found_details": "¡El dominio {domain} no existe en la base de datos WHOIS o ha expirado!", + "diagnosis_domain_expiration_not_found": "No se pudo revisar la fecha de expiración para algunos dominios", + "diagnosis_dns_try_dyndns_update_force": "La configuración DNS de este dominio debería ser administrada automáticamente por Yunohost. Si no es el caso, puede intentar forzar una actualización ejecutando yunohost dyndns update --force.", + "diagnosis_ip_local": "IP Local: {local}", + "diagnosis_ip_no_ipv6_tip": "Tener IPv6 funcionando no es obligatorio para que su servidor funcione, pero es mejor para la salud del Internet en general. IPv6 debería ser configurado automáticamente por el sistema o su proveedor si está disponible. De otra manera, es posible que tenga que configurar varias cosas manualmente, tal y como se explica en esta documentación https://yunohost.org/#/ipv6. Si no puede habilitar IPv6 o si parece demasiado técnico, puede ignorar esta advertencia con toda seguridad.", + "diagnosis_display_tip": "Para ver los problemas encontrados, puede ir a la sección de diagnóstico del webadmin, o ejecutar 'yunohost diagnosis show --issues' en la línea de comandos.", + "diagnosis_package_installed_from_sury_details": "Algunos paquetes fueron accidentalmente instalados de un repositorio de terceros llamado Sury. El equipo Yunohost ha mejorado la estrategia para manejar estos pquetes, pero es posible que algunas instalaciones con aplicaciones de PHP7.3 en Stretch puedan tener algunas inconsistencias. Para solucionar esta situación, debería intentar ejecutar el siguiente comando: {cmd_to_fix}", + "diagnosis_package_installed_from_sury": "Algunos paquetes del sistema deberían ser devueltos a una versión anterior", + "certmanager_domain_not_diagnosed_yet": "Aún no hay resultado del diagnóstico para el dominio {domain}. Por favor ejecute el diagnóstico para las categorías 'Registros DNS' y 'Web' en la sección de diagnóstico para verificar si el dominio está listo para Let's Encrypt. (O si sabe lo que está haciendo, utilice '--no-checks' para deshabilitar esos chequeos.)", + "backup_archive_corrupted": "Parece que el archivo de respaldo '{archive}' está corrupto : {error}", + "backup_archive_cant_retrieve_info_json": "No se pudieron cargar informaciones para el archivo '{archive}'... El archivo info.json no se puede cargar (o no es un json válido).", + "ask_user_domain": "Dominio a usar para la dirección de correo del usuario y cuenta XMPP", + "app_packaging_format_not_supported": "Esta aplicación no se puede instalar porque su formato de empaque no está soportado por su versión de YunoHost. Considere actualizar su sistema.", + "app_manifest_install_ask_is_public": "¿Debería exponerse esta aplicación a visitantes anónimos?", + "app_manifest_install_ask_admin": "Elija un usuario administrativo para esta aplicación", + "app_manifest_install_ask_password": "Elija una contraseña de administración para esta aplicación", + "app_manifest_install_ask_path": "Seleccione el path donde esta aplicación debería ser instalada", + "app_manifest_install_ask_domain": "Seleccione el dominio donde esta app debería ser instalada", + "app_label_deprecated": "Este comando está depreciado! Favor usar el nuevo comando 'yunohost user permission update' para administrar la etiqueta de app.", + "app_argument_password_no_default": "Error al interpretar argumento de contraseña'{name}': El argumento de contraseña no puede tener un valor por defecto por razón de seguridad" } From 9ecb1fdd7ce2692622eb1d5f9499bae8df5c91bc Mon Sep 17 00:00:00 2001 From: Flavio Cristoforetti Date: Wed, 11 Nov 2020 13:36:31 +0000 Subject: [PATCH 056/128] Translated using Weblate (Italian) Currently translated at 28.6% (180 of 629 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/it/ --- locales/it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/it.json b/locales/it.json index c00694394..bb538f25f 100644 --- a/locales/it.json +++ b/locales/it.json @@ -358,5 +358,6 @@ "app_manifest_install_ask_password": "Scegli una password di amministrazione per quest'applicazione", "app_manifest_install_ask_path": "Scegli il percorso dove installare quest'applicazione", "app_manifest_install_ask_domain": "Scegli il dominio sotto il quale installare quest'applicazione", - "app_argument_password_no_default": "Errore nell'analisi dell'argomento '{name}': l'argomento di password non può avere un valore di default per ragioni di sicurezza" + "app_argument_password_no_default": "Errore durante il parsing dell'argomento '{name}': l'argomento password non può avere un valore di default per ragioni di sicurezza", + "additional_urls_already_added": "L'URL aggiuntivo '{url:s}' è già utilizzato come URL aggiuntivo per il permesso '{permission:s}'" } From ed10b535ca54ccccf684df2ceaa5d4dd9b012a9c Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 18 Nov 2020 19:55:23 +0000 Subject: [PATCH 057/128] Added translation using Weblate (Czech) --- locales/cs.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 locales/cs.json diff --git a/locales/cs.json b/locales/cs.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/locales/cs.json @@ -0,0 +1 @@ +{} From 1385d34539d8a865c01177dda082fb6fe85fe55f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= Date: Thu, 19 Nov 2020 17:21:41 +0000 Subject: [PATCH 058/128] Translated using Weblate (French) Currently translated at 96.9% (610 of 629 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index 2bb92cbd5..6276ff6df 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -671,5 +671,21 @@ "pattern_email_forward": "Il doit s'agir d'une adresse électronique valide, le symbole '+' étant accepté (par exemples : johndoe@exemple.com ou bien johndoe+yunohost@exemple.com)", "global_settings_setting_smtp_relay_password": "Mot de passe SMTP du serveur de courrier électronique", "diagnosis_package_installed_from_sury": "Certains paquets du système devraient être rétrograder vers une version moins récente", - "additional_urls_already_added": "URL supplémentaire '{url:s}' déjà ajoutée pour la permission '{permission:s}'" + "additional_urls_already_added": "URL supplémentaire '{url:s}' déjà ajoutée pour la permission '{permission:s}'", + "unknown_main_domain_path": "Domaine ou chemin inconnu pour '{app}'. Vous devez spécifier un domaine et un chemin pour pouvoir spécifier une URL pour l'autorisation.", + "show_tile_cant_be_enabled_for_regex": "Vous ne pouvez pas activer 'show_tile' pour le moment, car l'URL de l'autorisation '{permission}' est une expression régulière", + "show_tile_cant_be_enabled_for_url_not_defined": "Vous ne pouvez pas activer 'show_tile' pour le moment, car vous devez d'abord définir une URL pour l'autorisation '{permission}'", + "regex_with_only_domain": "Vous ne pouvez pas utiliser une expression régulière pour le domaine, uniquement pour le chemin", + "regex_incompatible_with_tile": "/!\\ Packagers ! La permission '{permission}' a 'show_tile' définie sur 'true' et vous ne pouvez donc pas définir une URL regex comme URL principale", + "permission_protected": "L'autorisation {permission} est protégée. Vous ne pouvez pas ajouter ou supprimer le groupe visiteurs à/de cette autorisation.", + "migration_0019_slapd_config_will_be_overwritten": "Il semble que vous ayez modifié manuellement la configuration de slapd. Pour cette migration critique, YunoHost doit forcer la mise à jour de la configuration slapd. Les fichiers originaux seront sauvegardés dans {conf_backup_folder}.", + "migration_0019_migration_failed_trying_to_rollback": "Impossible de migrer... tentative de restauration du système.", + "migration_0019_can_not_backup_before_migration": "La sauvegarde du système n'a pas pu être effectuée avant l'échec de la migration. Erreur : {error:s}", + "migration_0019_backup_before_migration": "Création d'une sauvegarde de la base de données LDAP et des paramètres des applications avant la migration.", + "migration_0019_add_new_attributes_in_ldap": "Ajouter de nouveaux attributs pour les autorisations dans la base de données LDAP", + "migrating_legacy_permission_settings": "Migration des anciens paramètres d'autorisation...", + "invalid_regex": "Regex non valide : '{regex:s}'", + "domain_name_unknown": "Domaine '{domain}' inconnu", + "app_label_deprecated": "Cette commande est obsolète ! Veuillez utiliser la nouvelle commande 'yunohost user permission update' pour gérer l'étiquette de l'application.", + "additional_urls_already_removed": "URL supplémentaire '{url:s}' déjà supprimée pour la permission '{permission:s}'" } From ccb6f5ccd8a3a3886e67321064fdf1a27aeacc41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= Date: Thu, 19 Nov 2020 16:50:09 +0000 Subject: [PATCH 059/128] Translated using Weblate (Portuguese) Currently translated at 6.2% (39 of 629 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/pt/ --- locales/pt.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/pt.json b/locales/pt.json index bd5ba3bc6..9375f2354 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -139,5 +139,6 @@ "backup_copying_to_organize_the_archive": "Copiando {size:s}MB para organizar o arquivo", "app_change_url_identical_domains": "O antigo e o novo domínio / url_path são idênticos ('{domain:s}{path:s}'), nada para fazer.", "password_too_simple_1": "A senha precisa ter pelo menos 8 caracteres", - "admin_password_too_long": "Escolha uma senha que contenha menos de 127 caracteres" -} \ No newline at end of file + "admin_password_too_long": "Escolha uma senha que contenha menos de 127 caracteres", + "aborting": "Abortando." +} From 9fd0acb0dfdf95d78614cabe10a573baca1c78ff Mon Sep 17 00:00:00 2001 From: Flavio Cristoforetti Date: Fri, 20 Nov 2020 15:43:10 +0000 Subject: [PATCH 060/128] Translated using Weblate (Italian) Currently translated at 31.7% (200 of 629 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/it/ --- locales/it.json | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/locales/it.json b/locales/it.json index bb538f25f..81bcaf6dc 100644 --- a/locales/it.json +++ b/locales/it.json @@ -170,14 +170,14 @@ "certmanager_certificate_fetching_or_enabling_failed": "Il tentativo di usare il nuovo certificato per {domain:s} non funziona...", "certmanager_attempt_to_renew_nonLE_cert": "Il certificato per il dominio {domain:s} non è emesso da Let's Encrypt. Impossibile rinnovarlo automaticamente!", "certmanager_attempt_to_renew_valid_cert": "Il certificato per il dominio {domain:s} non è in scadenza! (Puoi usare --force per forzare se sai quel che stai facendo)", - "certmanager_domain_http_not_working": "Sembra che non sia possibile accedere al dominio {domain:s} attraverso HTTP. Verifica la configurazione del DNS e di nginx", + "certmanager_domain_http_not_working": "Il dominio {domain:s} non sembra accessibile attraverso HTTP. Verifica nella sezione 'Web' nella diagnosi per maggiori informazioni. (Se sai cosa stai facendo, usa '--no-checks' per disattivare i controlli.)", "app_already_installed_cant_change_url": "Questa applicazione è già installata. L'URL non può essere cambiato solo da questa funzione. Controlla se `app changeurl` è disponibile.", "app_already_up_to_date": "{app:s} è già aggiornata", "app_change_url_failed_nginx_reload": "Non riesco a riavviare NGINX. Questo è il risultato di 'nginx -t':\n{nginx_errors:s}", "app_change_url_identical_domains": "Il vecchio ed il nuovo dominio/percorso_url sono identici ('{domain:s}{path:s}'), nessuna operazione necessaria.", "app_change_url_no_script": "L'applicazione '{app_name:s}' non supporta ancora la modifica dell'URL. Forse dovresti aggiornarla.", "app_change_url_success": "L'URL dell'applicazione {app:s} è stato cambiato in {domain:s}{path:s}", - "app_make_default_location_already_used": "Impostazione dell'applicazione '{app}' come predefinita del dominio non riuscita perché il dominio {domain} è già in uso per l'altra applicazione '{other_app}'", + "app_make_default_location_already_used": "Impostazione dell'applicazione '{app}' come predefinita del dominio non riuscita perché il dominio '{domain}' è in uso per dall'applicazione '{other_app}'", "app_location_unavailable": "Questo URL non è più disponibile o va in conflitto con la/le applicazione/i già installata/e:\n{apps:s}", "app_upgrade_app_name": "Aggiornamento di {app}...", "app_upgrade_some_app_failed": "Alcune applicazioni non possono essere aggiornate", @@ -237,16 +237,16 @@ "backup_output_symlink_dir_broken": "La tua cartella d'archivio '{path:s}' è un link simbolico interrotto. Probabilmente hai dimenticato di montare o montare nuovamente il supporto al quale punta il link.", "certmanager_conflicting_nginx_file": "Impossibile preparare il dominio per il controllo ACME: il file di configurazione nginx {filepath:s} è in conflitto e dovrebbe essere prima rimosso", "certmanager_couldnt_fetch_intermediate_cert": "Tempo scaduto durante il tentativo di recupero di un certificato intermedio da Let's Encrypt. Installazione/rinnovo non riuscito - per favore riprova più tardi.", - "certmanager_domain_dns_ip_differs_from_public_ip": "Il valore DNS 'A' per il dominio {domain:s} è diverso dall'IP di questo server. Se hai modificato recentemente il tuo valore A, attendi che si propaghi (esistono online alcuni siti per il controllo della propagazione DNS). (Se sai cosa stai facendo, usa --no-checks per disabilitare quei controlli.)", + "certmanager_domain_dns_ip_differs_from_public_ip": "I record DNS per il dominio '{domain:s}' è diverso dall'IP di questo server. Controlla la sezione (basic) 'Record DNS' nella diagnosi per maggiori informazioni. Se hai modificato recentemente il tuo valore A, attendi che si propaghi (esistono online alcuni siti per il controllo della propagazione DNS). (Se sai cosa stai facendo, usa '--no-checks' per disattivare i controlli.)", "certmanager_error_no_A_record": "Nessun valore DNS 'A' trovato per {domain:s}. Devi far puntare il tuo nome di dominio verso la tua macchina per essere in grado di installare un certificato Let's Encrypt! (Se sai cosa stai facendo, usa --no-checks per disabilitare quei controlli.)", - "certmanager_hit_rate_limit": "Troppi certificati già rilasciati per l'esatta serie di dominii {domain:s} recentemente. Per favore riprova più tardi. Guarda https://letsencrypt.org/docs/rate-limits/ per maggiori dettagli", + "certmanager_hit_rate_limit": "Troppi certificati già rilasciati per questa esatta serie di domini {domain:s} recentemente. Per favore riprova più tardi. Guarda https://letsencrypt.org/docs/rate-limits/ per maggiori dettagli", "certmanager_http_check_timeout": "Tempo scaduto durante il tentativo di contatto del tuo server a se stesso attraverso HTTP utilizzando l'indirizzo IP pubblico (dominio {domain:s} con ip {ip:s}). Potresti avere un problema di hairpinning o il firewall/router davanti al tuo server non è correttamente configurato.", "certmanager_no_cert_file": "Impossibile leggere il file di certificato per il dominio {domain:s} (file: {file:s})", - "certmanager_self_ca_conf_file_not_found": "File di configurazione non trovato per l'autorità di autofirma (file: {file:s})", - "certmanager_unable_to_parse_self_CA_name": "Impossibile analizzare il nome dell'autorità di autofirma (file: {file:s})", - "confirm_app_install_warning": "Attenzione: questa applicazione potrebbe funzionare ma non è ben integrata in YunoHost. Alcune funzionalità come l'accesso unico e il backup/ripristino potrebbero non essere disponibili. Installare comunque? [{answers:s}] ", - "confirm_app_install_danger": "ATTENZIONE! Questa applicazione è ancora sperimentale (se non esplicitamente non funzionante) e probabilmente potrebbe danneggiare il tuo sistema! Probabilmente NON dovresti installarla a meno che tu non sappia cosa stai facendo. Sicuro di volerti prendere questo rischio? [{answers:s}] ", - "confirm_app_install_thirdparty": "ATTENZIONE! Installando applicazioni di terze parti potresti compromettere l'integrita e la sicurezza del tuo sistema. Probabilmente NON dovresti installarle a meno che tu non sappia cosa stai facendo. Sicuro di volerti prendere questo rischio? [{answers:s}] ", + "certmanager_self_ca_conf_file_not_found": "File di configurazione non trovato per l'autorità di auto-firma (file: {file:s})", + "certmanager_unable_to_parse_self_CA_name": "Impossibile analizzare il nome dell'autorità di auto-firma (file: {file:s})", + "confirm_app_install_warning": "Attenzione: Questa applicazione potrebbe funzionare, ma non è ben integrata in YunoHost. Alcune funzionalità come il single sign-on e il backup/ripristino potrebbero non essere disponibili. Installare comunque? [{answers:s}] ", + "confirm_app_install_danger": "ATTENZIONE! Questa applicazione è ancora sperimentale (se non esplicitamente dichiarata non funzionante)! Probabilmente NON dovresti installarla a meno che tu non sappia cosa stai facendo. NESSUN SUPPORTO verrà dato se quest'app non funziona o se rompe il tuo sistema... Se comunque accetti di prenderti questo rischio,digita '{answers:s}'", + "confirm_app_install_thirdparty": "PERICOLO! Quest'applicazione non fa parte del catalogo Yunohost. Installando app di terze parti potresti compromettere l'integrita e la sicurezza del tuo sistema. Probabilmente NON dovresti installarla a meno che tu non sappia cosa stai facendo. NESSUN SUPPORTO verrà dato se quest'app non funziona o se rompe il tuo sistema... Se comunque accetti di prenderti questo rischio, digita '{answers:s}'", "dpkg_is_broken": "Non puoi eseguire questo ora perchè dpkg/apt (i gestori di pacchetti del sistema) sembrano essere in stato danneggiato... Puoi provare a risolvere il problema connettendoti via SSH ed eseguire `sudo dpkg --configure -a`.", "domain_cannot_remove_main": "Non è possibile rimuovere il dominio principale ora. Prima imposta un nuovo dominio principale", "domain_dns_conf_is_just_a_recommendation": "Questo comando ti mostra qual è la configurazione *raccomandata*. Non ti imposta la configurazione DNS al tuo posto. È tua responsabilità configurare la tua zona DNS nel tuo registrar in accordo con queste raccomandazioni.", @@ -350,7 +350,7 @@ "backup_archive_corrupted": "Sembra che l'archivio di backup '{archive}' sia corrotto: {error}", "backup_archive_cant_retrieve_info_json": "Impossibile caricare informazione per l'archivio '{archive}'... Impossibile scaricare info.json (oppure non è un json valido).", "app_packaging_format_not_supported": "Quest'applicazione non può essere installata perché il formato non è supportato dalla vostra versione di YunoHost. Dovreste considerare di aggiornare il vostro sistema.", - "certmanager_domain_not_diagnosed_yet": "Non c'è ancora alcun risultato di diagnosi per il dominio {domain}. Riavvia una diagnosi per la categoria 'DNS records' e 'Web' nella sezione di diagnosi per verificare se il dominio è pronto per Let's Encrypt. (Oppure se sai quel che stai facendo puoi usare '--no-checks' per disabilitare questi controlli.)", + "certmanager_domain_not_diagnosed_yet": "Non c'è ancora alcun risultato di diagnosi per il dominio {domain}. Riavvia una diagnosi per la categoria 'DNS records' e 'Web' nella sezione di diagnosi per verificare se il dominio è pronto per Let's Encrypt. (Se sai cosa stai facendo, usa '--no-checks' per disattivare i controlli.)", "backup_permission": "Backup dei permessi per {app:s}", "ask_user_domain": "Dominio da usare per l'indirizzo email e l'account XMPP dell'utente", "app_manifest_install_ask_is_public": "Quest'applicazione dovrà essere visibile ai visitatori anonimi?", @@ -359,5 +359,15 @@ "app_manifest_install_ask_path": "Scegli il percorso dove installare quest'applicazione", "app_manifest_install_ask_domain": "Scegli il dominio sotto il quale installare quest'applicazione", "app_argument_password_no_default": "Errore durante il parsing dell'argomento '{name}': l'argomento password non può avere un valore di default per ragioni di sicurezza", - "additional_urls_already_added": "L'URL aggiuntivo '{url:s}' è già utilizzato come URL aggiuntivo per il permesso '{permission:s}'" + "additional_urls_already_added": "L'URL aggiuntivo '{url:s}' è già utilizzato come URL aggiuntivo per il permesso '{permission:s}'", + "diagnosis_basesystem_ynh_inconsistent_versions": "Stai eseguendo versioni incompatibili dei pacchetti YunoHost... probabilmente a causa di aggiornamenti falliti o parziali.", + "diagnosis_basesystem_ynh_main_version": "Il server sta eseguendo YunoHost {main_version} ({repo})", + "diagnosis_basesystem_ynh_single_version": "Versione {package}: {version} ({repo})", + "diagnosis_basesystem_kernel": "Il server sta eseguendo Linux kernel {kernel_version}", + "diagnosis_basesystem_host": "Il server sta eseguendo Debian {debian_version}", + "diagnosis_basesystem_hardware_board": "Il modello della scheda server è {model}", + "diagnosis_basesystem_hardware": "L'architettura hardware del server è {virt} {arch}", + "certmanager_warning_subdomain_dns_record": "Il sottodominio '{subdomain:s}' non si risolve nello stesso indirizzo IP di '{domain:s}'. Alcune funzioni non saranno disponibili finchè questa cosa non verrà sistemata e rigenerato il certificato.", + "app_label_deprecated": "Questo comando è deprecato! Utilizza il nuovo comando 'yunohost user permission update' per gestire la label dell'app.", + "additional_urls_already_removed": "L'URL aggiuntivo '{url:s}' è già stato rimosso come URL aggiuntivo per il permesso '{permission:s}'" } From 450653a6ba155716ede496b0291b3b351ab8b4bc Mon Sep 17 00:00:00 2001 From: Flavio Cristoforetti Date: Fri, 27 Nov 2020 14:25:13 +0000 Subject: [PATCH 061/128] Translated using Weblate (Italian) Currently translated at 38.4% (242 of 629 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/it/ --- locales/it.json | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/locales/it.json b/locales/it.json index 81bcaf6dc..d2347d3aa 100644 --- a/locales/it.json +++ b/locales/it.json @@ -369,5 +369,48 @@ "diagnosis_basesystem_hardware": "L'architettura hardware del server è {virt} {arch}", "certmanager_warning_subdomain_dns_record": "Il sottodominio '{subdomain:s}' non si risolve nello stesso indirizzo IP di '{domain:s}'. Alcune funzioni non saranno disponibili finchè questa cosa non verrà sistemata e rigenerato il certificato.", "app_label_deprecated": "Questo comando è deprecato! Utilizza il nuovo comando 'yunohost user permission update' per gestire la label dell'app.", - "additional_urls_already_removed": "L'URL aggiuntivo '{url:s}' è già stato rimosso come URL aggiuntivo per il permesso '{permission:s}'" + "additional_urls_already_removed": "L'URL aggiuntivo '{url:s}' è già stato rimosso come URL aggiuntivo per il permesso '{permission:s}'", + "diagnosis_services_bad_status_tip": "Puoi provare a riavviare il servizio, e se non funziona, controlla ai log del servizio in amministrazione (dalla linea di comando, puoi farlo con yunohost service restart {service} e yunohost service log {service}).", + "diagnosis_services_bad_status": "Il servizio {service} è {status} :(", + "diagnosis_services_conf_broken": "Il servizio {service} è mal-configurato!", + "diagnosis_services_running": "Il servizio {service} sta funzionando!", + "diagnosis_domain_expires_in": "{domain} scadrà tra {days} giorni.", + "diagnosis_domain_expiration_error": "Alcuni domini scadranno MOLTO PRESTO!", + "diagnosis_domain_expiration_warning": "Alcuni domini scadranno a breve!", + "diagnosis_domain_expiration_success": "I tuoi domini sono registrati e non scadranno a breve.", + "diagnosis_domain_expiration_not_found_details": "Le informazioni WHOIS per il dominio {domain} non sembrano contenere la data di scadenza, giusto?", + "diagnosis_domain_not_found_details": "Il dominio {domain} non esiste nel database WHOIS o è scaduto!", + "diagnosis_domain_expiration_not_found": "Non riesco a controllare la data di scadenza di alcuni domini", + "diagnosis_dns_try_dyndns_update_force": "La configurazione DNS di questo dominio dovrebbe essere gestita automaticamente da Yunohost. Se non avviene, puoi provare a forzare un aggiornamento usando il comando yunohost dyndns update --force.", + "diagnosis_dns_point_to_doc": "Controlla la documentazione a https://yunohost.org/dns_config se hai bisogno di aiuto nel configurare i record DNS.", + "diagnosis_dns_discrepancy": "Il record DNS non sembra seguire la configurazione DNS raccomandata:
Type: {type}
Name: {name}
Current value: {current}
Expected value: {value}", + "diagnosis_dns_missing_record": "Stando alla configurazione DNS raccomandata, dovresti aggiungere un record DNS con le seguenti informazioni.
Type: {type}
Name: {name}
Value: {value}", + "diagnosis_dns_bad_conf": "Alcuni record DNS sono mancanti o incorretti per il dominio {domain} (categoria {category})", + "diagnosis_dns_good_conf": "I recordDNS sono configurati correttamente per il dominio {domain} (categoria {category})", + "diagnosis_ip_weird_resolvconf_details": "Il file /etc/resolv.conf dovrebbe essere un symlink a /etc/resolvconf/run/resolv.conf che punta a 127.0.0.1 (dnsmasq). Se vuoi configurare manualmente i DNS, modifica /etc/resolv.dnsmasq.conf.", + "diagnosis_ip_weird_resolvconf": "La risoluzione dei nomi di rete sembra funzionare, ma mi pare che tu stia usando un /etc/resolv.conf personalizzato.", + "diagnosis_ip_broken_resolvconf": "La risoluzione dei nomi di rete sembra non funzionare sul tuo server, e sembra collegato a /etc/resolv.conf che non punta a 127.0.0.1.", + "diagnosis_ip_broken_dnsresolution": "La risoluzione dei nomi di rete sembra non funzionare per qualche ragione... È presente un firewall che blocca le richieste DNS?", + "diagnosis_ip_dnsresolution_working": "Risoluzione dei nomi di rete funzionante!", + "diagnosis_ip_not_connected_at_all": "Sei sicuro che il server sia collegato ad Internet!?", + "diagnosis_ip_local": "IP locale: {local}", + "diagnosis_ip_global": "IP globale: {global}", + "diagnosis_ip_no_ipv6_tip": "Avere IPv6 funzionante non è obbligatorio per far funzionare il server, ma è un bene per Internet stesso. IPv6 dovrebbe essere configurato automaticamente dal sistema o dal tuo provider se è disponibile. Altrimenti, potresti aver bisogno di configurare alcune cose manualmente come è spiegato nella documentazione: https://yunohost.org/#/ipv6. Se non puoi abilitare IPv6 o se ti sembra troppo complicato per te, puoi tranquillamente ignorare questo avvertimento.", + "diagnosis_ip_no_ipv6": "Il server non ha IPv6 funzionante.", + "diagnosis_ip_connected_ipv6": "Il server è connesso ad Internet tramite IPv6!", + "diagnosis_ip_no_ipv4": "Il server non ha IPv4 funzionante.", + "diagnosis_ip_connected_ipv4": "Il server è connesso ad Internet tramite IPv4!", + "diagnosis_no_cache": "Nessuna diagnosi nella cache per la categoria '{category}'", + "diagnosis_found_warnings": "Trovato {warning} oggetti che potrebbero essere migliorati per {category}.", + "diagnosis_failed": "Recupero dei risultati della diagnosi per la categoria '{category}' fallito: {error}", + "diagnosis_everything_ok": "Tutto ok per {category}!", + "diagnosis_found_errors_and_warnings": "Trovato {errors} problemi (e {warnings} alerts) significativi collegati a {category}!", + "diagnosis_found_errors": "Trovato {errors} problemi significativi collegati a {category}!", + "diagnosis_ignored_issues": "(+ {nb_ignored} problemi ignorati)", + "diagnosis_cant_run_because_of_dep": "Impossibile lanciare la diagnosi per {category} mentre ci sono problemi importanti collegati a {dep}.", + "diagnosis_cache_still_valid": "(La cache della diagnosi di {category} è ancora valida. Non la ricontrollo di nuovo per ora!)", + "diagnosis_failed_for_category": "Diagnosi fallita per la categoria '{category}:{error}", + "diagnosis_display_tip": "Per vedere i problemi rilevati, puoi andare alla sezione Diagnosi del amministratore, o eseguire 'yunohost diagnosis show --issues' dalla riga di comando.", + "diagnosis_package_installed_from_sury_details": "Alcuni pacchetti sono stati inavvertitamente installati da un repository di terze parti chiamato Sury. Il team di Yunohost ha migliorato la gestione di tali pacchetti, ma ci si aspetta che alcuni setup di app PHP7.3 abbiano delle incompatibilità anche se sono ancora in Stretch. Per sistemare questa situazione, dovresti provare a lanciare il seguente comando: {cmd_to_fix}", + "diagnosis_package_installed_from_sury": "Alcuni pacchetti di sistema dovrebbero fare il downgrade" } From a54f99117bb50aa59ab158e6a5a807bed93b3ad4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 29 Nov 2020 04:53:53 +0100 Subject: [PATCH 062/128] Fix typo in it string --- locales/it.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/it.json b/locales/it.json index d2347d3aa..e70f00a37 100644 --- a/locales/it.json +++ b/locales/it.json @@ -401,7 +401,7 @@ "diagnosis_ip_no_ipv4": "Il server non ha IPv4 funzionante.", "diagnosis_ip_connected_ipv4": "Il server è connesso ad Internet tramite IPv4!", "diagnosis_no_cache": "Nessuna diagnosi nella cache per la categoria '{category}'", - "diagnosis_found_warnings": "Trovato {warning} oggetti che potrebbero essere migliorati per {category}.", + "diagnosis_found_warnings": "Trovato {warnings} oggetti che potrebbero essere migliorati per {category}.", "diagnosis_failed": "Recupero dei risultati della diagnosi per la categoria '{category}' fallito: {error}", "diagnosis_everything_ok": "Tutto ok per {category}!", "diagnosis_found_errors_and_warnings": "Trovato {errors} problemi (e {warnings} alerts) significativi collegati a {category}!", From 199cc50f66c34c2447b3e64f773474e027f1cf5e Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 29 Nov 2020 19:55:39 +0100 Subject: [PATCH 063/128] Ignore stupid warnings from apt --- src/yunohost/hook.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/yunohost/hook.py b/src/yunohost/hook.py index f8aff4f6d..22d1ef623 100644 --- a/src/yunohost/hook.py +++ b/src/yunohost/hook.py @@ -319,10 +319,26 @@ def hook_exec(path, args=None, raise_on_error=False, no_trace=False, if not os.path.isfile(path): raise YunohostError('file_does_not_exist', path=path) + def is_relevant_warning(msg): + + # Ignore empty warning messages... + if not msg: + return False + + # Some of these are shit sent from apt and we don't give a shit about + # them because they ain't actual warnings >_> + irrelevant_warnings = [ + r"invalid value for trace file descriptor", + r"Creating config file .* with new version", + r"Created symlink /etc/systemd", + r"dpkg: warning: while removing .* not empty so not removed" + ] + return all(not re.search(w, msg) for w in irrelevant_warnings) + # Define output loggers and call command loggers = ( lambda l: logger.debug(l.rstrip() + "\r"), - lambda l: logger.warning(l.rstrip()) if "invalid value for trace file descriptor" not in l.rstrip() else logger.debug(l.rstrip()), + lambda l: logger.warning(l.rstrip()) if is_relevant_warning(l.rstrip()) else logger.debug(l.rstrip()), lambda l: logger.info(l.rstrip()) ) From 74272de52c7a02ee6d65edb0aacdd769aabb9ae1 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 30 Nov 2020 23:20:13 +0100 Subject: [PATCH 064/128] We need to have YNH_MANIFEST_VERSION also defined during backup/restore (#1088) * We need to have YNH_MANIFEST_VERSION also defined during backup/restore Co-authored-by: Kayou --- src/yunohost/app.py | 72 +++++++++++++++++------------------------- src/yunohost/backup.py | 49 ++++++++-------------------- 2 files changed, 43 insertions(+), 78 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index b8179eead..71aaca316 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -360,13 +360,7 @@ def app_change_url(operation_logger, app, domain, path): args_list.append(app) # Prepare env. var. to pass to script - env_dict = _make_environment_dict(args_odict) - app_id, app_instance_nb = _parse_app_instance_name(app) - env_dict["YNH_APP_ID"] = app_id - env_dict["YNH_APP_INSTANCE_NAME"] = app - env_dict["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb) - env_dict["YNH_APP_MANIFEST_VERSION"] = manifest.get("version", "?") - + env_dict = _make_environment_for_app_script(app, args=args_odict) env_dict["YNH_APP_OLD_DOMAIN"] = old_domain env_dict["YNH_APP_OLD_PATH"] = old_path env_dict["YNH_APP_NEW_DOMAIN"] = domain @@ -528,11 +522,7 @@ def app_upgrade(app=[], url=None, file=None, force=False): args_list.append(app_instance_name) # Prepare env. var. to pass to script - env_dict = _make_environment_dict(args_odict) - app_id, app_instance_nb = _parse_app_instance_name(app_instance_name) - env_dict["YNH_APP_ID"] = app_id - env_dict["YNH_APP_INSTANCE_NAME"] = app_instance_name - env_dict["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb) + env_dict = _make_environment_for_app_script(app_instance_name, args=args_odict) env_dict["YNH_APP_UPGRADE_TYPE"] = upgrade_type env_dict["YNH_APP_MANIFEST_VERSION"] = str(app_new_version) env_dict["YNH_APP_CURRENT_VERSION"] = str(app_current_version) @@ -762,20 +752,6 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu # Apply dirty patch to make php5 apps compatible with php7 _patch_legacy_php_versions(extracted_app_folder) - # Prepare env. var. to pass to script - env_dict = _make_environment_dict(args_odict) - env_dict["YNH_APP_ID"] = app_id - env_dict["YNH_APP_INSTANCE_NAME"] = app_instance_name - env_dict["YNH_APP_INSTANCE_NUMBER"] = str(instance_number) - env_dict["YNH_APP_MANIFEST_VERSION"] = manifest.get("version", "?") - - env_dict_for_logging = env_dict.copy() - for arg_name, arg_value_and_type in args_odict.items(): - if arg_value_and_type[1] == "password": - del env_dict_for_logging["YNH_APP_ARG_%s" % arg_name.upper()] - - operation_logger.extra.update({'env': env_dict_for_logging}) - # We'll check that the app didn't brutally edit some system configuration manually_modified_files_before_install = manually_modified_files() @@ -827,6 +803,16 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu # will be enabled during the app install. C.f. 'app_register_url()' below. permission_create(app_instance_name + ".main", allowed=["all_users"], label=label, show_tile=False, protected=False) + # Prepare env. var. to pass to script + env_dict = _make_environment_for_app_script(app_instance_name, args=args_odict) + + env_dict_for_logging = env_dict.copy() + for arg_name, arg_value_and_type in args_odict.items(): + if arg_value_and_type[1] == "password": + del env_dict_for_logging["YNH_APP_ARG_%s" % arg_name.upper()] + + operation_logger.extra.update({'env': env_dict_for_logging}) + # Execute the app install script install_failed = True try: @@ -1476,12 +1462,7 @@ def app_action_run(operation_logger, app, action, args=None): args_odict = _parse_args_for_action(actions[action], args=args_dict) args_list = [value[0] for value in args_odict.values()] - app_id, app_instance_nb = _parse_app_instance_name(app) - - env_dict = _make_environment_dict(args_odict, prefix="ACTION_") - env_dict["YNH_APP_ID"] = app_id - env_dict["YNH_APP_INSTANCE_NAME"] = app - env_dict["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb) + env_dict = _make_environment_for_app_script(app, args=args_odict, args_prefix="ACTION_") env_dict["YNH_ACTION"] = action _, path = tempfile.mkstemp() @@ -1492,7 +1473,7 @@ def app_action_run(operation_logger, app, action, args=None): os.chmod(path, 700) if action_declaration.get("cwd"): - cwd = action_declaration["cwd"].replace("$app", app_id) + cwd = action_declaration["cwd"].replace("$app", app) else: cwd = "/etc/yunohost/apps/" + app @@ -2778,18 +2759,23 @@ def _assert_no_conflicting_apps(domain, path, ignore_app=None, full_domain=False raise YunohostError('app_location_unavailable', apps="\n".join(apps)) -def _make_environment_dict(args_dict, prefix="APP_ARG_"): - """ - Convert a dictionnary containing manifest arguments - to a dictionnary of env. var. to be passed to scripts +def _make_environment_for_app_script(app, args={}, args_prefix="APP_ARG_"): - Keyword arguments: - arg -- A key/value dictionnary of manifest arguments + app_setting_path = os.path.join(APPS_SETTING_PATH, app) + + manifest = _get_manifest_of_app(app_setting_path) + app_id, app_instance_nb = _parse_app_instance_name(app) + + env_dict = { + "YNH_APP_ID": app_id, + "YNH_APP_INSTANCE_NAME": app, + "YNH_APP_INSTANCE_NUMBER": str(app_instance_nb), + "YNH_APP_MANIFEST_VERSION": manifest.get("version", "?") + } + + for arg_name, arg_value_and_type in args.items(): + env_dict["YNH_%s%s" % (args_prefix, arg_name.upper())] = arg_value_and_type[0] - """ - env_dict = {} - for arg_name, arg_value_and_type in args_dict.items(): - env_dict["YNH_%s%s" % (prefix, arg_name.upper())] = arg_value_and_type[0] return env_dict diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index 943fab592..c0f11eae8 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -44,7 +44,7 @@ from moulinette.utils.filesystem import read_file, mkdir, write_to_yaml, read_ya from yunohost.app import ( app_info, _is_installed, - _parse_app_instance_name, + _make_environment_for_app_script, dump_app_log_extract_for_debugging, _patch_legacy_helpers, _patch_legacy_php_versions, @@ -553,13 +553,8 @@ class BackupManager(): env_var['YNH_BACKUP_CSV'] = tmp_csv if app is not None: - app_id, app_instance_nb = _parse_app_instance_name(app) - env_var["YNH_APP_ID"] = app_id - env_var["YNH_APP_INSTANCE_NAME"] = app - env_var["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb) - tmp_app_dir = os.path.join('apps/', app) - tmp_app_bkp_dir = os.path.join(self.work_dir, tmp_app_dir, 'backup') - env_var["YNH_APP_BACKUP_DIR"] = tmp_app_bkp_dir + env_var.update(_make_environment_for_app_script(app)) + env_var["YNH_APP_BACKUP_DIR"] = os.path.join(self.work_dir, 'apps', app, 'backup') return env_var @@ -1165,7 +1160,10 @@ class RestoreManager(): logger.debug(m18n.n('restore_running_hooks')) - env_dict = self._get_env_var() + env_dict = { + 'YNH_BACKUP_DIR': self.work_dir, + 'YNH_BACKUP_CSV': os.path.join(self.work_dir, "backup.csv") + } operation_logger.extra['env'] = env_dict operation_logger.flush() ret = hook_callback('restore', @@ -1372,7 +1370,12 @@ class RestoreManager(): migrate_legacy_permission_settings(app=app_instance_name) # Prepare env. var. to pass to script - env_dict = self._get_env_var(app_instance_name) + env_dict = _make_environment_for_app_script(app_instance_name) + env_dict.update({ + 'YNH_BACKUP_DIR': self.work_dir, + 'YNH_BACKUP_CSV': os.path.join(self.work_dir, "backup.csv"), + 'YNH_APP_BACKUP_DIR': os.path.join(self.work_dir, 'apps', app_instance_name, 'backup') + }) operation_logger.extra['env'] = env_dict operation_logger.flush() @@ -1396,11 +1399,7 @@ class RestoreManager(): remove_script = os.path.join(app_scripts_in_archive, 'remove') # Setup environment for remove script - app_id, app_instance_nb = _parse_app_instance_name(app_instance_name) - env_dict_remove = {} - env_dict_remove["YNH_APP_ID"] = app_id - env_dict_remove["YNH_APP_INSTANCE_NAME"] = app_instance_name - env_dict_remove["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb) + env_dict_remove = _make_environment_for_app_script(app_instance_name) operation_logger = OperationLogger('remove_on_failed_restore', [('app', app_instance_name)], @@ -1432,26 +1431,6 @@ class RestoreManager(): # Cleaning temporary scripts directory shutil.rmtree(tmp_folder_for_app_restore, ignore_errors=True) - def _get_env_var(self, app=None): - """ Define environment variable for hooks call """ - env_var = {} - env_var['YNH_BACKUP_DIR'] = self.work_dir - env_var['YNH_BACKUP_CSV'] = os.path.join(self.work_dir, "backup.csv") - - if app is not None: - app_dir_in_archive = os.path.join(self.work_dir, 'apps', app) - app_backup_in_archive = os.path.join(app_dir_in_archive, 'backup') - - # Parse app instance name and id - app_id, app_instance_nb = _parse_app_instance_name(app) - - env_var["YNH_APP_ID"] = app_id - env_var["YNH_APP_INSTANCE_NAME"] = app - env_var["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb) - env_var["YNH_APP_BACKUP_DIR"] = app_backup_in_archive - - return env_var - # # Backup methods # # From b07fc2061ae7826a9dc8061d5a81c0f210803adf Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 30 Nov 2020 23:20:45 +0100 Subject: [PATCH 065/128] Do not reload php-fpm if conf breaks it (#1087) --- data/helpers.d/php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/data/helpers.d/php b/data/helpers.d/php index 5df31f32b..95cc15402 100644 --- a/data/helpers.d/php +++ b/data/helpers.d/php @@ -256,7 +256,13 @@ WantedBy=multi-user.target # Restart the service, as this service is either stopped or only for this app ynh_systemd_action --service_name=$fpm_service --action=restart else - # Reload PHP, to not impact other parts of the system using PHP + # Validate that the new php conf doesn't break php-fpm entirely + php-fpm${phpversion} --test 2>/dev/null \ + && ynh_systemd_action --service_name=$fpm_service --action=reload \ + || { php-fpm${phpversion} --test || true; + ynh_secure_remove --file="$finalphpconf"; + ynh_die --message="The new configuration broke php-fpm?" + } ynh_systemd_action --service_name=$fpm_service --action=reload fi } From 57d6f7718a2b2fb740de129bed10c7965b7faa9d Mon Sep 17 00:00:00 2001 From: xaloc33 Date: Wed, 2 Dec 2020 16:04:46 +0000 Subject: [PATCH 066/128] Translated using Weblate (Catalan) Currently translated at 100.0% (630 of 630 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ca/ --- locales/ca.json | 48 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/locales/ca.json b/locales/ca.json index 63426c7a6..a99a8c5f5 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -16,7 +16,7 @@ "app_extraction_failed": "No s'han pogut extreure els fitxers d'instal·lació", "app_id_invalid": "ID de l'aplicació incorrecte", "app_install_files_invalid": "Aquests fitxers no es poden instal·lar", - "app_make_default_location_already_used": "No es pot fer l'aplicació '{app}' per defecte en el domini «{domain}» ja que ja és utilitzat per una altra aplicació '{other_app}'", + "app_make_default_location_already_used": "No es pot fer l'aplicació '{app}' l'aplicació per defecte en el domini «{domain}», ja que ja és utilitzat per '{other_app}'", "app_location_unavailable": "Aquesta URL no està disponible o entra en conflicte amb aplicacions ja instal·lades:\n{apps:s}", "app_manifest_invalid": "Hi ha algun error amb el manifest de l'aplicació: {error}", "app_not_correctly_installed": "{app:s} sembla estar mal instal·lada", @@ -300,7 +300,7 @@ "packages_upgrade_failed": "No s'han pogut actualitzar tots els paquets", "pattern_backup_archive_name": "Ha de ser un nom d'arxiu vàlid amb un màxim de 30 caràcters, compost per caràcters alfanumèrics i -_. exclusivament", "pattern_domain": "Ha de ser un nom de domini vàlid (ex.: el-meu-domini.cat)", - "pattern_email": "Ha de ser una adreça de correu vàlida (ex.: algu@domini.cat)", + "pattern_email": "Ha de ser una adreça de correu vàlida, sense el símbol «+» (ex.: algu@domini.cat)", "pattern_firstname": "Ha de ser un nom vàlid", "pattern_lastname": "Ha de ser un cognom vàlid", "pattern_mailbox_quota": "Ha de ser una mida amb el sufix b/k/M/G/T o 0 per no tenir quota", @@ -386,7 +386,7 @@ "service_stop_failed": "No s'ha pogut aturar el servei «{service:s}»\n\nRegistres recents: {logs:s}", "service_stopped": "S'ha aturat el servei «{service:s}»", "service_unknown": "Servei «{service:s}» desconegut", - "ssowat_conf_generated": "S'ha generat la configuració SSOwat", + "ssowat_conf_generated": "S'ha regenerat la configuració SSOwat", "ssowat_conf_updated": "S'ha actualitzat la configuració SSOwat", "system_upgraded": "S'ha actualitzat el sistema", "system_username_exists": "El nom d'usuari ja existeix en la llista d'usuaris de sistema", @@ -442,9 +442,9 @@ "migration_description_0011_setup_group_permission": "Configurar els grups d'usuaris i els permisos per les aplicacions i els serveis", "migration_0011_backup_before_migration": "Creant una còpia de seguretat de la base de dades LDAP i la configuració de les aplicacions abans d'efectuar la migració.", "migration_0011_can_not_backup_before_migration": "No s'ha pogut completar la còpia de seguretat abans de que la migració fallés. Error: {error:s}", - "migration_0011_create_group": "Creant un grup per a cada usuari…", + "migration_0011_create_group": "Creant un grup per a cada usuari...", "migration_0011_done": "Migració completada. Ja podeu gestionar grups d'usuaris.", - "migration_0011_LDAP_update_failed": "Ha fallat l'actualització de LDAP. Error: {error:s}", + "migration_0011_LDAP_update_failed": "No s'ha pogut actualitzar LDAP. Error: {error:s}", "migration_0011_migrate_permission": "Fent la migració dels permisos de la configuració de les aplicacions a LDAP...", "migration_0011_migration_failed_trying_to_rollback": "No s'ha pogut fer la migració… s'intenta tornar el sistema a l'estat anterior.", "migration_0011_rollback_success": "S'ha tornat el sistema a l'estat anterior.", @@ -676,5 +676,41 @@ "migration_0017_postgresql_96_not_installed": "PostgreSQL no està instal·lat en aquest sistema. No s'ha de realitzar cap operació.", "migration_description_0018_xtable_to_nftable": "Migrar les regles del trànsit de xarxa al nou sistema nftable", "migration_description_0017_postgresql_9p6_to_11": "Migrar les bases de dades de PosrgreSQL 9.6 a 11", - "migration_description_0016_php70_to_php73_pools": "Migrar els fitxers de configuració «pool» php7.0-fpm a php7.3" + "migration_description_0016_php70_to_php73_pools": "Migrar els fitxers de configuració «pool» php7.0-fpm a php7.3", + "global_settings_setting_backup_compress_tar_archives": "Comprimir els arxius (.tar.gz) en lloc d'arxius no comprimits (.tar) al crear noves còpies de seguretat. N.B.: activar aquesta opció permet fer arxius de còpia de seguretat més lleugers, però el procés inicial de còpia de seguretat serà significativament més llarg i més exigent a nivell de CPU.", + "global_settings_setting_smtp_relay_host": "L'amfitrió de tramesa SMTP que s'ha d'utilitzar per enviar correus electrònics en lloc d'aquesta instància de YunoHost. És útil si esteu en una de les següents situacions: el port 25 està bloquejat per el vostre proveïdor d'accés a internet o proveïdor de servidor privat virtual, si teniu una IP residencial llistada a DUHL, si no podeu configurar el DNS invers o si el servidor no està directament exposat a internet i voleu utilitzar-ne un altre per enviar correus electrònics.", + "unknown_main_domain_path": "Domini o ruta desconeguda per a «{app}». Heu d'especificar un domini i una ruta per a poder especificar una URL per al permís.", + "show_tile_cant_be_enabled_for_regex": "No podeu activar «show_title» ara, perquè la URL per al permís «{permission}» és una expressió regular", + "show_tile_cant_be_enabled_for_url_not_defined": "No podeu activar «show_title» ara, perquè primer s'ha de definir una URL per al permís «{permission}»", + "regex_with_only_domain": "No podeu utilitzar una expressió regular com a domini, només com a ruta", + "regex_incompatible_with_tile": "/!\\ Empaquetadors! El permís «{permission}» té «show_tile» definit a «true» i pertant no pot definir una URL regex com a URL principal", + "permission_protected": "El permís {permission} està protegit. No podeu afegir o eliminar el grup visitants a o d'aquest permís.", + "pattern_email_forward": "Ha de ser una adreça de correu vàlida, s'accepta el símbol «+» (per exemple, algu+etiqueta@exemple.cat)", + "invalid_number": "Ha de ser una xifra", + "migration_0019_slapd_config_will_be_overwritten": "Sembla que heu modificat manualment la configuració sldap. Per a aquesta migració crítica, YunoHist necessita forçar l'actualització de la configuració sldap. Es crearà una còpia de seguretat dels fitxers originals a {conf_backup_folder}.", + "migration_0019_rollback_success": "S'ha restaurat el sistema.", + "migration_0019_migration_failed_trying_to_rollback": "No s'ha pogut fer la migració... intentant restaurar el sistema.", + "migration_0019_can_not_backup_before_migration": "No s'ha pogut completar la còpia de seguretat del sistema abans de que fallés la migració. Error: {error:s}", + "migration_0019_backup_before_migration": "Creant una còpia de seguretat de la base de dades LDAP i de la configuració de les aplicacions abans de la migració actual.", + "migration_0019_add_new_attributes_in_ldap": "Afegir nous atributs per als permisos en la base de dades LDAP", + "migration_description_0019_extend_permissions_features": "Amplia/refés el sistema de gestió dels permisos de l'aplicació", + "migrating_legacy_permission_settings": "Migració dels paràmetres de permisos antics...", + "invalid_regex": "Regex no vàlid: «{regex:s}»", + "global_settings_setting_smtp_relay_password": "Tramesa de la contrasenya d'amfitrió SMTP", + "global_settings_setting_smtp_relay_user": "Tramesa de compte d'usuari SMTP", + "global_settings_setting_smtp_relay_port": "Port de tramesa SMTP", + "domain_name_unknown": "Domini «{domain}» desconegut", + "diagnosis_processes_killed_by_oom_reaper": "El sistema ha matat alguns processos recentment perquè s'ha quedat sense memòria. Això acostuma a ser un símptoma de falta de memòria en el sistema o d'un procés que consumeix massa memòria. Llista dels processos que s'han matat:\n{kills_summary}", + "diagnosis_package_installed_from_sury_details": "Alguns paquets s'han instal·lat per equivocació des d'un repositori de tercers anomenat Sury. L'equip de YunoHost a millorat l'estratègia per a gestionar aquests paquets, però s'espera que algunes configuracions que han instal·lat aplicacions PHP7.3 a Stretch puguin tenir algunes inconsistències. Per a resoldre aquesta situació, hauríeu d'intentar executar la següent ordre: {cmd_to_fix}", + "diagnosis_package_installed_from_sury": "Alguns paquets del sistema s'han de tornar a versions anteriors", + "ask_user_domain": "Domini a utilitzar per l'adreçar de correu electrònic i per al compte XMPP", + "app_manifest_install_ask_is_public": "Aquesta aplicació hauria de ser visible per a visitants anònims?", + "app_manifest_install_ask_admin": "Escolliu l'usuari administrador per aquesta aplicació", + "app_manifest_install_ask_password": "Escolliu la contrasenya d'administració per aquesta aplicació", + "app_manifest_install_ask_path": "Escolliu la ruta en la que s'hauria d'instal·lar aquesta aplicació", + "app_manifest_install_ask_domain": "Escolliu el domini en el que s'hauria d'instal·lar aquesta aplicació", + "app_label_deprecated": "Aquesta ordre està desestimada! Si us plau utilitzeu la nova ordre «yunohost user permission update» per gestionar l'etiqueta de l'aplicació.", + "app_argument_password_no_default": "Hi ha hagut un error al analitzar l'argument de la contrasenya «{name}»: l'argument de contrasenya no pot tenir un valor per defecte per raons de seguretat", + "additional_urls_already_removed": "URL addicional «{url:s}» ja ha estat eliminada per al permís «{permission:s}»", + "additional_urls_already_added": "URL addicional «{url:s}» ja ha estat afegida per al permís «{permission:s}»" } From 22c1cd8e888e0fb8f7d5f382871625625b6a16fb Mon Sep 17 00:00:00 2001 From: frju365 Date: Thu, 3 Dec 2020 11:59:33 +0100 Subject: [PATCH 067/128] [FIX] New CN for LE. --- src/yunohost/certificate.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index 170e5eb3b..bf8311611 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -651,6 +651,12 @@ def _get_status(domain): "code": "lets-encrypt", "verbose": "Let's Encrypt", } + + elif cert_issuer == "R3": + CA_type = { + "code": "lets-encrypt", + "verbose": "Let's Encrypt", + } elif cert_issuer.startswith("Fake LE"): CA_type = { From cc2dbaa6b15599eb75bd777058e3afea3a4679b8 Mon Sep 17 00:00:00 2001 From: frju365 Date: Thu, 3 Dec 2020 12:09:20 +0100 Subject: [PATCH 068/128] [fix] Factorisons... --- src/yunohost/certificate.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index bf8311611..a0f9d4032 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -646,13 +646,7 @@ def _get_status(domain): "verbose": "Self-signed", } - elif cert_issuer.startswith("Let's Encrypt"): - CA_type = { - "code": "lets-encrypt", - "verbose": "Let's Encrypt", - } - - elif cert_issuer == "R3": + elif cert_issuer.startswith("Let's Encrypt") or cert_issuer == "R3": CA_type = { "code": "lets-encrypt", "verbose": "Let's Encrypt", From d15ccc6c238555d24623a7083db621bd356a9b6f Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 3 Dec 2020 14:39:20 +0100 Subject: [PATCH 069/128] use organization name for LE cert --- src/yunohost/certificate.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index a0f9d4032..8fb9fa684 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -637,6 +637,7 @@ def _get_status(domain): cert_subject = cert.get_subject().CN cert_issuer = cert.get_issuer().CN + organization_name = cert.get_issuer().O valid_up_to = datetime.strptime(cert.get_notAfter(), "%Y%m%d%H%M%SZ") days_remaining = (valid_up_to - datetime.utcnow()).days @@ -646,7 +647,7 @@ def _get_status(domain): "verbose": "Self-signed", } - elif cert_issuer.startswith("Let's Encrypt") or cert_issuer == "R3": + elif organization_name == "Let's Encrypt": CA_type = { "code": "lets-encrypt", "verbose": "Let's Encrypt", From 7780aa658f4b3467326383be1fcb24ab52eaad35 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 3 Dec 2020 14:39:40 +0100 Subject: [PATCH 070/128] fix staging cert url --- src/yunohost/certificate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index 8fb9fa684..c9451c2be 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -61,7 +61,7 @@ KEY_SIZE = 3072 VALIDITY_LIMIT = 15 # days # For tests -STAGING_CERTIFICATION_AUTHORITY = "https://acme-staging.api.letsencrypt.org" +STAGING_CERTIFICATION_AUTHORITY = "https://acme-staging-v02.api.letsencrypt.org" # For prod PRODUCTION_CERTIFICATION_AUTHORITY = "https://acme-v02.api.letsencrypt.org" From 6736f25079b96f38dc542b9da53eccb05837feb4 Mon Sep 17 00:00:00 2001 From: frju365 Date: Thu, 3 Dec 2020 11:59:33 +0100 Subject: [PATCH 071/128] [FIX] New CN for LE. --- src/yunohost/certificate.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index 2118037d9..cecd0a2ea 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -647,6 +647,12 @@ def _get_status(domain): "code": "lets-encrypt", "verbose": "Let's Encrypt", } + + elif cert_issuer == "R3": + CA_type = { + "code": "lets-encrypt", + "verbose": "Let's Encrypt", + } elif cert_issuer.startswith("Fake LE"): CA_type = { From 59018e4e8b116b56fe4741dd46bccb340d508fcd Mon Sep 17 00:00:00 2001 From: frju365 Date: Thu, 3 Dec 2020 12:09:20 +0100 Subject: [PATCH 072/128] [fix] Factorisons... --- src/yunohost/certificate.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index cecd0a2ea..e7d877abf 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -642,13 +642,7 @@ def _get_status(domain): "verbose": "Self-signed", } - elif cert_issuer.startswith("Let's Encrypt"): - CA_type = { - "code": "lets-encrypt", - "verbose": "Let's Encrypt", - } - - elif cert_issuer == "R3": + elif cert_issuer.startswith("Let's Encrypt") or cert_issuer == "R3": CA_type = { "code": "lets-encrypt", "verbose": "Let's Encrypt", From a52b7f0153a174970b63f227320d8c9ed997e87b Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 3 Dec 2020 14:04:53 +0000 Subject: [PATCH 073/128] Update changelog for 4.0.8.3 release --- debian/changelog | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index 846ab8adc..4196e74c8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +yunohost (4.0.8.3) stable; urgency=low + + - [fix] Certificate renewal for LE (#1092) + + Thanks to all contributors <3 ! (frju365) + + -- Kay0u Thu, 03 Dec 2020 14:01:03 +0000 + yunohost (4.0.8.2) stable; urgency=low - [fix] intermediate_certificate is now included in signed certificate (#1067) From 28b8a0ef6ac7dab27bff42942518ab0478cc1c41 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 3 Dec 2020 16:38:21 +0100 Subject: [PATCH 074/128] Update changelog for 4.1.0 --- debian/changelog | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index c3f72c801..1fa414d9e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,40 @@ yunohost (4.1.0) testing; urgency=low - - Tmp bump of the version number to fix CI (c.f. Breaks: yunohost(<<4.1) in moulinette) + - [enh] Extends permissions features, improve legacy settings handling (YunoHost#861) + - [enh] During app installs, add a default answer for user-type questions (YunoHost#982) + - [enh] Default questions for common app manifest arguments (YunoHost#981) + - [enh] Only upgrade apps if version actually changed (YunoHost#864) + - [enh] Create uncompressed backup archives by default (instead of .tar.gz) (YunoHost#1020) + - [enh] Add possibility to download backups (YunoHost#1046) + - [enh] Asking an email address during user creation was confusing, now define it a username@domain by default (admin only chooses the domain) (YunoHost#962) + - [enh] Be able to configure an smtp relay (YunoHost#773) + - [enh] Add a diagnosis to detect processes rencently killed by oom_reaper (YunoHost/f5acbffb) + - [enh] Simplify operation log list (YunoHost#955) + - [enh] Smarter sorting of domain list (YunoHost#860) + - [fix] Accept '+' sign in mail forward adresses (YunoHost#818) + - [enh] Add x509 fingerprint in /etc/issue (YunoHost#1056) + - [enh] Add ynh_add_config helper (YunoHost#1055) + - [enh] Upgrade n version (YunoHost#1073) + - [enh] Clean /usr/bin/yunohost, make it easier to use yunohost as a python lib (YunoHost#922) + - [enh] Lazy loading of smtplib to reduce memory footprint a bit (0f2e9ab1) + - [enh] Refactor manifest arguments parsing (YunoHost#1013) + - [enh] Detect misformated arguments in getopts (YunoHost#1052) + - [enh] Refactor app download process, make it github-independent (YunoHost#1049) + - [fix] Test at the beginning of postinstall that iptables is working instead of miserably crashing later (YunoHost/f73ae4ee) + - [enh] Service logs: journalctl -x in fact makes everything bloated, the supposedly additional info it displays does not contains anything relevant... (YunoHost/452b178d) + - [enh] Add redis hook to enforce permissions on /var/log/redis (YunoHost/a1c1057a) + - [enh] Add configuration tests for dnsmasq, fail2ban, slapd (YunoHost/6e69df37) + - [enh] Remove some old fail2ban jails that do not exists anymore (YunoHost/2c6736df) + - [enh] Get rid of yunohost.local in main domain nginx conf (YunoHost/ba884d5b) + - [enh] Ignore some unimportant apt warnings (YunoHost/199cc50) + - [enh] Create the helper doc on new version (YunoHost#1080) + - [enh] The email "abuse@you_domain.tld" is now unavailable for security reason (YunoHost/67e03e6) + - [enh] Remove some warnings during backup (YunoHost#1047) + - [i18n] Translations updated for Catalan, Chinese (Simplified), French, German, Italian, Occitan, Portuguese + + Thanks to all contributors <3 ! (Aleks, Augustin T., Baptiste W., Bram, Christian W., Colin W., cyxae, ekhae, Éric G., Félix P., Josué, Julien J., Kayou, Leandro N., ljf, Maniack C, ppr, Quentí, Quentin D., SiM, yalh76, Yifei D., xaloc33) + + -- Kay0u Thu, 03 Dec 2020 16:34:38 +0100 yunohost (4.0.8.3) stable; urgency=low From 11fb2659c611181909684b250f1c70a7b28f8352 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Fri, 4 Dec 2020 14:13:21 +0100 Subject: [PATCH 075/128] [fix] Avoid too many recipient --- data/templates/postfix/main.cf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/templates/postfix/main.cf b/data/templates/postfix/main.cf index 61aa27211..6a1029b71 100644 --- a/data/templates/postfix/main.cf +++ b/data/templates/postfix/main.cf @@ -182,6 +182,9 @@ milter_default_action = accept smtp_destination_concurrency_limit = 2 default_destination_rate_delay = 5s +# Avoid to be blacklisted due to too many recipient +smtpd_client_recipient_rate_limit=150 + # Avoid email adress scanning # By default it's possible to detect if the email adress exist # So it's easly possible to scan a server to know which email adress is valid From 2be911d369a3e824a2fb3e5a2cebf8a97dbdd472 Mon Sep 17 00:00:00 2001 From: ljf Date: Tue, 8 Dec 2020 12:17:59 +0100 Subject: [PATCH 076/128] [fix] Missing backup conf --- data/hooks/backup/22-conf_mail | 13 +++++++++++++ data/hooks/restore/22-conf_mail | 5 +++++ 2 files changed, 18 insertions(+) create mode 100644 data/hooks/backup/22-conf_mail create mode 100644 data/hooks/restore/22-conf_mail diff --git a/data/hooks/backup/22-conf_mail b/data/hooks/backup/22-conf_mail new file mode 100644 index 000000000..018a345d9 --- /dev/null +++ b/data/hooks/backup/22-conf_mail @@ -0,0 +1,13 @@ +#!/bin/bash + +# Exit hook on subcommand error or unset variable +set -eu + +# Source YNH helpers +source /usr/share/yunohost/helpers + +# Backup destination +backup_dir="${1}/etc/dkim" + +# Backup the configuration +ynh_backup "/etc/dkim" "$backup_dir" diff --git a/data/hooks/restore/22-conf_mail b/data/hooks/restore/22-conf_mail new file mode 100644 index 000000000..c069b53db --- /dev/null +++ b/data/hooks/restore/22-conf_mail @@ -0,0 +1,5 @@ +#!/bin/bash + +backup_dir="$1/etc/dkim" + +cp -a $backup_dir/. /etc/dkim From f1f97d0235a60ee5661937bf1f64d083b4d116ac Mon Sep 17 00:00:00 2001 From: ljf Date: Tue, 8 Dec 2020 17:05:51 +0100 Subject: [PATCH 077/128] [fix] DNS conf --- src/yunohost/domain.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index 88fd9e3e9..d3e8c53f0 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -258,6 +258,10 @@ def domain_dns_conf(domain, ttl=None): """ + domains = domain_list() + if domain not in domain_list()['domains']: + raise YunohostError('domain_name_unknown', domain=domain) + ttl = 3600 if ttl is None else ttl dns_conf = _build_dns_conf(domain, ttl) From 6aebe6faf9ccce329a6c33dd855a4bf5c34541c7 Mon Sep 17 00:00:00 2001 From: ljf Date: Tue, 8 Dec 2020 17:11:10 +0100 Subject: [PATCH 078/128] [fix] Unused line --- src/yunohost/domain.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index d3e8c53f0..b771d60ab 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -258,7 +258,6 @@ def domain_dns_conf(domain, ttl=None): """ - domains = domain_list() if domain not in domain_list()['domains']: raise YunohostError('domain_name_unknown', domain=domain) From 2c9a668afe5da0f2ce7b1d8f2a08faa6dd3c0cfe Mon Sep 17 00:00:00 2001 From: ljf Date: Tue, 8 Dec 2020 23:45:44 +0100 Subject: [PATCH 079/128] [fix] Unix permission on dkim --- data/hooks/restore/22-conf_mail | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/hooks/restore/22-conf_mail b/data/hooks/restore/22-conf_mail index c069b53db..312b3f61b 100644 --- a/data/hooks/restore/22-conf_mail +++ b/data/hooks/restore/22-conf_mail @@ -3,3 +3,9 @@ backup_dir="$1/etc/dkim" cp -a $backup_dir/. /etc/dkim + +chown -R root:root /etc/dkim +chown _rspamd:root /etc/dkim +chown _rspamd:root /etc/dkim/*.mail.key +chmod 600 /etc/dkim/*.mail.txt +chmod 400 /etc/dkim/*.mail.key From 8b53d6562e8a948dcda824ff2480d0eb2fa66f87 Mon Sep 17 00:00:00 2001 From: ljf Date: Wed, 9 Dec 2020 01:31:17 +0100 Subject: [PATCH 080/128] [fix] Add Dyndns domains keys to backup --- data/hooks/backup/42-conf_ynh_dyndns | 10 ++++++++++ data/hooks/restore/42-conf_ynh_dyndns | 10 ++++++++++ 2 files changed, 20 insertions(+) create mode 100644 data/hooks/backup/42-conf_ynh_dyndns create mode 100644 data/hooks/restore/42-conf_ynh_dyndns diff --git a/data/hooks/backup/42-conf_ynh_dyndns b/data/hooks/backup/42-conf_ynh_dyndns new file mode 100644 index 000000000..776162ff0 --- /dev/null +++ b/data/hooks/backup/42-conf_ynh_dyndns @@ -0,0 +1,10 @@ +#!/bin/bash + +source /usr/share/yunohost/helpers +ynh_abort_if_errors +YNH_CWD="${YNH_BACKUP_DIR%/}/conf/ynh/dyndns" +cd "$YNH_CWD" + +# Backup the configuration +ynh_backup --src_path="/etc/yunohost/dyndns" --not_mandatory +ynh_backup --src_path="/etc/cron.d/yunohost-dyndns" --not_mandatory diff --git a/data/hooks/restore/42-conf_ynh_dyndns b/data/hooks/restore/42-conf_ynh_dyndns new file mode 100644 index 000000000..d16d7a67c --- /dev/null +++ b/data/hooks/restore/42-conf_ynh_dyndns @@ -0,0 +1,10 @@ +#!/bin/bash + +source /usr/share/yunohost/helpers +ynh_abort_if_errors +YNH_CWD="${YNH_BACKUP_DIR%/}/conf/ynh/dyndns" +cd "$YNH_CWD" + +# Restore file if exists +ynh_restore_file --origin_path="/etc/yunohost/dyndns" --not_mandatory +ynh_restore_file --origin_path="/etc/cron.d/yunohost-dyndns" --not_mandatory From ef9cc98d5e07dcc224ead8992bafc26f83c2acbd Mon Sep 17 00:00:00 2001 From: ljf Date: Wed, 9 Dec 2020 01:35:40 +0100 Subject: [PATCH 081/128] [enh] Use ynh_backup helpers --- data/hooks/backup/22-conf_mail | 13 ++++--------- data/hooks/restore/22-conf_mail | 6 ++---- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/data/hooks/backup/22-conf_mail b/data/hooks/backup/22-conf_mail index 018a345d9..9db39e0c2 100644 --- a/data/hooks/backup/22-conf_mail +++ b/data/hooks/backup/22-conf_mail @@ -1,13 +1,8 @@ #!/bin/bash -# Exit hook on subcommand error or unset variable -set -eu - -# Source YNH helpers source /usr/share/yunohost/helpers +ynh_abort_if_errors +YNH_CWD="${YNH_BACKUP_DIR%/}/conf/dkim" +cd "$YNH_CWD" -# Backup destination -backup_dir="${1}/etc/dkim" - -# Backup the configuration -ynh_backup "/etc/dkim" "$backup_dir" +ynh_backup --src_path="/etc/dkim" diff --git a/data/hooks/restore/22-conf_mail b/data/hooks/restore/22-conf_mail index 312b3f61b..77e0a4d42 100644 --- a/data/hooks/restore/22-conf_mail +++ b/data/hooks/restore/22-conf_mail @@ -1,11 +1,9 @@ #!/bin/bash -backup_dir="$1/etc/dkim" +backup_dir="$1/conf/dkim" -cp -a $backup_dir/. /etc/dkim +cp -a $backup_dir/etc/dkim/. /etc/dkim chown -R root:root /etc/dkim chown _rspamd:root /etc/dkim chown _rspamd:root /etc/dkim/*.mail.key -chmod 600 /etc/dkim/*.mail.txt -chmod 400 /etc/dkim/*.mail.key From 9a87d8a52da3dc137adacf7997d836acb3dea840 Mon Sep 17 00:00:00 2001 From: ljf Date: Wed, 9 Dec 2020 01:59:06 +0100 Subject: [PATCH 082/128] [fix] Missing dir --- data/hooks/backup/22-conf_mail | 1 + 1 file changed, 1 insertion(+) diff --git a/data/hooks/backup/22-conf_mail b/data/hooks/backup/22-conf_mail index 9db39e0c2..b604d8aa8 100644 --- a/data/hooks/backup/22-conf_mail +++ b/data/hooks/backup/22-conf_mail @@ -3,6 +3,7 @@ source /usr/share/yunohost/helpers ynh_abort_if_errors YNH_CWD="${YNH_BACKUP_DIR%/}/conf/dkim" +mkdir -p "$YNH_CWD" cd "$YNH_CWD" ynh_backup --src_path="/etc/dkim" From 60d838843eeb9b2ed94b19e847fc43ee30e0358b Mon Sep 17 00:00:00 2001 From: ljf Date: Wed, 9 Dec 2020 02:36:39 +0100 Subject: [PATCH 083/128] [fix] Missing mkdir --- data/hooks/backup/42-conf_ynh_dyndns | 1 + 1 file changed, 1 insertion(+) diff --git a/data/hooks/backup/42-conf_ynh_dyndns b/data/hooks/backup/42-conf_ynh_dyndns index 776162ff0..323464108 100644 --- a/data/hooks/backup/42-conf_ynh_dyndns +++ b/data/hooks/backup/42-conf_ynh_dyndns @@ -3,6 +3,7 @@ source /usr/share/yunohost/helpers ynh_abort_if_errors YNH_CWD="${YNH_BACKUP_DIR%/}/conf/ynh/dyndns" +mkdir -p $YNH_CWD cd "$YNH_CWD" # Backup the configuration From 5422a49d82d3b580fabf086ea13f1a5f55acb1ac Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 10 Dec 2020 17:25:58 +0100 Subject: [PATCH 084/128] We don't care that 'apt-key output should not be parsed' --- src/yunohost/hook.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/yunohost/hook.py b/src/yunohost/hook.py index 22d1ef623..eafcaf825 100644 --- a/src/yunohost/hook.py +++ b/src/yunohost/hook.py @@ -331,7 +331,8 @@ def hook_exec(path, args=None, raise_on_error=False, no_trace=False, r"invalid value for trace file descriptor", r"Creating config file .* with new version", r"Created symlink /etc/systemd", - r"dpkg: warning: while removing .* not empty so not removed" + r"dpkg: warning: while removing .* not empty so not removed", + r"apt-key output should not be parsed" ] return all(not re.search(w, msg) for w in irrelevant_warnings) From 116a15f9f1b7facc4f127243496e862e74459d68 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Thu, 10 Dec 2020 18:18:09 +0100 Subject: [PATCH 085/128] [fix] Avoid to define the ip on wildcard subdomains too --- data/templates/dnsmasq/domain.tpl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/templates/dnsmasq/domain.tpl b/data/templates/dnsmasq/domain.tpl index f4c8d6c4c..c4bb56d1d 100644 --- a/data/templates/dnsmasq/domain.tpl +++ b/data/templates/dnsmasq/domain.tpl @@ -1,8 +1,8 @@ -address=/{{ domain }}/{{ ipv4 }} -address=/xmpp-upload.{{ domain }}/{{ ipv4 }} +host-record={{ domain }},{{ ipv4 }} +host-record=xmpp-upload.{{ domain }},{{ ipv4 }} {% if ipv6 %} -address=/{{ domain }}/{{ ipv6 }} -address=/xmpp-upload.{{ domain }}/{{ ipv6 }} +host-record={{ domain }},{{ ipv6 }} +host-record=xmpp-upload.{{ domain }},{{ ipv6 }} {% endif %} txt-record={{ domain }},"v=spf1 mx a -all" mx-host={{ domain }},{{ domain }},5 From c823f5ffd5f3100f0ac936ebb550b3256de4a90b Mon Sep 17 00:00:00 2001 From: Kay0u Date: Fri, 11 Dec 2020 15:09:37 +0100 Subject: [PATCH 086/128] indent ssow conf --- src/yunohost/app.py | 5 ++--- src/yunohost/utils/legacy.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 71aaca316..2ccd026f5 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1169,7 +1169,7 @@ def app_makedefault(operation_logger, app, domain=None): ssowat_conf['redirected_urls'][domain + '/'] = app_domain + app_path - write_to_json('/etc/ssowat/conf.json.persistent', ssowat_conf) + write_to_json('/etc/ssowat/conf.json.persistent', ssowat_conf, sort_keys=True, indent=4) os.system('chmod 644 /etc/ssowat/conf.json.persistent') logger.success(m18n.n('ssowat_conf_updated')) @@ -1405,8 +1405,7 @@ def app_ssowatconf(): 'permissions': permissions, } - with open('/etc/ssowat/conf.json', 'w+') as f: - json.dump(conf_dict, f, sort_keys=True, indent=4) + write_to_json('/etc/ssowat/conf.json', conf_dict, sort_keys=True, indent=4) from utils.legacy import translate_legacy_rules_in_ssowant_conf_json_persistent translate_legacy_rules_in_ssowant_conf_json_persistent() diff --git a/src/yunohost/utils/legacy.py b/src/yunohost/utils/legacy.py index a90b9fd74..b8b44135d 100644 --- a/src/yunohost/utils/legacy.py +++ b/src/yunohost/utils/legacy.py @@ -269,6 +269,6 @@ def translate_legacy_rules_in_ssowant_conf_json_persistent(): "uris": protected_urls + persistent["permissions"].get("custom_protected", {}).get("uris", []), } - write_to_json("/etc/ssowat/conf.json.persistent", persistent) + write_to_json("/etc/ssowat/conf.json.persistent", persistent, sort_keys=True, indent=4) logger.warning("Yunohost automatically translated some legacy rules in /etc/ssowat/conf.json.persistent to match the new permission system") From 401778f68ed738240ef9bcd96567bb3e58bf702a Mon Sep 17 00:00:00 2001 From: Kay0u Date: Fri, 11 Dec 2020 16:22:29 +0100 Subject: [PATCH 087/128] fix the fixme --- src/yunohost/app.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 2ccd026f5..d6c132535 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1204,8 +1204,7 @@ def app_setting(app, key, value=None, delete=False): # GET if value is None and not delete: - # FIXME FIXME FIXME : what about the main url ...? - return ','.join(permission['additional_urls']) if permission else None + return ','.join(permission['uris'] + permission['additional_urls']) if permission else None # DELETE if delete: From c3e750a97af3919aa8f0222f0ab2326272a55778 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Fri, 11 Dec 2020 16:29:10 +0100 Subject: [PATCH 088/128] add all_users in protected_urls --- src/yunohost/utils/legacy.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/yunohost/utils/legacy.py b/src/yunohost/utils/legacy.py index b8b44135d..1cc0246f3 100644 --- a/src/yunohost/utils/legacy.py +++ b/src/yunohost/utils/legacy.py @@ -235,6 +235,8 @@ def translate_legacy_rules_in_ssowant_conf_json_persistent(): protected_urls = persistent.get("protected_urls", []) + ["re:" + r for r in persistent.get("protected_regex", [])] unprotected_urls = persistent.get("unprotected_urls", []) + ["re:" + r for r in persistent.get("unprotected_regex", [])] + known_users = user_list()["users"].keys() + for legacy_rule in legacy_rules: if legacy_rule in persistent: del persistent[legacy_rule] @@ -261,7 +263,7 @@ def translate_legacy_rules_in_ssowant_conf_json_persistent(): if protected_urls: persistent["permissions"]['custom_protected'] = { - "users": [], + "users": known_users, "label": "Custom permissions - protected", "show_tile": False, "auth_header": True, From b767f4b03301a0d976fb6f9bb5e8c17d3e2ba53e Mon Sep 17 00:00:00 2001 From: Kayou Date: Fri, 11 Dec 2020 17:11:44 +0100 Subject: [PATCH 089/128] fix tests --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index 50772f3f7..bfea80ccd 100644 --- a/debian/control +++ b/debian/control @@ -11,7 +11,7 @@ Package: yunohost Essential: yes Architecture: all Depends: ${python:Depends}, ${misc:Depends} - , moulinette (>= 4.1), ssowat (>= 4.0) + , moulinette (>= 4.1.0.1), ssowat (>= 4.0) , python-psutil, python-requests, python-dnspython, python-openssl , python-miniupnpc, python-dbus, python-jinja2 , python-toml, python-packaging, python-publicsuffix From c5d06af20e97e5939bb338ca81e6739e32ae943d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 11 Dec 2020 20:40:45 +0100 Subject: [PATCH 090/128] Guess what ... If people manually tweaked their nginx.conf to enable gzip globally, this will break cert renewal .. --- data/templates/nginx/plain/acme-challenge.conf.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/data/templates/nginx/plain/acme-challenge.conf.inc b/data/templates/nginx/plain/acme-challenge.conf.inc index aae3e0eb3..35c4b80c2 100644 --- a/data/templates/nginx/plain/acme-challenge.conf.inc +++ b/data/templates/nginx/plain/acme-challenge.conf.inc @@ -2,4 +2,5 @@ location ^~ '/.well-known/acme-challenge/' { default_type "text/plain"; alias /tmp/acme-challenge-public/; + gzip off; } From 11fe9d7e025248302177b08fafcd73080350153b Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Tue, 15 Dec 2020 22:08:49 +0100 Subject: [PATCH 091/128] [fix] Accept all kind of relay even the unencrypted --- data/templates/postfix/main.cf | 4 ---- 1 file changed, 4 deletions(-) diff --git a/data/templates/postfix/main.cf b/data/templates/postfix/main.cf index 6a1029b71..13781881f 100644 --- a/data/templates/postfix/main.cf +++ b/data/templates/postfix/main.cf @@ -53,12 +53,8 @@ smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtpd_tls_loglevel=1 # -- TLS for outgoing connections -{% if relay_host != "" %} -smtp_tls_security_level = encrypt -{% else %} # Use TLS if this is supported by the remote SMTP server, otherwise use plaintext. smtp_tls_security_level = may -{% endif %} smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtp_tls_exclude_ciphers = aNULL, MD5, DES, ADH, RC4, 3DES smtp_tls_mandatory_ciphers= high From 8cab56787ea632d01d7fa25d324436b3eac310f3 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 17 Dec 2020 16:06:45 +0100 Subject: [PATCH 092/128] handle change php version --- data/helpers.d/php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/data/helpers.d/php b/data/helpers.d/php index 95cc15402..343529d7a 100644 --- a/data/helpers.d/php +++ b/data/helpers.d/php @@ -85,6 +85,19 @@ ynh_add_fpm_config () { # Set the default PHP-FPM version by default phpversion="${phpversion:-$YNH_PHP_VERSION}" + local old_phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) + + # If the PHP version changed, remove the old fpm conf + if [ -n "$old_phpversion" ] && [ "$old_phpversion" != "$phpversion" ] + then + local old_php_fpm_config_dir=$(ynh_app_setting_get --app=$app --key=fpm_config_dir) + local old_php_finalphpconf="$old_php_fpm_config_dir/pool.d/$app.conf" + + ynh_backup_if_checksum_is_different --file="$old_php_finalphpconf" + + ynh_remove_fpm_config + fi + # If the requested PHP version is not the default version for YunoHost if [ "$phpversion" != "$YNH_DEFAULT_PHP_VERSION" ] then @@ -278,7 +291,7 @@ ynh_remove_fpm_config () { local dedicated_service=$(ynh_app_setting_get --app=$app --key=fpm_dedicated_service) dedicated_service=${dedicated_service:-0} # Get the version of PHP used by this app - local phpversion=$(ynh_app_setting_get $app phpversion) + local phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) # Assume default PHP-FPM version by default phpversion="${phpversion:-$YNH_DEFAULT_PHP_VERSION}" @@ -377,7 +390,7 @@ ynh_install_php () { # Requires YunoHost version 3.8.1 or higher. ynh_remove_php () { # Get the version of PHP used by this app - local phpversion=$(ynh_app_setting_get $app phpversion) + local phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) if [ "$phpversion" == "$YNH_DEFAULT_PHP_VERSION" ] || [ -z "$phpversion" ] then From fc1160f242b59aa01ed66e01e289a1e9d629a89f Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 17 Dec 2020 18:45:31 +0100 Subject: [PATCH 093/128] fix version number in tests --- .gitlab/ci/build.gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab/ci/build.gitlab-ci.yml b/.gitlab/ci/build.gitlab-ci.yml index d2dbbaa80..717a5ee73 100644 --- a/.gitlab/ci/build.gitlab-ci.yml +++ b/.gitlab/ci/build.gitlab-ci.yml @@ -38,7 +38,7 @@ build-ssowat: variables: PACKAGE: "ssowat" script: - - DEBIAN_DEPENDS=$(cat debian/control | tr "," "\n" | grep -Po "ssowat \([>,=,<]+ .*\)" | grep -Po "[0-9]+([.][0-9]+)?" | head -n 1) + - DEBIAN_DEPENDS=$(cat debian/control | tr "," "\n" | grep -Po "ssowat \([>,=,<]+ .*\)" | grep -Po "[0-9\.]+") - git clone $YNH_SOURCE/$PACKAGE -b $CI_COMMIT_REF_NAME $YNH_BUILD_DIR/$PACKAGE --depth 1 || git clone $YNH_SOURCE/$PACKAGE -b $DEBIAN_DEPENDS $YNH_BUILD_DIR/$PACKAGE --depth 1 || git clone $YNH_SOURCE/$PACKAGE $YNH_BUILD_DIR/$PACKAGE --depth 1 - DEBIAN_FRONTEND=noninteractive apt --assume-yes -o Dpkg::Options::="--force-confold" build-dep $(pwd)/$YNH_BUILD_DIR/$PACKAGE - *build_script @@ -48,7 +48,7 @@ build-moulinette: variables: PACKAGE: "moulinette" script: - - DEBIAN_DEPENDS=$(cat debian/control | tr "," "\n" | grep -Po "moulinette \([>,=,<]+ .*\)" | grep -Po "[0-9]+([.][0-9]+)?" | head -n 1) + - DEBIAN_DEPENDS=$(cat debian/control | tr "," "\n" | grep -Po "moulinette \([>,=,<]+ .*\)" | grep -Po "[0-9\.]+") - git clone $YNH_SOURCE/$PACKAGE -b $CI_COMMIT_REF_NAME $YNH_BUILD_DIR/$PACKAGE --depth 1 || git clone $YNH_SOURCE/$PACKAGE -b $DEBIAN_DEPENDS $YNH_BUILD_DIR/$PACKAGE --depth 1 || git clone $YNH_SOURCE/$PACKAGE $YNH_BUILD_DIR/$PACKAGE --depth 1 - DEBIAN_FRONTEND=noninteractive apt --assume-yes -o Dpkg::Options::="--force-confold" build-dep $(pwd)/$YNH_BUILD_DIR/$PACKAGE - *build_script From 4f1ea2405d28a5166593f0e99f6e87570317515a Mon Sep 17 00:00:00 2001 From: Kayou Date: Fri, 18 Dec 2020 15:11:37 +0100 Subject: [PATCH 094/128] fix my mess --- src/yunohost/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index d6c132535..d32fb59a2 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1204,7 +1204,7 @@ def app_setting(app, key, value=None, delete=False): # GET if value is None and not delete: - return ','.join(permission['uris'] + permission['additional_urls']) if permission else None + return ','.join(permission.get('uris', []) + permission['additional_urls']) if permission else None # DELETE if delete: From ff5d8ebd61c5aa2d0ab25f9723f2fc1c2c5b7005 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 18 Dec 2020 15:29:52 +0100 Subject: [PATCH 095/128] Missing ;, probably --- data/helpers.d/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/helpers.d/php b/data/helpers.d/php index 343529d7a..8bb82b5c2 100644 --- a/data/helpers.d/php +++ b/data/helpers.d/php @@ -274,7 +274,7 @@ WantedBy=multi-user.target && ynh_systemd_action --service_name=$fpm_service --action=reload \ || { php-fpm${phpversion} --test || true; ynh_secure_remove --file="$finalphpconf"; - ynh_die --message="The new configuration broke php-fpm?" + ynh_die --message="The new configuration broke php-fpm?"; } ynh_systemd_action --service_name=$fpm_service --action=reload fi From 58dcf45bd904380cfeeba8efbc49ed1cb735ede1 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Fri, 18 Dec 2020 16:55:39 +0100 Subject: [PATCH 096/128] do not reload php7.3 too fast --- data/helpers.d/php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/helpers.d/php b/data/helpers.d/php index 8bb82b5c2..bd5608594 100644 --- a/data/helpers.d/php +++ b/data/helpers.d/php @@ -270,12 +270,12 @@ WantedBy=multi-user.target ynh_systemd_action --service_name=$fpm_service --action=restart else # Validate that the new php conf doesn't break php-fpm entirely - php-fpm${phpversion} --test 2>/dev/null \ - && ynh_systemd_action --service_name=$fpm_service --action=reload \ - || { php-fpm${phpversion} --test || true; - ynh_secure_remove --file="$finalphpconf"; - ynh_die --message="The new configuration broke php-fpm?"; - } + if ! php-fpm${phpversion} --test 2>/dev/null + then + php-fpm${phpversion} --test || true; + ynh_secure_remove --file="$finalphpconf"; + ynh_die --message="The new configuration broke php-fpm?"; + fi ynh_systemd_action --service_name=$fpm_service --action=reload fi } From b7c43df661cdc87f32cd424c8315b1d2ffe82378 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Fri, 18 Dec 2020 17:03:51 +0100 Subject: [PATCH 097/128] no more ; --- data/helpers.d/php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/helpers.d/php b/data/helpers.d/php index bd5608594..a2caf5387 100644 --- a/data/helpers.d/php +++ b/data/helpers.d/php @@ -272,9 +272,9 @@ WantedBy=multi-user.target # Validate that the new php conf doesn't break php-fpm entirely if ! php-fpm${phpversion} --test 2>/dev/null then - php-fpm${phpversion} --test || true; - ynh_secure_remove --file="$finalphpconf"; - ynh_die --message="The new configuration broke php-fpm?"; + php-fpm${phpversion} --test || true + ynh_secure_remove --file="$finalphpconf" + ynh_die --message="The new configuration broke php-fpm?" fi ynh_systemd_action --service_name=$fpm_service --action=reload fi From f9143d531f3623726e8cc364aa5ac366188d5300 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 18 Dec 2020 17:53:05 +0100 Subject: [PATCH 098/128] Fix a small issue where metadata could be None (because of empty yaml maybe?) --- src/yunohost/log.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yunohost/log.py b/src/yunohost/log.py index 11b9034c6..cf108b989 100644 --- a/src/yunohost/log.py +++ b/src/yunohost/log.py @@ -89,14 +89,14 @@ def log_list(limit=None, with_details=False, with_suboperations=False): pass try: - metadata = read_yaml(md_path) + metadata = read_yaml(md_path) or {} # Making sure this is a dict and not None..? except Exception as e: # If we can't read the yaml for some reason, report an error and ignore this entry... logger.error(m18n.n('log_corrupted_md_file', md_file=md_path, error=e)) continue if with_details: - entry["success"] = metadata.get("success", "?") if metadata else "?" + entry["success"] = metadata.get("success", "?") entry["parent"] = metadata.get("parent") if with_suboperations: From 0c98fd0c7e9b1035ce563cc31ab95680312ec95a Mon Sep 17 00:00:00 2001 From: Eric COURTEAU Date: Fri, 4 Dec 2020 10:16:12 +0000 Subject: [PATCH 099/128] Translated using Weblate (French) Currently translated at 100.0% (630 of 630 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 6276ff6df..ea7228e41 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -129,7 +129,7 @@ "service_removed": "Le service « {service:s} » a été supprimé", "service_start_failed": "Impossible de démarrer le service '{service:s}'\n\nJournaux historisés récents : {logs:s}", "service_started": "Le service « {service:s} » a été démarré", - "service_stop_failed": "Impossible d’arrêter le service '{service:s}'\n\nJournaux historisés récents : {logs:s}", + "service_stop_failed": "Impossible d’arrêter le service '{service:s}'\n\nJournaux récents de service : {logs:s}", "service_stopped": "Le service « {service:s} » a été arrêté", "service_unknown": "Le service '{service:s}' est inconnu", "ssowat_conf_generated": "La configuration de SSOwat a été regénérée", @@ -252,7 +252,7 @@ "app_upgrade_some_app_failed": "Certaines applications n’ont pas été mises à jour", "dyndns_could_not_check_provide": "Impossible de vérifier si {provider:s} peut fournir {domain:s}.", "dyndns_domain_not_provided": "Le fournisseur DynDNS {provider:s} ne peut pas fournir le domaine {domain:s}.", - "app_make_default_location_already_used": "Impossible de configurer l’application '{app}' par défaut pour le domaine '{domain}' car il est déjà utilisé par l’application '{other_app}'", + "app_make_default_location_already_used": "Impossible de configurer l’application '{app}' par défaut pour le domaine '{domain}' car il est déjà utilisé par l'application '{other_app}'", "app_upgrade_app_name": "Mise à jour de {app}...", "backup_output_symlink_dir_broken": "Votre répertoire d’archivage '{path:s}' est un lien symbolique brisé. Peut-être avez-vous oublié de re/monter ou de brancher le support de stockage sur lequel il pointe.", "migrations_list_conflict_pending_done": "Vous ne pouvez pas utiliser --previous et --done simultanément.", @@ -404,7 +404,7 @@ "dpkg_lock_not_available": "Cette commande ne peut pas être exécutée pour le moment car un autre programme semble utiliser le verrou de dpkg (le gestionnaire de package système)", "tools_upgrade_cant_unhold_critical_packages": "Impossible d'enlever le drapeau 'hold' pour les paquets critiques…", "tools_upgrade_special_packages_explanation": "La mise à niveau spécifique à YunoHost se poursuivra en arrière-plan. Veuillez ne pas lancer d'autres actions sur votre serveur pendant les 10 prochaines minutes (selon la vitesse du matériel). Après cela, vous devrez peut-être vous reconnecter à l'administrateur Web. Le journal de mise à niveau sera disponible dans Outils → Journal (dans le webadmin) ou en utilisant la « liste des journaux yunohost » (à partir de la ligne de commande).", - "update_apt_cache_failed": "Impossible de mettre à jour le cache APT (gestionnaire de paquets Debian). Voici un extrait du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}", + "update_apt_cache_failed": "Impossible de mettre à jour le cache APT (gestionnaire de paquets Debian). Voici un extrait du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}\n{sourceslist}", "update_apt_cache_warning": "Des erreurs se sont produites lors de la mise à jour du cache APT (gestionnaire de paquets Debian). Voici un extrait des lignes du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}", "backup_permission": "Permission de sauvegarde pour {app:s}", "group_created": "Le groupe '{group}' a été créé", @@ -419,7 +419,7 @@ "mailbox_disabled": "La boîte aux lettres est désactivée pour l’utilisateur {user:s}", "app_action_broke_system": "Cette action semble avoir cassé des services importants : {services}", "apps_already_up_to_date": "Toutes les applications sont déjà à jour", - "migration_0011_create_group": "Création d’un groupe pour chaque utilisateur…", + "migration_0011_create_group": "Création d'un groupe pour chaque utilisateur…", "migration_0011_done": "Migration terminée. Vous êtes maintenant en mesure de gérer des groupes d’utilisateurs.", "migrations_must_provide_explicit_targets": "Vous devez fournir des cibles explicites lorsque vous utilisez '--skip' ou '--force-rerun'", "migrations_no_such_migration": "Il n’y a pas de migration appelée '{id}'", @@ -649,8 +649,8 @@ "global_settings_setting_backup_compress_tar_archives": "Compresser les archives (.tar.gz) au lieu des archives non-compressées lors de la création des backups. N.B. : activer cette option permet d'obtenir des sauvegardes plus légères, mais leur création sera significativement plus longue et plus gourmande en CPU.", "migration_description_0018_xtable_to_nftable": "Migrer les anciennes règles de trafic réseau vers le nouveau système basé sur nftables", "service_description_php7.3-fpm": "Exécute les applications écrites en PHP avec NGINX", - "migration_0018_failed_to_reset_legacy_rules": "La réinitialisation des règles iptable legacy a échoué :", - "migration_0018_failed_to_migrate_iptables_rules": "Échec de la migration des anciennes règles iptables vers nftables : {error}", + "migration_0018_failed_to_reset_legacy_rules": "La réinitialisation des règles iptable par défaut a échoué : {error}", + "migration_0018_failed_to_migrate_iptables_rules": "La migration des règles iptables héritées vers nftables a échoué: {error}", "migration_0017_not_enough_space": "Laissez suffisamment d'espace disponible dans {path} avant de lancer la migration.", "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 est installé mais pas posgreSQL 11 ? Il s'est sans doute passé quelque chose d'étrange sur votre système :(...", "migration_0017_postgresql_96_not_installed": "PostgreSQL n'a pas été installé sur votre système. Aucune opération à effectuer.", @@ -669,8 +669,8 @@ "diagnosis_package_installed_from_sury_details": "Certains paquets ont été installés par inadvertance à partir d'un dépôt tiers appelé Sury. L'équipe YunoHost a amélioré la stratégie de gestion de ces paquets, mais on s'attend à ce que certaines configurations qui ont installé des applications PHP7.3 tout en étant toujours sur Stretch présentent des incohérences. Pour résoudre cette situation, vous devez essayer d'exécuter la commande suivante : {cmd_to_fix} ", "app_argument_password_no_default": "Erreur lors de l'analyse de l'argument de mot de passe '{name}' : l'argument de mot de passe ne peut pas avoir de valeur par défaut pour des raisons de sécurité", "pattern_email_forward": "Il doit s'agir d'une adresse électronique valide, le symbole '+' étant accepté (par exemples : johndoe@exemple.com ou bien johndoe+yunohost@exemple.com)", - "global_settings_setting_smtp_relay_password": "Mot de passe SMTP du serveur de courrier électronique", - "diagnosis_package_installed_from_sury": "Certains paquets du système devraient être rétrograder vers une version moins récente", + "global_settings_setting_smtp_relay_password": "Mot de passe du relais de l'hôte SMTP", + "diagnosis_package_installed_from_sury": "Des paquets du système devraient être rétrogradé de version", "additional_urls_already_added": "URL supplémentaire '{url:s}' déjà ajoutée pour la permission '{permission:s}'", "unknown_main_domain_path": "Domaine ou chemin inconnu pour '{app}'. Vous devez spécifier un domaine et un chemin pour pouvoir spécifier une URL pour l'autorisation.", "show_tile_cant_be_enabled_for_regex": "Vous ne pouvez pas activer 'show_tile' pour le moment, car l'URL de l'autorisation '{permission}' est une expression régulière", @@ -687,5 +687,8 @@ "invalid_regex": "Regex non valide : '{regex:s}'", "domain_name_unknown": "Domaine '{domain}' inconnu", "app_label_deprecated": "Cette commande est obsolète ! Veuillez utiliser la nouvelle commande 'yunohost user permission update' pour gérer l'étiquette de l'application.", - "additional_urls_already_removed": "URL supplémentaire '{url:s}' déjà supprimée pour la permission '{permission:s}'" + "additional_urls_already_removed": "URL supplémentaire '{url:s}' déjà supprimée pour la permission '{permission:s}'", + "migration_0019_rollback_success": "Retour à l'état antérieur du système.", + "invalid_number": "Doit être un nombre", + "migration_description_0019_extend_permissions_features": "Étendre et retravailler le système de gestion des permissions applicatives" } From 3608af5912f1505423d79976a33da6e48bb7d07f Mon Sep 17 00:00:00 2001 From: Flavio Cristoforetti Date: Mon, 7 Dec 2020 16:26:32 +0000 Subject: [PATCH 100/128] Translated using Weblate (Italian) Currently translated at 41.5% (262 of 630 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/it/ --- locales/it.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/locales/it.json b/locales/it.json index e70f00a37..892f6e738 100644 --- a/locales/it.json +++ b/locales/it.json @@ -412,5 +412,23 @@ "diagnosis_failed_for_category": "Diagnosi fallita per la categoria '{category}:{error}", "diagnosis_display_tip": "Per vedere i problemi rilevati, puoi andare alla sezione Diagnosi del amministratore, o eseguire 'yunohost diagnosis show --issues' dalla riga di comando.", "diagnosis_package_installed_from_sury_details": "Alcuni pacchetti sono stati inavvertitamente installati da un repository di terze parti chiamato Sury. Il team di Yunohost ha migliorato la gestione di tali pacchetti, ma ci si aspetta che alcuni setup di app PHP7.3 abbiano delle incompatibilità anche se sono ancora in Stretch. Per sistemare questa situazione, dovresti provare a lanciare il seguente comando: {cmd_to_fix}", - "diagnosis_package_installed_from_sury": "Alcuni pacchetti di sistema dovrebbero fare il downgrade" + "diagnosis_package_installed_from_sury": "Alcuni pacchetti di sistema dovrebbero fare il downgrade", + "diagnosis_mail_ehlo_bad_answer": "Un servizio diverso da SMTP ha risposto sulla porta 25 su IPv{ipversion}", + "diagnosis_mail_ehlo_unreachable_details": "Impossibile aprire una connessione sulla porta 25 sul tuo server su IPv{ipversion}. Sembra irraggiungibile.
1. La causa più probabile di questo problema è la porta 25 non correttamente inoltrata al tuo server.
2. Dovresti esser sicuro che il servizio postfix sia attivo.
3. Su setup complessi: assicuratu che nessun firewall o reverse-proxy stia interferendo.", + "diagnosis_mail_ehlo_unreachable": "Il server SMTP non è raggiungibile dall'esterno su IPv{ipversion}. Non potrà ricevere email.", + "diagnosis_mail_ehlo_ok": "Il server SMTP è raggiungibile dall'esterno e quindi può ricevere email!", + "diagnosis_mail_outgoing_port_25_blocked_relay_vpn": "Alcuni provider non ti permettono di aprire la porta 25 in uscita perché non gli importa della Net Neutrality.
- Alcuni mettono a disposizione un alternativa attraverso un mail server relay anche se implica che il relay ha la capacità di leggere il vostro traffico email.
- Un alternativa privacy-friendly è quella di usare una VPN *con un indirizzo IP pubblico dedicato* per bypassare questo tipo di limite. Vedi https://yunohost.org/#/vpn_advantage
- Puoi anche prendere in considerazione di cambiare per un provider pro Net Neutrality", + "diagnosis_mail_outgoing_port_25_blocked_details": "Come prima cosa dovresti sbloccare la porta 25 in uscita dall'interfaccia del tuo router internet o del tuo hosting provider. (Alcuni hosting provider potrebbero richiedere l'invio di un ticket di supporto per la richiesta).", + "diagnosis_mail_outgoing_port_25_blocked": "Il server SMTP non può inviare email ad altri server perché la porta 25 è bloccata in uscita su IPv{ipversion}.", + "diagnosis_mail_outgoing_port_25_ok": "Il server SMTP è abile all'invio delle email (porta 25 in uscita non bloccata).", + "diagnosis_swap_tip": "Attenzione. Sii consapevole che se il server ha lo swap su di una memoria SD o un disco SSD, potrebbe drasticamente ridurre la durata di vita del dispositivo.", + "diagnosis_swap_ok": "Il sistema ha {total} di memoria swap!", + "diagnosis_swap_notsomuch": "Il sistema ha solo {total} di swap. Dovresti considerare almeno di aggiungere {recommended} di memoria swap per evitare situazioni dove il sistema esaurisce la memoria.", + "diagnosis_swap_none": "Il sistema non ha lo swap. Dovresti considerare almeno di aggiungere {recommended} di memoria swap per evitare situazioni dove il sistema esaurisce la memoria.", + "diagnosis_ram_ok": "Il sistema ha ancora {available} ({available_percent}%) di RAM disponibile su {total}.", + "diagnosis_ram_low": "Il sistema ha solo {available} ({available_percent}%) di RAM disponibile (su {total}). Fa attenzione.", + "diagnosis_ram_verylow": "Il sistema ha solo {available} ({available_percent}%) di RAM disponibile (su {total})", + "diagnosis_diskusage_ok": "Lo storage {mountpoint} (nel device {device} ha solo {free} ({free_percent}%) di spazio libero rimanente (su {total})!", + "diagnosis_diskusage_low": "Lo storage {mountpoint} (nel device {device} ha solo {free} ({free_percent}%) di spazio libero rimanente (su {total}). Fa attenzione.", + "diagnosis_diskusage_verylow": "Lo storage {mountpoint} (nel device {device} ha solo {free} ({free_percent}%) di spazio libero rimanente (su {total}). Dovresti seriamente considerare di fare un po' di pulizia!" } From 1044e826556fa686e9cdd6a91816448b8ecaf931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quent=C3=AD?= Date: Wed, 9 Dec 2020 16:35:27 +0000 Subject: [PATCH 101/128] Translated using Weblate (Occitan) Currently translated at 54.2% (342 of 630 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/oc/ --- locales/oc.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/locales/oc.json b/locales/oc.json index 1ef8348bd..17201fefe 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -590,5 +590,8 @@ "app_manifest_install_ask_password": "Causissètz lo senhal administrator per aquesta aplicacion", "app_manifest_install_ask_path": "Causissètz lo camin ont volètz installar aquesta aplicacion", "app_manifest_install_ask_domain": "Causissètz lo domeni ont volètz installar aquesta aplicacion", - "app_argument_password_no_default": "Error pendent l’analisi de l’argument del senhal « {name} » : l’argument de senhal pòt pas aver de valor per defaut per de rason de seguretat" + "app_argument_password_no_default": "Error pendent l’analisi de l’argument del senhal « {name} » : l’argument de senhal pòt pas aver de valor per defaut per de rason de seguretat", + "app_label_deprecated": "Aquesta comanda es estada renduda obsolèta. Mercés d'utilizar lo nòva \"yunohost user permission update\" per gerir letiquetada de l'aplication", + "additional_urls_already_removed": "URL addicionala {url:s} es ja estada elimida per la permission «#permission:s»", + "additional_urls_already_added": "URL addicionadal «{url:s}'» es ja estada aponduda per la permission «{permission:s}»" } From 9fb7684e0ffc2f912c30cbfa4fba9f7af16aa118 Mon Sep 17 00:00:00 2001 From: Flavio Cristoforetti Date: Fri, 11 Dec 2020 11:33:43 +0000 Subject: [PATCH 102/128] Translated using Weblate (Italian) Currently translated at 53.1% (335 of 630 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/it/ --- locales/it.json | 99 ++++++++++++++++++++++++++----------------------- 1 file changed, 53 insertions(+), 46 deletions(-) diff --git a/locales/it.json b/locales/it.json index 892f6e738..085bd506a 100644 --- a/locales/it.json +++ b/locales/it.json @@ -9,8 +9,8 @@ "backup_created": "Backup completo", "backup_invalid_archive": "Archivio di backup non valido", "backup_output_directory_not_empty": "Dovresti scegliere una cartella di output vuota", - "domain_created": "Il dominio è stato creato", - "domain_exists": "Il dominio è già esistente", + "domain_created": "Dominio creato", + "domain_exists": "Il dominio esiste già", "ldap_initialized": "LDAP è stato inizializzato", "pattern_email": "L'indirizzo email deve essere valido (es. someone@domain.org)", "pattern_mailbox_quota": "La dimensione deve avere un suffisso b/k/M/G/T o 0 per disattivare la quota", @@ -23,7 +23,7 @@ "service_stop_failed": "Impossibile fermare il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}", "system_username_exists": "il nome utente esiste già negli utenti del sistema", "unrestore_app": "L'applicazione '{app:s}' non verrà ripristinata", - "upgrading_packages": "Aggiornamento dei pacchetti…", + "upgrading_packages": "Aggiornamento dei pacchetti...", "user_deleted": "L'utente è stato cancellato", "admin_password": "Password dell'amministrazione", "admin_password_change_failed": "Impossibile cambiare la password", @@ -63,34 +63,34 @@ "backup_output_directory_required": "Devi fornire una directory di output per il backup", "backup_running_hooks": "Esecuzione degli hook di backup…", "custom_app_url_required": "Devi fornire un URL per essere in grado di aggiornare l'applicazione personalizzata {app:s}", - "domain_creation_failed": "Impossibile creare un dominio", - "domain_deleted": "Il dominio è stato cancellato", - "domain_deletion_failed": "Impossibile cancellare il dominio", + "domain_creation_failed": "Impossibile creare il dominio {domain}: {error}", + "domain_deleted": "Dominio cancellato", + "domain_deletion_failed": "Impossibile cancellare il dominio {domain}: {error}", "domain_dyndns_already_subscribed": "Hai già sottoscritto un dominio DynDNS", "domain_dyndns_root_unknown": "Dominio radice DynDNS sconosciuto", "domain_hostname_failed": "La definizione del nuovo hostname è fallita", - "domain_uninstall_app_first": "Una o più applicazioni sono installate su questo dominio. Disinstalla loro prima di procedere alla cancellazione di un dominio", + "domain_uninstall_app_first": "Queste applicazioni sono già installate su questo dominio: {apps}. Disinstallale prima di procedere alla cancellazione di un dominio", "domain_unknown": "Dominio sconosciuto", "done": "Terminato", "domains_available": "Domini disponibili:", "downloading": "Scaricamento…", - "dyndns_cron_installed": "Il cronjob DynDNS è stato installato", - "dyndns_cron_remove_failed": "Impossibile rimuovere il cronjob DynDNS", - "dyndns_cron_removed": "Il cronjob DynDNS è stato rimosso", + "dyndns_cron_installed": "Cronjob DynDNS creato", + "dyndns_cron_remove_failed": "Impossibile rimuovere il cronjob DynDNS perchè: {error}", + "dyndns_cron_removed": "Cronjob DynDNS rimosso", "dyndns_ip_update_failed": "Impossibile aggiornare l'indirizzo IP in DynDNS", - "dyndns_ip_updated": "Il tuo indirizzo IP è stato aggiornato in DynDNS", - "dyndns_key_generating": "Si sta generando la chiave DNS, potrebbe richiedere del tempo…", + "dyndns_ip_updated": "Il tuo indirizzo IP è stato aggiornato su DynDNS", + "dyndns_key_generating": "Generando la chiave DNS... Potrebbe richiedere del tempo.", "dyndns_key_not_found": "La chiave DNS non è stata trovata per il dominio", - "dyndns_no_domain_registered": "Nessuno dominio è stato registrato con DynDNS", - "dyndns_registered": "Il dominio DynDNS è stato registrato", + "dyndns_no_domain_registered": "Nessuno dominio registrato con DynDNS", + "dyndns_registered": "Dominio DynDNS registrato", "dyndns_registration_failed": "Non è possibile registrare il dominio DynDNS: {error:s}", - "dyndns_unavailable": "Dominio {domain:s} non disponibile.", + "dyndns_unavailable": "Il dominio {domain:s} non disponibile.", "executing_command": "Esecuzione del comando '{command:s}'…", "executing_script": "Esecuzione dello script '{script:s}'…", - "extracting": "Estrazione…", + "extracting": "Estrazione...", "field_invalid": "Campo '{:s}' non valido", "firewall_reload_failed": "Impossibile ricaricare il firewall", - "firewall_reloaded": "Il firewall è stato ricaricato", + "firewall_reloaded": "Firewall ricaricato", "firewall_rules_cmd_failed": "Alcune regole del firewall sono fallite. Per ulteriori informazioni, vedi il registro.", "hook_exec_failed": "L'esecuzione dello script è fallita: {path:s}", "hook_exec_not_terminated": "L'esecuzione dello script non è stata terminata: {path:s}", @@ -128,7 +128,7 @@ "user_update_failed": "Impossibile aggiornare l'utente", "restore_hook_unavailable": "Lo script di ripristino per '{part:s}' non è disponibile per il tuo sistema e non è nemmeno nell'archivio", "restore_nothings_done": "Non è stato ripristinato nulla", - "restore_running_app_script": "Esecuzione dello script di ripristino dell'applicazione '{app:s}'…", + "restore_running_app_script": "Ripristino dell'app '{app:s}'…", "restore_running_hooks": "Esecuzione degli hook di ripristino…", "service_added": "Il servizio '{service:s}' è stato aggiunto", "service_already_started": "Il servizio '{service:s}' è già stato avviato", @@ -146,7 +146,7 @@ "unbackup_app": "L'applicazione '{app:s}' non verrà salvata", "unexpected_error": "Un'errore inaspettata si è verificata", "unlimit": "Nessuna quota", - "updating_apt_cache": "Recupero degli aggiornamenti disponibili per i pacchetti di sistema…", + "updating_apt_cache": "Recupero degli aggiornamenti disponibili per i pacchetti di sistema...", "upgrade_complete": "Aggiornamento completo", "upnp_dev_not_found": "Nessuno supporto UPnP trovato", "upnp_disabled": "UPnP è stato disattivato", @@ -161,7 +161,7 @@ "yunohost_already_installed": "YunoHost è già installato", "yunohost_ca_creation_failed": "Impossibile creare una certificate authority", "yunohost_configured": "YunoHost è stato configurato", - "yunohost_installing": "Installazione di YunoHost…", + "yunohost_installing": "Installazione di YunoHost...", "yunohost_not_installed": "YunoHost non è o non corretamente installato. Esegui 'yunohost tools postinstall'", "domain_cert_gen_failed": "Impossibile generare il certificato", "certmanager_attempt_to_replace_valid_cert": "Stai provando a sovrascrivere un certificato buono e valido per il dominio {domain:s}! (Usa --force per ignorare)", @@ -232,7 +232,7 @@ "password_too_simple_3": "La password deve essere lunga almeno 8 caratteri e contenere numeri, maiuscole e minuscole e simboli", "password_too_simple_4": "La password deve essere lunga almeno 12 caratteri e contenere numeri, maiuscole e minuscole", "users_available": "Utenti disponibili:", - "yunohost_ca_creation_success": "L'autorità di certificazione locale è stata creata.", + "yunohost_ca_creation_success": "Autorità di certificazione locale creata.", "app_action_cannot_be_ran_because_required_services_down": "I seguenti servizi dovrebbero essere in funzione per completare questa azione: {services}. Prova a riavviarli per proseguire (e possibilmente cercare di capire come ma non funzionano più).", "backup_output_symlink_dir_broken": "La tua cartella d'archivio '{path:s}' è un link simbolico interrotto. Probabilmente hai dimenticato di montare o montare nuovamente il supporto al quale punta il link.", "certmanager_conflicting_nginx_file": "Impossibile preparare il dominio per il controllo ACME: il file di configurazione nginx {filepath:s} è in conflitto e dovrebbe essere prima rimosso", @@ -247,47 +247,47 @@ "confirm_app_install_warning": "Attenzione: Questa applicazione potrebbe funzionare, ma non è ben integrata in YunoHost. Alcune funzionalità come il single sign-on e il backup/ripristino potrebbero non essere disponibili. Installare comunque? [{answers:s}] ", "confirm_app_install_danger": "ATTENZIONE! Questa applicazione è ancora sperimentale (se non esplicitamente dichiarata non funzionante)! Probabilmente NON dovresti installarla a meno che tu non sappia cosa stai facendo. NESSUN SUPPORTO verrà dato se quest'app non funziona o se rompe il tuo sistema... Se comunque accetti di prenderti questo rischio,digita '{answers:s}'", "confirm_app_install_thirdparty": "PERICOLO! Quest'applicazione non fa parte del catalogo Yunohost. Installando app di terze parti potresti compromettere l'integrita e la sicurezza del tuo sistema. Probabilmente NON dovresti installarla a meno che tu non sappia cosa stai facendo. NESSUN SUPPORTO verrà dato se quest'app non funziona o se rompe il tuo sistema... Se comunque accetti di prenderti questo rischio, digita '{answers:s}'", - "dpkg_is_broken": "Non puoi eseguire questo ora perchè dpkg/apt (i gestori di pacchetti del sistema) sembrano essere in stato danneggiato... Puoi provare a risolvere il problema connettendoti via SSH ed eseguire `sudo dpkg --configure -a`.", - "domain_cannot_remove_main": "Non è possibile rimuovere il dominio principale ora. Prima imposta un nuovo dominio principale", - "domain_dns_conf_is_just_a_recommendation": "Questo comando ti mostra qual è la configurazione *raccomandata*. Non ti imposta la configurazione DNS al tuo posto. È tua responsabilità configurare la tua zona DNS nel tuo registrar in accordo con queste raccomandazioni.", + "dpkg_is_broken": "Non puoi eseguire questo ora perchè dpkg/APT (i gestori di pacchetti del sistema) sembrano essere in stato danneggiato... Puoi provare a risolvere il problema connettendoti via SSH ed eseguire `sudo apt install --fix-broken` e/o `sudo dpkg --configure -a`.", + "domain_cannot_remove_main": "Non puoi rimuovere '{domain:s}' essendo il dominio principale, prima devi impostare un nuovo dominio principale con il comando 'yunohost domain main-domain -n '; ecco la lista dei domini candidati: {other_domains:s}", + "domain_dns_conf_is_just_a_recommendation": "Questo comando ti mostra la configurazione *raccomandata*. Non ti imposta la configurazione DNS al tuo posto. È tua responsabilità configurare la tua zona DNS nel tuo registrar in accordo con queste raccomandazioni.", "dyndns_could_not_check_provide": "Impossibile controllare se {provider:s} possano fornire {domain:s}.", "dyndns_could_not_check_available": "Impossibile controllare se {domain:s} è disponibile su {provider:s}.", - "dyndns_domain_not_provided": "Il fornitore Dyndns {provider:s} non può fornire il dominio {domain:s}.", - "experimental_feature": "Attenzione: questa funzionalità è sperimentale e non è considerata stabile, non dovresti utilizzarla a meno che tu non sappia cosa stai facendo.", + "dyndns_domain_not_provided": "Il fornitore DynDNS {provider:s} non può fornire il dominio {domain:s}.", + "experimental_feature": "Attenzione: Questa funzionalità è sperimentale e non è considerata stabile, non dovresti utilizzarla a meno che tu non sappia cosa stai facendo.", "file_does_not_exist": "Il file {path:s} non esiste.", - "global_settings_bad_choice_for_enum": "Scelta sbagliata per l'impostazione {setting:s}, ricevuta '{choice:s}' ma le scelte disponibili sono : {available_choices:s}", + "global_settings_bad_choice_for_enum": "Scelta sbagliata per l'impostazione {setting:s}, ricevuta '{choice:s}', ma le scelte disponibili sono: {available_choices:s}", "global_settings_bad_type_for_setting": "Tipo errato per l'impostazione {setting:s}, ricevuto {received_type:s}, atteso {expected_type:s}", "global_settings_cant_open_settings": "Apertura del file delle impostazioni non riuscita, motivo: {reason:s}", "global_settings_cant_serialize_settings": "Serializzazione dei dati delle impostazioni non riuscita, motivo: {reason:s}", "global_settings_cant_write_settings": "Scrittura del file delle impostazioni non riuscita, motivo: {reason:s}", "global_settings_key_doesnt_exists": "La chiave '{settings_key:s}' non esiste nelle impostazioni globali, puoi vedere tutte le chiavi disponibili eseguendo 'yunohost settings list'", - "global_settings_reset_success": "Successo. Le tue impostazioni precedenti sono state salvate in {path:s}", + "global_settings_reset_success": "Le impostazioni precedenti sono state salvate in {path:s}", "global_settings_setting_example_bool": "Esempio di opzione booleana", "global_settings_setting_example_enum": "Esempio di opzione enum", "already_up_to_date": "Niente da fare. Tutto è già aggiornato.", "global_settings_setting_example_int": "Esempio di opzione int", "global_settings_setting_example_string": "Esempio di opzione string", - "global_settings_setting_security_nginx_compatibility": "Bilanciamento tra compatibilità e sicurezza per il server web nginx. Riguarda gli algoritmi di cifratura (e altri aspetti legati alla sicurezza)", + "global_settings_setting_security_nginx_compatibility": "Bilanciamento tra compatibilità e sicurezza per il server web NGIX. Riguarda gli algoritmi di cifratura (e altri aspetti legati alla sicurezza)", "global_settings_setting_security_password_admin_strength": "Complessità della password di amministratore", "global_settings_setting_security_password_user_strength": "Complessità della password utente", "global_settings_setting_security_ssh_compatibility": "Bilanciamento tra compatibilità e sicurezza per il server SSH. Riguarda gli algoritmi di cifratura (e altri aspetti legati alla sicurezza)", "global_settings_unknown_setting_from_settings_file": "Chiave sconosciuta nelle impostazioni: '{setting_key:s}', scartata e salvata in /etc/yunohost/settings-unknown.json", - "global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Consenti l'uso del (deprecato) hostkey DSA per la configurazione del demone SSH", + "global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Consenti l'uso del hostkey DSA (deprecato) per la configurazione del demone SSH", "global_settings_unknown_type": "Situazione inaspettata, l'impostazione {setting:s} sembra essere di tipo {unknown_type:s} ma non è un tipo supportato dal sistema.", "good_practices_about_admin_password": "Stai per definire una nuova password di amministratore. La password deve essere almeno di 8 caratteri - anche se è buona pratica utilizzare password più lunghe (es. una frase, una serie di parole) e/o utilizzare vari tipi di caratteri (maiuscole, minuscole, numeri e simboli).", - "log_corrupted_md_file": "Il file dei metadati yaml associato con i registri è corrotto: '{md_file}'", + "log_corrupted_md_file": "Il file dei metadati YAML associato con i registri è danneggiato: '{md_file}'\nErrore: {error}", "log_category_404": "La categoria di registrazione '{category}' non esiste", "log_link_to_log": "Registro completo di questa operazione: '{desc}'", "log_help_to_get_log": "Per vedere il registro dell'operazione '{desc}', usa il comando 'yunohost log display {name}'", "global_settings_setting_security_postfix_compatibility": "Bilanciamento tra compatibilità e sicurezza per il server Postfix. Riguarda gli algoritmi di cifratura (e altri aspetti legati alla sicurezza)", - "log_link_to_failed_log": "L'operazione '{desc}' è fallita! Per ottenere aiuto, per favore fornisci il registro completo dell'operazione cliccando qui", - "log_help_to_get_failed_log": "L'operazione '{desc}' è fallita! Per ottenere aiuto, per favore condividi il registro completo dell'operazione utilizzando il comando 'yunohost log display {name} --share'", + "log_link_to_failed_log": "Impossibile completare l'operazione '{desc}'! Per ricevere aiuto, per favore fornisci il registro completo dell'operazione cliccando qui", + "log_help_to_get_failed_log": "L'operazione '{desc}' non può essere completata. Per ottenere aiuto, per favore condividi il registro completo dell'operazione utilizzando il comando 'yunohost log display {name} --share'", "log_does_exists": "Non esiste nessun registro delle operazioni chiamato '{log}', usa 'yunohost log list' per vedere tutti i registri delle operazioni disponibili", - "log_app_change_url": "Cambia l'url dell'applicazione '{}'", - "log_app_install": "Installa l'applicazione '{}'", - "log_app_remove": "Rimuovi l'applicazione '{}'", - "log_app_upgrade": "Aggiorna l'applicazione '{}'", - "log_app_makedefault": "Rendi predefinita l'applicazione '{}'", + "log_app_change_url": "Cambia l'URL dell'app '{}'", + "log_app_install": "Installa l'app '{}'", + "log_app_remove": "Rimuovi l'app '{}'", + "log_app_upgrade": "Aggiorna l'app '{}'", + "log_app_makedefault": "Rendi '{}' l'app predefinita", "log_available_on_yunopaste": "Questo registro è ora disponibile via {url}", "log_backup_restore_system": "Ripristina sistema da un archivio di backup", "log_backup_restore_app": "Ripristina '{}' da un archivio di backup", @@ -296,16 +296,16 @@ "log_domain_add": "Aggiungi il dominio '{}' nella configurazione di sistema", "log_domain_remove": "Rimuovi il dominio '{}' dalla configurazione di sistema", "log_dyndns_subscribe": "Sottoscrivi un sottodominio YunoHost '{}'", - "log_dyndns_update": "Aggiorna l'ip associato con il tuo sottodominio YunoHost '{}'", + "log_dyndns_update": "Aggiorna l'IP associato con il tuo sottodominio YunoHost '{}'", "log_letsencrypt_cert_install": "Installa un certificato Let's encrypt sul dominio '{}'", "log_selfsigned_cert_install": "Installa un certificato autofirmato sul dominio '{}'", - "log_letsencrypt_cert_renew": "Rinnova il certificato Let's encrypt sul dominio '{}'", + "log_letsencrypt_cert_renew": "Rinnova il certificato Let's Encrypt sul dominio '{}'", "log_regen_conf": "Rigenera configurazioni di sistema '{}'", "log_user_create": "Aggiungi l'utente '{}'", "log_user_delete": "Elimina l'utente '{}'", - "log_user_update": "Aggiornate le informazioni dell'utente '{}'", + "log_user_update": "Aggiorna le informazioni dell'utente '{}'", "log_domain_main_domain": "Rendi '{}' dominio principale", - "log_tools_migrations_migrate_forward": "Migra avanti", + "log_tools_migrations_migrate_forward": "Esegui le migrazioni", "log_tools_postinstall": "Postinstallazione del tuo server YunoHost", "log_tools_upgrade": "Aggiornamento dei pacchetti di sistema", "log_tools_shutdown": "Spegni il tuo server", @@ -334,12 +334,12 @@ "migration_0003_yunohost_upgrade": "Iniziando l'aggiornamento dei pacchetti yunohost… La migrazione terminerà, ma l'aggiornamento attuale avverrà subito dopo. Dopo che l'operazione sarà completata, probabilmente dovrai riaccedere all'interfaccia di amministrazione.", "migration_0003_not_jessie": "La distribuzione attuale non è Jessie!", "migration_0003_system_not_fully_up_to_date": "Il tuo sistema non è completamente aggiornato. Per favore prima esegui un aggiornamento normale prima di migrare a stretch.", - "this_action_broke_dpkg": "Questa azione ha danneggiato dpkg/apt (i gestori di pacchetti del sistema)… Puoi provare a risolvere questo problema connettendoti via SSH ed eseguendo `sudo dpkg --configure -a`.", + "this_action_broke_dpkg": "Questa azione ha danneggiato dpkg/APT (i gestori di pacchetti del sistema)... Puoi provare a risolvere questo problema connettendoti via SSH ed eseguendo `sudo apt install --fix-broken` e/o `sudo dpkg --configure -a`.", "app_action_broke_system": "Questa azione sembra avere rotto questi servizi importanti: {services}", "app_remove_after_failed_install": "Rimozione dell'applicazione a causa del fallimento dell'installazione...", "app_install_script_failed": "Si è verificato un errore nello script di installazione dell'applicazione", "app_install_failed": "Impossibile installare {app}:{error}", - "app_full_domain_unavailable": "Spiacente, questa app deve essere installata su un proprio dominio, ma altre applicazioni sono state installate sul dominio '{domain}'. Dovresti invece usare un sotto-dominio dedicato per questa app.", + "app_full_domain_unavailable": "Spiacente, questa app deve essere installata su un proprio dominio, ma altre applicazioni sono già installate sul dominio '{domain}'. Potresti usare invece un sotto-dominio dedicato per questa app.", "app_upgrade_script_failed": "È stato trovato un errore nello script di aggiornamento dell'applicazione", "apps_already_up_to_date": "Tutte le applicazioni sono aggiornate", "apps_catalog_init_success": "Catalogo delle applicazioni inizializzato!", @@ -357,7 +357,7 @@ "app_manifest_install_ask_admin": "Scegli un utente amministratore per quest'applicazione", "app_manifest_install_ask_password": "Scegli una password di amministrazione per quest'applicazione", "app_manifest_install_ask_path": "Scegli il percorso dove installare quest'applicazione", - "app_manifest_install_ask_domain": "Scegli il dominio sotto il quale installare quest'applicazione", + "app_manifest_install_ask_domain": "Scegli il dominio dove installare quest'app", "app_argument_password_no_default": "Errore durante il parsing dell'argomento '{name}': l'argomento password non può avere un valore di default per ragioni di sicurezza", "additional_urls_already_added": "L'URL aggiuntivo '{url:s}' è già utilizzato come URL aggiuntivo per il permesso '{permission:s}'", "diagnosis_basesystem_ynh_inconsistent_versions": "Stai eseguendo versioni incompatibili dei pacchetti YunoHost... probabilmente a causa di aggiornamenti falliti o parziali.", @@ -430,5 +430,12 @@ "diagnosis_ram_verylow": "Il sistema ha solo {available} ({available_percent}%) di RAM disponibile (su {total})", "diagnosis_diskusage_ok": "Lo storage {mountpoint} (nel device {device} ha solo {free} ({free_percent}%) di spazio libero rimanente (su {total})!", "diagnosis_diskusage_low": "Lo storage {mountpoint} (nel device {device} ha solo {free} ({free_percent}%) di spazio libero rimanente (su {total}). Fa attenzione.", - "diagnosis_diskusage_verylow": "Lo storage {mountpoint} (nel device {device} ha solo {free} ({free_percent}%) di spazio libero rimanente (su {total}). Dovresti seriamente considerare di fare un po' di pulizia!" + "diagnosis_diskusage_verylow": "Lo storage {mountpoint} (nel device {device} ha solo {free} ({free_percent}%) di spazio libero rimanente (su {total}). Dovresti seriamente considerare di fare un po' di pulizia!", + "diagnosis_mail_fcrdns_nok_details": "Dovresti prima configurare il DNS inverso con {ehlo_domain} nell'interfaccia del tuo router internet o del tuo hosting provider. (Alcuni hosting provider potrebbero richiedere l'invio di un ticket di supporto per la richiesta).", + "diagnosis_mail_fcrdns_dns_missing": "Nessun DNS inverso è configurato per IPv{ipversion}. Alcune email potrebbero non essere inviate o segnalate come spam.", + "diagnosis_mail_fcrdns_ok": "Il tuo DNS inverso è configurato correttamente!", + "diagnosis_mail_ehlo_could_not_diagnose_details": "Errore: {error}", + "diagnosis_mail_ehlo_could_not_diagnose": "Non è possibile verificare se il server mail postfix è raggiungibile dall'esterno su IPv{ipversion}.", + "diagnosis_mail_ehlo_wrong": "Un server mail SMTP diverso sta rispondendo su IPv{ipversion}. Probabilmente il tuo server non può ricevere email.", + "diagnosis_mail_ehlo_bad_answer_details": "Potrebbe essere un'altra macchina a rispondere al posto del tuo server." } From 6360f46972df369e57923e25993206d4ad524bb5 Mon Sep 17 00:00:00 2001 From: Christian Wehrli Date: Mon, 14 Dec 2020 19:27:41 +0000 Subject: [PATCH 103/128] Translated using Weblate (German) Currently translated at 57.4% (362 of 630 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/locales/de.json b/locales/de.json index d85879bf4..9c8fa33c8 100644 --- a/locales/de.json +++ b/locales/de.json @@ -298,7 +298,7 @@ "log_app_makedefault": "Mache '{}' zur Standard-Anwendung", "hook_json_return_error": "Konnte die Rückkehr vom Einsprungpunkt {path:s} nicht lesen. Fehler: {msg:s}. Unformatierter Inhalt: {raw_content}", "app_full_domain_unavailable": "Es tut uns leid, aber diese Anwendung erfordert die Installation auf einer eigenen Domain, aber einige andere Anwendungen sind bereits auf der Domäne'{domain}' installiert. Eine mögliche Lösung ist das Hinzufügen und Verwenden einer Subdomain, die dieser Anwendung zugeordnet ist.", - "app_install_failed": "Installation von {app} fehlgeschlagen: {error}", + "app_install_failed": "{app} kann nicht installiert werden: {error}", "app_install_script_failed": "Im Installationsscript ist ein Fehler aufgetreten", "app_remove_after_failed_install": "Entfernen der App nach fehlgeschlagener Installation...", "app_upgrade_script_failed": "Es ist ein Fehler im App-Upgrade-Skript aufgetreten", @@ -469,5 +469,7 @@ "additional_urls_already_added": "Zusätzliche URL '{url:s}' bereits hinzugefügt in der zusätzlichen URL für Berechtigung '{permission:s}'", "additional_urls_already_removed": "Zusätzliche URL '{url:s}' bereits entfernt in der zusätzlichen URL für Berechtigung '{permission:s}'", "app_label_deprecated": "Dieser Befehl ist veraltet! Bitte nutzen Sie den neuen Befehl 'yunohost user permission update' um das Applabel zu verwalten.", - "diagnosis_http_hairpinning_issue_details": "Das ist wahrscheinlich aufgrund Ihrer ISP Box / Router. Als Konsequenz können Personen von ausserhalb Ihres Netzwerkes aber nicht von innerhalb Ihres lokalen Netzwerkes (wie wahrscheinlich Sie selber?) wie gewohnt auf Ihren Server zugreifen, wenn Sie ihre Domäne oder Ihre öffentliche IP verwenden. Sie können die Situation wahrscheinlich verbessern, indem Sie ein einen Blick in https://yunohost.org/dns_local_network werfen" + "diagnosis_http_hairpinning_issue_details": "Das ist wahrscheinlich aufgrund Ihrer ISP Box / Router. Als Konsequenz können Personen von ausserhalb Ihres Netzwerkes aber nicht von innerhalb Ihres lokalen Netzwerkes (wie wahrscheinlich Sie selber?) wie gewohnt auf Ihren Server zugreifen, wenn Sie ihre Domäne oder Ihre öffentliche IP verwenden. Sie können die Situation wahrscheinlich verbessern, indem Sie ein einen Blick in https://yunohost.org/dns_local_network werfen", + "diagnosis_http_nginx_conf_not_up_to_date": "Jemand hat anscheinend die Konfiguration von Nginx manuell geändert. Diese Änderung verhindert, dass Yunohost eine Diagnose durchführen kann, wenn er via HTTP erreichbar ist.", + "diagnosis_http_bad_status_code": "Anscheinend beantwortet ein anderes Gerät als Ihr Server die Anfrage (Vielleicht ihr Internetrouter).
1. Die häufigste Ursache ist, dass Port 80 (und 443) nicht richtig auf Ihren Server weitergeleitet wird.
2. Bei komplexeren Setups: Vergewissern Sie sich, dass keine Firewall und keine Reverse-Proxy interferieren." } From 1a92a905aa52884a7cb04d028857df6ccaf55ee3 Mon Sep 17 00:00:00 2001 From: Flavio Cristoforetti Date: Mon, 14 Dec 2020 16:13:36 +0000 Subject: [PATCH 104/128] Translated using Weblate (Italian) Currently translated at 58.4% (368 of 630 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/it/ --- locales/it.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/locales/it.json b/locales/it.json index 085bd506a..b3f2dc718 100644 --- a/locales/it.json +++ b/locales/it.json @@ -11,13 +11,13 @@ "backup_output_directory_not_empty": "Dovresti scegliere una cartella di output vuota", "domain_created": "Dominio creato", "domain_exists": "Il dominio esiste già", - "ldap_initialized": "LDAP è stato inizializzato", - "pattern_email": "L'indirizzo email deve essere valido (es. someone@domain.org)", + "ldap_initialized": "LDAP inizializzato", + "pattern_email": "L'indirizzo email deve essere valido, senza simboli '+' (es. tizio@dominio.com)", "pattern_mailbox_quota": "La dimensione deve avere un suffisso b/k/M/G/T o 0 per disattivare la quota", "port_already_opened": "La porta {port:d} è già aperta per {ip_version:s} connessioni", "service_add_failed": "Impossibile aggiungere il servizio '{service:s}'", "service_cmd_exec_failed": "Impossibile eseguire il comando '{command:s}'", - "service_disabled": "Il servizio '{service:s}' è stato disattivato", + "service_disabled": "Il servizio '{service:s}' non partirà più al boot di sistema.", "service_remove_failed": "Impossibile rimuovere il servizio '{service:s}'", "service_removed": "Il servizio '{service:s}' è stato rimosso", "service_stop_failed": "Impossibile fermare il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}", @@ -68,7 +68,7 @@ "domain_deletion_failed": "Impossibile cancellare il dominio {domain}: {error}", "domain_dyndns_already_subscribed": "Hai già sottoscritto un dominio DynDNS", "domain_dyndns_root_unknown": "Dominio radice DynDNS sconosciuto", - "domain_hostname_failed": "La definizione del nuovo hostname è fallita", + "domain_hostname_failed": "Impossibile impostare il nuovo hostname. Potrebbe causare problemi in futuro (o anche no).", "domain_uninstall_app_first": "Queste applicazioni sono già installate su questo dominio: {apps}. Disinstallale prima di procedere alla cancellazione di un dominio", "domain_unknown": "Dominio sconosciuto", "done": "Terminato", @@ -92,18 +92,18 @@ "firewall_reload_failed": "Impossibile ricaricare il firewall", "firewall_reloaded": "Firewall ricaricato", "firewall_rules_cmd_failed": "Alcune regole del firewall sono fallite. Per ulteriori informazioni, vedi il registro.", - "hook_exec_failed": "L'esecuzione dello script è fallita: {path:s}", - "hook_exec_not_terminated": "L'esecuzione dello script non è stata terminata: {path:s}", + "hook_exec_failed": "Impossibile eseguire lo script: {path:s}", + "hook_exec_not_terminated": "Los script non è stato eseguito correttamente: {path:s}", "hook_name_unknown": "Nome di hook '{name:s}' sconosciuto", "installation_complete": "Installazione completata", - "installation_failed": "Installazione fallita", + "installation_failed": "Qualcosa è andato storto durante l'installazione", "ip6tables_unavailable": "Non puoi giocare con ip6tables qui. O sei in un container o il tuo kernel non lo supporta", "iptables_unavailable": "Non puoi giocare con iptables qui. O sei in un container o il tuo kernel non lo supporta", "ldap_init_failed_to_create_admin": "L'inizializzazione LDAP non è riuscita a creare un utente admin", "mail_alias_remove_failed": "Impossibile rimuovere l'alias mail '{mail:s}'", - "mail_domain_unknown": "Dominio d'indirizzo mail '{domain:s}' sconosciuto", + "mail_domain_unknown": "Indirizzo mail non valido per il dominio '{domain:s}'. Usa un dominio gestito da questo server.", "mail_forward_remove_failed": "Impossibile rimuovere la mail inoltrata '{mail:s}'", - "mailbox_used_space_dovecot_down": "Il servizio di posta elettronica Dovecot deve essere attivato se vuoi riportare lo spazio usato dalla posta elettronica", + "mailbox_used_space_dovecot_down": "La casella di posta elettronica Dovecot deve essere attivato se vuoi recuperare lo spazio usato dalla posta elettronica", "main_domain_change_failed": "Impossibile cambiare il dominio principale", "main_domain_changed": "Il dominio principale è stato cambiato", "no_internet_connection": "Il server non è collegato a Internet", @@ -119,7 +119,7 @@ "pattern_positive_number": "Deve essere un numero positivo", "pattern_username": "Caratteri minuscoli alfanumerici o trattini bassi soli", "port_already_closed": "La porta {port:d} è già chiusa per le connessioni {ip_version:s}", - "restore_already_installed_app": "Un'applicazione è già installata con l'identificativo '{app:s}'", + "restore_already_installed_app": "Un'applicazione con l'ID '{app:s}' è già installata", "restore_app_failed": "Impossibile ripristinare l'applicazione '{app:s}'", "restore_cleaning_failed": "Impossibile pulire la directory temporanea di ripristino", "restore_complete": "Ripristino completo", @@ -127,15 +127,15 @@ "restore_failed": "Impossibile ripristinare il sistema", "user_update_failed": "Impossibile aggiornare l'utente", "restore_hook_unavailable": "Lo script di ripristino per '{part:s}' non è disponibile per il tuo sistema e non è nemmeno nell'archivio", - "restore_nothings_done": "Non è stato ripristinato nulla", + "restore_nothings_done": "Nulla è stato ripristinato", "restore_running_app_script": "Ripristino dell'app '{app:s}'…", "restore_running_hooks": "Esecuzione degli hook di ripristino…", "service_added": "Il servizio '{service:s}' è stato aggiunto", - "service_already_started": "Il servizio '{service:s}' è già stato avviato", + "service_already_started": "Il servizio '{service:s}' è già avviato", "service_already_stopped": "Il servizio '{service:s}' è già stato fermato", - "service_disable_failed": "Impossibile disabilitare il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}", - "service_enable_failed": "Impossibile abilitare il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}", - "service_enabled": "Il servizio '{service:s}' è stato attivato", + "service_disable_failed": "Impossibile disabilitare l'avvio al boot del servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}", + "service_enable_failed": "Impossibile eseguire il servizio '{service:s}' al boot di sistema.\n\nRegistri di servizio recenti:{logs:s}", + "service_enabled": "Il servizio '{service:s}' si avvierà automaticamente al boot di sistema.", "service_start_failed": "Impossibile eseguire il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}", "service_started": "Il servizio '{service:s}' è stato avviato", "service_stopped": "Il servizio '{service:s}' è stato fermato", @@ -304,7 +304,7 @@ "log_user_create": "Aggiungi l'utente '{}'", "log_user_delete": "Elimina l'utente '{}'", "log_user_update": "Aggiorna le informazioni dell'utente '{}'", - "log_domain_main_domain": "Rendi '{}' dominio principale", + "log_domain_main_domain": "Rendi '{}' il dominio principale", "log_tools_migrations_migrate_forward": "Esegui le migrazioni", "log_tools_postinstall": "Postinstallazione del tuo server YunoHost", "log_tools_upgrade": "Aggiornamento dei pacchetti di sistema", From 602ca3752a2942e4fa386637df2cf6c0a984beaf Mon Sep 17 00:00:00 2001 From: Flavio Cristoforetti Date: Tue, 15 Dec 2020 10:49:08 +0000 Subject: [PATCH 105/128] Translated using Weblate (Italian) Currently translated at 63.0% (397 of 630 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/it/ --- locales/it.json | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/locales/it.json b/locales/it.json index b3f2dc718..fc22b76e7 100644 --- a/locales/it.json +++ b/locales/it.json @@ -19,12 +19,12 @@ "service_cmd_exec_failed": "Impossibile eseguire il comando '{command:s}'", "service_disabled": "Il servizio '{service:s}' non partirà più al boot di sistema.", "service_remove_failed": "Impossibile rimuovere il servizio '{service:s}'", - "service_removed": "Il servizio '{service:s}' è stato rimosso", + "service_removed": "Servizio '{service:s}' rimosso", "service_stop_failed": "Impossibile fermare il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}", - "system_username_exists": "il nome utente esiste già negli utenti del sistema", - "unrestore_app": "L'applicazione '{app:s}' non verrà ripristinata", + "system_username_exists": "Il nome utente esiste già negli utenti del sistema", + "unrestore_app": "{app:s} non verrà ripristinata", "upgrading_packages": "Aggiornamento dei pacchetti...", - "user_deleted": "L'utente è stato cancellato", + "user_deleted": "Utente cancellato", "admin_password": "Password dell'amministrazione", "admin_password_change_failed": "Impossibile cambiare la password", "admin_password_changed": "La password d'amministrazione è stata cambiata", @@ -110,7 +110,7 @@ "not_enough_disk_space": "Non c'è abbastanza spazio libero in '{path:s}'", "package_unknown": "Pacchetto '{pkgname}' sconosciuto", "packages_upgrade_failed": "Impossibile aggiornare tutti i pacchetti", - "pattern_backup_archive_name": "Deve essere un nome di file valido con caratteri alfanumerici e -_. soli", + "pattern_backup_archive_name": "Deve essere un nome di file valido di massimo 30 caratteri di lunghezza, con caratteri alfanumerici e \"-_.\" come unica punteggiatura", "pattern_domain": "Deve essere un nome di dominio valido (es. il-mio-dominio.org)", "pattern_firstname": "Deve essere un nome valido", "pattern_lastname": "Deve essere un cognome valido", @@ -125,7 +125,7 @@ "restore_complete": "Ripristino completo", "restore_confirm_yunohost_installed": "Sei sicuro di volere ripristinare un sistema già installato? {answers:s}", "restore_failed": "Impossibile ripristinare il sistema", - "user_update_failed": "Impossibile aggiornare l'utente", + "user_update_failed": "Impossibile aggiornare l'utente {user}: {error}", "restore_hook_unavailable": "Lo script di ripristino per '{part:s}' non è disponibile per il tuo sistema e non è nemmeno nell'archivio", "restore_nothings_done": "Nulla è stato ripristinato", "restore_running_app_script": "Ripristino dell'app '{app:s}'…", @@ -137,32 +137,32 @@ "service_enable_failed": "Impossibile eseguire il servizio '{service:s}' al boot di sistema.\n\nRegistri di servizio recenti:{logs:s}", "service_enabled": "Il servizio '{service:s}' si avvierà automaticamente al boot di sistema.", "service_start_failed": "Impossibile eseguire il servizio '{service:s}'\n\nRegistri di servizio recenti:{logs:s}", - "service_started": "Il servizio '{service:s}' è stato avviato", - "service_stopped": "Il servizio '{service:s}' è stato fermato", + "service_started": "Servizio '{service:s}' avviato", + "service_stopped": "Servizio '{service:s}' fermato", "service_unknown": "Servizio '{service:s}' sconosciuto", - "ssowat_conf_generated": "La configurazione SSOwat è stata generata", - "ssowat_conf_updated": "La configurazione SSOwat è stata aggiornata", - "system_upgraded": "Il sistema è stato aggiornato", - "unbackup_app": "L'applicazione '{app:s}' non verrà salvata", - "unexpected_error": "Un'errore inaspettata si è verificata", + "ssowat_conf_generated": "La configurazione SSOwat rigenerata", + "ssowat_conf_updated": "Configurazione SSOwat aggiornata", + "system_upgraded": "Sistema aggiornato", + "unbackup_app": "{app:s} non verrà salvata", + "unexpected_error": "È successo qualcosa di inatteso: {error}", "unlimit": "Nessuna quota", "updating_apt_cache": "Recupero degli aggiornamenti disponibili per i pacchetti di sistema...", "upgrade_complete": "Aggiornamento completo", "upnp_dev_not_found": "Nessuno supporto UPnP trovato", "upnp_disabled": "UPnP è stato disattivato", "upnp_enabled": "UPnP è stato attivato", - "upnp_port_open_failed": "Impossibile aprire le porte UPnP", - "user_created": "L'utente è stato creato", - "user_creation_failed": "Impossibile creare l'utente", - "user_deletion_failed": "Impossibile cancellare l'utente", - "user_home_creation_failed": "Impossibile creare la home directory del utente", + "upnp_port_open_failed": "Impossibile aprire le porte attraverso UPnP", + "user_created": "Utente creato", + "user_creation_failed": "Impossibile creare l'utente {user}: {error}", + "user_deletion_failed": "Impossibile cancellare l'utente {user}: {error}", + "user_home_creation_failed": "Impossibile creare la 'home' directory del utente", "user_unknown": "Utente sconosciuto: {user:s}", - "user_updated": "L'utente è stato aggiornato", + "user_updated": "Info dell'utente cambiate", "yunohost_already_installed": "YunoHost è già installato", "yunohost_ca_creation_failed": "Impossibile creare una certificate authority", - "yunohost_configured": "YunoHost è stato configurato", + "yunohost_configured": "YunoHost ora è configurato", "yunohost_installing": "Installazione di YunoHost...", - "yunohost_not_installed": "YunoHost non è o non corretamente installato. Esegui 'yunohost tools postinstall'", + "yunohost_not_installed": "YunoHost non è correttamente installato. Esegui 'yunohost tools postinstall'", "domain_cert_gen_failed": "Impossibile generare il certificato", "certmanager_attempt_to_replace_valid_cert": "Stai provando a sovrascrivere un certificato buono e valido per il dominio {domain:s}! (Usa --force per ignorare)", "certmanager_domain_unknown": "Dominio {domain:s} sconosciuto", @@ -437,5 +437,7 @@ "diagnosis_mail_ehlo_could_not_diagnose_details": "Errore: {error}", "diagnosis_mail_ehlo_could_not_diagnose": "Non è possibile verificare se il server mail postfix è raggiungibile dall'esterno su IPv{ipversion}.", "diagnosis_mail_ehlo_wrong": "Un server mail SMTP diverso sta rispondendo su IPv{ipversion}. Probabilmente il tuo server non può ricevere email.", - "diagnosis_mail_ehlo_bad_answer_details": "Potrebbe essere un'altra macchina a rispondere al posto del tuo server." + "diagnosis_mail_ehlo_bad_answer_details": "Potrebbe essere un'altra macchina a rispondere al posto del tuo server.", + "diagnosis_mail_fcrdns_nok_alternatives_4": "Alcuni provider non ti permettono di configurare un DNS inverso (o la loro configurazione non funziona...). Se stai avendo problemi a causa di ciò, considera le seguenti soluzioni:
- Alcuni ISP mettono a disposizione un alternativa attraverso un mail server relay anche se implica che il relay ha la capacità di leggere il vostro traffico email.
- Un alternativa privacy-friendly è quella di usare una VPN *con un indirizzo IP pubblico dedicato* per bypassare questo tipo di limite. Vedi https://yunohost.org/#/vpn_advantage
- Puoi anche prendere in considerazione di cambiare internet provider", + "diagnosis_mail_ehlo_wrong_details": "L'EHLO ricevuto dalla diagnostica remota su IPv{ipversion} è differente dal dominio del tuo server.
EHLO ricevuto: {wrong_ehlo}
EHLO atteso: {right_ehlo}
La causa più comune di questo problema è la porta 25 non correttamente inoltrata al tuo server. Oppure assicurati che nessun firewall o reverse-proxy stia interferendo." } From a26d341d59f2416f4e253f35ab439ba9bbc0c167 Mon Sep 17 00:00:00 2001 From: Flavio Cristoforetti Date: Wed, 16 Dec 2020 12:37:38 +0000 Subject: [PATCH 106/128] Translated using Weblate (Italian) Currently translated at 63.6% (401 of 630 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/it/ --- locales/it.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/locales/it.json b/locales/it.json index fc22b76e7..452876803 100644 --- a/locales/it.json +++ b/locales/it.json @@ -439,5 +439,9 @@ "diagnosis_mail_ehlo_wrong": "Un server mail SMTP diverso sta rispondendo su IPv{ipversion}. Probabilmente il tuo server non può ricevere email.", "diagnosis_mail_ehlo_bad_answer_details": "Potrebbe essere un'altra macchina a rispondere al posto del tuo server.", "diagnosis_mail_fcrdns_nok_alternatives_4": "Alcuni provider non ti permettono di configurare un DNS inverso (o la loro configurazione non funziona...). Se stai avendo problemi a causa di ciò, considera le seguenti soluzioni:
- Alcuni ISP mettono a disposizione un alternativa attraverso un mail server relay anche se implica che il relay ha la capacità di leggere il vostro traffico email.
- Un alternativa privacy-friendly è quella di usare una VPN *con un indirizzo IP pubblico dedicato* per bypassare questo tipo di limite. Vedi https://yunohost.org/#/vpn_advantage
- Puoi anche prendere in considerazione di cambiare internet provider", - "diagnosis_mail_ehlo_wrong_details": "L'EHLO ricevuto dalla diagnostica remota su IPv{ipversion} è differente dal dominio del tuo server.
EHLO ricevuto: {wrong_ehlo}
EHLO atteso: {right_ehlo}
La causa più comune di questo problema è la porta 25 non correttamente inoltrata al tuo server. Oppure assicurati che nessun firewall o reverse-proxy stia interferendo." + "diagnosis_mail_ehlo_wrong_details": "L'EHLO ricevuto dalla diagnostica remota su IPv{ipversion} è differente dal dominio del tuo server.
EHLO ricevuto: {wrong_ehlo}
EHLO atteso: {right_ehlo}
La causa più comune di questo problema è la porta 25 non correttamente inoltrata al tuo server. Oppure assicurati che nessun firewall o reverse-proxy stia interferendo.", + "diagnosis_mail_blacklist_ok": "Gli IP e i domini utilizzati da questo server non sembrano essere nelle blacklist.", + "diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "DNS invero corrente: {rdns_domain}
Valore atteso: {ehlo_domain}", + "diagnosis_mail_fcrdns_different_from_ehlo_domain": "Il DNS inverso non è correttamente configurato su IPv{ipversion}. Alcune email potrebbero non essere spedite o segnalate come SPAM.", + "diagnosis_mail_fcrdns_nok_alternatives_6": "Alcuni provider non permettono di configurare un DNS inverso (o non è configurato bene...). Se il tuo DNS inverso è correttamente configurato per IPv4, puoi provare a disabilitare l'utilizzo di IPv6 durante l'invio mail eseguendo yunohost settings set smtp.allow_ipv6 -v off. NB: se esegui il comando non sarà più possibile inviare o ricevere email da i pochi IPv6-only server mail esistenti." } From 1441ddea5784867d9cb245203d85ed8535388f79 Mon Sep 17 00:00:00 2001 From: Flavio Cristoforetti Date: Wed, 16 Dec 2020 16:21:22 +0000 Subject: [PATCH 107/128] Translated using Weblate (Italian) Currently translated at 100.0% (630 of 630 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/it/ --- locales/it.json | 233 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 231 insertions(+), 2 deletions(-) diff --git a/locales/it.json b/locales/it.json index 452876803..0a30b5790 100644 --- a/locales/it.json +++ b/locales/it.json @@ -440,8 +440,237 @@ "diagnosis_mail_ehlo_bad_answer_details": "Potrebbe essere un'altra macchina a rispondere al posto del tuo server.", "diagnosis_mail_fcrdns_nok_alternatives_4": "Alcuni provider non ti permettono di configurare un DNS inverso (o la loro configurazione non funziona...). Se stai avendo problemi a causa di ciò, considera le seguenti soluzioni:
- Alcuni ISP mettono a disposizione un alternativa attraverso un mail server relay anche se implica che il relay ha la capacità di leggere il vostro traffico email.
- Un alternativa privacy-friendly è quella di usare una VPN *con un indirizzo IP pubblico dedicato* per bypassare questo tipo di limite. Vedi https://yunohost.org/#/vpn_advantage
- Puoi anche prendere in considerazione di cambiare internet provider", "diagnosis_mail_ehlo_wrong_details": "L'EHLO ricevuto dalla diagnostica remota su IPv{ipversion} è differente dal dominio del tuo server.
EHLO ricevuto: {wrong_ehlo}
EHLO atteso: {right_ehlo}
La causa più comune di questo problema è la porta 25 non correttamente inoltrata al tuo server. Oppure assicurati che nessun firewall o reverse-proxy stia interferendo.", - "diagnosis_mail_blacklist_ok": "Gli IP e i domini utilizzati da questo server non sembrano essere nelle blacklist.", + "diagnosis_mail_blacklist_ok": "Gli IP e i domini utilizzati da questo server non sembrano essere nelle blacklist", "diagnosis_mail_fcrdns_different_from_ehlo_domain_details": "DNS invero corrente: {rdns_domain}
Valore atteso: {ehlo_domain}", "diagnosis_mail_fcrdns_different_from_ehlo_domain": "Il DNS inverso non è correttamente configurato su IPv{ipversion}. Alcune email potrebbero non essere spedite o segnalate come SPAM.", - "diagnosis_mail_fcrdns_nok_alternatives_6": "Alcuni provider non permettono di configurare un DNS inverso (o non è configurato bene...). Se il tuo DNS inverso è correttamente configurato per IPv4, puoi provare a disabilitare l'utilizzo di IPv6 durante l'invio mail eseguendo yunohost settings set smtp.allow_ipv6 -v off. NB: se esegui il comando non sarà più possibile inviare o ricevere email da i pochi IPv6-only server mail esistenti." + "diagnosis_mail_fcrdns_nok_alternatives_6": "Alcuni provider non permettono di configurare un DNS inverso (o non è configurato bene...). Se il tuo DNS inverso è correttamente configurato per IPv4, puoi provare a disabilitare l'utilizzo di IPv6 durante l'invio mail eseguendo yunohost settings set smtp.allow_ipv6 -v off. NB: se esegui il comando non sarà più possibile inviare o ricevere email da i pochi IPv6-only server mail esistenti.", + "yunohost_postinstall_end_tip": "La post-installazione è completata! Per rifinire il tuo setup, considera di:\n\t- aggiungere il primo utente nella sezione 'Utenti' del webadmin (o eseguendo da terminale 'yunohost user create ');\n\t- eseguire una diagnosi alla ricerca di problemi nella sezione 'Diagnosi' del webadmin (o eseguendo da terminale 'yunohost diagnosis run');\n\t- leggere 'Finalizing your setup' e 'Getting to know Yunohost' nella documentazione admin: https://yunohost.org/admindoc.", + "user_already_exists": "L'utente '{user}' esiste già", + "update_apt_cache_warning": "Qualcosa è andato storto mentre eseguivo l'aggiornamento della cache APT (package manager di Debian). Ecco il dump di sources.list, che potrebbe aiutare ad identificare le linee problematiche:\n{sourceslist}", + "update_apt_cache_failed": "Impossibile aggiornare la cache di APT (package manager di Debian). Ecco il dump di sources.list, che potrebbe aiutare ad identificare le linee problematiche:\n{sourceslist}", + "unknown_main_domain_path": "Percorso o dominio sconosciuto per '{app}'. Devi specificare un dominio e un percorso per poter specificare un URL per il permesso.", + "tools_upgrade_special_packages_completed": "Aggiornamento pacchetti YunoHost completato.\nPremi [Invio] per tornare al terminale", + "tools_upgrade_special_packages_explanation": "L'aggiornamento speciale continuerà in background. Per favore non iniziare nessun'altra azione sul tuo server per i prossimi ~10 minuti (dipende dalla velocità hardware). Dopo questo, dovrai ri-loggarti nel webadmin. Il registro di aggiornamento sarà disponibile in Strumenti → Log/Registri (nel webadmin) o dalla linea di comando eseguendo 'yunohost log list'.", + "tools_upgrade_special_packages": "Adesso aggiorno i pacchetti 'speciali' (correlati a yunohost)…", + "tools_upgrade_regular_packages_failed": "Impossibile aggiornare i pacchetti: {packages_list}", + "tools_upgrade_regular_packages": "Adesso aggiorno i pacchetti 'normali' (non correlati a yunohost)…", + "tools_upgrade_cant_unhold_critical_packages": "Impossibile annullare il blocco dei pacchetti critici/importanti…", + "tools_upgrade_cant_hold_critical_packages": "Impossibile bloccare i pacchetti critici/importanti…", + "tools_upgrade_cant_both": "Impossibile aggiornare sia il sistema e le app nello stesso momento", + "tools_upgrade_at_least_one": "Specifica '--apps', o '--system'", + "show_tile_cant_be_enabled_for_regex": "Non puoi abilitare 'show_tile' in questo momento, perché l'URL del permesso '{permission}' è una regex", + "show_tile_cant_be_enabled_for_url_not_defined": "Non puoi abilitare 'show_tile' in questo momento, devi prima definire un URL per il permesso '{permission}'", + "service_reloaded_or_restarted": "Il servizio '{service:s}' è stato ricaricato o riavviato", + "service_reload_or_restart_failed": "Impossibile ricaricare o riavviare il servizio '{service:s}'\n\nUltimi registri del servizio: {logs:s}", + "service_restarted": "Servizio '{service:s}' riavviato", + "service_restart_failed": "Impossibile riavviare il servizio '{service:s}'\n\nUltimi registri del servizio: {logs:s}", + "service_reloaded": "Servizio '{service:s}' ricaricato", + "service_reload_failed": "Impossibile ricaricare il servizio '{service:s}'\n\nUltimi registri del servizio: {logs:s}", + "service_regen_conf_is_deprecated": "'yunohost service regen-conf' è obsoleto! Per favore usa 'yunohost tools regen-conf' al suo posto.", + "service_description_yunohost-firewall": "Gestisce l'apertura e la chiusura delle porte ai servizi", + "service_description_yunohost-api": "Gestisce l'interazione tra l'interfaccia web YunoHost ed il sistema", + "service_description_ssh": "Ti consente di accedere da remoto al tuo server attraverso il terminale (protocollo SSH)", + "service_description_slapd": "Memorizza utenti, domini e info correlate", + "service_description_rspamd": "Filtra SPAM, e altre funzionalità legate alle mail", + "service_description_redis-server": "Un database specializzato usato per un veloce accesso ai dati, task queue, e comunicazioni tra programmi", + "service_description_postfix": "Usato per inviare e ricevere email", + "service_description_php7.3-fpm": "Esegue app scritte in PHP con NGINX", + "service_description_nginx": "Serve o permette l'accesso a tutti i siti pubblicati sul tuo server", + "service_description_mysql": "Memorizza i dati delle app (database SQL)", + "service_description_metronome": "Gestisce gli account di messaggistica instantanea XMPP", + "service_description_fail2ban": "Ti protegge dal brute-force e altri tipi di attacchi da Internet", + "service_description_dovecot": "Consente ai client mail di accedere/recuperare le email (via IMAP e POP3)", + "service_description_dnsmasq": "Gestisce la risoluzione dei domini (DNS)", + "service_description_avahi-daemon": "Consente di raggiungere il tuo server eseguendo 'yunohost.local' sulla tua LAN", + "server_reboot_confirm": "Il server si riavvierà immediatamente, sei sicuro? [{answers:s}]", + "server_reboot": "Il server si riavvierà", + "server_shutdown_confirm": "Il server si spegnerà immediatamente, sei sicuro? [{answers:s}]", + "server_shutdown": "Il server si spegnerà", + "root_password_replaced_by_admin_password": "La tua password di root è stata sostituita dalla tua password d'amministratore.", + "root_password_desynchronized": "La password d'amministratore è stata cambiata, ma YunoHost non ha potuto propagarla alla password di root!", + "restore_system_part_failed": "Impossibile ripristinare la sezione di sistema '{part:s}'", + "restore_removing_tmp_dir_failed": "Impossibile rimuovere una vecchia directory temporanea", + "restore_not_enough_disk_space": "Spazio libero insufficiente (spazio: {free_space:d}B, necessario: {needed_space:d}B, margine di sicurezza: {margin:d}B)", + "restore_may_be_not_enough_disk_space": "Il tuo sistema non sembra avere abbastanza spazio (libero: {free_space:d}B, necessario: {needed_space:d}B, margine di sicurezza: {margin:d}B)", + "restore_extracting": "Sto estraendo i file necessari dall'archivio…", + "restore_already_installed_apps": "Le seguenti app non possono essere ripristinate perché sono già installate: {apps}", + "regex_with_only_domain": "Non puoi usare una regex per il dominio, solo per i percorsi", + "regex_incompatible_with_tile": "/!\\ Packagers! Il permesso '{permission}' ha show_tile impostato su 'true' e perciò non è possibile definire un URL regex per l'URL principale", + "regenconf_need_to_explicitly_specify_ssh": "La configurazione ssh è stata modificata manualmente, ma devi specificare la categoria 'ssh' con --force per applicare le modifiche.", + "regenconf_pending_applying": "Applico le configurazioni in attesa per la categoria '{category}'...", + "regenconf_failed": "Impossibile rigenerare la configurazione per le categorie: {categories}", + "regenconf_dry_pending_applying": "Controllo configurazioni in attesa che potrebbero essere applicate alla categoria '{category}'…", + "regenconf_would_be_updated": "La configurazione sarebbe stata aggiornata per la categoria '{category}'", + "regenconf_updated": "Configurazione aggiornata per '{category}'", + "regenconf_up_to_date": "Il file di configurazione è già aggiornato per la categoria '{category}'", + "regenconf_now_managed_by_yunohost": "Il file di configurazione '{conf}' da adesso è gestito da YunoHost (categoria {category}).", + "regenconf_file_updated": "File di configurazione '{conf}' aggiornato", + "regenconf_file_removed": "File di configurazione '{conf}' rimosso", + "regenconf_file_remove_failed": "Impossibile rimuovere il file di configurazione '{conf}'", + "regenconf_file_manually_removed": "Il file di configurazione '{conf}' è stato rimosso manualmente, e non sarà generato", + "regenconf_file_manually_modified": "Il file di configurazione '{conf}' è stato modificato manualmente e non sarà aggiornato", + "regenconf_file_kept_back": "Il file di configurazione '{conf}' dovrebbe esser stato cancellato da regen-conf (categoria {category}), ma non è così.", + "regenconf_file_copy_failed": "Impossibile copiare il nuovo file di configurazione da '{new}' a '{conf}'", + "regenconf_file_backed_up": "File di configurazione '{conf}' salvato in '{backup}'", + "permission_require_account": "Il permesso {permission} ha senso solo per gli utenti con un account, quindi non può essere attivato per i visitatori.", + "permission_protected": "Il permesso {permission} è protetto. Non puoi aggiungere o rimuovere il gruppo visitatori dal permesso.", + "permission_updated": "Permesso '{permission:s}' aggiornato", + "permission_update_failed": "Impossibile aggiornare il permesso '{permission}': {error}", + "permission_not_found": "Permesso '{permission:s}' non trovato", + "permission_deletion_failed": "Impossibile cancellare il permesso '{permission}': {error}", + "permission_deleted": "Permesso '{permission:s}' cancellato", + "permission_currently_allowed_for_all_users": "Il permesso è attualmente garantito a tutti gli utenti oltre gli altri gruppi. Probabilmente vuoi o rimuovere il permesso 'all_user' o rimuovere gli altri gruppi per cui è garantito attualmente.", + "permission_creation_failed": "Impossibile creare i permesso '{permission}': {error}", + "permission_created": "Permesso '{permission:s}' creato", + "permission_cannot_remove_main": "Non è possibile rimuovere un permesso principale", + "permission_already_up_to_date": "Il permesso non è stato aggiornato perché la richiesta di aggiunta/rimozione è già coerente con lo stato attuale.", + "permission_already_exist": "Permesso '{permission}' esiste già", + "permission_already_disallowed": "Il gruppo '{group}' ha già il permesso '{permission}' disabilitato", + "permission_already_allowed": "Il gruppo '{group}' ha già il permesso '{permission}' abilitato", + "pattern_password_app": "Mi spiace, le password non possono contenere i seguenti caratteri: {forbidden_chars}", + "pattern_email_forward": "Dev'essere un indirizzo mail valido, simbolo '+' accettato (es: tizio+tag@example.com)", + "operation_interrupted": "L'operazione è stata interrotta manualmente?", + "invalid_number": "Dev'essere un numero", + "migrations_to_be_ran_manually": "Migrazione {id} dev'essere eseguita manualmente. Vai in Strumenti → Migrazioni nella pagina webadmin, o esegui `yunohost tools migrations migrate`.", + "migrations_success_forward": "Migrazione {id} completata", + "migrations_skip_migration": "Salto migrazione {id}...", + "migrations_running_forward": "Eseguo migrazione {id}...", + "migrations_pending_cant_rerun": "Queste migrazioni sono ancora in attesa, quindi non possono essere eseguite nuovamente: {ids}", + "migrations_not_pending_cant_skip": "Queste migrazioni non sono in attesa, quindi non possono essere saltate: {ids}", + "migrations_no_such_migration": "Non esiste una migrazione chiamata '{id}'", + "migrations_no_migrations_to_run": "Nessuna migrazione da eseguire", + "migrations_need_to_accept_disclaimer": "Per eseguire la migrazione {id}, devi accettare il disclaimer seguente:\n---\n{disclaimer}\n---\nSe accetti di eseguire la migrazione, per favore reinserisci il comando con l'opzione '--accept-disclaimer'.", + "migrations_must_provide_explicit_targets": "Devi specificare i target quando utilizzi '--skip' o '--force-rerun'", + "migrations_migration_has_failed": "Migrazione {id} non completata, annullamento. Errore: {exception}", + "migrations_loading_migration": "Caricamento migrazione {id}...", + "migrations_list_conflict_pending_done": "Non puoi usare sia '--previous' e '--done' allo stesso tempo.", + "migrations_exclusive_options": "'--auto', '--skip', e '--force-rerun' sono opzioni che si escludono a vicenda.", + "migrations_failed_to_load_migration": "Impossibile caricare la migrazione {id}: {error}", + "migrations_dependencies_not_satisfied": "Esegui queste migrazioni: '{dependencies_id}', prima di {id}.", + "migrations_cant_reach_migration_file": "Impossibile accedere ai file di migrazione nel path '%s'", + "migrations_already_ran": "Migrazioni già effettuate: {ids}", + "migration_0019_slapd_config_will_be_overwritten": "Sembra che tu abbia modificato manualmente la configurazione slapd. Per questa importante migrazione, YunoHost deve forzare l'aggiornamento della configurazione slapd. I file originali verranno back-uppati in {conf_backup_folder}.", + "migration_0019_rollback_success": "Sistema ripristinato.", + "migration_0019_migration_failed_trying_to_rollback": "Impossibile migrare... sto cercando di ripristinare il sistema.", + "migration_0019_can_not_backup_before_migration": "Il backup del sistema non è stato completato prima della migrazione. Errore: {error:s}", + "migration_0019_backup_before_migration": "Creando un backup del database LDAP e delle impostazioni delle app prima dell'effettiva migrazione.", + "migration_0019_add_new_attributes_in_ldap": "Aggiungi nuovi attributi ai permessi nel database LDAP", + "migration_0018_failed_to_reset_legacy_rules": "Impossibile resettare le regole iptables legacy: {error}", + "migration_0018_failed_to_migrate_iptables_rules": "Migrazione fallita delle iptables legacy a nftables: {error}", + "migration_0017_not_enough_space": "Libera abbastanza spazio in {path} per eseguire la migrazione.", + "migration_0017_postgresql_11_not_installed": "PostgreSQL 9.6 è installato, ma non PostgreSQL 11 ?! Qualcosa di strano potrebbe esser successo al tuo sistema :'( ...", + "migration_0017_postgresql_96_not_installed": "PostgreSQL non è stato installato sul tuo sistema. Nulla da fare.", + "migration_0015_weak_certs": "I seguenti certificati utilizzano ancora un algoritmo di firma debole e dovrebbero essere aggiornati per essere compatibili con la prossima versione di nginx: {certs}", + "migration_0015_cleaning_up": "Sto pulendo la cache e i pacchetti non più utili...", + "migration_0015_specific_upgrade": "Inizio l'aggiornamento dei pacchetti di sistema che necessitano di essere aggiornati da soli...", + "migration_0015_modified_files": "Attenzioni, i seguenti file sembrano esser stati modificati manualmente, e potrebbero essere sovrascritti dopo l'aggiornamento: {manually_modified_files}", + "migration_0015_problematic_apps_warning": "Alcune applicazioni potenzialmente problematiche sono state rilevate nel sistema. Sembra che non siano state installate attraverso il catalogo app YunoHost, o non erano flaggate come 'working'/'funzionanti'. Di conseguenza, non è possibile garantire che funzioneranno ancora dopo l'aggiornamento: {problematic_apps}", + "migration_0015_general_warning": "Attenzione, sappi che questa migrazione è un'operazione delicata. Il team YunoHost ha fatto del suo meglio nel controllarla e testarla, ma le probabilità che il sistema e/o qualche app si danneggi non sono nulle.\n\nPerciò, ti raccomandiamo di:\n\t- Effettuare un backup di tutti i dati e app importanti. Maggiori informazioni su https://yunohost.org/backup;\n\t- Sii paziente dopo aver lanciato l'operazione: in base alla tua connessione internet e al tuo hardware, potrebbero volerci alcune ore per aggiornare tutto.", + "migration_0015_system_not_fully_up_to_date": "Il tuo sistema non è completamente aggiornato. Esegui un aggiornamento classico prima di lanciare la migrazione a Buster.", + "migration_0015_not_enough_free_space": "Poco spazio libero disponibile in /var/! Dovresti avere almeno 1GB libero per effettuare questa migrazione.", + "migration_0015_not_stretch": "La distribuzione Debian corrente non è Stretch!", + "migration_0015_yunohost_upgrade": "Inizio l'aggiornamento del core di YunoHost...", + "migration_0015_still_on_stretch_after_main_upgrade": "Qualcosa è andato storto durante l'aggiornamento principale, il sistema sembra essere ancora su Debian Stretch", + "migration_0015_main_upgrade": "Inizio l'aggiornamento principale...", + "migration_0015_patching_sources_list": "Applico le patch a sources.lists...", + "migration_0015_start": "Inizio migrazione a Buster", + "migration_0011_failed_to_remove_stale_object": "Impossibile rimuovere l'oggetto {dn}: {error}", + "migration_0011_update_LDAP_schema": "Aggiornado lo schema LDAP...", + "migration_0011_update_LDAP_database": "Aggiornando il database LDAP...", + "migration_0011_migrate_permission": "Migrando permessi dalle impostazioni delle app a LDAP...", + "migration_0011_LDAP_update_failed": "Impossibile aggiornare LDAP. Errore: {error:s}", + "migration_0011_create_group": "Sto creando un gruppo per ogni utente...", + "migration_description_0019_extend_permissions_features": "Estendi il sistema di gestione dei permessi app", + "migration_description_0018_xtable_to_nftable": "Migra le vecchie regole di traffico network sul nuovo sistema nftable", + "migration_description_0017_postgresql_9p6_to_11": "Migra i database da PostgreSQL 9.6 a 11", + "migration_description_0016_php70_to_php73_pools": "MIgra i file di configurazione 'pool' di php7.0-fpm su php7.3", + "migration_description_0015_migrate_to_buster": "Aggiorna il sistema a Debian Buster e YunoHost 4.X", + "migrating_legacy_permission_settings": "Impostando le impostazioni legacy dei permessi..", + "mailbox_disabled": "E-mail disabilitate per l'utente {user:s}", + "log_user_permission_reset": "Resetta il permesso '{}'", + "log_user_permission_update": "Aggiorna gli accessi del permesso '{}'", + "log_user_group_update": "Aggiorna il gruppo '{}'", + "log_user_group_delete": "Cancella il gruppo '{}'", + "log_user_group_create": "Crea il gruppo '[}'", + "log_permission_url": "Aggiorna l'URL collegato al permesso '{}'", + "log_permission_delete": "Cancella permesso '{}'", + "log_permission_create": "Crea permesso '{}'", + "log_app_config_apply": "Applica la configurazione all'app '{}'", + "log_app_config_show_panel": "Mostra il pannello di configurazione dell'app '{}'", + "log_app_action_run": "Esegui l'azione dell'app '{}'", + "log_operation_unit_unclosed_properly": "Operazion unit non è stata chiusa correttamente", + "invalid_regex": "Regex invalida:'{regex:s}'", + "hook_list_by_invalid": "Questa proprietà non può essere usata per listare gli hooks", + "hook_json_return_error": "Impossibile leggere la risposta del hook {path:s}. Errore: {msg:s}. Contenuto raw: {raw_content}", + "group_user_not_in_group": "L'utente {user} non è nel gruppo {group}", + "group_user_already_in_group": "L'utente {user} è già nel gruppo {group}", + "group_update_failed": "Impossibile aggiornare il gruppo '{group}': {error}", + "group_updated": "Gruppo '{group}' aggiornato", + "group_unknown": "Gruppo '{group:s}' sconosciuto", + "group_deletion_failed": "Impossibile cancellare il gruppo '{group}': {error}", + "group_deleted": "Gruppo '{group}' cancellato", + "group_cannot_be_deleted": "Il gruppo {group} non può essere eliminato manualmente.", + "group_cannot_edit_primary_group": "Il gruppo '{group}' non può essere modificato manualmente. È il gruppo principale con lo scopo di contenere solamente uno specifico utente.", + "group_cannot_edit_visitors": "Il gruppo 'visitatori' non può essere modificato manualmente. È un gruppo speciale che rappresenta i visitatori anonimi", + "group_cannot_edit_all_users": "Il gruppo 'all_users' non può essere modificato manualmente. È un gruppo speciale che contiene tutti gli utenti registrati in YunoHost", + "group_creation_failed": "Impossibile creare il gruppo '{group}': {error}", + "group_created": "Gruppo '{group}' creato", + "group_already_exist_on_system_but_removing_it": "Il gruppo {group} esiste già tra i gruppi di sistema, ma YunoHost lo cancellerà...", + "group_already_exist_on_system": "Il gruppo {group} esiste già tra i gruppi di sistema", + "group_already_exist": "Il gruppo {group} esiste già", + "global_settings_setting_backup_compress_tar_archives": "Quando creo nuovi backup, usa un archivio (.tar.gz) al posto di un archivio non compresso (.tar). NB: abilitare quest'opzione significa create backup più leggeri, ma la procedura durerà di più e il carico CPU sarà maggiore.", + "global_settings_setting_smtp_relay_password": "Password del relay SMTP", + "global_settings_setting_smtp_relay_user": "User account del relay SMTP", + "global_settings_setting_smtp_relay_port": "Porta del relay SMTP", + "global_settings_setting_smtp_relay_host": "Utilizza SMTP relay per inviare mail al posto di questa instanza yunohost. Utile se sei in una di queste situazioni: la tua porta 25 è bloccata dal tuo provider ISP o VPS; hai un IP residenziale listato su DUHL; non sei puoi configurare il DNS inverso; oppure questo server non è direttamente esposto a Internet e vuoi usarne un'altro per spedire email.", + "global_settings_setting_smtp_allow_ipv6": "Permetti l'utilizzo di IPv6 per ricevere e inviare mail", + "global_settings_setting_pop3_enabled": "Abilita il protocollo POP3 per il server mail", + "dyndns_provider_unreachable": "Incapace di raggiungere il provider DynDNS {provider}: o il tuo YunoHost non è connesso ad internet o il server dynette è down.", + "dpkg_lock_not_available": "Impossibile eseguire il comando in questo momento perché un altro programma sta bloccando dpkg (il package manager di sistema)", + "domain_name_unknown": "Dominio '{domain}' sconosciuto", + "domain_cannot_remove_main_add_new_one": "Non puoi rimuovere '{domain:s}' visto che è il dominio principale nonché il tuo unico dominio, devi prima aggiungere un altro dominio eseguendo 'yunohost domain add ', impostarlo come dominio principale con 'yunohost domain main-domain n ', e solo allora potrai rimuovere il dominio '{domain:s}' eseguendo 'yunohost domain remove {domain:s}'.'", + "domain_cannot_add_xmpp_upload": "Non puoi aggiungere domini che iniziano per 'xmpp-upload.'. Questo tipo di nome è riservato per la funzionalità di upload XMPP integrata in YunoHost.", + "diagnosis_processes_killed_by_oom_reaper": "Alcuni processi sono stati terminati dal sistema che era a corto di memoria. Questo è un sintomo di insufficienza di memoria nel sistema o di un processo che richiede troppa memoria. Lista dei processi terminati:\n{kills_summary}", + "diagnosis_never_ran_yet": "Sembra che questo server sia stato impostato recentemente e non è presente nessun report di diagnostica. Dovresti partire eseguendo una diagnostica completa, da webadmin o da terminale con il comando 'yunohost diagnosis run'.", + "diagnosis_unknown_categories": "Le seguenti categorie sono sconosciute: {categories}", + "diagnosis_http_nginx_conf_not_up_to_date_details": "Per sistemare, ispeziona le differenze nel terminale eseguendo yunohost tools regen-conf nginx --dry-run --with-diff e se ti va bene, applica le modifiche con yunohost tools regen-conf ngix --force.", + "diagnosis_http_nginx_conf_not_up_to_date": "La configurazione nginx di questo dominio sembra esser stato modificato manualmente, e impedisce a YunoHost di controlalre se è raggiungibile su HTTP.", + "diagnosis_http_partially_unreachable": "Il dominio {domain} sembra irraggiungibile attraverso HTTP dall'esterno della tua LAN su IPv{failed}, anche se funziona su IPv{passed}.", + "diagnosis_http_unreachable": "Il dominio {domain} sembra irraggiungibile attraverso HTTP dall'esterno della tua LAN.", + "diagnosis_http_bad_status_code": "Sembra che un altro dispositivo (forse il tuo router internet) abbia risposto al posto del tuo server
1. La causa più comune è la porta 80 (e 443) non correttamente inoltrata al tuo server.
2. Su setup più complessi: assicurati che nessun firewall o reverse-proxy stia interferendo.", + "diagnosis_http_connection_error": "Errore connessione: impossibile connettersi al dominio richiesto, probabilmente è irraggiungibile.", + "diagnosis_http_timeout": "Andato in time-out cercando di contattare il server dall'esterno. Sembra essere irraggiungibile.
1. La causa più comune è la porta 80 (e 443) non correttamente inoltrata al tuo server.
2. Dovresti accertarti che il servizio nginx sia attivo.
3. Su setup più complessi: assicurati che nessun firewall o reverse-proxy stia interferendo.", + "diagnosis_http_ok": "Il dominio {domain} è raggiungibile attraverso HTTP al di fuori della tua LAN.", + "diagnosis_http_could_not_diagnose_details": "Errore: {error}", + "diagnosis_http_could_not_diagnose": "Non posso controllare se i domini sono raggiungibili dall'esterno su IPv{ipversion}.", + "diagnosis_http_hairpinning_issue_details": "Questo probabilmente è causato dal tuo ISP router. Come conseguenza, persone al di fuori della tua LAN saranno in grado di accedere al tuo server come atteso, ma non le persone all'interno della LAN (tipo te, immagino) utilizzando il dominio internet o l'IP globale. Dovresti essere in grado di migliorare la situazione visitando https://yunohost.org/dns_local_network", + "diagnosis_http_hairpinning_issue": "La tua rete locale sembra non avere \"hairpinning\" abilitato.", + "diagnosis_ports_forwarding_tip": "Per sistemare questo problema, probabilmente dovresti configurare l'inoltro della porta sul tuo router internet come descritto qui https://yunohost.org/isp_box_config", + "diagnosis_ports_needed_by": "Esporre questa porta è necessario per le feature di {category} (servizio {service})", + "diagnosis_ports_ok": "La porta {port} è raggiungibile dall'esterno.", + "diagnosis_ports_partially_unreachable": "La porta {port} non è raggiungibile dall'esterno su IPv{failed}.", + "diagnosis_ports_unreachable": "La porta {port} non è raggiungibile dall'esterno.", + "diagnosis_ports_could_not_diagnose_details": "Errore: {error}", + "diagnosis_ports_could_not_diagnose": "Impossibile diagnosticare se le porte sono raggiungibili dall'esterno su IPv{ipversion}.", + "diagnosis_description_regenconf": "Configurazioni sistema", + "diagnosis_description_mail": "Email", + "diagnosis_description_web": "Web", + "diagnosis_description_ports": "Esposizione porte", + "diagnosis_description_systemresources": "Risorse di sistema", + "diagnosis_description_services": "Check stato servizi", + "diagnosis_description_dnsrecords": "Record DNS", + "diagnosis_description_ip": "Connettività internet", + "diagnosis_description_basesystem": "Sistema base", + "diagnosis_security_vulnerable_to_meltdown_details": "Per sistemare, dovresti aggiornare il tuo sistema e fare il reboot per caricare il nuovo kernel linux (o contatta il tuo server provider se non funziona). Visita https://meltdownattack.com/ per maggiori info.", + "diagnosis_security_vulnerable_to_meltdown": "Sembra che tu sia vulnerabile alla vulnerabilità di sicurezza critica \"Meltdown\"", + "diagnosis_regenconf_manually_modified_details": "Questo è probabilmente OK se sai cosa stai facendo! YunoHost smetterà di aggiornare automaticamente questo file... Ma sappi che gli aggiornamenti di YunoHost potrebbero contenere importanti cambiamenti. Se vuoi, puoi controllare le differente con yunohost tools regen-conf {category} --dry-run --with-diff e forzare il reset della configurazione raccomandata con yunohost tools regen-conf {category} --force", + "diagnosis_regenconf_manually_modified": "Il file di configurazione {file} sembra esser stato modificato manualmente.", + "diagnosis_regenconf_allgood": "Tutti i file di configurazione sono allineati con le configurazioni raccomandate!", + "diagnosis_mail_queue_too_big": "Troppe email in attesa nella coda ({nb_pending} emails)", + "diagnosis_mail_queue_unavailable_details": "Errore: {error}", + "diagnosis_mail_queue_unavailable": "Impossibile consultare il numero di email in attesa", + "diagnosis_mail_queue_ok": "{nb_pending} emails in attesa nelle code", + "diagnosis_mail_blacklist_website": "Dopo aver identificato il motivo e averlo risolto, sentiti libero di chiedere di rimuovere il tuo IP o dominio da {blacklist_website}", + "diagnosis_mail_blacklist_reason": "Il motivo della blacklist è: {reason}", + "diagnosis_mail_blacklist_listed_by": "Il tuo IP o dominio {item} è nella blacklist {blacklist_name}" } From 94c1fc8d417d11fc0e7ca872e7843a257cefd6ff Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 19 Dec 2020 01:31:31 +0100 Subject: [PATCH 108/128] Fix duplicated stuff in fr string --- locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index ea7228e41..90190c223 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -404,7 +404,7 @@ "dpkg_lock_not_available": "Cette commande ne peut pas être exécutée pour le moment car un autre programme semble utiliser le verrou de dpkg (le gestionnaire de package système)", "tools_upgrade_cant_unhold_critical_packages": "Impossible d'enlever le drapeau 'hold' pour les paquets critiques…", "tools_upgrade_special_packages_explanation": "La mise à niveau spécifique à YunoHost se poursuivra en arrière-plan. Veuillez ne pas lancer d'autres actions sur votre serveur pendant les 10 prochaines minutes (selon la vitesse du matériel). Après cela, vous devrez peut-être vous reconnecter à l'administrateur Web. Le journal de mise à niveau sera disponible dans Outils → Journal (dans le webadmin) ou en utilisant la « liste des journaux yunohost » (à partir de la ligne de commande).", - "update_apt_cache_failed": "Impossible de mettre à jour le cache APT (gestionnaire de paquets Debian). Voici un extrait du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}\n{sourceslist}", + "update_apt_cache_failed": "Impossible de mettre à jour le cache APT (gestionnaire de paquets Debian). Voici un extrait du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}", "update_apt_cache_warning": "Des erreurs se sont produites lors de la mise à jour du cache APT (gestionnaire de paquets Debian). Voici un extrait des lignes du fichier sources.list qui pourrait vous aider à identifier les lignes problématiques :\n{sourceslist}", "backup_permission": "Permission de sauvegarde pour {app:s}", "group_created": "Le groupe '{group}' a été créé", From 6c75aa00742bd459870f5e5dacf5f9046afbd2fe Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 19 Dec 2020 01:47:52 +0100 Subject: [PATCH 109/128] Update changelog for 4.1.1 --- debian/changelog | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/debian/changelog b/debian/changelog index 1fa414d9e..0996629f9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,29 @@ +yunohost (4.1.1) testing; urgency=low + + - [fix] Backup/restore DKIM keys ([#1098](https://github.com/yunohost/yunohost/pull/1098), [#1100](https://github.com/yunohost/yunohost/pull/1100)) + - [fix] Backup/restore Dyndns keys ([#1101](https://github.com/yunohost/yunohost/pull/1101)) + - [fix] mail: Add a max limit to number of recipients ([#1094](https://github.com/yunohost/yunohost/pull/1094)) + - [fix] mail: Do not enforce encryption for relays .. some don't support it ... (11fe9d7e) + - [i18n] Translations updated for French, German, Italian, Occitan + + Misc small fixes: + + - [fix] misc: Prevent running `yunohost domain dns-conf` on arbirary domains ([#1099](https://github.com/yunohost/yunohost/pull/1099)) + - [enh] misc: We don't care that 'apt-key output should not be parsed' (5422a49d) + - [fix] dnsmasq: Avoid to define wildcard records locally ([#1102](https://github.com/yunohost/yunohost/pull/1102)) + - [fix] ssowat: Fix indent ([#1103](https://github.com/yunohost/yunohost/pull/1103)) + - [fix] nginx: Force-disable gzip for acme-challenge (c5d06af2) + - [enh] app helpers: Handle change php version ([#1107](https://github.com/yunohost/yunohost/pull/1107)) + - [fix] permissions: Misc fixes ([#1104](https://github.com/yunohost/yunohost/pull/1104), [#1105](https://github.com/yunohost/yunohost/pull/1105)) + - [fix] certificates: Use organization name to check if from Lets Encrypt ([#1093](https://github.com/yunohost/yunohost/pull/1093)) + - [enh] ldap: Increase ldap search size limit? ([#1074](https://github.com/yunohost/yunohost/pull/1074)) + - [fix] app helpers: Avoid unecessarily reloading php7.3 too fast ([#1108](https://github.com/yunohost/yunohost/pull/1108)) + - [fix] log: Fix a small issue where metadata could be None (because of empty yaml maybe?) (f9143d53) + + Thanks to all contributors <3 ! (Christian Wehrli, Eric COURTEAU, Flavio Cristoforetti, Kay0u, Kayou, ljf, ljf (zamentur), Quentí) + + -- Alexandre Aubin Sat, 19 Dec 2020 01:33:36 +0100 + yunohost (4.1.0) testing; urgency=low - [enh] Extends permissions features, improve legacy settings handling (YunoHost#861) From 6419c2ac64ee1c2854001d3c9f1309a6552e9435 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 24 Dec 2020 15:38:39 +0100 Subject: [PATCH 110/128] Don't mess with Sury's pinning --- data/helpers.d/apt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/data/helpers.d/apt b/data/helpers.d/apt index 59f233c60..7c6de912d 100644 --- a/data/helpers.d/apt +++ b/data/helpers.d/apt @@ -460,7 +460,8 @@ ynh_remove_extra_repo () { name="${name:-$app}" ynh_secure_remove "/etc/apt/sources.list.d/$name.list" - ynh_secure_remove "/etc/apt/preferences.d/$name" + # Sury pinning is managed by the regenconf in the core... + [[ "$name" == "extra_php_version" ]] || ynh_secure_remove "/etc/apt/preferences.d/$name" ynh_secure_remove "/etc/apt/trusted.gpg.d/$name.gpg" > /dev/null ynh_secure_remove "/etc/apt/trusted.gpg.d/$name.asc" > /dev/null @@ -548,6 +549,9 @@ ynh_pin_repo () { append="tee" fi + # Sury pinning is managed by the regenconf in the core... + [[ "$name" != "extra_php_version" ]] || return + mkdir --parents "/etc/apt/preferences.d" echo "Package: $package Pin: $pin From 0c977d8c70c454d196cb44576b62df2d57d1f3a0 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Mon, 28 Dec 2020 01:45:00 +0100 Subject: [PATCH 111/128] [fix] double return prevent new code from working --- src/yunohost/domain.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index b771d60ab..5d47aefe0 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -75,8 +75,6 @@ def domain_list(exclude_subdomains=False): result_list = sorted(result_list, cmp_domain) - return {'domains': result_list} - return { 'domains': result_list, 'main': _get_maindomain() From bdff5937f09a8bdee95bcd45cc2762c7ac35ecdf Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 28 Dec 2020 16:58:50 +0100 Subject: [PATCH 112/128] Handle permission regexes that may start with ^ or \ --- src/yunohost/permission.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/yunohost/permission.py b/src/yunohost/permission.py index 8a5ef7260..547510323 100644 --- a/src/yunohost/permission.py +++ b/src/yunohost/permission.py @@ -668,6 +668,9 @@ def _validate_and_sanitize_permission_url(url, app_base_path, app): For example: re:/api/[A-Z]*$ -> domain.tld/app/api/[A-Z]*$ re:domain.tld/app/api/[A-Z]*$ -> domain.tld/app/api/[A-Z]*$ + + We can also have less-trivial regexes like: + re:^\/api\/.*|\/scripts\/api.js$ """ from yunohost.domain import domain_list @@ -692,9 +695,9 @@ def _validate_and_sanitize_permission_url(url, app_base_path, app): if url.startswith('re:'): # regex without domain - - if url.startswith('re:/'): - validate_regex(url[4:]) + # we check for the first char after 're:' + if url[3] in ['/', '^', '\\']: + validate_regex(url[3:]) return url # regex with domain From d77d5afb2cb6bb8f70a09845e1930177a340cf99 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 28 Dec 2020 20:05:51 +0100 Subject: [PATCH 113/128] When encountering unknown setting, also save the regular setting so we don't re-encounter the unknown settings everytime --- src/yunohost/settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/yunohost/settings.py b/src/yunohost/settings.py index db5f56b45..3c79d7945 100644 --- a/src/yunohost/settings.py +++ b/src/yunohost/settings.py @@ -263,6 +263,7 @@ def _get_settings(): if unknown_settings: try: _save_settings(unknown_settings, location=unknown_settings_path) + _save_settings(settings) except Exception as e: logger.warning("Failed to save unknown settings (because %s), aborting." % e) From b685a274812099523df4f78515cd5a62924e16bf Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 28 Dec 2020 22:57:52 +0100 Subject: [PATCH 114/128] [yolo] Detect moar hardware name --- data/hooks/diagnosis/00-basesystem.py | 10 ++++++++-- locales/en.json | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/data/hooks/diagnosis/00-basesystem.py b/data/hooks/diagnosis/00-basesystem.py index d56faec98..edfb68beb 100644 --- a/data/hooks/diagnosis/00-basesystem.py +++ b/data/hooks/diagnosis/00-basesystem.py @@ -32,11 +32,17 @@ class BaseSystemDiagnoser(Diagnoser): data={"virt": virt, "arch": arch}, summary="diagnosis_basesystem_hardware") - # Also possibly the board name + # Also possibly the board / hardware name if os.path.exists("/proc/device-tree/model"): model = read_file('/proc/device-tree/model').strip().replace('\x00', '') hardware["data"]["model"] = model - hardware["details"] = ["diagnosis_basesystem_hardware_board"] + hardware["details"] = ["diagnosis_basesystem_hardware_model"] + elif os.path.exists("/sys/devices/virtual/dmi/id/sys_vendor"): + model = read_file("/sys/devices/virtual/dmi/id/sys_vendor").strip() + if os.path.exists("/sys/devices/virtual/dmi/id/product_name"): + model = "%s %s" % (model, read_file("/sys/devices/virtual/dmi/id/product_name").strip()) + hardware["data"]["model"] = model + hardware["details"] = ["diagnosis_basesystem_hardware_model"] yield hardware diff --git a/locales/en.json b/locales/en.json index 8510cdf58..c24fc831c 100644 --- a/locales/en.json +++ b/locales/en.json @@ -141,7 +141,7 @@ "confirm_app_install_thirdparty": "DANGER! This app is not part of Yunohost's app catalog. Installing third-party apps may compromise the integrity and security of your system. You should probably NOT install it unless you know what you are doing. NO SUPPORT will be provided if this app doesn't work or breaks your system… If you are willing to take that risk anyway, type '{answers:s}'", "custom_app_url_required": "You must provide a URL to upgrade your custom app {app:s}", "diagnosis_basesystem_hardware": "Server hardware architecture is {virt} {arch}", - "diagnosis_basesystem_hardware_board": "Server board model is {model}", + "diagnosis_basesystem_hardware_model": "Server model is {model}", "diagnosis_basesystem_host": "Server is running Debian {debian_version}", "diagnosis_basesystem_kernel": "Server is running Linux kernel {kernel_version}", "diagnosis_basesystem_ynh_single_version": "{package} version: {version} ({repo})", From d6d75c528eaaa85c895fcaf7a3d3d025eaea77ab Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 29 Dec 2020 22:37:59 +0100 Subject: [PATCH 115/128] fix legacy permission migration --- src/yunohost/utils/legacy.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/yunohost/utils/legacy.py b/src/yunohost/utils/legacy.py index 1cc0246f3..4aaf62179 100644 --- a/src/yunohost/utils/legacy.py +++ b/src/yunohost/utils/legacy.py @@ -104,7 +104,7 @@ class SetupGroupPermissions(): allowed = [user for user in permission.split(',') if user in known_users] else: allowed = ["all_users"] - permission_create(app + ".main", url=url, allowed=allowed, protected=False, sync_perm=False) + permission_create(app + ".main", url=url, allowed=allowed, show_tile=True, protected=False, sync_perm=False) app_setting(app, 'allowed_users', delete=True) @@ -185,12 +185,12 @@ def migrate_legacy_permission_settings(app=None): if unprotected_urls != []: permission_create(app + ".legacy_unprotected_uris", additional_urls=unprotected_urls, auth_header=True, label=legacy_permission_label(app, "unprotected"), - show_tile=False, allowed='visitors', protected=True, sync_perm=False) + show_tile=True, allowed='visitors', protected=False, sync_perm=False) if protected_urls != []: permission_create(app + ".legacy_protected_uris", additional_urls=protected_urls, auth_header=True, label=legacy_permission_label(app, "protected"), - show_tile=False, allowed=user_permission_list()['permissions'][app + ".main"]['allowed'], - protected=True, sync_perm=False) + show_tile=True, allowed=user_permission_list()['permissions'][app + ".main"]['allowed'], + protected=False, sync_perm=False) legacy_permission_settings = [ "skipped_uris", From e70f27b7ff2edcd39bdea40a9b620e6978a0b2e7 Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 29 Dec 2020 22:48:10 +0100 Subject: [PATCH 116/128] Update legacy.py --- src/yunohost/utils/legacy.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/yunohost/utils/legacy.py b/src/yunohost/utils/legacy.py index 4aaf62179..434746a28 100644 --- a/src/yunohost/utils/legacy.py +++ b/src/yunohost/utils/legacy.py @@ -185,12 +185,12 @@ def migrate_legacy_permission_settings(app=None): if unprotected_urls != []: permission_create(app + ".legacy_unprotected_uris", additional_urls=unprotected_urls, auth_header=True, label=legacy_permission_label(app, "unprotected"), - show_tile=True, allowed='visitors', protected=False, sync_perm=False) + show_tile=False, allowed='visitors', protected=True, sync_perm=False) if protected_urls != []: permission_create(app + ".legacy_protected_uris", additional_urls=protected_urls, auth_header=True, label=legacy_permission_label(app, "protected"), - show_tile=True, allowed=user_permission_list()['permissions'][app + ".main"]['allowed'], - protected=False, sync_perm=False) + show_tile=False, allowed=user_permission_list()['permissions'][app + ".main"]['allowed'], + protected=True, sync_perm=False) legacy_permission_settings = [ "skipped_uris", From 2b80bac7696eb3909640f12ca4cb03b1215a5d74 Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 29 Dec 2020 23:12:14 +0100 Subject: [PATCH 117/128] Fix restore permission --- src/yunohost/backup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index c0f11eae8..7179430e0 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -1343,7 +1343,7 @@ class RestoreManager(): additional_urls=permission_infos.get("additional_urls"), auth_header=permission_infos.get("auth_header"), label=permission_infos.get('label') if perm_name == "main" else permission_infos.get("sublabel"), - show_tile=permission_infos.get("show_tile", None), + show_tile=permission_infos.get("show_tile", True), protected=permission_infos.get("protected", True), sync_perm=False) From 9e2e5ce55e5a378deddead113a883083632555e6 Mon Sep 17 00:00:00 2001 From: Kayou Date: Tue, 29 Dec 2020 23:59:13 +0100 Subject: [PATCH 118/128] not protected by default --- src/yunohost/backup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index 7179430e0..242cd0bfd 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -1344,7 +1344,7 @@ class RestoreManager(): auth_header=permission_infos.get("auth_header"), label=permission_infos.get('label') if perm_name == "main" else permission_infos.get("sublabel"), show_tile=permission_infos.get("show_tile", True), - protected=permission_infos.get("protected", True), + protected=permission_infos.get("protected", False), sync_perm=False) permission_sync_to_user() From 7e096a8aebe96cafd1753a74946a800a757a2874 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Wed, 30 Dec 2020 11:25:54 +0100 Subject: [PATCH 119/128] [mod](user_create) only ask for one letter for first/last name --- data/actionsmap/yunohost.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/actionsmap/yunohost.yml b/data/actionsmap/yunohost.yml index fb569dcd0..31b86c7ae 100644 --- a/data/actionsmap/yunohost.yml +++ b/data/actionsmap/yunohost.yml @@ -87,7 +87,7 @@ user: ask: ask_firstname required: True pattern: &pattern_firstname - - !!str ^([^\W\d_]{2,30}[ ,.'-]{0,3})+$ + - !!str ^([^\W\d_]{1,30}[ ,.'-]{0,3})+$ - "pattern_firstname" -l: full: --lastname @@ -95,7 +95,7 @@ user: ask: ask_lastname required: True pattern: &pattern_lastname - - !!str ^([^\W\d_]{2,30}[ ,.'-]{0,3})+$ + - !!str ^([^\W\d_]{1,30}[ ,.'-]{0,3})+$ - "pattern_lastname" -m: full: --mail From 2e8aa6442e9cd4236859a2c2ac3278a2cad91e13 Mon Sep 17 00:00:00 2001 From: Christian Wehrli Date: Mon, 21 Dec 2020 15:49:52 +0000 Subject: [PATCH 120/128] Translated using Weblate (German) Currently translated at 57.6% (363 of 630 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/de.json b/locales/de.json index 9c8fa33c8..05b6b2a5e 100644 --- a/locales/de.json +++ b/locales/de.json @@ -464,12 +464,13 @@ "domain_cannot_add_xmpp_upload": "Eine hinzugefügte Domain darf nicht mit 'xmpp-upload.' beginnen. Dieser Name ist für das XMPP-Upload-Feature von YunoHost reserviert.", "group_cannot_be_deleted": "Die Gruppe {group} kann nicht manuell entfernt werden.", "group_cannot_edit_primary_group": "Die Gruppe '{group}' kann nicht manuell bearbeitet werden. Es ist die primäre Gruppe, welche dazu gedacht ist, nur einen spezifischen Benutzer zu enthalten.", - "diagnosis_processes_killed_by_oom_reaper": "Einige Prozesse wurden vom System beendet, weil nicht genügend Arbeitsspeicher vorhanden ist. Das passiert normalerweise, wenn das System nicht genügend Arbeitsspeicher zur Verfügung hat oder wenn ein Prozess zu viel Speicher verbraucht. Zusammenfassung der beendeten Prozesse: {kills_summary}", + "diagnosis_processes_killed_by_oom_reaper": "Das System hat einige Prozesse beendet, weil ihm der Arbeitsspeicher ausgegangen ist. Das passiert normalerweise, wenn das System ingesamt nicht genügend Arbeitsspeicher zur Verfügung hat oder wenn ein einzelner Prozess zu viel Speicher verbraucht. Zusammenfassung der beendeten Prozesse: \n{kills_summary}", "diagnosis_description_ports": "Offene Ports", "additional_urls_already_added": "Zusätzliche URL '{url:s}' bereits hinzugefügt in der zusätzlichen URL für Berechtigung '{permission:s}'", "additional_urls_already_removed": "Zusätzliche URL '{url:s}' bereits entfernt in der zusätzlichen URL für Berechtigung '{permission:s}'", "app_label_deprecated": "Dieser Befehl ist veraltet! Bitte nutzen Sie den neuen Befehl 'yunohost user permission update' um das Applabel zu verwalten.", "diagnosis_http_hairpinning_issue_details": "Das ist wahrscheinlich aufgrund Ihrer ISP Box / Router. Als Konsequenz können Personen von ausserhalb Ihres Netzwerkes aber nicht von innerhalb Ihres lokalen Netzwerkes (wie wahrscheinlich Sie selber?) wie gewohnt auf Ihren Server zugreifen, wenn Sie ihre Domäne oder Ihre öffentliche IP verwenden. Sie können die Situation wahrscheinlich verbessern, indem Sie ein einen Blick in https://yunohost.org/dns_local_network werfen", "diagnosis_http_nginx_conf_not_up_to_date": "Jemand hat anscheinend die Konfiguration von Nginx manuell geändert. Diese Änderung verhindert, dass Yunohost eine Diagnose durchführen kann, wenn er via HTTP erreichbar ist.", - "diagnosis_http_bad_status_code": "Anscheinend beantwortet ein anderes Gerät als Ihr Server die Anfrage (Vielleicht ihr Internetrouter).
1. Die häufigste Ursache ist, dass Port 80 (und 443) nicht richtig auf Ihren Server weitergeleitet wird.
2. Bei komplexeren Setups: Vergewissern Sie sich, dass keine Firewall und keine Reverse-Proxy interferieren." + "diagnosis_http_bad_status_code": "Anscheinend beantwortet ein anderes Gerät als Ihr Server die Anfrage (Vielleicht ihr Internetrouter).
1. Die häufigste Ursache ist, dass Port 80 (und 443) nicht richtig auf Ihren Server weitergeleitet wird.
2. Bei komplexeren Setups: Vergewissern Sie sich, dass keine Firewall und keine Reverse-Proxy interferieren.", + "diagnosis_never_ran_yet": "Sie haben kürzlich einen neuen Yunohost-Server installiert aber es gibt davon noch keinen Diagnosereport. Sie sollten eine Diagnose anstossen. Sie können das entweder vom Webadmin aus oder in der Kommandozeile machen. In der Kommandozeile verwenden Sie dafür den Befehl 'yunohost diagnosis run'." } From 28b9b672b3f0009c31ca09f04f66c181a98b1b20 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 31 Dec 2020 16:32:13 +0100 Subject: [PATCH 121/128] Update changelog for 4.1.2 --- debian/changelog | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/debian/changelog b/debian/changelog index 0996629f9..9b824d9de 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,18 @@ +yunohost (4.1.2) testing; urgency=low + + - [enh] diagnosis: Detect moar hardware name (b685a274) + - [fix] permissions: Handle regexes that may start with ^ or \ (bdff5937) + - [fix] permissions: Tile/protect status for legacy migration ([#1113](https://github.com/yunohost/yunohost/pull/1113)) + - [fix] domain: double return prevent new code from working (0c977d8c) + - [fix] settings: When encountering unknown setting, also save the regular setting so we don't re-encounter the unknown settings everytime (d77d5afb) + - [fix] users: only ask for one letter for first/last name ([#1114](https://github.com/yunohost/yunohost/pull/1114)) + - [fix] apt/sury: Tweak app helpers to not mess with Sury's pinning ([#1110](https://github.com/yunohost/yunohost/pull/1110)) + - [i18n] Translations updated for German + + Thanks to all contributors <3 ! (Bram, C. Wehrli, Kayou) + + -- Alexandre Aubin Thu, 31 Dec 2020 16:26:51 +0100 + yunohost (4.1.1) testing; urgency=low - [fix] Backup/restore DKIM keys ([#1098](https://github.com/yunohost/yunohost/pull/1098), [#1100](https://github.com/yunohost/yunohost/pull/1100)) From 9eb6fa1961c07c319bd6f4ab62f245d0a75f5626 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 1 Jan 2021 15:53:50 +0100 Subject: [PATCH 122/128] [enh] display domain_path of app on app list --- src/yunohost/app.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index d32fb59a2..f5291e2ac 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -163,6 +163,9 @@ def app_info(app, full=False): 'version': local_manifest.get('version', '-'), } + if "domain" in settings and "path" in settings: + ret["domain_path"] = settings["domain"] + settings["path"] + if not full: return ret From 165d2b32259f03f7c9c7916dc64d9efea54e6fb2 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 1 Jan 2021 17:14:53 +0100 Subject: [PATCH 123/128] [mod] no catchall exceptions --- src/yunohost/domain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index 5d47aefe0..7dc4ee74d 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -162,7 +162,7 @@ def domain_add(operation_logger, domain, dyndns=False): # Force domain removal silently try: domain_remove(domain, True) - except: + except Exception: pass raise From f2dc7bacd115bd72a767bab825215f774b3ccb23 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 1 Jan 2021 17:28:08 +0100 Subject: [PATCH 124/128] [doc] tell users how to get all permissions --- data/actionsmap/yunohost.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/actionsmap/yunohost.yml b/data/actionsmap/yunohost.yml index 31b86c7ae..ff56c2ac8 100644 --- a/data/actionsmap/yunohost.yml +++ b/data/actionsmap/yunohost.yml @@ -307,7 +307,7 @@ user: api: GET /users/permissions/ arguments: permission: - help: Name of the permission to fetch info about + help: Name of the permission to fetch info about (use "yunohost user permission list" and "yunohost user permission -f" to see all the current permissions) ### user_permission_update() update: @@ -315,7 +315,7 @@ user: api: PUT /users/permissions/ arguments: permission: - help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) + help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) (use "yunohost user permission list" and "yunohost user permission -f" to see all the current permissions) -a: full: --add help: Group or usernames to grant this permission to @@ -346,7 +346,7 @@ user: api: DELETE /users/permissions/ arguments: permission: - help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) + help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) (use "yunohost user permission list" and "yunohost user permission -f" to see all the current permissions) ssh: subcategory_help: Manage ssh access From 2768def391ab580b011d954c880e7c5557d534bc Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 1 Jan 2021 18:32:41 +0100 Subject: [PATCH 125/128] [mod] avoid calling app_list in user_permission_list --- src/yunohost/permission.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yunohost/permission.py b/src/yunohost/permission.py index 547510323..d213ac61c 100644 --- a/src/yunohost/permission.py +++ b/src/yunohost/permission.py @@ -51,7 +51,7 @@ def user_permission_list(short=False, full=False, ignore_system_perms=False, abs """ # Fetch relevant informations - from yunohost.app import app_setting, app_list + from yunohost.app import app_setting, _installed_apps from yunohost.utils.ldap import _get_ldap_interface, _ldap_path_extract ldap = _get_ldap_interface() permissions_infos = ldap.search('ou=permission,dc=yunohost,dc=org', @@ -60,7 +60,7 @@ def user_permission_list(short=False, full=False, ignore_system_perms=False, abs 'URL', 'additionalUrls', 'authHeader', 'label', 'showTile', 'isProtected']) # Parse / organize information to be outputed - apps = [app["id"] for app in app_list()["apps"]] + apps = sorted(_installed_apps()) apps_base_path = {app: app_setting(app, 'domain') + app_setting(app, 'path') for app in apps if app_setting(app, 'domain') and app_setting(app, 'path')} From effc87da2698eb4aad12485cc076bad1c2be5c14 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 1 Jan 2021 18:19:42 +0100 Subject: [PATCH 126/128] [fix] key name of app label wasn't the real label --- src/yunohost/app.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index f5291e2ac..89480d40d 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -154,12 +154,13 @@ def app_info(app, full=False): raise YunohostError('app_not_installed', app=app, all_apps=_get_all_installed_apps_id()) local_manifest = _get_manifest_of_app(os.path.join(APPS_SETTING_PATH, app)) + permissions = user_permission_list(full=True, absolute_urls=True)["permissions"] settings = _get_app_settings(app) ret = { 'description': _value_for_locale(local_manifest['description']), - 'name': local_manifest['name'], + 'name': permissions.get(app + ".main", {}).get("label", local_manifest['name']), 'version': local_manifest.get('version', '-'), } @@ -180,9 +181,10 @@ def app_info(app, full=False): ret['supports_backup_restore'] = (os.path.exists(os.path.join(APPS_SETTING_PATH, app, "scripts", "backup")) and os.path.exists(os.path.join(APPS_SETTING_PATH, app, "scripts", "restore"))) ret['supports_multi_instance'] = is_true(local_manifest.get("multi_instance", False)) - permissions = user_permission_list(full=True, absolute_urls=True)["permissions"] + ret['permissions'] = {p: i for p, i in permissions.items() if p.startswith(app + ".")} ret['label'] = permissions.get(app + ".main", {}).get("label") + if not ret['label']: logger.warning("Failed to get label for app %s ?" % app) return ret From c7d315c7e0f8d2e441f129f6a0c2529b2c6b1275 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 1 Jan 2021 17:44:07 +0100 Subject: [PATCH 127/128] [mod] also display app label on remove_domain with apps --- src/yunohost/domain.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index 7dc4ee74d..2bd195f53 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -182,7 +182,7 @@ def domain_remove(operation_logger, domain, force=False): """ from yunohost.hook import hook_callback - from yunohost.app import app_ssowatconf + from yunohost.app import app_ssowatconf, app_info from yunohost.utils.ldap import _get_ldap_interface if not force and domain not in domain_list()['domains']: @@ -204,8 +204,9 @@ def domain_remove(operation_logger, domain, force=False): for app in _installed_apps(): settings = _get_app_settings(app) + label = app_info(app)["name"] if settings.get("domain") == domain: - apps_on_that_domain.append("%s (on https://%s%s)" % (app, domain, settings["path"]) if "path" in settings else app) + apps_on_that_domain.append("%s \"%s\" (on https://%s%s)" % (app, label, domain, settings["path"]) if "path" in settings else app) if apps_on_that_domain: raise YunohostError('domain_uninstall_app_first', apps=", ".join(apps_on_that_domain)) From e51a1b670e050c1a1842e44039e8e5fb64adae87 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 1 Jan 2021 19:13:43 +0100 Subject: [PATCH 128/128] [ux] add command instructions and suggest change-url for domain_uninstall_app_first --- locales/en.json | 2 +- src/yunohost/domain.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/locales/en.json b/locales/en.json index c24fc831c..f8f296a7b 100644 --- a/locales/en.json +++ b/locales/en.json @@ -277,7 +277,7 @@ "domain_dyndns_root_unknown": "Unknown DynDNS root domain", "domain_exists": "The domain already exists", "domain_hostname_failed": "Unable to set new hostname. This might cause an issue later (it might be fine).", - "domain_uninstall_app_first": "Those applications are still installed on your domain: {apps}. Please uninstall them before proceeding to domain removal", + "domain_uninstall_app_first": "Those applications are still installed on your domain:\n{apps}\n\nPlease uninstall them using 'yunohost app remove the_app_id' or move them to another domain using 'yunohost app change-url the_app_id' before proceeding to domain removal", "domain_name_unknown": "Domain '{domain}' unknown", "domain_unknown": "Unknown domain", "domains_available": "Available domains:", diff --git a/src/yunohost/domain.py b/src/yunohost/domain.py index 2bd195f53..d581b8426 100644 --- a/src/yunohost/domain.py +++ b/src/yunohost/domain.py @@ -206,10 +206,10 @@ def domain_remove(operation_logger, domain, force=False): settings = _get_app_settings(app) label = app_info(app)["name"] if settings.get("domain") == domain: - apps_on_that_domain.append("%s \"%s\" (on https://%s%s)" % (app, label, domain, settings["path"]) if "path" in settings else app) + apps_on_that_domain.append(" - %s \"%s\" on https://%s%s" % (app, label, domain, settings["path"]) if "path" in settings else app) if apps_on_that_domain: - raise YunohostError('domain_uninstall_app_first', apps=", ".join(apps_on_that_domain)) + raise YunohostError('domain_uninstall_app_first', apps="\n".join(apps_on_that_domain)) operation_logger.start() ldap = _get_ldap_interface()