Browse Source

[Web] Various PHP 8 fixes, partly fixes #4219

andryyy 4 năm trước cách đây
mục cha
commit
2cd0b56b14

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 140 - 256
data/web/edit.php


+ 3 - 3
data/web/inc/ajax/dns_diagnostics.php

@@ -268,9 +268,9 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm
           $currents = dns_get_record($record[0], 52, $_, $_, TRUE);
           foreach ($currents as &$current) {
             $current['type'] = 'TLSA';
-            $current['cert_usage'] = hexdec(bin2hex($current['data']{0}));
-            $current['selector'] = hexdec(bin2hex($current['data']{1}));
-            $current['match_type'] = hexdec(bin2hex($current['data']{2}));
+            $current['cert_usage'] = hexdec(bin2hex($current['data'][0]));
+            $current['selector'] = hexdec(bin2hex($current['data'][1]));
+            $current['match_type'] = hexdec(bin2hex($current['data'][2]));
             $current['cert_data'] = bin2hex(substr($current['data'], 3));
             $current['data'] = $current['cert_usage'] . ' ' . $current['selector'] . ' ' . $current['match_type'] . ' ' . $current['cert_data'];
           }

+ 6 - 6
data/web/inc/functions.dkim.inc.php

@@ -1,8 +1,8 @@
 <?php
 
 function dkim($_action, $_data = null, $privkey = false) {
-	global $redis;
-	global $lang;
+  global $redis;
+  global $lang;
   switch ($_action) {
     case 'add':
       if ($_SESSION['mailcow_cc_role'] != "admin") {
@@ -13,7 +13,7 @@ function dkim($_action, $_data = null, $privkey = false) {
         );
         return false;
       }
-      $key_length	= intval($_data['key_size']);
+      $key_length = intval($_data['key_size']);
       $dkim_selector = (isset($_data['dkim_selector'])) ? $_data['dkim_selector'] : 'dkim';
       $domains = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['domains']));
       $domains = array_filter($domains);
@@ -167,9 +167,9 @@ function dkim($_action, $_data = null, $privkey = false) {
       array_shift($pem_public_key_array);
       array_pop($pem_public_key_array);
       // Implode as single string
-      $pem_public_key = implode('', $pem_public_key_array);
+      $pem_public_key = implode('', (array)$pem_public_key_array);
       $dkim_selector = (isset($_data['dkim_selector'])) ? $_data['dkim_selector'] : 'dkim';
-      $domain	= $_data['domain'];
+      $domain = $_data['domain'];
       if (!is_valid_domain_name($domain)) {
         $_SESSION['return'][] = array(
           'type' => 'danger',
@@ -251,7 +251,7 @@ function dkim($_action, $_data = null, $privkey = false) {
         }
         if ($GLOBALS['SPLIT_DKIM_255'] === true) {
           $dkim_txt_tmp = str_split('v=DKIM1;k=rsa;t=s;s=email;p=' . $redis_dkim_key_data, 255);
-          $dkimdata['dkim_txt'] = sprintf('"%s"', implode('" "', $dkim_txt_tmp ) );
+          $dkimdata['dkim_txt'] = sprintf('"%s"', implode('" "', (array)$dkim_txt_tmp ) );
         }
         else {
           $dkimdata['dkim_txt'] = 'v=DKIM1;k=rsa;t=s;s=email;p=' . $redis_dkim_key_data;

+ 2 - 2
data/web/inc/functions.fail2ban.inc.php

@@ -18,7 +18,7 @@ function fail2ban($_action, $_data = null) {
           }
           if (isset($tmp_wl_data)) {
             natsort($tmp_wl_data);
-            $f2b_options['whitelist'] = implode(PHP_EOL, $tmp_wl_data);
+            $f2b_options['whitelist'] = implode(PHP_EOL, (array)$tmp_wl_data);
           }
           else {
             $f2b_options['whitelist'] = "";
@@ -34,7 +34,7 @@ function fail2ban($_action, $_data = null) {
           }
           if (isset($tmp_bl_data)) {
             natsort($tmp_bl_data);
-            $f2b_options['blacklist'] = implode(PHP_EOL, $tmp_bl_data);
+            $f2b_options['blacklist'] = implode(PHP_EOL, (array)$tmp_bl_data);
           }
           else {
             $f2b_options['blacklist'] = "";

+ 4 - 4
data/web/inc/functions.fwdhost.inc.php

@@ -1,8 +1,8 @@
 <?php
 function fwdhost($_action, $_data = null) {
   require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/spf.inc.php';
-	global $redis;
-	global $lang;
+  global $redis;
+  global $lang;
   $_data_log = $_data;
   switch ($_action) {
     case 'add':
@@ -57,7 +57,7 @@ function fwdhost($_action, $_data = null) {
       $_SESSION['return'][] = array(
         'type' => 'success',
         'log' => array(__FUNCTION__, $_action, $_data_log),
-        'msg' => array('forwarding_host_added', htmlspecialchars(implode(', ', $hosts)))
+        'msg' => array('forwarding_host_added', htmlspecialchars(implode(', ', (array)$hosts)))
       );
     break;
     case 'edit':
@@ -180,4 +180,4 @@ function fwdhost($_action, $_data = null) {
       return $fwdhostdetails;
     break;
   }
-}
+}

+ 4 - 4
data/web/inc/functions.inc.php

@@ -201,7 +201,7 @@ function password_complexity($_action, $_data = null) {
           $policy_text[] = sprintf($lang['admin']["password_policy_$name"], $value);
         }
       }
-      return '<p class="help-block small">- ' . implode('<br>- ', $policy_text) . '</p>';
+      return '<p class="help-block small">- ' . implode('<br>- ', (array)$policy_text) . '</p>';
     break;
   }
 }
@@ -982,8 +982,8 @@ function edit_user_account($_data) {
     return false;
   }
   if (!empty($_data['user_new_pass']) && !empty($_data['user_new_pass2'])) {
-    $password_new	= $_data['user_new_pass'];
-    $password_new2	= $_data['user_new_pass2'];
+    $password_new = $_data['user_new_pass'];
+    $password_new2  = $_data['user_new_pass2'];
     if (password_check($password_new, $password_new2) !== true) {
       return false;
     }
@@ -1010,7 +1010,7 @@ function user_get_alias_details($username) {
   $data['direct_aliases'] = array();
   $data['shared_aliases'] = array();
   if ($_SESSION['mailcow_cc_role'] == "user") {
-    $username	= $_SESSION['mailcow_cc_username'];
+    $username = $_SESSION['mailcow_cc_username'];
   }
   if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {
     return false;

+ 21 - 21
data/web/inc/functions.mailbox.inc.php

@@ -448,17 +448,17 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             );
             return false;
           }
-          $domain				= idn_to_ascii(strtolower(trim($_data['domain'])), 0, INTL_IDNA_VARIANT_UTS46);
+          $domain       = idn_to_ascii(strtolower(trim($_data['domain'])), 0, INTL_IDNA_VARIANT_UTS46);
           $description  = $_data['description'];
           if (empty($description)) {
             $description = $domain;
           }
-          $aliases			= (int)$_data['aliases'];
+          $aliases      = (int)$_data['aliases'];
           $mailboxes    = (int)$_data['mailboxes'];
-          $defquota			= (int)$_data['defquota'];
-          $maxquota			= (int)$_data['maxquota'];
+          $defquota     = (int)$_data['defquota'];
+          $maxquota     = (int)$_data['maxquota'];
           $restart_sogo = (int)$_data['restart_sogo'];
-          $quota				= (int)$_data['quota'];
+          $quota        = (int)$_data['quota'];
           if ($defquota > $maxquota) {
             $_SESSION['return'][] = array(
                 'type' => 'danger',
@@ -683,7 +683,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             $gotos = array_unique($gotos);
             $gotos = array_filter($gotos);
             if (empty($gotos)) { return false; }
-            $goto = implode(",", $gotos);
+            $goto = implode(",", (array)$gotos);
           }
           foreach ($addresses as $address) {
             if (empty($address)) {
@@ -936,7 +936,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
           $password     = $_data['password'];
           $password2    = $_data['password2'];
           $name         = ltrim(rtrim($_data['name'], '>'), '<');
-          $quota_m			= intval($_data['quota']);
+          $quota_m      = intval($_data['quota']);
           if ((!isset($_SESSION['acl']['unlimited_quota']) || $_SESSION['acl']['unlimited_quota'] != "1") && $quota_m === 0) {
             $_SESSION['return'][] = array(
               'type' => 'danger',
@@ -959,7 +959,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
           $relayhost = (isset($_data['relayhost'])) ? intval($_data['relayhost']) : 0;
           $quarantine_notification = (isset($_data['quarantine_notification'])) ? strval($_data['quarantine_notification']) : strval($MAILBOX_DEFAULT_ATTRIBUTES['quarantine_notification']);
           $quarantine_category = (isset($_data['quarantine_category'])) ? strval($_data['quarantine_category']) : strval($MAILBOX_DEFAULT_ATTRIBUTES['quarantine_category']);
-          $quota_b		= ($quota_m * 1048576);
+          $quota_b    = ($quota_m * 1048576);
           $mailbox_attrs = json_encode(
             array(
               'force_pw_update' => strval($force_pw_update),
@@ -1494,8 +1494,8 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
               );
               continue;
             }
-            $lowspamlevel	= explode(',', $_data['spam_score'])[0];
-            $highspamlevel	= explode(',', $_data['spam_score'])[1];
+            $lowspamlevel = explode(',', $_data['spam_score'])[0];
+            $highspamlevel  = explode(',', $_data['spam_score'])[1];
             if (!is_numeric($lowspamlevel) || !is_numeric($highspamlevel)) {
               $_SESSION['return'][] = array(
                 'type' => 'danger',
@@ -1572,7 +1572,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             $_SESSION['return'][] = array(
               'type' => 'success',
               'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
-              'msg' => array('mailbox_modified', htmlspecialchars(implode(', ', $usernames)))
+              'msg' => array('mailbox_modified', htmlspecialchars(implode(', ', (array)$usernames)))
             );
           }
         break;
@@ -2080,7 +2080,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
               }
               $gotos = array_unique($gotos);
               $gotos = array_filter($gotos);
-              $goto = implode(",", $gotos);
+              $goto = implode(",", (array)$gotos);
             }
             if (!empty($goto)) {
               $stmt = $pdo->prepare("UPDATE `alias` SET
@@ -3002,7 +3002,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             while($field = array_shift($fields)) {
               $shown_fields[] = $field['Field'];
             }
-            $stmt = $pdo->prepare("SELECT " . implode(',', $shown_fields) . ",
+            $stmt = $pdo->prepare("SELECT " . implode(',', (array)$shown_fields) . ",
               `active`
                 FROM `imapsync` WHERE id = :id");
           }
@@ -3017,7 +3017,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             while($field = array_shift($fields)) {
               $shown_fields[] = $field['Field'];
             }
-            $stmt = $pdo->prepare("SELECT " . implode(',', $shown_fields) . ",
+            $stmt = $pdo->prepare("SELECT " . implode(',', (array)$shown_fields) . ",
               `active`
                 FROM `imapsync` WHERE id = :id");
           }
@@ -3399,7 +3399,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
           $stmt->execute(array(':domain' => $row['domain']));
           $SumQuotaInUse = $stmt->fetch(PDO::FETCH_ASSOC);
           $rl = ratelimit('get', 'domain', $_data);
-          $domaindata['max_new_mailbox_quota']	= ($row['quota'] * 1048576) - $MailboxDataDomain['in_use'];
+          $domaindata['max_new_mailbox_quota']  = ($row['quota'] * 1048576) - $MailboxDataDomain['in_use'];
           if ($domaindata['max_new_mailbox_quota'] > ($row['maxquota'] * 1048576)) {
             $domaindata['max_new_mailbox_quota'] = ($row['maxquota'] * 1048576);
           }
@@ -3421,7 +3421,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             $domaindata['msgs_total'] = 0;
           }
           $domaindata['mboxes_in_domain'] = $MailboxDataDomain['count'];
-          $domaindata['mboxes_left'] = $row['mailboxes']	- $MailboxDataDomain['count'];
+          $domaindata['mboxes_left'] = $row['mailboxes']  - $MailboxDataDomain['count'];
           $domaindata['domain_name'] = $row['domain'];
           $domaindata['description'] = $row['description'];
           $domaindata['max_num_aliases_for_domain'] = $row['aliases'];
@@ -3452,7 +3452,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
           ));
           $AliasDataDomain = $stmt->fetch(PDO::FETCH_ASSOC);
           (isset($AliasDataDomain['alias_count'])) ? $domaindata['aliases_in_domain'] = $AliasDataDomain['alias_count'] : $domaindata['aliases_in_domain'] = "0";
-          $domaindata['aliases_left'] = $row['aliases']	- $AliasDataDomain['alias_count'];
+          $domaindata['aliases_left'] = $row['aliases'] - $AliasDataDomain['alias_count'];
           if ($_SESSION['mailcow_cc_role'] == "admin")
           {
               $stmt = $pdo->prepare("SELECT GROUP_CONCAT(`username` SEPARATOR ', ') AS domain_admins FROM `domain_admins` WHERE `domain` = :domain");
@@ -3577,10 +3577,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             $PushoverActive  = $stmt->fetch(PDO::FETCH_ASSOC);
             $stmt = $pdo->prepare("SELECT COALESCE(SUM(`quota`), 0) as `in_use` FROM `mailbox` WHERE (`kind` = '' OR `kind` = NULL) AND `domain` = :domain AND `username` != :username");
             $stmt->execute(array(':domain' => $row['domain'], ':username' => $_data));
-            $MailboxUsage	= $stmt->fetch(PDO::FETCH_ASSOC);
+            $MailboxUsage = $stmt->fetch(PDO::FETCH_ASSOC);
             $stmt = $pdo->prepare("SELECT IFNULL(COUNT(`address`), 0) AS `sa_count` FROM `spamalias` WHERE `goto` = :address AND `validity` >= :unixnow");
             $stmt->execute(array(':address' => $_data, ':unixnow' => time()));
-            $SpamaliasUsage	= $stmt->fetch(PDO::FETCH_ASSOC);
+            $SpamaliasUsage = $stmt->fetch(PDO::FETCH_ASSOC);
             $mailboxdata['max_new_quota'] = ($DomainQuota['quota'] * 1048576) - $MailboxUsage['in_use'];
             $mailboxdata['spam_aliases'] = $SpamaliasUsage['sa_count'];
             $mailboxdata['pushover_active'] = ($PushoverActive['pushover_active'] == 1) ? 1 : 0;
@@ -3877,7 +3877,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
               );
               continue;
             }
-            $domain	= idn_to_ascii(strtolower(trim($domain)), 0, INTL_IDNA_VARIANT_UTS46);
+            $domain = idn_to_ascii(strtolower(trim($domain)), 0, INTL_IDNA_VARIANT_UTS46);
             $stmt = $pdo->prepare("SELECT `username` FROM `mailbox`
               WHERE `domain` = :domain");
             $stmt->execute(array(':domain' => $domain));
@@ -4231,7 +4231,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
               if (($key = array_search($username, $goto_exploded)) !== false) {
                 unset($goto_exploded[$key]);
               }
-              $gotos_rebuild = implode(',', $goto_exploded);
+              $gotos_rebuild = implode(',', (array)$goto_exploded);
               $stmt = $pdo->prepare("UPDATE `alias` SET
                 `goto` = :goto
                   WHERE `address` = :address");

+ 13 - 13
data/web/inc/functions.oauth2.inc.php

@@ -1,16 +1,16 @@
 <?php
 function oauth2($_action, $_type, $_data = null) {
-	global $pdo;
-	global $redis;
-	global $lang;
-	if ($_SESSION['mailcow_cc_role'] != "admin") {
-		$_SESSION['return'][] = array(
-			'type' => 'danger',
+  global $pdo;
+  global $redis;
+  global $lang;
+  if ($_SESSION['mailcow_cc_role'] != "admin") {
+    $_SESSION['return'][] = array(
+      'type' => 'danger',
       'log' => array(__FUNCTION__, $_action, $_type, $_data),
-			'msg' => 'access_denied'
-		);
-		return false;
-	}
+      'msg' => 'access_denied'
+    );
+    return false;
+  }
   switch ($_action) {
     case 'add':
       switch ($_type) {
@@ -188,7 +188,7 @@ function oauth2($_action, $_type, $_data = null) {
           $_SESSION['return'][] = array(
             'type' => 'success',
             'log' => array(__FUNCTION__, $_action, $_type, $_data),
-            'msg' => sprintf($lang['success']['items_deleted'], implode(', ', $access_tokens))
+            'msg' => sprintf($lang['success']['items_deleted'], implode(', ', (array)$access_tokens))
           );
         break;
         case 'refresh_token':
@@ -210,7 +210,7 @@ function oauth2($_action, $_type, $_data = null) {
           $_SESSION['return'][] = array(
             'type' => 'success',
             'log' => array(__FUNCTION__, $_action, $_type, $_data),
-            'msg' => sprintf($lang['success']['items_deleted'], implode(', ', $refresh_tokens))
+            'msg' => sprintf($lang['success']['items_deleted'], implode(', ', (array)$refresh_tokens))
           );
         break;
       }
@@ -239,4 +239,4 @@ function oauth2($_action, $_type, $_data = null) {
       }
     break;
   }
-}
+}

+ 6 - 6
data/web/inc/functions.policy.inc.php

@@ -1,9 +1,9 @@
 <?php
 function policy($_action, $_scope, $_data = null) {
-	global $pdo;
-	global $redis;
-	global $lang;
-	$_data_log = $_data;
+  global $pdo;
+  global $redis;
+  global $lang;
+  $_data_log = $_data;
   switch ($_action) {
     case 'add':
       if (!isset($_SESSION['acl']['spam_policy']) || $_SESSION['acl']['spam_policy'] != "1" ) {
@@ -261,7 +261,7 @@ function policy($_action, $_scope, $_data = null) {
             $_SESSION['return'][] = array(
               'type' => 'success',
               'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
-              'msg' => array('items_deleted', implode(', ', $prefids))
+              'msg' => array('items_deleted', implode(', ', (array)$prefids))
             );
           }
         break;
@@ -317,4 +317,4 @@ function policy($_action, $_scope, $_data = null) {
       }
     break;
   }
-}
+}

+ 2 - 2
data/web/inc/functions.pushover.inc.php

@@ -1,6 +1,6 @@
 <?php
 function pushover($_action, $_data = null) {
-	global $pdo;
+  global $pdo;
   switch ($_action) {
     case 'edit':
       if (!isset($_SESSION['acl']['pushover']) || $_SESSION['acl']['pushover'] != "1" ) {
@@ -81,7 +81,7 @@ function pushover($_action, $_data = null) {
         }
         $senders = array_filter($senders);
         if (empty($senders)) { $senders = ''; }
-        $senders = implode(",", $senders);
+        $senders = implode(",", (array)$senders);
         if (!ctype_alnum($key) || strlen($key) != 30) {
           $_SESSION['return'][] = array(
             'type' => 'danger',

+ 9 - 9
data/web/inc/functions.transports.inc.php

@@ -1,7 +1,7 @@
 <?php
 function relayhost($_action, $_data = null) {
-	global $pdo;
-	global $lang;
+  global $pdo;
+  global $lang;
   $_data_log = $_data;
   switch ($_action) {
     case 'add':
@@ -45,7 +45,7 @@ function relayhost($_action, $_data = null) {
       $_SESSION['return'][] = array(
         'type' => 'success',
         'log' => array(__FUNCTION__, $_action, $_data_log),
-        'msg' => array('relayhost_added', htmlspecialchars(implode(', ', $hosts)))
+        'msg' => array('relayhost_added', htmlspecialchars(implode(', ', (array)$hosts)))
       );
     break;
     case 'edit':
@@ -100,7 +100,7 @@ function relayhost($_action, $_data = null) {
         $_SESSION['return'][] = array(
           'type' => 'success',
           'log' => array(__FUNCTION__, $_action, $_data_log),
-          'msg' => array('object_modified', htmlspecialchars(implode(', ', $hostnames)))
+          'msg' => array('object_modified', htmlspecialchars(implode(', ', (array)$hostnames)))
         );
       }
     break;
@@ -177,8 +177,8 @@ function relayhost($_action, $_data = null) {
   }
 }
 function transport($_action, $_data = null) {
-	global $pdo;
-	global $lang;
+  global $pdo;
+  global $lang;
   $_data_log = $_data;
   switch ($_action) {
     case 'add':
@@ -307,7 +307,7 @@ function transport($_action, $_data = null) {
       $_SESSION['return'][] = array(
         'type' => 'success',
         'log' => array(__FUNCTION__, $_action, $_data_log),
-        'msg' => array('relayhost_added', htmlspecialchars(implode(', ', $hosts)))
+        'msg' => array('relayhost_added', htmlspecialchars(implode(', ', (array)$hosts)))
       );
     break;
     case 'edit':
@@ -442,7 +442,7 @@ function transport($_action, $_data = null) {
         $_SESSION['return'][] = array(
           'type' => 'success',
           'log' => array(__FUNCTION__, $_action, $_data_log),
-          'msg' => array('object_modified', htmlspecialchars(implode(', ', $hostnames)))
+          'msg' => array('object_modified', htmlspecialchars(implode(', ', (array)$hostnames)))
         );
       }
     break;
@@ -505,4 +505,4 @@ function transport($_action, $_data = null) {
       return $transportdata;
     break;
   }
-}
+}

+ 39 - 39
data/web/js/site/mailbox.js

@@ -94,9 +94,9 @@ $(document).ready(function() {
       }
     });
   }
-	$('#addSelectDomain').on('change', function() {
+  $('#addSelectDomain').on('change', function() {
     auto_fill_quota($('#addSelectDomain').val());
-	});
+  });
   auto_fill_quota($('#addSelectDomain').val());
   $(".goto_checkbox").click(function( event ) {
    $("form[data-id='add_alias'] .goto_checkbox").not(this).prop('checked', false);
@@ -152,10 +152,10 @@ $(document).ready(function() {
     $(e.currentTarget).find('#sieveDataText').html('<pre style="font-size:14px;line-height:1.1">' + sieveScript + '</pre>');
   });
   // Disable submit button on script change
-	$('.textarea-code').on('keyup', function() {
+  $('.textarea-code').on('keyup', function() {
     // Disable all "save" buttons, could be a "related button only" function, todo
     $('.add_sieve_script').attr({"disabled": true});
-	});
+  });
   // Validate script data
   $(".validate_sieve").click(function( event ) {
     event.preventDefault();
@@ -258,11 +258,11 @@ jQuery(function($){
         }},
         {"name":"def_quota_for_mbox","title":lang.mailbox_defquota,"breakpoints":"xs sm md","style":{"width":"125px"}},
         {"name":"max_quota_for_mbox","title":lang.mailbox_quota,"breakpoints":"xs sm","style":{"width":"125px"}},
-        {"name":"rl","title":"RL","breakpoints":"xs sm md lg","style":{"maxWidth":"100px","width":"100px"}},
-        {"name":"backupmx","filterable": false,"style":{"maxWidth":"120px","width":"120px"},"title":lang.backup_mx,"breakpoints":"xs sm md lg","formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
+        {"name":"rl","title":"RL","breakpoints":"xs sm md lg","style":{"min-width":"100px","width":"100px"}},
+        {"name":"backupmx","filterable": false,"style":{"min-width":"120px","width":"120px"},"title":lang.backup_mx,"breakpoints":"xs sm md lg","formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
         {"name":"domain_admins","title":lang.domain_admins,"style":{"word-break":"break-all","min-width":"200px"},"breakpoints":"xs sm md lg","filterable":(role == "admin"),"visible":(role == "admin")},
-        {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
-        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"240px","width":"240px"},"type":"html","title":lang.action,"breakpoints":"xs sm md"}
+        {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
+        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"240px","width":"240px"},"type":"html","title":lang.action,"breakpoints":"xs sm md"}
       ],
       "rows": $.ajax({
         dataType: 'json',
@@ -297,7 +297,7 @@ jQuery(function($){
               item.action += '<a href="/edit/domain/' + encodeURIComponent(item.domain_name) + '" class="btn btn-xs btn-xs-half btn-default"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
               '<a href="#dnsInfoModal" class="btn btn-xs btn-xs-half btn-info" data-toggle="modal" data-domain="' + encodeURIComponent(item.domain_name) + '"><i class="bi bi-globe2"></i> DNS</a></div>';
             }
-            
+
             if (item.backupmx == 1) {
               if (item.relay_unknown_only == 1) {
                 item.domain_name = '<div class="label label-info">Relay Non-Local</div> ' + item.domain_name;
@@ -374,7 +374,7 @@ jQuery(function($){
         "formatter": function(value){
           res = value.split("/");
           return '<div class="label label-last-login">IMAP @ ' + unix_time_format(Number(res[0])) + '</div><br>' +
-            '<div class="label label-last-login">POP3 @ ' + unix_time_format(Number(res[1])) + '</div><br>' + 
+            '<div class="label label-last-login">POP3 @ ' + unix_time_format(Number(res[1])) + '</div><br>' +
             '<div class="label label-last-login">SMTP @ ' + unix_time_format(Number(res[2])) + '</div>';
         }},
         {"name":"last_pw_change","filterable": false,"title":lang.last_pw_change,"breakpoints":"all"},
@@ -386,7 +386,7 @@ jQuery(function($){
         },
         {"name":"messages","filterable": false,"title":lang.msg_num,"breakpoints":"xs sm md"},
         /* {"name":"rl","title":"RL","breakpoints":"all","style":{"width":"125px"}}, */
-        {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':(0==value?'<i class="bi bi-x-lg"></i>':2==value&&'&#8212;');}},
+        {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':(0==value?'<i class="bi bi-x-lg"></i>':2==value&&'&#8212;');}},
         {"name":"action","filterable": false,"sortable": false,"style":{"min-width":"290px","text-align":"right"},"type":"html","title":lang.action,"breakpoints":"xs sm md"}
       ],
       "empty": lang.empty,
@@ -443,9 +443,9 @@ jQuery(function($){
               item.quarantine_category = lang.q_all;
             }
             if (acl_data.login_as === 1) {
-	            var btnSize = 'btn-xs-third';
-	            if (ALLOW_ADMIN_EMAIL_LOGIN) btnSize = 'btn-xs-quart';
-	            
+              var btnSize = 'btn-xs-third';
+              if (ALLOW_ADMIN_EMAIL_LOGIN) btnSize = 'btn-xs-quart';
+
             item.action = '<div class="btn-group footable-actions">' +
               '<a href="/edit/mailbox/' + encodeURIComponent(item.username) + '" class="btn btn-xs ' + btnSize + ' btn-default"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
               '<a href="#" data-action="delete_selected" data-id="single-mailbox" data-api-url="delete/mailbox" data-item="' + encodeURIComponent(item.username) + '" class="btn btn-xs ' + btnSize + ' btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' +
@@ -512,9 +512,9 @@ jQuery(function($){
         {"name":"name","title":lang.alias},
         {"name":"kind","title":lang.kind},
         {"name":"domain","title":lang.domain,"breakpoints":"xs sm"},
-        {"name":"multiple_bookings","filterable": false,"style":{"maxWidth":"150px","width":"140px"},"title":lang.multiple_bookings,"breakpoints":"xs sm"},
-        {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
-        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
+        {"name":"multiple_bookings","filterable": false,"style":{"min-width":"150px","width":"140px"},"title":lang.multiple_bookings,"breakpoints":"xs sm"},
+        {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
+        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
       ],
       "empty": lang.empty,
       "rows": $.ajax({
@@ -650,11 +650,11 @@ jQuery(function($){
     ft_recipient_map_table = FooTable.init('#recipient_map_table', {
       "columns": [
         {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"},
-        {"sorted": true,"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}},
+        {"sorted": true,"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}},
         {"name":"recipient_map_old","title":lang.recipient_map_old},
         {"name":"recipient_map_new","title":lang.recipient_map_new},
-        {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
-        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"}
+        {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
+        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"}
       ],
       "empty": lang.empty,
       "rows": $.ajax({
@@ -714,12 +714,12 @@ jQuery(function($){
     ft_tls_policy_table = FooTable.init('#tls_policy_table', {
       "columns": [
         {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"},
-        {"sorted": true,"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}},
+        {"sorted": true,"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}},
         {"name":"dest","title":lang.tls_map_dest},
         {"name":"policy","title":lang.tls_map_policy},
         {"name":"parameters","title":lang.tls_map_parameters},
-        {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
-        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"}
+        {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
+        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"}
       ],
       "empty": lang.empty,
       "rows": $.ajax({
@@ -784,15 +784,15 @@ jQuery(function($){
     ft_alias_table = FooTable.init('#alias_table', {
       "columns": [
         {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"},
-        {"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}},
+        {"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}},
         {"sorted": true,"name":"address","title":lang.alias,"style":{"width":"250px"}},
         {"name":"goto","title":lang.target_address},
         {"name":"domain","title":lang.domain,"breakpoints":"xs sm"},
         {"name":"public_comment","title":lang.public_comment,"breakpoints":"all"},
         {"name":"private_comment","title":lang.private_comment,"breakpoints":"all"},
         {"name":"sogo_visible","title":lang.sogo_visible,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';},"breakpoints":"all"},
-        {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
-        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
+        {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
+        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
       ],
       "empty": lang.empty,
       "rows": $.ajax({
@@ -886,8 +886,8 @@ jQuery(function($){
         {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"},
         {"sorted": true,"name":"alias_domain","title":lang.alias,"style":{"width":"250px"}},
         {"name":"target_domain","title":lang.target_domain,"type":"html"},
-        {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
-        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"250px","width":"250px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
+        {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
+        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"250px","width":"250px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
       ],
       "empty": lang.empty,
       "rows": $.ajax({
@@ -949,17 +949,17 @@ jQuery(function($){
   function draw_sync_job_table() {
     ft_syncjob_table = FooTable.init('#sync_job_table', {
       "columns": [
-        {"name":"chkbox","title":"","style":{"maxWidth":"60px","width":"60px","text-align":"center"},"filterable": false,"sortable": false,"type":"html"},
-        {"sorted": true,"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}},
+        {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px","text-align":"center"},"filterable": false,"sortable": false,"type":"html"},
+        {"sorted": true,"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}},
         {"name":"user2","title":lang.owner},
         {"name":"server_w_port","title":"Server","breakpoints":"xs sm md","style":{"word-break":"break-all"}},
         {"name":"exclude","title":lang.excludes,"breakpoints":"all"},
         {"name":"mins_interval","title":lang.mins_interval,"breakpoints":"all"},
         {"name":"last_run","title":lang.last_run,"breakpoints":"xs sm md"},
         {"name":"log","title":"Log"},
-        {"name":"active","filterable": false,"style":{"maxWidth":"70px","width":"70px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
-        {"name":"is_running","filterable": false,"style":{"maxWidth":"120px","width":"100px"},"title":lang.status},
-        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
+        {"name":"active","filterable": false,"style":{"min-width":"70px","width":"70px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
+        {"name":"is_running","filterable": false,"style":{"min-width":"120px","width":"100px"},"title":lang.status},
+        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
       ],
       "empty": lang.empty,
       "rows": $.ajax({
@@ -1031,14 +1031,14 @@ jQuery(function($){
   function draw_filter_table() {
     ft_filter_table = FooTable.init('#filter_table', {
       "columns": [
-        {"name":"chkbox","title":"","style":{"maxWidth":"60px","width":"60px","text-align":"center"},"filterable": false,"sortable": false,"type":"html"},
-        {"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}},
-        {"name":"active","style":{"maxWidth":"80px","width":"80px"},"title":lang.active},
-        {"name":"filter_type","style":{"maxWidth":"80px","width":"80px"},"title":"Type"},
-        {"sorted": true,"name":"username","title":lang.owner,"style":{"maxWidth":"550px","width":"350px"}},
+        {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px","text-align":"center"},"filterable": false,"sortable": false,"type":"html"},
+        {"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}},
+        {"name":"active","style":{"min-width":"80px","width":"80px"},"title":lang.active},
+        {"name":"filter_type","style":{"min-width":"80px","width":"80px"},"title":"Type"},
+        {"sorted": true,"name":"username","title":lang.owner,"style":{"min-width":"550px","width":"350px"}},
         {"name":"script_desc","title":lang.description,"breakpoints":"xs"},
         {"name":"script_data","title":"Script","breakpoints":"all"},
-        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
+        {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
       ],
       "empty": lang.empty,
       "rows": $.ajax({

+ 2 - 0
data/web/lang/lang.de.json

@@ -514,6 +514,7 @@
         "optional": "Dieser Eintrag ist optional."
     },
     "edit": {
+        "acl": "ACL (Berechtigungen)",
         "active": "Aktiv",
         "admin": "Administrator bearbeiten",
         "advanced_settings": "Erweiterte Einstellungen",
@@ -574,6 +575,7 @@
         "previous": "Vorherige Seite",
         "private_comment": "Privater Kommentar",
         "public_comment": "Öffentlicher Kommentar",
+        "pushover": "Pushover",
         "pushover_evaluate_x_prio": "Hohe Priorität eskalieren [<code>X-Priority: 1</code>]",
         "pushover_info": "Push-Benachrichtigungen werden angewendet auf alle nicht-Spam Nachrichten zugestellt an <b>%s</b>, einschließlich Alias-Adressen (shared, non-shared, tagged).",
         "pushover_only_x_prio": "Nur Mail mit hoher Priorität berücksichtigen [<code>X-Priority: 1</code>]",

+ 8 - 6
data/web/lang/lang.en.json

@@ -517,6 +517,7 @@
         "optional": "This record is optional."
     },
     "edit": {
+        "acl": "ACL (Permission)",
         "active": "Active",
         "admin": "Edit administrator",
         "advanced_settings": "Advanced settings",
@@ -577,6 +578,7 @@
         "previous": "Previous page",
         "private_comment": "Private comment",
         "public_comment": "Public comment",
+        "pushover": "Pushover",
         "pushover_evaluate_x_prio": "Escalate high priority mail [<code>X-Priority: 1</code>]",
         "pushover_info": "Push notification settings will apply to all clean (non-spam) mail delivered to <b>%s</b> including aliases (shared, non-shared, tagged).",
         "pushover_only_x_prio": "Only consider high priority mail [<code>X-Priority: 1</code>]",
@@ -901,11 +903,11 @@
         "type": "Type"
     },
     "ratelimit": {
-	    "disabled": "Disabled",
-	    "second": "msgs / second",
-	    "minute": "msgs / minute",
-	    "hour": "msgs / hour",
-	    "day": "msgs / day"
+      "disabled": "Disabled",
+      "second": "msgs / second",
+      "minute": "msgs / minute",
+      "hour": "msgs / hour",
+      "day": "msgs / day"
     },
     "start": {
         "help": "Show/Hide help panel",
@@ -1179,4 +1181,4 @@
         "session_token": "Form token invalid: Token mismatch",
         "session_ua": "Form token invalid: User-Agent validation error"
     }
-}
+}

+ 15 - 15
data/web/mailbox.php

@@ -33,8 +33,8 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
     <li role="presentation"<?=($_SESSION['mailcow_cc_role'] == "admin") ?: ' class="hidden"';?>><a href="#tab-tls-policy" aria-controls="tab-tls-policy" role="tab" data-toggle="tab"><?=$lang['mailbox']['tls_policy_maps'];?></a></li>
   </ul>
 
-	<div class="row">
-		<div class="col-md-12">
+  <div class="row">
+    <div class="col-md-12">
       <div class="tab-content" style="padding-top:20px">
         <div role="tabpanel" class="tab-pane active" id="tab-domains">
           <div class="panel panel-default">
@@ -43,7 +43,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
               <div class="btn-group pull-right hidden-xs">
                 <? if($_SESSION['mailcow_cc_role'] == "admin"): ?><button class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addDomainModal"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_domain'];?></button><? endif; ?>
                 <button class="btn btn-xs btn-default refresh_table" data-draw="draw_domain_table" data-table="domain_table"><?=$lang['admin']['refresh'];?></button>
-                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> 
+                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?>
                   <span class="caret"></span>
                 </button>
                 <ul class="dropdown-menu" data-table-id="domain_table" role="menu">
@@ -99,7 +99,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
               <div class="btn-group pull-right hidden-xs">
                 <button class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addMailboxModal"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_mailbox'];?></button>
                 <button class="btn btn-xs btn-default refresh_table" data-draw="draw_mailbox_table" data-table="mailbox_table"><?=$lang['admin']['refresh'];?></button>
-                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> 
+                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?>
                   <span class="caret"></span>
                 </button>
                 <ul class="dropdown-menu" data-table-id="mailbox_table" role="menu">
@@ -226,7 +226,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
               <div class="btn-group pull-right hidden-xs">
                 <button class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addResourceModal"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_resource'];?></button>
                 <button class="btn btn-xs btn-default refresh_table" data-draw="draw_resource_table" data-table="resource_table"><?=$lang['admin']['refresh'];?></button>
-                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> 
+                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?>
                   <span class="caret"></span>
                 </button>
                 <ul class="dropdown-menu" data-table-id="resource_table" role="menu">
@@ -272,7 +272,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
               <div class="btn-group pull-right hidden-xs">
                 <button class="btn btn-xs btn-success" href="#" data-acl="<?=$_SESSION['acl']['alias_domains'];?>" data-toggle="modal" data-target="#addAliasDomainModal"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_domain_alias'];?></button>
                 <button class="btn btn-xs btn-default refresh_table" data-draw="draw_aliasdomain_table" data-table="aliasdomain_table"><?=$lang['admin']['refresh'];?></button>
-                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> 
+                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?>
                   <span class="caret"></span>
                 </button>
                 <ul class="dropdown-menu" data-table-id="aliasdomain_table" role="menu">
@@ -313,7 +313,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
               <div class="btn-group pull-right hidden-xs">
                 <button class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addAliasModal"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_alias'];?></button>
                 <button class="btn btn-xs btn-default refresh_table" data-draw="draw_alias_table" data-table="alias_table"><?=$lang['admin']['refresh'];?></button>
-                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> 
+                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?>
                   <span class="caret"></span>
                 </button>
                 <ul class="dropdown-menu" data-table-id="alias_table" role="menu">
@@ -363,7 +363,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
               <div class="btn-group pull-right hidden-xs">
                 <button data-acl="<?=$_SESSION['acl']['syncjobs'];?>" class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addSyncJobModalAdmin"><i class="bi bi-plus-lg"></i> <?=$lang['user']['create_syncjob'];?></button>
                 <button class="btn btn-xs btn-default refresh_table" data-draw="draw_sync_job_table" data-table="sync_job_table"><?=$lang['admin']['refresh'];?></button>
-                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> 
+                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?>
                   <span class="caret"></span>
                 </button>
                 <ul class="dropdown-menu" data-table-id="sync_job_table" role="menu">
@@ -406,7 +406,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
               <div class="btn-group pull-right hidden-xs">
                 <button class="btn btn-xs btn-success" href="#" data-acl="<?=$_SESSION['acl']['filters'];?>" data-toggle="modal" data-target="#addFilterModalAdmin"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_filter'];?></button>
                 <button class="btn btn-xs btn-default refresh_table" data-draw="draw_filter_table" data-table="filter_table"><?=$lang['admin']['refresh'];?></button>
-                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> 
+                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?>
                   <span class="caret"></span>
                 </button>
                 <ul class="dropdown-menu" data-table-id="filter_table" role="menu">
@@ -498,7 +498,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
               <div class="btn-group pull-right hidden-xs">
                 <button class="btn btn-xs btn-success" href="#" data-acl="<?=$_SESSION['acl']['bcc_maps'];?>" data-toggle="modal" data-target="#addBCCModalAdmin"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_bcc_entry'];?></button>
                 <button class="btn btn-xs btn-default refresh_table" data-draw="draw_bcc_table" data-table="bcc_table"><?=$lang['admin']['refresh'];?></button>
-                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> 
+                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?>
                   <span class="caret"></span>
                 </button>
                 <ul class="dropdown-menu" data-table-id="bcc_table" role="menu">
@@ -540,7 +540,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
               <div class="btn-group pull-right hidden-xs">
                 <button class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addRecipientMapModalAdmin"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_recipient_map_entry'];?></button>
                 <button class="btn btn-xs btn-default refresh_table" data-draw="draw_recipient_map_table" data-table="recipient_map_table"><?=$lang['admin']['refresh'];?></button>
-                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> 
+                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?>
                   <span class="caret"></span>
                 </button>
                 <ul class="dropdown-menu" data-table-id="recipient_map_table" role="menu">
@@ -582,7 +582,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
               <div class="btn-group pull-right hidden-xs">
                 <button class="btn btn-xs btn-success" href="#" data-toggle="modal" data-target="#addTLSPolicyMapAdmin"><i class="bi bi-plus-lg"></i> <?=$lang['mailbox']['add_tls_policy_map'];?></button>
                 <button class="btn btn-xs btn-default refresh_table" data-draw="draw_tls_policy_table" data-table="tls_policy_table"><?=$lang['admin']['refresh'];?></button>
-                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?> 
+                <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown"><?=$lang['mailbox']['table_size'];?>
                   <span class="caret"></span>
                 </button>
                 <ul class="dropdown-menu" data-table-id="tls_policy_table" role="menu">
@@ -635,7 +635,7 @@ echo "var role = '". $role . "';\n";
 echo "var is_dual = " . $is_dual . ";\n";
 echo "var pagination_size = '". $PAGINATION_SIZE . "';\n";
 $ALLOW_ADMIN_EMAIL_LOGIN = (preg_match(
-	"/^([yY][eE][sS]|[yY])+$/",
+  "/^([yY][eE][sS]|[yY])+$/",
     $_ENV["ALLOW_ADMIN_EMAIL_LOGIN"]
 )) ? "true" : "false";
 echo "var ALLOW_ADMIN_EMAIL_LOGIN = " . $ALLOW_ADMIN_EMAIL_LOGIN . ";\n";
@@ -648,7 +648,7 @@ $js_minifier->add('/web/js/site/pwgen.js');
 require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/footer.inc.php';
 }
 else {
-	header('Location: /');
-	exit();
+  header('Location: /');
+  exit();
 }
 ?>

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác