diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php index 6a1f7382..a912b29b 100644 --- a/data/web/inc/functions.mailbox.inc.php +++ b/data/web/inc/functions.mailbox.inc.php @@ -1049,6 +1049,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $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); + $attribute_hash = (!empty($_data['attribute_hash'])) ? $_data['attribute_hash'] : ''; $mailbox_attrs = json_encode( array( 'force_pw_update' => strval($force_pw_update), @@ -1063,7 +1064,8 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { 'passwd_update' => time(), 'mailbox_format' => strval($MAILBOX_DEFAULT_ATTRIBUTES['mailbox_format']), 'quarantine_notification' => strval($quarantine_notification), - 'quarantine_category' => strval($quarantine_category) + 'quarantine_category' => strval($quarantine_category), + 'attribute_hash' => $attribute_hash ) ); if (!is_valid_domain_name($domain)) { @@ -1199,11 +1201,14 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ); break; } - $stmt = $pdo->prepare("INSERT INTO `tags_mailbox` (`username`, `tag_name`) VALUES (:username, :tag_name)"); - $stmt->execute(array( - ':username' => $username, - ':tag_name' => $tag, - )); + try { + $stmt = $pdo->prepare("INSERT INTO `tags_mailbox` (`username`, `tag_name`) VALUES (:username, :tag_name)"); + $stmt->execute(array( + ':username' => $username, + ':tag_name' => $tag, + )); + } catch (Exception $e) { + } } $stmt = $pdo->prepare("INSERT INTO `quota2` (`username`, `bytes`, `messages`) VALUES (:username, '0', '0') ON DUPLICATE KEY UPDATE `bytes` = '0', `messages` = '0';"); @@ -1298,10 +1303,12 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { return false; } + $attribute_hash = sha1(json_encode($mbox_template_data["attributes"])); $mbox_template_data = json_decode($mbox_template_data["attributes"], true); $mbox_template_data['domain'] = $_data['domain']; $mbox_template_data['local_part'] = $_data['local_part']; $mbox_template_data['authsource'] = $_data['authsource']; + $mbox_template_data['attribute_hash'] = $attribute_hash; $mbox_template_data['quota'] = intval($mbox_template_data['quota'] / 1048576); $mailbox_attributes = array('acl' => array()); @@ -2872,12 +2879,17 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { (int)$sieve_access = (isset($_data['sieve_access']) && isset($_SESSION['acl']['protocol_access']) && $_SESSION['acl']['protocol_access'] == "1") ? intval($_data['sieve_access']) : intval($is_now['attributes']['sieve_access']); (int)$relayhost = (isset($_data['relayhost']) && isset($_SESSION['acl']['mailbox_relayhost']) && $_SESSION['acl']['mailbox_relayhost'] == "1") ? intval($_data['relayhost']) : intval($is_now['attributes']['relayhost']); (int)$quota_m = (isset_has_content($_data['quota'])) ? intval($_data['quota']) : ($is_now['quota'] / 1048576); - $name = (!empty($_data['name'])) ? ltrim(rtrim($_data['name'], '>'), '<') : $is_now['name']; - $domain = $is_now['domain']; - $quota_b = $quota_m * 1048576; - $password = (!empty($_data['password'])) ? $_data['password'] : null; - $password2 = (!empty($_data['password2'])) ? $_data['password2'] : null; - $tags = (is_array($_data['tags']) ? $_data['tags'] : array()); + $name = (!empty($_data['name'])) ? ltrim(rtrim($_data['name'], '>'), '<') : $is_now['name']; + $domain = $is_now['domain']; + $quota_b = $quota_m * 1048576; + $password = (!empty($_data['password'])) ? $_data['password'] : null; + $password2 = (!empty($_data['password2'])) ? $_data['password2'] : null; + $tags = (is_array($_data['tags']) ? $_data['tags'] : array()); + $attribute_hash = (!empty($_data['attribute_hash'])) ? $_data['attribute_hash'] : ''; + $authsource = $is_now['authsource']; + if (in_array($_data['authsource'], array('mailcow', 'keycloak', 'generic-oidc'))){ + $authsource = $_data['authsource']; + } } else { $_SESSION['return'][] = array( @@ -3134,18 +3146,21 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { `active` = :active, `name`= :name, `quota` = :quota_b, + `authsource` = :authsource, `attributes` = JSON_SET(`attributes`, '$.force_pw_update', :force_pw_update), `attributes` = JSON_SET(`attributes`, '$.sogo_access', :sogo_access), `attributes` = JSON_SET(`attributes`, '$.imap_access', :imap_access), `attributes` = JSON_SET(`attributes`, '$.sieve_access', :sieve_access), `attributes` = JSON_SET(`attributes`, '$.pop3_access', :pop3_access), `attributes` = JSON_SET(`attributes`, '$.relayhost', :relayhost), - `attributes` = JSON_SET(`attributes`, '$.smtp_access', :smtp_access) + `attributes` = JSON_SET(`attributes`, '$.smtp_access', :smtp_access), + `attributes` = JSON_SET(`attributes`, '$.attribute_hash', :attribute_hash) WHERE `username` = :username"); $stmt->execute(array( ':active' => $active, ':name' => $name, ':quota_b' => $quota_b, + ':attribute_hash' => $attribute_hash, ':force_pw_update' => $force_pw_update, ':sogo_access' => $sogo_access, ':imap_access' => $imap_access, @@ -3153,7 +3168,8 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ':sieve_access' => $sieve_access, ':smtp_access' => $smtp_access, ':relayhost' => $relayhost, - ':username' => $username + ':username' => $username, + ':authsource' => $authsource )); // save tags foreach($tags as $index => $tag){ @@ -3166,11 +3182,14 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ); break; } - $stmt = $pdo->prepare("INSERT INTO `tags_mailbox` (`username`, `tag_name`) VALUES (:username, :tag_name)"); - $stmt->execute(array( - ':username' => $username, - ':tag_name' => $tag, - )); + try { + $stmt = $pdo->prepare("INSERT INTO `tags_mailbox` (`username`, `tag_name`) VALUES (:username, :tag_name)"); + $stmt->execute(array( + ':username' => $username, + ':tag_name' => $tag, + )); + } catch (Exception $e) { + } } $_SESSION['return'][] = array( @@ -3196,7 +3215,13 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { return false; } - $mbox_template_data = json_decode($mbox_template_data["attributes"], true); + $attribute_hash = sha1(json_encode($mbox_template_data["attributes"])); + $is_now = mailbox('get', 'mailbox_details', $_data['username']); + if ($is_now['attributes']['attribute_hash'] == $attribute_hash) + return true; + + $mbox_template_data = json_decode($mbox_template_data["attributes"], true); + $mbox_template_data['attribute_hash'] = $attribute_hash; $quarantine_attributes = array('username' => $_data['username']); $tls_attributes = array('username' => $_data['username']); $ratelimit_attributes = array('object' => $_data['username']); diff --git a/data/web/templates/edit/mailbox.twig b/data/web/templates/edit/mailbox.twig index 0cc4a887..1167727c 100644 --- a/data/web/templates/edit/mailbox.twig +++ b/data/web/templates/edit/mailbox.twig @@ -19,7 +19,13 @@