Compare commits

...

4 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
81f458ebd5 Decode tag input before updating domains
Co-authored-by: DerLinkman <62480600+DerLinkman@users.noreply.github.com>
2025-12-12 11:41:51 +00:00
copilot-swe-agent[bot]
32b053f9be Update domain modified timestamp on tag changes
Co-authored-by: DerLinkman <62480600+DerLinkman@users.noreply.github.com>
2025-12-12 11:26:18 +00:00
copilot-swe-agent[bot]
b01371c78e Initial plan 2025-12-12 11:10:12 +00:00
DerLinkman
4ef65fc382 Merge pull request #6948 from mailcow/staging
2025-12
2025-12-09 13:29:15 +01:00

View File

@@ -842,11 +842,11 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
);
continue;
}
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
'msg' => 'access_denied'
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
'msg' => 'access_denied'
);
continue;
}
@@ -2732,7 +2732,11 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
$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'];
(int)$relayhost = (isset($_data['relayhost']) && isset($_SESSION['acl']['domain_relayhost']) && $_SESSION['acl']['domain_relayhost'] == "1") ? intval($_data['relayhost']) : intval($is_now['relayhost']);
$tags = (is_array($_data['tags']) ? $_data['tags'] : array());
$tags_raw = isset($_data['tags']) ? $_data['tags'] : array();
$tags = is_array($tags_raw) ? $tags_raw : json_decode($tags_raw, true);
if (!is_array($tags)) {
$tags = array();
}
}
else {
$_SESSION['return'][] = array(
@@ -2753,11 +2757,11 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
':domain' => $domain
));
// save tags
foreach($tags as $index => $tag){
if (empty($tag)) continue;
if ($index > $GLOBALS['TAGGING_LIMIT']) {
$_SESSION['return'][] = array(
'type' => 'warning',
foreach($tags as $index => $tag){
if (empty($tag)) continue;
if ($index > $GLOBALS['TAGGING_LIMIT']) {
$_SESSION['return'][] = array(
'type' => 'warning',
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
'msg' => array('tag_limit_exceeded', 'limit '.$GLOBALS['TAGGING_LIMIT'])
);
@@ -2769,6 +2773,8 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
':tag_name' => $tag,
));
}
$stmt = $pdo->prepare("UPDATE `domain` SET `modified` = NOW() WHERE `domain` = :domain");
$stmt->execute(array(':domain' => $domain));
$_SESSION['return'][] = array(
'type' => 'success',
@@ -2791,7 +2797,11 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
$maxquota = (!empty($_data['maxquota'])) ? $_data['maxquota'] : ($is_now['max_quota_for_mbox'] / 1048576);
$quota = (!empty($_data['quota'])) ? $_data['quota'] : ($is_now['max_quota_for_domain'] / 1048576);
$description = (!empty($_data['description'])) ? $_data['description'] : $is_now['description'];
$tags = (is_array($_data['tags']) ? $_data['tags'] : array());
$tags_raw = isset($_data['tags']) ? $_data['tags'] : array();
$tags = is_array($tags_raw) ? $tags_raw : json_decode($tags_raw, true);
if (!is_array($tags)) {
$tags = array();
}
if ($relay_all_recipients == '1') {
$backupmx = '1';
}
@@ -2931,17 +2941,19 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
);
break;
}
$stmt = $pdo->prepare("INSERT INTO `tags_domain` (`domain`, `tag_name`) VALUES (:domain, :tag_name)");
$stmt->execute(array(
':domain' => $domain,
':tag_name' => $tag,
));
}
$_SESSION['return'][] = array(
'type' => 'success',
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
'msg' => array('domain_modified', htmlspecialchars($domain))
$stmt = $pdo->prepare("INSERT INTO `tags_domain` (`domain`, `tag_name`) VALUES (:domain, :tag_name)");
$stmt->execute(array(
':domain' => $domain,
':tag_name' => $tag,
));
}
$stmt = $pdo->prepare("UPDATE `domain` SET `modified` = NOW() WHERE `domain` = :domain");
$stmt->execute(array(':domain' => $domain));
$_SESSION['return'][] = array(
'type' => 'success',
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
'msg' => array('domain_modified', htmlspecialchars($domain))
);
}
}
@@ -6108,14 +6120,15 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
else {
$domains = $_data['domain'];
}
$tags = $_data['tags'];
$tags_raw = isset($_data['tags']) ? $_data['tags'] : array();
$tags = is_array($tags_raw) ? $tags_raw : json_decode($tags_raw, true);
if (!is_array($tags)) $tags = array();
$wasModified = false;
foreach ($domains as $domain) {
if (!is_valid_domain_name($domain)) {
$_SESSION['return'][] = array(
$modifiedDomains = array();
$wasModified = false;
foreach ($domains as $domain) {
if (!is_valid_domain_name($domain)) {
$_SESSION['return'][] = array(
'type' => 'danger',
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
'msg' => 'domain_invalid'
@@ -6128,27 +6141,44 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
'msg' => 'access_denied'
);
return false;
return false;
}
foreach($tags as $tag){
// delete tag
$wasModified = true;
$stmt = $pdo->prepare("DELETE FROM `tags_domain` WHERE `domain` = :domain AND `tag_name` = :tag_name");
$stmt->execute(array(
':domain' => $domain,
':tag_name' => $tag,
));
}
}
if (!$wasModified) return false;
$_SESSION['return'][] = array(
'type' => 'success',
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
'msg' => array('domain_modified', $domain)
);
break;
$domainModified = false;
foreach($tags as $tag){
// delete tag
$domainModified = true;
$wasModified = true;
$stmt = $pdo->prepare("DELETE FROM `tags_domain` WHERE `domain` = :domain AND `tag_name` = :tag_name");
$stmt->execute(array(
':domain' => $domain,
':tag_name' => $tag,
));
}
if ($domainModified) {
$modifiedDomains[] = $domain;
}
}
if (!$wasModified) return false;
if (!empty($modifiedDomains)) {
$placeholders = array();
$params = array();
foreach ($modifiedDomains as $idx => $modifiedDomain) {
$placeholders[] = ":domain".$idx;
$params[":domain".$idx] = $modifiedDomain;
}
$stmt = $pdo->prepare("UPDATE `domain` SET `modified` = NOW() WHERE `domain` IN (".implode(',', $placeholders).")");
$stmt->execute($params);
$modifiedDomains = array_map('htmlspecialchars', $modifiedDomains);
}
$modifiedDomains = (empty($modifiedDomains)) ? array('-') : $modifiedDomains;
$_SESSION['return'][] = array(
'type' => 'success',
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
'msg' => array('domain_modified', implode(', ', $modifiedDomains))
);
break;
case 'tags_mailbox':
if (!is_array($_data['username'])) {
$usernames = array();