diff --git a/.github/workflows/update_postscreen_access_list.yml b/.github/workflows/update_postscreen_access_list.yml index ddfa7ac86..3d79e801b 100644 --- a/.github/workflows/update_postscreen_access_list.yml +++ b/.github/workflows/update_postscreen_access_list.yml @@ -22,7 +22,7 @@ jobs: bash helper-scripts/update_postscreen_whitelist.sh - name: Create Pull Request - uses: peter-evans/create-pull-request@v6 + uses: peter-evans/create-pull-request@v7 with: token: ${{ secrets.mailcow_action_Update_postscreen_access_cidr_pat }} commit-message: update postscreen_access.cidr diff --git a/data/Dockerfiles/phpfpm/docker-entrypoint.sh b/data/Dockerfiles/phpfpm/docker-entrypoint.sh index 798a25851..20e9a405c 100755 --- a/data/Dockerfiles/phpfpm/docker-entrypoint.sh +++ b/data/Dockerfiles/phpfpm/docker-entrypoint.sh @@ -10,16 +10,25 @@ done # Do not attempt to write to slave if [[ ! -z ${REDIS_SLAVEOF_IP} ]]; then - REDIS_CMDLINE="redis-cli -h ${REDIS_SLAVEOF_IP} -p ${REDIS_SLAVEOF_PORT}" + REDIS_HOST=$REDIS_SLAVEOF_IP + REDIS_PORT=$REDIS_SLAVEOF_PORT else - REDIS_CMDLINE="redis-cli -h redis -p 6379" + REDIS_HOST="redis" + REDIS_PORT="6379" fi +REDIS_CMDLINE="redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT}" until [[ $(${REDIS_CMDLINE} PING) == "PONG" ]]; do echo "Waiting for Redis..." sleep 2 done +# Set redis session store +echo -n ' +session.save_handler = redis +session.save_path = "tcp://'${REDIS_HOST}':'${REDIS_PORT}'" +' > /usr/local/etc/php/conf.d/session_store.ini + # Check mysql_upgrade (master and slave) CONTAINER_ID= until [[ ! -z "${CONTAINER_ID}" ]] && [[ "${CONTAINER_ID}" =~ ^[[:alnum:]]*$ ]]; do diff --git a/data/Dockerfiles/sogo/docker-entrypoint.sh b/data/Dockerfiles/sogo/docker-entrypoint.sh index 2ff602a3c..4e20e960e 100755 --- a/data/Dockerfiles/sogo/docker-entrypoint.sh +++ b/data/Dockerfiles/sogo/docker-entrypoint.sh @@ -10,6 +10,8 @@ if [[ ! -z ${REDIS_SLAVEOF_IP} ]]; then cp /etc/syslog-ng/syslog-ng-redis_slave.conf /etc/syslog-ng/syslog-ng.conf fi +echo "$TZ" > /etc/timezone + # Run hooks for file in /hooks/*; do if [ -x "${file}" ]; then diff --git a/data/conf/postfix/postscreen_access.cidr b/data/conf/postfix/postscreen_access.cidr index 78ffc3a89..f77d4e9ce 100644 --- a/data/conf/postfix/postscreen_access.cidr +++ b/data/conf/postfix/postscreen_access.cidr @@ -1,6 +1,6 @@ -# Whitelist generated by Postwhite v3.4 on Thu Aug 1 00:16:45 UTC 2024 +# Whitelist generated by Postwhite v3.4 on Sun Sep 1 00:19:07 UTC 2024 # https://github.com/stevejenkins/postwhite/ -# 1954 total rules +# 1994 total rules 2a00:1450:4000::/36 permit 2a01:111:f400::/48 permit 2a01:111:f403:8000::/50 permit @@ -19,6 +19,8 @@ 8.20.114.31 permit 8.25.194.0/23 permit 8.25.196.0/23 permit +8.39.54.0/23 permit +8.40.222.0/23 permit 10.162.0.0/16 permit 12.130.86.238 permit 13.110.208.0/21 permit @@ -200,6 +202,7 @@ 52.96.91.34 permit 52.96.111.82 permit 52.96.172.98 permit +52.96.214.50 permit 52.96.222.194 permit 52.96.222.226 permit 52.96.223.2 permit @@ -324,6 +327,7 @@ 65.110.161.77 permit 65.123.29.213 permit 65.123.29.220 permit +65.154.166.0/24 permit 65.212.180.36 permit 66.102.0.0/20 permit 66.119.150.192/26 permit @@ -1283,6 +1287,9 @@ 117.120.16.0/21 permit 119.42.242.52/31 permit 119.42.242.156 permit +121.244.91.48 permit +121.244.91.52 permit +122.15.156.182 permit 123.126.78.64/29 permit 124.108.96.24/31 permit 124.108.96.28/31 permit @@ -1338,7 +1345,18 @@ 134.170.141.64/26 permit 134.170.143.0/24 permit 134.170.174.0/24 permit +135.84.80.0/24 permit +135.84.81.0/24 permit +135.84.82.0/24 permit +135.84.83.0/24 permit 135.84.216.0/22 permit +136.143.160.0/24 permit +136.143.161.0/24 permit +136.143.178.49 permit +136.143.182.0/23 permit +136.143.184.0/24 permit +136.143.188.0/24 permit +136.143.190.0/23 permit 136.147.128.0/20 permit 136.147.135.0/24 permit 136.147.176.0/20 permit @@ -1353,6 +1371,7 @@ 139.138.46.219 permit 139.138.57.55 permit 139.138.58.119 permit +139.167.79.86 permit 139.180.17.0/24 permit 141.148.159.229 permit 141.193.32.0/23 permit @@ -1452,7 +1471,9 @@ 163.114.132.120 permit 163.114.134.16 permit 163.114.135.16 permit +164.152.23.32 permit 164.177.132.168/30 permit +165.173.128.0/24 permit 166.78.68.0/22 permit 166.78.68.221 permit 166.78.69.169 permit @@ -1480,9 +1501,16 @@ 168.245.12.252 permit 168.245.46.9 permit 168.245.127.231 permit +169.148.129.0/24 permit +169.148.131.0/24 permit +169.148.142.10 permit +169.148.144.0/25 permit +169.148.144.10 permit 170.10.68.0/22 permit 170.10.128.0/24 permit 170.10.129.0/24 permit +170.10.132.56/29 permit +170.10.132.64/29 permit 170.10.133.0/24 permit 172.217.0.0/19 permit 172.217.32.0/20 permit @@ -1634,7 +1662,15 @@ 199.16.156.0/22 permit 199.33.145.1 permit 199.33.145.32 permit +199.34.22.36 permit 199.59.148.0/22 permit +199.67.80.2 permit +199.67.80.20 permit +199.67.82.2 permit +199.67.82.20 permit +199.67.84.0/24 permit +199.67.86.0/24 permit +199.67.88.0/24 permit 199.101.161.130 permit 199.101.162.0/25 permit 199.122.120.0/21 permit @@ -1691,6 +1727,8 @@ 204.92.114.187 permit 204.92.114.203 permit 204.92.114.204/31 permit +204.141.32.0/23 permit +204.141.42.0/23 permit 204.220.160.0/20 permit 204.232.168.0/24 permit 205.139.110.0/24 permit @@ -1942,6 +1980,8 @@ 2603:1030:20e:3::23c permit 2603:1030:b:3::152 permit 2603:1030:c02:8::14 permit +2607:13c0:0001:0000:0000:0000:0000:7000/116 permit +2607:13c0:0002:0000:0000:0000:0000:1000/116 permit 2607:f8b0:4000::/36 permit 2620:109:c003:104::/64 permit 2620:109:c003:104::215 permit diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php index c0517d845..31e158709 100644 --- a/data/web/inc/functions.mailbox.inc.php +++ b/data/web/inc/functions.mailbox.inc.php @@ -4699,6 +4699,9 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { } else if ($SaslLogs['service'] == 'pop3') { $last_pop3_login = strtotime($SaslLogs['datetime']); + } + else if ($SaslLogs['service'] == 'SSO') { + $last_sso_login = strtotime($SaslLogs['datetime']); } } if (!isset($last_imap_login) || $GLOBALS['SHOW_LAST_LOGIN'] === false) { @@ -4709,10 +4712,14 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { } if (!isset($last_pop3_login) || $GLOBALS['SHOW_LAST_LOGIN'] === false) { $last_pop3_login = 0; + } + if (!isset($last_sso_login) || $GLOBALS['SHOW_LAST_LOGIN'] === false) { + $last_sso_login = 0; } $mailboxdata['last_imap_login'] = $last_imap_login; $mailboxdata['last_smtp_login'] = $last_smtp_login; $mailboxdata['last_pop3_login'] = $last_pop3_login; + $mailboxdata['last_sso_login'] = $last_sso_login; if (!isset($_extra) || $_extra != 'reduced') { $rl = ratelimit('get', 'mailbox', $_data); diff --git a/data/web/js/site/mailbox.js b/data/web/js/site/mailbox.js index dfd7b9ef6..34ab963ff 100644 --- a/data/web/js/site/mailbox.js +++ b/data/web/js/site/mailbox.js @@ -893,7 +893,7 @@ jQuery(function($){ item.quota.value = humanFileSize(item.quota_used) + "/" + item.quota.value; item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox); - item.last_mail_login = item.last_imap_login + '/' + item.last_pop3_login + '/' + item.last_smtp_login; + item.last_mail_login = item.last_imap_login + '/' + item.last_pop3_login + '/' + item.last_smtp_login + '/' + item.last_sso_login; /* if (!item.rl) { item.rl = '∞'; @@ -1012,9 +1012,10 @@ jQuery(function($){ responsivePriority: 7, render: function (data, type) { res = data.split("/"); - return '
IMAP @ ' + unix_time_format(Number(res[0])) + '

' + - '
POP3 @ ' + unix_time_format(Number(res[1])) + '

' + - '
SMTP @ ' + unix_time_format(Number(res[2])) + '
'; + return '
IMAP @ ' + unix_time_format(Number(res[0])) + '

' + + '
POP3 @ ' + unix_time_format(Number(res[1])) + '

' + + '
SMTP @ ' + unix_time_format(Number(res[2])) + '

' + + '
SSO @ ' + unix_time_format(Number(res[3])) + '
'; } }, { @@ -2362,7 +2363,7 @@ jQuery(function($){ else $(tab).find(".table_collapse_option").hide(); } - + function filterByDomain(json, column, table){ var tableId = $(table.table().container()).attr('id'); // Create the `select` element @@ -2385,12 +2386,12 @@ jQuery(function($){ } }); }); - + // get unique domain list domains = domains.filter(function(value, index, array) { return array.indexOf(value) === index; }); - + // add domains to select domains.forEach(function(domain) { select.append($('')); diff --git a/data/web/lang/lang.cs-cz.json b/data/web/lang/lang.cs-cz.json index 89bb488c6..d28132721 100644 --- a/data/web/lang/lang.cs-cz.json +++ b/data/web/lang/lang.cs-cz.json @@ -28,7 +28,8 @@ "spam_score": "Skóre spamu", "syncjobs": "Synchronizační úlohy", "tls_policy": "Pravidla TLS", - "unlimited_quota": "Neomezené kvóty pro mailové schránky" + "unlimited_quota": "Neomezené kvóty pro mailové schránky", + "pw_reset": "Povolit obnovení hesla uživatele mailcow" }, "add": { "activate_filter_warn": "Pokud je zaškrtlá volba \"Aktivní\", budou všechny ostatní filtry deaktivovány.", @@ -346,7 +347,14 @@ "f2b_ban_time_increment": "Délka banu je prodlužována s každým dalším banem", "f2b_max_ban_time": "Maximální délka banu (s)", "cors_settings": "Nastavení CORS", - "queue_unban": "zrušit ban" + "queue_unban": "zrušit ban", + "password_reset_info": "Pokud není zadán žádný e-mail pro obnovení, nelze tuto funkci použít.", + "password_reset_settings": "Nastavení obnovení hesla", + "password_settings": "Nastavení hesel", + "password_reset_tmpl_html": "HTML šablona", + "password_reset_tmpl_text": "Textová šablona", + "reset_password_vars": "{{link}} Vygenerovaný odkaz pro obnovení hesla
{{username}} Název mailboxu uživatele, který požádal o resetování hesla.
{{username2}} Název schránky pro obnovení
{{date}} Datum podání žádosti o obnovení hesla
{{token_lifetime}} Délka životnosti tokenu v minutách
{{hostname}} Název serveru mailcow", + "restore_template": "Ponechte prázdné pro obnovení výchozí šablony." }, "danger": { "access_denied": "Přístup odepřen nebo jsou neplatná data ve formuláři", @@ -475,7 +483,10 @@ "webauthn_publickey_failed": "Pro vybraný ověřovací prostředek nebyl uložen žádný veřejný klíč", "webauthn_username_failed": "Zvolený ověřovací prostředek patří k jinému účtu", "extended_sender_acl_denied": "chybějící ACL pro nastavení externích adres odesílatele", - "demo_mode_enabled": "Demo režim je zapnutý" + "demo_mode_enabled": "Demo režim je zapnutý", + "recovery_email_failed": "Nepodařilo se odeslat e-mail pro obnovení. Obraťte se prosím na svého správce.", + "password_reset_invalid_user": "Mailbox nebyl nalezen nebo není nastaven žádný e-mail pro obnovu", + "password_reset_na": "Obnovení hesla není v současné době k dispozici. Obraťte se prosím na svého správce." }, "datatables": { "emptyTable": "Tabulka neobsahuje žádná data", @@ -672,12 +683,17 @@ "auth_user": "{= auth_user =} - Ověřené uživatelské jméno zadané MTA", "from_user": "{= from_user =} - uživatelská část odesílatele, např. pro \"moo@mailcow.tld\" vrátí \"moo\"", "from_domain": "{= from_domain =} - Doména odesílatele", - "from_addr": "{= from_addr =} - E-mailová adresa odesílatele" + "from_addr": "{= from_addr =} - E-mailová adresa odesílatele", + "custom": "{= foo =} - Pokud má schránka vlastní atribut „foo“ s hodnotou „bar“, vrátí „bar“" }, "domain_footer": "Patička pro celou doménu", "domain_footer_html": "HTML text", "domain_footer_plain": "Prostý text", - "pushover_sound": "Zvukové upozornění" + "pushover_sound": "Zvukové upozornění", + "custom_attributes": "Vlastní atributy", + "footer_exclude": "Vyloučit ze zápatí", + "domain_footer_skip_replies": "Ignorovat patičku u odpovědí na e-maily", + "password_recovery_email": "E-mail pro obnovu hesla" }, "fido2": { "confirm": "Potvrdit", @@ -733,7 +749,14 @@ "mobileconfig_info": "Ke stažení profilového souboru se přihlaste jako uživatel schránky.", "other_logins": "Přihlášení klíčem", "password": "Heslo", - "username": "Uživatelské jméno" + "username": "Uživatelské jméno", + "back_to_mailcow": "Zpět do mailcow", + "forgot_password": "> Zapomněli jste heslo?", + "invalid_pass_reset_token": "Token pro obnovení hesla je neplatný nebo jeho platnost vypršela.
Prosím, vyžádejte si nový odkaz pro obnovení hesla.", + "new_password": "Nové heslo", + "new_password_confirm": "Ověření nového hesla", + "reset_password": "Obnovit heslo", + "request_reset_password": "Požádat o změnu hesla" }, "mailbox": { "action": "Akce", @@ -1081,7 +1104,8 @@ "verified_webauthn_login": "WebAuthn přihlášení ověřeno", "verified_yotp_login": "Yubico OTP přihlášení ověřeno", "cors_headers_edited": "Nastavení CORS byla uložena", - "domain_footer_modified": "Změny patičky domény %s byly uloženy" + "domain_footer_modified": "Změny patičky domény %s byly uloženy", + "recovery_email_sent": "E-mail k obnovení byl odeslán na adresu %s" }, "tfa": { "api_register": "%s používá Yubico Cloud API. Prosím získejte API klíč pro své Yubico ZDE", @@ -1268,7 +1292,9 @@ "with_app_password": "s heslem aplikace", "year": "rok", "years": "let", - "pushover_sound": "Zvukové upozornění" + "pushover_sound": "Zvukové upozornění", + "password_reset_info": "Pokud není zadán e-mail pro obnovení hesla, nelze tuto funkci použít.", + "pw_recovery_email": "E-mail pro obnovení hesla" }, "warning": { "cannot_delete_self": "Nelze smazat právě přihlášeného uživatele", diff --git a/data/web/lang/lang.fi-fi.json b/data/web/lang/lang.fi-fi.json index d4a5a08ba..9b3cc8488 100644 --- a/data/web/lang/lang.fi-fi.json +++ b/data/web/lang/lang.fi-fi.json @@ -267,7 +267,11 @@ "upload": "Lataa", "username": "Käyttäjätunnus", "validate_license_now": "Vahvista GUID-tunnus lisenssi palvelinta vastaan", - "yes": "✓" + "yes": "✓", + "allowed_methods": "Kulunvalvonta-salli-menetelmät", + "admins": "Järjestelmänvalvojat", + "admins_ldap": "LDAP-ylläpitäjät", + "advanced_settings": "Lisäasetukset" }, "danger": { "access_denied": "Käyttö estetty tai lomake tiedot eivät kelpaa", diff --git a/data/web/lang/lang.fr-fr.json b/data/web/lang/lang.fr-fr.json index aed9ec567..d87632c68 100644 --- a/data/web/lang/lang.fr-fr.json +++ b/data/web/lang/lang.fr-fr.json @@ -28,7 +28,8 @@ "unlimited_quota": "Quota illimité pour les boîtes de réception", "domain_desc": "Modifier la description du domaine", "domain_relayhost": "Changer le relais pour un domaine", - "mailbox_relayhost": "Changer le relais d’une boîte de réception" + "mailbox_relayhost": "Changer le relais d’une boîte de réception", + "pw_reset": "Autoriser la réinitialisation du mot de passe de l'utilisateur" }, "add": { "activate_filter_warn": "Tous les autres filtres seront désactivés, quand activé est coché.", @@ -343,7 +344,15 @@ "f2b_manage_external": "Gérer Fail2Ban en externe", "transport_test_rcpt_info": "• ; Utilisez null@hosted.mailcow.de pour tester le relais vers une destination étrangère.", "relay_rcpt": "Adresse \"À :\"", - "is_mx_based": "Basé sur MX" + "is_mx_based": "Basé sur MX", + "password_reset_info": "Si aucune adresse de messagerie de récupération n'est fournie, cette fonction ne peut pas être utilisée.", + "password_settings": "Paramètres des mots de passe", + "reset_password_vars": "{{link}} Le lien généré pour la réinitialisation du mot de passe
{{username}} L'adresse de la boîte mail de l'utilisateur qui a demandé la réinitialisation du mot de passe ayant un compte mailcow
{{username2}} L'adresse de la boîte mail de récupération
{{date}} La date à laquelle la demande de réinitialisation du mot de passe a été faite
{{token_lifetime}} La durée de vie du jeton en minutes
{{hostname}} Le nom d'hôte de votre serveur mailcow", + "password_reset_settings": "Paramètres de récupération des mots de passe", + "password_reset_tmpl_html": "Modèle HTML", + "password_reset_tmpl_text": "Modèle en texte", + "restore_template": "Laisser vide pour restaurer le modèle par défaut.", + "admins_ldap": "Si aucune adresse de messagerie de récupération n'est fournie, cette fonction ne peut pas être utilisée." }, "danger": { "access_denied": "Accès refusé ou données de formulaire non valides", @@ -474,7 +483,13 @@ "cors_invalid_method": "Allow-Method specifiée invalide", "cors_invalid_origin": "Allow-Origin spécifiée invalide", "extended_sender_acl_denied": "ACL manquante pour définir les adresses des expéditeurs externes", - "webauthn_username_failed": "L'authentificateur sélectionné appartient à un autre compte" + "webauthn_username_failed": "L'authentificateur sélectionné appartient à un autre compte", + "recovery_email_failed": "Impossible d'envoyer un email de réinitialisation. Veuillez contacter votre administrateur.", + "invalid_reset_token": "Jeton de réinitialisation invalide", + "password_reset_invalid_user": "Boîte mail introuvable ou aucune adresse de récupération n'a été définie", + "password_reset_na": "La réinitialisation des mots de passe est actuellement indisponible. Veuillez contacter votre administrateur.", + "reset_token_limit_exceeded": "Le nombre limite de jetons de réinitialisation a été dépassé. Veuillez réessayer plus tard.", + "to_invalid": "Le destinataire ne doit pas être vide" }, "debug": { "chart_this_server": "Graphique (ce serveur)", @@ -641,8 +656,9 @@ "none_inherit": "Aucun / Héritage", "quota_warning_bcc": "Avertissement sur les quotas BCC", "quota_warning_bcc_info": "Les avertissements seront envoyés en copies séparées aux destinataires suivants. Le sujet sera précédé du nom d'utilisateur correspondant entre parenthèses, par exemple : Avertissement sur les quotas (user@example.com).", - "sogo_access_info": "L'authentification unique à partir de l'interface de messagerie reste opérationnelle. Ce paramètre n'affecte pas l'accès à tous les autres services et ne supprime ni ne modifie le profil SOGo existant d'un utilisateur.", - "admin": "Modifier l'administrateur" + "sogo_access_info": "L'authentification unique à partir de l'interface de messagerie reste opérationnelle. Ce paramètre n'affecte pas l'accès à tous les autres services et ne supprime ni, ne modifie le profil SOGo existant d'un utilisateur.", + "admin": "Modifier l'administrateur", + "password_recovery_email": "Adresse email de récupération" }, "footer": { "cancel": "Annuler", @@ -681,7 +697,14 @@ "mobileconfig_info": "Veuillez vous connecter en tant qu’utilisateur de la boîte de réception pour télécharger le profil de connexion Apple demandé.", "other_logins": "Clé d'authentification", "password": "Mot de passe", - "username": "Nom d'utilisateur" + "username": "Nom d'utilisateur", + "back_to_mailcow": "Revenir sur mailcow", + "forgot_password": "> Mot de passe oublié ?", + "invalid_pass_reset_token": "Le jeton de réinitialisation du mot de passe est invalide ou a expiré.
Veuillez demander un nouveau lien de réinitialisation de mot de passe.", + "new_password": "Nouveau mot de passe", + "new_password_confirm": "Confirmer le nouveau mot de passe", + "reset_password": "Réinitialiser le mot de passe", + "request_reset_password": "Demander le changement du mot de passe" }, "mailbox": { "action": "Action", @@ -1004,7 +1027,9 @@ "template_added": "Modèles ajoutés %s", "template_removed": "Le modèle ayant l'ID %s a été supprimé", "domain_add_dkim_available": "A DKIM key did already exist", - "ip_check_opt_in_modified": "Le contrôle de l'IP a été enregistré avec succès" + "ip_check_opt_in_modified": "Le contrôle de l'IP a été enregistré avec succès", + "password_changed_success": "Le mot de passe a été modifié avec succès", + "recovery_email_sent": "Email de réinitialisation envoyé à %s" }, "tfa": { "api_register": "%s utilise l'API Yubico Cloud. Veuillez obtenir une clé API pour votre clé ici", @@ -1202,7 +1227,9 @@ "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Nom d'utilisateur ou mot de passe incorrect", "value": "Valeur", "allowed_protocols": "Protocoles autorisés", - "mailbox": "Boîte de réception" + "mailbox": "Boîte de réception", + "password_reset_info": "Si aucun email pour la récupération du mot de passe n'est fourni, cette fonction ne peut pas être utilisée.", + "pw_recovery_email": "Email de récupération pour son mot de passe" }, "warning": { "cannot_delete_self": "Impossible de supprimer l’utilisateur connecté", @@ -1234,7 +1261,8 @@ "lengthMenu": "Afficher les entrées _MENU_", "loadingRecords": "Chargement…", "processing": "Veuillez patienter…", - "collapse_all": "Tout réduire" + "collapse_all": "Tout réduire", + "info": "Affichage de _START_ de _END_ sur _TOTAL_ entrées" }, "ratelimit": { "disabled": "Désactivé" diff --git a/data/web/lang/lang.it-it.json b/data/web/lang/lang.it-it.json index b598492c9..45fabc8eb 100644 --- a/data/web/lang/lang.it-it.json +++ b/data/web/lang/lang.it-it.json @@ -28,7 +28,8 @@ "spam_score": "Punteggio SPAM", "syncjobs": "Processi di sync", "tls_policy": "Politica TLS", - "unlimited_quota": "Spazio illimitato per le caselle di posta" + "unlimited_quota": "Spazio illimitato per le caselle di posta", + "pw_reset": "Permettere di reimpostare la password dell'utente mailcow" }, "add": { "activate_filter_warn": "Tutti gli altri filtri saranno disattivati, quando è attivo.", @@ -116,7 +117,7 @@ "activate_api": "Attiva API", "activate_send": "Attiva bottone di invio", "active": "Attiva", - "active_rspamd_settings_map": "Active settings map", + "active_rspamd_settings_map": "Mappa delle impostazioni attive", "add": "Aggiungi", "add_admin": "Aggiungi amministratore", "add_domain_admin": "Aggiungi amministratore di dominio", @@ -124,7 +125,7 @@ "add_relayhost": "Add sender-dependent transport", "add_relayhost_hint": "Tieni presente che i dati di autenticazione, se presenti, verranno archiviati come testo semplice.", "add_row": "Aggiungi riga", - "add_settings_rule": "Add settings rule", + "add_settings_rule": "Aggiungi regola delle impostazioni", "add_transport": "Aggiungi transport", "add_transports_hint": "Tieni presente che i dati di autenticazione, se presenti, verranno archiviati come testo semplice.", "additional_rows": " righe aggiuntive inserite", @@ -134,7 +135,7 @@ "admins": "Amministratori", "admins_ldap": "Amministratori LDAP", "advanced_settings": "Impostazioni avanzate", - "api_allow_from": "Allow API access from these IPs/CIDR network notations", + "api_allow_from": "Consenti l'accesso API da questi indirizzi IP/notazione di rete CIDR", "api_info": "Questa API è in modifica. La documentazione può essere trovata su /api", "api_key": "Chiave API", "api_skip_ip_check": "Salta il controllo dell'IP per l'API", @@ -156,7 +157,7 @@ "dkim_domains_selector": "Selettore", "dkim_domains_wo_keys": "Seleziona i domini senza chiavi", "dkim_from": "Da", - "dkim_from_title": "Source domain to copy data from", + "dkim_from_title": "Dominio di origine da cui copiare i dati", "dkim_key_length": "Lunghezza chiave DKIM (bits)", "dkim_key_missing": "Chiave mancante", "dkim_key_unused": "Chiave non usata", @@ -182,8 +183,8 @@ "f2b_list_info": "Un host oppure una rete in blacklist, avrà sempre un peso maggiore rispetto ad una in whitelist. L'aggiornamento della lista richiede alcuni secondi per la sua entrata in azione.", "f2b_max_attempts": "Tentativi massimi", "f2b_max_ban_time": "Tempo massimo di blocco (s)", - "f2b_netban_ipv4": "IPv4 subnet size to apply ban on (8-32)", - "f2b_netban_ipv6": "IPv6 subnet size to apply ban on (8-128)", + "f2b_netban_ipv4": "Dimensione della subnet IPv4 su cui applicare il blocco (8-32)", + "f2b_netban_ipv6": "Dimensione della subnet IPv6 su cui applicare il blocco (8-128)", "f2b_parameters": "Parametri Fail2ban", "f2b_regex_info": "Log presi in considerazione: SOGo, Postfix, Dovecot, PHP-FPM.", "f2b_retry_window": "Retry window (s) for max. attempts", @@ -219,16 +220,16 @@ "merged_vars_hint": "Greyed out rows were merged from vars.(local.)inc.php and cannot be modified.", "message": "Messaggio", "message_size": "Dimensione mesaggio", - "nexthop": "Next hop", + "nexthop": "Prossimo hop", "no": "✕", "no_active_bans": "Nessun ban attivo", "no_new_rows": "Nessuna ulteriore riga disponibile", "no_record": "Nessun risultato", "oauth2_client_id": "ID cliente", - "oauth2_client_secret": "Client secret", + "oauth2_client_secret": "Chiave segreta del client", "oauth2_info": "The OAuth2 implementation supports the grant type \"Authorization Code\" and issues refresh tokens.
\r\nThe server also automatically issues new refresh tokens, after a refresh token has been used.

\r\n• The default scope is profile. Only mailbox users can be authenticated against OAuth2. If the scope parameter is omitted, it falls back to profile.
\r\n• The state parameter is required to be sent by the client as part of the authorize request.

\r\nPaths for requests to the OAuth2 API:
\r\n\r\nRegenerating the client secret will not expire existing authorization codes, but they will fail to renew their token.

\r\nRevoking client tokens will cause immediate termination of all active sessions. All clients need to re-authenticate.", "oauth2_redirect_uri": "URI di reindirizzamento", - "oauth2_renew_secret": "Generate new client secret", + "oauth2_renew_secret": "Genera una nuova chiave segreta per il client", "oauth2_revoke_tokens": "Revoca tutti i token del client", "optional": "facoltativo", "password": "Password", @@ -269,7 +270,7 @@ "recipients": "Destinatari", "refresh": "Aggiorna", "regen_api_key": "Rinnova la chiave delle API", - "regex_maps": "Regex maps", + "regex_maps": "Mappe Regex", "relay_from": "\"Da:\" indirizzi", "relay_rcpt": "\"A:\" indirizzi", "relay_run": "Esegui test", @@ -286,7 +287,7 @@ "rsetting_no_selection": "Seleziona una regola", "rsetting_none": "Nessuna regola presente", "rsettings_insert_preset": "Insert example preset \"%s\"", - "rsettings_preset_1": "Disable all but DKIM and rate limit for authenticated users", + "rsettings_preset_1": "Disattivare tutto tranne DKIM e il limite di velocità per gli utenti autenticati", "rsettings_preset_2": "I postmaster vogliono lo spam", "rsettings_preset_3": "Consenti solo mittenti specifici per una casella di posta (ad esempio: utilizzo solo come casella di posta interna)", "rspamd_com_settings": "A setting name will be auto-generated, please see the example presets below. For more details see Rspamd docs", @@ -341,7 +342,18 @@ "rsettings_preset_4": "Disattivare Rspamd per un dominio", "options": "Opzioni", "cors_settings": "Impostazioni CORS", - "copy_to_clipboard": "Testo copiato negli appunti!" + "copy_to_clipboard": "Testo copiato negli appunti!", + "f2b_manage_external": "Gestione esterna di Fail2Ban", + "password_reset_info": "Se non viene fornita alcuna e-mail di recupero, questa funzione non può essere utilizzata.", + "password_reset_tmpl_text": "Template testuale", + "logo_dark_label": "Invertito per la modalità scura", + "ip_check": "Controllo IP", + "password_reset_settings": "Impostazioni per il recupero della password", + "password_reset_tmpl_html": "Template HTML", + "password_settings": "Impostazioni della password", + "queue_unban": "sblocca", + "restore_template": "Lasciare vuoto per ripristinare il modello predefinito.", + "logo_normal_label": "Normale" }, "danger": { "access_denied": "Accesso negato o form di login non corretto", @@ -466,7 +478,13 @@ "template_exists": "Il template %s esiste già", "template_id_invalid": "Il template con ID %s non è valido", "img_dimensions_exceeded": "L'immagine supera la dimensione massima consentita", - "img_size_exceeded": "L'immagine supera la dimensione massima del file" + "img_size_exceeded": "L'immagine supera la dimensione massima del file", + "extended_sender_acl_denied": "Autorizzazioni ACL mancanti per configurare indirizzi esterni come mittente", + "invalid_reset_token": "Token di reset non valido", + "password_reset_invalid_user": "La casella di posta elettronica non è stata trovata o non è stata impostata un'e-mail di recupero", + "password_reset_na": "Il recupero della password non è attualmente disponibile. Contattare l'amministratore.", + "recovery_email_failed": "Impossibile inviare un'e-mail di recupero. Contattare l'amministratore.", + "to_invalid": "Il destinatario non deve essere vuoto" }, "debug": { "chart_this_server": "Grafico (questo server)", @@ -503,7 +521,11 @@ "memory": "Memoria", "timezone": "Fuso orario", "no_update_available": "Il sistema è aggiornato all'ultima versione", - "update_failed": "Impossibile verificare la presenza di un aggiornamento" + "update_failed": "Impossibile verificare la presenza di un aggiornamento", + "architecture": "Architettura", + "error_show_ip": "Impossibile risolvere gli indirizzi IP pubblici", + "show_ip": "Mostra IP pubblico", + "wip": "Attualmente in lavorazione" }, "diagnostics": { "cname_from_a": "Valore letto dal record A/AAAA. Questo è supportato finché il record punta alla risorsa corretta.", @@ -632,7 +654,11 @@ "last_modified": "Ultima modifica", "pushover_sound": "Suono", "custom_attributes": "Attributi personalizzati", - "domain_footer_skip_replies": "Ignora il piè di pagina nelle e-mail di risposta" + "domain_footer_skip_replies": "Ignora il piè di pagina nelle e-mail di risposta", + "domain_footer_html": "Piè di pagina HTML", + "domain_footer_plain": "Piè di pagina PLAIN", + "footer_exclude": "Escludi dal piè di pagina", + "password_recovery_email": "E-mail di recupero password" }, "fido2": { "confirm": "Conferma", @@ -688,7 +714,13 @@ "mobileconfig_info": "Please login as mailbox user to download the requested Apple connection profile.", "other_logins": "Key login", "password": "Password", - "username": "Nome utente" + "username": "Nome utente", + "request_reset_password": "Richiesta di modifica della password", + "back_to_mailcow": "Torna a mailcow", + "forgot_password": "> Password dimenticata?", + "new_password": "Nuova password", + "new_password_confirm": "Conferma la nuova password", + "reset_password": "Ripristino della password" }, "mailbox": { "action": "Azione", @@ -939,7 +971,9 @@ "show_message": "Mostra messaggio", "unhold_mail": "Sblocca", "hold_mail_legend": "Blocca le mail selezionate. (Previene ulteriori tentativi di consegna)", - "legend": "Funzioni delle azioni della coda di posta:" + "legend": "Funzioni delle azioni della coda di posta:", + "unban": "Coda di sblocco", + "unhold_mail_legend": "Rilascia le mail selezionate per la consegna. (Richiede una prenotazione preventiva)" }, "start": { "help": "Mostra/Nascondi pannello di aiuto", @@ -1028,7 +1062,12 @@ "template_added": "Aggiunto template %s", "template_modified": "Le modifiche al template %s sono state salvate", "template_removed": "Il template con ID %s è stato cancellato", - "f2b_banlist_refreshed": "L'ID della lista blocchi è stato aggiornato con successo." + "f2b_banlist_refreshed": "L'ID della lista blocchi è stato aggiornato con successo.", + "domain_footer_modified": "Le modifiche al piè di pagina del dominio %s sono state salvate", + "cors_headers_edited": "Le impostazioni CORS sono state salvate", + "ip_check_opt_in_modified": "Il controllo dell'indirizzo IP è stato salvato con successo", + "password_changed_success": "La password è stata modificata con successo", + "recovery_email_sent": "Email di recupero inviata a %s" }, "tfa": { "api_register": "%s usa le API Yubico Cloud. Richiedi una chiave API qui", @@ -1220,7 +1259,9 @@ "direct_protocol_access": "Questo utente della mailbox ha accesso diretto ed esterno ai seguenti protocolli e applicazioni. Questa impostazione è controllata dal tuo amministratore. Le password delle applicazioni possono essere create per garantire l'accesso ai singoli protocolli e applicazioni.
Il pulsante \"Accedi alla webmail\" fornisce un singolo accesso a SOGo ed è sempre disponibile.", "pushover_sound": "Suono", "attribute": "Attributo", - "value": "Valore" + "value": "Valore", + "password_reset_info": "Se non viene fornita alcuna e-mail per il recupero della password, questa funzione non può essere utilizzata.", + "pw_recovery_email": "Email di recupero password" }, "warning": { "cannot_delete_self": "Cannot delete logged in user", @@ -1264,6 +1305,7 @@ "aria": { "sortAscending": ": attivare l'ordinamento crescente delle colonne", "sortDescending": ": attivare l'ordinamento decrescente delle colonne" - } + }, + "decimal": "." } } diff --git a/data/web/lang/lang.pt-br.json b/data/web/lang/lang.pt-br.json index a3e07406f..1059ba994 100644 --- a/data/web/lang/lang.pt-br.json +++ b/data/web/lang/lang.pt-br.json @@ -28,7 +28,8 @@ "spam_score": "Pontuação de spam", "syncjobs": "Trabalhos de sincronização", "tls_policy": "Política de TLS", - "unlimited_quota": "Cota ilimitada para mailboxes" + "unlimited_quota": "Cota ilimitada para mailboxes", + "pw_reset": "Permite redefinir a senha do usuário" }, "add": { "activate_filter_warn": "Todos os outros filtros serão desativados quando a opção ativa estiver marcada.", diff --git a/data/web/lang/lang.ru-ru.json b/data/web/lang/lang.ru-ru.json index 5c02d7c94..928d80b9e 100644 --- a/data/web/lang/lang.ru-ru.json +++ b/data/web/lang/lang.ru-ru.json @@ -28,7 +28,8 @@ "spam_score": "Политика фильтрации спама", "syncjobs": "Задания синхронизации", "tls_policy": "Политика шифрования", - "unlimited_quota": "Неограниченная квота для почтовых ящиков" + "unlimited_quota": "Неограниченная квота для почтовых ящиков", + "pw_reset": "Разрешить сброс пароля пользователей mailcow" }, "add": { "activate_filter_warn": "Активация этого фильтра отключит все остальные фильтры этого типа.", diff --git a/data/web/lang/lang.uk-ua.json b/data/web/lang/lang.uk-ua.json index bb335b459..e800b0fd5 100644 --- a/data/web/lang/lang.uk-ua.json +++ b/data/web/lang/lang.uk-ua.json @@ -28,13 +28,14 @@ "app_passwds": "Паролі додатків", "domain_relayhost": "Змінити relayhost для домену", "login_as": "Увійти як користувач поштової скриньки", - "sogo_profile_reset": "Скинути профіль SOGo" + "sogo_profile_reset": "Скинути профіль SOGo", + "pw_reset": "Скидання паролю користувача" }, "add": { "app_name": "Назва додатка", "app_password": "Додати пароль додатка", "app_passwd_protocols": "Дозволені протоколи для пароля додатка", - "comment_info": "Приватний коментар не видно користувачам, а публічний – відображається поряд із псевдонімом в особистому кабінеті користувача.", + "comment_info": "Приватний коментар не видно користувачам, а публічний – відображається поряд із псевдонімом в особистому кабінеті користувача", "custom_params": "Налаштування користувача", "gal": "GAL - Глобальна адресна книга", "mailbox_quota_m": "Максимальна квота поштового акаунту (MiB)", @@ -77,7 +78,7 @@ "password_repeat": "Підтвердження пароля (повтор)", "post_domain_add": "Після додавання нового домену контейнер SOGo (\"sogo-mailcow\") необхідно перезапустити!

Крім того, слід перевірити конфігурацію DNS доменів. Після затвердження конфігурації DNS перезапустіть контейнер \"acme-mailcow\", щоб автоматично згенерувати сертифікати для вашого нового домену.
Цей крок не є обов'язковим і повторюватиметься кожні 24 години.", "relay_all_info": "Якщо ви вирішите не ретранслювати всіх одержувачів, вам потрібно буде додати (\"сліпу\") поштову адресу для кожного одержувача, якого слід ретранслювати.", - "relay_transport_info": "
Інфо
Ви можете налаштувати власний транспорт для домену. Якщо такої установки немає, то доставка буде виконана на основі MX-записів.", + "relay_transport_info": "
Інфо
Ви можете налаштувати власний транспорт для домену. Якщо такої установки немає, то доставка буде виконана на основі MX-записів.", "relayhost_wrapped_tls_info": "Будь ласка, не використовуйте TLS порти (в основному це 465 порт).
\nВикористовуйте будь-який не порт TLS, який підтримує STARTTLS. А для захисту від downgrate атак - налаштуйте примусову політику TLS.", "syncjob_hint": "Паролі до вашого акаунту будуть збережені на сервері у вигляді простого тексту!", "timeout1": "Тайм-аут для підключення до віддаленого хоста", @@ -299,7 +300,7 @@ "api_allow_from": "Список IP-адрес для доступу до API (розділених комою або новим рядком)", "api_skip_ip_check": "Пропустити перевірку IP для API", "arrival_time": "Время получения (час. пояс сервера)", - "ban_list_info": "Список заблокованих IP-адрес: підмережа (час, що залишився) - [дія].
IP-адреси, що знаходяться в черзі на розблокування, будуть видалені зі списку активних блокувань протягом декількох секунд.
/>Червона мітка означає, що підмережа/хост знаходиться в чорному списку.", + "ban_list_info": "Список заблокованих IP-адрес: підмережа (час, що залишився) - [дія].
IP-адреси, що знаходяться в черзі на розблокування, будуть видалені зі списку активних блокувань протягом декількох секунд.
Червона мітка означає, що підмережа/хост знаходиться в чорному списку.", "credentials_transport_warning": "Попередження: додавання нового запису перезапише облікові дані для всіх записів з таким самим наступним хостом.", "dkim_to_title": "Цільовий домен(и) (DKIM буде перезаписаний)", "duplicate_dkim": "Копіювання DKIM запису", @@ -349,7 +350,13 @@ "queue_unban": "розблокувати", "f2b_manage_external": "Керування Fail2Ban ззовні", "f2b_manage_external_info": "Fail2ban буде підтримувати список заборонених, але не буде активно встановлювати правила для блокування трафіку. Використовуйте згенерований список заборон нижче для зовнішнього блокування трафіку.", - "copy_to_clipboard": "Текст скопійовано в буфер обміну!" + "copy_to_clipboard": "Текст скопійовано в буфер обміну!", + "password_reset_tmpl_text": "Plain-text шаблон", + "password_reset_info": "Якщо електронну адресу для відновлення не надано, ця функція не може бути використана.", + "logo_dark_label": "Темна тема", + "password_reset_settings": "Налаштування відновлення паролів", + "password_reset_tmpl_html": "HTML шаблон", + "logo_normal_label": "Світла тема" }, "danger": { "alias_domain_invalid": "Неприпустимий псевдонім домену: %s", @@ -479,7 +486,8 @@ "template_exists": "Шаблон %s вже існує", "template_id_invalid": "Ідентифікатор шаблону %s недійсний", "template_name_invalid": "Ім'я шаблону невірне", - "img_size_exceeded": "Зображення перевищує максимальний розмір файлу" + "img_size_exceeded": "Зображення перевищує максимальний розмір файлу", + "img_dimensions_exceeded": "Зображення перевищує максимальний розмір" }, "debug": { "chart_this_server": "Діаграма (цей сервер)", @@ -661,7 +669,8 @@ }, "domain_footer_html": "Нижній колонтитул HTML", "domain_footer_plain": "ЗВИЧАЙНИЙ нижній колонтитул", - "custom_attributes": "Користувацькі атрибути" + "custom_attributes": "Користувацькі атрибути", + "domain_footer_skip_replies": "Ігнорувати нижній колонтитул у листах-відповідях" }, "fido2": { "confirm": "Підтвердити", @@ -1068,7 +1077,8 @@ "cors_headers_edited": "Налаштування CORS збережено", "ip_check_opt_in_modified": "Перевірка IP-адреси успішно збережено", "template_removed": "Шаблону із ID %s видалено", - "f2b_banlist_refreshed": "Ідентифікатор списку заборонених успішно оновлено." + "f2b_banlist_refreshed": "Ідентифікатор списку заборонених успішно оновлено.", + "domain_footer_modified": "Зміни в нижньому колонтитулі домену %s збережено" }, "tfa": { "confirm": "Підтвердьте", @@ -1095,7 +1105,8 @@ "set_tfa": "Встановити метод двофакторної перевірки", "u2f_deprecated": "Схоже, ваш ключ був зареєстрований за допомогою застарілого методу U2F. Ми дезактивуємо двофакторну автентифікацію для вас і видалимо ваш ключ.", "waiting_usb_auth": "Очікування пристрою USB...

Будь ласка, натисніть зараз кнопку на USB пристрої.", - "waiting_usb_register": "Очікування USB-пристрою...

Будь ласка, введіть пароль вище та підтвердіть реєстрацію, натиснувши кнопку на USB пристрої." + "waiting_usb_register": "Очікування USB-пристрою...

Будь ласка, введіть пароль вище та підтвердіть реєстрацію, натиснувши кнопку на USB пристрої.", + "authenticators": "Аутентифікатори" }, "user": { "action": "Дії", diff --git a/docker-compose.yml b/docker-compose.yml index 348340c23..428e68b6f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -84,6 +84,7 @@ services: stop_grace_period: 30s depends_on: - dovecot-mailcow + - clamd-mailcow environment: - TZ=${TZ} - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} @@ -111,7 +112,7 @@ services: - rspamd php-fpm-mailcow: - image: mailcow/phpfpm:1.89 + image: mailcow/phpfpm:1.90 command: "php-fpm -d date.timezone=${TZ} -d expose_php=0" depends_on: - redis-mailcow @@ -191,7 +192,7 @@ services: - phpfpm sogo-mailcow: - image: mailcow/sogo:nightly-20240819 + image: mailcow/sogo:nightly-20240905 environment: - DBNAME=${DBNAME} - DBUSER=${DBUSER} @@ -571,7 +572,7 @@ services: aliases: - dockerapi - + ##### Will be removed soon ##### solr-mailcow: image: mailcow/solr:1.8.3 diff --git a/update.sh b/update.sh index dcc2020eb..fe8aee72f 100755 --- a/update.sh +++ b/update.sh @@ -360,6 +360,21 @@ while (($#)); do exit 3 fi ;; + --check-tags) + echo "Checking remote tags for updates..." + LATEST_TAG_REV=$(git ls-remote --exit-code --quiet --tags origin | tail -1 | cut -f1) + if [ "$?" -ne 0 ]; then + echo "A problem occurred while trying to fetch the latest tag from github." + exit 99 + fi + if [[ -z $(git log HEAD --pretty=format:"%H" | grep "${LATEST_TAG_REV}") ]]; then + echo -e "New tag is available.\nThe changes can be found here: https://github.com/mailcow/mailcow-dockerized/releases/latest" + exit 0 + else + echo "No updates available." + exit 3 + fi + ;; --ours) MERGE_STRATEGY=ours ;; @@ -396,9 +411,10 @@ while (($#)); do DEV=y ;; --help|-h) - echo './update.sh [-c|--check, --ours, --gc, --nightly, --prefetch, --skip-start, --skip-ping-check, --stable, -f|--force, -d|--dev, -h|--help] + echo './update.sh [-c|--check, --check-tags, --ours, --gc, --nightly, --prefetch, --skip-start, --skip-ping-check, --stable, -f|--force, -d|--dev, -h|--help] -c|--check - Check for updates and exit (exit codes => 0: update available, 3: no updates) + --check-tags - Check for newer tags and exit (exit codes => 0: newer tag available, 3: no newer tag) --ours - Use merge strategy option "ours" to solve conflicts in favor of non-mailcow code (local changes over remote changes), not recommended! --gc - Run garbage collector to delete old image tags --nightly - Switch your mailcow updates to the unstable (nightly) branch. FOR TESTING PURPOSES ONLY!!!!