Procházet zdrojové kódy

[Web] Add User ACL to manage SOGo access

FreddleSpl0it před 1 měsícem
rodič
revize
aaa23d2dc1
41 změnil soubory, kde provedl 186 přidání a 132 odebrání
  1. 1 1
      data/conf/phpfpm/crons/keycloak-sync.php
  2. 1 1
      data/conf/phpfpm/crons/ldap-sync.php
  3. 8 8
      data/web/api/openapi.yaml
  4. 8 3
      data/web/inc/functions.inc.php
  5. 28 23
      data/web/inc/functions.mailbox.inc.php
  6. 15 4
      data/web/inc/init_db.inc.php
  7. 4 2
      data/web/inc/triggers.user.inc.php
  8. 2 2
      data/web/inc/vars.inc.php
  9. 4 1
      data/web/index.php
  10. 9 6
      data/web/js/site/mailbox.js
  11. 3 3
      data/web/lang/lang.bg-bg.json
  12. 3 3
      data/web/lang/lang.cs-cz.json
  13. 1 1
      data/web/lang/lang.da-dk.json
  14. 5 3
      data/web/lang/lang.de-de.json
  15. 5 3
      data/web/lang/lang.en-gb.json
  16. 3 3
      data/web/lang/lang.es-es.json
  17. 1 1
      data/web/lang/lang.fi-fi.json
  18. 3 3
      data/web/lang/lang.fr-fr.json
  19. 3 3
      data/web/lang/lang.hu-hu.json
  20. 3 3
      data/web/lang/lang.it-it.json
  21. 3 3
      data/web/lang/lang.ja-jp.json
  22. 1 1
      data/web/lang/lang.ko-kr.json
  23. 1 1
      data/web/lang/lang.lt-lt.json
  24. 2 2
      data/web/lang/lang.lv-lv.json
  25. 1 1
      data/web/lang/lang.nb-no.json
  26. 1 1
      data/web/lang/lang.nl-nl.json
  27. 3 3
      data/web/lang/lang.pt-br.json
  28. 3 3
      data/web/lang/lang.ro-ro.json
  29. 3 3
      data/web/lang/lang.ru-ru.json
  30. 3 3
      data/web/lang/lang.si-si.json
  31. 3 3
      data/web/lang/lang.sk-sk.json
  32. 1 1
      data/web/lang/lang.sv-se.json
  33. 3 3
      data/web/lang/lang.tr-tr.json
  34. 3 3
      data/web/lang/lang.uk-ua.json
  35. 3 3
      data/web/lang/lang.zh-cn.json
  36. 3 3
      data/web/lang/lang.zh-tw.json
  37. 2 1
      data/web/sogo-auth.php
  38. 4 3
      data/web/templates/edit/mailbox-templates.twig
  39. 20 7
      data/web/templates/edit/mailbox.twig
  40. 8 6
      data/web/templates/modals/mailbox.twig
  41. 5 1
      data/web/templates/user/tab-user-auth.twig

+ 1 - 1
data/conf/phpfpm/crons/keycloak-sync.php

@@ -66,7 +66,7 @@ $_SESSION['acl']['tls_policy'] = "1";
 $_SESSION['acl']['quarantine_notification'] = "1";
 $_SESSION['acl']['quarantine_notification'] = "1";
 $_SESSION['acl']['quarantine_category'] = "1";
 $_SESSION['acl']['quarantine_category'] = "1";
 $_SESSION['acl']['ratelimit'] = "1";
 $_SESSION['acl']['ratelimit'] = "1";
-$_SESSION['acl']['sogo_access'] = "1";
+$_SESSION['acl']['sogo_redirection'] = "1";
 $_SESSION['acl']['protocol_access'] = "1";
 $_SESSION['acl']['protocol_access'] = "1";
 $_SESSION['acl']['mailbox_relayhost'] = "1";
 $_SESSION['acl']['mailbox_relayhost'] = "1";
 $_SESSION['acl']['unlimited_quota'] = "1";
 $_SESSION['acl']['unlimited_quota'] = "1";

+ 1 - 1
data/conf/phpfpm/crons/ldap-sync.php

@@ -66,7 +66,7 @@ $_SESSION['acl']['tls_policy'] = "1";
 $_SESSION['acl']['quarantine_notification'] = "1";
 $_SESSION['acl']['quarantine_notification'] = "1";
 $_SESSION['acl']['quarantine_category'] = "1";
 $_SESSION['acl']['quarantine_category'] = "1";
 $_SESSION['acl']['ratelimit'] = "1";
 $_SESSION['acl']['ratelimit'] = "1";
-$_SESSION['acl']['sogo_access'] = "1";
+$_SESSION['acl']['sogo_redirection'] = "1";
 $_SESSION['acl']['protocol_access'] = "1";
 $_SESSION['acl']['protocol_access'] = "1";
 $_SESSION['acl']['mailbox_relayhost'] = "1";
 $_SESSION['acl']['mailbox_relayhost'] = "1";
 $_SESSION['acl']['unlimited_quota'] = "1";
 $_SESSION['acl']['unlimited_quota'] = "1";

+ 8 - 8
data/web/api/openapi.yaml

@@ -754,7 +754,7 @@ paths:
                             - syncjobs
                             - syncjobs
                             - quarantine
                             - quarantine
                             - login_as
                             - login_as
-                            - sogo_access
+                            - sogo_redirection
                             - app_passwds
                             - app_passwds
                             - bcc_maps
                             - bcc_maps
                             - pushover
                             - pushover
@@ -807,7 +807,7 @@ paths:
                     - syncjobs
                     - syncjobs
                     - quarantine
                     - quarantine
                     - login_as
                     - login_as
-                    - sogo_access
+                    - sogo_redirection
                     - app_passwds
                     - app_passwds
                     - bcc_maps
                     - bcc_maps
                     - pushover
                     - pushover
@@ -3339,7 +3339,7 @@ paths:
                             - info@domain2.tld
                             - info@domain2.tld
                             - domain3.tld
                             - domain3.tld
                             - "*"
                             - "*"
-                          sogo_access: "1"
+                          sogo_redirection: "1"
                           username:
                           username:
                             - info@domain.tld
                             - info@domain.tld
                           tags: ["tag3", "tag4"]
                           tags: ["tag3", "tag4"]
@@ -3390,7 +3390,7 @@ paths:
                     - info@domain2.tld
                     - info@domain2.tld
                     - domain3.tld
                     - domain3.tld
                     - "*"
                     - "*"
-                  sogo_access: "1"
+                  sogo_redirection: "1"
                   tags: ["tag3", "tag4"]
                   tags: ["tag3", "tag4"]
                 items:
                 items:
                   - info@domain.tld
                   - info@domain.tld
@@ -3422,8 +3422,8 @@ paths:
                     sender_acl:
                     sender_acl:
                       description: list of allowed send from addresses
                       description: list of allowed send from addresses
                       type: object
                       type: object
-                    sogo_access:
-                      description: is access to SOGo webmail active or not
+                    sogo_redirection:
+                      description: is redirection to SOGo webmail active or not
                       type: boolean
                       type: boolean
                   type: object
                   type: object
                 items:
                 items:
@@ -4799,7 +4799,7 @@ paths:
                         force_pw_update: "0"
                         force_pw_update: "0"
                         mailbox_format: "maildir:"
                         mailbox_format: "maildir:"
                         quarantine_notification: never
                         quarantine_notification: never
-                        sogo_access: "1"
+                        sogo_redirection: "1"
                         tls_enforce_in: "0"
                         tls_enforce_in: "0"
                         tls_enforce_out: "0"
                         tls_enforce_out: "0"
                       domain: doman3.tld
                       domain: doman3.tld
@@ -5723,7 +5723,7 @@ paths:
                         force_pw_update: "0"
                         force_pw_update: "0"
                         mailbox_format: "maildir:"
                         mailbox_format: "maildir:"
                         quarantine_notification: never
                         quarantine_notification: never
-                        sogo_access: "1"
+                        sogo_redirection: "1"
                         tls_enforce_in: "0"
                         tls_enforce_in: "0"
                         tls_enforce_out: "0"
                         tls_enforce_out: "0"
                       custom_attributes: {}
                       custom_attributes: {}

+ 8 - 3
data/web/inc/functions.inc.php

@@ -3371,9 +3371,14 @@ function set_user_loggedin_session($user) {
   session_regenerate_id(true);
   session_regenerate_id(true);
   $_SESSION['mailcow_cc_username'] = $user;
   $_SESSION['mailcow_cc_username'] = $user;
   $_SESSION['mailcow_cc_role'] = 'user';
   $_SESSION['mailcow_cc_role'] = 'user';
-  $sogo_sso_pass = file_get_contents("/etc/sogo-sso/sogo-sso.pass");
-  $_SESSION['sogo-sso-user-allowed'][] = $user;
-  $_SESSION['sogo-sso-pass'] = $sogo_sso_pass;
+
+  acl('to_session');
+  if (hasACLAccess("sogo_access")) {
+    $sogo_sso_pass = file_get_contents("/etc/sogo-sso/sogo-sso.pass");
+    $_SESSION['sogo-sso-user-allowed'][] = $user;
+    $_SESSION['sogo-sso-pass'] = $sogo_sso_pass;
+  }
+
   unset($_SESSION['pending_mailcow_cc_username']);
   unset($_SESSION['pending_mailcow_cc_username']);
   unset($_SESSION['pending_mailcow_cc_role']);
   unset($_SESSION['pending_mailcow_cc_role']);
   unset($_SESSION['pending_tfa_methods']);
   unset($_SESSION['pending_tfa_methods']);

+ 28 - 23
data/web/inc/functions.mailbox.inc.php

@@ -1073,7 +1073,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
           $force_pw_update = (isset($_data['force_pw_update'])) ? intval($_data['force_pw_update']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['force_pw_update']);
           $force_pw_update = (isset($_data['force_pw_update'])) ? intval($_data['force_pw_update']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['force_pw_update']);
           $tls_enforce_in = (isset($_data['tls_enforce_in'])) ? intval($_data['tls_enforce_in']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['tls_enforce_in']);
           $tls_enforce_in = (isset($_data['tls_enforce_in'])) ? intval($_data['tls_enforce_in']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['tls_enforce_in']);
           $tls_enforce_out = (isset($_data['tls_enforce_out'])) ? intval($_data['tls_enforce_out']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['tls_enforce_out']);
           $tls_enforce_out = (isset($_data['tls_enforce_out'])) ? intval($_data['tls_enforce_out']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['tls_enforce_out']);
-          $sogo_access = (isset($_data['sogo_access'])) ? intval($_data['sogo_access']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['sogo_access']);
+          $sogo_redirection = (isset($_data['sogo_redirection'])) ? intval($_data['sogo_redirection']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['sogo_redirection']);
           $imap_access = (isset($_data['imap_access'])) ? intval($_data['imap_access']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['imap_access']);
           $imap_access = (isset($_data['imap_access'])) ? intval($_data['imap_access']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['imap_access']);
           $pop3_access = (isset($_data['pop3_access'])) ? intval($_data['pop3_access']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['pop3_access']);
           $pop3_access = (isset($_data['pop3_access'])) ? intval($_data['pop3_access']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['pop3_access']);
           $smtp_access = (isset($_data['smtp_access'])) ? intval($_data['smtp_access']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['smtp_access']);
           $smtp_access = (isset($_data['smtp_access'])) ? intval($_data['smtp_access']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['smtp_access']);
@@ -1091,7 +1091,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
               'force_pw_update' => strval($force_pw_update),
               'force_pw_update' => strval($force_pw_update),
               'tls_enforce_in' => strval($tls_enforce_in),
               'tls_enforce_in' => strval($tls_enforce_in),
               'tls_enforce_out' => strval($tls_enforce_out),
               'tls_enforce_out' => strval($tls_enforce_out),
-              'sogo_access' => strval($sogo_access),
+              'sogo_redirection' => strval($sogo_redirection),
               'imap_access' => strval($imap_access),
               'imap_access' => strval($imap_access),
               'pop3_access' => strval($pop3_access),
               'pop3_access' => strval($pop3_access),
               'smtp_access' => strval($smtp_access),
               'smtp_access' => strval($smtp_access),
@@ -1280,6 +1280,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             $_data['syncjobs'] = (in_array('syncjobs', $_data['acl'])) ? 1 : 0;
             $_data['syncjobs'] = (in_array('syncjobs', $_data['acl'])) ? 1 : 0;
             $_data['eas_reset'] = (in_array('eas_reset', $_data['acl'])) ? 1 : 0;
             $_data['eas_reset'] = (in_array('eas_reset', $_data['acl'])) ? 1 : 0;
             $_data['sogo_profile_reset'] = (in_array('sogo_profile_reset', $_data['acl'])) ? 1 : 0;
             $_data['sogo_profile_reset'] = (in_array('sogo_profile_reset', $_data['acl'])) ? 1 : 0;
+            $_data['sogo_access'] = (in_array('sogo_access', $_data['acl'])) ? 1 : 0;
             $_data['pushover'] = (in_array('pushover', $_data['acl'])) ? 1 : 0;
             $_data['pushover'] = (in_array('pushover', $_data['acl'])) ? 1 : 0;
             $_data['quarantine'] = (in_array('quarantine', $_data['acl'])) ? 1 : 0;
             $_data['quarantine'] = (in_array('quarantine', $_data['acl'])) ? 1 : 0;
             $_data['quarantine_attachments'] = (in_array('quarantine_attachments', $_data['acl'])) ? 1 : 0;
             $_data['quarantine_attachments'] = (in_array('quarantine_attachments', $_data['acl'])) ? 1 : 0;
@@ -1296,6 +1297,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             $_data['syncjobs'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_syncjobs']);
             $_data['syncjobs'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_syncjobs']);
             $_data['eas_reset'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_eas_reset']);
             $_data['eas_reset'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_eas_reset']);
             $_data['sogo_profile_reset'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_sogo_profile_reset']);
             $_data['sogo_profile_reset'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_sogo_profile_reset']);
+            $_data['sogo_access'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_sogo_access']);
             $_data['pushover'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_pushover']);
             $_data['pushover'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_pushover']);
             $_data['quarantine'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_quarantine']);
             $_data['quarantine'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_quarantine']);
             $_data['quarantine_attachments'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_quarantine_attachments']);
             $_data['quarantine_attachments'] = intval($MAILBOX_DEFAULT_ATTRIBUTES['acl_quarantine_attachments']);
@@ -1704,7 +1706,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
           $attr["rl_frame"]                    = (!empty($_data['rl_frame'])) ? $_data['rl_frame'] : "s";
           $attr["rl_frame"]                    = (!empty($_data['rl_frame'])) ? $_data['rl_frame'] : "s";
           $attr["rl_value"]                    = (!empty($_data['rl_value'])) ? $_data['rl_value'] : "";
           $attr["rl_value"]                    = (!empty($_data['rl_value'])) ? $_data['rl_value'] : "";
           $attr["force_pw_update"]             = isset($_data['force_pw_update']) ? intval($_data['force_pw_update']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['force_pw_update']);
           $attr["force_pw_update"]             = isset($_data['force_pw_update']) ? intval($_data['force_pw_update']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['force_pw_update']);
-          $attr["sogo_access"]                 = isset($_data['sogo_access']) ? intval($_data['sogo_access']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['sogo_access']);
+          $attr["sogo_redirection"]            = isset($_data['sogo_redirection']) ? intval($_data['sogo_redirection']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['sogo_redirection']);
           $attr["active"]                      = isset($_data['active']) ? intval($_data['active']) : 1;
           $attr["active"]                      = isset($_data['active']) ? intval($_data['active']) : 1;
           $attr["tls_enforce_in"]              = isset($_data['tls_enforce_in']) ? intval($_data['tls_enforce_in']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['tls_enforce_in']);
           $attr["tls_enforce_in"]              = isset($_data['tls_enforce_in']) ? intval($_data['tls_enforce_in']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['tls_enforce_in']);
           $attr["tls_enforce_out"]             = isset($_data['tls_enforce_out']) ? intval($_data['tls_enforce_out']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['tls_enforce_out']);
           $attr["tls_enforce_out"]             = isset($_data['tls_enforce_out']) ? intval($_data['tls_enforce_out']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['tls_enforce_out']);
@@ -1731,6 +1733,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             $attr['acl_syncjobs'] = (in_array('syncjobs', $_data['acl'])) ? 1 : 0;
             $attr['acl_syncjobs'] = (in_array('syncjobs', $_data['acl'])) ? 1 : 0;
             $attr['acl_eas_reset'] = (in_array('eas_reset', $_data['acl'])) ? 1 : 0;
             $attr['acl_eas_reset'] = (in_array('eas_reset', $_data['acl'])) ? 1 : 0;
             $attr['acl_sogo_profile_reset'] = (in_array('sogo_profile_reset', $_data['acl'])) ? 1 : 0;
             $attr['acl_sogo_profile_reset'] = (in_array('sogo_profile_reset', $_data['acl'])) ? 1 : 0;
+            $attr['acl_sogo_access'] = (in_array('sogo_access', $_data['acl'])) ? 1 : 0;
             $attr['acl_pushover'] = (in_array('pushover', $_data['acl'])) ? 1 : 0;
             $attr['acl_pushover'] = (in_array('pushover', $_data['acl'])) ? 1 : 0;
             $attr['acl_quarantine'] = (in_array('quarantine', $_data['acl'])) ? 1 : 0;
             $attr['acl_quarantine'] = (in_array('quarantine', $_data['acl'])) ? 1 : 0;
             $attr['acl_quarantine_attachments'] = (in_array('quarantine_attachments', $_data['acl'])) ? 1 : 0;
             $attr['acl_quarantine_attachments'] = (in_array('quarantine_attachments', $_data['acl'])) ? 1 : 0;
@@ -1748,6 +1751,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             $attr['acl_syncjobs'] = 0;
             $attr['acl_syncjobs'] = 0;
             $attr['acl_eas_reset'] = 0;
             $attr['acl_eas_reset'] = 0;
             $attr['acl_sogo_profile_reset'] = 0;
             $attr['acl_sogo_profile_reset'] = 0;
+            $attr['acl_sogo_access'] = 0;
             $attr['acl_pushover'] = 0;
             $attr['acl_pushover'] = 0;
             $attr['acl_quarantine'] = 0;
             $attr['acl_quarantine'] = 0;
             $attr['acl_quarantine_attachments'] = 0;
             $attr['acl_quarantine_attachments'] = 0;
@@ -3030,23 +3034,23 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
               $_data['sieve_access'] = (in_array('sieve', $_data['protocol_access'])) ? 1 : 0;
               $_data['sieve_access'] = (in_array('sieve', $_data['protocol_access'])) ? 1 : 0;
             }
             }
             if (!empty($is_now)) {
             if (!empty($is_now)) {
-              $active               = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active'];
-              (int)$force_pw_update = (isset($_data['force_pw_update'])) ? intval($_data['force_pw_update']) : intval($is_now['attributes']['force_pw_update']);
-              (int)$sogo_access     = (isset($_data['sogo_access']) && hasACLAccess("sogo_access")) ? intval($_data['sogo_access']) : intval($is_now['attributes']['sogo_access']);
-              (int)$imap_access     = (isset($_data['imap_access']) && hasACLAccess("protocol_access")) ? intval($_data['imap_access']) : intval($is_now['attributes']['imap_access']);
-              (int)$pop3_access     = (isset($_data['pop3_access']) && hasACLAccess("protocol_access")) ? intval($_data['pop3_access']) : intval($is_now['attributes']['pop3_access']);
-              (int)$smtp_access     = (isset($_data['smtp_access']) && hasACLAccess("protocol_access")) ? intval($_data['smtp_access']) : intval($is_now['attributes']['smtp_access']);
-              (int)$sieve_access    = (isset($_data['sieve_access']) && hasACLAccess("protocol_access")) ? intval($_data['sieve_access']) : intval($is_now['attributes']['sieve_access']);
-              (int)$relayhost       = (isset($_data['relayhost']) && hasACLAccess("mailbox_relayhost")) ? intval($_data['relayhost']) : intval($is_now['attributes']['relayhost']);
-              (int)$quota_m         = (isset_has_content($_data['quota'])) ? intval($_data['quota']) : ($is_now['quota'] / 1048576);
-              $name                 = (!empty($_data['name'])) ? ltrim(rtrim($_data['name'], '>'), '<') : $is_now['name'];
-              $domain               = $is_now['domain'];
-              $quota_b              = $quota_m * 1048576;
-              $password             = (!empty($_data['password'])) ? $_data['password'] : null;
-              $password2            = (!empty($_data['password2'])) ? $_data['password2'] : null;
-              $tags                 = (is_array($_data['tags']) ? $_data['tags'] : array());
-              $attribute_hash       = (!empty($_data['attribute_hash'])) ? $_data['attribute_hash'] : '';
-              $authsource           = $is_now['authsource'];
+              $active                = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active'];
+              (int)$force_pw_update  = (isset($_data['force_pw_update'])) ? intval($_data['force_pw_update']) : intval($is_now['attributes']['force_pw_update']);
+              (int)$sogo_redirection = (isset($_data['sogo_redirection'])) ? intval($_data['sogo_redirection']) : intval($is_now['attributes']['sogo_redirection']);
+              (int)$imap_access      = (isset($_data['imap_access']) && hasACLAccess("protocol_access")) ? intval($_data['imap_access']) : intval($is_now['attributes']['imap_access']);
+              (int)$pop3_access      = (isset($_data['pop3_access']) && hasACLAccess("protocol_access")) ? intval($_data['pop3_access']) : intval($is_now['attributes']['pop3_access']);
+              (int)$smtp_access      = (isset($_data['smtp_access']) && hasACLAccess("protocol_access")) ? intval($_data['smtp_access']) : intval($is_now['attributes']['smtp_access']);
+              (int)$sieve_access     = (isset($_data['sieve_access']) && hasACLAccess("protocol_access")) ? intval($_data['sieve_access']) : intval($is_now['attributes']['sieve_access']);
+              (int)$relayhost        = (isset($_data['relayhost']) && hasACLAccess("mailbox_relayhost")) ? intval($_data['relayhost']) : intval($is_now['attributes']['relayhost']);
+              (int)$quota_m          = (isset_has_content($_data['quota'])) ? intval($_data['quota']) : ($is_now['quota'] / 1048576);
+              $name                  = (!empty($_data['name'])) ? ltrim(rtrim($_data['name'], '>'), '<') : $is_now['name'];
+              $domain                = $is_now['domain'];
+              $quota_b               = $quota_m * 1048576;
+              $password              = (!empty($_data['password'])) ? $_data['password'] : null;
+              $password2             = (!empty($_data['password2'])) ? $_data['password2'] : null;
+              $tags                  = (is_array($_data['tags']) ? $_data['tags'] : array());
+              $attribute_hash        = (!empty($_data['attribute_hash'])) ? $_data['attribute_hash'] : '';
+              $authsource            = $is_now['authsource'];
               if ($_data['authsource'] == "mailcow" ||
               if ($_data['authsource'] == "mailcow" ||
                   in_array($_data['authsource'], array('keycloak', 'generic-oidc', 'ldap')) && $iam_settings['authsource'] == $_data['authsource']){
                   in_array($_data['authsource'], array('keycloak', 'generic-oidc', 'ldap')) && $iam_settings['authsource'] == $_data['authsource']){
                 $authsource = $_data['authsource'];
                 $authsource = $_data['authsource'];
@@ -3314,7 +3318,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
                   `quota` = :quota_b,
                   `quota` = :quota_b,
                   `authsource` = :authsource,
                   `authsource` = :authsource,
                   `attributes` = JSON_SET(`attributes`, '$.force_pw_update', :force_pw_update),
                   `attributes` = JSON_SET(`attributes`, '$.force_pw_update', :force_pw_update),
-                  `attributes` = JSON_SET(`attributes`, '$.sogo_access', :sogo_access),
+                  `attributes` = JSON_SET(`attributes`, '$.sogo_redirection', :sogo_redirection),
                   `attributes` = JSON_SET(`attributes`, '$.imap_access', :imap_access),
                   `attributes` = JSON_SET(`attributes`, '$.imap_access', :imap_access),
                   `attributes` = JSON_SET(`attributes`, '$.sieve_access', :sieve_access),
                   `attributes` = JSON_SET(`attributes`, '$.sieve_access', :sieve_access),
                   `attributes` = JSON_SET(`attributes`, '$.pop3_access', :pop3_access),
                   `attributes` = JSON_SET(`attributes`, '$.pop3_access', :pop3_access),
@@ -3329,7 +3333,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
                 ':quota_b' => $quota_b,
                 ':quota_b' => $quota_b,
                 ':attribute_hash' => $attribute_hash,
                 ':attribute_hash' => $attribute_hash,
                 ':force_pw_update' => $force_pw_update,
                 ':force_pw_update' => $force_pw_update,
-                ':sogo_access' => $sogo_access,
+                ':sogo_redirection' => $sogo_redirection,
                 ':imap_access' => $imap_access,
                 ':imap_access' => $imap_access,
                 ':pop3_access' => $pop3_access,
                 ':pop3_access' => $pop3_access,
                 ':sieve_access' => $sieve_access,
                 ':sieve_access' => $sieve_access,
@@ -3706,7 +3710,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             $attr["rl_frame"]                    = (!empty($_data['rl_frame'])) ? $_data['rl_frame'] : $is_now['rl_frame'];
             $attr["rl_frame"]                    = (!empty($_data['rl_frame'])) ? $_data['rl_frame'] : $is_now['rl_frame'];
             $attr["rl_value"]                    = (!empty($_data['rl_value'])) ? $_data['rl_value'] : $is_now['rl_value'];
             $attr["rl_value"]                    = (!empty($_data['rl_value'])) ? $_data['rl_value'] : $is_now['rl_value'];
             $attr["force_pw_update"]             = isset($_data['force_pw_update']) ? intval($_data['force_pw_update']) : $is_now['force_pw_update'];
             $attr["force_pw_update"]             = isset($_data['force_pw_update']) ? intval($_data['force_pw_update']) : $is_now['force_pw_update'];
-            $attr["sogo_access"]                 = isset($_data['sogo_access']) ? intval($_data['sogo_access']) : $is_now['sogo_access'];
+            $attr["sogo_redirection"]            = isset($_data['sogo_redirection']) ? intval($_data['sogo_redirection']) : $is_now['sogo_redirection'];
             $attr["active"]                      = isset($_data['active']) ? intval($_data['active']) : $is_now['active'];
             $attr["active"]                      = isset($_data['active']) ? intval($_data['active']) : $is_now['active'];
             $attr["tls_enforce_in"]              = isset($_data['tls_enforce_in']) ? intval($_data['tls_enforce_in']) : $is_now['tls_enforce_in'];
             $attr["tls_enforce_in"]              = isset($_data['tls_enforce_in']) ? intval($_data['tls_enforce_in']) : $is_now['tls_enforce_in'];
             $attr["tls_enforce_out"]             = isset($_data['tls_enforce_out']) ? intval($_data['tls_enforce_out']) : $is_now['tls_enforce_out'];
             $attr["tls_enforce_out"]             = isset($_data['tls_enforce_out']) ? intval($_data['tls_enforce_out']) : $is_now['tls_enforce_out'];
@@ -3732,6 +3736,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
               $attr['acl_syncjobs'] = (in_array('syncjobs', $_data['acl'])) ? 1 : 0;
               $attr['acl_syncjobs'] = (in_array('syncjobs', $_data['acl'])) ? 1 : 0;
               $attr['acl_eas_reset'] = (in_array('eas_reset', $_data['acl'])) ? 1 : 0;
               $attr['acl_eas_reset'] = (in_array('eas_reset', $_data['acl'])) ? 1 : 0;
               $attr['acl_sogo_profile_reset'] = (in_array('sogo_profile_reset', $_data['acl'])) ? 1 : 0;
               $attr['acl_sogo_profile_reset'] = (in_array('sogo_profile_reset', $_data['acl'])) ? 1 : 0;
+              $attr["acl_sogo_access"] = (in_array('sogo_access', $_data['acl'])) ? 1 : 0;
               $attr['acl_pushover'] = (in_array('pushover', $_data['acl'])) ? 1 : 0;
               $attr['acl_pushover'] = (in_array('pushover', $_data['acl'])) ? 1 : 0;
               $attr['acl_quarantine'] = (in_array('quarantine', $_data['acl'])) ? 1 : 0;
               $attr['acl_quarantine'] = (in_array('quarantine', $_data['acl'])) ? 1 : 0;
               $attr['acl_quarantine_attachments'] = (in_array('quarantine_attachments', $_data['acl'])) ? 1 : 0;
               $attr['acl_quarantine_attachments'] = (in_array('quarantine_attachments', $_data['acl'])) ? 1 : 0;

+ 15 - 4
data/web/inc/init_db.inc.php

@@ -4,7 +4,7 @@ function init_db_schema()
   try {
   try {
     global $pdo;
     global $pdo;
 
 
-    $db_version = "07102025_1015";
+    $db_version = "16102025_1340";
 
 
     $stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
     $stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
     $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
     $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
@@ -504,6 +504,7 @@ function init_db_schema()
           "syncjobs" => "TINYINT(1) NOT NULL DEFAULT '0'",
           "syncjobs" => "TINYINT(1) NOT NULL DEFAULT '0'",
           "eas_reset" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "eas_reset" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "sogo_profile_reset" => "TINYINT(1) NOT NULL DEFAULT '0'",
           "sogo_profile_reset" => "TINYINT(1) NOT NULL DEFAULT '0'",
+          "sogo_access" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "pushover" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "pushover" => "TINYINT(1) NOT NULL DEFAULT '1'",
           // quarantine is for quarantine actions, todo: rename
           // quarantine is for quarantine actions, todo: rename
           "quarantine" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "quarantine" => "TINYINT(1) NOT NULL DEFAULT '1'",
@@ -702,7 +703,7 @@ function init_db_schema()
           "syncjobs" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "syncjobs" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "quarantine" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "quarantine" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "login_as" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "login_as" => "TINYINT(1) NOT NULL DEFAULT '1'",
-          "sogo_access" => "TINYINT(1) NOT NULL DEFAULT '1'",
+          "sogo_redirection" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "app_passwds" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "app_passwds" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "bcc_maps" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "bcc_maps" => "TINYINT(1) NOT NULL DEFAULT '1'",
           "pushover" => "TINYINT(1) NOT NULL DEFAULT '0'",
           "pushover" => "TINYINT(1) NOT NULL DEFAULT '0'",
@@ -1389,7 +1390,8 @@ function init_db_schema()
     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.relayhost', \"0\") WHERE JSON_VALUE(`attributes`, '$.relayhost') IS NULL;");
     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.relayhost', \"0\") WHERE JSON_VALUE(`attributes`, '$.relayhost') IS NULL;");
     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.force_pw_update', \"0\") WHERE JSON_VALUE(`attributes`, '$.force_pw_update') IS NULL;");
     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.force_pw_update', \"0\") WHERE JSON_VALUE(`attributes`, '$.force_pw_update') IS NULL;");
     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.sieve_access', \"1\") WHERE JSON_VALUE(`attributes`, '$.sieve_access') IS NULL;");
     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.sieve_access', \"1\") WHERE JSON_VALUE(`attributes`, '$.sieve_access') IS NULL;");
-    $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.sogo_access', \"1\") WHERE JSON_VALUE(`attributes`, '$.sogo_access') IS NULL;");
+    $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.sogo_redirection', JSON_VALUE(`attributes`, '$.sogo_access')) WHERE JSON_VALUE(`attributes`, '$.sogo_access') IS NOT NULL;");
+    $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_REMOVE(`attributes`, '$.sogo_access') WHERE JSON_VALUE(`attributes`, '$.sogo_access') IS NOT NULL;");
     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.imap_access', \"1\") WHERE JSON_VALUE(`attributes`, '$.imap_access') IS NULL;");
     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.imap_access', \"1\") WHERE JSON_VALUE(`attributes`, '$.imap_access') IS NULL;");
     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.pop3_access', \"1\") WHERE JSON_VALUE(`attributes`, '$.pop3_access') IS NULL;");
     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.pop3_access', \"1\") WHERE JSON_VALUE(`attributes`, '$.pop3_access') IS NULL;");
     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.smtp_access', \"1\") WHERE JSON_VALUE(`attributes`, '$.smtp_access') IS NULL;");
     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.smtp_access', \"1\") WHERE JSON_VALUE(`attributes`, '$.smtp_access') IS NULL;");
@@ -1445,7 +1447,7 @@ function init_db_schema()
         "rl_frame" => "s",
         "rl_frame" => "s",
         "rl_value" => "",
         "rl_value" => "",
         "force_pw_update" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['force_pw_update']),
         "force_pw_update" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['force_pw_update']),
-        "sogo_access" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['sogo_access']),
+        "sogo_redirection" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['sogo_redirection']),
         "active" => 1,
         "active" => 1,
         "tls_enforce_in" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['tls_enforce_in']),
         "tls_enforce_in" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['tls_enforce_in']),
         "tls_enforce_out" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['tls_enforce_out']),
         "tls_enforce_out" => intval($GLOBALS['MAILBOX_DEFAULT_ATTRIBUTES']['tls_enforce_out']),
@@ -1461,6 +1463,7 @@ function init_db_schema()
         "acl_syncjobs" => 0,
         "acl_syncjobs" => 0,
         "acl_eas_reset" => 1,
         "acl_eas_reset" => 1,
         "acl_sogo_profile_reset" => 0,
         "acl_sogo_profile_reset" => 0,
+        "acl_sogo_access" => 1,
         "acl_pushover" => 1,
         "acl_pushover" => 1,
         "acl_quarantine" => 1,
         "acl_quarantine" => 1,
         "acl_quarantine_attachments" => 1,
         "acl_quarantine_attachments" => 1,
@@ -1499,6 +1502,14 @@ function init_db_schema()
         ":attributes" => json_encode($default_mailbox_template["attributes"])
         ":attributes" => json_encode($default_mailbox_template["attributes"])
       ));
       ));
     }
     }
+    $pdo->query("UPDATE `templates`
+      SET `attributes` = JSON_SET(`attributes`, '$.sogo_redirection', JSON_VALUE(`attributes`, '$.sogo_access'))
+      WHERE `type` = 'mailbox' AND JSON_VALUE(`attributes`, '$.sogo_access') IS NOT NULL;
+    ");
+    $pdo->query("UPDATE `templates`
+      SET `attributes` = JSON_REMOVE(`attributes`, '$.sogo_access')
+      WHERE `type` = 'mailbox' AND JSON_VALUE(`attributes`, '$.sogo_access') IS NOT NULL;
+    ");
 
 
     // remove old sogo views and triggers
     // remove old sogo views and triggers
     $pdo->query("DROP TRIGGER IF EXISTS sogo_update_password");
     $pdo->query("DROP TRIGGER IF EXISTS sogo_update_password");

+ 4 - 2
data/web/inc/triggers.user.inc.php

@@ -76,8 +76,9 @@ if (isset($_POST["verify_tfa_login"])) {
 
 
         $user_details = mailbox("get", "mailbox_details", $_SESSION['mailcow_cc_username']);
         $user_details = mailbox("get", "mailbox_details", $_SESSION['mailcow_cc_username']);
         $is_dual = (!empty($_SESSION["dual-login"]["username"])) ? true : false;
         $is_dual = (!empty($_SESSION["dual-login"]["username"])) ? true : false;
-        if (intval($user_details['attributes']['sogo_access']) == 1 &&
+        if (intval($user_details['attributes']['sogo_redirection']) == 1 &&
             intval($user_details['attributes']['force_pw_update']) != 1 &&
             intval($user_details['attributes']['force_pw_update']) != 1 &&
+            hasACLAccess('sogo_access') &&
             getenv('SKIP_SOGO') != "y" &&
             getenv('SKIP_SOGO') != "y" &&
             !$is_dual) {
             !$is_dual) {
           header("Location: /SOGo/so/");
           header("Location: /SOGo/so/");
@@ -142,8 +143,9 @@ if (isset($_POST["login_user"]) && isset($_POST["pass_user"])) {
 
 
     $user_details = mailbox("get", "mailbox_details", $login_user);
     $user_details = mailbox("get", "mailbox_details", $login_user);
     $is_dual = (!empty($_SESSION["dual-login"]["username"])) ? true : false;
     $is_dual = (!empty($_SESSION["dual-login"]["username"])) ? true : false;
-    if (intval($user_details['attributes']['sogo_access']) == 1 &&
+    if (intval($user_details['attributes']['sogo_redirection']) == 1 &&
         intval($user_details['attributes']['force_pw_update']) != 1 &&
         intval($user_details['attributes']['force_pw_update']) != 1 &&
+        hasACLAccess('sogo_access') &&
         getenv('SKIP_SOGO') != "y" &&
         getenv('SKIP_SOGO') != "y" &&
         !$is_dual) {
         !$is_dual) {
       header("Location: /SOGo/so/");
       header("Location: /SOGo/so/");

+ 2 - 2
data/web/inc/vars.inc.php

@@ -190,8 +190,8 @@ $MAILBOX_DEFAULT_ATTRIBUTES['tls_enforce_out'] = false;
 // Force password change on next login (only allows login to mailcow UI)
 // Force password change on next login (only allows login to mailcow UI)
 $MAILBOX_DEFAULT_ATTRIBUTES['force_pw_update'] = false;
 $MAILBOX_DEFAULT_ATTRIBUTES['force_pw_update'] = false;
 
 
-// Enable SOGo access - Users will be redirected to SOGo after login (set to false to disable redirect by default)
-$MAILBOX_DEFAULT_ATTRIBUTES['sogo_access'] = true;
+// Enable SOGo redirection - Users will be redirected to SOGo after login (set to false to disable redirect by default)
+$MAILBOX_DEFAULT_ATTRIBUTES['sogo_redirection'] = true;
 
 
 // How to handle tagged emails
 // How to handle tagged emails
 // none      - No special handling
 // none      - No special handling

+ 4 - 1
data/web/index.php

@@ -11,7 +11,10 @@ if (isset($_SESSION['mailcow_cc_role']) && isset($_SESSION['oauth2_request'])) {
 elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user') {
 elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user') {
   $user_details = mailbox("get", "mailbox_details", $_SESSION['mailcow_cc_username']);
   $user_details = mailbox("get", "mailbox_details", $_SESSION['mailcow_cc_username']);
   $is_dual = (!empty($_SESSION["dual-login"]["username"])) ? true : false;
   $is_dual = (!empty($_SESSION["dual-login"]["username"])) ? true : false;
-  if (intval($user_details['attributes']['sogo_access']) == 1 && !$is_dual && getenv('SKIP_SOGO') != "y") {
+  if (intval($user_details['attributes']['sogo_redirection']) == 1 &&
+      hasACLAccess('sogo_access') &&
+      !$is_dual &&
+      getenv('SKIP_SOGO') != "y") {
     header("Location: /SOGo/so/");
     header("Location: /SOGo/so/");
   } else {
   } else {
     header("Location: /user");
     header("Location: /user");

+ 9 - 6
data/web/js/site/mailbox.js

@@ -379,6 +379,9 @@ $(document).ready(function() {
     if (template.acl_sogo_profile_reset == 1){
     if (template.acl_sogo_profile_reset == 1){
       acl.push("sogo_profile_reset");
       acl.push("sogo_profile_reset");
     }
     }
+    if (template.acl_sogo_access == 1){
+      acl.push("sogo_access");
+    }
     if (template.acl_pushover == 1){
     if (template.acl_pushover == 1){
       acl.push("pushover");
       acl.push("pushover");
     }
     }
@@ -418,10 +421,10 @@ $(document).ready(function() {
     } else {
     } else {
       $('#force_pw_update').prop('checked', false);
       $('#force_pw_update').prop('checked', false);
     }
     }
-    if (template.sogo_access == 1){
-      $('#sogo_access').prop('checked', true);
+    if (template.sogo_redirection == 1){
+      $('#sogo_redirection').prop('checked', true);
     } else {
     } else {
-      $('#sogo_access').prop('checked', false);
+      $('#sogo_redirection').prop('checked', false);
     }
     }
 
 
     // load tags
     // load tags
@@ -1209,7 +1212,7 @@ jQuery(function($){
             item.attributes.imap_access = '<i class="text-' + (item.attributes.imap_access == 1 ? 'success' : 'danger') + ' bi bi-' + (item.attributes.imap_access == 1 ? 'check-lg' : 'x-lg') + '"><span class="sorting-value">' + (item.attributes.imap_access == 1 ? '1' : '0') + '</span></i>';
             item.attributes.imap_access = '<i class="text-' + (item.attributes.imap_access == 1 ? 'success' : 'danger') + ' bi bi-' + (item.attributes.imap_access == 1 ? 'check-lg' : 'x-lg') + '"><span class="sorting-value">' + (item.attributes.imap_access == 1 ? '1' : '0') + '</span></i>';
             item.attributes.smtp_access = '<i class="text-' + (item.attributes.smtp_access == 1 ? 'success' : 'danger') + ' bi bi-' + (item.attributes.smtp_access == 1 ? 'check-lg' : 'x-lg') + '"><span class="sorting-value">' + (item.attributes.smtp_access == 1 ? '1' : '0') + '</span></i>';
             item.attributes.smtp_access = '<i class="text-' + (item.attributes.smtp_access == 1 ? 'success' : 'danger') + ' bi bi-' + (item.attributes.smtp_access == 1 ? 'check-lg' : 'x-lg') + '"><span class="sorting-value">' + (item.attributes.smtp_access == 1 ? '1' : '0') + '</span></i>';
             item.attributes.sieve_access = '<i class="text-' + (item.attributes.sieve_access == 1 ? 'success' : 'danger') + ' bi bi-' + (item.attributes.sieve_access == 1 ? 'check-lg' : 'x-lg') + '"><span class="sorting-value">' + (item.attributes.sieve_access == 1 ? '1' : '0') + '</span></i>';
             item.attributes.sieve_access = '<i class="text-' + (item.attributes.sieve_access == 1 ? 'success' : 'danger') + ' bi bi-' + (item.attributes.sieve_access == 1 ? 'check-lg' : 'x-lg') + '"><span class="sorting-value">' + (item.attributes.sieve_access == 1 ? '1' : '0') + '</span></i>';
-            item.attributes.sogo_access = '<i class="text-' + (item.attributes.sogo_access == 1 ? 'success' : 'danger') + ' bi bi-' + (item.attributes.sogo_access == 1 ? 'check-lg' : 'x-lg') + '"><span class="sorting-value">' + (item.attributes.sogo_access == 1 ? '1' : '0') + '</span></i>';
+            item.attributes.sogo_redirection = '<i class="text-' + (item.attributes.sogo_redirection == 1 ? 'success' : 'danger') + ' bi bi-' + (item.attributes.sogo_redirection == 1 ? 'check-lg' : 'x-lg') + '"><span class="sorting-value">' + (item.attributes.sogo_redirection == 1 ? '1' : '0') + '</span></i>';
             if (item.attributes.quarantine_notification === 'never') {
             if (item.attributes.quarantine_notification === 'never') {
               item.attributes.quarantine_notification = lang.never;
               item.attributes.quarantine_notification = lang.never;
             } else if (item.attributes.quarantine_notification === 'hourly') {
             } else if (item.attributes.quarantine_notification === 'hourly') {
@@ -1318,8 +1321,8 @@ jQuery(function($){
           defaultContent: '',
           defaultContent: '',
         },
         },
         {
         {
-          title: 'SOGO',
-          data: 'attributes.sogo_access',
+          title: 'SOGO redirection',
+          data: 'attributes.sogo_redirection',
           defaultContent: '',
           defaultContent: '',
         },
         },
         {
         {

+ 3 - 3
data/web/lang/lang.bg-bg.json

@@ -22,7 +22,7 @@
         "ratelimit": "Ограничение на скоростта",
         "ratelimit": "Ограничение на скоростта",
         "recipient_maps": "Карти на получатели",
         "recipient_maps": "Карти на получатели",
         "smtp_ip_access": "Промяна на разрешените хостове за SMTP",
         "smtp_ip_access": "Промяна на разрешените хостове за SMTP",
-        "sogo_access": "Разрешаване на управление на достъпа до SOGo",
+        "sogo_redirection": "Разрешаване на управление на достъпа до SOGo",
         "sogo_profile_reset": "Нулиране на профила на SOGo",
         "sogo_profile_reset": "Нулиране на профила на SOGo",
         "spam_alias": "Временни псевдоними",
         "spam_alias": "Временни псевдоними",
         "spam_policy": "Черен/Бял списък",
         "spam_policy": "Черен/Бял списък",
@@ -736,8 +736,8 @@
         "sieve_desc": "Кратко описание",
         "sieve_desc": "Кратко описание",
         "sieve_type": "Тип на филтър",
         "sieve_type": "Тип на филтър",
         "skipcrossduplicates": "Пропускане на дублирани съобщения между папки (първи дошъл, първи обслужен)",
         "skipcrossduplicates": "Пропускане на дублирани съобщения между папки (първи дошъл, първи обслужен)",
-        "sogo_access": "Директно препращане към SOGo",
-        "sogo_access_info": "След влизане, потребителят се пренасочва автоматично към SOGo.",
+        "sogo_redirection": "Директно препращане към SOGo",
+        "sogo_redirection_info": "След влизане, потребителят се пренасочва автоматично към SOGo.",
         "sogo_visible": "Псевдонимът е видим в SOGo",
         "sogo_visible": "Псевдонимът е видим в SOGo",
         "sogo_visible_info": "Тази опция засяга само обекти, които могат да бъдат показани в SOGo (споделени или несподелени адреси на псевдоними, сочещи поне една локална пощенска кутия). Ако е скрит, псевдонимът няма да се появи като избираем адрес на изпращач в SOGo.",
         "sogo_visible_info": "Тази опция засяга само обекти, които могат да бъдат показани в SOGo (споделени или несподелени адреси на псевдоними, сочещи поне една локална пощенска кутия). Ако е скрит, псевдонимът няма да се появи като избираем адрес на изпращач в SOGo.",
         "spam_alias": "Създаване или промяна на временни псевдоними",
         "spam_alias": "Създаване или промяна на временни псевдоними",

+ 3 - 3
data/web/lang/lang.cs-cz.json

@@ -21,7 +21,7 @@
         "ratelimit": "Omezení provozu",
         "ratelimit": "Omezení provozu",
         "recipient_maps": "Mapy příjemců",
         "recipient_maps": "Mapy příjemců",
         "smtp_ip_access": "Spravovat povolené hostitele pro SMTP",
         "smtp_ip_access": "Spravovat povolené hostitele pro SMTP",
-        "sogo_access": "Správa přístupu do SOGo",
+        "sogo_redirection": "Správa přístupu do SOGo",
         "sogo_profile_reset": "Resetování profilu SOGo",
         "sogo_profile_reset": "Resetování profilu SOGo",
         "spam_alias": "Dočasné aliasy",
         "spam_alias": "Dočasné aliasy",
         "spam_policy": "Denylist/Allowlist",
         "spam_policy": "Denylist/Allowlist",
@@ -727,8 +727,8 @@
         "sieve_desc": "Krátký popis",
         "sieve_desc": "Krátký popis",
         "sieve_type": "Typ filtru",
         "sieve_type": "Typ filtru",
         "skipcrossduplicates": "Přeskočit duplicitní zprávy (\"první přijde, první mele\")",
         "skipcrossduplicates": "Přeskočit duplicitní zprávy (\"první přijde, první mele\")",
-        "sogo_access": "Přímé předání na SOGo",
-        "sogo_access_info": "Po přihlášení je uživatel automaticky přesměrován do služby SOGo.",
+        "sogo_redirection": "Přímé předání na SOGo",
+        "sogo_redirection_info": "Po přihlášení je uživatel automaticky přesměrován do služby SOGo.",
         "sogo_visible": "Alias dostupný v SOGo",
         "sogo_visible": "Alias dostupný v SOGo",
         "sogo_visible_info": "Tato volba určuje objekty, jež lze zobrazit v SOGo (sdílené nebo nesdílené aliasy, jež ukazuje alespoň na jednu schránku).",
         "sogo_visible_info": "Tato volba určuje objekty, jež lze zobrazit v SOGo (sdílené nebo nesdílené aliasy, jež ukazuje alespoň na jednu schránku).",
         "spam_alias": "Vytvořit nebo změnit dočasné aliasy",
         "spam_alias": "Vytvořit nebo změnit dočasné aliasy",

+ 1 - 1
data/web/lang/lang.da-dk.json

@@ -17,7 +17,7 @@
         "ratelimit": "Satsgrænse",
         "ratelimit": "Satsgrænse",
         "recipient_maps": "Modtagerkort",
         "recipient_maps": "Modtagerkort",
         "smtp_ip_access": "Skift tilladte værter til SMTP",
         "smtp_ip_access": "Skift tilladte værter til SMTP",
-        "sogo_access": "Tillad styring af SOGo-adgang",
+        "sogo_redirection": "Tillad styring af SOGo-adgang",
         "sogo_profile_reset": "Nulstil SOGo-profil",
         "sogo_profile_reset": "Nulstil SOGo-profil",
         "spam_alias": "Midlertidige aliasser",
         "spam_alias": "Midlertidige aliasser",
         "spam_policy": "Sortliste/hvidliste",
         "spam_policy": "Sortliste/hvidliste",

+ 5 - 3
data/web/lang/lang.de-de.json

@@ -22,7 +22,8 @@
         "ratelimit": "Rate limit",
         "ratelimit": "Rate limit",
         "recipient_maps": "Empfängerumschreibungen",
         "recipient_maps": "Empfängerumschreibungen",
         "smtp_ip_access": "Verwalten der erlaubten Hosts für SMTP",
         "smtp_ip_access": "Verwalten der erlaubten Hosts für SMTP",
-        "sogo_access": "Verwalten des SOGo-Zugriffsrechts erlauben",
+        "sogo_access": "Zugriff auf SOGo erlauben",
+        "sogo_redirection": "Leite den Benutzer nach dem Login zu SOGo weiter",
         "sogo_profile_reset": "SOGo-Profil zurücksetzen",
         "sogo_profile_reset": "SOGo-Profil zurücksetzen",
         "spam_alias": "Temporäre E-Mail-Aliasse",
         "spam_alias": "Temporäre E-Mail-Aliasse",
         "spam_policy": "Deny/Allowlist",
         "spam_policy": "Deny/Allowlist",
@@ -763,8 +764,9 @@
         "sieve_desc": "Kurze Beschreibung",
         "sieve_desc": "Kurze Beschreibung",
         "sieve_type": "Filtertyp",
         "sieve_type": "Filtertyp",
         "skipcrossduplicates": "Duplikate auch über Ordner hinweg überspringen (\"first come, first serve\")",
         "skipcrossduplicates": "Duplikate auch über Ordner hinweg überspringen (\"first come, first serve\")",
-        "sogo_access": "Direktes weiterleiten an SOGo",
-        "sogo_access_info": "Nach dem Einloggen wird der Benutzer automatisch an SOGo weitergeleitet.",
+        "sogo_access": "Erlaube Zugriff auf SOGo",
+        "sogo_redirection": "Direktes weiterleiten an SOGo",
+        "sogo_redirection_info": "Nach dem Einloggen wird der Benutzer automatisch an SOGo weitergeleitet.",
         "sogo_visible": "Alias in SOGo sichtbar",
         "sogo_visible": "Alias in SOGo sichtbar",
         "sogo_visible_info": "Diese Option hat lediglich Einfluss auf Objekte, die in SOGo darstellbar sind (geteilte oder nicht-geteilte Alias-Adressen mit dem Ziel mindestens einer lokalen Mailbox).",
         "sogo_visible_info": "Diese Option hat lediglich Einfluss auf Objekte, die in SOGo darstellbar sind (geteilte oder nicht-geteilte Alias-Adressen mit dem Ziel mindestens einer lokalen Mailbox).",
         "spam_alias": "Anpassen temporärer Alias-Adressen",
         "spam_alias": "Anpassen temporärer Alias-Adressen",

+ 5 - 3
data/web/lang/lang.en-gb.json

@@ -22,7 +22,8 @@
         "ratelimit": "Rate limit",
         "ratelimit": "Rate limit",
         "recipient_maps": "Recipient maps",
         "recipient_maps": "Recipient maps",
         "smtp_ip_access": "Change allowed hosts for SMTP",
         "smtp_ip_access": "Change allowed hosts for SMTP",
-        "sogo_access": "Allow management of SOGo access",
+        "sogo_access": "Allow access to SOGo",
+        "sogo_redirection": "Redirect User to SOGo after login",
         "sogo_profile_reset": "Reset SOGo profile",
         "sogo_profile_reset": "Reset SOGo profile",
         "spam_alias": "Temporary aliases",
         "spam_alias": "Temporary aliases",
         "spam_policy": "Denylist/Allowlist",
         "spam_policy": "Denylist/Allowlist",
@@ -764,8 +765,9 @@
         "sieve_desc": "Short description",
         "sieve_desc": "Short description",
         "sieve_type": "Filter type",
         "sieve_type": "Filter type",
         "skipcrossduplicates": "Skip duplicate messages across folders (first come, first serve)",
         "skipcrossduplicates": "Skip duplicate messages across folders (first come, first serve)",
-        "sogo_access": "Direct forwarding to SOGo",
-        "sogo_access_info": "After logging in, the user is automatically redirected to SOGo.",
+        "sogo_access": "Allow SOGo access",
+        "sogo_redirection": "Direct forwarding to SOGo",
+        "sogo_redirection_info": "After logging in, the user is automatically redirected to SOGo.",
         "sogo_visible": "Alias is visible in SOGo",
         "sogo_visible": "Alias is visible in SOGo",
         "sogo_visible_info": "This option only affects objects, that can be displayed in SOGo (shared or non-shared alias addresses pointing to at least one local mailbox). If hidden, an alias will not appear as selectable sender in SOGo.",
         "sogo_visible_info": "This option only affects objects, that can be displayed in SOGo (shared or non-shared alias addresses pointing to at least one local mailbox). If hidden, an alias will not appear as selectable sender in SOGo.",
         "spam_alias": "Create or change time limited alias addresses",
         "spam_alias": "Create or change time limited alias addresses",

+ 3 - 3
data/web/lang/lang.es-es.json

@@ -26,7 +26,7 @@
         "domain_relayhost": "Cambiar relayhost por un dominio",
         "domain_relayhost": "Cambiar relayhost por un dominio",
         "extend_sender_acl": "Permitir extender la ACL del remitente por direcciones externas",
         "extend_sender_acl": "Permitir extender la ACL del remitente por direcciones externas",
         "pw_reset": "Permitir el restablecimiento de la contraseña del usuario mailcow",
         "pw_reset": "Permitir el restablecimiento de la contraseña del usuario mailcow",
-        "sogo_access": "Permitir la gestión del acceso a SOGo",
+        "sogo_redirection": "Permitir la gestión del acceso a SOGo",
         "mailbox_relayhost": "Cambiar el host de reenvío para un buzón",
         "mailbox_relayhost": "Cambiar el host de reenvío para un buzón",
         "smtp_ip_access": "Cambiar hosts permitidos para SMTP"
         "smtp_ip_access": "Cambiar hosts permitidos para SMTP"
     },
     },
@@ -662,10 +662,10 @@
         "app_passwd_protocols": "Protocolos permitidos con contraseña de aplicación",
         "app_passwd_protocols": "Protocolos permitidos con contraseña de aplicación",
         "domain_footer_info": "Los pies de página de dominio se añaden a todos los mensajes salientes remitidos por una dirección de dicho dominio.<br> Están disponibles las siguientes variables para el pie de página:",
         "domain_footer_info": "Los pies de página de dominio se añaden a todos los mensajes salientes remitidos por una dirección de dicho dominio.<br> Están disponibles las siguientes variables para el pie de página:",
         "sender_acl_info": "Si el usuario del buzón A tiene permitido enviar como el buzón B, la dirección de remitente no se mostrará automáticamente como seleccionable en el campo \"De\" en SOGo.<br>\n  El usuario del buzón B necesitará crear una delegación en SOGo para permitir al usuario A seleccionar su dirección como remitente. Para delegar un buzón en SOGo, utilice el menú (tres puntos) a la derecha del nombre del buzón en la esquina superior izquierda, en la vista de correo. Este comportamiento no se aplica a direcciones alias.",
         "sender_acl_info": "Si el usuario del buzón A tiene permitido enviar como el buzón B, la dirección de remitente no se mostrará automáticamente como seleccionable en el campo \"De\" en SOGo.<br>\n  El usuario del buzón B necesitará crear una delegación en SOGo para permitir al usuario A seleccionar su dirección como remitente. Para delegar un buzón en SOGo, utilice el menú (tres puntos) a la derecha del nombre del buzón en la esquina superior izquierda, en la vista de correo. Este comportamiento no se aplica a direcciones alias.",
-        "sogo_access_info": "Tras iniciar sesión, el usuario será redirigido automáticamente a SOGo.",
+        "sogo_redirection_info": "Tras iniciar sesión, el usuario será redirigido automáticamente a SOGo.",
         "comment_info": "Un comentario privado no es visible para el usuario, mientras que un comentario público se muestra como descripción emergente al pasar el ratón en la vista general del usuario",
         "comment_info": "Un comentario privado no es visible para el usuario, mientras que un comentario público se muestra como descripción emergente al pasar el ratón en la vista general del usuario",
         "quota_warning_bcc_info": "Los avisos se enviarán como copias separadas a los siguientes destinatarios. Se indicará en el asunto el usuario afectado entre paréntesis, como por ejemplo: <code>Aviso de cuota (usuario@ejemplo.com)</code>.",
         "quota_warning_bcc_info": "Los avisos se enviarán como copias separadas a los siguientes destinatarios. Se indicará en el asunto el usuario afectado entre paréntesis, como por ejemplo: <code>Aviso de cuota (usuario@ejemplo.com)</code>.",
-        "sogo_access": "Redirección directa a SOGo",
+        "sogo_redirection": "Redirección directa a SOGo",
         "sogo_visible_info": "Esta opción solamente afecta a objetos que puedan ser visualizados en SOGo (alias compartidos o no compartidos que apunten al menos a un buzón interno). Si se oculta, el alias no aparecerá como seleccionable en SOGo.",
         "sogo_visible_info": "Esta opción solamente afecta a objetos que puedan ser visualizados en SOGo (alias compartidos o no compartidos que apunten al menos a un buzón interno). Si se oculta, el alias no aparecerá como seleccionable en SOGo.",
         "extended_sender_acl_info": "Se aconseja importar una clave de dominio DKIM, si está disponible.<br>\n  Recuerde añadir este servidor al registro SPF correspondiente.<br>\n  Siempre que se añada un dominio o alias a este servidor, que se superponga con una dirección externa, se eliminará la dirección externa.<br>\n  Utilice @dominio.tld para permitir enviar como *@dominio.tld.",
         "extended_sender_acl_info": "Se aconseja importar una clave de dominio DKIM, si está disponible.<br>\n  Recuerde añadir este servidor al registro SPF correspondiente.<br>\n  Siempre que se añada un dominio o alias a este servidor, que se superponga con una dirección externa, se eliminará la dirección externa.<br>\n  Utilice @dominio.tld para permitir enviar como *@dominio.tld.",
         "pushover_info": "La configuración de notificaciones push se aplicará a todos los mensajes limpios (no spam) entregados a <b>%s</b> incluyendo alias (compartidos, no compartidos, etiquetados).",
         "pushover_info": "La configuración de notificaciones push se aplicará a todos los mensajes limpios (no spam) entregados a <b>%s</b> incluyendo alias (compartidos, no compartidos, etiquetados).",

+ 1 - 1
data/web/lang/lang.fi-fi.json

@@ -13,7 +13,7 @@
         "quarantine_notification": "Muuta karanteeni-ilmoituksia",
         "quarantine_notification": "Muuta karanteeni-ilmoituksia",
         "ratelimit": "Määrä raja",
         "ratelimit": "Määrä raja",
         "recipient_maps": "Vastaanottajakartat",
         "recipient_maps": "Vastaanottajakartat",
-        "sogo_access": "Salli SOGo-pääsyn hallintaan",
+        "sogo_redirection": "Salli SOGo-pääsyn hallintaan",
         "sogo_profile_reset": "Nollaa SOGo-profiili",
         "sogo_profile_reset": "Nollaa SOGo-profiili",
         "spam_alias": "Väliaikaiset aliakset",
         "spam_alias": "Väliaikaiset aliakset",
         "spam_policy": "Musta lista / sallitut lista",
         "spam_policy": "Musta lista / sallitut lista",

+ 3 - 3
data/web/lang/lang.fr-fr.json

@@ -18,7 +18,7 @@
         "ratelimit": "Limite d'envoi",
         "ratelimit": "Limite d'envoi",
         "recipient_maps": "Cartes destinataire",
         "recipient_maps": "Cartes destinataire",
         "smtp_ip_access": "Changer les hôtes autorisés pour SMTP",
         "smtp_ip_access": "Changer les hôtes autorisés pour SMTP",
-        "sogo_access": "Autoriser la gestion des accès à SOGo",
+        "sogo_redirection": "Autoriser la gestion des accès à SOGo",
         "sogo_profile_reset": "Réinitialiser le profil SOGo",
         "sogo_profile_reset": "Réinitialiser le profil SOGo",
         "spam_alias": "Alias temporaires",
         "spam_alias": "Alias temporaires",
         "spam_policy": "Liste Noire/Liste Blanche",
         "spam_policy": "Liste Noire/Liste Blanche",
@@ -724,7 +724,7 @@
         "none_inherit": "Aucun / Héritage",
         "none_inherit": "Aucun / Héritage",
         "quota_warning_bcc": "Avertissement sur les quotas BCC",
         "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>.",
         "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": "Après s'être connecté, l'utilisateur est automatiquement redirigé vers SOGo.",
+        "sogo_redirection_info": "Après s'être connecté, l'utilisateur est automatiquement redirigé vers SOGo.",
         "admin": "Modifier l'administrateur",
         "admin": "Modifier l'administrateur",
         "password_recovery_email": "Adresse email de récupération",
         "password_recovery_email": "Adresse email de récupération",
         "mailbox_rename_title": "Nouveau nom de la partie locale de la boîte de réception",
         "mailbox_rename_title": "Nouveau nom de la partie locale de la boîte de réception",
@@ -732,7 +732,7 @@
         "mailbox_rename_agree": "J'ai fait une sauvegarde.",
         "mailbox_rename_agree": "J'ai fait une sauvegarde.",
         "mailbox_rename_warning": "IMPORTANT ! Faites une sauvegarde avant de renommer la boîte de réception.",
         "mailbox_rename_warning": "IMPORTANT ! Faites une sauvegarde avant de renommer la boîte de réception.",
         "mailbox_rename_alias": "Créer un alias automatiquement",
         "mailbox_rename_alias": "Créer un alias automatiquement",
-        "sogo_access": "Redirection directe vers SOGo",
+        "sogo_redirection": "Redirection directe vers SOGo",
         "pushover": "Pushover",
         "pushover": "Pushover",
         "pushover_sound": "Son"
         "pushover_sound": "Son"
     },
     },

+ 3 - 3
data/web/lang/lang.hu-hu.json

@@ -415,8 +415,8 @@
         "sieve_desc": "Rövid leírás",
         "sieve_desc": "Rövid leírás",
         "sieve_type": "Szűrő típusa",
         "sieve_type": "Szűrő típusa",
         "skipcrossduplicates": "Átugrani a duplikált üzeneteket a mappák között (aki előbb jön, előbb kapja)",
         "skipcrossduplicates": "Átugrani a duplikált üzeneteket a mappák között (aki előbb jön, előbb kapja)",
-        "sogo_access": "Közvetlen továbbítás a SOGo-ra",
-        "sogo_access_info": "A bejelentkezés után a felhasználó automatikusan átirányításra kerül a SOGo-ra.",
+        "sogo_redirection": "Közvetlen továbbítás a SOGo-ra",
+        "sogo_redirection_info": "A bejelentkezés után a felhasználó automatikusan átirányításra kerül a SOGo-ra.",
         "sogo_visible": "Alias látható a SOGo-ban",
         "sogo_visible": "Alias látható a SOGo-ban",
         "sogo_visible_info": "Ez az opció csak azokra az objektumokra vonatkozik, amelyek megjeleníthetők a SOGo-ban (megosztott vagy nem megosztott alias címek, amelyek legalább egy helyi postafiókra mutatnak). Ha el van rejtve, egy alias nem jelenik meg választható feladóként a SOGo-ban.",
         "sogo_visible_info": "Ez az opció csak azokra az objektumokra vonatkozik, amelyek megjeleníthetők a SOGo-ban (megosztott vagy nem megosztott alias címek, amelyek legalább egy helyi postafiókra mutatnak). Ha el van rejtve, egy alias nem jelenik meg választható feladóként a SOGo-ban.",
         "spam_alias": "Időkorlátos alias címek létrehozása vagy módosítása",
         "spam_alias": "Időkorlátos alias címek létrehozása vagy módosítása",
@@ -1048,7 +1048,7 @@
         "syncjobs": "Szinkronizálási feladatok",
         "syncjobs": "Szinkronizálási feladatok",
         "tls_policy": "TLS szabályzat",
         "tls_policy": "TLS szabályzat",
         "unlimited_quota": "Korlátlan kvóta a postafiókok számára",
         "unlimited_quota": "Korlátlan kvóta a postafiókok számára",
-        "sogo_access": "A SOGo-hozzáférés kezelésének lehetővé tétele",
+        "sogo_redirection": "A SOGo-hozzáférés kezelésének lehetővé tétele",
         "pw_reset": "Lehetővé teszi a mailcow felhasználói jelszavak visszaállítását"
         "pw_reset": "Lehetővé teszi a mailcow felhasználói jelszavak visszaállítását"
     },
     },
     "diagnostics": {
     "diagnostics": {

+ 3 - 3
data/web/lang/lang.it-it.json

@@ -21,7 +21,7 @@
         "ratelimit": "Limite di invio",
         "ratelimit": "Limite di invio",
         "recipient_maps": "Mappe dei destinatari",
         "recipient_maps": "Mappe dei destinatari",
         "smtp_ip_access": "Modifica gli host consentiti per SMTP",
         "smtp_ip_access": "Modifica gli host consentiti per SMTP",
-        "sogo_access": "Consenti la gestione dell'accesso SOGo",
+        "sogo_redirection": "Consenti la gestione dell'accesso SOGo",
         "sogo_profile_reset": "Ripristina profilo SOGo",
         "sogo_profile_reset": "Ripristina profilo SOGo",
         "spam_alias": "Alias temporanei",
         "spam_alias": "Alias temporanei",
         "spam_policy": "Blacklist/Whitelist",
         "spam_policy": "Blacklist/Whitelist",
@@ -671,8 +671,8 @@
         "validate_save": "Convalida e salva",
         "validate_save": "Convalida e salva",
         "pushover": "Pushover",
         "pushover": "Pushover",
         "none_inherit": "Nessuno / Eredita",
         "none_inherit": "Nessuno / Eredita",
-        "sogo_access": "Inoltro diretto a SOGo",
-        "sogo_access_info": "Dopo aver effettuato il login, l'utente viene automaticamente reindirizzato a SOGo.",
+        "sogo_redirection": "Inoltro diretto a SOGo",
+        "sogo_redirection_info": "Dopo aver effettuato il login, l'utente viene automaticamente reindirizzato a SOGo.",
         "acl": "ACL (autorizzazione)",
         "acl": "ACL (autorizzazione)",
         "app_passwd_protocols": "Protocolli consentiti per la password dell'app",
         "app_passwd_protocols": "Protocolli consentiti per la password dell'app",
         "last_modified": "Ultima modifica",
         "last_modified": "Ultima modifica",

+ 3 - 3
data/web/lang/lang.ja-jp.json

@@ -22,7 +22,7 @@
         "ratelimit": "レート制限",
         "ratelimit": "レート制限",
         "recipient_maps": "受信者マップ",
         "recipient_maps": "受信者マップ",
         "smtp_ip_access": "SMTPで許可されるホストの変更",
         "smtp_ip_access": "SMTPで許可されるホストの変更",
-        "sogo_access": "SOGoアクセス管理を許可",
+        "sogo_redirection": "SOGoアクセス管理を許可",
         "sogo_profile_reset": "SOGoプロファイルをリセット",
         "sogo_profile_reset": "SOGoプロファイルをリセット",
         "spam_alias": "一時的なエイリアス",
         "spam_alias": "一時的なエイリアス",
         "spam_policy": "ブラックリスト/ホワイトリスト",
         "spam_policy": "ブラックリスト/ホワイトリスト",
@@ -691,8 +691,8 @@
         "sieve_desc": "簡単な説明",
         "sieve_desc": "簡単な説明",
         "sieve_type": "フィルタータイプ",
         "sieve_type": "フィルタータイプ",
         "skipcrossduplicates": "フォルダー間で重複するメッセージをスキップ(先着順)",
         "skipcrossduplicates": "フォルダー間で重複するメッセージをスキップ(先着順)",
-        "sogo_access": "SOGoへの直接ログインアクセスを許可",
-        "sogo_access_info": "メールUI内からのシングルサインオンは引き続き動作します。この設定は他のすべてのサービスへのアクセスには影響しません。また、ユーザーの既存のSOGoプロファイルを削除または変更するものでもありません。",
+        "sogo_redirection": "SOGoへの直接ログインアクセスを許可",
+        "sogo_redirection_info": "メールUI内からのシングルサインオンは引き続き動作します。この設定は他のすべてのサービスへのアクセスには影響しません。また、ユーザーの既存のSOGoプロファイルを削除または変更するものでもありません。",
         "sogo_visible": "SOGoにエイリアスが表示される",
         "sogo_visible": "SOGoにエイリアスが表示される",
         "sogo_visible_info": "このオプションは、SOGoで表示可能なオブジェクト(ローカルメールボックスを指す共有または非共有のエイリアスアドレス)にのみ影響します。非表示にすると、SOGoで選択可能な送信者としてエイリアスは表示されません。",
         "sogo_visible_info": "このオプションは、SOGoで表示可能なオブジェクト(ローカルメールボックスを指す共有または非共有のエイリアスアドレス)にのみ影響します。非表示にすると、SOGoで選択可能な送信者としてエイリアスは表示されません。",
         "spam_alias": "時間制限付きエイリアスアドレスを作成または変更",
         "spam_alias": "時間制限付きエイリアスアドレスを作成または変更",

+ 1 - 1
data/web/lang/lang.ko-kr.json

@@ -17,7 +17,7 @@
         "ratelimit": "요청 제한",
         "ratelimit": "요청 제한",
         "recipient_maps": "수신자 맵",
         "recipient_maps": "수신자 맵",
         "smtp_ip_access": "SMTP에 허용된 호스트 변경",
         "smtp_ip_access": "SMTP에 허용된 호스트 변경",
-        "sogo_access": "SOGo 접근 관리 허용",
+        "sogo_redirection": "SOGo 접근 관리 허용",
         "sogo_profile_reset": "SOGo 프로필 초기화",
         "sogo_profile_reset": "SOGo 프로필 초기화",
         "spam_alias": "일임시 별칭",
         "spam_alias": "일임시 별칭",
         "spam_policy": "블랙리스트/화이트리스트",
         "spam_policy": "블랙리스트/화이트리스트",

+ 1 - 1
data/web/lang/lang.lt-lt.json

@@ -13,7 +13,7 @@
         "ratelimit": "Prieigos limitas",
         "ratelimit": "Prieigos limitas",
         "recipient_maps": "Gavėjų sąsajos",
         "recipient_maps": "Gavėjų sąsajos",
         "smtp_ip_access": "Pakeisti prieinamuosius SMTP serverius",
         "smtp_ip_access": "Pakeisti prieinamuosius SMTP serverius",
-        "sogo_access": "Leisti SOGo prieigos valdymą",
+        "sogo_redirection": "Leisti SOGo prieigos valdymą",
         "spam_policy": "Juodasis/Baltasis sąrašas",
         "spam_policy": "Juodasis/Baltasis sąrašas",
         "spam_score": "Šlamsto balas",
         "spam_score": "Šlamsto balas",
         "tls_policy": "TLS politika",
         "tls_policy": "TLS politika",

+ 2 - 2
data/web/lang/lang.lv-lv.json

@@ -24,7 +24,7 @@
         "quarantine_category": "Mainīt karantīnas paziņojumu kategoriju",
         "quarantine_category": "Mainīt karantīnas paziņojumu kategoriju",
         "quarantine_notification": "Mainīt karantīnas paziņojumus",
         "quarantine_notification": "Mainīt karantīnas paziņojumus",
         "smtp_ip_access": "Mainīt SMTP atļautos saimniekdatorus",
         "smtp_ip_access": "Mainīt SMTP atļautos saimniekdatorus",
-        "sogo_access": "Atļaut SOGo piekļuves pārvaldību",
+        "sogo_redirection": "Atļaut SOGo piekļuves pārvaldību",
         "sogo_profile_reset": "Atiestatīt SOGo profilu"
         "sogo_profile_reset": "Atiestatīt SOGo profilu"
     },
     },
     "add": {
     "add": {
@@ -319,7 +319,7 @@
         "sogo_visible": "Aizstājvārds ir redzams SOGo",
         "sogo_visible": "Aizstājvārds ir redzams SOGo",
         "sogo_visible_info": "Šī iespēja ietekmē tikai tos objektus, kurus var parādīt SOGo (koplietojamās vai nekoplietojamās aizstājadreses, kas norāda uz vismaz vienu vietējo pastkasti). Ja paslēpts, netiks parādīts SOGo kā atlasāms sūtītājs.",
         "sogo_visible_info": "Šī iespēja ietekmē tikai tos objektus, kurus var parādīt SOGo (koplietojamās vai nekoplietojamās aizstājadreses, kas norāda uz vismaz vienu vietējo pastkasti). Ja paslēpts, netiks parādīts SOGo kā atlasāms sūtītājs.",
         "mbox_rl_info": "Šis pieprasījumu ierobežojums tiek piemērots SASL pieteikšanās vārdam, tas atbilst jebkurai \"from\" adresei, ko izmanto lietotājs, kurš ir pieteicies. Pastkastes pieprasījumu ierobežojums pārraksta domēna mēroga pieprasījumu ierobežojumu.",
         "mbox_rl_info": "Šis pieprasījumu ierobežojums tiek piemērots SASL pieteikšanās vārdam, tas atbilst jebkurai \"from\" adresei, ko izmanto lietotājs, kurš ir pieteicies. Pastkastes pieprasījumu ierobežojums pārraksta domēna mēroga pieprasījumu ierobežojumu.",
-        "sogo_access": "Tieša pārvirzīšana uz SOGo",
+        "sogo_redirection": "Tieša pārvirzīšana uz SOGo",
         "disable_login": "Neļaut pieteikšanos (ienākošais pasts joprojām tiks pieņemts)",
         "disable_login": "Neļaut pieteikšanos (ienākošais pasts joprojām tiks pieņemts)",
         "app_passwd_protocols": "Atļautie lietotnes paroles protokoli",
         "app_passwd_protocols": "Atļautie lietotnes paroles protokoli",
         "allowed_protocols": "Atļautie protokoli tiešai lietotāja piekļuvei (neietekmē lietotnes paroles protokolus)",
         "allowed_protocols": "Atļautie protokoli tiešai lietotāja piekļuvei (neietekmē lietotnes paroles protokolus)",

+ 1 - 1
data/web/lang/lang.nb-no.json

@@ -168,7 +168,7 @@
         "spam_alias": "Midlertidige alias",
         "spam_alias": "Midlertidige alias",
         "spam_policy": "Svarteliste/Hvitliste",
         "spam_policy": "Svarteliste/Hvitliste",
         "unlimited_quota": "Ubegrenset kvote for postkasser",
         "unlimited_quota": "Ubegrenset kvote for postkasser",
-        "sogo_access": "Tillat administrasjon av SOGo-tilgang",
+        "sogo_redirection": "Tillat administrasjon av SOGo-tilgang",
         "syncjobs": "Synkroniser jobber",
         "syncjobs": "Synkroniser jobber",
         "spam_score": "Spam-resultat",
         "spam_score": "Spam-resultat",
         "recipient_maps": "Mottakerkart",
         "recipient_maps": "Mottakerkart",

+ 1 - 1
data/web/lang/lang.nl-nl.json

@@ -18,7 +18,7 @@
         "ratelimit": "Ratelimit",
         "ratelimit": "Ratelimit",
         "recipient_maps": "Ontvanger-maps",
         "recipient_maps": "Ontvanger-maps",
         "smtp_ip_access": "Wijzig toegestane hosts voor SMTP",
         "smtp_ip_access": "Wijzig toegestane hosts voor SMTP",
-        "sogo_access": "Sta beheer van SOGo-toegang toe",
+        "sogo_redirection": "Sta beheer van SOGo-toegang toe",
         "sogo_profile_reset": "Verwijder SOGo-profiel",
         "sogo_profile_reset": "Verwijder SOGo-profiel",
         "spam_alias": "Tijdelijke aliassen",
         "spam_alias": "Tijdelijke aliassen",
         "spam_policy": "Blacklist/Whitelist",
         "spam_policy": "Blacklist/Whitelist",

+ 3 - 3
data/web/lang/lang.pt-br.json

@@ -22,7 +22,7 @@
         "ratelimit": "Limite de taxa",
         "ratelimit": "Limite de taxa",
         "recipient_maps": "Mapas de destinatários",
         "recipient_maps": "Mapas de destinatários",
         "smtp_ip_access": "Alterar hosts permitidos para SMTP",
         "smtp_ip_access": "Alterar hosts permitidos para SMTP",
-        "sogo_access": "Permitir o gerenciamento do acesso ao SoGo",
+        "sogo_redirection": "Permitir o gerenciamento do acesso ao SoGo",
         "sogo_profile_reset": "Redefinir perfil SoGo",
         "sogo_profile_reset": "Redefinir perfil SoGo",
         "spam_alias": "Aliases temporários",
         "spam_alias": "Aliases temporários",
         "spam_policy": "Lista negra/lista branca",
         "spam_policy": "Lista negra/lista branca",
@@ -746,8 +746,8 @@
         "sieve_desc": "Breve descrição",
         "sieve_desc": "Breve descrição",
         "sieve_type": "Tipo de filtro",
         "sieve_type": "Tipo de filtro",
         "skipcrossduplicates": "Ignore mensagens duplicadas entre pastas (primeiro a chegar, primeiro a ser servido)",
         "skipcrossduplicates": "Ignore mensagens duplicadas entre pastas (primeiro a chegar, primeiro a ser servido)",
-        "sogo_access": "Encaminhamento direto para o SOGoo",
-        "sogo_access_info": "Depois de fazer login, o usuário é automaticamente redirecionado para o SOGo.",
+        "sogo_redirection": "Encaminhamento direto para o SOGoo",
+        "sogo_redirection_info": "Depois de fazer login, o usuário é automaticamente redirecionado para o SOGo.",
         "sogo_visible": "O alias é visível no SoGo",
         "sogo_visible": "O alias é visível no SoGo",
         "sogo_visible_info": "Essa opção afeta somente objetos, que podem ser exibidos no SoGo (endereços de alias compartilhados ou não compartilhados apontando para pelo menos uma mailbox local). Se estiver oculto, um alias não aparecerá como remetente selecionável no SoGo.",
         "sogo_visible_info": "Essa opção afeta somente objetos, que podem ser exibidos no SoGo (endereços de alias compartilhados ou não compartilhados apontando para pelo menos uma mailbox local). Se estiver oculto, um alias não aparecerá como remetente selecionável no SoGo.",
         "spam_alias": "Crie ou altere endereços de alias com limite de tempo",
         "spam_alias": "Crie ou altere endereços de alias com limite de tempo",

+ 3 - 3
data/web/lang/lang.ro-ro.json

@@ -21,7 +21,7 @@
         "ratelimit": "Rata limită",
         "ratelimit": "Rata limită",
         "recipient_maps": "Hărți recipient",
         "recipient_maps": "Hărți recipient",
         "smtp_ip_access": "Schimbați gazdele permise pentru SMTP",
         "smtp_ip_access": "Schimbați gazdele permise pentru SMTP",
-        "sogo_access": "Permiteți gestionarea accesului SOGo",
+        "sogo_redirection": "Permiteți gestionarea accesului SOGo",
         "sogo_profile_reset": "Resetează profilul SOGo",
         "sogo_profile_reset": "Resetează profilul SOGo",
         "spam_alias": "Aliasuri temporare",
         "spam_alias": "Aliasuri temporare",
         "spam_policy": "Lista neagră/Lista albă",
         "spam_policy": "Lista neagră/Lista albă",
@@ -604,8 +604,8 @@
         "sieve_desc": "Descriere scurtă",
         "sieve_desc": "Descriere scurtă",
         "sieve_type": "Tip filtru",
         "sieve_type": "Tip filtru",
         "skipcrossduplicates": "Sari peste mesajele duplicate din toate folderele (primul venit, primul servit)",
         "skipcrossduplicates": "Sari peste mesajele duplicate din toate folderele (primul venit, primul servit)",
-        "sogo_access": "Redirecționare directă către SOGo",
-        "sogo_access_info": "După logare, utilizatorul este redirecționat automat către SOGo.",
+        "sogo_redirection": "Redirecționare directă către SOGo",
+        "sogo_redirection_info": "După logare, utilizatorul este redirecționat automat către SOGo.",
         "sogo_visible": "Aliasul este vizibil în SOGo",
         "sogo_visible": "Aliasul este vizibil în SOGo",
         "sogo_visible_info": "Această opțiune afectează doar obiecte, care pot fi afișate în SOGo (adrese alias partajate sau ne-partajate cu cel puțin o căsuță poștală locală). Dacă este ascuns, un alias nu va apărea ca expeditor selectabil în SOGo.",
         "sogo_visible_info": "Această opțiune afectează doar obiecte, care pot fi afișate în SOGo (adrese alias partajate sau ne-partajate cu cel puțin o căsuță poștală locală). Dacă este ascuns, un alias nu va apărea ca expeditor selectabil în SOGo.",
         "spam_alias": "Crează sau modifică adrese alias limitate în funcție de timp",
         "spam_alias": "Crează sau modifică adrese alias limitate în funcție de timp",

+ 3 - 3
data/web/lang/lang.ru-ru.json

@@ -22,7 +22,7 @@
         "ratelimit": "Лимиты отправки",
         "ratelimit": "Лимиты отправки",
         "recipient_maps": "Перезапись получателя",
         "recipient_maps": "Перезапись получателя",
         "smtp_ip_access": "Настройка разрешенных IP для SMTP",
         "smtp_ip_access": "Настройка разрешенных IP для SMTP",
-        "sogo_access": "Управление доступом к SOGo",
+        "sogo_redirection": "Управление доступом к SOGo",
         "sogo_profile_reset": "Сброс профиля SOGo",
         "sogo_profile_reset": "Сброс профиля SOGo",
         "spam_alias": "Временные псевдонимы",
         "spam_alias": "Временные псевдонимы",
         "spam_policy": "Черные и белый списки",
         "spam_policy": "Черные и белый списки",
@@ -745,8 +745,8 @@
         "sieve_desc": "Краткое описание",
         "sieve_desc": "Краткое описание",
         "sieve_type": "Тип фильтра",
         "sieve_type": "Тип фильтра",
         "skipcrossduplicates": "Пропускать повторяющиеся сообщения в папках",
         "skipcrossduplicates": "Пропускать повторяющиеся сообщения в папках",
-        "sogo_access": "Прямая переадресация в SOGo",
-        "sogo_access_info": "После входа в систему пользователь автоматически перенаправляется в SOGo.",
+        "sogo_redirection": "Прямая переадресация в SOGo",
+        "sogo_redirection_info": "После входа в систему пользователь автоматически перенаправляется в SOGo.",
         "sogo_visible": "Отображать псевдоним в SOGo",
         "sogo_visible": "Отображать псевдоним в SOGo",
         "sogo_visible_info": "Влияет только на объекты, которые могут отображаться в SOGo (персональные или общие псевдонимы, указывающие как минимум на один локальный почтовый аккаунт). Учтите, что если функция отключена, у пользователей не будет возможности выбрать адрес псевдонима в качестве отправителя в SOGo.",
         "sogo_visible_info": "Влияет только на объекты, которые могут отображаться в SOGo (персональные или общие псевдонимы, указывающие как минимум на один локальный почтовый аккаунт). Учтите, что если функция отключена, у пользователей не будет возможности выбрать адрес псевдонима в качестве отправителя в SOGo.",
         "spam_alias": "Создать или изменить временные (спам) псевдонимы",
         "spam_alias": "Создать или изменить временные (спам) псевдонимы",

+ 3 - 3
data/web/lang/lang.si-si.json

@@ -17,7 +17,7 @@
         "ratelimit": "Omejitev pošiljanja",
         "ratelimit": "Omejitev pošiljanja",
         "recipient_maps": "Preslikave prejemnikov",
         "recipient_maps": "Preslikave prejemnikov",
         "smtp_ip_access": "Spremeni dovoljene gostitelje za SMTP",
         "smtp_ip_access": "Spremeni dovoljene gostitelje za SMTP",
-        "sogo_access": "Dovoli upravljanje SOGo dostopa",
+        "sogo_redirection": "Dovoli upravljanje SOGo dostopa",
         "sogo_profile_reset": "Ponastavi SOGo profil",
         "sogo_profile_reset": "Ponastavi SOGo profil",
         "spam_alias": "Začasni vzdevki",
         "spam_alias": "Začasni vzdevki",
         "spam_policy": "Seznam zavrnjenih/dovoljenih",
         "spam_policy": "Seznam zavrnjenih/dovoljenih",
@@ -746,8 +746,8 @@
         "sender_acl_disabled": "<span class=\"badge fs-6 bg-danger\">Preverjanje pošiljatelja je onemogočeno</span>",
         "sender_acl_disabled": "<span class=\"badge fs-6 bg-danger\">Preverjanje pošiljatelja je onemogočeno</span>",
         "sieve_type": "Vrsta filtra",
         "sieve_type": "Vrsta filtra",
         "skipcrossduplicates": "Preskoči podvojena sporočila med mapami (po principu \"kdor prej pride, prej melje\")",
         "skipcrossduplicates": "Preskoči podvojena sporočila med mapami (po principu \"kdor prej pride, prej melje\")",
-        "sogo_access": "Neposredno posredovanje na SOGo",
-        "sogo_access_info": "Po prijavi je uporabnik samodejno preusmerjen na SOGo.",
+        "sogo_redirection": "Neposredno posredovanje na SOGo",
+        "sogo_redirection_info": "Po prijavi je uporabnik samodejno preusmerjen na SOGo.",
         "sogo_visible": "Vzdevek je viden v SOGo",
         "sogo_visible": "Vzdevek je viden v SOGo",
         "sogo_visible_info": "Ta možnost vpliva samo na objekte, ki jih je mogoče prikazati v SOGo (naslovi vzdevkov v skupni rabi ali brez nje, ki kažejo na vsaj en lokalni poštni predal). Če je skrita, vzdevek ne bo prikazan kot izbirni pošiljatelj v SOGo.",
         "sogo_visible_info": "Ta možnost vpliva samo na objekte, ki jih je mogoče prikazati v SOGo (naslovi vzdevkov v skupni rabi ali brez nje, ki kažejo na vsaj en lokalni poštni predal). Če je skrita, vzdevek ne bo prikazan kot izbirni pošiljatelj v SOGo.",
         "spam_alias": "Ustvarjanje ali spreminjanje časovno omejenih vzdevkovnih naslovov",
         "spam_alias": "Ustvarjanje ali spreminjanje časovno omejenih vzdevkovnih naslovov",

+ 3 - 3
data/web/lang/lang.sk-sk.json

@@ -21,7 +21,7 @@
         "ratelimit": "Obmedzenie prenosu",
         "ratelimit": "Obmedzenie prenosu",
         "recipient_maps": "Mapy príjemcu",
         "recipient_maps": "Mapy príjemcu",
         "smtp_ip_access": "Spravovať povolených hostiteľov pre SMTP",
         "smtp_ip_access": "Spravovať povolených hostiteľov pre SMTP",
-        "sogo_access": "Povoliť spravovanie prístupu do SOGo",
+        "sogo_redirection": "Povoliť spravovanie prístupu do SOGo",
         "sogo_profile_reset": "Znovu nastaviť SOGo profil",
         "sogo_profile_reset": "Znovu nastaviť SOGo profil",
         "spam_alias": "Dočasné aliasy",
         "spam_alias": "Dočasné aliasy",
         "spam_policy": "Čierna listina/Biela listina",
         "spam_policy": "Čierna listina/Biela listina",
@@ -622,8 +622,8 @@
         "sieve_desc": "Krátky popis",
         "sieve_desc": "Krátky popis",
         "sieve_type": "Typ filtru",
         "sieve_type": "Typ filtru",
         "skipcrossduplicates": "Preskočiť duplikované správy naprieč priečinkami (akceptuje sa prvý nález)",
         "skipcrossduplicates": "Preskočiť duplikované správy naprieč priečinkami (akceptuje sa prvý nález)",
-        "sogo_access": "Priame presmerovanie na SOGo",
-        "sogo_access_info": "Po prihlásení je používateľ automaticky presmerovaný na službu SOGo.",
+        "sogo_redirection": "Priame presmerovanie na SOGo",
+        "sogo_redirection_info": "Po prihlásení je používateľ automaticky presmerovaný na službu SOGo.",
         "sogo_visible": "Alias je viditeľný v SOGo",
         "sogo_visible": "Alias je viditeľný v SOGo",
         "sogo_visible_info": "Táto voľba ovplyvňuje len objekty, ktoré dokážu byť zobrazené v SOGo (zdieľané alebo nezdieľané alias adresy ukazujúc na minimálne jednu lokálnu mailovú schránku). Ak je skrytý, alias nebude prezentovaný ako voliteľný odosielateľ v SOGo.",
         "sogo_visible_info": "Táto voľba ovplyvňuje len objekty, ktoré dokážu byť zobrazené v SOGo (zdieľané alebo nezdieľané alias adresy ukazujúc na minimálne jednu lokálnu mailovú schránku). Ak je skrytý, alias nebude prezentovaný ako voliteľný odosielateľ v SOGo.",
         "spam_alias": "Vytvoriť alebo zmeniť časovo limitované alias adresy",
         "spam_alias": "Vytvoriť alebo zmeniť časovo limitované alias adresy",

+ 1 - 1
data/web/lang/lang.sv-se.json

@@ -18,7 +18,7 @@
         "ratelimit": "Hastighetsgräns",
         "ratelimit": "Hastighetsgräns",
         "recipient_maps": "Kartor över mottagare",
         "recipient_maps": "Kartor över mottagare",
         "smtp_ip_access": "Ändra tillåtna värdar för SMTP",
         "smtp_ip_access": "Ändra tillåtna värdar för SMTP",
-        "sogo_access": "Tillåt hantering av SOGo-åtkomst",
+        "sogo_redirection": "Tillåt hantering av SOGo-åtkomst",
         "sogo_profile_reset": "Återställ SOGo-profil",
         "sogo_profile_reset": "Återställ SOGo-profil",
         "spam_alias": "Tillfälliga e-postalias",
         "spam_alias": "Tillfälliga e-postalias",
         "spam_policy": "Svartlista/Vitlista",
         "spam_policy": "Svartlista/Vitlista",

+ 3 - 3
data/web/lang/lang.tr-tr.json

@@ -21,7 +21,7 @@
         "ratelimit": "Rate limit",
         "ratelimit": "Rate limit",
         "recipient_maps": "Alıcı haritaları",
         "recipient_maps": "Alıcı haritaları",
         "smtp_ip_access": "SMTP için izin verilen host değerlerini değiştirme",
         "smtp_ip_access": "SMTP için izin verilen host değerlerini değiştirme",
-        "sogo_access": "SOGo erişiminin yönetilmesine izin verin",
+        "sogo_redirection": "SOGo erişiminin yönetilmesine izin verin",
         "sogo_profile_reset": "SOGo profilini sıfırla",
         "sogo_profile_reset": "SOGo profilini sıfırla",
         "spam_alias": "Geçici alias değerleri",
         "spam_alias": "Geçici alias değerleri",
         "spam_policy": "Kara Liste/Beyaz Liste",
         "spam_policy": "Kara Liste/Beyaz Liste",
@@ -409,7 +409,7 @@
         "footer_exclude": "Footerdan hariç tut",
         "footer_exclude": "Footerdan hariç tut",
         "last_modified": "Son değişiklik",
         "last_modified": "Son değişiklik",
         "lookup_mx": "Hedef, MX adıyla eşleşecek normal bir ifadedir (google.com ile biten bir MX'e hedeflenen tüm postaları bu atlama üzerinden yönlendirmek için <code>.*google\\\\.com</code>)",
         "lookup_mx": "Hedef, MX adıyla eşleşecek normal bir ifadedir (google.com ile biten bir MX'e hedeflenen tüm postaları bu atlama üzerinden yönlendirmek için <code>.*google\\\\.com</code>)",
-        "sogo_access_info": "Posta kullanıcı arayüzünden tek oturum açma çalışmaya devam eder. Bu ayar, diğer tüm hizmetlere erişimi etkilemez veya bir kullanıcının mevcut SOGo profilini silmez veya değiştirmez.",
+        "sogo_redirection_info": "Posta kullanıcı arayüzünden tek oturum açma çalışmaya devam eder. Bu ayar, diğer tüm hizmetlere erişimi etkilemez veya bir kullanıcının mevcut SOGo profilini silmez veya değiştirmez.",
         "comment_info": "Gizli bir yorum kullanıcı tarafından görülmezken, genel bir yorum, kullanıcının genel bakışında üzerine gelindiğinde araç ipucu olarak gösterilir.",
         "comment_info": "Gizli bir yorum kullanıcı tarafından görülmezken, genel bir yorum, kullanıcının genel bakışında üzerine gelindiğinde araç ipucu olarak gösterilir.",
         "sender_acl_info": "Posta kutusu A kullanıcısının posta kutusu kullanıcısı B olarak göndermesine izin veriliyorsa, gönderen adresi SOGo'da seçilebilir \\\"gönderen\\\" alanı olarak otomatik olarak görüntülenmez.<br>\\r\\n Posta kutusu B kullanıcısının izin vermesi için SOGo'da bir yetkilendirme oluşturması gerekir. posta kutusu kullanıcısı A, adresini gönderen olarak seçmek için. SOGo'da bir posta kutusuna yetki vermek için, posta görünümündeyken sol üstteki posta kutusu adınızın sağındaki menüyü (üç nokta) kullanın. Bu davranış, diğer ad adresleri için geçerli değildir.",
         "sender_acl_info": "Posta kutusu A kullanıcısının posta kutusu kullanıcısı B olarak göndermesine izin veriliyorsa, gönderen adresi SOGo'da seçilebilir \\\"gönderen\\\" alanı olarak otomatik olarak görüntülenmez.<br>\\r\\n Posta kutusu B kullanıcısının izin vermesi için SOGo'da bir yetkilendirme oluşturması gerekir. posta kutusu kullanıcısı A, adresini gönderen olarak seçmek için. SOGo'da bir posta kutusuna yetki vermek için, posta görünümündeyken sol üstteki posta kutusu adınızın sağındaki menüyü (üç nokta) kullanın. Bu davranış, diğer ad adresleri için geçerli değildir.",
         "sogo_visible_info": "Bu seçenek yalnızca SOGo'da görüntülenebilen nesneleri etkiler (en az bir yerel posta kutusuna işaret eden paylaşılan veya paylaşılmayan diğer ad adresleri). Gizliyse, bir takma ad SOGo'da seçilebilir gönderici olarak görünmez.",
         "sogo_visible_info": "Bu seçenek yalnızca SOGo'da görüntülenebilen nesneleri etkiler (en az bir yerel posta kutusuna işaret eden paylaşılan veya paylaşılmayan diğer ad adresleri). Gizliyse, bir takma ad SOGo'da seçilebilir gönderici olarak görünmez.",
@@ -518,7 +518,7 @@
         "relay_all_info": "↪ Tüm alıcıları geçirmek için <b>değil</b> seçerseniz, aktarılması gereken her alıcı için bir (\\\"kör\\\") posta kutusu eklemeniz gerekir.",
         "relay_all_info": "↪ Tüm alıcıları geçirmek için <b>değil</b> seçerseniz, aktarılması gereken her alıcı için bir (\\\"kör\\\") posta kutusu eklemeniz gerekir.",
         "relay_domain": "Bu etki alanını aktar",
         "relay_domain": "Bu etki alanını aktar",
         "relay_transport_info": "<div class=\\\"label label-info\\\">Bilgi</div> Bu etki alanı için özel bir hedef için taşıma haritaları tanımlayabilirsiniz. Ayarlanmazsa, bir MX araması yapılır.",
         "relay_transport_info": "<div class=\\\"label label-info\\\">Bilgi</div> Bu etki alanı için özel bir hedef için taşıma haritaları tanımlayabilirsiniz. Ayarlanmazsa, bir MX araması yapılır.",
-        "sogo_access": "SOGo'ya doğrudan giriş erişimi verin",
+        "sogo_redirection": "SOGo'ya doğrudan giriş erişimi verin",
         "spam_alias": "Zaman sınırlı takma ad adresleri oluşturun veya değiştirin",
         "spam_alias": "Zaman sınırlı takma ad adresleri oluşturun veya değiştirin",
         "spam_filter": "Spam filtresi",
         "spam_filter": "Spam filtresi",
         "disable_login": "Oturum açmaya izin verme (gelen posta hala kabul edilir)",
         "disable_login": "Oturum açmaya izin verme (gelen posta hala kabul edilir)",

+ 3 - 3
data/web/lang/lang.uk-ua.json

@@ -6,7 +6,7 @@
         "quarantine_category": "Категорія повідомлень про спам",
         "quarantine_category": "Категорія повідомлень про спам",
         "recipient_maps": "Перезапис одержувача",
         "recipient_maps": "Перезапис одержувача",
         "smtp_ip_access": "Налаштування дозволених IP для SMTP",
         "smtp_ip_access": "Налаштування дозволених IP для SMTP",
-        "sogo_access": "Управління доступом до SOGo",
+        "sogo_redirection": "Управління доступом до SOGo",
         "spam_score": "Політика фільтрації спаму",
         "spam_score": "Політика фільтрації спаму",
         "protocol_access": "Налаштування дозволених протоколів",
         "protocol_access": "Налаштування дозволених протоколів",
         "quarantine_notification": "Сповіщення про спам",
         "quarantine_notification": "Сповіщення про спам",
@@ -614,8 +614,8 @@
         "sieve_desc": "Короткий опис",
         "sieve_desc": "Короткий опис",
         "sieve_type": "Тип фільтра",
         "sieve_type": "Тип фільтра",
         "skipcrossduplicates": "Пропускати в папках повідомлення, що повторюються",
         "skipcrossduplicates": "Пропускати в папках повідомлення, що повторюються",
-        "sogo_access": "Пряме перенаправлення до SOGo",
-        "sogo_access_info": "Після входу користувач автоматично перенаправляється на SOGo.",
+        "sogo_redirection": "Пряме перенаправлення до SOGo",
+        "sogo_redirection_info": "Після входу користувач автоматично перенаправляється на SOGo.",
         "sogo_visible": "Відображати псевдонім у SOGo",
         "sogo_visible": "Відображати псевдонім у SOGo",
         "spam_alias": "Створити або змінити тимчасові (спам) псевдоніми",
         "spam_alias": "Створити або змінити тимчасові (спам) псевдоніми",
         "spam_filter": "Спам фільтр",
         "spam_filter": "Спам фільтр",

+ 3 - 3
data/web/lang/lang.zh-cn.json

@@ -21,7 +21,7 @@
         "ratelimit": "频率限制",
         "ratelimit": "频率限制",
         "recipient_maps": "收件人映射",
         "recipient_maps": "收件人映射",
         "smtp_ip_access": "更改 SMTP 允许主机",
         "smtp_ip_access": "更改 SMTP 允许主机",
-        "sogo_access": "允许管理 SOGo 访问权限",
+        "sogo_redirection": "允许管理 SOGo 访问权限",
         "sogo_profile_reset": "重置 SOGo 个人资料",
         "sogo_profile_reset": "重置 SOGo 个人资料",
         "spam_alias": "临时别名",
         "spam_alias": "临时别名",
         "spam_policy": "阻止名单/允许名单",
         "spam_policy": "阻止名单/允许名单",
@@ -700,8 +700,8 @@
         "sieve_desc": "简短描述",
         "sieve_desc": "简短描述",
         "sieve_type": "过滤器类型",
         "sieve_type": "过滤器类型",
         "skipcrossduplicates": "跳过其他文件夹中已存在的邮件(保留已经存在的邮件)",
         "skipcrossduplicates": "跳过其他文件夹中已存在的邮件(保留已经存在的邮件)",
-        "sogo_access": "直接转到 SOGo",
-        "sogo_access_info": "登录后,用户会自动跳转到 SOGo。",
+        "sogo_redirection": "直接转到 SOGo",
+        "sogo_redirection_info": "登录后,用户会自动跳转到 SOGo。",
         "sogo_visible": "SOGo 显示的别名",
         "sogo_visible": "SOGo 显示的别名",
         "sogo_visible_info": "此设置只影响 SOGo 上可显示的对象 (指向本地邮箱的共享或非共享别名地址)。如果设置为隐藏,则别名地址不会作为可选发件人的下拉项显示。",
         "sogo_visible_info": "此设置只影响 SOGo 上可显示的对象 (指向本地邮箱的共享或非共享别名地址)。如果设置为隐藏,则别名地址不会作为可选发件人的下拉项显示。",
         "spam_alias": "添加或更改临时别名地址",
         "spam_alias": "添加或更改临时别名地址",

+ 3 - 3
data/web/lang/lang.zh-tw.json

@@ -21,7 +21,7 @@
         "ratelimit": "速率限制",
         "ratelimit": "速率限制",
         "recipient_maps": "收件人規則表",
         "recipient_maps": "收件人規則表",
         "smtp_ip_access": "更改允許 SMTP 的主機",
         "smtp_ip_access": "更改允許 SMTP 的主機",
-        "sogo_access": "管理 SOGo 存取權",
+        "sogo_redirection": "管理 SOGo 存取權",
         "sogo_profile_reset": "重設 SOGo 個人資料",
         "sogo_profile_reset": "重設 SOGo 個人資料",
         "spam_alias": "臨時別名",
         "spam_alias": "臨時別名",
         "spam_policy": "黑名單/白名單",
         "spam_policy": "黑名單/白名單",
@@ -642,8 +642,8 @@
         "sieve_desc": "簡短描述",
         "sieve_desc": "簡短描述",
         "sieve_type": "過濾器類型",
         "sieve_type": "過濾器類型",
         "skipcrossduplicates": "跳過在其他資料夾中重複的郵件 (優先使用先找到的郵件)",
         "skipcrossduplicates": "跳過在其他資料夾中重複的郵件 (優先使用先找到的郵件)",
-        "sogo_access": "直接轉寄至SOGo",
-        "sogo_access_info": "登入後,使用者會自動重新導向至SOGo。",
+        "sogo_redirection": "直接轉寄至SOGo",
+        "sogo_redirection_info": "登入後,使用者會自動重新導向至SOGo。",
         "sogo_visible": "別名會在 SOGo 中顯示",
         "sogo_visible": "別名會在 SOGo 中顯示",
         "sogo_visible_info": "此選項只會影響可以顯示於 SOGo 上物件 (指向至少一個本地信箱的共享或非共享別名地址)。如果設為隱藏,別名地址將不會顯示於寄件人下拉選項中。",
         "sogo_visible_info": "此選項只會影響可以顯示於 SOGo 上物件 (指向至少一個本地信箱的共享或非共享別名地址)。如果設為隱藏,別名地址將不會顯示於寄件人下拉選項中。",
         "spam_alias": "新增或更改臨時別名地址",
         "spam_alias": "新增或更改臨時別名地址",

+ 2 - 1
data/web/sogo-auth.php

@@ -24,7 +24,7 @@ if (isset($_SERVER['PHP_AUTH_USER'])) {
     $is_eas = true;
     $is_eas = true;
   }
   }
   $login_check = check_login($username, $password, array('dav' => $is_dav, 'eas' => $is_eas));
   $login_check = check_login($username, $password, array('dav' => $is_dav, 'eas' => $is_eas));
-  if ($login_check === 'user') {
+  if ($login_check === 'user' && hasACLAccess('sogo_access')) {
     header("X-User: $username");
     header("X-User: $username");
     header("X-Auth: Basic ".base64_encode("$username:$password"));
     header("X-Auth: Basic ".base64_encode("$username:$password"));
     header("X-Auth-Type: Basic");
     header("X-Auth-Type: Basic");
@@ -44,6 +44,7 @@ elseif (isset($_GET['login'])) {
   // check permissions (if dual_login is active, deny sso when acl is not given)
   // check permissions (if dual_login is active, deny sso when acl is not given)
   $login = html_entity_decode(rawurldecode($_GET["login"]));
   $login = html_entity_decode(rawurldecode($_GET["login"]));
   if (isset($_SESSION['mailcow_cc_role']) &&
   if (isset($_SESSION['mailcow_cc_role']) &&
+     hasACLAccess('sogo_access') &&
     (($_SESSION['acl']['login_as'] == "1" && $ALLOW_ADMIN_EMAIL_LOGIN !== 0) || ($is_dual === false && $login == $_SESSION['mailcow_cc_username']))) {
     (($_SESSION['acl']['login_as'] == "1" && $ALLOW_ADMIN_EMAIL_LOGIN !== 0) || ($is_dual === false && $login == $_SESSION['mailcow_cc_username']))) {
     if (filter_var($login, FILTER_VALIDATE_EMAIL)) {
     if (filter_var($login, FILTER_VALIDATE_EMAIL)) {
       if (user_get_alias_details($login) !== false) {
       if (user_get_alias_details($login) !== false) {

+ 4 - 3
data/web/templates/edit/mailbox-templates.twig

@@ -8,7 +8,7 @@
 
 
     <input type="hidden" value="default" name="sender_acl">
     <input type="hidden" value="default" name="sender_acl">
     <input type="hidden" value="0" name="force_pw_update">
     <input type="hidden" value="0" name="force_pw_update">
-    <input type="hidden" value="0" name="sogo_access">
+    <input type="hidden" value="0" name="sogo_redirection">
     <input type="hidden" value="0" name="protocol_access">
     <input type="hidden" value="0" name="protocol_access">
 
 
     <div class="row mb-4">
     <div class="row mb-4">
@@ -123,6 +123,7 @@
           <option value="syncjobs" {% if template.attributes.acl_syncjobs == '1' %} selected{% endif %}>{{ lang.acl["syncjobs"] }}</option>
           <option value="syncjobs" {% if template.attributes.acl_syncjobs == '1' %} selected{% endif %}>{{ lang.acl["syncjobs"] }}</option>
           <option value="eas_reset" {% if template.attributes.acl_eas_reset == '1' %} selected{% endif %}>{{ lang.acl["eas_reset"] }}</option>
           <option value="eas_reset" {% if template.attributes.acl_eas_reset == '1' %} selected{% endif %}>{{ lang.acl["eas_reset"] }}</option>
           <option value="sogo_profile_reset" {% if template.attributes.acl_sogo_profile_reset == '1' %} selected{% endif %}>{{ lang.acl["sogo_profile_reset"] }}</option>
           <option value="sogo_profile_reset" {% if template.attributes.acl_sogo_profile_reset == '1' %} selected{% endif %}>{{ lang.acl["sogo_profile_reset"] }}</option>
+          <option value="sogo_access" {% if template.attributes.acl_sogo_access == '1' %} selected{% endif %}>{{ lang.acl["sogo_access"] }}</option>
           <option value="pushover" {% if template.attributes.acl_pushover == '1' %} selected{% endif %}>{{ lang.acl["pushover"] }}</option>
           <option value="pushover" {% if template.attributes.acl_pushover == '1' %} selected{% endif %}>{{ lang.acl["pushover"] }}</option>
           <option value="quarantine" {% if template.attributes.acl_quarantine == '1' %} selected{% endif %}>{{ lang.acl["quarantine"] }}</option>
           <option value="quarantine" {% if template.attributes.acl_quarantine == '1' %} selected{% endif %}>{{ lang.acl["quarantine"] }}</option>
           <option value="quarantine_attachments" {% if template.attributes.acl_quarantine_attachments == '1' %} selected{% endif %}>{{ lang.acl["quarantine_attachments"] }}</option>
           <option value="quarantine_attachments" {% if template.attributes.acl_quarantine_attachments == '1' %} selected{% endif %}>{{ lang.acl["quarantine_attachments"] }}</option>
@@ -167,8 +168,8 @@
     <div class="row">
     <div class="row">
       <div class="offset-sm-2 col-sm-10">
       <div class="offset-sm-2 col-sm-10">
         <div class="form-check">
         <div class="form-check">
-          <label><input type="checkbox" class="form-check-input" value="1" name="sogo_access"{% if template.attributes.sogo_access == '1' %} checked{% endif %}> {{ lang.edit.sogo_access }}</label>
-          <small class="text-muted">{{ lang.edit.sogo_access_info }}</small>
+          <label><input type="checkbox" class="form-check-input" value="1" name="sogo_redirection"{% if template.attributes.sogo_redirection == '1' %} checked{% endif %}> {{ lang.edit.sogo_redirection }}</label>
+          <small class="text-muted">{{ lang.edit.sogo_redirection_info }}</small>
         </div>
         </div>
       </div>
       </div>
     </div>
     </div>

+ 20 - 7
data/web/templates/edit/mailbox.twig

@@ -24,7 +24,7 @@
                 <form class="form-horizontal" data-id="editmailbox" role="form" method="post">
                 <form class="form-horizontal" data-id="editmailbox" role="form" method="post">
                   <input type="hidden" value="default" name="sender_acl">
                   <input type="hidden" value="default" name="sender_acl">
                   <input type="hidden" value="0" name="force_pw_update">
                   <input type="hidden" value="0" name="force_pw_update">
-                  <input type="hidden" value="0" name="sogo_access">
+                  <input type="hidden" value="0" name="sogo_redirection">
                   <input type="hidden" value="0" name="protocol_access">
                   <input type="hidden" value="0" name="protocol_access">
                   <div class="row mb-2">
                   <div class="row mb-2">
                     <label class="control-label col-sm-2">{{ lang.admin.iam }}</label>
                     <label class="control-label col-sm-2">{{ lang.admin.iam }}</label>
@@ -310,11 +310,11 @@
                     </div>
                     </div>
                   </div>
                   </div>
                   {% if not skip_sogo %}
                   {% if not skip_sogo %}
-                  <div data-acl="{{ acl.sogo_access }}" class="row">
+                  <div data-acl="{{ acl.sogo_redirection }}" class="row">
                     <div class="offset-sm-2 col-sm-10">
                     <div class="offset-sm-2 col-sm-10">
                       <div class="form-check">
                       <div class="form-check">
-                        <label><input type="checkbox" class="form-check-input" value="1" name="sogo_access"{% if result.attributes.sogo_access == '1' %} checked{% endif %}> {{ lang.edit.sogo_access }}</label>
-                        <small class="text-muted">{{ lang.edit.sogo_access_info }}</small>
+                        <label><input type="checkbox" class="form-check-input" value="1" name="sogo_redirection"{% if result.attributes.sogo_redirection == '1' %} checked{% endif %}> {{ lang.edit.sogo_redirection }}</label>
+                        <small class="text-muted">{{ lang.edit.sogo_redirection_info }}</small>
                       </div>
                       </div>
                     </div>
                     </div>
                   </div>
                   </div>
@@ -485,9 +485,22 @@
                     </div>
                     </div>
                     <div class="col-sm-10">
                     <div class="col-sm-10">
                       <select id="user_acl" name="user_acl" size="10" multiple>
                       <select id="user_acl" name="user_acl" size="10" multiple>
-                        {% for acl, val in user_acls %}
-                          <option value="{{ acl }}"{% if val == 1 %} selected{% endif %}>{{ lang.acl[acl] }}</option>
-                        {% endfor %}
+                        <option value="spam_alias" {% if user_acls.spam_alias == '1' %} selected{% endif %}>{{ lang.acl["spam_alias"] }}</option>
+                        <option value="tls_policy" {% if user_acls.tls_policy == '1' %} selected{% endif %}>{{ lang.acl["tls_policy"] }}</option>
+                        <option value="spam_score" {% if user_acls.spam_score == '1' %} selected{% endif %}>{{ lang.acl["spam_score"] }}</option>
+                        <option value="spam_policy" {% if user_acls.spam_policy == '1' %} selected{% endif %}>{{ lang.acl["spam_policy"] }}</option>
+                        <option value="delimiter_action" {% if user_acls.delimiter_action == '1' %} selected{% endif %}>{{ lang.acl["delimiter_action"] }}</option>
+                        <option value="syncjobs" {% if user_acls.syncjobs == '1' %} selected{% endif %}>{{ lang.acl["syncjobs"] }}</option>
+                        <option value="eas_reset" {% if user_acls.eas_reset == '1' %} selected{% endif %}>{{ lang.acl["eas_reset"] }}</option>
+                        <option value="sogo_profile_reset" {% if user_acls.sogo_profile_reset == '1' %} selected{% endif %}>{{ lang.acl["sogo_profile_reset"] }}</option>
+                        <option value="sogo_access" {% if user_acls.sogo_access == '1' %} selected{% endif %}>{{ lang.acl["sogo_access"] }}</option>
+                        <option value="pushover" {% if user_acls.pushover == '1' %} selected{% endif %}>{{ lang.acl["pushover"] }}</option>
+                        <option value="quarantine" {% if user_acls.quarantine == '1' %} selected{% endif %}>{{ lang.acl["quarantine"] }}</option>
+                        <option value="quarantine_attachments" {% if user_acls.quarantine_attachments == '1' %} selected{% endif %}>{{ lang.acl["quarantine_attachments"] }}</option>
+                        <option value="quarantine_notification" {% if user_acls.quarantine_notification == '1' %} selected{% endif %}>{{ lang.acl["quarantine_notification"] }}</option>
+                        <option value="quarantine_category" {% if user_acls.quarantine_category == '1' %} selected{% endif %}>{{ lang.acl["quarantine_category"] }}</option>
+                        <option value="app_passwds" {% if user_acls.app_passwds == '1' %} selected{% endif %}>{{ lang.acl["app_passwds"] }}</option>
+                        <option value="pw_reset" {% if user_acls.pw_reset == '1' %} selected{% endif %}>{{ lang.acl["pw_reset"] }}</option>
                       </select>
                       </select>
                       <button class="btn btn-xs-lg d-block d-sm-inline btn-secondary" data-action="edit_selected" data-id="useracl" data-item="{{ mailbox }}" data-api-url='edit/user-acl' data-api-attr='{}' href="#">{{ lang.edit.save }}</button>
                       <button class="btn btn-xs-lg d-block d-sm-inline btn-secondary" data-action="edit_selected" data-id="useracl" data-item="{{ mailbox }}" data-api-url='edit/user-acl' data-api-attr='{}' href="#">{{ lang.edit.save }}</button>
                     </div>
                     </div>

+ 8 - 6
data/web/templates/modals/mailbox.twig

@@ -9,7 +9,7 @@
       <div class="modal-body">
       <div class="modal-body">
         <form class="form-horizontal" data-cached-form="true" data-id="add_mailbox" role="form" autocomplete="off">
         <form class="form-horizontal" data-cached-form="true" data-id="add_mailbox" role="form" autocomplete="off">
           <input type="hidden" value="0" name="force_pw_update">
           <input type="hidden" value="0" name="force_pw_update">
-          <input type="hidden" value="0" name="sogo_access">
+          <input type="hidden" value="0" name="sogo_redirection">
           <input type="hidden" value="0" name="protocol_access">
           <input type="hidden" value="0" name="protocol_access">
           <input type="hidden" value="mailcow" name="authsource">
           <input type="hidden" value="mailcow" name="authsource">
 
 
@@ -163,6 +163,7 @@
                   <option value="syncjobs">{{ lang.acl["syncjobs"] }}</option>
                   <option value="syncjobs">{{ lang.acl["syncjobs"] }}</option>
                   <option value="eas_reset" selected>{{ lang.acl["eas_reset"] }}</option>
                   <option value="eas_reset" selected>{{ lang.acl["eas_reset"] }}</option>
                   <option value="sogo_profile_reset">{{ lang.acl["sogo_profile_reset"] }}</option>
                   <option value="sogo_profile_reset">{{ lang.acl["sogo_profile_reset"] }}</option>
+                  <option value="sogo_access">{{ lang.acl["sogo_access"] }}</option>
                   <option value="pushover" selected>{{ lang.acl["pushover"] }}</option>
                   <option value="pushover" selected>{{ lang.acl["pushover"] }}</option>
                   <option value="quarantine" selected>{{ lang.acl["quarantine"] }}</option>
                   <option value="quarantine" selected>{{ lang.acl["quarantine"] }}</option>
                   <option value="quarantine_attachments" selected>{{ lang.acl["quarantine_attachments"] }}</option>
                   <option value="quarantine_attachments" selected>{{ lang.acl["quarantine_attachments"] }}</option>
@@ -206,8 +207,8 @@
           <div class="row">
           <div class="row">
             <div class="offset-sm-2 col-sm-10">
             <div class="offset-sm-2 col-sm-10">
               <div class="form-check">
               <div class="form-check">
-                <label><input type="checkbox" class="form-check-input" value="1" name="sogo_access" id="sogo_access"> {{ lang.edit.sogo_access }}</label>
-                <small class="text-muted">{{ lang.edit.sogo_access_info }}</small>
+                <label><input type="checkbox" class="form-check-input" value="1" name="sogo_redirection" id="sogo_redirection"> {{ lang.edit.sogo_redirection }}</label>
+                <small class="text-muted">{{ lang.edit.sogo_redirection_info }}</small>
               </div>
               </div>
             </div>
             </div>
           </div>
           </div>
@@ -235,7 +236,7 @@
         <form class="form-horizontal" data-id="addmailbox_template" role="form" method="post">
         <form class="form-horizontal" data-id="addmailbox_template" role="form" method="post">
           <input type="hidden" value="default" name="sender_acl">
           <input type="hidden" value="default" name="sender_acl">
           <input type="hidden" value="0" name="force_pw_update">
           <input type="hidden" value="0" name="force_pw_update">
-          <input type="hidden" value="0" name="sogo_access">
+          <input type="hidden" value="0" name="sogo_redirection">
           <input type="hidden" value="0" name="protocol_access">
           <input type="hidden" value="0" name="protocol_access">
 
 
           <div class="row mb-4">
           <div class="row mb-4">
@@ -350,6 +351,7 @@
                 <option value="syncjobs">{{ lang.acl["syncjobs"] }}</option>
                 <option value="syncjobs">{{ lang.acl["syncjobs"] }}</option>
                 <option value="eas_reset" selected>{{ lang.acl["eas_reset"] }}</option>
                 <option value="eas_reset" selected>{{ lang.acl["eas_reset"] }}</option>
                 <option value="sogo_profile_reset">{{ lang.acl["sogo_profile_reset"] }}</option>
                 <option value="sogo_profile_reset">{{ lang.acl["sogo_profile_reset"] }}</option>
+                <option value="sogo_access">{{ lang.acl["sogo_access"] }}</option>
                 <option value="pushover" selected>{{ lang.acl["pushover"] }}</option>
                 <option value="pushover" selected>{{ lang.acl["pushover"] }}</option>
                 <option value="quarantine" selected>{{ lang.acl["quarantine"] }}</option>
                 <option value="quarantine" selected>{{ lang.acl["quarantine"] }}</option>
                 <option value="quarantine_attachments" selected>{{ lang.acl["quarantine_attachments"] }}</option>
                 <option value="quarantine_attachments" selected>{{ lang.acl["quarantine_attachments"] }}</option>
@@ -394,8 +396,8 @@
           <div class="row">
           <div class="row">
             <div class="offset-sm-2 col-sm-10">
             <div class="offset-sm-2 col-sm-10">
               <div class="form-check">
               <div class="form-check">
-                <label><input type="checkbox" class="form-check-input" value="1" name="sogo_access"> {{ lang.edit.sogo_access }}</label>
-                <small class="text-muted">{{ lang.edit.sogo_access_info }}</small>
+                <label><input type="checkbox" class="form-check-input" value="1" name="sogo_redirection"> {{ lang.edit.sogo_redirection }}</label>
+                <small class="text-muted">{{ lang.edit.sogo_redirection_info }}</small>
               </div>
               </div>
             </div>
             </div>
           </div>
           </div>

+ 5 - 1
data/web/templates/user/tab-user-auth.twig

@@ -23,10 +23,14 @@
                 <a href="/sogo-auth.php?login={{ mailcow_cc_username  }}" role="button" class="btn btn-primary btn-lg btn-block btn-xs-lg w-100">
                 <a href="/sogo-auth.php?login={{ mailcow_cc_username  }}" role="button" class="btn btn-primary btn-lg btn-block btn-xs-lg w-100">
                   {{ lang.user.open_webmail_sso }} <i class="bi bi-arrow-right"></i>
                   {{ lang.user.open_webmail_sso }} <i class="bi bi-arrow-right"></i>
                 </a>
                 </a>
-              {% else %}
+              {% elseif acl.sogo_access == 1 %}
                 <a href="/SOGo/so" role="button" class="btn btn-primary btn-lg btn-block btn-xs-lg w-100">
                 <a href="/SOGo/so" role="button" class="btn btn-primary btn-lg btn-block btn-xs-lg w-100">
                   {{ lang.user.open_webmail_sso }} <i class="bi bi-arrow-right"></i>
                   {{ lang.user.open_webmail_sso }} <i class="bi bi-arrow-right"></i>
                 </a>
                 </a>
+              {% else %}
+                <button disabled class="btn btn-secondary btn-block btn-xs-lg w-100">
+                  {{ lang.user.open_webmail_sso }} <i class="bi bi-arrow-right"></i>
+                </button>
               {% endif %}
               {% endif %}
             </div>
             </div>
           </div>
           </div>