From d9b91fc04f286eaba4266ca60254a02dc5e91867 Mon Sep 17 00:00:00 2001 From: andryyy Date: Thu, 17 Sep 2020 19:49:15 +0200 Subject: [PATCH] [Web] Important: Removed unnecessary *_int attributes from GET elements, _only_ returning int values now (same for all attributes which were provided as html char and int) [Web] Feature: Allow to toggle protocols (imap, pop3, smtp) per user (defaults can be configured using vars.local.inc.php, see vars.inc.php) Signed-off-by: andryyy --- data/web/admin.php | 4 +- data/web/edit.php | 56 +++++---- .../inc/functions.address_rewriting.inc.php | 10 +- data/web/inc/functions.admin.inc.php | 14 +-- data/web/inc/functions.app_passwd.inc.php | 5 +- data/web/inc/functions.domain_admin.inc.php | 12 +- data/web/inc/functions.fail2ban.inc.php | 2 +- data/web/inc/functions.mailbox.inc.php | 107 +++++++++--------- data/web/inc/functions.rspamd.inc.php | 8 +- .../web/inc/functions.tls_policy_maps.inc.php | 5 +- data/web/inc/functions.transports.inc.php | 19 ++-- data/web/inc/init_db.inc.php | 6 +- data/web/inc/vars.inc.php | 9 ++ data/web/js/build/014-mailcow.js | 5 + data/web/js/site/admin.js | 20 ++-- data/web/js/site/mailbox.js | 30 ++--- data/web/js/site/user.js | 4 +- data/web/lang/lang.de.json | 8 +- data/web/lang/lang.en.json | 8 +- data/web/modals/mailbox.php | 10 +- 20 files changed, 174 insertions(+), 168 deletions(-) diff --git a/data/web/admin.php b/data/web/admin.php index 6e3d90d6..3e681dc6 100644 --- a/data/web/admin.php +++ b/data/web/admin.php @@ -954,7 +954,7 @@ if (!isset($_SESSION['gal']) && $license_cache = $redis->Get('LICENSE_STATUS_CAC foreach ($rsettings as $rsetting): $rsetting_details = rsettings('details', $rsetting['id']); ?> - (ID #) + (ID #) Get('LICENSE_STATUS_CAC
diff --git a/data/web/edit.php b/data/web/edit.php index 63728b37..f8e489f3 100644 --- a/data/web/edit.php +++ b/data/web/edit.php @@ -53,7 +53,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +

@@ -76,7 +76,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -143,7 +143,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -222,7 +222,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -321,11 +321,11 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
- +

- +


@@ -338,7 +338,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -346,7 +346,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -517,7 +517,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -579,6 +579,7 @@ if (isset($_SESSION['mailcow_cc_role'])) { +
@@ -709,12 +710,23 @@ if (isset($_SESSION['mailcow_cc_role'])) {
+
+ +
+ +
+
+
@@ -902,7 +914,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -955,7 +967,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -1015,7 +1027,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -1061,7 +1073,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -1110,7 +1122,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -1171,7 +1183,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -1339,7 +1351,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -1390,7 +1402,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
@@ -1438,7 +1450,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
- +
diff --git a/data/web/inc/functions.address_rewriting.inc.php b/data/web/inc/functions.address_rewriting.inc.php index 7caf65e3..51cdd73c 100644 --- a/data/web/inc/functions.address_rewriting.inc.php +++ b/data/web/inc/functions.address_rewriting.inc.php @@ -115,7 +115,7 @@ function bcc($_action, $_data = null, $attr = null) { foreach ($ids as $id) { $is_now = bcc('details', $id); if (!empty($is_now)) { - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $bcc_dest = (!empty($_data['bcc_dest'])) ? $_data['bcc_dest'] : $is_now['bcc_dest']; $local_dest = $is_now['local_dest']; $type = (!empty($_data['type'])) ? $_data['type'] : $is_now['type']; @@ -180,8 +180,7 @@ function bcc($_action, $_data = null, $attr = null) { $stmt = $pdo->prepare("SELECT `id`, `local_dest`, `bcc_dest`, - `active` AS `active_int`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, + `active`, `type`, `created`, `domain`, @@ -315,7 +314,7 @@ function recipient_map($_action, $_data = null, $attr = null) { foreach ($ids as $id) { $is_now = recipient_map('details', $id); if (!empty($is_now)) { - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $new_dest = (!empty($_data['recipient_map_new'])) ? $_data['recipient_map_new'] : $is_now['recipient_map_new']; $old_dest = (!empty($_data['recipient_map_old'])) ? $_data['recipient_map_old'] : $is_now['recipient_map_old']; if (substr($old_dest, 0, 1) == '@') { @@ -389,8 +388,7 @@ function recipient_map($_action, $_data = null, $attr = null) { $stmt = $pdo->prepare("SELECT `id`, `old_dest` AS `recipient_map_old`, `new_dest` AS `recipient_map_new`, - `active` AS `active_int`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, + `active`, `created`, `modified` FROM `recipient_maps` WHERE `id` = :id"); diff --git a/data/web/inc/functions.admin.inc.php b/data/web/inc/functions.admin.inc.php index a99d0b7a..3a087184 100644 --- a/data/web/inc/functions.admin.inc.php +++ b/data/web/inc/functions.admin.inc.php @@ -99,7 +99,7 @@ function admin($_action, $_data = null) { foreach ($usernames as $username) { $is_now = admin('details', $username); if (!empty($is_now)) { - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $username_new = (!empty($_data['username_new'])) ? $_data['username_new'] : $is_now['username']; } else { @@ -115,7 +115,7 @@ function admin($_action, $_data = null) { if ($active == 0) { $left_active = 0; foreach (admin('get') as $admin) { - $left_active = $left_active + admin('details', $admin)['active_int']; + $left_active = $left_active + admin('details', $admin)['active']; } if ($left_active == 1) { $_SESSION['return'][] = array( @@ -248,12 +248,10 @@ function admin($_action, $_data = null) { case 'details': $admindata = array(); $stmt = $pdo->prepare("SELECT - `tfa`.`active` AS `tfa_active_int`, - CASE `tfa`.`active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `tfa_active`, + `tfa`.`active` AS `tfa_active`, `admin`.`username`, `admin`.`created`, - `admin`.`active` AS `active_int`, - CASE `admin`.`active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` + `admin`.`active` AS `active` FROM `admin` LEFT OUTER JOIN `tfa` ON `tfa`.`username`=`admin`.`username` WHERE `admin`.`username`= :admin AND `superadmin` = '1'"); @@ -265,10 +263,8 @@ function admin($_action, $_data = null) { return false; } $admindata['username'] = $row['username']; - $admindata['tfa_active'] = $row['tfa_active']; + $admindata['tfa_active'] = (is_null($row['tfa_active'])) ? 0 : $row['tfa_active']; $admindata['active'] = $row['active']; - $admindata['tfa_active_int'] = $row['tfa_active_int']; - $admindata['active_int'] = $row['active_int']; $admindata['created'] = $row['created']; return $admindata; break; diff --git a/data/web/inc/functions.app_passwd.inc.php b/data/web/inc/functions.app_passwd.inc.php index 9b956659..c4b00260 100644 --- a/data/web/inc/functions.app_passwd.inc.php +++ b/data/web/inc/functions.app_passwd.inc.php @@ -84,7 +84,7 @@ function app_passwd($_action, $_data = null) { $app_name = (!empty($_data['app_name'])) ? $_data['app_name'] : $is_now['name']; $password = (!empty($_data['password'])) ? $_data['password'] : null; $password2 = (!empty($_data['password2'])) ? $_data['password2'] : null; - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; } else { $_SESSION['return'][] = array( @@ -186,8 +186,7 @@ function app_passwd($_action, $_data = null) { `domain`, `created`, `modified`, - `active` AS `active_int`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` + `active` FROM `app_passwd` WHERE `id` = :id"); $stmt->execute(array(':id' => $_data['id'])); diff --git a/data/web/inc/functions.domain_admin.inc.php b/data/web/inc/functions.domain_admin.inc.php index 70bdca0c..e0473e2a 100644 --- a/data/web/inc/functions.domain_admin.inc.php +++ b/data/web/inc/functions.domain_admin.inc.php @@ -153,7 +153,7 @@ function domain_admin($_action, $_data = null) { $is_now = domain_admin('details', $username); $domains = (isset($_data['domains'])) ? (array)$_data['domains'] : null; if (!empty($is_now)) { - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $domains = (!empty($domains)) ? $domains : $is_now['selected_domains']; $username_new = (!empty($_data['username_new'])) ? $_data['username_new'] : $is_now['username']; } @@ -400,12 +400,10 @@ function domain_admin($_action, $_data = null) { return false; } $stmt = $pdo->prepare("SELECT - `tfa`.`active` AS `tfa_active_int`, - CASE `tfa`.`active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `tfa_active`, + `tfa`.`active` AS `tfa_active`, `domain_admins`.`username`, `domain_admins`.`created`, - `domain_admins`.`active` AS `active_int`, - CASE `domain_admins`.`active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` + `domain_admins`.`active` AS `active` FROM `domain_admins` LEFT OUTER JOIN `tfa` ON `tfa`.`username`=`domain_admins`.`username` WHERE `domain_admins`.`username`= :domain_admin"); @@ -417,10 +415,8 @@ function domain_admin($_action, $_data = null) { return false; } $domainadmindata['username'] = $row['username']; - $domainadmindata['tfa_active'] = $row['tfa_active']; + $domainadmindata['tfa_active'] = (is_null($row['tfa_active'])) ? 0 : $row['tfa_active']; $domainadmindata['active'] = $row['active']; - $domainadmindata['tfa_active_int'] = $row['tfa_active_int']; - $domainadmindata['active_int'] = $row['active_int']; $domainadmindata['created'] = $row['created']; // GET SELECTED $stmt = $pdo->prepare("SELECT `domain` FROM `domain` diff --git a/data/web/inc/functions.fail2ban.inc.php b/data/web/inc/functions.fail2ban.inc.php index b7918180..85c9029f 100644 --- a/data/web/inc/functions.fail2ban.inc.php +++ b/data/web/inc/functions.fail2ban.inc.php @@ -240,7 +240,7 @@ function fail2ban($_action, $_data = null) { $is_now = fail2ban('get'); if (!empty($is_now)) { $ban_time = intval((isset($_data['ban_time'])) ? $_data['ban_time'] : $is_now['ban_time']); - $max_attempts = intval((isset($_data['max_attempts'])) ? $_data['max_attempts'] : $is_now['active_int']); + $max_attempts = intval((isset($_data['max_attempts'])) ? $_data['max_attempts'] : $is_now['max_attempts']); $retry_window = intval((isset($_data['retry_window'])) ? $_data['retry_window'] : $is_now['retry_window']); $netban_ipv4 = intval((isset($_data['netban_ipv4'])) ? $_data['netban_ipv4'] : $is_now['netban_ipv4']); $netban_ipv6 = intval((isset($_data['netban_ipv6'])) ? $_data['netban_ipv6'] : $is_now['netban_ipv6']); diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php index 33061c26..13c996a9 100644 --- a/data/web/inc/functions.mailbox.inc.php +++ b/data/web/inc/functions.mailbox.inc.php @@ -941,6 +941,9 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $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']); $sogo_access = (isset($_data['sogo_access'])) ? intval($_data['sogo_access']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['sogo_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']); + $smtp_access = (isset($_data['smtp_access'])) ? intval($_data['smtp_access']) : intval($MAILBOX_DEFAULT_ATTRIBUTES['smtp_access']); $quarantine_notification = (isset($_data['quarantine_notification'])) ? strval($_data['quarantine_notification']) : strval($MAILBOX_DEFAULT_ATTRIBUTES['quarantine_notification']); $quota_b = ($quota_m * 1048576); $mailbox_attrs = json_encode( @@ -949,6 +952,9 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { 'tls_enforce_in' => strval($tls_enforce_in), 'tls_enforce_out' => strval($tls_enforce_out), 'sogo_access' => strval($sogo_access), + 'imap_access' => strval($imap_access), + 'pop3_access' => strval($pop3_access), + 'smtp_access' => strval($smtp_access), 'mailbox_format' => strval($MAILBOX_DEFAULT_ATTRIBUTES['mailbox_format']), 'quarantine_notification' => strval($quarantine_notification) ) @@ -1235,7 +1241,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $alias_domain = idn_to_ascii(strtolower(trim($alias_domain)), 0, INTL_IDNA_VARIANT_UTS46); $is_now = mailbox('get', 'alias_domain_details', $alias_domain); if (!empty($is_now)) { - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $target_domain = (!empty($_data['target_domain'])) ? idn_to_ascii(strtolower(trim($_data['target_domain'])), 0, INTL_IDNA_VARIANT_UTS46) : $is_now['target_domain']; } else { @@ -1603,7 +1609,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { if (!empty($is_now)) { $username = $is_now['user2']; $user1 = (!empty($_data['user1'])) ? $_data['user1'] : $is_now['user1']; - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $last_run = (isset($_data['last_run'])) ? NULL : $is_now['last_run']; $delete2duplicates = (isset($_data['delete2duplicates'])) ? intval($_data['delete2duplicates']) : $is_now['delete2duplicates']; $subscribeall = (isset($_data['subscribeall'])) ? intval($_data['subscribeall']) : $is_now['subscribeall']; @@ -1761,7 +1767,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $is_now = mailbox('get', 'filter_details', $id); if (!empty($is_now)) { $username = $is_now['username']; - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $script_desc = (!empty($_data['script_desc'])) ? $_data['script_desc'] : $is_now['script_desc']; $script_data = (!empty($_data['script_data'])) ? $_data['script_data'] : $is_now['script_data']; $filter_type = (!empty($_data['filter_type'])) ? $_data['filter_type'] : $is_now['filter_type']; @@ -1834,8 +1840,8 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { foreach ($ids as $id) { $is_now = mailbox('get', 'alias_details', $id); if (!empty($is_now)) { - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; - $sogo_visible = (isset($_data['sogo_visible'])) ? intval($_data['sogo_visible']) : $is_now['sogo_visible_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; + $sogo_visible = (isset($_data['sogo_visible'])) ? intval($_data['sogo_visible']) : $is_now['sogo_visible']; $goto_null = (isset($_data['goto_null'])) ? intval($_data['goto_null']) : 0; $goto_spam = (isset($_data['goto_spam'])) ? intval($_data['goto_spam']) : 0; $goto_ham = (isset($_data['goto_ham'])) ? intval($_data['goto_ham']) : 0; @@ -2014,7 +2020,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) { $is_now = mailbox('get', 'domain_details', $domain); if (!empty($is_now)) { - $gal = (isset($_data['gal'])) ? intval($_data['gal']) : $is_now['gal_int']; + $gal = (isset($_data['gal'])) ? intval($_data['gal']) : $is_now['gal']; $description = (!empty($_data['description']) && isset($_SESSION['acl']['domain_desc']) && $_SESSION['acl']['domain_desc'] == "1") ? $_data['description'] : $is_now['description']; } else { @@ -2043,11 +2049,11 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { elseif ($_SESSION['mailcow_cc_role'] == "admin") { $is_now = mailbox('get', 'domain_details', $domain); if (!empty($is_now)) { - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; - $backupmx = (isset($_data['backupmx'])) ? intval($_data['backupmx']) : $is_now['backupmx_int']; - $gal = (isset($_data['gal'])) ? intval($_data['gal']) : $is_now['gal_int']; - $relay_all_recipients = (isset($_data['relay_all_recipients'])) ? intval($_data['relay_all_recipients']) : $is_now['relay_all_recipients_int']; - $relay_unknown_only = (isset($_data['relay_unknown_only'])) ? intval($_data['relay_unknown_only']) : $is_now['relay_unknown_only_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; + $backupmx = (isset($_data['backupmx'])) ? intval($_data['backupmx']) : $is_now['backupmx']; + $gal = (isset($_data['gal'])) ? intval($_data['gal']) : $is_now['gal']; + $relay_all_recipients = (isset($_data['relay_all_recipients'])) ? intval($_data['relay_all_recipients']) : $is_now['relay_all_recipients']; + $relay_unknown_only = (isset($_data['relay_unknown_only'])) ? intval($_data['relay_unknown_only']) : $is_now['relay_unknown_only']; $relayhost = (isset($_data['relayhost'])) ? intval($_data['relayhost']) : $is_now['relayhost']; $aliases = (!empty($_data['aliases'])) ? $_data['aliases'] : $is_now['max_num_aliases_for_domain']; $mailboxes = (isset($_data['mailboxes']) && $_data['mailboxes'] != '') ? intval($_data['mailboxes']) : $is_now['max_num_mboxes_for_domain']; @@ -2208,10 +2214,18 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { continue; } $is_now = mailbox('get', 'mailbox_details', $username); + if (isset($_data['protocol_access'])) { + $_data['imap_access'] = (in_array('imap', $_data['protocol_access'])) ? 1 : 0; + $_data['pop3_access'] = (in_array('pop3', $_data['protocol_access'])) ? 1 : 0; + $_data['smtp_access'] = (in_array('smtp', $_data['protocol_access'])) ? 1 : 0; + } if (!empty($is_now)) { - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $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']) && isset($_SESSION['acl']['sogo_access']) && $_SESSION['acl']['sogo_access'] == "1") ? intval($_data['sogo_access']) : intval($is_now['attributes']['sogo_access']); + (int)$sogo_access = (isset($_data['sogo_access']) && isset($_SESSION['acl']['protocol_access']) && $_SESSION['acl']['protocol_access'] == "1") ? intval($_data['sogo_access']) : intval($is_now['attributes']['sogo_access']); + (int)$imap_access = (isset($_data['imap_access']) && isset($_SESSION['acl']['protocol_access']) && $_SESSION['acl']['protocol_access'] == "1") ? intval($_data['imap_access']) : intval($is_now['attributes']['imap_access']); + (int)$pop3_access = (isset($_data['pop3_access']) && isset($_SESSION['acl']['protocol_access']) && $_SESSION['acl']['protocol_access'] == "1") ? intval($_data['pop3_access']) : intval($is_now['attributes']['pop3_access']); + (int)$smtp_access = (isset($_data['smtp_access']) && isset($_SESSION['acl']['protocol_access']) && $_SESSION['acl']['protocol_access'] == "1") ? intval($_data['smtp_access']) : intval($is_now['attributes']['smtp_access']); (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']; @@ -2490,7 +2504,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { `name`= :name, `quota` = :quota_b, `attributes` = JSON_SET(`attributes`, '$.force_pw_update', :force_pw_update), - `attributes` = JSON_SET(`attributes`, '$.sogo_access', :sogo_access) + `attributes` = JSON_SET(`attributes`, '$.sogo_access', :sogo_access), + `attributes` = JSON_SET(`attributes`, '$.imap_access', :imap_access), + `attributes` = JSON_SET(`attributes`, '$.pop3_access', :pop3_access), + `attributes` = JSON_SET(`attributes`, '$.smtp_access', :smtp_access) WHERE `username` = :username"); $stmt->execute(array( ':active' => $active, @@ -2498,6 +2515,9 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ':quota_b' => $quota_b, ':force_pw_update' => $force_pw_update, ':sogo_access' => $sogo_access, + ':imap_access' => $imap_access, + ':pop3_access' => $pop3_access, + ':smtp_access' => $smtp_access, ':username' => $username )); $_SESSION['return'][] = array( @@ -2518,7 +2538,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { foreach ($names as $name) { $is_now = mailbox('get', 'resource_details', $name); if (!empty($is_now)) { - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $multiple_bookings = (isset($_data['multiple_bookings'])) ? intval($_data['multiple_bookings']) : $is_now['multiple_bookings']; $description = (!empty($_data['description'])) ? $_data['description'] : $is_now['description']; $kind = (!empty($_data['kind'])) ? $_data['kind'] : $is_now['kind']; @@ -2808,8 +2828,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { if (!is_numeric($_data)) { return false; } - $stmt = $pdo->prepare("SELECT CASE `script_name` WHEN 'active' THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, - CASE `script_name` WHEN 'active' THEN 1 ELSE 0 END AS `active_int`, + $stmt = $pdo->prepare("SELECT CASE `script_name` WHEN 'active' THEN 1 ELSE 0 END AS `active`, id, username, filter_type, @@ -2868,14 +2887,12 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $shown_fields[] = $field['Field']; } $stmt = $pdo->prepare("SELECT " . implode(',', $shown_fields) . ", - `active` AS `active_int`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` + `active` FROM `imapsync` WHERE id = :id"); } elseif (isset($_extra) && in_array('with_password', $_extra)) { $stmt = $pdo->prepare("SELECT *, - `active` AS `active_int`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` + `active` FROM `imapsync` WHERE id = :id"); } else { @@ -2885,8 +2902,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $shown_fields[] = $field['Field']; } $stmt = $pdo->prepare("SELECT " . implode(',', $shown_fields) . ", - `active` AS `active_int`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` + `active` FROM `imapsync` WHERE id = :id"); } $stmt->execute(array(':id' => $_data)); @@ -3119,10 +3135,8 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { `address`, `public_comment`, `private_comment`, - `active` as `active_int`, - `sogo_visible` as `sogo_visible_int`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, - CASE `sogo_visible` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `sogo_visible`, + `active`, + `sogo_visible`, `created`, `modified` FROM `alias` @@ -3153,8 +3167,6 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { (!filter_var($aliasdata['address'], FILTER_VALIDATE_EMAIL)) ? $aliasdata['is_catch_all'] = 1 : $aliasdata['is_catch_all'] = 0; $aliasdata['active'] = $row['active']; $aliasdata['sogo_visible'] = $row['sogo_visible']; - $aliasdata['active_int'] = $row['active_int']; - $aliasdata['sogo_visible_int'] = $row['sogo_visible_int']; $aliasdata['created'] = $row['created']; $aliasdata['modified'] = $row['modified']; if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $aliasdata['domain'])) { @@ -3168,8 +3180,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $stmt = $pdo->prepare("SELECT `alias_domain`, `target_domain`, - `active` AS `active_int`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, + `active`, `created`, `modified` FROM `alias_domain` @@ -3188,7 +3199,6 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $aliasdomaindata['target_domain'] = $row['target_domain']; $aliasdomaindata['active'] = $row['active']; $aliasdomaindata['rl'] = $rl; - $aliasdomaindata['active_int'] = $row['active_int']; $aliasdomaindata['created'] = $row['created']; $aliasdomaindata['modified'] = $row['modified']; if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $aliasdomaindata['target_domain'])) { @@ -3240,16 +3250,11 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { `maxquota`, `quota`, `relayhost`, - `relay_all_recipients` as `relay_all_recipients_int`, - `relay_unknown_only` as `relay_unknown_only_int`, - `backupmx` as `backupmx_int`, - `gal` as `gal_int`, - `active` as `active_int`, - CASE `relay_all_recipients` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `relay_all_recipients`, - CASE `relay_unknown_only` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `relay_unknown_only`, - CASE `backupmx` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `backupmx`, - CASE `gal` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `gal`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` + `relay_all_recipients`, + `relay_unknown_only`, + `backupmx`, + `gal`, + `active` FROM `domain` WHERE `domain`= :domain"); $stmt->execute(array( ':domain' => $_data @@ -3306,15 +3311,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $domaindata['relayhost'] = $row['relayhost']; $domaindata['backupmx'] = $row['backupmx']; $domaindata['gal'] = $row['gal']; - $domaindata['backupmx_int'] = $row['backupmx_int']; - $domaindata['gal_int'] = $row['gal_int']; $domaindata['rl'] = $rl; $domaindata['active'] = $row['active']; - $domaindata['active_int'] = $row['active_int']; $domaindata['relay_all_recipients'] = $row['relay_all_recipients']; $domaindata['relay_unknown_only'] = $row['relay_unknown_only']; - $domaindata['relay_all_recipients_int'] = $row['relay_all_recipients_int']; - $domaindata['relay_unknown_only_int'] = $row['relay_unknown_only_int']; $stmt = $pdo->prepare("SELECT COUNT(*) AS `alias_count` FROM `alias` WHERE (`domain`= :domain OR `domain` IN (SELECT `alias_domain` FROM `alias_domain` WHERE `target_domain` = :domain2)) AND `address` NOT IN ( @@ -3361,8 +3361,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { `domain`.`backupmx`, `mailbox`.`username`, `mailbox`.`name`, - `mailbox`.`active` AS `active_int`, - CASE `mailbox`.`active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, + `mailbox`.`active`, `mailbox`.`domain`, `mailbox`.`local_part`, `mailbox`.`quota`, @@ -3377,8 +3376,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { `domain`.`backupmx`, `mailbox`.`username`, `mailbox`.`name`, - `mailbox`.`active` AS `active_int`, - CASE `mailbox`.`active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, + `mailbox`.`active`, `mailbox`.`domain`, `mailbox`.`local_part`, `mailbox`.`quota`, @@ -3423,7 +3421,6 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $mailboxdata['last_smtp_login'] = $last_smtp_login; $mailboxdata['last_pop3_login'] = $last_pop3_login; $mailboxdata['active'] = $row['active']; - $mailboxdata['active_int'] = $row['active_int']; $mailboxdata['domain'] = $row['domain']; $mailboxdata['local_part'] = $row['local_part']; $mailboxdata['quota'] = $row['quota']; @@ -3432,7 +3429,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $mailboxdata['percent_in_use'] = ($row['quota'] == 0) ? '- ' : round((intval($row['bytes']) / intval($row['quota'])) * 100); $mailboxdata['messages'] = $row['messages']; $mailboxdata['spam_aliases'] = $SpamaliasUsage['sa_count']; - $mailboxdata['pushover_active'] = ($PushoverActive['pushover_active'] == 1) ? $lang['mailbox']['yes'] : $lang['mailbox']['no']; + $mailboxdata['pushover_active'] = ($PushoverActive['pushover_active'] == 1) ? 1 : 0; if ($mailboxdata['percent_in_use'] === '- ') { $mailboxdata['percent_class'] = "info"; } @@ -3458,8 +3455,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { `kind`, `multiple_bookings`, `local_part`, - `active` AS `active_int`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, + `active`, `domain` FROM `mailbox` WHERE `kind` REGEXP 'location|thing|group' AND `username` = :resource"); $stmt->execute(array( @@ -3471,7 +3467,6 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $resourcedata['multiple_bookings'] = $row['multiple_bookings']; $resourcedata['description'] = $row['name']; $resourcedata['active'] = $row['active']; - $resourcedata['active_int'] = $row['active_int']; $resourcedata['domain'] = $row['domain']; $resourcedata['local_part'] = $row['local_part']; if (!isset($resourcedata['domain']) || diff --git a/data/web/inc/functions.rspamd.inc.php b/data/web/inc/functions.rspamd.inc.php index 77b70f49..2d3dbf35 100644 --- a/data/web/inc/functions.rspamd.inc.php +++ b/data/web/inc/functions.rspamd.inc.php @@ -62,7 +62,7 @@ function rsettings($_action, $_data = null) { if (!empty($is_now)) { $content = (!empty($_data['content'])) ? $_data['content'] : $is_now['content']; $desc = (!empty($_data['desc'])) ? $_data['desc'] : $is_now['desc']; - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; } else { $_SESSION['return'][] = array( @@ -148,8 +148,7 @@ function rsettings($_action, $_data = null) { $stmt = $pdo->prepare("SELECT `id`, `desc`, `content`, - `active` AS `active_int`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` + `active` FROM `settingsmap` WHERE `id` = :id"); $stmt->execute(array(':id' => $_data)); @@ -303,8 +302,7 @@ function rspamd($_action, $_data = null) { $stmt = $pdo->prepare("SELECT `id`, `desc`, `content`, - `active` AS `active_int`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` + `active` FROM `settingsmap` WHERE `id` = :id"); $stmt->execute(array(':id' => $_data)); diff --git a/data/web/inc/functions.tls_policy_maps.inc.php b/data/web/inc/functions.tls_policy_maps.inc.php index 011a16fd..9d42b2c8 100644 --- a/data/web/inc/functions.tls_policy_maps.inc.php +++ b/data/web/inc/functions.tls_policy_maps.inc.php @@ -61,7 +61,7 @@ function tls_policy_maps($_action, $_data = null, $attr = null) { foreach ($ids as $id) { $is_now = tls_policy_maps('details', $id); if (!empty($is_now)) { - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $dest = (!empty($_data['dest'])) ? $_data['dest'] : $is_now['dest']; $policy = (!empty($_data['policy'])) ? $_data['policy'] : $is_now['policy']; $parameters = (isset($_data['parameters'])) ? $_data['parameters'] : $is_now['parameters']; @@ -133,8 +133,7 @@ function tls_policy_maps($_action, $_data = null, $attr = null) { `dest`, `policy`, `parameters`, - `active` AS `active_int`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, + `active` AS `active`, `created`, `modified` FROM `tls_policy_override` WHERE `id` = :id"); diff --git a/data/web/inc/functions.transports.inc.php b/data/web/inc/functions.transports.inc.php index e28b10a4..a535c184 100644 --- a/data/web/inc/functions.transports.inc.php +++ b/data/web/inc/functions.transports.inc.php @@ -64,7 +64,7 @@ function relayhost($_action, $_data = null) { $hostname = (!empty($_data['hostname'])) ? trim($_data['hostname']) : $is_now['hostname']; $username = (isset($_data['username'])) ? trim($_data['username']) : $is_now['username']; $password = (isset($_data['password'])) ? trim($_data['password']) : $is_now['password']; - $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; } else { $_SESSION['return'][] = array( @@ -154,9 +154,8 @@ function relayhost($_action, $_data = null) { `hostname`, `username`, `password`, - `active` AS `active_int`, - CONCAT(LEFT(`password`, 3), '...') AS `password_short`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active` + `active`, + CONCAT(LEFT(`password`, 3), '...') AS `password_short` FROM `relayhosts` WHERE `id` = :id"); $stmt->execute(array(':id' => $_data)); @@ -314,8 +313,8 @@ function transport($_action, $_data = null) { $nexthop = (!empty($_data['nexthop'])) ? trim($_data['nexthop']) : $is_now['nexthop']; $username = (isset($_data['username'])) ? trim($_data['username']) : $is_now['username']; $password = (isset($_data['password'])) ? trim($_data['password']) : $is_now['password']; - $lookup_mx = (isset($_data['lookup_mx']) && $_data['lookup_mx'] != '') ? intval($_data['lookup_mx']) : $is_now['lookup_mx_int']; - $active = (isset($_data['active']) && $_data['active'] != '') ? intval($_data['active']) : $is_now['active_int']; + $lookup_mx = (isset($_data['lookup_mx']) && $_data['lookup_mx'] != '') ? intval($_data['lookup_mx']) : $is_now['lookup_mx']; + $active = (isset($_data['active']) && $_data['active'] != '') ? intval($_data['active']) : $is_now['active']; } else { $_SESSION['return'][] = array( @@ -466,11 +465,9 @@ function transport($_action, $_data = null) { `nexthop`, `username`, `password`, - `active` AS `active_int`, - `lookup_mx` AS `lookup_mx_int`, - CONCAT(LEFT(`password`, 3), '...') AS `password_short`, - CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`, - CASE `lookup_mx` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `lookup_mx` + `active`, + `lookup_mx`, + CONCAT(LEFT(`password`, 3), '...') AS `password_short` FROM `transports` WHERE `id` = :id"); $stmt->execute(array(':id' => $_data)); diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php index e311669c..64ddc2cd 100644 --- a/data/web/inc/init_db.inc.php +++ b/data/web/inc/init_db.inc.php @@ -3,7 +3,7 @@ function init_db_schema() { try { global $pdo; - $db_version = "19082020_1400"; + $db_version = "16092020_1200"; $stmt = $pdo->query("SHOW TABLES LIKE 'versions'"); $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); @@ -542,6 +542,7 @@ function init_db_schema() { "spam_policy" => "TINYINT(1) NOT NULL DEFAULT '1'", "extend_sender_acl" => "TINYINT(1) NOT NULL DEFAULT '0'", "unlimited_quota" => "TINYINT(1) NOT NULL DEFAULT '0'", + "protocol_access" => "TINYINT(1) NOT NULL DEFAULT '1'", "alias_domains" => "TINYINT(1) NOT NULL DEFAULT '0'", "domain_desc" => "TINYINT(1) NOT NULL DEFAULT '0'" ), @@ -1154,6 +1155,9 @@ function init_db_schema() { $pdo->query("UPDATE `mailbox` SET `attributes` = '{}' WHERE `attributes` = '' OR `attributes` IS NULL;"); $pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.force_pw_update', \"0\") WHERE JSON_EXTRACT(`attributes`, '$.force_pw_update') IS NULL;"); $pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.sogo_access', \"1\") WHERE JSON_EXTRACT(`attributes`, '$.sogo_access') IS NULL;"); + $pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.imap_access', \"1\") WHERE JSON_EXTRACT(`attributes`, '$.imap_access') IS NULL;"); + $pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.pop3_access', \"1\") WHERE JSON_EXTRACT(`attributes`, '$.pop3_access') IS NULL;"); + $pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.smtp_access', \"1\") WHERE JSON_EXTRACT(`attributes`, '$.smtp_access') IS NULL;"); $pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.mailbox_format', \"maildir:\") WHERE JSON_EXTRACT(`attributes`, '$.mailbox_format') IS NULL;"); $pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.quarantine_notification', \"never\") WHERE JSON_EXTRACT(`attributes`, '$.quarantine_notification') IS NULL;"); foreach($tls_options as $tls_user => $tls_options) { diff --git a/data/web/inc/vars.inc.php b/data/web/inc/vars.inc.php index 730f93f9..a53ff9b1 100644 --- a/data/web/inc/vars.inc.php +++ b/data/web/inc/vars.inc.php @@ -157,6 +157,15 @@ $MAILBOX_DEFAULT_ATTRIBUTES['sogo_access'] = true; // Send notification when quarantine is not empty (never, hourly, daily, weekly) $MAILBOX_DEFAULT_ATTRIBUTES['quarantine_notification'] = 'hourly'; +// Mailbox has IMAP access by default +$MAILBOX_DEFAULT_ATTRIBUTES['imap_access'] = true; + +// Mailbox has POP3 access by default +$MAILBOX_DEFAULT_ATTRIBUTES['pop3_access'] = true; + +// Mailbox has SMTP access by default +$MAILBOX_DEFAULT_ATTRIBUTES['smtp_access'] = true; + // Default mailbox format, should not be changed unless you know exactly, what you do, keep the trailing ":" // Check dovecot.conf for further changes (e.g. shared namespace) $MAILBOX_DEFAULT_ATTRIBUTES['mailbox_format'] = 'maildir:'; diff --git a/data/web/js/build/014-mailcow.js b/data/web/js/build/014-mailcow.js index 6e4aa6e5..a2914738 100644 --- a/data/web/js/build/014-mailcow.js +++ b/data/web/js/build/014-mailcow.js @@ -147,6 +147,11 @@ $(document).ready(function() { event.preventDefault(); }); } + if ($(this).is("select")) { + $(this).prop('disabled', true); + $(this).append(''); + $(this).selectpicker('refresh'); + } if ($(this).hasClass('btn-group')) { $(this).find('a').each(function(){ $(this).removeClass('dropdown-toggle') diff --git a/data/web/js/site/admin.js b/data/web/js/site/admin.js index 6c29fd4b..a8a034bd 100644 --- a/data/web/js/site/admin.js +++ b/data/web/js/site/admin.js @@ -76,8 +76,8 @@ jQuery(function($){ {"name":"chkbox","title":"","style":{"maxWidth":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"}, {"sorted": true,"name":"username","title":lang.username,"style":{"width":"250px"}}, {"name":"selected_domains","title":lang.admin_domains,"breakpoints":"xs sm"}, - {"name":"tfa_active","title":"TFA", "filterable": false,"style":{"maxWidth":"80px","width":"80px"}}, - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active}, + {"name":"tfa_active","title":"TFA", "filterable": false,"style":{"maxWidth":"80px","width":"80px"},"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, + {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"250px","width":"250px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "rows": $.ajax({ @@ -131,8 +131,8 @@ jQuery(function($){ "columns": [ {"name":"chkbox","title":"","style":{"maxWidth":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"}, {"sorted": true,"name":"usr","title":lang.username,"style":{"width":"250px"}}, - {"name":"tfa_active","title":"TFA", "filterable": false,"style":{"maxWidth":"80px","width":"80px"}}, - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active}, + {"name":"tfa_active","title":"TFA", "filterable": false,"style":{"maxWidth":"80px","width":"80px"},"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, + {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"250px","width":"250px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "rows": $.ajax({ @@ -160,7 +160,7 @@ jQuery(function($){ {"name":"chkbox","title":"","style":{"maxWidth":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"}, {"name":"host","type":"text","title":lang.host,"style":{"width":"250px"}}, {"name":"source","title":lang.source,"breakpoints":"xs sm"}, - {"name":"keep_spam","title":lang.spamfilter, "type": "text","style":{"maxWidth":"80px","width":"80px"}}, + {"name":"keep_spam","title":lang.spamfilter, "type": "text","style":{"maxWidth":"80px","width":"80px"},"formatter": function(value){return 'yes'==value?'✕':'no'==value&&'✓';}}, {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "rows": $.ajax({ @@ -188,7 +188,7 @@ jQuery(function($){ {"name":"hostname","type":"text","title":lang.host,"style":{"width":"250px"}}, {"name":"username","title":lang.username,"breakpoints":"xs sm"}, {"name":"used_by_domains","title":lang.in_use_by,"style":{"width":"110px"}, "type": "text","breakpoints":"xs sm"}, - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active}, + {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"220px","width":"220px"},"type":"html","title":lang.action,"breakpoints":"xs sm md"} ], "rows": $.ajax({ @@ -216,7 +216,7 @@ jQuery(function($){ {"name":"destination","type":"text","title":lang.destination,"style":{"width":"250px"}}, {"name":"nexthop","type":"text","title":lang.nexthop,"style":{"width":"250px"}}, {"name":"username","title":lang.username,"breakpoints":"xs sm"}, - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active}, + {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"220px","width":"220px"},"type":"html","title":lang.action,"breakpoints":"xs sm md"} ], "rows": $.ajax({ @@ -311,12 +311,6 @@ jQuery(function($){ item.action = ''; - if (item.keep_spam == "yes") { - item.keep_spam = lang.no; - } - else { - item.keep_spam = lang.yes; - } item.chkbox = ''; }); } else if (table == 'oauth2clientstable') { diff --git a/data/web/js/site/mailbox.js b/data/web/js/site/mailbox.js index 311131c5..ff438be9 100644 --- a/data/web/js/site/mailbox.js +++ b/data/web/js/site/mailbox.js @@ -204,7 +204,7 @@ jQuery(function($){ function escapeHtml(n){return String(n).replace(/[&<>"'`=\/]/g,function(n){return entityMap[n]})} // http://stackoverflow.com/questions/46155/validate-email-address-in-javascript function humanFileSize(i){if(Math.abs(i)<1024)return i+" B";var B=["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],e=-1;do{i/=1024,++e}while(Math.abs(i)>=1024&&e ' + lang.edit + ''; } item.action += ' DNS
'; - if (item.backupmx_int == 1) { - if (item.relay_unknown_only_int == 1) { + if (item.backupmx == 1) { + if (item.relay_unknown_only == 1) { item.domain_name = '
Relay Non-Local
' + item.domain_name; - } else if (item.relay_all_recipients_int == 1) { + } else if (item.relay_all_recipients == 1) { item.domain_name = '
Relay All
' + item.domain_name; } else { item.domain_name = '
Relay
' + item.domain_name; @@ -374,7 +374,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}, + {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"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, @@ -480,7 +480,7 @@ jQuery(function($){ {"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}, + {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "empty": lang.empty, @@ -553,7 +553,7 @@ jQuery(function($){ {"name":"local_dest","title":lang.bcc_local_dest}, {"name":"bcc_dest","title":lang.bcc_destinations}, {"name":"domain","title":lang.domain,"breakpoints":"xs sm"}, - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active}, + {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "empty": lang.empty, @@ -620,7 +620,7 @@ jQuery(function($){ {"sorted": true,"name":"id","title":"ID","style":{"maxWidth":"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}, + {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"} ], "empty": lang.empty, @@ -685,7 +685,7 @@ jQuery(function($){ {"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}, + {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"} ], "empty": lang.empty, @@ -758,7 +758,7 @@ jQuery(function($){ {"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,"breakpoints":"all"}, - {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active}, + {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "empty": lang.empty, @@ -852,7 +852,7 @@ jQuery(function($){ {"name":"chkbox","title":"","style":{"maxWidth":"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}, + {"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"250px","width":"250px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "empty": lang.empty, @@ -923,7 +923,7 @@ jQuery(function($){ {"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}, + {"name":"active","filterable": false,"style":{"maxWidth":"70px","width":"70px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"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"} ], @@ -1016,7 +1016,7 @@ jQuery(function($){ }, success: function (data) { $.each(data, function (i, item) { - if (item.active_int == 1) { + if (item.active == 1) { item.active = '' + lang.active + ''; } else { item.active = '' + lang.inactive + ''; diff --git a/data/web/js/site/user.js b/data/web/js/site/user.js index 24ad5c23..83ee793e 100644 --- a/data/web/js/site/user.js +++ b/data/web/js/site/user.js @@ -102,7 +102,7 @@ jQuery(function($){ {"name":"mins_interval","title":lang.interval + " (min)","breakpoints":"all"}, {"name":"last_run","title":lang.last_run,"breakpoints":"all"}, {"name":"log","title":"Log"}, - {"name":"active","filterable": false,"style":{"maxWidth":"70px","width":"70px"},"title":lang.active}, + {"name":"active","filterable": false,"style":{"maxWidth":"70px","width":"70px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"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"} ], @@ -164,7 +164,7 @@ jQuery(function($){ {"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":"name","title":lang.app_name}, - {"name":"active","filterable": false,"style":{"maxWidth":"70px","width":"70px"},"title":lang.active}, + {"name":"active","filterable": false,"style":{"maxWidth":"70px","width":"70px"},"title":lang.active,"formatter": function(value){return 1==value?'✓':0==value&&'✕';}}, {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"} ], "empty": lang.empty, diff --git a/data/web/lang/lang.de.json b/data/web/lang/lang.de.json index 876dfc82..8bc0b8a6 100644 --- a/data/web/lang/lang.de.json +++ b/data/web/lang/lang.de.json @@ -9,6 +9,7 @@ "filters": "Filter", "login_as": "Einloggen als Mailbox-Benutzer", "prohibited": "Untersagt durch Richtlinie", + "protocol_access": "Ändern der erlaubten Protokolle", "pushover": "Pushover", "quarantine": "Quarantäne-Aktionen", "quarantine_attachments": "Anhänge aus Quarantäne", @@ -38,7 +39,7 @@ "app_name": "App-Name", "app_password": "App-Passwort hinzufügen", "automap": "Ordner automatisch mappen (\"Sent items\", \"Sent\" => \"Sent\" etc.)", - "backup_mx_options": "Backup-MX Optionen", + "backup_mx_options": "Relay Optionen", "comment_info": "Ein privater Kommentar ist für den Benutzer nicht einsehbar. Ein öffentlicher Kommentar wird als Tooltip im Interface des Benutzers angezeigt.", "custom_params": "Eigene Parameter", "custom_params_hint": "Richtig: --param=xy, falsch: --param xy", @@ -464,10 +465,11 @@ "active": "Aktiv", "advanced_settings": "Erweiterte Einstellungen", "alias": "Alias bearbeiten", + "allowed_protocols": "Erlaubte Protokolle", "app_name": "App-Name", "app_passwd": "App-Passwörter", "automap": "Ordner automatisch mappen (\"Sent items\", \"Sent\" => \"Sent\" etc.)", - "backup_mx_options": "Backup-MX-Optionen", + "backup_mx_options": "Relay Optionen", "bcc_dest_format": "BCC-Ziel muss eine gültige E-Mail-Adresse sein.", "client_id": "Client ID", "client_secret": "Client Secret", @@ -615,7 +617,7 @@ "alias_domain_alias_hint": "Alias-Adressen werden nicht automatisch auch auf Domain-Alias Adressen angewendet. Eine Alias-Adresse mein-alias@domain bildet demnach nicht die Adresse mein-alias@alias-domain ab.
E-Mail-Weiterleitungen an externe Postfächer sollten über Sieve (SOGo Weiterleitung oder im Reiter \"Filter\") angelegt werden.", "alias_domain_backupmx": "Alias-Domain für Relay-Domain inaktiv", "aliases": "Aliasse", - "backup_mx": "Backup-MX", + "backup_mx": "Relay Domain", "bcc": "BCC", "bcc_destination": "BCC-Ziel", "bcc_destinations": "BCC-Ziel", diff --git a/data/web/lang/lang.en.json b/data/web/lang/lang.en.json index be87b83b..94c141c4 100644 --- a/data/web/lang/lang.en.json +++ b/data/web/lang/lang.en.json @@ -9,6 +9,7 @@ "filters": "Filters", "login_as": "Login as mailbox user", "prohibited": "Prohibited by ACL", + "protocol_access": "Change protocol access", "pushover": "Pushover", "quarantine": "Quarantine actions", "quarantine_attachments": "Quarantine attachments", @@ -38,7 +39,7 @@ "app_name": "App name", "app_password": "Add app password", "automap": "Try to automap folders (\"Sent items\", \"Sent\" => \"Sent\" etc.)", - "backup_mx_options": "Backup MX options", + "backup_mx_options": "Relay options", "comment_info": "A private comment is not visible to the user, while a public comment is shown as tooltip when hovering it in a users overview", "custom_params": "Custom parameters", "custom_params_hint": "Right: --param=xy, wrong: --param xy", @@ -463,10 +464,11 @@ "active": "Active", "advanced_settings": "Advanced settings", "alias": "Edit alias", + "allowed_protocols": "Allowed protocols", "app_name": "App name", "app_passwd": "App password", "automap": "Try to automap folders (\"Sent items\", \"Sent\" => \"Sent\" etc.)", - "backup_mx_options": "Backup MX options", + "backup_mx_options": "Relay options", "bcc_dest_format": "BCC destination must be a single valid email address.", "client_id": "Client ID", "client_secret": "Client secret", @@ -614,7 +616,7 @@ "alias_domain_alias_hint": "Aliases are not applied on domain aliases automatically. An alias address my-alias@domain does not cover the address my-alias@alias-domain (where \"alias-domain\" is an imaginary alias domain for \"domain\").
Please use a sieve filter to redirect mail to an external mailbox (see tab \"Filters\" or use SOGo -> Forwarder).", "alias_domain_backupmx": "Alias domain inactive for relay domain", "aliases": "Aliases", - "backup_mx": "Backup MX", + "backup_mx": "Relay domain", "bcc": "BCC", "bcc_destination": "BCC destination", "bcc_destinations": "BCC destination", diff --git a/data/web/modals/mailbox.php b/data/web/modals/mailbox.php index d0a82f47..c1362c4f 100644 --- a/data/web/modals/mailbox.php +++ b/data/web/modals/mailbox.php @@ -114,10 +114,10 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
-
- -
- +
+ +
+
@@ -173,7 +173,7 @@ if (!isset($_SESSION['mailcow_cc_role'])) {

- +