From 207ebbb27f1bdff45ba520fb92c14383f552fd7c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 9 Dec 2023 17:20:41 +0100 Subject: [PATCH 01/16] Allow dots in usernames --- share/actionsmap.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/actionsmap.yml b/share/actionsmap.yml index 464a4e024..9382c70f3 100644 --- a/share/actionsmap.yml +++ b/share/actionsmap.yml @@ -63,7 +63,7 @@ user: help: The unique username to create extra: pattern: &pattern_username - - !!str ^[a-z0-9_]+$ + - !!str ^[a-z0-9_\.]+$ - "pattern_username" -F: full: --fullname From 830d7b47e04835823eab0ce129671b0e11d977ab Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 13 Dec 2023 13:15:42 +0100 Subject: [PATCH 02/16] systemutils: when checking debian version and system arch, redirect stderr to /dev/null to prevent stupid issues, for example when the current working dir doesnt exist anymore.. --- src/utils/system.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils/system.py b/src/utils/system.py index a169bd62c..71ed49b1d 100644 --- a/src/utils/system.py +++ b/src/utils/system.py @@ -29,11 +29,11 @@ YUNOHOST_PACKAGES = ["yunohost", "yunohost-admin", "moulinette", "ssowat"] def debian_version(): - return check_output('grep "^VERSION_CODENAME=" /etc/os-release | cut -d= -f2') + return check_output('grep "^VERSION_CODENAME=" /etc/os-release 2>/dev/null | cut -d= -f2') def system_arch(): - return check_output("dpkg --print-architecture") + return check_output("dpkg --print-architecture 2>/dev/null") def system_virt(): @@ -44,7 +44,7 @@ def system_virt(): # Detect virt technology (if not bare metal) and arch # Gotta have this "|| true" because it systemd-detect-virt return 'none' # with an error code on bare metal ~.~ - return check_output("systemd-detect-virt || true") + return check_output("systemd-detect-virt 2>/dev/null || true") def free_space_in_directory(dirpath): From c0337bf1eff2df756fcced26d55292b8903da189 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 13 Dec 2023 15:10:30 +0100 Subject: [PATCH 03/16] logs: Ignore boring java warning --- src/hook.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hook.py b/src/hook.py index 4b07d1c17..8ce5a6d0e 100644 --- a/src/hook.py +++ b/src/hook.py @@ -377,6 +377,8 @@ def hook_exec( r"pg_ctlcluster \d\d main start", r"Ver\s*Cluster\s*Port\s*Status\s*Owner\s*Data\s*directory", r"/var/lib/postgresql/\d\d/main /var/log/postgresql/postgresql-\d\d-main.log", + # Java boring messages + r"cannot open '/etc/ssl/certs/java/cacerts'", ] return all(not re.search(w, msg) for w in irrelevant_warnings) From 770fdb686138c9a05d63577e40f32343a5076e47 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Fri, 15 Dec 2023 01:23:49 +0100 Subject: [PATCH 04/16] [fix] First source patches failure doesn't stop app script --- helpers/utils | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/helpers/utils b/helpers/utils index edbdbdc3a..e16ddc70b 100644 --- a/helpers/utils +++ b/helpers/utils @@ -351,13 +351,12 @@ ynh_setup_source() { if [ -d "$YNH_APP_BASEDIR/sources/patches/" ]; then local patches_folder=$(realpath $YNH_APP_BASEDIR/sources/patches/) if (($(find $patches_folder -type f -name "${source_id}-*.patch" 2>/dev/null | wc --lines) > "0")); then - ( - cd "$dest_dir" - for p in $patches_folder/${source_id}-*.patch; do - echo $p - patch --strip=1 <$p - done - ) || ynh_die --message="Unable to apply patches" + pushd "$dest_dir" + for p in $patches_folder/${source_id}-*.patch; do + echo $p + patch --strip=1 <$p || ynh_die --message="Unable to apply patches" + done + popd fi fi From 5738526349c392249c5745d23127eb65eb0bd1c4 Mon Sep 17 00:00:00 2001 From: YapWC <34093361+YapWC@users.noreply.github.com> Date: Tue, 19 Dec 2023 10:13:03 +0800 Subject: [PATCH 05/16] Update user.py Allowed dots to be used in creating username --- src/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user.py b/src/user.py index 00876854e..4ad23525a 100644 --- a/src/user.py +++ b/src/user.py @@ -38,7 +38,7 @@ from yunohost.utils.system import binary_to_human logger = getActionLogger("yunohost.user") FIELDS_FOR_IMPORT = { - "username": r"^[a-z0-9_]+$", + "username": r"^[a-z0-9_.]+$", "firstname": r"^([^\W\d_]{1,30}[ ,.\'-]{0,3})+$", "lastname": r"^([^\W\d_]{1,30}[ ,.\'-]{0,3})+$", "password": r"^|(.{3,})$", From 4ce101b5c6aae6d0697f1034d7f650eb4ab6dad6 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 19 Dec 2023 20:30:18 +0100 Subject: [PATCH 06/16] More boring warnings --- src/hook.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hook.py b/src/hook.py index 8ce5a6d0e..5f976adf0 100644 --- a/src/hook.py +++ b/src/hook.py @@ -379,6 +379,8 @@ def hook_exec( r"/var/lib/postgresql/\d\d/main /var/log/postgresql/postgresql-\d\d-main.log", # Java boring messages r"cannot open '/etc/ssl/certs/java/cacerts'", + # Misc + r"update-binfmts: warning:", ] return all(not re.search(w, msg) for w in irrelevant_warnings) From 308ed0e1742f405fb2b7ce38d75b707d6dcc90e9 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 21 Dec 2023 15:14:56 +0100 Subject: [PATCH 07/16] Refactor ynh_use_logrotate madness --- helpers/logrotate | 103 ++++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 58 deletions(-) diff --git a/helpers/logrotate b/helpers/logrotate index de9f8d3c1..2843d12cd 100644 --- a/helpers/logrotate +++ b/helpers/logrotate @@ -1,105 +1,92 @@ #!/bin/bash +FIRST_CALL_TO_LOGROTATE="true" + # Use logrotate to manage the logfile # -# usage: ynh_use_logrotate [--logfile=/log/file] [--nonappend] [--specific_user=user/group] +# usage: ynh_use_logrotate [--logfile=/log/file] [--specific_user=user/group] # | arg: -l, --logfile= - absolute path of logfile -# | arg: -n, --nonappend - (optional) Replace the config file instead of appending this new config. # | arg: -u, --specific_user= - run logrotate as the specified user and group. If not specified logrotate is runned as root. # # If no `--logfile` is provided, `/var/log/$app` will be used as default. # `logfile` can point to a directory or a file. # -# It's possible to use this helper multiple times, each config will be added to -# the same logrotate config file. Unless you use the option `--non-append` -# # Requires YunoHost version 2.6.4 or higher. -# Requires YunoHost version 3.2.0 or higher for the argument `--specific_user` ynh_use_logrotate() { - # Stupid patch to remplace --non-append by --nonappend - # Because for some reason --non-append was supposed to be legacy - # (why is it legacy ? Idk maybe because getopts cant parse args with - in their names..) - # but there was no good communication about this, and now --non-append - # is still the most-used option, yet it was parsed with batshit stupid code - # So instead this loops over the positional args, and replace --non-append - # with --nonappend so it's transperent for the rest of the function... + # Stupid patch to ignore legacy --non-append and --nonappend + # which was never properly understood and improperly used and kind of bullshit local all_args=( ${@} ) for I in $(seq 0 $(($# - 1))) do - if [[ "${all_args[$I]}" == "--non-append" ]] + if [[ "${all_args[$I]}" == "--non-append" ]] || [[ "${all_args[$I]}" == "--nonappend" ]] then - all_args[$I]="--nonappend" + unset all_args[$I] fi done set -- "${all_args[@]}" - # Declare an array to define the options of this helper. - local legacy_args=lnu - local -A args_array=([l]=logfile= [n]=nonappend [u]=specific_user=) + # Argument parsing + local legacy_args=lu + local -A args_array=([l]=logfile= [u]=specific_user=) local logfile - local nonappend local specific_user - # Manage arguments with getopts ynh_handle_getopts_args "$@" logfile="${logfile:-}" - nonappend="${nonappend:-0}" specific_user="${specific_user:-}" - # LEGACY CODE - PRE GETOPTS - if [ $# -gt 0 ] && [ "$(echo ${1:0:1})" != "-" ]; then - # If the given logfile parameter already exists as a file, or if it ends up with ".log", - # we just want to manage a single file - if [ -f "$1" ] || [ "$(echo ${1##*.})" == "log" ]; then - local logfile=$1 - # Otherwise we assume we want to manage a directory and all its .log file inside - else - local logfile=$1/*.log - fi + set -o noglob + if [[ -z "$logfile" ]]; then + logfile="/var/log/${app}/*.log" + elif [[ "${logfile##*.}" != "log" ]] && [[ "${logfile##*.}" != "txt" ]]; then + logfile="$logfile/*.log" fi - # LEGACY CODE + set +o noglob + + for stuff in $logfile + do + mkdir --parents $(dirname "$stuff") + done - local customtee="tee --append" - if [ "$nonappend" -eq 1 ]; then - customtee="tee" - fi - if [ -n "$logfile" ]; then - if [ ! -f "$1" ] && [ "$(echo ${logfile##*.})" != "log" ]; then # Keep only the extension to check if it's a logfile - local logfile="$logfile/*.log" # Else, uses the directory and all logfile into it. - fi - else - logfile="/var/log/${app}/*.log" # Without argument, use a defaut directory in /var/log - fi local su_directive="" - if [[ -n $specific_user ]]; then - su_directive=" # Run logorotate as specific user - group - su ${specific_user%/*} ${specific_user#*/}" + if [[ -n "$specific_user" ]]; then + su_directive="su ${specific_user%/*} ${specific_user#*/}" fi - cat >./${app}-logrotate <$tempconf $logfile { - # Rotate if the logfile exceeds 100Mo + # Rotate if the logfile exceeds 100Mo size 100M - # Keep 12 old log maximum + # Keep 12 old log maximum rotate 12 - # Compress the logs with gzip + # Compress the logs with gzip compress - # Compress the log at the next cycle. So keep always 2 non compressed logs + # Compress the log at the next cycle. So keep always 2 non compressed logs delaycompress - # Copy and truncate the log to allow to continue write on it. Instead of move the log. + # Copy and truncate the log to allow to continue write on it. Instead of moving the log. copytruncate - # Do not do an error if the log is missing + # Do not trigger an error if the log is missing missingok - # Not rotate if the log is empty + # Do not rotate if the log is empty notifempty - # Keep old logs in the same dir + # Keep old logs in the same dir noolddir $su_directive } EOF - mkdir --parents $(dirname "$logfile") # Create the log directory, if not exist - cat ${app}-logrotate | $customtee /etc/logrotate.d/$app >/dev/null # Append this config to the existing config file, or replace the whole config file (depending on $customtee) - chmod 644 "/etc/logrotate.d/$app" # Make sure permissions are correct (otherwise the config file could be ignored and the corresponding logs never rotated) + + if [[ "$FIRST_CALL_TO_LOGROTATE" == "true" ]] + then + cat $tempconf > /etc/logrotate.d/$app + else + cat $tempconf >> /etc/logrotate.d/$app + fi + + FIRST_CALL_TO_LOGROTATE="false" + + # Make sure permissions are correct (otherwise the config file could be ignored and the corresponding logs never rotated) + chmod 644 "/etc/logrotate.d/$app" } # Remove the app's logrotate config. From 4284cd5d10af319f42f83fd00db6b1797bbbe78c Mon Sep 17 00:00:00 2001 From: selfhoster1312 <121760708+selfhoster1312@users.noreply.github.com> Date: Thu, 21 Dec 2023 15:35:16 +0100 Subject: [PATCH 08/16] Only warn that mailbox is disabled for admins (#1739) * Only warn that mailbox is disabled for admins * Requality warning about "disabled mail perm for user" as debug --------- Co-authored-by: Alexandre Aubin <4533074+alexAubin@users.noreply.github.com> --- src/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user.py b/src/user.py index 4ad23525a..7af39e185 100644 --- a/src/user.py +++ b/src/user.py @@ -616,7 +616,7 @@ def user_info(username): if service_status("dovecot")["status"] != "running": logger.warning(m18n.n("mailbox_used_space_dovecot_down")) elif username not in user_permission_info("mail.main")["corresponding_users"]: - logger.warning(m18n.n("mailbox_disabled", user=username)) + logger.debug(m18n.n("mailbox_disabled", user=username)) else: try: uid_ = user["uid"][0] From a729c78379e738d00d83b5809df1e516144c5851 Mon Sep 17 00:00:00 2001 From: Josue-T Date: Sat, 23 Dec 2023 19:34:22 +0100 Subject: [PATCH 09/16] apps: add mailbox/IMAP support for apps that declared a system user with mail enabled (#1745) * Add missing account registration for apps in postfix * Also set email on dovecot DB * fix undefined var * Fix missing username format config in dovecot --- conf/dovecot/dovecot.conf | 2 +- conf/postfix/main.cf | 4 ++-- src/app.py | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/conf/dovecot/dovecot.conf b/conf/dovecot/dovecot.conf index 1bd5ad5e3..c014a4d23 100644 --- a/conf/dovecot/dovecot.conf +++ b/conf/dovecot/dovecot.conf @@ -57,7 +57,7 @@ userdb { userdb { driver = passwd-file - args = /etc/dovecot/app-senders-passwd + args = username_format=%n /etc/dovecot/app-senders-passwd } protocol imap { diff --git a/conf/postfix/main.cf b/conf/postfix/main.cf index e30ca0874..2867a04c2 100644 --- a/conf/postfix/main.cf +++ b/conf/postfix/main.cf @@ -93,14 +93,14 @@ recipient_delimiter = + inet_interfaces = all #### Fit to the maximum message size to 25mb, more than allowed by GMail or Yahoo #### -# /!\ This size is the size of the attachment in base64. +# /!\ This size is the size of the attachment in base64. # BASE64_SIZE_IN_BYTE = ORIGINAL_SIZE_IN_MEGABYTE * 1,37 *1024*1024 + 980 # See https://serverfault.com/questions/346895/postfix-mail-size-counting message_size_limit = 35914708 # Virtual Domains Control virtual_mailbox_domains = ldap:/etc/postfix/ldap-domains.cf -virtual_mailbox_maps = ldap:/etc/postfix/ldap-accounts.cf +virtual_mailbox_maps = ldap:/etc/postfix/ldap-accounts.cf,hash:/etc/postfix/app_senders_login_maps virtual_mailbox_base = virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf,ldap:/etc/postfix/ldap-groups.cf virtual_alias_domains = diff --git a/src/app.py b/src/app.py index ad20b3552..15e266a6d 100644 --- a/src/app.py +++ b/src/app.py @@ -3267,14 +3267,15 @@ def regen_mail_app_user_config_for_dovecot_and_postfix(only=None): if "domain" not in settings or "mail_pwd" not in settings: continue + mail_user = settings.get("mail_user", app) + mail_domain = settings.get("mail_domain", settings["domain"]) + if dovecot: hashed_password = _hash_user_password(settings["mail_pwd"]) dovecot_passwd.append( - f"{app}:{hashed_password}::::::allow_nets=::1,127.0.0.1/24,local" + f"{app}:{hashed_password}::::::allow_nets=::1,127.0.0.1/24,local,mail={mail_user}@{mail_domain}" ) if postfix: - mail_user = settings.get("mail_user", app) - mail_domain = settings.get("mail_domain", settings["domain"]) postfix_map.append(f"{mail_user}@{mail_domain} {app}") if dovecot: From ca354cd827e77a61677fd5aeffabea304bfcd2f2 Mon Sep 17 00:00:00 2001 From: xabirequejo Date: Thu, 21 Dec 2023 15:21:10 +0000 Subject: [PATCH 10/16] Translated using Weblate (Basque) Currently translated at 99.1% (775 of 782 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/eu.json b/locales/eu.json index 349b25f9c..8c57e8655 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -192,7 +192,7 @@ "app_upgrade_several_apps": "Ondorengo aplikazioak eguneratuko dira: {apps}", "backup_app_failed": "Ezinezkoa izan da {app}(r)en babeskopia egitea", "backup_actually_backuping": "Bildutako fitxategiekin babeskopia sortzen…", - "backup_archive_name_exists": "Dagoeneko existitzen da izen bera duen babeskopia fitxategi bat.", + "backup_archive_name_exists": "Dagoeneko existitzen da '{name}' izena duen babeskopia-fitxategi bat.", "backup_archive_name_unknown": "Ez da '{name}' izeneko babeskopia ezagutzen", "backup_archive_open_failed": "Ezinezkoa izan da babeskopien fitxategia irekitzea", "backup_archive_system_part_not_available": "'{part}' sistemaren atala ez dago erabilgarri babeskopia honetan", @@ -693,7 +693,7 @@ "global_settings_setting_security_experimental_enabled": "Segurtasun ezaugarri esperimentalak", "registrar_infos": "Erregistro-enpresaren informazioa", "global_settings_setting_pop3_enabled": "Gaitu POP3", - "global_settings_reset_success": "Berrezarri ezarpen orokorrak", + "global_settings_reset_success": "Berrezarri defektuzko ezarpenak", "global_settings_setting_backup_compress_tar_archives": "Konprimatu babeskopiak", "config_forbidden_readonly_type": "'{type}' mota ezin da ezarri readonly bezala; beste mota bat erabili balio hau emateko (argudioaren ida: '{id}').", "diagnosis_using_stable_codename": "apt (sistemaren pakete kudeatzailea) 'stable' (egonkorra) izen kodea duten paketeak instalatzeko ezarrita dago une honetan, eta ez uneko Debianen bertsioaren (bullseye) izen kodea.", From 6fa59bfd5cd6d57913d66c0c6e6283283a1bedba Mon Sep 17 00:00:00 2001 From: Kuba Bazan Date: Thu, 21 Dec 2023 22:24:47 +0000 Subject: [PATCH 11/16] Translated using Weblate (Polish) Currently translated at 40.2% (315 of 782 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/pl/ --- locales/pl.json | 58 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/locales/pl.json b/locales/pl.json index 17a9fa572..983b58f15 100644 --- a/locales/pl.json +++ b/locales/pl.json @@ -126,7 +126,7 @@ "app_requirements_checking": "Sprawdzam wymagania dla aplikacji {app}...", "app_upgrade_some_app_failed": "Niektórych aplikacji nie udało się zaktualizować", "backup_app_failed": "Nie udało się utworzyć kopii zapasowej {app}", - "backup_archive_name_exists": "Archiwum kopii zapasowych o tej nazwie już istnieje.", + "backup_archive_name_exists": "Archiwum kopii zapasowych o nazwie '{name}' już istnieje.", "backup_archive_open_failed": "Nie można otworzyć archiwum kopii zapasowej", "backup_archive_writing_error": "Nie udało się dodać plików '{source}' (nazwanych w archiwum '{dest}') do utworzenia kopii zapasowej skompresowanego archiwum '{archive}'", "backup_ask_for_copying_if_needed": "Czy chcesz wykonać kopię zapasową tymczasowo używając {size} MB? (Ta metoda jest stosowana, ponieważ niektóre pliki nie mogły zostać przygotowane przy użyciu bardziej wydajnej metody.)", @@ -188,11 +188,11 @@ "confirm_app_install_danger": "UWAGA! Ta aplikacja jest wciąż w fazie eksperymentalnej (jeśli nie działa jawnie)! Prawdopodobnie NIE powinieneś jej instalować, chyba że wiesz, co robisz. NIE ZOSTANIE udzielone wsparcie, jeśli ta aplikacja nie będzie działać poprawnie lub spowoduje uszkodzenie systemu... Jeśli mimo to jesteś gotów podjąć to ryzyko, wpisz '{answers}", "confirm_app_install_thirdparty": "UWAGA! Ta aplikacja nie jest częścią katalogu aplikacji YunoHost. Instalowanie aplikacji innych firm może naruszyć integralność i bezpieczeństwo systemu. Prawdopodobnie NIE powinieneś jej instalować, chyba że wiesz, co robisz. NIE ZOSTANIE udzielone wsparcie, jeśli ta aplikacja nie będzie działać poprawnie lub spowoduje uszkodzenie systemu... Jeśli mimo to jesteś gotów podjąć to ryzyko, wpisz '{answers}'", "config_apply_failed": "Nie udało się zastosować nowej konfiguracji: {error}", - "config_cant_set_value_on_section": "Nie można ustawić pojedynczej wartości dla całej sekcji konfiguracji.", + "config_cant_set_value_on_section": "Nie możesz ustawić pojedyńczej wartości dla całej sekcji konfiguracji.", "config_no_panel": "Nie znaleziono panelu konfiguracji.", "config_unknown_filter_key": "Klucz filtru '{filter_key}' jest niepoprawny.", "config_validate_email": "Proszę podać poprawny adres e-mail", - "backup_hook_unknown": "Nieznany jest hook kopii zapasowej '{hook}'", + "backup_hook_unknown": "Zapasowy hook '{hook}' jest nieznany", "backup_no_uncompress_archive_dir": "Nie istnieje taki katalog nieskompresowanego archiwum", "backup_output_symlink_dir_broken": "Twój katalog archiwum ‘{path}’ to uszkodzony symlink. Być może zapomniałeś o ponownym zamontowaniu lub podłączeniu nośnika przechowującego, do którego on wskazuje.", "backup_system_part_failed": "Nie udało się wykonać kopii zapasowej części systemu ‘{part}’", @@ -209,12 +209,12 @@ "config_action_disabled": "Nie można uruchomić akcji '{action}', ponieważ jest ona wyłączona. Upewnij się, że spełnione są jej ograniczenia. Pomoc: {help}", "config_action_failed": "Nie udało się uruchomić akcji '{action}': {error}", "config_forbidden_readonly_type": "Typ '{type}' nie może być ustawiony jako tylko do odczytu. Użyj innego typu, aby wyświetlić tę wartość (odpowiednie ID argumentu: '{id}')", - "config_forbidden_keyword": "Słowo kluczowe '{keyword}' jest zastrzeżone. Nie można tworzyć ani używać panelu konfiguracji z pytaniem o tym identyfikatorze.", + "config_forbidden_keyword": "Słowo kluczowe '{keyword}' jest już zarezerwowane. Nie możesz tworzyć ani używać panelu konfiguracji z pytaniem o tym identyfikatorze.", "backup_output_directory_forbidden": "Wybierz inną ścieżkę docelową. Kopie zapasowe nie mogą być tworzone w podfolderach /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var ani /home/yunohost.backup/archives", "confirm_app_insufficient_ram": "UWAGA! Ta aplikacja wymaga {required} pamięci RAM do zainstalowania/aktualizacji, a obecnie dostępne jest tylko {current}. Nawet jeśli aplikacja mogłaby działać, proces instalacji/aktualizacji wymaga dużej ilości pamięci RAM, więc serwer może się zawiesić i niepowodzenie może być katastrofalne. Jeśli mimo to jesteś gotów podjąć to ryzyko, wpisz '{answers}'", "app_not_upgraded_broken_system": "Aplikacja '{failed_app}' nie powiodła się w procesie aktualizacji i spowodowała uszkodzenie systemu. W rezultacie anulowane zostały aktualizacje następujących aplikacji: {apps}", "app_not_upgraded_broken_system_continue": "Aplikacja '{failed_app}' nie powiodła się w procesie aktualizacji i spowodowała uszkodzenie systemu (parametr --continue-on-failure jest ignorowany). W rezultacie anulowane zostały aktualizacje następujących aplikacji: {apps}", - "certmanager_domain_http_not_working": "Domena {domain} nie wydaje się być dostępna przez HTTP. Sprawdź kategorię 'Strona internetowa' diagnostyki, aby uzyskać więcej informacji. (Jeśli wiesz, co robisz, użyj opcji '--no-checks', aby wyłączyć te sprawdzania.)", + "certmanager_domain_http_not_working": "Domena {domain} nie wydaje się być dostępna za pośrednictwem protokołu HTTP. Aby uzyskać więcej informacji, sprawdź kategorię 'Web' w diagnostyce. (Jeśli wiesz, co robisz, użyj '--no-checks', aby wyłączyć te kontrole.)", "migration_0021_system_not_fully_up_to_date": "Twój system nie jest w pełni zaktualizowany! Proszę, wykonaj zwykłą aktualizację oprogramowania zanim rozpoczniesz migrację na system Bullseye.", "global_settings_setting_smtp_relay_port": "Port przekaźnika SMTP", "domain_config_cert_renew": "Odnów certyfikat Let's Encrypt", @@ -280,6 +280,50 @@ "certmanager_unable_to_parse_self_CA_name": "Nie można spasować nazwy organu samopodpisywanego (pliku: {file})", "app_corrupt_source": "YunoHost był w stanie pobrać zasób ‘{source_id}’ ({url}) dla {app}, ale zasób nie pasuje do oczekiwanego sumy kontrolnej. Może to oznaczać, że na twoim serwerze wystąpiła tymczasowa awaria sieci, LUB zasób został jakoś zmieniony przez dostawcę usługi (lub złośliwego aktora?) i pakowacze YunoHost muszą zbadać sprawę i zaktualizować manifest aplikacji, aby odzwierciedlić tę zmianę. \nOczekiwana suma kontrolna sha256: {expected_sha256} \nPobrana suma kontrolna sha256: {computed_sha256} \nRozmiar pobranego pliku: {size}”", "ask_dyndns_recovery_password": "Hasło odzyskiwania DynDNS", - "certmanager_hit_rate_limit": "Zbyt wiele certyfikatów zostało ostatnio wydanych dla tej dokładnej grupy domen {domain}. Spróbuj ponownie później. Zobacz https://letsencrypt.org/docs/rate-limits/ aby uzyskać więcej informacji", - "apps_failed_to_upgrade_line": "\n * {app_id} (aby zobaczyć odpowiedni dziennik, wykonaj ‘yunohost log show {operation_logger_name}’)" + "certmanager_hit_rate_limit": "Zbyt wiele certyfikatów zostało ostatnio wydanych dla dokładnie tej grupy domen {domain}. Spróbuj ponownie później. Zobacz https://letsencrypt.org/docs/rate-limits/ aby uzyskać więcej informacji", + "apps_failed_to_upgrade_line": "\n * {app_id} (aby zobaczyć odpowiedni dziennik, wykonaj ‘yunohost log show {operation_logger_name}’)", + "diagnosis_basesystem_ynh_inconsistent_versions": "Używasz niespójnych wersji pakietów YunoHost... najprawdopodobniej z powodu nieudanej lub częściowej aktualizacji.", + "service_removed": "Usunięto usługę '{service}'", + "service_disabled": "Usługa '{service}' nie będzie już uruchamiana podczas uruchamiania systemu.", + "diagnosis_description_web": "Sieć", + "confirm_notifications_read": "OSTRZEŻENIE: Zanim przejdziesz dalej, powinieneś sprawdzić powyższe powiadomienia aplikacji, mogą tam być istotne informacje o których warto wiedzieć. [{answers}]", + "diagnosis_description_services": "Kontrola stanu usług", + "diagnosis_domain_expiration_error": "Niektóre domeny wygasną BARDZO WKRÓTCE!", + "diagnosis_domain_expiration_success": "Twoje domeny są zarejestrowane i nie wygasną w najbliższym czasie.", + "diagnosis_domain_expiration_warning": "Niektóre domeny wkrótce wygasną!", + "diagnosis_dns_specialusedomain": "Domena {domain} opiera się na domenie najwyższego poziomu specjalnego przeznaczenia (TLD), takiej jak .local lub .test i dlatego nie oczekuje się, że będzie zawierać rzeczywiste rekordy DNS.", + "danger": "Zagrożeniæ:", + "config_validate_url": "Powinien być poprawnym adresem internetowym (URL)", + "diagnosis_domain_expires_in": "Domena {domain} wygasa za {day} dni.", + "diagnosis_cant_run_because_of_dep": "Nie można przeprowadzić diagnostyki dla kategorii {category}, ponieważ występują poważne problemy związane z kategorią {dep}.", + "diagnosis_everything_ok": "Wszystko wygląda dobrze dla kategorii {category}!", + "diagnosis_found_errors": "Znaleziono istotne problemy związane z kategorią: {errors}!", + "diagnosis_dns_missing_record": "Zgodnie z zalecaną konfiguracją DNS powinieneś dodać rekord DNS z następującymi informacjami.
Typ: {type
Nazwa: {name
Wartość: {wartość", + "diagnosis_display_tip": "Aby zobaczyć znalezione problemy, możesz przejść do sekcji Diagnostyka w webadmin lub uruchomić z wiersza poleceń polecenie „yunohost diagnoza show --issues --human-readable”.", + "diagnosis_dns_point_to_doc": "eśli potrzebujesz pomocy w konfiguracji rekordów DNS, sprawdź dokumentację pod adresem https://yunohost.org/dns_config.", + "diagnosis_failed": "Nie udało się pobrać wyniku diagnostyki dla kategorii „{category}”: {error}", + "diagnosis_dns_bad_conf": "Brakuje niektórych rekordów DNS lub są one nieprawidłowe dla domeny {domain} (category {category})", + "diagnosis_dns_discrepancy": "Wydaje się, że następujący rekord DNS nie jest zgodny z zalecaną konfiguracją:
Typ: {type
Nazwa: {name
Aktualna wartość: < code>{current
Oczekiwana wartość: {value", + "diagnosis_domain_not_found_details": "Domena {domain} nie istnieje w bazie WHOIS lub wygasła!", + "custom_app_url_required": "Aby zaktualizować aplikację niestandardową {app}, musisz podać adres URL", + "diagnosis_description_ports": "Ujawnione porty", + "diagnosis_basesystem_ynh_single_version": "Wersja {pakietu}: {wersja} ({repo})", + "diagnosis_failed_for_category": "Diagnostyka nie powiodła się dla kategorii „{category}”: {error}", + "diagnosis_basesystem_hardware_model": "Model serwera to {model}", + "service_enabled": "Usługa '{service}' będzie teraz automatycznie uruchamiana podczas uruchamiania systemu.", + "confirm_app_install_warning": "Ostrzeżenie: Ta aplikacja może działać, ale nie jest dobrze zintegrowana z YunoHost. Niektóre funkcje, takie jak jednorazowe logowanie i tworzenie/przywracanie kopii zapasowych mogą być niedostępne. Zainstalować mimo to? [{answers}] ", + "diagnosis_apps_broken": "Ta aplikacja jest obecnie oznaczona jako uszkodzona w katalogu aplikacji YunoHost. Może to być problem tymczasowy, do czasu gdy opiekunowie próbują go naprawić. W międzyczasie aktualizacja tej aplikacji jest wyłączona.", + "diagnosis_apps_not_in_app_catalog": "Ta aplikacja nie znajduje się w katalogu aplikacji YunoHost. Jeśli była tam wcześniej i została usunięta, powinieneś rozważyć odinstalowanie tej aplikacji, ponieważ nie będzie otrzymywać aktualizacji, co może zagrażać integralności i bezpieczeństwu twojego systemu.", + "diagnosis_dns_try_dyndns_update_force": "Konfiguracja DNS tej domeny powinna być automatycznie zarządzana przez YunoHost. Jeśli tak nie jest, możesz spróbować wymusić aktualizację za pomocą yunohost dyndns update --force.", + "diagnosis_apps_bad_quality": "Ta aplikacja jest obecnie oznaczona jako uszkodzona w katalogu aplikacji YunoHost. Może to być problem tymczasowy, do czasu gdy opiekunowie próbują go naprawić. W międzyczasie aktualizacja tej aplikacji jest wyłączona.", + "diagnosis_apps_deprecated_practices": "Zainstalowana wersja tej aplikacji nadal korzysta z bardzo starych i przestarzałych praktyk pakowania. Naprawdę powinieneś rozważyć jego aktualizację.", + "diagnosis_apps_outdated_ynh_requirement": "Zainstalowana wersja tej aplikacji wymaga jedynie yunohost >= 2.x lub 3.x, co sugeruje, że nie jest ona zgodna z zalecanymi praktykami pakowania i narzędziami. Naprawdę powinieneś rozważyć jej aktualizację.", + "service_reloaded": "Usługa '{service}' została ponownie załadowana", + "service_reloaded_or_restarted": "Usługa '{service}' została ponownie załadowana lub uruchomiona ponownie", + "ask_dyndns_recovery_password_explain_unavailable": "Ta domena DynDNS jest już zarejestrowana. Jeśli jesteś osobą, która pierwotnie zarejestrowała tę domenę, możesz wprowadzić hasło odzyskiwania, aby ją odzyskać.", + "diagnosis_domain_expiration_not_found": "Nie udało się sprawdzić daty wygaśnięcia niektórych domen", + "diagnosis_domain_expiration_not_found_details": "Informacje WHOIS dotyczące domeny {domain} wydają się nie zawierać informacji o dacie jej wygaśnięcia?", + "diagnosis_high_number_auth_failures": "Ostatnio wystąpiła podejrzanie duża liczba błędów uwierzytelniania. Możesz upewnić się, że Fail2ban działa i jest poprawnie skonfigurowany, lub użyj niestandardowego portu dla SSH, jak wyjaśniono w https://yunohost.org/security.", + "service_remove_failed": "Nie można usunąć usługi '{service}", + "diagnosis_apps_issue": "Znaleziono problem z aplikacją {app}" } From 155418409e85fcbe979d17b28e303aa00f5ef507 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 26 Dec 2023 17:42:05 +0100 Subject: [PATCH 12/16] postfix: fix edge case bug with the sni file when no domain has mail enabled --- conf/postfix/sni | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/postfix/sni b/conf/postfix/sni index 29ed2e043..b57b7e05f 100644 --- a/conf/postfix/sni +++ b/conf/postfix/sni @@ -1,2 +1,4 @@ +# This maps domain to certificates to properly handle multi-domain context +# (also we need a comment in this file such that it's never empty to prevent regenconf issues) {% for domain in domain_list.split() %}{{ domain }} /etc/yunohost/certs/{{ domain }}/key.pem /etc/yunohost/certs/{{ domain }}/crt.pem -{% endfor %} \ No newline at end of file +{% endfor %} From 57a0e8b8f8240054dc589d601898218212ce2878 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 27 Dec 2023 19:15:09 +0100 Subject: [PATCH 13/16] Update changelog for 11.2.9 --- debian/changelog | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/debian/changelog b/debian/changelog index 97812a78f..46c58b2da 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,18 @@ +yunohost (11.2.9) stable; urgency=low + + - users: Allow dots in usernames ([#1750](https://github.com/yunohost/yunohost/pull/1750)) + - ynh_setup_source: properly handle --keep for directories when the dir already exists in the new setup (8e3e78884) + - ynh_setup_source: fix first source patches failure not triggering an error (770fdb686) + - ynh_use_logrotate: Refactor this madness (308ed0e17) + - systemutils: when checking debian version and system arch, redirect stderr to /dev/null to prevent stupid issues (830d7b47e) + - mail/apps: add mailbox/IMAP support for apps that declared a system user with mail enabled (#1745) + - mail: fix edge case bug with the postfix sni file when no domain has mail enabled (155418409) + - i18n: Translations updated for Basque, Polish + + Thanks to all contributors <3 ! (Josue-T, Kuba Bazan, ljf, selfhoster1312, xabirequejo, YapWC) + + -- Alexandre Aubin Wed, 27 Dec 2023 18:45:30 +0100 + yunohost (11.2.8.2) stable; urgency=low - Aleks forgot to remove pdb.set_trace ... (54a6a1b3) From 8952d69e05c16df5abc235d4b59a2b2d6ad5d0aa Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 27 Dec 2023 19:07:29 +0000 Subject: [PATCH 14/16] [CI] Format code with Black --- src/utils/system.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/utils/system.py b/src/utils/system.py index 71ed49b1d..c608021bd 100644 --- a/src/utils/system.py +++ b/src/utils/system.py @@ -29,7 +29,9 @@ YUNOHOST_PACKAGES = ["yunohost", "yunohost-admin", "moulinette", "ssowat"] def debian_version(): - return check_output('grep "^VERSION_CODENAME=" /etc/os-release 2>/dev/null | cut -d= -f2') + return check_output( + 'grep "^VERSION_CODENAME=" /etc/os-release 2>/dev/null | cut -d= -f2' + ) def system_arch(): From 0ed6769fcf59fca204adc787d34907e3931030de Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 28 Dec 2023 02:45:10 +0100 Subject: [PATCH 15/16] helpers/utils: replace the damn ynh_die with a warning when patch fails to apply ... --- helpers/utils | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/utils b/helpers/utils index e16ddc70b..9c92e65b9 100644 --- a/helpers/utils +++ b/helpers/utils @@ -354,7 +354,7 @@ ynh_setup_source() { pushd "$dest_dir" for p in $patches_folder/${source_id}-*.patch; do echo $p - patch --strip=1 <$p || ynh_die --message="Unable to apply patches" + patch --strip=1 <$p || ynh_print_warn --message="Packagers /!\\ patch $p failed to apply" done popd fi From 6c3290d8bf63143b3426006877b607013895aad5 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 28 Dec 2023 02:46:15 +0100 Subject: [PATCH 16/16] Update changelog for 11.2.9.1 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 46c58b2da..d2160e07d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +yunohost (11.2.9.1) stable; urgency=low + + - helpers/utils: replace the damn ynh_die with a warning when patch fails to apply ... (0ed6769fc) + + -- Alexandre Aubin Thu, 28 Dec 2023 02:45:33 +0100 + yunohost (11.2.9) stable; urgency=low - users: Allow dots in usernames ([#1750](https://github.com/yunohost/yunohost/pull/1750))