Browse Source

Merge branch 'staging' into nightly

FreddleSpl0it 1 năm trước cách đây
mục cha
commit
0d2046baeb

+ 1 - 1
.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

+ 11 - 2
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

+ 2 - 0
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

+ 42 - 2
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

+ 7 - 0
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);

+ 8 - 7
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 '<div class="badge bg-info mb-2">IMAP @ ' + unix_time_format(Number(res[0])) + '</div><br>' +
-              '<div class="badge bg-info mb-2">POP3 @ ' + unix_time_format(Number(res[1])) + '</div><br>' +
-              '<div class="badge bg-info">SMTP @ ' + unix_time_format(Number(res[2])) + '</div>';
+            return '<div class="text-start badge bg-info mb-2" style="min-width: 70px;">IMAP @ ' + unix_time_format(Number(res[0])) + '</div><br>' +
+              '<div class="text-start badge bg-info mb-2" style="min-width: 70px;">POP3 @ ' + unix_time_format(Number(res[1])) + '</div><br>' +
+              '<div class="text-start badge bg-info mb-2" style="min-width: 70px;">SMTP @ ' + unix_time_format(Number(res[2])) + '</div><br>' +
+              '<div class="text-start badge bg-info" style="min-width: 70px;">SSO @ ' + unix_time_format(Number(res[3])) + '</div>';
           }
         },
         {
@@ -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($('<option>' + domain + '</option>'));

+ 34 - 8
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": "<code>{{link}}</code> Vygenerovaný odkaz pro obnovení hesla<br><code>{{username}}</code> Název mailboxu uživatele, který požádal o resetování hesla.<br><code>{{username2}}</code> Název schránky pro obnovení<br><code>{{date}}</code> Datum podání žádosti o obnovení hesla<br><code>{{token_lifetime}}</code> Délka životnosti tokenu v minutách<br><code>{{hostname}}</code> 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.<br>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 <a href=\"https://upgrade.yubico.com/getapikey/\" target=\"_blank\">ZDE</a>",
@@ -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",

+ 5 - 1
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": "&#10003;"
+        "yes": "&#10003;",
+        "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",

+ 37 - 9
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": "&#8226 ; 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": "<code>{{link}}</code> Le lien généré pour la réinitialisation du mot de passe<br><code>{{username}}</code> L'adresse de la boîte mail de l'utilisateur qui a demandé la réinitialisation du mot de passe ayant un compte mailcow<br><code>{{username2}}</code> L'adresse de la boîte mail de récupération<br><code>{{date}}</code> La date à laquelle la demande de réinitialisation du mot de passe a été faite<br><code>{{token_lifetime}}</code> La durée de vie du jeton en minutes<br><code>{{hostname}}</code> 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 : <code>Avertissement sur les quotas (user@example.com)</code>.",
-        "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é.<br>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é <a href=\"https://upgrade.yubico.com/getapikey/\" target=\"_blank\">ici</a>",
@@ -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é"

+ 63 - 21
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 <a href=\"/api\">/api</a>",
         "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. <b>L'aggiornamento della lista richiede alcuni secondi per la sua entrata in azione.</b>",
         "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 <code>vars.(local.)inc.php</code> and cannot be modified.",
         "message": "Messaggio",
         "message_size": "Dimensione mesaggio",
-        "nexthop": "Next hop",
+        "nexthop": "Prossimo hop",
         "no": "&#10005;",
         "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.<br>\r\nThe server also automatically issues new refresh tokens, after a refresh token has been used.<br><br>\r\n&#8226; The default scope is <i>profile</i>. Only mailbox users can be authenticated against OAuth2. If the scope parameter is omitted, it falls back to <i>profile</i>.<br>\r\n&#8226; The <i>state</i> parameter is required to be sent by the client as part of the authorize request.<br><br>\r\nPaths for requests to the OAuth2 API: <br>\r\n<ul>\r\n  <li>Authorization endpoint: <code>/oauth/authorize</code></li>\r\n  <li>Token endpoint: <code>/oauth/token</code></li>\r\n  <li>Resource page:  <code>/oauth/profile</code></li>\r\n</ul>\r\nRegenerating the client secret will not expire existing authorization codes, but they will fail to renew their token.<br><br>\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 <a href=\"https://rspamd.com/doc/configuration/settings.html#settings-structure\" target=\"_blank\">Rspamd docs</a>",
@@ -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 <a href=\"https://upgrade.yubico.com/getapikey/\" target=\"_blank\">qui</a>",
@@ -1220,7 +1259,9 @@
         "direct_protocol_access": "Questo utente della mailbox ha <b>accesso diretto ed esterno</b> 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.<br>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": "."
     }
 }

+ 2 - 1
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.",

+ 2 - 1
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": "Активация этого фильтра отключит все остальные фильтры этого типа.",

+ 20 - 9
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\") необхідно перезапустити!<br><br>Крім того, слід перевірити конфігурацію DNS доменів. Після затвердження конфігурації DNS перезапустіть контейнер \"acme-mailcow\", щоб автоматично згенерувати сертифікати для вашого нового домену.<br>Цей крок не є обов'язковим і повторюватиметься кожні 24 години.",
         "relay_all_info": "Якщо ви вирішите <b>не</b> ретранслювати всіх одержувачів, вам потрібно буде додати (\"сліпу\") поштову адресу для кожного одержувача, якого слід ретранслювати.",
-        "relay_transport_info": "<div class=\"label label-info\">Інфо</div> Ви можете налаштувати власний транспорт для домену. Якщо такої установки немає, то доставка буде виконана на основі MX-записів.",
+        "relay_transport_info": "<div class=\"badge fs-6 bg-info\">Інфо</div> Ви можете налаштувати власний транспорт для домену. Якщо такої установки немає, то доставка буде виконана на основі MX-записів.",
         "relayhost_wrapped_tls_info": "Будь ласка, <b>не</b> використовуйте TLS порти (в основному це 465 порт).<br>\nВикористовуйте будь-який <b>не</b> порт 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-адрес: <b>підмережа (час, що залишився) - [дія]</b>.<br />IP-адреси, що знаходяться в черзі на розблокування, будуть видалені зі списку активних блокувань протягом декількох секунд.<br> />Червона мітка означає, що підмережа/хост знаходиться в чорному списку.",
+        "ban_list_info": "Список заблокованих IP-адрес: <b>підмережа (час, що залишився) - [дія]</b>.<br />IP-адреси, що знаходяться в черзі на розблокування, будуть видалені зі списку активних блокувань протягом декількох секунд.<br>Червона мітка означає, що підмережа/хост знаходиться в чорному списку.",
         "credentials_transport_warning": "<b>Попередження</b>: додавання нового запису перезапише облікові дані для всіх записів з таким самим <i>наступним хостом</i>.",
         "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": "<i>Очікування пристрою USB...</i><br><br>Будь ласка, натисніть зараз кнопку на USB пристрої.",
-        "waiting_usb_register": "<i>Очікування USB-пристрою...</i><br><br>Будь ласка, введіть пароль вище та підтвердіть реєстрацію, натиснувши кнопку на USB пристрої."
+        "waiting_usb_register": "<i>Очікування USB-пристрою...</i><br><br>Будь ласка, введіть пароль вище та підтвердіть реєстрацію, натиснувши кнопку на USB пристрої.",
+        "authenticators": "Аутентифікатори"
     },
     "user": {
         "action": "Дії",

+ 4 - 3
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

+ 17 - 1
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!!!!