[Web] Fixes for BCC map input fields
[Web] Allow to edit alias address [Web] $_SESSION['return'] now contains arrays and allows multiple returned messages and log entries [Web] Some language string changes [Web] General SQL exception handler, remove all try catch handlers [Web] Alias table now has an ID as primary key [Web] Be more aggressive with localStorage cleaningmaster
parent
d5e81b987b
commit
a11cce6765
|
@ -261,7 +261,7 @@ $tfa_data = get_tfa();
|
||||||
else {
|
else {
|
||||||
?>
|
?>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-1"><input type="checkbox" data-id="dkim" name="multi_select" value="<?=$domain;?>" disabled /></div>
|
<div class="col-md-1"><input type="checkbox" data-id="dkim" name="multi_select" value="<?=$alias_domain;?>" disabled /></div>
|
||||||
<div class="col-md-2 col-md-offset-1">
|
<div class="col-md-2 col-md-offset-1">
|
||||||
<p><small>↳ Alias-Domain: <strong><?=htmlspecialchars($alias_domain);?></strong><br /></small><span class="label label-danger"><?=$lang['admin']['dkim_key_missing'];?></span></p>
|
<p><small>↳ Alias-Domain: <strong><?=htmlspecialchars($alias_domain);?></strong><br /></small><span class="label label-danger"><?=$lang['admin']['dkim_key_missing'];?></span></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -74,7 +74,7 @@ if ($login_role === "user") {
|
||||||
$redis->lTrim('AUTODISCOVER_LOG', 0, 100);
|
$redis->lTrim('AUTODISCOVER_LOG', 0, 100);
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'msg' => 'Redis: '.$e
|
'msg' => 'Redis: '.$e
|
||||||
);
|
);
|
||||||
|
@ -128,7 +128,7 @@ if ($login_role === "user") {
|
||||||
$redis->lTrim('AUTODISCOVER_LOG', 0, 100);
|
$redis->lTrim('AUTODISCOVER_LOG', 0, 100);
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'msg' => 'Redis: '.$e
|
'msg' => 'Redis: '.$e
|
||||||
);
|
);
|
||||||
|
|
|
@ -28,6 +28,12 @@ if (isset($_SESSION['mailcow_cc_role'])) {
|
||||||
<br />
|
<br />
|
||||||
<form class="form-horizontal" data-id="editalias" role="form" method="post">
|
<form class="form-horizontal" data-id="editalias" role="form" method="post">
|
||||||
<input type="hidden" value="0" name="active">
|
<input type="hidden" value="0" name="active">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-sm-2" for="address"><?=$lang['edit']['alias'];?></label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input class="form-control" type="text" name="address" value="<?=htmlspecialchars($result['address']);?>" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-sm-2" for="goto"><?=$lang['edit']['target_address'];?></label>
|
<label class="control-label col-sm-2" for="goto"><?=$lang['edit']['target_address'];?></label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
|
@ -636,23 +642,23 @@ if (isset($_SESSION['mailcow_cc_role'])) {
|
||||||
$result = bcc('details', $bcc);
|
$result = bcc('details', $bcc);
|
||||||
if (!empty($result)) {
|
if (!empty($result)) {
|
||||||
?>
|
?>
|
||||||
<h4>BCC map</h4>
|
<h4><?=$lang['mailbox']['bcc_map'];?></h4>
|
||||||
<br />
|
<br />
|
||||||
<form class="form-horizontal" data-id="editbcc" role="form" method="post">
|
<form class="form-horizontal" data-id="editbcc" role="form" method="post">
|
||||||
<input type="hidden" value="0" name="active">
|
<input type="hidden" value="0" name="active">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-sm-2" for="bcc_dest">BCC destination</label>
|
<label class="control-label col-sm-2" for="bcc_dest"><?=$lang['mailbox']['bcc_destination'];?></label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<textarea id="bcc_dest" class="form-control" autocapitalize="none" autocorrect="off" rows="10" id="bcc_dest" name="bcc_dest" required><?=$result['bcc_dest'];?></textarea>
|
<input value="<?=$result['bcc_dest'];?>" type="text" class="form-control" name="bcc_dest" id="bcc_dest">
|
||||||
<small>BCC destination must be a single valid email address.</small>
|
<small><?=$lang['edit']['bcc_dest_format'];?></small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-sm-2" for="type">Type:</label>
|
<label class="control-label col-sm-2" for="type"><?=$lang['mailbox']['bcc_map_type'];?></label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<select id="addFilterType" name="type" id="type" required>
|
<select id="addFilterType" name="type" id="type" required>
|
||||||
<option value="sender" <?=($result['type'] == 'sender') ? 'selected' : null;?>>Sender map</option>
|
<option value="sender" <?=($result['type'] == 'sender') ? 'selected' : null;?>><?=$lang['mailbox']['bcc_sender_map'];?></option>
|
||||||
<option value="rcpt" <?=($result['type'] == 'rcpt') ? 'selected' : null;?>>Recipient map</option>
|
<option value="rcpt" <?=($result['type'] == 'rcpt') ? 'selected' : null;?>><?=$lang['mailbox']['bcc_rcpt_map'];?></option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -29,7 +29,7 @@ $(window).load(function() {
|
||||||
});
|
});
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
window.mailcow_alert_box = function(message, type) {
|
window.mailcow_alert_box = function(message, type) {
|
||||||
msg = $('<span/>').html(message).text();
|
msg = $('<span/>').text(message).text();
|
||||||
if (type == 'danger') {
|
if (type == 'danger') {
|
||||||
auto_hide = 0;
|
auto_hide = 0;
|
||||||
$('#' + localStorage.getItem("add_modal")).modal('show');
|
$('#' + localStorage.getItem("add_modal")).modal('show');
|
||||||
|
@ -42,9 +42,11 @@ $(document).ready(function() {
|
||||||
<?php
|
<?php
|
||||||
$alertbox_log_parser = alertbox_log_parser($_SESSION);
|
$alertbox_log_parser = alertbox_log_parser($_SESSION);
|
||||||
if (is_array($alertbox_log_parser)) {
|
if (is_array($alertbox_log_parser)) {
|
||||||
|
foreach($alertbox_log_parser as $log) {
|
||||||
?>
|
?>
|
||||||
mailcow_alert_box(<?=$alertbox_log_parser['msg'];?>, <?=$alertbox_log_parser['type'];?>);
|
mailcow_alert_box(<?=$log['msg'];?>, <?=$log['type'];?>);
|
||||||
<?php
|
<?php
|
||||||
|
}
|
||||||
unset($_SESSION['return']);
|
unset($_SESSION['return']);
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -8,7 +8,7 @@ function bcc($_action, $_data = null, $attr = null) {
|
||||||
switch ($_action) {
|
switch ($_action) {
|
||||||
case 'add':
|
case 'add':
|
||||||
if (!isset($_SESSION['acl']['bcc_maps']) || $_SESSION['acl']['bcc_maps'] != "1" ) {
|
if (!isset($_SESSION['acl']['bcc_maps']) || $_SESSION['acl']['bcc_maps'] != "1" ) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -20,7 +20,7 @@ function bcc($_action, $_data = null, $attr = null) {
|
||||||
$active = intval($_data['active']);
|
$active = intval($_data['active']);
|
||||||
$type = $_data['type'];
|
$type = $_data['type'];
|
||||||
if ($type != 'sender' && $type != 'rcpt') {
|
if ($type != 'sender' && $type != 'rcpt') {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'invalid_bcc_map_type'
|
'msg' => 'invalid_bcc_map_type'
|
||||||
|
@ -28,7 +28,7 @@ function bcc($_action, $_data = null, $attr = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (empty($bcc_dest)) {
|
if (empty($bcc_dest)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'bcc_empty'
|
'msg' => 'bcc_empty'
|
||||||
|
@ -37,7 +37,7 @@ function bcc($_action, $_data = null, $attr = null) {
|
||||||
}
|
}
|
||||||
if (is_valid_domain_name($local_dest)) {
|
if (is_valid_domain_name($local_dest)) {
|
||||||
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $local_dest)) {
|
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $local_dest)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -49,7 +49,7 @@ function bcc($_action, $_data = null, $attr = null) {
|
||||||
}
|
}
|
||||||
elseif (filter_var($local_dest, FILTER_VALIDATE_EMAIL)) {
|
elseif (filter_var($local_dest, FILTER_VALIDATE_EMAIL)) {
|
||||||
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $local_dest)) {
|
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $local_dest)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -66,29 +66,21 @@ function bcc($_action, $_data = null, $attr = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!filter_var($bcc_dest, FILTER_VALIDATE_EMAIL)) {
|
if (!filter_var($bcc_dest, FILTER_VALIDATE_EMAIL)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'bcc_must_be_email'
|
'msg' => 'bcc_must_be_email'
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("SELECT `id` FROM `bcc_maps`
|
$stmt = $pdo->prepare("SELECT `id` FROM `bcc_maps`
|
||||||
WHERE `local_dest` = :local_dest AND `type` = :type");
|
WHERE `local_dest` = :local_dest AND `type` = :type");
|
||||||
$stmt->execute(array(':local_dest' => $local_dest_sane, ':type' => $type));
|
$stmt->execute(array(':local_dest' => $local_dest_sane, ':type' => $type));
|
||||||
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if ($num_results != 0) {
|
if ($num_results != 0) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('bcc_exists', htmlspecialchars($local_dest_sane), $type)
|
'msg' => array('bcc_exists', htmlspecialchars($local_dest_sane), $type)
|
||||||
|
@ -107,14 +99,14 @@ function bcc($_action, $_data = null, $attr = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'bcc_saved'
|
'msg' => 'bcc_saved'
|
||||||
|
@ -122,7 +114,7 @@ function bcc($_action, $_data = null, $attr = null) {
|
||||||
break;
|
break;
|
||||||
case 'edit':
|
case 'edit':
|
||||||
if (!isset($_SESSION['acl']['bcc_maps']) || $_SESSION['acl']['bcc_maps'] != "1" ) {
|
if (!isset($_SESSION['acl']['bcc_maps']) || $_SESSION['acl']['bcc_maps'] != "1" ) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -139,53 +131,45 @@ function bcc($_action, $_data = null, $attr = null) {
|
||||||
$type = (!empty($_data['type'])) ? $_data['type'] : $is_now['type'];
|
$type = (!empty($_data['type'])) ? $_data['type'] : $is_now['type'];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
$active = intval($_data['active']);
|
$active = intval($_data['active']);
|
||||||
if (!filter_var($bcc_dest, FILTER_VALIDATE_EMAIL)) {
|
if (!filter_var($bcc_dest, FILTER_VALIDATE_EMAIL)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'bcc_must_be_email'
|
'msg' => array('bcc_must_be_email', $bcc_dest)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
if (empty($bcc_dest)) {
|
if (empty($bcc_dest)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'bcc_empty'
|
'msg' => array('bcc_must_be_email', $bcc_dest)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
$stmt = $pdo->prepare("SELECT `id` FROM `bcc_maps`
|
$stmt = $pdo->prepare("SELECT `id` FROM `bcc_maps`
|
||||||
WHERE `local_dest` = :local_dest AND `type` = :type");
|
WHERE `local_dest` = :local_dest AND `type` = :type");
|
||||||
$stmt->execute(array(':local_dest' => $local_dest, ':type' => $type));
|
$stmt->execute(array(':local_dest' => $local_dest, ':type' => $type));
|
||||||
$id_now = $stmt->fetch(PDO::FETCH_ASSOC)['id'];
|
$id_now = $stmt->fetch(PDO::FETCH_ASSOC)['id'];
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
if (isset($id_now) && $id_now != $id) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('bcc_exists', htmlspecialchars($local_dest), $type)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
if (isset($id_now) && $id_now != $id) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
|
||||||
'msg' => array('bcc_exists', htmlspecialchars($local_dest), $type)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("UPDATE `bcc_maps` SET `bcc_dest` = :bcc_dest, `active` = :active, `type` = :type WHERE `id`= :id");
|
$stmt = $pdo->prepare("UPDATE `bcc_maps` SET `bcc_dest` = :bcc_dest, `active` = :active, `type` = :type WHERE `id`= :id");
|
||||||
$stmt->execute(array(
|
$stmt->execute(array(
|
||||||
':bcc_dest' => $bcc_dest,
|
':bcc_dest' => $bcc_dest,
|
||||||
|
@ -195,45 +179,37 @@ function bcc($_action, $_data = null, $attr = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
|
'msg' => array('bcc_edited', $bcc_dest)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
|
||||||
'msg' => 'bcc_edited'
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case 'details':
|
case 'details':
|
||||||
$bccdata = array();
|
$bccdata = array();
|
||||||
$id = intval($_data);
|
$id = intval($_data);
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("SELECT `id`,
|
$stmt = $pdo->prepare("SELECT `id`,
|
||||||
`local_dest`,
|
`local_dest`,
|
||||||
`bcc_dest`,
|
`bcc_dest`,
|
||||||
`active` AS `active_int`,
|
`active` AS `active_int`,
|
||||||
CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`,
|
CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`,
|
||||||
`type`,
|
`type`,
|
||||||
`created`,
|
`created`,
|
||||||
`domain`,
|
`domain`,
|
||||||
`modified` FROM `bcc_maps`
|
`modified` FROM `bcc_maps`
|
||||||
WHERE `id` = :id");
|
WHERE `id` = :id");
|
||||||
$stmt->execute(array(':id' => $id));
|
$stmt->execute(array(':id' => $id));
|
||||||
$bccdata = $stmt->fetch(PDO::FETCH_ASSOC);
|
$bccdata = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $bccdata['domain'])) {
|
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $bccdata['domain'])) {
|
||||||
$bccdata = null;
|
$bccdata = null;
|
||||||
return false;
|
return false;
|
||||||
|
@ -244,18 +220,10 @@ function bcc($_action, $_data = null, $attr = null) {
|
||||||
$bccdata = array();
|
$bccdata = array();
|
||||||
$all_items = array();
|
$all_items = array();
|
||||||
$id = intval($_data);
|
$id = intval($_data);
|
||||||
try {
|
|
||||||
$stmt = $pdo->query("SELECT `id`, `domain` FROM `bcc_maps`");
|
$stmt = $pdo->query("SELECT `id`, `domain` FROM `bcc_maps`");
|
||||||
$all_items = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$all_items = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
foreach ($all_items as $i) {
|
foreach ($all_items as $i) {
|
||||||
if (hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $i['domain'])) {
|
if (hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $i['domain'])) {
|
||||||
$bccdata[] = $i['id'];
|
$bccdata[] = $i['id'];
|
||||||
|
@ -275,31 +243,30 @@ function bcc($_action, $_data = null, $attr = null) {
|
||||||
$stmt->execute(array(':id' => $id));
|
$stmt->execute(array(':id' => $id));
|
||||||
$domain = $stmt->fetch(PDO::FETCH_ASSOC)['domain'];
|
$domain = $stmt->fetch(PDO::FETCH_ASSOC)['domain'];
|
||||||
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {
|
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
$stmt = $pdo->prepare("DELETE FROM `bcc_maps` WHERE `id`= :id");
|
$stmt = $pdo->prepare("DELETE FROM `bcc_maps` WHERE `id`= :id");
|
||||||
$stmt->execute(array(':id' => $id));
|
$stmt->execute(array(':id' => $id));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
|
'msg' => array('bcc_deleted', $id)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
|
||||||
'msg' => array('bcc_deleted', implode(', ', $ids))
|
|
||||||
);
|
|
||||||
return true;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -325,7 +292,7 @@ function recipient_map($_action, $_data = null, $attr = null) {
|
||||||
$old_dest_sane = $old_dest;
|
$old_dest_sane = $old_dest;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('invalid_recipient_map_old', htmlspecialchars($old_dest))
|
'msg' => array('invalid_recipient_map_old', htmlspecialchars($old_dest))
|
||||||
|
@ -333,7 +300,7 @@ function recipient_map($_action, $_data = null, $attr = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!filter_var($new_dest, FILTER_VALIDATE_EMAIL)) {
|
if (!filter_var($new_dest, FILTER_VALIDATE_EMAIL)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('invalid_recipient_map_new', htmlspecialchars($new_dest))
|
'msg' => array('invalid_recipient_map_new', htmlspecialchars($new_dest))
|
||||||
|
@ -345,7 +312,7 @@ function recipient_map($_action, $_data = null, $attr = null) {
|
||||||
$old_dests_existing[] = recipient_map('details', $rmap)['recipient_map_old'];
|
$old_dests_existing[] = recipient_map('details', $rmap)['recipient_map_old'];
|
||||||
}
|
}
|
||||||
if (in_array($old_dest_sane, $old_dests_existing)) {
|
if (in_array($old_dest_sane, $old_dests_existing)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('recipient_map_entry_exists', htmlspecialchars($old_dest))
|
'msg' => array('recipient_map_entry_exists', htmlspecialchars($old_dest))
|
||||||
|
@ -362,14 +329,14 @@ function recipient_map($_action, $_data = null, $attr = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('recipient_map_entry_saved', htmlspecialchars($old_dest_sane))
|
'msg' => array('recipient_map_entry_saved', htmlspecialchars($old_dest_sane))
|
||||||
|
@ -388,12 +355,12 @@ function recipient_map($_action, $_data = null, $attr = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
if (is_valid_domain_name($old_dest)) {
|
if (is_valid_domain_name($old_dest)) {
|
||||||
$old_dest_sane = '@' . idn_to_ascii($old_dest);
|
$old_dest_sane = '@' . idn_to_ascii($old_dest);
|
||||||
|
@ -402,21 +369,21 @@ function recipient_map($_action, $_data = null, $attr = null) {
|
||||||
$old_dest_sane = $old_dest;
|
$old_dest_sane = $old_dest;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('invalid_recipient_map_old', htmlspecialchars($old_dest))
|
'msg' => array('invalid_recipient_map_old', htmlspecialchars($old_dest))
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
$active = intval($_data['active']);
|
$active = intval($_data['active']);
|
||||||
if (!filter_var($new_dest, FILTER_VALIDATE_EMAIL)) {
|
if (!filter_var($new_dest, FILTER_VALIDATE_EMAIL)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('invalid_recipient_map_new', htmlspecialchars($new_dest))
|
'msg' => array('invalid_recipient_map_new', htmlspecialchars($new_dest))
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
$rmaps = recipient_map('get');
|
$rmaps = recipient_map('get');
|
||||||
foreach ($rmaps as $rmap) {
|
foreach ($rmaps as $rmap) {
|
||||||
|
@ -424,12 +391,12 @@ function recipient_map($_action, $_data = null, $attr = null) {
|
||||||
}
|
}
|
||||||
if (in_array($old_dest_sane, $old_dests_existing) &&
|
if (in_array($old_dest_sane, $old_dests_existing) &&
|
||||||
recipient_map('details', $id)['recipient_map_old'] != $old_dest_sane) {
|
recipient_map('details', $id)['recipient_map_old'] != $old_dest_sane) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('recipient_map_entry_exists', htmlspecialchars($old_dest_sane))
|
'msg' => array('recipient_map_entry_exists', htmlspecialchars($old_dest_sane))
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
$stmt = $pdo->prepare("UPDATE `recipient_maps` SET
|
$stmt = $pdo->prepare("UPDATE `recipient_maps` SET
|
||||||
|
@ -445,61 +412,45 @@ function recipient_map($_action, $_data = null, $attr = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
|
'msg' => array('recipient_map_entry_saved', htmlspecialchars($old_dest_sane))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
|
||||||
'msg' => array('recipient_map_entry_saved', htmlspecialchars($old_dest))
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case 'details':
|
case 'details':
|
||||||
$mapdata = array();
|
$mapdata = array();
|
||||||
$id = intval($_data);
|
$id = intval($_data);
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("SELECT `id`,
|
$stmt = $pdo->prepare("SELECT `id`,
|
||||||
`old_dest` AS `recipient_map_old`,
|
`old_dest` AS `recipient_map_old`,
|
||||||
`new_dest` AS `recipient_map_new`,
|
`new_dest` AS `recipient_map_new`,
|
||||||
`active` AS `active_int`,
|
`active` AS `active_int`,
|
||||||
CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`,
|
CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`,
|
||||||
`created`,
|
`created`,
|
||||||
`modified` FROM `recipient_maps`
|
`modified` FROM `recipient_maps`
|
||||||
WHERE `id` = :id");
|
WHERE `id` = :id");
|
||||||
$stmt->execute(array(':id' => $id));
|
$stmt->execute(array(':id' => $id));
|
||||||
$mapdata = $stmt->fetch(PDO::FETCH_ASSOC);
|
$mapdata = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return $mapdata;
|
return $mapdata;
|
||||||
break;
|
break;
|
||||||
case 'get':
|
case 'get':
|
||||||
$mapdata = array();
|
$mapdata = array();
|
||||||
$all_items = array();
|
$all_items = array();
|
||||||
$id = intval($_data);
|
$id = intval($_data);
|
||||||
try {
|
|
||||||
$stmt = $pdo->query("SELECT `id` FROM `recipient_maps`");
|
$stmt = $pdo->query("SELECT `id` FROM `recipient_maps`");
|
||||||
$all_items = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$all_items = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
foreach ($all_items as $i) {
|
foreach ($all_items as $i) {
|
||||||
$mapdata[] = $i['id'];
|
$mapdata[] = $i['id'];
|
||||||
}
|
}
|
||||||
|
@ -517,7 +468,7 @@ function recipient_map($_action, $_data = null, $attr = null) {
|
||||||
$stmt->execute(array(':id' => $id));
|
$stmt->execute(array(':id' => $id));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
'log' => array(__FUNCTION__, $_action, $_data, $_attr),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
|
@ -525,7 +476,7 @@ function recipient_map($_action, $_data = null, $attr = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'msg' => array('recipient_map_entry_deleted', htmlspecialchars($old_dest))
|
'msg' => array('recipient_map_entry_deleted', htmlspecialchars($old_dest))
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,119 +0,0 @@
|
||||||
<?php
|
|
||||||
function autoconfiguration($_action, $_type, $_data = null) {
|
|
||||||
global $pdo;
|
|
||||||
global $lang;
|
|
||||||
switch ($_action) {
|
|
||||||
case 'edit':
|
|
||||||
if (!isset($_SESSION['acl']['eas_autoconfig']) || $_SESSION['acl']['eas_autoconfig'] != "1" ) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_type, $_data),
|
|
||||||
'msg' => 'access_denied'
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
switch ($_type) {
|
|
||||||
case 'autodiscover':
|
|
||||||
$objects = (array)$_data['object'];
|
|
||||||
foreach ($objects as $object) {
|
|
||||||
if (is_valid_domain_name($object) && hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
|
|
||||||
$exclude_regex = (isset($_data['exclude_regex'])) ? $_data['exclude_regex'] : null;
|
|
||||||
$exclude_regex = (isset($_data['exclude_regex'])) ? $_data['exclude_regex'] : null;
|
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("SELECT COUNT(`domain`) AS `domain_c` FROM `autodiscover`
|
|
||||||
WHERE `domain` = :domain");
|
|
||||||
$stmt->execute(array(':domain' => $object));
|
|
||||||
$num_results = $stmt->fetchColumn();
|
|
||||||
if ($num_results > 0) {
|
|
||||||
$stmt = $pdo->prepare("SELECT COUNT(`domain`) AS `domain_c` FROM `autodiscover`
|
|
||||||
WHERE `domain` = :domain");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_type, $_data),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elseif (filter_var($object, FILTER_VALIDATE_EMAIL) === true && hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_type, $_data),
|
|
||||||
'msg' => array('domain_modified', htmlspecialchars(implode(', ', $objects)))
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'get':
|
|
||||||
switch ($_type) {
|
|
||||||
case 'autodiscover':
|
|
||||||
$autodiscover = array();
|
|
||||||
if (is_valid_domain_name($_data) && hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data)) {
|
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("SELECT * FROM `autodiscover`
|
|
||||||
WHERE `domain` = :domain");
|
|
||||||
$stmt->execute(array(':domain' => $_data));
|
|
||||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
while($row = array_shift($rows)) {
|
|
||||||
$autodiscover['mailbox'] = $row['mailbox'];
|
|
||||||
$autodiscover['domain'] = $row['domain'];
|
|
||||||
$autodiscover['service'] = $row['service'];
|
|
||||||
$autodiscover['exclude_regex'] = $row['exclude_regex'];
|
|
||||||
$autodiscover['created'] = $row['created'];
|
|
||||||
$autodiscover['modified'] = $row['modified'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_type, $_data),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elseif (filter_var($_data, FILTER_VALIDATE_EMAIL) === true && hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data)) {
|
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("SELECT * FROM `autodiscover`
|
|
||||||
WHERE `mailbox` = :mailbox");
|
|
||||||
$stmt->execute(array(':mailbox' => $_data));
|
|
||||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
while($row = array_shift($rows)) {
|
|
||||||
$autodiscover['mailbox'] = $row['mailbox'];
|
|
||||||
$autodiscover['domain'] = $row['domain'];
|
|
||||||
$autodiscover['service'] = $row['service'];
|
|
||||||
$autodiscover['exclude_regex'] = $row['exclude_regex'];
|
|
||||||
$autodiscover['created'] = $row['created'];
|
|
||||||
$autodiscover['modified'] = $row['modified'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_type, $_data),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $autodiscover;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'reset':
|
|
||||||
switch ($_type) {
|
|
||||||
case 'autodiscover':
|
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin" && $_SESSION['mailcow_cc_role'] != "domainadmin") {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,7 +5,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
switch ($_action) {
|
switch ($_action) {
|
||||||
case 'add':
|
case 'add':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -17,7 +17,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
if (in_array($_data['main_logo']['type'], array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/x-png', 'image/png', 'image/svg+xml'))) {
|
if (in_array($_data['main_logo']['type'], array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/x-png', 'image/png', 'image/svg+xml'))) {
|
||||||
try {
|
try {
|
||||||
if (file_exists($_data['main_logo']['tmp_name']) !== true) {
|
if (file_exists($_data['main_logo']['tmp_name']) !== true) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => 'img_tmp_missing'
|
'msg' => 'img_tmp_missing'
|
||||||
|
@ -26,7 +26,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
}
|
}
|
||||||
$image = new Imagick($_data['main_logo']['tmp_name']);
|
$image = new Imagick($_data['main_logo']['tmp_name']);
|
||||||
if ($image->valid() !== true) {
|
if ($image->valid() !== true) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => 'img_invalid'
|
'msg' => 'img_invalid'
|
||||||
|
@ -36,7 +36,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
$image->destroy();
|
$image->destroy();
|
||||||
}
|
}
|
||||||
catch (ImagickException $e) {
|
catch (ImagickException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => 'img_invalid'
|
'msg' => 'img_invalid'
|
||||||
|
@ -45,7 +45,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => 'invalid_mime_type'
|
'msg' => 'invalid_mime_type'
|
||||||
|
@ -56,14 +56,14 @@ function customize($_action, $_item, $_data = null) {
|
||||||
$redis->Set('MAIN_LOGO', 'data:' . $_data['main_logo']['type'] . ';base64,' . base64_encode(file_get_contents($_data['main_logo']['tmp_name'])));
|
$redis->Set('MAIN_LOGO', 'data:' . $_data['main_logo']['type'] . ';base64,' . base64_encode(file_get_contents($_data['main_logo']['tmp_name'])));
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => 'upload_success'
|
'msg' => 'upload_success'
|
||||||
|
@ -73,7 +73,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
break;
|
break;
|
||||||
case 'edit':
|
case 'edit':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -93,7 +93,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
$redis->set('APP_LINKS', json_encode($out));
|
$redis->set('APP_LINKS', json_encode($out));
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
@ -101,7 +101,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => 'app_links'
|
'msg' => 'app_links'
|
||||||
|
@ -119,14 +119,14 @@ function customize($_action, $_item, $_data = null) {
|
||||||
$redis->set('HELP_TEXT', $help_text);
|
$redis->set('HELP_TEXT', $help_text);
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => 'ui_texts'
|
'msg' => 'ui_texts'
|
||||||
|
@ -136,7 +136,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
break;
|
break;
|
||||||
case 'delete':
|
case 'delete':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -147,7 +147,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
case 'main_logo':
|
case 'main_logo':
|
||||||
try {
|
try {
|
||||||
if ($redis->del('MAIN_LOGO')) {
|
if ($redis->del('MAIN_LOGO')) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => 'reset_main_logo'
|
'msg' => 'reset_main_logo'
|
||||||
|
@ -156,7 +156,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
@ -173,7 +173,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
$app_links = json_decode($redis->get('APP_LINKS'), true);
|
$app_links = json_decode($redis->get('APP_LINKS'), true);
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
@ -187,7 +187,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
return $redis->get('MAIN_LOGO');
|
return $redis->get('MAIN_LOGO');
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
@ -204,7 +204,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
@ -222,7 +222,7 @@ function customize($_action, $_item, $_data = null) {
|
||||||
return $image->identifyImage();
|
return $image->identifyImage();
|
||||||
}
|
}
|
||||||
catch (ImagickException $e) {
|
catch (ImagickException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||||
'msg' => 'imagick_exception'
|
'msg' => 'imagick_exception'
|
||||||
|
|
|
@ -6,7 +6,7 @@ function dkim($_action, $_data = null) {
|
||||||
switch ($_action) {
|
switch ($_action) {
|
||||||
case 'add':
|
case 'add':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -17,7 +17,7 @@ function dkim($_action, $_data = null) {
|
||||||
$dkim_selector = (isset($_data['dkim_selector'])) ? $_data['dkim_selector'] : 'dkim';
|
$dkim_selector = (isset($_data['dkim_selector'])) ? $_data['dkim_selector'] : 'dkim';
|
||||||
$domain = $_data['domain'];
|
$domain = $_data['domain'];
|
||||||
if (!is_valid_domain_name($domain) || !is_numeric($key_length)) {
|
if (!is_valid_domain_name($domain) || !is_numeric($key_length)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'dkim_domain_or_sel_invalid'
|
'msg' => 'dkim_domain_or_sel_invalid'
|
||||||
|
@ -25,7 +25,7 @@ function dkim($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ($redis->hGet('DKIM_PUB_KEYS', $domain)) {
|
if ($redis->hGet('DKIM_PUB_KEYS', $domain)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'dkim_domain_or_sel_invalid'
|
'msg' => 'dkim_domain_or_sel_invalid'
|
||||||
|
@ -33,7 +33,7 @@ function dkim($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!ctype_alnum($dkim_selector)) {
|
if (!ctype_alnum($dkim_selector)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'dkim_domain_or_sel_invalid'
|
'msg' => 'dkim_domain_or_sel_invalid'
|
||||||
|
@ -58,7 +58,7 @@ function dkim($_action, $_data = null) {
|
||||||
$redis->hSet('DKIM_SELECTORS', $domain, $dkim_selector);
|
$redis->hSet('DKIM_SELECTORS', $domain, $dkim_selector);
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
@ -72,7 +72,7 @@ function dkim($_action, $_data = null) {
|
||||||
$redis->hSet('DKIM_PRIV_KEYS', $dkim_selector . '.' . $domain, trim($privKey));
|
$redis->hSet('DKIM_PRIV_KEYS', $dkim_selector . '.' . $domain, trim($privKey));
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
@ -80,7 +80,7 @@ function dkim($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'dkim_added'
|
'msg' => 'dkim_added'
|
||||||
|
@ -88,7 +88,7 @@ function dkim($_action, $_data = null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'dkim_domain_or_sel_invalid'
|
'msg' => 'dkim_domain_or_sel_invalid'
|
||||||
|
@ -98,7 +98,7 @@ function dkim($_action, $_data = null) {
|
||||||
break;
|
break;
|
||||||
case 'import':
|
case 'import':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -109,7 +109,7 @@ function dkim($_action, $_data = null) {
|
||||||
$private_key_normalized = preg_replace('~\r\n?~', "\n", $private_key_input);
|
$private_key_normalized = preg_replace('~\r\n?~', "\n", $private_key_input);
|
||||||
$private_key = openssl_pkey_get_private($private_key_normalized);
|
$private_key = openssl_pkey_get_private($private_key_normalized);
|
||||||
if ($ssl_error = openssl_error_string()) {
|
if ($ssl_error = openssl_error_string()) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => array('private_key_error', $ssl_error)
|
'msg' => array('private_key_error', $ssl_error)
|
||||||
|
@ -126,7 +126,7 @@ function dkim($_action, $_data = null) {
|
||||||
$dkim_selector = (isset($_data['dkim_selector'])) ? $_data['dkim_selector'] : 'dkim';
|
$dkim_selector = (isset($_data['dkim_selector'])) ? $_data['dkim_selector'] : 'dkim';
|
||||||
$domain = $_data['domain'];
|
$domain = $_data['domain'];
|
||||||
if (!is_valid_domain_name($domain)) {
|
if (!is_valid_domain_name($domain)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'dkim_domain_or_sel_invalid'
|
'msg' => 'dkim_domain_or_sel_invalid'
|
||||||
|
@ -134,7 +134,7 @@ function dkim($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ($redis->hGet('DKIM_PUB_KEYS', $domain)) {
|
if ($redis->hGet('DKIM_PUB_KEYS', $domain)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'dkim_domain_or_sel_invalid'
|
'msg' => 'dkim_domain_or_sel_invalid'
|
||||||
|
@ -142,7 +142,7 @@ function dkim($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!ctype_alnum($dkim_selector)) {
|
if (!ctype_alnum($dkim_selector)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'dkim_domain_or_sel_invalid'
|
'msg' => 'dkim_domain_or_sel_invalid'
|
||||||
|
@ -155,7 +155,7 @@ function dkim($_action, $_data = null) {
|
||||||
$redis->hSet('DKIM_PRIV_KEYS', $dkim_selector . '.' . $domain, $private_key_normalized);
|
$redis->hSet('DKIM_PRIV_KEYS', $dkim_selector . '.' . $domain, $private_key_normalized);
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
@ -168,14 +168,14 @@ function dkim($_action, $_data = null) {
|
||||||
try {
|
try {
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'dkim_added'
|
'msg' => 'dkim_added'
|
||||||
|
@ -215,7 +215,7 @@ function dkim($_action, $_data = null) {
|
||||||
break;
|
break;
|
||||||
case 'blind':
|
case 'blind':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -231,7 +231,7 @@ function dkim($_action, $_data = null) {
|
||||||
case 'delete':
|
case 'delete':
|
||||||
$domains = (array)$_data['domains'];
|
$domains = (array)$_data['domains'];
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -240,12 +240,12 @@ function dkim($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
foreach ($domains as $domain) {
|
foreach ($domains as $domain) {
|
||||||
if (!is_valid_domain_name($domain)) {
|
if (!is_valid_domain_name($domain)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => 'dkim_domain_or_sel_invalid'
|
'msg' => array('dkim_domain_or_sel_invalid', $domain)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
$selector = $redis->hGet('DKIM_SELECTORS', $domain);
|
$selector = $redis->hGet('DKIM_SELECTORS', $domain);
|
||||||
|
@ -254,19 +254,19 @@ function dkim($_action, $_data = null) {
|
||||||
$redis->hDel('DKIM_SELECTORS', $domain);
|
$redis->hDel('DKIM_SELECTORS', $domain);
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
|
'msg' => array('dkim_removed', htmlspecialchars($domain))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data),
|
|
||||||
'msg' => array('dkim_removed', htmlspecialchars(implode(', ', $domains)))
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -158,19 +158,19 @@ function docker($action, $service_name = null, $attr1 = null, $attr2 = null, $ex
|
||||||
if ($response === false) {
|
if ($response === false) {
|
||||||
$err = curl_error($curl);
|
$err = curl_error($curl);
|
||||||
curl_close($curl);
|
curl_close($curl);
|
||||||
logger(array('return' => array(
|
logger(array('return' => array(array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $action, $service_name, $attr1, $attr2, $extra_headers),
|
'log' => array(__FUNCTION__, $action, $service_name, $attr1, $attr2, $extra_headers),
|
||||||
'msg' => $err,
|
'msg' => $err,
|
||||||
)));
|
))));
|
||||||
return $err;
|
return $err;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
curl_close($curl);
|
curl_close($curl);
|
||||||
logger(array('return' => array(
|
logger(array('return' => array(array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $action, $service_name, $attr1, $attr2, $extra_headers),
|
'log' => array(__FUNCTION__, $action, $service_name, $attr1, $attr2, $extra_headers),
|
||||||
)));
|
))));
|
||||||
if (empty($response)) {
|
if (empty($response)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
$domains = (array)$_data['domains'];
|
$domains = (array)$_data['domains'];
|
||||||
$active = intval($_data['active']);
|
$active = intval($_data['active']);
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -22,7 +22,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (empty($domains)) {
|
if (empty($domains)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'domain_invalid'
|
'msg' => 'domain_invalid'
|
||||||
|
@ -30,40 +30,32 @@ function domain_admin($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username)) || empty ($username)) {
|
if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username)) || empty ($username)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'username_invalid'
|
'msg' => 'username_invalid'
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("SELECT `username` FROM `mailbox`
|
|
||||||
WHERE `username` = :username");
|
|
||||||
$stmt->execute(array(':username' => $username));
|
|
||||||
$num_results[] = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
|
||||||
|
|
||||||
$stmt = $pdo->prepare("SELECT `username` FROM `admin`
|
$stmt = $pdo->prepare("SELECT `username` FROM `mailbox`
|
||||||
WHERE `username` = :username");
|
WHERE `username` = :username");
|
||||||
$stmt->execute(array(':username' => $username));
|
$stmt->execute(array(':username' => $username));
|
||||||
$num_results[] = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
$num_results[] = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare("SELECT `username` FROM `admin`
|
||||||
|
WHERE `username` = :username");
|
||||||
|
$stmt->execute(array(':username' => $username));
|
||||||
|
$num_results[] = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare("SELECT `username` FROM `domain_admins`
|
||||||
|
WHERE `username` = :username");
|
||||||
|
$stmt->execute(array(':username' => $username));
|
||||||
|
$num_results[] = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
|
|
||||||
$stmt = $pdo->prepare("SELECT `username` FROM `domain_admins`
|
|
||||||
WHERE `username` = :username");
|
|
||||||
$stmt->execute(array(':username' => $username));
|
|
||||||
$num_results[] = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
foreach ($num_results as $num_results_each) {
|
foreach ($num_results as $num_results_each) {
|
||||||
if ($num_results_each != 0) {
|
if ($num_results_each != 0) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('object_exists', htmlspecialchars($username))
|
'msg' => array('object_exists', htmlspecialchars($username))
|
||||||
|
@ -73,7 +65,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
if (!empty($password) && !empty($password2)) {
|
if (!empty($password) && !empty($password2)) {
|
||||||
if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
|
if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'password_complexity'
|
'msg' => 'password_complexity'
|
||||||
|
@ -81,7 +73,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ($password != $password2) {
|
if ($password != $password2) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'password_mismatch'
|
'msg' => 'password_mismatch'
|
||||||
|
@ -91,7 +83,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
$password_hashed = hash_password($password);
|
$password_hashed = hash_password($password);
|
||||||
foreach ($domains as $domain) {
|
foreach ($domains as $domain) {
|
||||||
if (!is_valid_domain_name($domain)) {
|
if (!is_valid_domain_name($domain)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'domain_invalid'
|
'msg' => 'domain_invalid'
|
||||||
|
@ -110,7 +102,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
domain_admin('delete', $username);
|
domain_admin('delete', $username);
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
|
@ -128,7 +120,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
|
@ -137,14 +129,14 @@ function domain_admin($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'password_empty'
|
'msg' => 'password_empty'
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('domain_admin_added', htmlspecialchars($username))
|
'msg' => array('domain_admin_added', htmlspecialchars($username))
|
||||||
|
@ -152,7 +144,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
break;
|
break;
|
||||||
case 'edit':
|
case 'edit':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin" && $_SESSION['mailcow_cc_role'] != "domainadmin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin" && $_SESSION['mailcow_cc_role'] != "domainadmin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -177,44 +169,44 @@ function domain_admin($_action, $_data = null) {
|
||||||
$username_new = (!empty($_data['username_new'])) ? $_data['username_new'] : $is_now['username'];
|
$username_new = (!empty($_data['username_new'])) ? $_data['username_new'] : $is_now['username'];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
$password = $_data['password'];
|
$password = $_data['password'];
|
||||||
$password2 = $_data['password2'];
|
$password2 = $_data['password2'];
|
||||||
|
|
||||||
if (!empty($domains)) {
|
if (!empty($domains)) {
|
||||||
foreach ($domains as $domain) {
|
foreach ($domains as $i => &$domain) {
|
||||||
if (!is_valid_domain_name($domain)) {
|
if (!is_valid_domain_name($domain)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'domain_invalid'
|
'msg' => array('domain_invalid', htmlspecialchars($domain))
|
||||||
);
|
);
|
||||||
return false;
|
unset($domains[$i]);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username_new))) {
|
if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username_new))) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'username_invalid'
|
'msg' => array('username_invalid', $username_new)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
if ($username_new != $username) {
|
if ($username_new != $username) {
|
||||||
if (!empty(domain_admin('details', $username_new)['username'])) {
|
if (!empty(domain_admin('details', $username_new)['username'])) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'username_invalid'
|
'msg' => array('username_invalid', $username_new)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -224,12 +216,12 @@ function domain_admin($_action, $_data = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($domains)) {
|
if (!empty($domains)) {
|
||||||
|
@ -245,32 +237,32 @@ function domain_admin($_action, $_data = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($password) && !empty($password2)) {
|
if (!empty($password) && !empty($password2)) {
|
||||||
if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
|
if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'password_complexity'
|
'msg' => 'password_complexity'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
if ($password != $password2) {
|
if ($password != $password2) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'password_mismatch'
|
'msg' => 'password_mismatch'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
$password_hashed = hash_password($password);
|
$password_hashed = hash_password($password);
|
||||||
try {
|
try {
|
||||||
|
@ -291,12 +283,12 @@ function domain_admin($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -317,20 +309,21 @@ function domain_admin($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => array('domain_admin_modified', htmlspecialchars($username))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
return true;
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('domain_admin_modified', htmlspecialchars(implode(', ', $usernames)))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
// Domain administrator
|
// Domain administrator
|
||||||
// Can only edit itself
|
// Can only edit itself
|
||||||
|
@ -344,8 +337,9 @@ function domain_admin($_action, $_data = null) {
|
||||||
WHERE `username` = :user");
|
WHERE `username` = :user");
|
||||||
$stmt->execute(array(':user' => $username));
|
$stmt->execute(array(':user' => $username));
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
if (!verify_hash($row['password'], $password_old)) {
|
if (!verify_hash($row['password'], $password_old)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -355,7 +349,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
|
|
||||||
if (!empty($password_new2) && !empty($password_new)) {
|
if (!empty($password_new2) && !empty($password_new)) {
|
||||||
if ($password_new2 != $password_new) {
|
if ($password_new2 != $password_new) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'password_mismatch'
|
'msg' => 'password_mismatch'
|
||||||
|
@ -363,7 +357,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password_new)) {
|
if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password_new)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'password_complexity'
|
'msg' => 'password_complexity'
|
||||||
|
@ -379,7 +373,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
|
@ -387,8 +381,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('domain_admin_modified', htmlspecialchars($username))
|
'msg' => array('domain_admin_modified', htmlspecialchars($username))
|
||||||
|
@ -397,7 +390,7 @@ function domain_admin($_action, $_data = null) {
|
||||||
break;
|
break;
|
||||||
case 'delete':
|
case 'delete':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -407,12 +400,12 @@ function domain_admin($_action, $_data = null) {
|
||||||
$usernames = (array)$_data['username'];
|
$usernames = (array)$_data['username'];
|
||||||
foreach ($usernames as $username) {
|
foreach ($usernames as $username) {
|
||||||
if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username))) {
|
if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username))) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'username_invalid'
|
'msg' => array('username_invalid', $username)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
$stmt = $pdo->prepare("DELETE FROM `domain_admins` WHERE `username` = :username");
|
$stmt = $pdo->prepare("DELETE FROM `domain_admins` WHERE `username` = :username");
|
||||||
|
@ -425,50 +418,43 @@ function domain_admin($_action, $_data = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => array('domain_admin_removed', htmlspecialchars($username))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('domain_admin_removed', htmlspecialchars(implode(', ', $usernames)))
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case 'get':
|
case 'get':
|
||||||
$domainadmins = array();
|
$domainadmins = array();
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
$stmt = $pdo->query("SELECT DISTINCT
|
$stmt = $pdo->query("SELECT DISTINCT
|
||||||
`username`
|
`username`
|
||||||
FROM `domain_admins`
|
FROM `domain_admins`
|
||||||
WHERE `username` IN (
|
WHERE `username` IN (
|
||||||
SELECT `username` FROM `admin`
|
SELECT `username` FROM `admin`
|
||||||
WHERE `superadmin`!='1'
|
WHERE `superadmin`!='1'
|
||||||
)");
|
)");
|
||||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
while ($row = array_shift($rows)) {
|
while ($row = array_shift($rows)) {
|
||||||
$domainadmins[] = $row['username'];
|
$domainadmins[] = $row['username'];
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $domainadmins;
|
return $domainadmins;
|
||||||
break;
|
break;
|
||||||
case 'details':
|
case 'details':
|
||||||
|
@ -484,61 +470,54 @@ function domain_admin($_action, $_data = null) {
|
||||||
if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $_data))) {
|
if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $_data))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("SELECT
|
$stmt = $pdo->prepare("SELECT
|
||||||
`tfa`.`active` AS `tfa_active_int`,
|
`tfa`.`active` AS `tfa_active_int`,
|
||||||
CASE `tfa`.`active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `tfa_active`,
|
CASE `tfa`.`active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `tfa_active`,
|
||||||
`domain_admins`.`username`,
|
`domain_admins`.`username`,
|
||||||
`domain_admins`.`created`,
|
`domain_admins`.`created`,
|
||||||
`domain_admins`.`active` AS `active_int`,
|
`domain_admins`.`active` AS `active_int`,
|
||||||
CASE `domain_admins`.`active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`
|
CASE `domain_admins`.`active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`
|
||||||
FROM `domain_admins`
|
FROM `domain_admins`
|
||||||
LEFT OUTER JOIN `tfa` ON `tfa`.`username`=`domain_admins`.`username`
|
LEFT OUTER JOIN `tfa` ON `tfa`.`username`=`domain_admins`.`username`
|
||||||
WHERE `domain_admins`.`username`= :domain_admin");
|
WHERE `domain_admins`.`username`= :domain_admin");
|
||||||
$stmt->execute(array(
|
$stmt->execute(array(
|
||||||
':domain_admin' => $_data
|
':domain_admin' => $_data
|
||||||
));
|
));
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
if (empty($row)) {
|
if (empty($row)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
$domainadmindata['username'] = $row['username'];
|
|
||||||
$domainadmindata['tfa_active'] = $row['tfa_active'];
|
|
||||||
$domainadmindata['active'] = $row['active'];
|
|
||||||
$domainadmindata['tfa_active_int'] = $row['tfa_active_int'];
|
|
||||||
$domainadmindata['active_int'] = $row['active_int'];
|
|
||||||
$domainadmindata['modified'] = $row['created'];
|
|
||||||
// GET SELECTED
|
|
||||||
$stmt = $pdo->prepare("SELECT `domain` FROM `domain`
|
|
||||||
WHERE `domain` IN (
|
|
||||||
SELECT `domain` FROM `domain_admins`
|
|
||||||
WHERE `username`= :domain_admin)");
|
|
||||||
$stmt->execute(array(':domain_admin' => $_data));
|
|
||||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
while($row = array_shift($rows)) {
|
|
||||||
$domainadmindata['selected_domains'][] = $row['domain'];
|
|
||||||
}
|
|
||||||
// GET UNSELECTED
|
|
||||||
$stmt = $pdo->prepare("SELECT `domain` FROM `domain`
|
|
||||||
WHERE `domain` NOT IN (
|
|
||||||
SELECT `domain` FROM `domain_admins`
|
|
||||||
WHERE `username`= :domain_admin)");
|
|
||||||
$stmt->execute(array(':domain_admin' => $_data));
|
|
||||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
while($row = array_shift($rows)) {
|
|
||||||
$domainadmindata['unselected_domains'][] = $row['domain'];
|
|
||||||
}
|
|
||||||
if (!isset($domainadmindata['unselected_domains'])) {
|
|
||||||
$domainadmindata['unselected_domains'] = "";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch(PDOException $e) {
|
$domainadmindata['username'] = $row['username'];
|
||||||
$_SESSION['return'] = array(
|
$domainadmindata['tfa_active'] = $row['tfa_active'];
|
||||||
'type' => 'danger',
|
$domainadmindata['active'] = $row['active'];
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
$domainadmindata['tfa_active_int'] = $row['tfa_active_int'];
|
||||||
'msg' => array('mysql_error', $e)
|
$domainadmindata['active_int'] = $row['active_int'];
|
||||||
);
|
$domainadmindata['modified'] = $row['created'];
|
||||||
|
// GET SELECTED
|
||||||
|
$stmt = $pdo->prepare("SELECT `domain` FROM `domain`
|
||||||
|
WHERE `domain` IN (
|
||||||
|
SELECT `domain` FROM `domain_admins`
|
||||||
|
WHERE `username`= :domain_admin)");
|
||||||
|
$stmt->execute(array(':domain_admin' => $_data));
|
||||||
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
while($row = array_shift($rows)) {
|
||||||
|
$domainadmindata['selected_domains'][] = $row['domain'];
|
||||||
}
|
}
|
||||||
|
// GET UNSELECTED
|
||||||
|
$stmt = $pdo->prepare("SELECT `domain` FROM `domain`
|
||||||
|
WHERE `domain` NOT IN (
|
||||||
|
SELECT `domain` FROM `domain_admins`
|
||||||
|
WHERE `username`= :domain_admin)");
|
||||||
|
$stmt->execute(array(':domain_admin' => $_data));
|
||||||
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
while($row = array_shift($rows)) {
|
||||||
|
$domainadmindata['unselected_domains'][] = $row['domain'];
|
||||||
|
}
|
||||||
|
if (!isset($domainadmindata['unselected_domains'])) {
|
||||||
|
$domainadmindata['unselected_domains'] = "";
|
||||||
|
}
|
||||||
|
|
||||||
return $domainadmindata;
|
return $domainadmindata;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ function fail2ban($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
@ -91,7 +91,7 @@ function fail2ban($_action, $_data = null) {
|
||||||
break;
|
break;
|
||||||
case 'edit':
|
case 'edit':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -101,29 +101,39 @@ function fail2ban($_action, $_data = null) {
|
||||||
if (isset($_data['action']) && !empty($_data['network'])) {
|
if (isset($_data['action']) && !empty($_data['network'])) {
|
||||||
$networks = (array) $_data['network'];
|
$networks = (array) $_data['network'];
|
||||||
foreach ($networks as $network) {
|
foreach ($networks as $network) {
|
||||||
if ($_data['action'] == "unban") {
|
try {
|
||||||
if (valid_network($network)) {
|
if ($_data['action'] == "unban") {
|
||||||
$redis->hSet('F2B_QUEUE_UNBAN', $network, 1);
|
if (valid_network($network)) {
|
||||||
|
$redis->hSet('F2B_QUEUE_UNBAN', $network, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif ($_data['action'] == "whitelist") {
|
||||||
|
if (valid_network($network)) {
|
||||||
|
$redis->hSet('F2B_WHITELIST', $network, 1);
|
||||||
|
$redis->hDel('F2B_BLACKLIST', $network, 1);
|
||||||
|
$redis->hSet('F2B_QUEUE_UNBAN', $network, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif ($_data['action'] == "blacklist") {
|
||||||
|
if (valid_network($network)) {
|
||||||
|
$redis->hSet('F2B_BLACKLIST', $network, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elseif ($_data['action'] == "whitelist") {
|
catch (RedisException $e) {
|
||||||
if (valid_network($network)) {
|
$_SESSION['return'][] = array(
|
||||||
$redis->hSet('F2B_WHITELIST', $network, 1);
|
'type' => 'danger',
|
||||||
$redis->hDel('F2B_BLACKLIST', $network, 1);
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
$redis->hSet('F2B_QUEUE_UNBAN', $network, 1);
|
'msg' => array('redis_error', $e)
|
||||||
}
|
);
|
||||||
}
|
continue;
|
||||||
elseif ($_data['action'] == "blacklist") {
|
|
||||||
if (valid_network($network)) {
|
|
||||||
$redis->hSet('F2B_BLACKLIST', $network, 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => array('object_modified', htmlspecialchars($network))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('object_modified', htmlspecialchars(implode(', ', $networks)))
|
|
||||||
);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
$is_now = fail2ban('get');
|
$is_now = fail2ban('get');
|
||||||
|
@ -137,7 +147,7 @@ function fail2ban($_action, $_data = null) {
|
||||||
$bl = (isset($_data['blacklist'])) ? $_data['blacklist'] : $is_now['blacklist'];
|
$bl = (isset($_data['blacklist'])) ? $_data['blacklist'] : $is_now['blacklist'];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -178,14 +188,14 @@ function fail2ban($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'f2b_modified'
|
'msg' => 'f2b_modified'
|
||||||
|
|
|
@ -8,7 +8,7 @@ function fwdhost($_action, $_data = null) {
|
||||||
case 'add':
|
case 'add':
|
||||||
global $lang;
|
global $lang;
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -28,7 +28,7 @@ function fwdhost($_action, $_data = null) {
|
||||||
$hosts = get_outgoing_hosts_best_guess($host);
|
$hosts = get_outgoing_hosts_best_guess($host);
|
||||||
}
|
}
|
||||||
if (empty($hosts)) {
|
if (empty($hosts)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('invalid_host', htmlspecialchars($host))
|
'msg' => array('invalid_host', htmlspecialchars($host))
|
||||||
|
@ -46,7 +46,7 @@ function fwdhost($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
@ -54,7 +54,7 @@ function fwdhost($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('forwarding_host_added', htmlspecialchars(implode(', ', $hosts)))
|
'msg' => array('forwarding_host_added', htmlspecialchars(implode(', ', $hosts)))
|
||||||
|
@ -63,7 +63,7 @@ function fwdhost($_action, $_data = null) {
|
||||||
case 'edit':
|
case 'edit':
|
||||||
global $lang;
|
global $lang;
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -77,12 +77,12 @@ function fwdhost($_action, $_data = null) {
|
||||||
$keep_spam = (isset($_data['keep_spam'])) ? $_data['keep_spam'] : $is_now['keep_spam'];
|
$keep_spam = (isset($_data['keep_spam'])) ? $_data['keep_spam'] : $is_now['keep_spam'];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if ($keep_spam == 1) {
|
if ($keep_spam == 1) {
|
||||||
|
@ -93,19 +93,19 @@ function fwdhost($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => array('object_modified', htmlspecialchars($fwdhost))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('object_modified', htmlspecialchars(implode(', ', $fwdhosts)))
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case 'delete':
|
case 'delete':
|
||||||
$hosts = (array)$_data['forwardinghost'];
|
$hosts = (array)$_data['forwardinghost'];
|
||||||
|
@ -115,19 +115,19 @@ function fwdhost($_action, $_data = null) {
|
||||||
$redis->hDel('KEEP_SPAM', $host);
|
$redis->hDel('KEEP_SPAM', $host);
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => array('forwarding_host_removed', htmlspecialchars($host))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('forwarding_host_removed', htmlspecialchars(implode(', ', $hosts)))
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case 'get':
|
case 'get':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
|
@ -148,7 +148,7 @@ function fwdhost($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
@ -170,7 +170,7 @@ function fwdhost($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
|
|
@ -5,64 +5,81 @@ function hash_password($password) {
|
||||||
}
|
}
|
||||||
function last_login($user) {
|
function last_login($user) {
|
||||||
global $pdo;
|
global $pdo;
|
||||||
try {
|
$stmt = $pdo->prepare('SELECT `remote`, `time` FROM `logs`
|
||||||
$stmt = $pdo->prepare('SELECT `remote`, `time` FROM `logs`
|
WHERE JSON_EXTRACT(`call`, "$[0]") = "check_login"
|
||||||
WHERE JSON_EXTRACT(`call`, "$[0]") = "check_login"
|
AND JSON_EXTRACT(`call`, "$[1]") = :user
|
||||||
AND JSON_EXTRACT(`call`, "$[1]") = :user
|
AND `type` = "success" ORDER BY `time` DESC LIMIT 1');
|
||||||
AND `type` = "success" ORDER BY `time` DESC LIMIT 1');
|
$stmt->execute(array(':user' => $user));
|
||||||
$stmt->execute(array(':user' => $user));
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
if (!empty($row)) {
|
||||||
if (!empty($row)) {
|
return $row;
|
||||||
return $row;
|
}
|
||||||
}
|
else {
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $username, $role, $domain),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function logger($_data = false) {
|
function logger($_data = false) {
|
||||||
|
/*
|
||||||
|
logger() will be called as last function
|
||||||
|
To manually log a message, logger needs to be called like below.
|
||||||
|
|
||||||
|
logger(array(
|
||||||
|
'return' => array(
|
||||||
|
array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__),
|
||||||
|
'msg' => $err
|
||||||
|
)
|
||||||
|
)
|
||||||
|
));
|
||||||
|
|
||||||
|
These messages will not be printed as alert box.
|
||||||
|
To do so, push them to $_SESSION['return'] and do not call logger as they will be included automatically:
|
||||||
|
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__, $user, '*'),
|
||||||
|
'msg' => $err
|
||||||
|
);
|
||||||
|
*/
|
||||||
global $pdo;
|
global $pdo;
|
||||||
if (!$_data) {
|
if (!$_data) {
|
||||||
$_data = $_SESSION;
|
$_data = $_SESSION;
|
||||||
}
|
}
|
||||||
if (!empty($_data['return'])) {
|
if (!empty($_data['return'])) {
|
||||||
$type = $_data['return']['type'];
|
$task = substr(strtoupper(md5(uniqid(rand(), true))), 0, 6);
|
||||||
$msg = json_encode($_data['return']['msg'], JSON_UNESCAPED_UNICODE);
|
foreach ($_data['return'] as $return) {
|
||||||
$call = json_encode($_data['return']['log'], JSON_UNESCAPED_UNICODE);
|
$type = $return['type'];
|
||||||
if (!empty($_SESSION["dual-login"]["username"])) {
|
$msg = json_encode($return['msg'], JSON_UNESCAPED_UNICODE);
|
||||||
$user = $_SESSION["dual-login"]["username"] . ' => ' . $_SESSION['mailcow_cc_username'];
|
$call = json_encode($return['log'], JSON_UNESCAPED_UNICODE);
|
||||||
$role = $_SESSION["dual-login"]["role"] . ' => ' . $_SESSION['mailcow_cc_role'];
|
if (!empty($_SESSION["dual-login"]["username"])) {
|
||||||
}
|
$user = $_SESSION["dual-login"]["username"] . ' => ' . $_SESSION['mailcow_cc_username'];
|
||||||
elseif (!empty($_SESSION['mailcow_cc_username'])) {
|
$role = $_SESSION["dual-login"]["role"] . ' => ' . $_SESSION['mailcow_cc_role'];
|
||||||
$user = $_SESSION['mailcow_cc_username'];
|
}
|
||||||
$role = $_SESSION['mailcow_cc_role'];
|
elseif (!empty($_SESSION['mailcow_cc_username'])) {
|
||||||
}
|
$user = $_SESSION['mailcow_cc_username'];
|
||||||
else {
|
$role = $_SESSION['mailcow_cc_role'];
|
||||||
$user = 'unauthenticated';
|
}
|
||||||
$role = 'unauthenticated';
|
else {
|
||||||
|
$user = 'unauthenticated';
|
||||||
|
$role = 'unauthenticated';
|
||||||
|
}
|
||||||
|
$stmt = $pdo->prepare("INSERT INTO `logs` (`type`, `task`, `msg`, `call`, `user`, `role`, `remote`, `time`) VALUES
|
||||||
|
(:type, :task, :msg, :call, :user, :role, :remote, UNIX_TIMESTAMP())");
|
||||||
|
$stmt->execute(array(
|
||||||
|
':type' => $type,
|
||||||
|
':task' => $task,
|
||||||
|
':call' => $call,
|
||||||
|
':msg' => $msg,
|
||||||
|
':user' => $user,
|
||||||
|
':role' => $role,
|
||||||
|
':remote' => get_remote_ip()
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
$stmt = $pdo->prepare("INSERT INTO `logs` (`type`, `msg`, `call`, `user`, `role`, `remote`, `time`) VALUES
|
|
||||||
(:type, :msg, :call, :user, :role, :remote, UNIX_TIMESTAMP())");
|
|
||||||
$stmt->execute(array(
|
|
||||||
':type' => $type,
|
|
||||||
':call' => $call,
|
|
||||||
':msg' => $msg,
|
|
||||||
':user' => $user,
|
|
||||||
':role' => $role,
|
|
||||||
':remote' => get_remote_ip()
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
function hasDomainAccess($username, $role, $domain) {
|
function hasDomainAccess($username, $role, $domain) {
|
||||||
global $pdo;
|
global $pdo;
|
||||||
|
@ -75,25 +92,15 @@ function hasDomainAccess($username, $role, $domain) {
|
||||||
if ($role != 'admin' && $role != 'domainadmin' && $role != 'user') {
|
if ($role != 'admin' && $role != 'domainadmin' && $role != 'user') {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
$stmt = $pdo->prepare("SELECT `domain` FROM `domain_admins`
|
||||||
$stmt = $pdo->prepare("SELECT `domain` FROM `domain_admins`
|
WHERE (
|
||||||
WHERE (
|
`active`='1'
|
||||||
`active`='1'
|
AND `username` = :username
|
||||||
AND `username` = :username
|
AND (`domain` = :domain1 OR `domain` = (SELECT `target_domain` FROM `alias_domain` WHERE `alias_domain` = :domain2))
|
||||||
AND (`domain` = :domain1 OR `domain` = (SELECT `target_domain` FROM `alias_domain` WHERE `alias_domain` = :domain2))
|
)
|
||||||
)
|
OR 'admin' = :role");
|
||||||
OR 'admin' = :role");
|
$stmt->execute(array(':username' => $username, ':domain1' => $domain, ':domain2' => $domain, ':role' => $role));
|
||||||
$stmt->execute(array(':username' => $username, ':domain1' => $domain, ':domain2' => $domain, ':role' => $role));
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $username, $role, $domain),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!empty($num_results)) {
|
if (!empty($num_results)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -110,18 +117,12 @@ function hasMailboxObjectAccess($username, $role, $object) {
|
||||||
if ($username == $object) {
|
if ($username == $object) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
try {
|
$stmt = $pdo->prepare("SELECT `domain` FROM `mailbox` WHERE `username` = :object");
|
||||||
$stmt = $pdo->prepare("SELECT `domain` FROM `mailbox` WHERE `username` = :object");
|
$stmt->execute(array(':object' => $object));
|
||||||
$stmt->execute(array(':object' => $object));
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
if (isset($row['domain']) && hasDomainAccess($username, $role, $row['domain'])) {
|
||||||
if (isset($row['domain']) && hasDomainAccess($username, $role, $row['domain'])) {
|
return true;
|
||||||
return true;
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
error_log($e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
function pem_to_der($pem_key) {
|
function pem_to_der($pem_key) {
|
||||||
|
@ -193,25 +194,30 @@ function generate_tlsa_digest($hostname, $port, $starttls = null) {
|
||||||
function alertbox_log_parser($_data){
|
function alertbox_log_parser($_data){
|
||||||
global $lang;
|
global $lang;
|
||||||
if (isset($_data['return'])) {
|
if (isset($_data['return'])) {
|
||||||
// Get type
|
foreach ($_data['return'] as $return) {
|
||||||
$type = $_data['return']['type'];
|
// Get type
|
||||||
// If a lang[type][msg] string exists, use it as message
|
$type = $return['type'];
|
||||||
if (is_string($lang[$_data['return']['type']][$_data['return']['msg']])) {
|
// If a lang[type][msg] string exists, use it as message
|
||||||
$msg = $lang[$_data['return']['type']][$_data['return']['msg']];
|
if (is_string($lang[$return['type']][$return['msg']])) {
|
||||||
|
$msg = $lang[$return['type']][$return['msg']];
|
||||||
|
}
|
||||||
|
// If msg is an array, use first element as language string and run printf on it with remaining array elements
|
||||||
|
elseif (is_array($return['msg'])) {
|
||||||
|
$msg = array_shift($return['msg']);
|
||||||
|
$msg = vsprintf(
|
||||||
|
$lang[$return['type']][$msg],
|
||||||
|
$return['msg']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// If none applies, use msg as returned message
|
||||||
|
else {
|
||||||
|
$msg = $return['msg'];
|
||||||
|
}
|
||||||
|
$log_array[] = array('msg' => json_encode($msg), 'type' => json_encode($type));
|
||||||
}
|
}
|
||||||
// If msg is an array, use first element as language string and run printf on it with remaining array elements
|
if (!empty($log_array)) {
|
||||||
elseif (is_array($_data['return']['msg'])) {
|
return $log_array;
|
||||||
$msg = array_shift($_data['return']['msg']);
|
|
||||||
$msg = vsprintf(
|
|
||||||
$lang[$_data['return']['type']][$msg],
|
|
||||||
$_data['return']['msg']
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
// If none applies, use msg as returned message
|
|
||||||
else {
|
|
||||||
$msg = $_data['return']['msg'];
|
|
||||||
}
|
|
||||||
return array('msg' => json_encode($msg), 'type' => json_encode($type));
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -260,7 +266,7 @@ function check_login($user, $pass) {
|
||||||
global $pdo;
|
global $pdo;
|
||||||
global $redis;
|
global $redis;
|
||||||
if (!filter_var($user, FILTER_VALIDATE_EMAIL) && !ctype_alnum(str_replace(array('_', '.', '-'), '', $user))) {
|
if (!filter_var($user, FILTER_VALIDATE_EMAIL) && !ctype_alnum(str_replace(array('_', '.', '-'), '', $user))) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $user, '*'),
|
'log' => array(__FUNCTION__, $user, '*'),
|
||||||
'msg' => 'malformed_username'
|
'msg' => 'malformed_username'
|
||||||
|
@ -280,7 +286,7 @@ function check_login($user, $pass) {
|
||||||
$_SESSION['pending_mailcow_cc_role'] = "admin";
|
$_SESSION['pending_mailcow_cc_role'] = "admin";
|
||||||
$_SESSION['pending_tfa_method'] = get_tfa($user)['name'];
|
$_SESSION['pending_tfa_method'] = get_tfa($user)['name'];
|
||||||
unset($_SESSION['ldelay']);
|
unset($_SESSION['ldelay']);
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'info',
|
'type' => 'info',
|
||||||
'log' => array(__FUNCTION__, $user, '*'),
|
'log' => array(__FUNCTION__, $user, '*'),
|
||||||
'msg' => 'awaiting_tfa_confirmation'
|
'msg' => 'awaiting_tfa_confirmation'
|
||||||
|
@ -289,7 +295,7 @@ function check_login($user, $pass) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
unset($_SESSION['ldelay']);
|
unset($_SESSION['ldelay']);
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $user, '*'),
|
'log' => array(__FUNCTION__, $user, '*'),
|
||||||
'msg' => array('logged_in_as', $user)
|
'msg' => array('logged_in_as', $user)
|
||||||
|
@ -311,7 +317,7 @@ function check_login($user, $pass) {
|
||||||
$_SESSION['pending_mailcow_cc_role'] = "domainadmin";
|
$_SESSION['pending_mailcow_cc_role'] = "domainadmin";
|
||||||
$_SESSION['pending_tfa_method'] = get_tfa($user)['name'];
|
$_SESSION['pending_tfa_method'] = get_tfa($user)['name'];
|
||||||
unset($_SESSION['ldelay']);
|
unset($_SESSION['ldelay']);
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'info',
|
'type' => 'info',
|
||||||
'log' => array(__FUNCTION__, $user, '*'),
|
'log' => array(__FUNCTION__, $user, '*'),
|
||||||
'msg' => 'awaiting_tfa_confirmation'
|
'msg' => 'awaiting_tfa_confirmation'
|
||||||
|
@ -323,7 +329,7 @@ function check_login($user, $pass) {
|
||||||
// Reactivate TFA if it was set to "deactivate TFA for next login"
|
// Reactivate TFA if it was set to "deactivate TFA for next login"
|
||||||
$stmt = $pdo->prepare("UPDATE `tfa` SET `active`='1' WHERE `username` = :user");
|
$stmt = $pdo->prepare("UPDATE `tfa` SET `active`='1' WHERE `username` = :user");
|
||||||
$stmt->execute(array(':user' => $user));
|
$stmt->execute(array(':user' => $user));
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $user, '*'),
|
'log' => array(__FUNCTION__, $user, '*'),
|
||||||
'msg' => array('logged_in_as', $user)
|
'msg' => array('logged_in_as', $user)
|
||||||
|
@ -341,7 +347,7 @@ function check_login($user, $pass) {
|
||||||
foreach ($rows as $row) {
|
foreach ($rows as $row) {
|
||||||
if (verify_hash($row['password'], $pass) !== false) {
|
if (verify_hash($row['password'], $pass) !== false) {
|
||||||
unset($_SESSION['ldelay']);
|
unset($_SESSION['ldelay']);
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $user, '*'),
|
'log' => array(__FUNCTION__, $user, '*'),
|
||||||
'msg' => array('logged_in_as', $user)
|
'msg' => array('logged_in_as', $user)
|
||||||
|
@ -359,7 +365,7 @@ function check_login($user, $pass) {
|
||||||
$redis->publish("F2B_CHANNEL", "mailcow UI: Invalid password for " . $user . " by " . $_SERVER['REMOTE_ADDR']);
|
$redis->publish("F2B_CHANNEL", "mailcow UI: Invalid password for " . $user . " by " . $_SERVER['REMOTE_ADDR']);
|
||||||
error_log("mailcow UI: Invalid password for " . $user . " by " . $_SERVER['REMOTE_ADDR']);
|
error_log("mailcow UI: Invalid password for " . $user . " by " . $_SERVER['REMOTE_ADDR']);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $user, '*'),
|
'log' => array(__FUNCTION__, $user, '*'),
|
||||||
'msg' => 'login_failed'
|
'msg' => 'login_failed'
|
||||||
|
@ -390,7 +396,7 @@ function set_acl() {
|
||||||
$_SESSION = array_merge($_SESSION, $acl);
|
$_SESSION = array_merge($_SESSION, $acl);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'info',
|
'type' => 'info',
|
||||||
'log' => array(__FUNCTION__),
|
'log' => array(__FUNCTION__),
|
||||||
'msg' => 'set_acl_failed'
|
'msg' => 'set_acl_failed'
|
||||||
|
@ -433,7 +439,7 @@ function edit_admin_account($_data) {
|
||||||
!isset($_data_log['admin_pass']) ?: $_data_log['admin_pass'] = '*';
|
!isset($_data_log['admin_pass']) ?: $_data_log['admin_pass'] = '*';
|
||||||
!isset($_data_log['admin_pass2']) ?: $_data_log['admin_pass2'] = '*';
|
!isset($_data_log['admin_pass2']) ?: $_data_log['admin_pass2'] = '*';
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -445,7 +451,7 @@ function edit_admin_account($_data) {
|
||||||
$password = $_data['admin_pass'];
|
$password = $_data['admin_pass'];
|
||||||
$password2 = $_data['admin_pass2'];
|
$password2 = $_data['admin_pass2'];
|
||||||
if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username)) || empty ($username)) {
|
if (!ctype_alnum(str_replace(array('_', '.', '-'), '', $username)) || empty ($username)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'username_invalid'
|
'msg' => 'username_invalid'
|
||||||
|
@ -454,7 +460,7 @@ function edit_admin_account($_data) {
|
||||||
}
|
}
|
||||||
if (!empty($password) && !empty($password2)) {
|
if (!empty($password) && !empty($password2)) {
|
||||||
if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
|
if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'password_complexity'
|
'msg' => 'password_complexity'
|
||||||
|
@ -462,7 +468,7 @@ function edit_admin_account($_data) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ($password != $password2) {
|
if ($password != $password2) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'password_mismatch'
|
'msg' => 'password_mismatch'
|
||||||
|
@ -482,7 +488,7 @@ function edit_admin_account($_data) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
|
@ -501,7 +507,7 @@ function edit_admin_account($_data) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
|
@ -516,7 +522,7 @@ function edit_admin_account($_data) {
|
||||||
$stmt->execute(array(':username1' => $username, ':username2' => $username_now));
|
$stmt->execute(array(':username1' => $username, ':username2' => $username_now));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
|
@ -524,7 +530,7 @@ function edit_admin_account($_data) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['mailcow_cc_username'] = $username;
|
$_SESSION['mailcow_cc_username'] = $username;
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'admin_modified'
|
'msg' => 'admin_modified'
|
||||||
|
@ -552,7 +558,7 @@ function edit_user_account($_data) {
|
||||||
$role = $_SESSION['mailcow_cc_role'];
|
$role = $_SESSION['mailcow_cc_role'];
|
||||||
$password_old = $_data['user_old_pass'];
|
$password_old = $_data['user_old_pass'];
|
||||||
if (filter_var($username, FILTER_VALIDATE_EMAIL === false) || $role != 'user') {
|
if (filter_var($username, FILTER_VALIDATE_EMAIL === false) || $role != 'user') {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -569,7 +575,7 @@ function edit_user_account($_data) {
|
||||||
$stmt->execute(array(':user' => $username));
|
$stmt->execute(array(':user' => $username));
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
if (!verify_hash($row['password'], $password_old)) {
|
if (!verify_hash($row['password'], $password_old)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -579,7 +585,7 @@ function edit_user_account($_data) {
|
||||||
if (isset($password_new) && isset($password_new2)) {
|
if (isset($password_new) && isset($password_new2)) {
|
||||||
if (!empty($password_new2) && !empty($password_new)) {
|
if (!empty($password_new2) && !empty($password_new)) {
|
||||||
if ($password_new2 != $password_new) {
|
if ($password_new2 != $password_new) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'password_mismatch'
|
'msg' => 'password_mismatch'
|
||||||
|
@ -587,7 +593,7 @@ function edit_user_account($_data) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password_new)) {
|
if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password_new)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'password_complexity'
|
'msg' => 'password_complexity'
|
||||||
|
@ -603,7 +609,7 @@ function edit_user_account($_data) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
|
@ -613,7 +619,7 @@ function edit_user_account($_data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
update_sogo_static_view();
|
update_sogo_static_view();
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('mailbox_modified', htmlspecialchars($username))
|
'msg' => array('mailbox_modified', htmlspecialchars($username))
|
||||||
|
@ -628,73 +634,63 @@ function user_get_alias_details($username) {
|
||||||
if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {
|
if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
$data['address'] = $username;
|
||||||
$data['address'] = $username;
|
$stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`address` SEPARATOR ', '), '✘') AS `shared_aliases` FROM `alias`
|
||||||
$stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`address` SEPARATOR ', '), '✘') AS `shared_aliases` FROM `alias`
|
WHERE `goto` REGEXP :username_goto
|
||||||
WHERE `goto` REGEXP :username_goto
|
AND `address` NOT LIKE '@%'
|
||||||
AND `address` NOT LIKE '@%'
|
AND `goto` != :username_goto2
|
||||||
AND `goto` != :username_goto2
|
AND `address` != :username_address");
|
||||||
AND `address` != :username_address");
|
$stmt->execute(array(
|
||||||
$stmt->execute(array(
|
':username_goto' => '(^|,)'.$username.'($|,)',
|
||||||
':username_goto' => '(^|,)'.$username.'($|,)',
|
':username_goto2' => $username,
|
||||||
':username_goto2' => $username,
|
':username_address' => $username
|
||||||
':username_address' => $username
|
));
|
||||||
));
|
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
while ($row = array_shift($run)) {
|
||||||
while ($row = array_shift($run)) {
|
$data['shared_aliases'] = $row['shared_aliases'];
|
||||||
$data['shared_aliases'] = $row['shared_aliases'];
|
|
||||||
}
|
|
||||||
$stmt = $pdo->prepare("SELECT GROUP_CONCAT(`address` SEPARATOR ', ') AS `direct_aliases` FROM `alias`
|
|
||||||
WHERE `goto` = :username_goto
|
|
||||||
AND `address` NOT LIKE '@%'
|
|
||||||
AND `address` != :username_address");
|
|
||||||
$stmt->execute(
|
|
||||||
array(
|
|
||||||
':username_goto' => $username,
|
|
||||||
':username_address' => $username
|
|
||||||
));
|
|
||||||
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
while ($row = array_shift($run)) {
|
|
||||||
$data['direct_aliases'][] = $row['direct_aliases'];
|
|
||||||
}
|
|
||||||
$stmt = $pdo->prepare("SELECT GROUP_CONCAT(local_part, '@', alias_domain SEPARATOR ', ') AS `ad_alias` FROM `mailbox`
|
|
||||||
LEFT OUTER JOIN `alias_domain` on `target_domain` = `domain`
|
|
||||||
WHERE `username` = :username ;");
|
|
||||||
$stmt->execute(array(':username' => $username));
|
|
||||||
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
while ($row = array_shift($run)) {
|
|
||||||
$data['direct_aliases'][] = $row['ad_alias'];
|
|
||||||
}
|
|
||||||
$data['direct_aliases'] = implode(', ', array_filter($data['direct_aliases']));
|
|
||||||
$data['direct_aliases'] = empty($data['direct_aliases']) ? '✘' : $data['direct_aliases'];
|
|
||||||
$stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`send_as` SEPARATOR ', '), '✘') AS `send_as` FROM `sender_acl` WHERE `logged_in_as` = :username AND `send_as` NOT LIKE '@%';");
|
|
||||||
$stmt->execute(array(':username' => $username));
|
|
||||||
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
while ($row = array_shift($run)) {
|
|
||||||
$data['aliases_also_send_as'] = $row['send_as'];
|
|
||||||
}
|
|
||||||
$stmt = $pdo->prepare("SELECT IFNULL(CONCAT(GROUP_CONCAT(DISTINCT `send_as` SEPARATOR ', '), ', ', GROUP_CONCAT(DISTINCT CONCAT('@',`alias_domain`) SEPARATOR ', ')), '✘') AS `send_as` FROM `sender_acl` LEFT JOIN `alias_domain` ON `alias_domain`.`target_domain` = TRIM(LEADING '@' FROM `send_as`) WHERE `logged_in_as` = :username AND `send_as` LIKE '@%';");
|
|
||||||
$stmt->execute(array(':username' => $username));
|
|
||||||
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
while ($row = array_shift($run)) {
|
|
||||||
$data['aliases_send_as_all'] = $row['send_as'];
|
|
||||||
}
|
|
||||||
$stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`address` SEPARATOR ', '), '✘') as `address` FROM `alias` WHERE `goto` REGEXP :username AND `address` LIKE '@%';");
|
|
||||||
$stmt->execute(array(':username' => '(^|,)'.$username.'($|,)'));
|
|
||||||
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
while ($row = array_shift($run)) {
|
|
||||||
$data['is_catch_all'] = $row['address'];
|
|
||||||
}
|
|
||||||
return $data;
|
|
||||||
}
|
}
|
||||||
catch(PDOException $e) {
|
$stmt = $pdo->prepare("SELECT GROUP_CONCAT(`address` SEPARATOR ', ') AS `direct_aliases` FROM `alias`
|
||||||
$_SESSION['return'] = array(
|
WHERE `goto` = :username_goto
|
||||||
'type' => 'danger',
|
AND `address` NOT LIKE '@%'
|
||||||
'log' => array(__FUNCTION__, $username),
|
AND `address` != :username_address");
|
||||||
'msg' => array('mysql_error', $e)
|
$stmt->execute(
|
||||||
);
|
array(
|
||||||
return false;
|
':username_goto' => $username,
|
||||||
|
':username_address' => $username
|
||||||
|
));
|
||||||
|
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
while ($row = array_shift($run)) {
|
||||||
|
$data['direct_aliases'][] = $row['direct_aliases'];
|
||||||
}
|
}
|
||||||
|
$stmt = $pdo->prepare("SELECT GROUP_CONCAT(local_part, '@', alias_domain SEPARATOR ', ') AS `ad_alias` FROM `mailbox`
|
||||||
|
LEFT OUTER JOIN `alias_domain` on `target_domain` = `domain`
|
||||||
|
WHERE `username` = :username ;");
|
||||||
|
$stmt->execute(array(':username' => $username));
|
||||||
|
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
while ($row = array_shift($run)) {
|
||||||
|
$data['direct_aliases'][] = $row['ad_alias'];
|
||||||
|
}
|
||||||
|
$data['direct_aliases'] = implode(', ', array_filter($data['direct_aliases']));
|
||||||
|
$data['direct_aliases'] = empty($data['direct_aliases']) ? '✘' : $data['direct_aliases'];
|
||||||
|
$stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`send_as` SEPARATOR ', '), '✘') AS `send_as` FROM `sender_acl` WHERE `logged_in_as` = :username AND `send_as` NOT LIKE '@%';");
|
||||||
|
$stmt->execute(array(':username' => $username));
|
||||||
|
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
while ($row = array_shift($run)) {
|
||||||
|
$data['aliases_also_send_as'] = $row['send_as'];
|
||||||
|
}
|
||||||
|
$stmt = $pdo->prepare("SELECT IFNULL(CONCAT(GROUP_CONCAT(DISTINCT `send_as` SEPARATOR ', '), ', ', GROUP_CONCAT(DISTINCT CONCAT('@',`alias_domain`) SEPARATOR ', ')), '✘') AS `send_as` FROM `sender_acl` LEFT JOIN `alias_domain` ON `alias_domain`.`target_domain` = TRIM(LEADING '@' FROM `send_as`) WHERE `logged_in_as` = :username AND `send_as` LIKE '@%';");
|
||||||
|
$stmt->execute(array(':username' => $username));
|
||||||
|
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
while ($row = array_shift($run)) {
|
||||||
|
$data['aliases_send_as_all'] = $row['send_as'];
|
||||||
|
}
|
||||||
|
$stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`address` SEPARATOR ', '), '✘') as `address` FROM `alias` WHERE `goto` REGEXP :username AND `address` LIKE '@%';");
|
||||||
|
$stmt->execute(array(':username' => '(^|,)'.$username.'($|,)'));
|
||||||
|
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
while ($row = array_shift($run)) {
|
||||||
|
$data['is_catch_all'] = $row['address'];
|
||||||
|
}
|
||||||
|
return $data;
|
||||||
}
|
}
|
||||||
function is_valid_domain_name($domain_name) {
|
function is_valid_domain_name($domain_name) {
|
||||||
if (empty($domain_name)) {
|
if (empty($domain_name)) {
|
||||||
|
@ -716,7 +712,7 @@ function set_tfa($_data) {
|
||||||
$username = $_SESSION['mailcow_cc_username'];
|
$username = $_SESSION['mailcow_cc_username'];
|
||||||
if ($_SESSION['mailcow_cc_role'] != "domainadmin" &&
|
if ($_SESSION['mailcow_cc_role'] != "domainadmin" &&
|
||||||
$_SESSION['mailcow_cc_role'] != "admin") {
|
$_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -728,7 +724,7 @@ function set_tfa($_data) {
|
||||||
$stmt->execute(array(':user' => $username));
|
$stmt->execute(array(':user' => $username));
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
if (!verify_hash($row['password'], $_data["confirm_password"])) {
|
if (!verify_hash($row['password'], $_data["confirm_password"])) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -743,7 +739,7 @@ function set_tfa($_data) {
|
||||||
$yubico_key = $_data['yubico_key'];
|
$yubico_key = $_data['yubico_key'];
|
||||||
$yubi = new Auth_Yubico($yubico_id, $yubico_key);
|
$yubi = new Auth_Yubico($yubico_id, $yubico_key);
|
||||||
if (!$yubi) {
|
if (!$yubi) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -751,7 +747,7 @@ function set_tfa($_data) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!ctype_alnum($_data["otp_token"]) || strlen($_data["otp_token"]) != 44) {
|
if (!ctype_alnum($_data["otp_token"]) || strlen($_data["otp_token"]) != 44) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'tfa_token_invalid'
|
'msg' => 'tfa_token_invalid'
|
||||||
|
@ -760,7 +756,7 @@ function set_tfa($_data) {
|
||||||
}
|
}
|
||||||
$yauth = $yubi->verify($_data["otp_token"]);
|
$yauth = $yubi->verify($_data["otp_token"]);
|
||||||
if (PEAR::isError($yauth)) {
|
if (PEAR::isError($yauth)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('yotp_verification_failed', $yauth->getMessage())
|
'msg' => array('yotp_verification_failed', $yauth->getMessage())
|
||||||
|
@ -780,14 +776,14 @@ function set_tfa($_data) {
|
||||||
$stmt->execute(array(':key_id' => $key_id, ':username' => $username, ':secret' => $yubico_id . ':' . $yubico_key . ':' . $yubico_modhex_id));
|
$stmt->execute(array(':key_id' => $key_id, ':username' => $username, ':secret' => $yubico_id . ':' . $yubico_key . ':' . $yubico_modhex_id));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('object_modified', htmlspecialchars($username))
|
'msg' => array('object_modified', htmlspecialchars($username))
|
||||||
|
@ -801,7 +797,7 @@ function set_tfa($_data) {
|
||||||
$stmt->execute(array(':username' => $username));
|
$stmt->execute(array(':username' => $username));
|
||||||
$stmt = $pdo->prepare("INSERT INTO `tfa` (`username`, `key_id`, `authmech`, `keyHandle`, `publicKey`, `certificate`, `counter`, `active`) VALUES (?, ?, 'u2f', ?, ?, ?, ?, '1')");
|
$stmt = $pdo->prepare("INSERT INTO `tfa` (`username`, `key_id`, `authmech`, `keyHandle`, `publicKey`, `certificate`, `counter`, `active`) VALUES (?, ?, 'u2f', ?, ?, ?, ?, '1')");
|
||||||
$stmt->execute(array($username, $key_id, $reg->keyHandle, $reg->publicKey, $reg->certificate, $reg->counter));
|
$stmt->execute(array($username, $key_id, $reg->keyHandle, $reg->publicKey, $reg->certificate, $reg->counter));
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('object_modified', $username)
|
'msg' => array('object_modified', $username)
|
||||||
|
@ -809,7 +805,7 @@ function set_tfa($_data) {
|
||||||
$_SESSION['regReq'] = null;
|
$_SESSION['regReq'] = null;
|
||||||
}
|
}
|
||||||
catch (Exception $e) {
|
catch (Exception $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('u2f_verification_failed', $e->getMessage())
|
'msg' => array('u2f_verification_failed', $e->getMessage())
|
||||||
|
@ -828,21 +824,21 @@ function set_tfa($_data) {
|
||||||
$stmt->execute(array($username, $key_id, $_POST['totp_secret']));
|
$stmt->execute(array($username, $key_id, $_POST['totp_secret']));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('object_modified', $username)
|
'msg' => array('object_modified', $username)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'totp_verification_failed'
|
'msg' => 'totp_verification_failed'
|
||||||
|
@ -855,14 +851,14 @@ function set_tfa($_data) {
|
||||||
$stmt->execute(array(':username' => $username));
|
$stmt->execute(array(':username' => $username));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('object_modified', htmlspecialchars($username))
|
'msg' => array('object_modified', htmlspecialchars($username))
|
||||||
|
@ -880,7 +876,7 @@ function unset_tfa_key($_data) {
|
||||||
$username = $_SESSION['mailcow_cc_username'];
|
$username = $_SESSION['mailcow_cc_username'];
|
||||||
if ($_SESSION['mailcow_cc_role'] != "domainadmin" &&
|
if ($_SESSION['mailcow_cc_role'] != "domainadmin" &&
|
||||||
$_SESSION['mailcow_cc_role'] != "admin") {
|
$_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -889,7 +885,7 @@ function unset_tfa_key($_data) {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if (!is_numeric($id)) {
|
if (!is_numeric($id)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -901,7 +897,7 @@ function unset_tfa_key($_data) {
|
||||||
$stmt->execute(array(':username' => $username));
|
$stmt->execute(array(':username' => $username));
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
if ($row['keys'] == "1") {
|
if ($row['keys'] == "1") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => 'last_key'
|
'msg' => 'last_key'
|
||||||
|
@ -910,14 +906,14 @@ function unset_tfa_key($_data) {
|
||||||
}
|
}
|
||||||
$stmt = $pdo->prepare("DELETE FROM `tfa` WHERE `username` = :username AND `id` = :id");
|
$stmt = $pdo->prepare("DELETE FROM `tfa` WHERE `username` = :username AND `id` = :id");
|
||||||
$stmt->execute(array(':username' => $username, ':id' => $id));
|
$stmt->execute(array(':username' => $username, ':id' => $id));
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('object_modified', $username)
|
'msg' => array('object_modified', $username)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_data_log),
|
'log' => array(__FUNCTION__, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
|
@ -1004,7 +1000,7 @@ function verify_tfa_login($username, $token) {
|
||||||
switch ($row["authmech"]) {
|
switch ($row["authmech"]) {
|
||||||
case "yubi_otp":
|
case "yubi_otp":
|
||||||
if (!ctype_alnum($token) || strlen($token) != 44) {
|
if (!ctype_alnum($token) || strlen($token) != 44) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => array('yotp_verification_failed', 'token length error')
|
'msg' => array('yotp_verification_failed', 'token length error')
|
||||||
|
@ -1023,7 +1019,7 @@ function verify_tfa_login($username, $token) {
|
||||||
$yubi = new Auth_Yubico($yubico_auth[0], $yubico_auth[1]);
|
$yubi = new Auth_Yubico($yubico_auth[0], $yubico_auth[1]);
|
||||||
$yauth = $yubi->verify($token);
|
$yauth = $yubi->verify($token);
|
||||||
if (PEAR::isError($yauth)) {
|
if (PEAR::isError($yauth)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => array('yotp_verification_failed', $yauth->getMessage())
|
'msg' => array('yotp_verification_failed', $yauth->getMessage())
|
||||||
|
@ -1032,14 +1028,14 @@ function verify_tfa_login($username, $token) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['tfa_id'] = $row['id'];
|
$_SESSION['tfa_id'] = $row['id'];
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => 'verified_yotp_login'
|
'msg' => 'verified_yotp_login'
|
||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => array('yotp_verification_failed', 'unknown')
|
'msg' => array('yotp_verification_failed', 'unknown')
|
||||||
|
@ -1053,7 +1049,7 @@ function verify_tfa_login($username, $token) {
|
||||||
$stmt->execute(array($reg->counter, $reg->id));
|
$stmt->execute(array($reg->counter, $reg->id));
|
||||||
$_SESSION['tfa_id'] = $reg->id;
|
$_SESSION['tfa_id'] = $reg->id;
|
||||||
$_SESSION['authReq'] = null;
|
$_SESSION['authReq'] = null;
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => 'verified_u2f_login'
|
'msg' => 'verified_u2f_login'
|
||||||
|
@ -1061,7 +1057,7 @@ function verify_tfa_login($username, $token) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch (Exception $e) {
|
catch (Exception $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => array('u2f_verification_failed', $e->getMessage())
|
'msg' => array('u2f_verification_failed', $e->getMessage())
|
||||||
|
@ -1069,7 +1065,7 @@ function verify_tfa_login($username, $token) {
|
||||||
$_SESSION['regReq'] = null;
|
$_SESSION['regReq'] = null;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => array('u2f_verification_failed', 'unknown')
|
'msg' => array('u2f_verification_failed', 'unknown')
|
||||||
|
@ -1089,14 +1085,14 @@ function verify_tfa_login($username, $token) {
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
if ($tfa->verifyCode($row['secret'], $_POST['token']) === true) {
|
if ($tfa->verifyCode($row['secret'], $_POST['token']) === true) {
|
||||||
$_SESSION['tfa_id'] = $row['id'];
|
$_SESSION['tfa_id'] = $row['id'];
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => 'verified_totp_login'
|
'msg' => 'verified_totp_login'
|
||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => 'totp_verification_failed'
|
'msg' => 'totp_verification_failed'
|
||||||
|
@ -1104,7 +1100,7 @@ function verify_tfa_login($username, $token) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
|
@ -1113,7 +1109,7 @@ function verify_tfa_login($username, $token) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => 'unknown_tfa_method'
|
'msg' => 'unknown_tfa_method'
|
||||||
|
@ -1127,7 +1123,7 @@ function admin_api($action, $data = null) {
|
||||||
global $pdo;
|
global $pdo;
|
||||||
global $lang;
|
global $lang;
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__),
|
'log' => array(__FUNCTION__),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -1147,7 +1143,7 @@ function admin_api($action, $data = null) {
|
||||||
}
|
}
|
||||||
$allow_from = implode(',', array_unique(array_filter($allow_from)));
|
$allow_from = implode(',', array_unique(array_filter($allow_from)));
|
||||||
if (empty($allow_from)) {
|
if (empty($allow_from)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $data),
|
'log' => array(__FUNCTION__, $data),
|
||||||
'msg' => 'ip_list_empty'
|
'msg' => 'ip_list_empty'
|
||||||
|
@ -1187,7 +1183,7 @@ function admin_api($action, $data = null) {
|
||||||
));
|
));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $data),
|
'log' => array(__FUNCTION__, $data),
|
||||||
'msg' => 'admin_modified'
|
'msg' => 'admin_modified'
|
||||||
|
@ -1196,7 +1192,7 @@ function admin_api($action, $data = null) {
|
||||||
function rspamd_ui($action, $data = null) {
|
function rspamd_ui($action, $data = null) {
|
||||||
global $lang;
|
global $lang;
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__),
|
'log' => array(__FUNCTION__),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -1208,7 +1204,7 @@ function rspamd_ui($action, $data = null) {
|
||||||
$rspamd_ui_pass = $data['rspamd_ui_pass'];
|
$rspamd_ui_pass = $data['rspamd_ui_pass'];
|
||||||
$rspamd_ui_pass2 = $data['rspamd_ui_pass2'];
|
$rspamd_ui_pass2 = $data['rspamd_ui_pass2'];
|
||||||
if (empty($rspamd_ui_pass) || empty($rspamd_ui_pass2)) {
|
if (empty($rspamd_ui_pass) || empty($rspamd_ui_pass2)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, '*', '*'),
|
'log' => array(__FUNCTION__, '*', '*'),
|
||||||
'msg' => 'password_empty'
|
'msg' => 'password_empty'
|
||||||
|
@ -1216,7 +1212,7 @@ function rspamd_ui($action, $data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ($rspamd_ui_pass != $rspamd_ui_pass2) {
|
if ($rspamd_ui_pass != $rspamd_ui_pass2) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, '*', '*'),
|
'log' => array(__FUNCTION__, '*', '*'),
|
||||||
'msg' => 'password_mismatch'
|
'msg' => 'password_mismatch'
|
||||||
|
@ -1224,7 +1220,7 @@ function rspamd_ui($action, $data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (strlen($rspamd_ui_pass) < 6) {
|
if (strlen($rspamd_ui_pass) < 6) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, '*', '*'),
|
'log' => array(__FUNCTION__, '*', '*'),
|
||||||
'msg' => 'rspamd_ui_pw_length'
|
'msg' => 'rspamd_ui_pw_length'
|
||||||
|
@ -1234,7 +1230,7 @@ function rspamd_ui($action, $data = null) {
|
||||||
$docker_return = docker('post', 'rspamd-mailcow', 'exec', array('cmd' => 'worker_password', 'raw' => $rspamd_ui_pass), array('Content-Type: application/json'));
|
$docker_return = docker('post', 'rspamd-mailcow', 'exec', array('cmd' => 'worker_password', 'raw' => $rspamd_ui_pass), array('Content-Type: application/json'));
|
||||||
if ($docker_return_array = json_decode($docker_return, true)) {
|
if ($docker_return_array = json_decode($docker_return, true)) {
|
||||||
if ($docker_return_array['type'] == 'success') {
|
if ($docker_return_array['type'] == 'success') {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, '*', '*'),
|
'log' => array(__FUNCTION__, '*', '*'),
|
||||||
'msg' => 'rspamd_ui_pw_set'
|
'msg' => 'rspamd_ui_pw_set'
|
||||||
|
@ -1242,7 +1238,7 @@ function rspamd_ui($action, $data = null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => $docker_return_array['type'],
|
'type' => $docker_return_array['type'],
|
||||||
'log' => array(__FUNCTION__, '*', '*'),
|
'log' => array(__FUNCTION__, '*', '*'),
|
||||||
'msg' => $docker_return_array['msg']
|
'msg' => $docker_return_array['msg']
|
||||||
|
@ -1251,7 +1247,7 @@ function rspamd_ui($action, $data = null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, '*', '*'),
|
'log' => array(__FUNCTION__, '*', '*'),
|
||||||
'msg' => 'unknown'
|
'msg' => 'unknown'
|
||||||
|
@ -1269,20 +1265,11 @@ function get_admin_details() {
|
||||||
if ($_SESSION['mailcow_cc_role'] != 'admin') {
|
if ($_SESSION['mailcow_cc_role'] != 'admin') {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
$stmt = $pdo->query("SELECT `admin`.`username`, `api`.`active` AS `api_active`, `api`.`api_key`, `api`.`allow_from` FROM `admin`
|
||||||
$stmt = $pdo->query("SELECT `admin`.`username`, `api`.`active` AS `api_active`, `api`.`api_key`, `api`.`allow_from` FROM `admin`
|
INNER JOIN `api` ON `admin`.`username` = `api`.`username`
|
||||||
INNER JOIN `api` ON `admin`.`username` = `api`.`username`
|
WHERE `admin`.`superadmin`='1'
|
||||||
WHERE `admin`.`superadmin`='1'
|
AND `admin`.`active`='1'");
|
||||||
AND `admin`.`active`='1'");
|
$data = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
$data = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
function get_u2f_registrations($username) {
|
function get_u2f_registrations($username) {
|
||||||
|
@ -1313,37 +1300,19 @@ function get_logs($container, $lines = false) {
|
||||||
// SQL
|
// SQL
|
||||||
if ($container == "mailcow-ui") {
|
if ($container == "mailcow-ui") {
|
||||||
if (isset($from) && isset($to)) {
|
if (isset($from) && isset($to)) {
|
||||||
try {
|
$stmt = $pdo->prepare("SELECT * FROM `logs` ORDER BY `id` DESC LIMIT :from, :to");
|
||||||
$stmt = $pdo->prepare("SELECT * FROM `logs` ORDER BY `id` DESC LIMIT :from, :to");
|
$stmt->execute(array(
|
||||||
$stmt->execute(array(
|
':from' => $from - 1,
|
||||||
':from' => $from - 1,
|
':to' => $to
|
||||||
':to' => $to
|
));
|
||||||
));
|
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
try {
|
$stmt = $pdo->prepare("SELECT * FROM `logs` ORDER BY `id` DESC LIMIT :lines");
|
||||||
$stmt = $pdo->prepare("SELECT * FROM `logs` ORDER BY `id` DESC LIMIT :lines");
|
$stmt->execute(array(
|
||||||
$stmt->execute(array(
|
':lines' => $lines + 1,
|
||||||
':lines' => $lines + 1,
|
));
|
||||||
));
|
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (is_array($data)) {
|
if (is_array($data)) {
|
||||||
return $data;
|
return $data;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -11,7 +11,7 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
$object = $_data['domain'];
|
$object = $_data['domain'];
|
||||||
if (is_valid_domain_name($object)) {
|
if (is_valid_domain_name($object)) {
|
||||||
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
|
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -21,7 +21,7 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
$object = idn_to_ascii(strtolower(trim($object)));
|
$object = idn_to_ascii(strtolower(trim($object)));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -36,7 +36,7 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
}
|
}
|
||||||
$object_from = preg_replace('/\.+/', '.', rtrim(preg_replace("/\.\*/", "*", trim(strtolower($_data['object_from']))), '.'));
|
$object_from = preg_replace('/\.+/', '.', rtrim(preg_replace("/\.\*/", "*", trim(strtolower($_data['object_from']))), '.'));
|
||||||
if (!ctype_alnum(str_replace(array('@', '_', '.', '-', '*'), '', $object_from))) {
|
if (!ctype_alnum(str_replace(array('@', '_', '.', '-', '*'), '', $object_from))) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'policy_list_from_invalid'
|
'msg' => 'policy_list_from_invalid'
|
||||||
|
@ -44,55 +44,37 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ($object_list != "blacklist_from" && $object_list != "whitelist_from") {
|
if ($object_list != "blacklist_from" && $object_list != "whitelist_from") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
$stmt = $pdo->prepare("SELECT `object` FROM `filterconf`
|
||||||
$stmt = $pdo->prepare("SELECT `object` FROM `filterconf`
|
WHERE (`option` = 'whitelist_from' OR `option` = 'blacklist_from')
|
||||||
WHERE (`option` = 'whitelist_from' OR `option` = 'blacklist_from')
|
AND `object` = :object
|
||||||
AND `object` = :object
|
AND `value` = :object_from");
|
||||||
AND `value` = :object_from");
|
$stmt->execute(array(':object' => $object, ':object_from' => $object_from));
|
||||||
$stmt->execute(array(':object' => $object, ':object_from' => $object_from));
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
if ($num_results != 0) {
|
||||||
if ($num_results != 0) {
|
$_SESSION['return'][] = array(
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
|
||||||
'msg' => 'policy_list_from_exists'
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => 'policy_list_from_exists'
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("INSERT INTO `filterconf` (`object`, `option` ,`value`)
|
$stmt = $pdo->prepare("INSERT INTO `filterconf` (`object`, `option` ,`value`)
|
||||||
VALUES (:object, :object_list, :object_from)");
|
VALUES (:object, :object_list, :object_from)");
|
||||||
$stmt->execute(array(
|
$stmt->execute(array(
|
||||||
':object' => $object,
|
':object' => $object,
|
||||||
':object_list' => $object_list,
|
':object_list' => $object_list,
|
||||||
':object_from' => $object_from
|
':object_from' => $object_from
|
||||||
));
|
));
|
||||||
}
|
|
||||||
catch (PDOException $e) {
|
$_SESSION['return'][] = array(
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => array('domain_modified', $object)
|
'msg' => array('domain_modified', $object)
|
||||||
|
@ -101,7 +83,7 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
case 'mailbox':
|
case 'mailbox':
|
||||||
$object = $_data['username'];
|
$object = $_data['username'];
|
||||||
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
|
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -109,7 +91,7 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!isset($_SESSION['acl']['spam_policy']) || $_SESSION['acl']['spam_policy'] != "1" ) {
|
if (!isset($_SESSION['acl']['spam_policy']) || $_SESSION['acl']['spam_policy'] != "1" ) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -124,7 +106,7 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
}
|
}
|
||||||
$object_from = preg_replace('/\.+/', '.', rtrim(preg_replace("/\.\*/", "*", trim(strtolower($_data['object_from']))), '.'));
|
$object_from = preg_replace('/\.+/', '.', rtrim(preg_replace("/\.\*/", "*", trim(strtolower($_data['object_from']))), '.'));
|
||||||
if (!ctype_alnum(str_replace(array('@', '_', '.', '-', '*'), '', $object_from))) {
|
if (!ctype_alnum(str_replace(array('@', '_', '.', '-', '*'), '', $object_from))) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'policy_list_from_invalid'
|
'msg' => 'policy_list_from_invalid'
|
||||||
|
@ -132,55 +114,35 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ($object_list != "blacklist_from" && $object_list != "whitelist_from") {
|
if ($object_list != "blacklist_from" && $object_list != "whitelist_from") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
$stmt = $pdo->prepare("SELECT `object` FROM `filterconf`
|
||||||
$stmt = $pdo->prepare("SELECT `object` FROM `filterconf`
|
WHERE (`option` = 'whitelist_from' OR `option` = 'blacklist_from')
|
||||||
WHERE (`option` = 'whitelist_from' OR `option` = 'blacklist_from')
|
AND `object` = :object
|
||||||
AND `object` = :object
|
AND `value` = :object_from");
|
||||||
AND `value` = :object_from");
|
$stmt->execute(array(':object' => $object, ':object_from' => $object_from));
|
||||||
$stmt->execute(array(':object' => $object, ':object_from' => $object_from));
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
if ($num_results != 0) {
|
||||||
if ($num_results != 0) {
|
$_SESSION['return'][] = array(
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
|
||||||
'msg' => 'policy_list_from_exists'
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => 'policy_list_from_exists'
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
$stmt = $pdo->prepare("INSERT INTO `filterconf` (`object`, `option` ,`value`)
|
||||||
$stmt = $pdo->prepare("INSERT INTO `filterconf` (`object`, `option` ,`value`)
|
VALUES (:object, :object_list, :object_from)");
|
||||||
VALUES (:object, :object_list, :object_from)");
|
$stmt->execute(array(
|
||||||
$stmt->execute(array(
|
':object' => $object,
|
||||||
':object' => $object,
|
':object_list' => $object_list,
|
||||||
':object_list' => $object_list,
|
':object_from' => $object_from
|
||||||
':object_from' => $object_from
|
));
|
||||||
));
|
$_SESSION['return'][] = array(
|
||||||
}
|
|
||||||
catch (PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => array('mailbox_modified', $object)
|
'msg' => array('mailbox_modified', $object)
|
||||||
|
@ -194,43 +156,34 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
(array)$prefids = $_data['prefid'];
|
(array)$prefids = $_data['prefid'];
|
||||||
foreach ($prefids as $prefid) {
|
foreach ($prefids as $prefid) {
|
||||||
if (!is_numeric($prefid)) {
|
if (!is_numeric($prefid)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("SELECT `object` FROM `filterconf` WHERE `prefid` = :prefid");
|
|
||||||
$stmt->execute(array(':prefid' => $prefid));
|
|
||||||
$object = $stmt->fetch(PDO::FETCH_ASSOC)['object'];
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
$stmt = $pdo->prepare("SELECT `object` FROM `filterconf` WHERE `prefid` = :prefid");
|
||||||
|
$stmt->execute(array(':prefid' => $prefid));
|
||||||
|
$object = $stmt->fetch(PDO::FETCH_ASSOC)['object'];
|
||||||
if (is_valid_domain_name($object)) {
|
if (is_valid_domain_name($object)) {
|
||||||
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
|
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
$object = idn_to_ascii(strtolower(trim($object)));
|
$object = idn_to_ascii(strtolower(trim($object)));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
$stmt = $pdo->prepare("DELETE FROM `filterconf` WHERE `object` = :object AND `prefid` = :prefid");
|
$stmt = $pdo->prepare("DELETE FROM `filterconf` WHERE `object` = :object AND `prefid` = :prefid");
|
||||||
|
@ -240,19 +193,19 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
|
'msg' => array('item_deleted',$prefid)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
|
||||||
'msg' => array('items_deleted', implode(', ', $prefids))
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case 'mailbox':
|
case 'mailbox':
|
||||||
if (!is_array($_data['prefid'])) {
|
if (!is_array($_data['prefid'])) {
|
||||||
|
@ -263,7 +216,7 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
$prefids = $_data['prefid'];
|
$prefids = $_data['prefid'];
|
||||||
}
|
}
|
||||||
if (!isset($_SESSION['acl']['spam_policy']) || $_SESSION['acl']['spam_policy'] != "1" ) {
|
if (!isset($_SESSION['acl']['spam_policy']) || $_SESSION['acl']['spam_policy'] != "1" ) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -272,32 +225,23 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
}
|
}
|
||||||
foreach ($prefids as $prefid) {
|
foreach ($prefids as $prefid) {
|
||||||
if (!is_numeric($prefid)) {
|
if (!is_numeric($prefid)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("SELECT `object` FROM `filterconf` WHERE `prefid` = :prefid");
|
|
||||||
$stmt->execute(array(':prefid' => $prefid));
|
|
||||||
$object = $stmt->fetch(PDO::FETCH_ASSOC)['object'];
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
$stmt = $pdo->prepare("SELECT `object` FROM `filterconf` WHERE `prefid` = :prefid");
|
||||||
|
$stmt->execute(array(':prefid' => $prefid));
|
||||||
|
$object = $stmt->fetch(PDO::FETCH_ASSOC)['object'];
|
||||||
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
|
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
$stmt = $pdo->prepare("DELETE FROM `filterconf` WHERE `object` = :object AND `prefid` = :prefid");
|
$stmt = $pdo->prepare("DELETE FROM `filterconf` WHERE `object` = :object AND `prefid` = :prefid");
|
||||||
|
@ -307,19 +251,19 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
||||||
|
'msg' => array('items_deleted', implode(', ', $prefids))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
|
||||||
'msg' => array('items_deleted', implode(', ', $prefids))
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -335,23 +279,16 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
}
|
}
|
||||||
$_data = idn_to_ascii(strtolower(trim($_data)));
|
$_data = idn_to_ascii(strtolower(trim($_data)));
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
// WHITELIST
|
// WHITELIST
|
||||||
$stmt = $pdo->prepare("SELECT `object`, `value`, `prefid` FROM `filterconf` WHERE `option`='whitelist_from' AND (`object` LIKE :object_mail OR `object` = :object_domain)");
|
$stmt = $pdo->prepare("SELECT `object`, `value`, `prefid` FROM `filterconf` WHERE `option`='whitelist_from' AND (`object` LIKE :object_mail OR `object` = :object_domain)");
|
||||||
$stmt->execute(array(':object_mail' => '%@' . $_data, ':object_domain' => $_data));
|
$stmt->execute(array(':object_mail' => '%@' . $_data, ':object_domain' => $_data));
|
||||||
$rows['whitelist'] = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$rows['whitelist'] = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
// BLACKLIST
|
// BLACKLIST
|
||||||
$stmt = $pdo->prepare("SELECT `object`, `value`, `prefid` FROM `filterconf` WHERE `option`='blacklist_from' AND (`object` LIKE :object_mail OR `object` = :object_domain)");
|
$stmt = $pdo->prepare("SELECT `object`, `value`, `prefid` FROM `filterconf` WHERE `option`='blacklist_from' AND (`object` LIKE :object_mail OR `object` = :object_domain)");
|
||||||
$stmt->execute(array(':object_mail' => '%@' . $_data, ':object_domain' => $_data));
|
$stmt->execute(array(':object_mail' => '%@' . $_data, ':object_domain' => $_data));
|
||||||
$rows['blacklist'] = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$rows['blacklist'] = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $rows;
|
return $rows;
|
||||||
break;
|
break;
|
||||||
case 'mailbox':
|
case 'mailbox':
|
||||||
|
@ -367,23 +304,14 @@ function policy($_action, $_scope, $_data = null) {
|
||||||
if (empty($domain)) {
|
if (empty($domain)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
// WHITELIST
|
||||||
// WHITELIST
|
$stmt = $pdo->prepare("SELECT `object`, `value`, `prefid` FROM `filterconf` WHERE `option`='whitelist_from' AND (`object` = :username OR `object` = :domain)");
|
||||||
$stmt = $pdo->prepare("SELECT `object`, `value`, `prefid` FROM `filterconf` WHERE `option`='whitelist_from' AND (`object` = :username OR `object` = :domain)");
|
$stmt->execute(array(':username' => $_data, ':domain' => $domain));
|
||||||
$stmt->execute(array(':username' => $_data, ':domain' => $domain));
|
$rows['whitelist'] = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
$rows['whitelist'] = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
// BLACKLIST
|
||||||
// BLACKLIST
|
$stmt = $pdo->prepare("SELECT `object`, `value`, `prefid` FROM `filterconf` WHERE `option`='blacklist_from' AND (`object` = :username OR `object` = :domain)");
|
||||||
$stmt = $pdo->prepare("SELECT `object`, `value`, `prefid` FROM `filterconf` WHERE `option`='blacklist_from' AND (`object` = :username OR `object` = :domain)");
|
$stmt->execute(array(':username' => $_data, ':domain' => $domain));
|
||||||
$stmt->execute(array(':username' => $_data, ':domain' => $domain));
|
$rows['blacklist'] = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
$rows['blacklist'] = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $rows;
|
return $rows;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ function quarantine($_action, $_data = null) {
|
||||||
$ids = $_data['id'];
|
$ids = $_data['id'];
|
||||||
}
|
}
|
||||||
if (!isset($_SESSION['acl']['quarantine']) || $_SESSION['acl']['quarantine'] != "1" ) {
|
if (!isset($_SESSION['acl']['quarantine']) || $_SESSION['acl']['quarantine'] != "1" ) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -23,59 +23,40 @@ function quarantine($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
foreach ($ids as $id) {
|
foreach ($ids as $id) {
|
||||||
if (!is_numeric($id)) {
|
if (!is_numeric($id)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
$stmt = $pdo->prepare('SELECT `rcpt` FROM `quarantine` WHERE `id` = :id');
|
||||||
$stmt = $pdo->prepare('SELECT `rcpt` FROM `quarantine` WHERE `id` = :id');
|
$stmt->execute(array(':id' => $id));
|
||||||
$stmt->execute(array(':id' => $id));
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt']) && $_SESSION['mailcow_cc_role'] != 'admin') {
|
||||||
if (hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt'])) {
|
$_SESSION['return'][] = array(
|
||||||
try {
|
|
||||||
$stmt = $pdo->prepare("DELETE FROM `quarantine` WHERE `id` = :id");
|
|
||||||
$stmt->execute(array(
|
|
||||||
':id' => $id
|
|
||||||
));
|
|
||||||
}
|
|
||||||
catch (PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => 'access_denied'
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
$stmt = $pdo->prepare("DELETE FROM `quarantine` WHERE `id` = :id");
|
||||||
|
$stmt->execute(array(
|
||||||
|
':id' => $id
|
||||||
|
));
|
||||||
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => array('item_deleted', $id)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('items_deleted', implode(', ', $ids))
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case 'edit':
|
case 'edit':
|
||||||
if (!isset($_SESSION['acl']['quarantine']) || $_SESSION['acl']['quarantine'] != "1" ) {
|
if (!isset($_SESSION['acl']['quarantine']) || $_SESSION['acl']['quarantine'] != "1" ) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -85,7 +66,7 @@ function quarantine($_action, $_data = null) {
|
||||||
// Edit settings
|
// Edit settings
|
||||||
if ($_data['action'] == 'settings') {
|
if ($_data['action'] == 'settings') {
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -101,14 +82,14 @@ function quarantine($_action, $_data = null) {
|
||||||
$redis->Set('Q_EXCLUDE_DOMAINS', json_encode($exclude_domains));
|
$redis->Set('Q_EXCLUDE_DOMAINS', json_encode($exclude_domains));
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'saved_settings'
|
'msg' => 'saved_settings'
|
||||||
|
@ -125,31 +106,22 @@ function quarantine($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
foreach ($ids as $id) {
|
foreach ($ids as $id) {
|
||||||
if (!is_numeric($id)) {
|
if (!is_numeric($id)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
$stmt = $pdo->prepare('SELECT `msg`, `qid`, `sender`, `rcpt` FROM `quarantine` WHERE `id` = :id');
|
||||||
$stmt = $pdo->prepare('SELECT `msg`, `qid`, `sender`, `rcpt` FROM `quarantine` WHERE `id` = :id');
|
$stmt->execute(array(':id' => $id));
|
||||||
$stmt->execute(array(':id' => $id));
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt'])) {
|
||||||
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt'])) {
|
$_SESSION['return'][] = array(
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'msg' => 'access_denied'
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'msg' => 'access_denied'
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
$sender = (isset($row['sender'])) ? $row['sender'] : 'sender-unknown@rspamd';
|
$sender = (isset($row['sender'])) ? $row['sender'] : 'sender-unknown@rspamd';
|
||||||
try {
|
try {
|
||||||
|
@ -170,12 +142,12 @@ function quarantine($_action, $_data = null) {
|
||||||
$postfix = 'postfix';
|
$postfix = 'postfix';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'warning',
|
'type' => 'warning',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('release_send_failed', 'Cannot determine Postfix host')
|
'msg' => array('release_send_failed', 'Cannot determine Postfix host')
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
$mail->Host = $postfix;
|
$mail->Host = $postfix;
|
||||||
$mail->Port = 590;
|
$mail->Port = 590;
|
||||||
|
@ -193,12 +165,12 @@ function quarantine($_action, $_data = null) {
|
||||||
}
|
}
|
||||||
catch (phpmailerException $e) {
|
catch (phpmailerException $e) {
|
||||||
unlink($msg_tmpf);
|
unlink($msg_tmpf);
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'warning',
|
'type' => 'warning',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('release_send_failed', $e->errorMessage())
|
'msg' => array('release_send_failed', $e->errorMessage())
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
$stmt = $pdo->prepare("DELETE FROM `quarantine` WHERE `id` = :id");
|
$stmt = $pdo->prepare("DELETE FROM `quarantine` WHERE `id` = :id");
|
||||||
|
@ -207,63 +179,179 @@ function quarantine($_action, $_data = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => array('item_released', $id)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif ($_data['action'] == 'learnspam') {
|
||||||
|
if (!is_array($_data['id'])) {
|
||||||
|
$ids = array();
|
||||||
|
$ids[] = $_data['id'];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$ids = $_data['id'];
|
||||||
|
}
|
||||||
|
foreach ($ids as $id) {
|
||||||
|
if (!is_numeric($id)) {
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => 'access_denied'
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$stmt = $pdo->prepare('SELECT `msg`, `rcpt` FROM `quarantine` WHERE `id` = :id');
|
||||||
|
$stmt->execute(array(':id' => $id));
|
||||||
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt']) && $_SESSION['mailcow_cc_role'] != 'admin') {
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'msg' => 'access_denied'
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$curl = curl_init();
|
||||||
|
curl_setopt($curl, CURLOPT_UNIX_SOCKET_PATH, '/rspamd-sock/rspamd.sock');
|
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
||||||
|
curl_setopt($curl, CURLOPT_POST, 1);
|
||||||
|
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
|
||||||
|
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: text/plain'));
|
||||||
|
curl_setopt($curl, CURLOPT_URL,"http://rspamd/learnspam");
|
||||||
|
curl_setopt($curl, CURLOPT_POSTFIELDS, $row['msg']);
|
||||||
|
$response = curl_exec($curl);
|
||||||
|
if (!curl_errno($curl)) {
|
||||||
|
$response = json_decode($response, true);
|
||||||
|
if (isset($response['error'])) {
|
||||||
|
if (stripos($response['error'], 'already learned') === false) {
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__),
|
||||||
|
'msg' => array('spam_learn_error', $response['error'])
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
curl_close($curl);
|
||||||
|
$curl = curl_init();
|
||||||
|
curl_setopt($curl, CURLOPT_UNIX_SOCKET_PATH, '/rspamd-sock/rspamd.sock');
|
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
||||||
|
curl_setopt($curl, CURLOPT_POST, 1);
|
||||||
|
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
|
||||||
|
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: text/plain', 'Flag: 11'));
|
||||||
|
curl_setopt($curl, CURLOPT_URL,"http://rspamd/fuzzyadd");
|
||||||
|
curl_setopt($curl, CURLOPT_POSTFIELDS, $row['msg']);
|
||||||
|
$response = curl_exec($curl);
|
||||||
|
if (!curl_errno($curl)) {
|
||||||
|
$response = json_decode($response, true);
|
||||||
|
if (isset($response['error'])) {
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__),
|
||||||
|
'msg' => array('fuzzy_learn_error', $response['error'])
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
curl_close($curl);
|
||||||
|
try {
|
||||||
|
$stmt = $pdo->prepare("DELETE FROM `quarantine` WHERE `id` = :id");
|
||||||
|
$stmt->execute(array(
|
||||||
|
':id' => $id
|
||||||
|
));
|
||||||
|
}
|
||||||
|
catch (PDOException $e) {
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => array('mysql_error', $e)
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__),
|
||||||
|
'msg' => 'qlearn_spam'
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
curl_close($curl);
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__),
|
||||||
|
'msg' => array('spam_learn_error', 'curl error ' . curl_errno($curl))
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
curl_close($curl);
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__),
|
||||||
|
'msg' => array('learn_spam_error', 'unknown')
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
curl_close($curl);
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__),
|
||||||
|
'msg' => array('spam_learn_error', 'curl error ' . curl_errno($curl))
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
curl_close($curl);
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__),
|
||||||
|
'msg' => array('learn_spam_error', 'unknown')
|
||||||
|
);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => 'items_released'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
case 'get':
|
case 'get':
|
||||||
try {
|
if ($_SESSION['mailcow_cc_role'] == "user") {
|
||||||
if ($_SESSION['mailcow_cc_role'] == "user") {
|
$stmt = $pdo->prepare('SELECT `id`, `qid`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created` FROM `quarantine` WHERE `rcpt` = :mbox');
|
||||||
$stmt = $pdo->prepare('SELECT `id`, `qid`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created` FROM `quarantine` WHERE `rcpt` = :mbox');
|
$stmt->execute(array(':mbox' => $_SESSION['mailcow_cc_username']));
|
||||||
$stmt->execute(array(':mbox' => $_SESSION['mailcow_cc_username']));
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
while($row = array_shift($rows)) {
|
||||||
while($row = array_shift($rows)) {
|
$q_meta[] = $row;
|
||||||
$q_meta[] = $row;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elseif ($_SESSION['mailcow_cc_role'] == "admin") {
|
|
||||||
$stmt = $pdo->query('SELECT `id`, `qid`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created` FROM `quarantine`');
|
|
||||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
while($row = array_shift($rows)) {
|
|
||||||
$q_meta[] = $row;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$domains = array_merge(mailbox('get', 'domains'), mailbox('get', 'alias_domains'));
|
|
||||||
foreach ($domains as $domain) {
|
|
||||||
$stmt = $pdo->prepare('SELECT `id`, `qid`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created` FROM `quarantine` WHERE `rcpt` REGEXP :domain');
|
|
||||||
$stmt->execute(array(':domain' => '@' . $domain . '$'));
|
|
||||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
while($row = array_shift($rows)) {
|
|
||||||
$q_meta[] = $row;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(PDOException $e) {
|
elseif ($_SESSION['mailcow_cc_role'] == "admin") {
|
||||||
$_SESSION['return'] = array(
|
$stmt = $pdo->query('SELECT `id`, `qid`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created` FROM `quarantine`');
|
||||||
'type' => 'danger',
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
while($row = array_shift($rows)) {
|
||||||
'msg' => array('mysql_error', $e)
|
$q_meta[] = $row;
|
||||||
);
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$domains = array_merge(mailbox('get', 'domains'), mailbox('get', 'alias_domains'));
|
||||||
|
foreach ($domains as $domain) {
|
||||||
|
$stmt = $pdo->prepare('SELECT `id`, `qid`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created` FROM `quarantine` WHERE `rcpt` REGEXP :domain');
|
||||||
|
$stmt->execute(array(':domain' => '@' . $domain . '$'));
|
||||||
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
while($row = array_shift($rows)) {
|
||||||
|
$q_meta[] = $row;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return $q_meta;
|
return $q_meta;
|
||||||
break;
|
break;
|
||||||
case 'settings':
|
case 'settings':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -276,7 +364,7 @@ function quarantine($_action, $_data = null) {
|
||||||
$settings['retention_size'] = $redis->Get('Q_RETENTION_SIZE');
|
$settings['retention_size'] = $redis->Get('Q_RETENTION_SIZE');
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('redis_error', $e)
|
'msg' => array('redis_error', $e)
|
||||||
|
@ -289,21 +377,11 @@ function quarantine($_action, $_data = null) {
|
||||||
if (!is_numeric($_data) || empty($_data)) {
|
if (!is_numeric($_data) || empty($_data)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
try {
|
$stmt = $pdo->prepare('SELECT `rcpt`, `symbols`, `msg`, `domain` FROM `quarantine` WHERE `id`= :id');
|
||||||
$stmt = $pdo->prepare('SELECT `rcpt`, `symbols`, `msg`, `domain` FROM `quarantine` WHERE `id`= :id');
|
$stmt->execute(array(':id' => $_data));
|
||||||
$stmt->execute(array(':id' => $_data));
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
if (hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt'])) {
|
||||||
if (hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt'])) {
|
return $row;
|
||||||
return $row;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -6,7 +6,7 @@ function relayhost($_action, $_data = null) {
|
||||||
switch ($_action) {
|
switch ($_action) {
|
||||||
case 'add':
|
case 'add':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -17,7 +17,7 @@ function relayhost($_action, $_data = null) {
|
||||||
$username = str_replace(':', '\:', trim($_data['username']));
|
$username = str_replace(':', '\:', trim($_data['username']));
|
||||||
$password = str_replace(':', '\:', trim($_data['password']));
|
$password = str_replace(':', '\:', trim($_data['password']));
|
||||||
if (empty($hostname)) {
|
if (empty($hostname)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('invalid_host', htmlspecialchars($host))
|
'msg' => array('invalid_host', htmlspecialchars($host))
|
||||||
|
@ -35,14 +35,14 @@ function relayhost($_action, $_data = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('relayhost_added', htmlspecialchars(implode(', ', $hosts)))
|
'msg' => array('relayhost_added', htmlspecialchars(implode(', ', $hosts)))
|
||||||
|
@ -50,7 +50,7 @@ function relayhost($_action, $_data = null) {
|
||||||
break;
|
break;
|
||||||
case 'edit':
|
case 'edit':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -67,12 +67,12 @@ function relayhost($_action, $_data = null) {
|
||||||
$active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int'];
|
$active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int'];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'relayhost_invalid'
|
'msg' => array('relayhost_invalid', $id)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
$stmt = $pdo->prepare("UPDATE `relayhosts` SET
|
$stmt = $pdo->prepare("UPDATE `relayhosts` SET
|
||||||
|
@ -90,23 +90,23 @@ function relayhost($_action, $_data = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => array('object_modified', htmlspecialchars(implode(', ', $hostnames)))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('object_modified', htmlspecialchars(implode(', ', $hostnames)))
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case 'delete':
|
case 'delete':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -122,36 +122,27 @@ function relayhost($_action, $_data = null) {
|
||||||
$stmt->execute(array(':id' => $id));
|
$stmt->execute(array(':id' => $id));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => array('relayhost_removed', htmlspecialchars($id))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('relayhost_removed', htmlspecialchars(implode(', ', $hostnames)))
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case 'get':
|
case 'get':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$relayhosts = array();
|
$relayhosts = array();
|
||||||
try {
|
$stmt = $pdo->query("SELECT `id`, `hostname`, `username` FROM `relayhosts`");
|
||||||
$stmt = $pdo->query("SELECT `id`, `hostname`, `username` FROM `relayhosts`");
|
$relayhosts = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
$relayhosts = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $relayhosts;
|
return $relayhosts;
|
||||||
break;
|
break;
|
||||||
case 'details':
|
case 'details':
|
||||||
|
@ -159,33 +150,23 @@ function relayhost($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$relayhostdata = array();
|
$relayhostdata = array();
|
||||||
try {
|
$stmt = $pdo->prepare("SELECT `id`,
|
||||||
$stmt = $pdo->prepare("SELECT `id`,
|
`hostname`,
|
||||||
`hostname`,
|
`username`,
|
||||||
`username`,
|
`password`,
|
||||||
`password`,
|
`active` AS `active_int`,
|
||||||
`active` AS `active_int`,
|
CONCAT(LEFT(`password`, 3), '...') AS `password_short`,
|
||||||
CONCAT(LEFT(`password`, 3), '...') AS `password_short`,
|
CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`
|
||||||
CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`
|
FROM `relayhosts`
|
||||||
FROM `relayhosts`
|
WHERE `id` = :id");
|
||||||
WHERE `id` = :id");
|
$stmt->execute(array(':id' => $_data));
|
||||||
|
$relayhostdata = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
if (!empty($relayhostdata)) {
|
||||||
|
$stmt = $pdo->prepare("SELECT GROUP_CONCAT(`domain` SEPARATOR ', ') AS `used_by_domains` FROM `domain` WHERE `relayhost` = :id");
|
||||||
$stmt->execute(array(':id' => $_data));
|
$stmt->execute(array(':id' => $_data));
|
||||||
$relayhostdata = $stmt->fetch(PDO::FETCH_ASSOC);
|
$used_by_domains = $stmt->fetch(PDO::FETCH_ASSOC)['used_by_domains'];
|
||||||
|
$used_by_domains = (empty($used_by_domains)) ? '' : $used_by_domains;
|
||||||
if (!empty($relayhostdata)) {
|
$relayhostdata['used_by_domains'] = $used_by_domains;
|
||||||
$stmt = $pdo->prepare("SELECT GROUP_CONCAT(`domain` SEPARATOR ', ') AS `used_by_domains` FROM `domain` WHERE `relayhost` = :id");
|
|
||||||
$stmt->execute(array(':id' => $_data));
|
|
||||||
$used_by_domains = $stmt->fetch(PDO::FETCH_ASSOC)['used_by_domains'];
|
|
||||||
$used_by_domains = (empty($used_by_domains)) ? '' : $used_by_domains;
|
|
||||||
$relayhostdata['used_by_domains'] = $used_by_domains;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return $relayhostdata;
|
return $relayhostdata;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -6,7 +6,7 @@ function rsettings($_action, $_data = null) {
|
||||||
switch ($_action) {
|
switch ($_action) {
|
||||||
case 'add':
|
case 'add':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -17,7 +17,7 @@ function rsettings($_action, $_data = null) {
|
||||||
$desc = $_data['desc'];
|
$desc = $_data['desc'];
|
||||||
$active = intval($_data['active']);
|
$active = intval($_data['active']);
|
||||||
if (empty($content)) {
|
if (empty($content)) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'map_content_empty'
|
'msg' => 'map_content_empty'
|
||||||
|
@ -34,14 +34,14 @@ function rsettings($_action, $_data = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'settings_map_added'
|
'msg' => 'settings_map_added'
|
||||||
|
@ -49,7 +49,7 @@ function rsettings($_action, $_data = null) {
|
||||||
break;
|
break;
|
||||||
case 'edit':
|
case 'edit':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -65,12 +65,12 @@ function rsettings($_action, $_data = null) {
|
||||||
$active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int'];
|
$active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int'];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'settings_map_invalid'
|
'msg' => array('settings_map_invalid', $id)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
$content = trim($content);
|
$content = trim($content);
|
||||||
try {
|
try {
|
||||||
|
@ -87,23 +87,23 @@ function rsettings($_action, $_data = null) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
continue;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => array('object_modified', htmlspecialchars($ids))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('object_modified', htmlspecialchars(implode(', ', $ids)))
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case 'delete':
|
case 'delete':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => 'access_denied'
|
'msg' => 'access_denied'
|
||||||
|
@ -117,36 +117,27 @@ function rsettings($_action, $_data = null) {
|
||||||
$stmt->execute(array(':id' => $id));
|
$stmt->execute(array(':id' => $id));
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'success',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
||||||
|
'msg' => array('settings_map_removed', htmlspecialchars($id))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'success',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('settings_map_removed', htmlspecialchars(implode(', ', $ids)))
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case 'get':
|
case 'get':
|
||||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$settingsmaps = array();
|
$settingsmaps = array();
|
||||||
try {
|
$stmt = $pdo->query("SELECT `id`, `desc`, `active` FROM `settingsmap`");
|
||||||
$stmt = $pdo->query("SELECT `id`, `desc`, `active` FROM `settingsmap`");
|
$settingsmaps = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
$settingsmaps = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $settingsmaps;
|
return $settingsmaps;
|
||||||
break;
|
break;
|
||||||
case 'details':
|
case 'details':
|
||||||
|
@ -154,24 +145,15 @@ function rsettings($_action, $_data = null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$settingsmapdata = array();
|
$settingsmapdata = array();
|
||||||
try {
|
$stmt = $pdo->prepare("SELECT `id`,
|
||||||
$stmt = $pdo->prepare("SELECT `id`,
|
`desc`,
|
||||||
`desc`,
|
`content`,
|
||||||
`content`,
|
`active` AS `active_int`,
|
||||||
`active` AS `active_int`,
|
CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`
|
||||||
CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`
|
FROM `settingsmap`
|
||||||
FROM `settingsmap`
|
WHERE `id` = :id");
|
||||||
WHERE `id` = :id");
|
$stmt->execute(array(':id' => $_data));
|
||||||
$stmt->execute(array(':id' => $_data));
|
$settingsmapdata = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
$settingsmapdata = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
||||||
}
|
|
||||||
catch(PDOException $e) {
|
|
||||||
$_SESSION['return'] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
||||||
'msg' => array('mysql_error', $e)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $settingsmapdata;
|
return $settingsmapdata;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ function init_db_schema() {
|
||||||
try {
|
try {
|
||||||
global $pdo;
|
global $pdo;
|
||||||
|
|
||||||
$db_version = "05072018_2319";
|
$db_version = "10082018_2019";
|
||||||
|
|
||||||
$stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
|
$stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
|
||||||
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
|
@ -112,6 +112,7 @@ function init_db_schema() {
|
||||||
),
|
),
|
||||||
"alias" => array(
|
"alias" => array(
|
||||||
"cols" => array(
|
"cols" => array(
|
||||||
|
"id" => "INT NOT NULL AUTO_INCREMENT",
|
||||||
"address" => "VARCHAR(255) NOT NULL",
|
"address" => "VARCHAR(255) NOT NULL",
|
||||||
"goto" => "TEXT NOT NULL",
|
"goto" => "TEXT NOT NULL",
|
||||||
"domain" => "VARCHAR(255) NOT NULL",
|
"domain" => "VARCHAR(255) NOT NULL",
|
||||||
|
@ -121,7 +122,10 @@ function init_db_schema() {
|
||||||
),
|
),
|
||||||
"keys" => array(
|
"keys" => array(
|
||||||
"primary" => array(
|
"primary" => array(
|
||||||
"" => array("address")
|
"" => array("id")
|
||||||
|
),
|
||||||
|
"unique" => array(
|
||||||
|
"address" => array("address")
|
||||||
),
|
),
|
||||||
"key" => array(
|
"key" => array(
|
||||||
"domain" => array("domain")
|
"domain" => array("domain")
|
||||||
|
@ -366,6 +370,7 @@ function init_db_schema() {
|
||||||
"logs" => array(
|
"logs" => array(
|
||||||
"cols" => array(
|
"cols" => array(
|
||||||
"id" => "INT NOT NULL AUTO_INCREMENT",
|
"id" => "INT NOT NULL AUTO_INCREMENT",
|
||||||
|
"task" => "CHAR(32) NOT NULL DEFAULT '000000'",
|
||||||
"type" => "VARCHAR(32) DEFAULT ''",
|
"type" => "VARCHAR(32) DEFAULT ''",
|
||||||
"msg" => "TEXT",
|
"msg" => "TEXT",
|
||||||
"call" => "TEXT",
|
"call" => "TEXT",
|
||||||
|
@ -754,6 +759,8 @@ function init_db_schema() {
|
||||||
if ($num_results == 0) {
|
if ($num_results == 0) {
|
||||||
if (strpos($type, 'AUTO_INCREMENT') !== false) {
|
if (strpos($type, 'AUTO_INCREMENT') !== false) {
|
||||||
$type = $type . ' PRIMARY KEY ';
|
$type = $type . ' PRIMARY KEY ';
|
||||||
|
// Adding an AUTO_INCREMENT key, need to drop primary keys first
|
||||||
|
$pdo->query("ALTER TABLE `" . $table . "` DROP PRIMARY KEY");
|
||||||
}
|
}
|
||||||
$pdo->query("ALTER TABLE `" . $table . "` ADD `" . $column . "` " . $type);
|
$pdo->query("ALTER TABLE `" . $table . "` ADD `" . $column . "` " . $type);
|
||||||
}
|
}
|
||||||
|
@ -933,7 +940,7 @@ DELIMITER ;';
|
||||||
WHERE `username` = :username");
|
WHERE `username` = :username");
|
||||||
$stmt->execute(array(':tls_enforce_in' => $tls_options['tls_enforce_in'], ':tls_enforce_out' => $tls_options['tls_enforce_out'], ':username' => $tls_user));
|
$stmt->execute(array(':tls_enforce_in' => $tls_options['tls_enforce_in'], ':tls_enforce_out' => $tls_options['tls_enforce_out'], ':username' => $tls_user));
|
||||||
}
|
}
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'success',
|
'type' => 'success',
|
||||||
'log' => array(__FUNCTION__),
|
'log' => array(__FUNCTION__),
|
||||||
'msg' => 'db_init_complete'
|
'msg' => 'db_init_complete'
|
||||||
|
@ -943,7 +950,7 @@ DELIMITER ;';
|
||||||
$stmt = $pdo->query("INSERT INTO `user_acl` (`username`) SELECT `username` FROM `mailbox` WHERE `kind` = '' AND NOT EXISTS (SELECT `username` FROM `user_acl`);");
|
$stmt = $pdo->query("INSERT INTO `user_acl` (`username`) SELECT `username` FROM `mailbox` WHERE `kind` = '' AND NOT EXISTS (SELECT `username` FROM `user_acl`);");
|
||||||
}
|
}
|
||||||
catch (PDOException $e) {
|
catch (PDOException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__),
|
'log' => array(__FUNCTION__),
|
||||||
'msg' => array('mysql_error', $e)
|
'msg' => array('mysql_error', $e)
|
||||||
|
|
|
@ -51,6 +51,25 @@ catch (PDOException $e) {
|
||||||
<?php
|
<?php
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
function pdo_exception_handler($e) {
|
||||||
|
if ($e instanceof PDOException) {
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__),
|
||||||
|
'msg' => array('mysql_error', $e)
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__),
|
||||||
|
'msg' => array('mysql_error', 'unknown error')
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set_exception_handler('pdo_exception_handler');
|
||||||
|
|
||||||
// TODO: Move function
|
// TODO: Move function
|
||||||
function get_remote_ip($anonymize = null) {
|
function get_remote_ip($anonymize = null) {
|
||||||
|
|
|
@ -52,7 +52,7 @@ function session_check() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!isset($_SESSION['SESS_REMOTE_UA']) || ($_SESSION['SESS_REMOTE_UA'] != $_SERVER['HTTP_USER_AGENT'])) {
|
if (!isset($_SESSION['SESS_REMOTE_UA']) || ($_SESSION['SESS_REMOTE_UA'] != $_SERVER['HTTP_USER_AGENT'])) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'warning',
|
'type' => 'warning',
|
||||||
'msg' => 'session_ua'
|
'msg' => 'session_ua'
|
||||||
);
|
);
|
||||||
|
@ -60,7 +60,7 @@ function session_check() {
|
||||||
}
|
}
|
||||||
if (!empty($_POST)) {
|
if (!empty($_POST)) {
|
||||||
if ($_SESSION['CSRF']['TOKEN'] != $_POST['csrf_token']) {
|
if ($_SESSION['CSRF']['TOKEN'] != $_POST['csrf_token']) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'warning',
|
'type' => 'warning',
|
||||||
'msg' => 'session_token'
|
'msg' => 'session_token'
|
||||||
);
|
);
|
||||||
|
|
|
@ -3,6 +3,10 @@ $(document).ready(function() {
|
||||||
if ($(elem).data('submitted') == '1') {
|
if ($(elem).data('submitted') == '1') {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
var parent_btn_grp = $(elem).parentsUntil(".btn-group").parent();
|
||||||
|
if (parent_btn_grp.hasClass('btn-group')) {
|
||||||
|
parent_btn_grp.replaceWith('<button class="btn btn-default btn-sm" disabled>' + loading_text + '</a>');
|
||||||
|
}
|
||||||
$(elem).text(loading_text);
|
$(elem).text(loading_text);
|
||||||
$(elem).attr('data-submitted', '1');
|
$(elem).attr('data-submitted', '1');
|
||||||
function disableF5(e) { if ((e.which || e.keyCode) == 116 || (e.which || e.keyCode) == 82) e.preventDefault(); };
|
function disableF5(e) { if ((e.which || e.keyCode) == 116 || (e.which || e.keyCode) == 82) e.preventDefault(); };
|
||||||
|
@ -217,8 +221,23 @@ $(document).ready(function() {
|
||||||
var response = (data.responseText);
|
var response = (data.responseText);
|
||||||
if (typeof response !== 'undefined' && response.length !== 0) {
|
if (typeof response !== 'undefined' && response.length !== 0) {
|
||||||
response_obj = JSON.parse(response);
|
response_obj = JSON.parse(response);
|
||||||
if (response_obj.type == 'success') {
|
unset = true;
|
||||||
|
$.each(response_obj, function(i, v) {
|
||||||
|
if (v.type == "danger") {
|
||||||
|
unset = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (unset === true) {
|
||||||
|
unset = null;
|
||||||
$('form').formcache('clear');
|
$('form').formcache('clear');
|
||||||
|
$('form').formcache('destroy');
|
||||||
|
var i = localStorage.length;
|
||||||
|
while(i--) {
|
||||||
|
var key = localStorage.key(i);
|
||||||
|
if(/formcache/.test(key)) {
|
||||||
|
localStorage.removeItem(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var add_modal = $('.modal.in').attr('id');
|
var add_modal = $('.modal.in').attr('id');
|
||||||
|
|
|
@ -167,6 +167,7 @@ jQuery(function($){
|
||||||
"columns": [
|
"columns": [
|
||||||
{"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleString();},"title":lang.time,"style":{"width":"170px"}},
|
{"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleString();},"title":lang.time,"style":{"width":"170px"}},
|
||||||
{"name":"type","title":"Type"},
|
{"name":"type","title":"Type"},
|
||||||
|
{"name":"task","title":"Task"},
|
||||||
{"name":"user","title":"User"},
|
{"name":"user","title":"User"},
|
||||||
{"name":"role","title":"Role"},
|
{"name":"role","title":"Role"},
|
||||||
{"name":"remote","title":"IP"},
|
{"name":"remote","title":"IP"},
|
||||||
|
@ -506,6 +507,7 @@ jQuery(function($){
|
||||||
$.each(data, function (i, item) {
|
$.each(data, function (i, item) {
|
||||||
if (item === null) { return true; }
|
if (item === null) { return true; }
|
||||||
item.user = escapeHtml(item.user);
|
item.user = escapeHtml(item.user);
|
||||||
|
item.task = '<code>' + item.task + '</code>';
|
||||||
item.type = '<span class="label label-' + item.type + '">' + item.type + '</span>';
|
item.type = '<span class="label label-' + item.type + '">' + item.type + '</span>';
|
||||||
});
|
});
|
||||||
} else if (table == 'general_syslog') {
|
} else if (table == 'general_syslog') {
|
||||||
|
|
|
@ -594,6 +594,7 @@ jQuery(function($){
|
||||||
ft_alias_table = FooTable.init('#alias_table', {
|
ft_alias_table = FooTable.init('#alias_table', {
|
||||||
"columns": [
|
"columns": [
|
||||||
{"name":"chkbox","title":"","style":{"maxWidth":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"},
|
{"name":"chkbox","title":"","style":{"maxWidth":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"},
|
||||||
|
{"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}},
|
||||||
{"sorted": true,"name":"address","title":lang.alias,"style":{"width":"250px"}},
|
{"sorted": true,"name":"address","title":lang.alias,"style":{"width":"250px"}},
|
||||||
{"name":"goto","title":lang.target_address},
|
{"name":"goto","title":lang.target_address},
|
||||||
{"name":"domain","title":lang.domain,"breakpoints":"xs sm"},
|
{"name":"domain","title":lang.domain,"breakpoints":"xs sm"},
|
||||||
|
@ -611,10 +612,10 @@ jQuery(function($){
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
$.each(data, function (i, item) {
|
$.each(data, function (i, item) {
|
||||||
item.action = '<div class="btn-group">' +
|
item.action = '<div class="btn-group">' +
|
||||||
'<a href="/edit.php?alias=' + encodeURIComponent(item.address) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
'<a href="/edit.php?alias=' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
|
||||||
'<a href="#" id="delete_selected" data-id="single-alias" data-api-url="delete/alias" data-item="' + encodeURIComponent(item.address) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
'<a href="#" id="delete_selected" data-id="single-alias" data-api-url="delete/alias" data-item="' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
|
||||||
'</div>';
|
'</div>';
|
||||||
item.chkbox = '<input type="checkbox" data-id="alias" name="multi_select" value="' + encodeURIComponent(item.address) + '" />';
|
item.chkbox = '<input type="checkbox" data-id="alias" name="multi_select" value="' + encodeURIComponent(item.id) + '" />';
|
||||||
item.goto = escapeHtml(item.goto.replace(/,/g, " "));
|
item.goto = escapeHtml(item.goto.replace(/,/g, " "));
|
||||||
if (item.is_catch_all == 1) {
|
if (item.is_catch_all == 1) {
|
||||||
item.address = '<div class="label label-default">Catch-All</div> ' + escapeHtml(item.address);
|
item.address = '<div class="label label-default">Catch-All</div> ' + escapeHtml(item.address);
|
||||||
|
|
|
@ -45,7 +45,7 @@ function api_log($_data) {
|
||||||
$redis->lPush('API_LOG', json_encode($log_line));
|
$redis->lPush('API_LOG', json_encode($log_line));
|
||||||
}
|
}
|
||||||
catch (RedisException $e) {
|
catch (RedisException $e) {
|
||||||
$_SESSION['return'] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'msg' => 'Redis: '.$e
|
'msg' => 'Redis: '.$e
|
||||||
);
|
);
|
||||||
|
@ -831,7 +831,7 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
|
||||||
}
|
}
|
||||||
switch ($category) {
|
switch ($category) {
|
||||||
case "alias":
|
case "alias":
|
||||||
process_delete_return(mailbox('delete', 'alias', array('address' => $items)));
|
process_delete_return(mailbox('delete', 'alias', array('id' => $items)));
|
||||||
break;
|
break;
|
||||||
case "relayhost":
|
case "relayhost":
|
||||||
process_delete_return(relayhost('delete', array('id' => $items)));
|
process_delete_return(relayhost('delete', array('id' => $items)));
|
||||||
|
@ -927,7 +927,7 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
|
||||||
process_edit_return(recipient_map('edit', array_merge(array('id' => $items), $attr)));
|
process_edit_return(recipient_map('edit', array_merge(array('id' => $items), $attr)));
|
||||||
break;
|
break;
|
||||||
case "alias":
|
case "alias":
|
||||||
process_edit_return(mailbox('edit', 'alias', array_merge(array('address' => $items), $attr)));
|
process_edit_return(mailbox('edit', 'alias', array_merge(array('id' => $items), $attr)));
|
||||||
break;
|
break;
|
||||||
case "app_links":
|
case "app_links":
|
||||||
process_edit_return(customize('edit', 'app_links', $attr));
|
process_edit_return(customize('edit', 'app_links', $attr));
|
||||||
|
|
|
@ -43,68 +43,71 @@ $lang['danger']['domain_cannot_match_hostname'] = "Domain darf nicht dem Hostnam
|
||||||
$lang['warning']['domain_added_sogo_failed'] = "Domain wurde hinzugefügt; SOGo konnte nicht neugestartet werden";
|
$lang['warning']['domain_added_sogo_failed'] = "Domain wurde hinzugefügt; SOGo konnte nicht neugestartet werden";
|
||||||
$lang['danger']['rl_timeframe'] = "Ratelimit Zeitraum ist inkorrekt";
|
$lang['danger']['rl_timeframe'] = "Ratelimit Zeitraum ist inkorrekt";
|
||||||
$lang['success']['deleted_syncjobs'] = "Syncjobs gelöscht: %s";
|
$lang['success']['deleted_syncjobs'] = "Syncjobs gelöscht: %s";
|
||||||
|
$lang['success']['deleted_syncjob'] = "Syncjobs ID %s gelöscht";
|
||||||
$lang['success']['delete_filters'] = "Filter gelöscht: %s";
|
$lang['success']['delete_filters'] = "Filter gelöscht: %s";
|
||||||
|
$lang['success']['delete_filter'] = "Filter ID %s wurde gelöscht";
|
||||||
$lang['danger']['invalid_bcc_map_type'] = "Ungültiger BCC Map-Typ";
|
$lang['danger']['invalid_bcc_map_type'] = "Ungültiger BCC Map-Typ";
|
||||||
$lang['danger']['bcc_empty'] = "BCC Ziel darf nicht leer sein";
|
$lang['danger']['bcc_empty'] = "BCC Ziel darf nicht leer sein";
|
||||||
$lang['danger']['bcc_must_be_email'] = "BCC Map muss eine gültige E-Mail-Adresse sein";
|
$lang['danger']['bcc_must_be_email'] = "BCC Map %s ist keine gültige E-Mail-Adresse";
|
||||||
$lang['danger']['bcc_exists'] = "Ein BCC Map Eintrag %s existiert bereits als Typ %s";
|
$lang['danger']['bcc_exists'] = "Ein BCC Map Eintrag %s existiert bereits als Typ %s";
|
||||||
$lang['success']['bcc_saved'] = "BCC Map Eintrag wurde gespeichert";
|
$lang['success']['bcc_saved'] = "BCC Map Eintrag wurde gespeichert";
|
||||||
$lang['success']['bcc_edited'] = "BCC Map Eintrag wurde editiert";
|
$lang['success']['bcc_edited'] = "BCC Map Eintrag %s wurde editiert";
|
||||||
$lang['success']['bcc_deleted'] = "BCC Map Einträge gelöscht: %s";
|
$lang['success']['bcc_deleted'] = "BCC Map Einträge gelöscht: %s";
|
||||||
$lang['danger']['private_key_error'] = "Schlüsselfehler: %s";
|
$lang['danger']['private_key_error'] = "Schlüsselfehler: %s";
|
||||||
$lang['danger']['map_content_empty'] = "Inhalt darf nicht leer sein";
|
$lang['danger']['map_content_empty'] = "Inhalt darf nicht leer sein";
|
||||||
$lang['success']['settings_map_added'] = "Regel wurde gespeichert";
|
$lang['success']['settings_map_added'] = "Regel wurde gespeichert";
|
||||||
$lang['danger']['settings_map_invalid'] = "Regel ist ungültig";
|
$lang['danger']['settings_map_invalid'] = "Regel ID %s ist ungültig";
|
||||||
$lang['danger']['settings_map_removed'] = "Regeln wurden entfernt: %s";
|
$lang['danger']['settings_map_removed'] = "Regeln wurden entfernt: %s";
|
||||||
$lang['danger']['invalid_host'] = "Ungültiger Host: %s";
|
$lang['danger']['invalid_host'] = "Ungültiger Host: %s";
|
||||||
$lang['danger']['relayhost_invalid'] = "Relayhost ist ungültig";
|
$lang['danger']['relayhost_invalid'] = "Relayhost %s ist ungültig";
|
||||||
$lang['success']['saved_settings'] = "Regel wurde gespeichert";
|
$lang['success']['saved_settings'] = "Regel wurde gespeichert";
|
||||||
|
|
||||||
$lang['danger']['dkim_domain_or_sel_invalid'] = 'DKIM-Domain oder -Selector nicht korrekt';
|
$lang['danger']['dkim_domain_or_sel_invalid'] = 'DKIM-Domain oder Selektor nicht korrekt: %s';
|
||||||
$lang['success']['dkim_removed'] = 'DKIM-Key wurde entfernt';
|
$lang['success']['dkim_removed'] = 'DKIM-Key wurde entfernt';
|
||||||
$lang['success']['dkim_added'] = 'DKIM-Key wurde hinzugefügt';
|
$lang['success']['dkim_added'] = 'DKIM-Key wurde hinzugefügt';
|
||||||
$lang['danger']['access_denied'] = 'Zugriff verweigert oder unvollständige/ungültige Daten';
|
$lang['danger']['access_denied'] = 'Zugriff verweigert oder unvollständige/ungültige Daten';
|
||||||
$lang['danger']['domain_invalid'] = 'Domainname ist ungültig';
|
$lang['danger']['domain_invalid'] = 'Domainname %s ist ungültig';
|
||||||
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = 'Maximale Größe für Mailboxen überschreitet das Domain Speicherlimit';
|
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = 'Maximale Größe für Mailboxen überschreitet das Domain Speicherlimit';
|
||||||
$lang['danger']['object_is_not_numeric'] = 'Wert %s ist nicht numerisch';
|
$lang['danger']['object_is_not_numeric'] = 'Wert %s ist nicht numerisch';
|
||||||
$lang['success']['domain_added'] = 'Domain %s wurde angelegt';
|
$lang['success']['domain_added'] = 'Domain %s wurde angelegt';
|
||||||
$lang['success']['items_deleted'] = "Objekt(e) %s wurde(n) erfolgreich entfernt";
|
$lang['success']['items_deleted'] = "Objekt(e) %s wurde(n) erfolgreich entfernt";
|
||||||
|
$lang['success']['item_deleted'] = "Objekt %s wurde entfernt";
|
||||||
$lang['danger']['alias_empty'] = 'Alias-Adresse darf nicht leer sein';
|
$lang['danger']['alias_empty'] = 'Alias-Adresse darf nicht leer sein';
|
||||||
$lang['danger']['goto_empty'] = 'Ziel-Adresse darf nicht leer sein';
|
$lang['danger']['goto_empty'] = 'Ziel-Adresse darf nicht leer sein';
|
||||||
$lang['danger']['policy_list_from_exists'] = 'Ein Eintrag mit diesem Wert existiert bereits';
|
$lang['danger']['policy_list_from_exists'] = 'Ein Eintrag mit diesem Wert existiert bereits';
|
||||||
$lang['danger']['policy_list_from_invalid'] = 'Eintrag hat ungültiges Format';
|
$lang['danger']['policy_list_from_invalid'] = 'Eintrag hat ungültiges Format';
|
||||||
$lang['danger']['alias_invalid'] = 'Alias-Adresse ist ungültig';
|
$lang['danger']['alias_invalid'] = 'Alias-Adresse %s ist ungültig';
|
||||||
$lang['danger']['goto_invalid'] = 'Ziel-Adresse ist ungültig';
|
$lang['danger']['goto_invalid'] = 'Ziel-Adresse %s ist ungültig';
|
||||||
$lang['danger']['last_key'] = 'Letzter Key kann nicht gelöscht werden';
|
$lang['danger']['last_key'] = 'Letzter Key kann nicht gelöscht werden';
|
||||||
$lang['danger']['alias_domain_invalid'] = 'Alias-Domain ist ungültig';
|
$lang['danger']['alias_domain_invalid'] = 'Alias-Domain %s ist ungültig';
|
||||||
$lang['danger']['target_domain_invalid'] = 'Ziel-Domain ist ungültig';
|
$lang['danger']['target_domain_invalid'] = 'Ziel-Domain %s ist ungültig';
|
||||||
$lang['danger']['object_exists'] = 'Objekt %s existiert bereits';
|
$lang['danger']['object_exists'] = 'Objekt %s existiert bereits';
|
||||||
$lang['danger']['domain_exists'] = 'Domain %s existiert bereits';
|
$lang['danger']['domain_exists'] = 'Domain %s existiert bereits';
|
||||||
$lang['danger']['alias_goto_identical'] = 'Alias- und Ziel-Adresse dürfen nicht identisch sein';
|
$lang['danger']['alias_goto_identical'] = 'Alias- und Ziel-Adresse dürfen nicht identisch sein';
|
||||||
$lang['danger']['aliasd_targetd_identical'] = 'Alias-Domain darf nicht gleich Ziel-Domain sein';
|
$lang['danger']['aliasd_targetd_identical'] = 'Alias-Domain darf nicht gleich Ziel-Domain sein: %s';
|
||||||
$lang['danger']['maxquota_empty'] = 'Max. Speicherplatz pro Mailbox darf nicht 0 sein.';
|
$lang['danger']['maxquota_empty'] = 'Max. Speicherplatz pro Mailbox darf nicht 0 sein.';
|
||||||
$lang['success']['alias_added'] = 'Alias-Adresse(n) wurden angelegt';
|
$lang['success']['alias_added'] = 'Alias-Adresse %s wurden angelegt';
|
||||||
$lang['success']['alias_modified'] = 'Änderungen an Alias %s wurden gespeichert';
|
$lang['success']['alias_modified'] = 'Änderungen an Alias %s wurden gespeichert';
|
||||||
$lang['success']['aliasd_modified'] = 'Änderungen an Alias-Domain %s wurden gespeichert';
|
$lang['success']['aliasd_modified'] = 'Änderungen an Alias-Domain %s wurden gespeichert';
|
||||||
$lang['success']['mailbox_modified'] = 'Änderungen an Mailbox %s wurden gespeichert';
|
$lang['success']['mailbox_modified'] = 'Änderungen an Mailbox %s wurden gespeichert';
|
||||||
$lang['success']['resource_modified'] = "Änderungen an Ressource %s wurden gespeichert";
|
$lang['success']['resource_modified'] = "Änderungen an Ressource %s wurden gespeichert";
|
||||||
$lang['success']['object_modified'] = "Änderungen an Objekt %s wurden gespeichert";
|
$lang['success']['object_modified'] = "Änderungen an Objekt %s wurden gespeichert";
|
||||||
$lang['success']['f2b_modified'] = "Änderungen an Fail2ban Parametern wurden gespeichert";
|
$lang['success']['f2b_modified'] = "Änderungen an Fail2ban Parametern wurden gespeichert";
|
||||||
$lang['danger']['targetd_not_found'] = 'Ziel-Domain nicht gefunden';
|
$lang['danger']['targetd_not_found'] = 'Ziel-Domain %s nicht gefunden';
|
||||||
$lang['success']['aliasd_added'] = 'Alias-Domain %s wurde angelegt';
|
$lang['success']['aliasd_added'] = 'Alias-Domain %s wurde angelegt';
|
||||||
$lang['success']['aliasd_modified'] = 'Änderungen an Alias-Domain %s wurden gespeichert';
|
$lang['success']['aliasd_modified'] = 'Änderungen an Alias-Domain %s wurden gespeichert';
|
||||||
$lang['success']['domain_modified'] = 'Änderungen an Domain %s wurden gespeichert';
|
$lang['success']['domain_modified'] = 'Änderungen an Domain %s wurden gespeichert';
|
||||||
$lang['success']['domain_admin_modified'] = 'Änderungen an Domain-Administrator %s wurden gespeichert';
|
$lang['success']['domain_admin_modified'] = 'Änderungen an Domain-Administrator %s wurden gespeichert';
|
||||||
$lang['success']['domain_admin_added'] = 'Domain-Administrator %s wurde angelegt';
|
$lang['success']['domain_admin_added'] = 'Domain-Administrator %s wurde angelegt';
|
||||||
$lang['success']['admin_modified'] = 'Änderungen am Administrator wurden gespeichert';
|
$lang['success']['admin_modified'] = 'Änderungen am Administrator wurden gespeichert';
|
||||||
$lang['danger']['username_invalid'] = 'Benutzername kann nicht verwendet werden';
|
$lang['danger']['username_invalid'] = 'Benutzername %s kann nicht verwendet werden';
|
||||||
$lang['danger']['password_mismatch'] = 'Passwort-Wiederholung stimmt nicht überein';
|
$lang['danger']['password_mismatch'] = 'Passwort-Wiederholung stimmt nicht überein';
|
||||||
$lang['danger']['password_complexity'] = 'Passwort entspricht nicht den Richtlinien';
|
$lang['danger']['password_complexity'] = 'Passwort entspricht nicht den Richtlinien';
|
||||||
$lang['danger']['password_empty'] = 'Passwort darf nicht leer sein';
|
$lang['danger']['password_empty'] = 'Passwort darf nicht leer sein';
|
||||||
$lang['danger']['login_failed'] = 'Anmeldung fehlgeschlagen';
|
$lang['danger']['login_failed'] = 'Anmeldung fehlgeschlagen';
|
||||||
$lang['danger']['mailbox_invalid'] = 'Mailboxname ist ungültig';
|
$lang['danger']['mailbox_invalid'] = 'Mailboxname ist ungültig';
|
||||||
$lang['danger']['resource_invalid'] = 'Ressourcenname ist ungültig';
|
$lang['danger']['resource_invalid'] = 'Ressourcenname %s ist ungültig';
|
||||||
$lang['danger']['description_invalid'] = 'Ressourcenbeschreibung ist ungültig';
|
$lang['danger']['description_invalid'] = 'Ressourcenbeschreibung für %s ist ungültig';
|
||||||
$lang['danger']['is_alias'] = '%s lautet bereits eine Alias-Adresse';
|
$lang['danger']['is_alias'] = '%s lautet bereits eine Alias-Adresse';
|
||||||
$lang['danger']['is_alias_or_mailbox'] = "Eine Mailbox, ein Alias oder eine sich aus einer Alias-Domain ergebende Adresse mit dem Namen %s ist bereits vorhanden";
|
$lang['danger']['is_alias_or_mailbox'] = "Eine Mailbox, ein Alias oder eine sich aus einer Alias-Domain ergebende Adresse mit dem Namen %s ist bereits vorhanden";
|
||||||
$lang['danger']['is_spam_alias'] = '%s lautet bereits eine Spam-Alias-Adresse';
|
$lang['danger']['is_spam_alias'] = '%s lautet bereits eine Spam-Alias-Adresse';
|
||||||
|
@ -127,7 +130,7 @@ $lang['danger']['max_quota_in_use'] = 'Mailbox Speicherplatzlimit muss größer
|
||||||
$lang['danger']['domain_quota_m_in_use'] = 'Domain Speicherplatzlimit muss größer oder gleich %d MiB sein';
|
$lang['danger']['domain_quota_m_in_use'] = 'Domain Speicherplatzlimit muss größer oder gleich %d MiB sein';
|
||||||
$lang['danger']['mailboxes_in_use'] = 'Maximale Anzahl an Mailboxen muss größer oder gleich %d sein';
|
$lang['danger']['mailboxes_in_use'] = 'Maximale Anzahl an Mailboxen muss größer oder gleich %d sein';
|
||||||
$lang['danger']['aliases_in_use'] = 'Maximale Anzahl an Aliassen muss größer oder gleich %d sein';
|
$lang['danger']['aliases_in_use'] = 'Maximale Anzahl an Aliassen muss größer oder gleich %d sein';
|
||||||
$lang['danger']['sender_acl_invalid'] = 'Sender ACL Wert muss eine Adresse oder Domain sein';
|
$lang['danger']['sender_acl_invalid'] = 'Sender ACL %s ist ungültig';
|
||||||
$lang['danger']['domain_not_empty'] = 'Kann nur leere Domains entfernen';
|
$lang['danger']['domain_not_empty'] = 'Kann nur leere Domains entfernen';
|
||||||
$lang['danger']['validity_missing'] = 'Bitte geben Sie eine Gültigkeitsdauer an';
|
$lang['danger']['validity_missing'] = 'Bitte geben Sie eine Gültigkeitsdauer an';
|
||||||
$lang['user']['loading'] = "Lade...";
|
$lang['user']['loading'] = "Lade...";
|
||||||
|
@ -562,9 +565,11 @@ $lang['success']['ui_texts'] = "Änderungen an UI-Texten";
|
||||||
$lang['success']['reset_main_logo'] = "Standardgrafik wurde wiederhergestellt";
|
$lang['success']['reset_main_logo'] = "Standardgrafik wurde wiederhergestellt";
|
||||||
$lang['success']['items_released'] = "Ausgewählte Objekte wurden an Mailbox versendet";
|
$lang['success']['items_released'] = "Ausgewählte Objekte wurden an Mailbox versendet";
|
||||||
$lang['danger']['imagick_exception'] = "Fataler Bildverarbeitungsfehler";
|
$lang['danger']['imagick_exception'] = "Fataler Bildverarbeitungsfehler";
|
||||||
|
$lang['quarantine']['learn_spam_delete'] = "Als Spam lernen und löschen";
|
||||||
$lang['quarantine']['quarantine'] = "Quarantäne";
|
$lang['quarantine']['quarantine'] = "Quarantäne";
|
||||||
$lang['quarantine']['qinfo'] = "Das Quarantänesystem speichert abgelehnte Nachrichten in der Datenbank. Dem Sender wird <em>nicht</em> signalisiert, dass seine E-Mail zugestellt wurde.";
|
$lang['quarantine']['qinfo'] = 'Das Quarantänesystem speichert abgelehnte Nachrichten in der Datenbank. Dem Sender wird <em>nicht</em> signalisiert, dass seine E-Mail zugestellt wurde.
|
||||||
|
<br>"' . $lang['quarantine']['learn_spam_delete'] . '" lernt Nachrichten nach bayesscher Statistik als Spam und erstellt Fuzzy Hashes ausgehend von der jeweiligen Nachricht, um ähnliche Inhalte zukünftig zu unterbinden.
|
||||||
|
<br>Der Prozess des Lernens kann abhängig vom System zeitintensiv sein.';
|
||||||
$lang['quarantine']['release'] = "Freigeben";
|
$lang['quarantine']['release'] = "Freigeben";
|
||||||
$lang['quarantine']['empty'] = 'Keine Einträge';
|
$lang['quarantine']['empty'] = 'Keine Einträge';
|
||||||
$lang['quarantine']['toggle_all'] = 'Alle auswählen';
|
$lang['quarantine']['toggle_all'] = 'Alle auswählen';
|
||||||
|
@ -582,6 +587,9 @@ $lang['quarantine']['subj'] = "Betreff";
|
||||||
$lang['quarantine']['text_plain_content'] = "Inhalt (text/plain)";
|
$lang['quarantine']['text_plain_content'] = "Inhalt (text/plain)";
|
||||||
$lang['quarantine']['text_from_html_content'] = "Inhalt (html, konvertiert)";
|
$lang['quarantine']['text_from_html_content'] = "Inhalt (html, konvertiert)";
|
||||||
$lang['quarantine']['atts'] = "Anhänge";
|
$lang['quarantine']['atts'] = "Anhänge";
|
||||||
|
$lang['danger']['fuzzy_learn_error'] = "Fuzzy Lernfehler: %s";
|
||||||
|
$lang['danger']['spam_learn_error'] = "Spam Lernfehler: %s";
|
||||||
|
$lang['success']['qlearn_spam'] = "Nachricht ID %s wurde als Spam gelernt und gelöscht";
|
||||||
|
|
||||||
$lang['header']['quarantine'] = "Quarantäne";
|
$lang['header']['quarantine'] = "Quarantäne";
|
||||||
$lang['header']['debug'] = "Debugging";
|
$lang['header']['debug'] = "Debugging";
|
||||||
|
@ -600,12 +608,15 @@ $lang['quarantine']['release_body'] = "Die ursprüngliche Nachricht wurde als EM
|
||||||
$lang['danger']['release_send_failed'] = "Die Nachricht konnte nicht versendet werden: %s";
|
$lang['danger']['release_send_failed'] = "Die Nachricht konnte nicht versendet werden: %s";
|
||||||
$lang['quarantine']['release_subject'] = "Potentiell schädliche Nachricht aus Quarantäne: %s";
|
$lang['quarantine']['release_subject'] = "Potentiell schädliche Nachricht aus Quarantäne: %s";
|
||||||
|
|
||||||
|
$lang['mailbox']['bcc_map'] = "BCC Map";
|
||||||
$lang['mailbox']['bcc_map_type'] = "BCC Typ";
|
$lang['mailbox']['bcc_map_type'] = "BCC Typ";
|
||||||
$lang['mailbox']['bcc_type'] = "BCC Typ";
|
$lang['mailbox']['bcc_type'] = "BCC Typ";
|
||||||
$lang['mailbox']['bcc_sender_map'] = "Senderabhängig";
|
$lang['mailbox']['bcc_sender_map'] = "Senderabhängig";
|
||||||
$lang['mailbox']['bcc_rcpt_map'] = "Empfängerabhängig";
|
$lang['mailbox']['bcc_rcpt_map'] = "Empfängerabhängig";
|
||||||
$lang['mailbox']['bcc_local_dest'] = "Lokales Ziel";
|
$lang['mailbox']['bcc_local_dest'] = "Lokales Ziel";
|
||||||
$lang['mailbox']['bcc_destinations'] = "BCC Ziel(e)";
|
$lang['mailbox']['bcc_destinations'] = "BCC Ziel";
|
||||||
|
$lang['mailbox']['bcc_destination'] = "BCC Ziel";
|
||||||
|
$lang['edit']['bcc_dest_format'] = 'BCC-Ziel muss eine gültige E-Mail-Adresse sein.';
|
||||||
|
|
||||||
$lang['mailbox']['bcc'] = "BCC";
|
$lang['mailbox']['bcc'] = "BCC";
|
||||||
$lang['mailbox']['bcc_maps'] = "BCC-Maps";
|
$lang['mailbox']['bcc_maps'] = "BCC-Maps";
|
||||||
|
|
|
@ -43,71 +43,74 @@ $lang['danger']['domain_cannot_match_hostname'] = "Domain cannot match hostname"
|
||||||
$lang['warning']['domain_added_sogo_failed'] = "Added domain but failed to restart SOGo, please check your server logs.";
|
$lang['warning']['domain_added_sogo_failed'] = "Added domain but failed to restart SOGo, please check your server logs.";
|
||||||
$lang['danger']['rl_timeframe'] = "Ratelimit time frame is incorrect";
|
$lang['danger']['rl_timeframe'] = "Ratelimit time frame is incorrect";
|
||||||
$lang['success']['deleted_syncjobs'] = "Deleted syncjobs: %s";
|
$lang['success']['deleted_syncjobs'] = "Deleted syncjobs: %s";
|
||||||
|
$lang['success']['deleted_syncjob'] = "Deleted syncjob ID %s";
|
||||||
$lang['success']['delete_filters'] = "Deleted filters: %s";
|
$lang['success']['delete_filters'] = "Deleted filters: %s";
|
||||||
|
$lang['success']['delete_filter'] = "Deleted filters ID %s";
|
||||||
$lang['danger']['invalid_bcc_map_type'] = "Invalid BCC map type";
|
$lang['danger']['invalid_bcc_map_type'] = "Invalid BCC map type";
|
||||||
$lang['danger']['bcc_empty'] = "BCC destination cannot be empty";
|
$lang['danger']['bcc_empty'] = "BCC destination cannot be empty";
|
||||||
$lang['danger']['bcc_must_be_email'] = "BCC map must be a valid email address";
|
$lang['danger']['bcc_must_be_email'] = "BCC map %s is not a valid email address";
|
||||||
$lang['danger']['bcc_exists'] = "A BCC map %s exists for type %s";
|
$lang['danger']['bcc_exists'] = "A BCC map %s exists for type %s";
|
||||||
$lang['success']['bcc_saved'] = "BCC map entry saved";
|
$lang['success']['bcc_saved'] = "BCC map entry saved";
|
||||||
$lang['success']['bcc_edited'] = "BCC map entry edited";
|
$lang['success']['bcc_edited'] = "BCC map entry %s edited";
|
||||||
$lang['success']['bcc_deleted'] = "BCC map entries deleted: %s";
|
$lang['success']['bcc_deleted'] = "BCC map entries deleted: %s";
|
||||||
$lang['danger']['private_key_error'] = "Private key error: %s";
|
$lang['danger']['private_key_error'] = "Private key error: %s";
|
||||||
$lang['danger']['map_content_empty'] = "Map content cannot be empty";
|
$lang['danger']['map_content_empty'] = "Map content cannot be empty";
|
||||||
$lang['success']['settings_map_added'] = "Added settings map entry";
|
$lang['success']['settings_map_added'] = "Added settings map entry";
|
||||||
$lang['danger']['settings_map_invalid'] = "Settings map invalid";
|
$lang['danger']['settings_map_invalid'] = "Settings map ID %s invalid";
|
||||||
$lang['danger']['settings_map_removed'] = "Removed settings map deleted: %s";
|
$lang['danger']['settings_map_removed'] = "Removed settings map deleted: %s";
|
||||||
$lang['danger']['invalid_host'] = "Invalid host specified: %s";
|
$lang['danger']['invalid_host'] = "Invalid host specified: %s";
|
||||||
$lang['danger']['relayhost_invalid'] = "Relayhost is invalid";
|
$lang['danger']['relayhost_invalid'] = "Relayhost %s is invalid";
|
||||||
$lang['success']['saved_settings'] = "Saved settings";
|
$lang['success']['saved_settings'] = "Saved settings";
|
||||||
$lang['success']['db_init_complete'] = "Database initialization completed";
|
$lang['success']['db_init_complete'] = "Database initialization completed";
|
||||||
|
|
||||||
$lang['warning']['session_ua'] = "Form token invalid: User-Agent validation error";
|
$lang['warning']['session_ua'] = "Form token invalid: User-Agent validation error";
|
||||||
$lang['warning']['session_token'] = "Form token invalid: Token mismatch";
|
$lang['warning']['session_token'] = "Form token invalid: Token mismatch";
|
||||||
|
|
||||||
$lang['danger']['dkim_domain_or_sel_invalid'] = "DKIM domain or selector invalid";
|
$lang['danger']['dkim_domain_or_sel_invalid'] = "DKIM domain or selector invalid: %s";
|
||||||
$lang['success']['dkim_removed'] = "DKIM key %s has been removed";
|
$lang['success']['dkim_removed'] = "DKIM key %s has been removed";
|
||||||
$lang['success']['dkim_added'] = "DKIM key has been saved";
|
$lang['success']['dkim_added'] = "DKIM key has been saved";
|
||||||
$lang['danger']['access_denied'] = "Access denied or invalid form data";
|
$lang['danger']['access_denied'] = "Access denied or invalid form data";
|
||||||
$lang['danger']['domain_invalid'] = "Domain name is invalid";
|
$lang['danger']['domain_invalid'] = "Domain name %s is invalid";
|
||||||
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "Max. quota exceeds domain quota limit";
|
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "Max. quota exceeds domain quota limit";
|
||||||
$lang['danger']['object_is_not_numeric'] = "Value %s is not numeric";
|
$lang['danger']['object_is_not_numeric'] = "Value %s is not numeric";
|
||||||
$lang['success']['domain_added'] = "Added domain %s";
|
$lang['success']['domain_added'] = "Added domain %s";
|
||||||
$lang['success']['items_deleted'] = "Item %s successfully deleted";
|
$lang['success']['items_deleted'] = "Item %s successfully deleted";
|
||||||
|
$lang['success']['item_deleted'] = "Item %s successfully deleted";
|
||||||
$lang['danger']['alias_empty'] = "Alias address must not be empty";
|
$lang['danger']['alias_empty'] = "Alias address must not be empty";
|
||||||
$lang['danger']['last_key'] = 'Last key cannot be deleted';
|
$lang['danger']['last_key'] = 'Last key cannot be deleted';
|
||||||
$lang['danger']['goto_empty'] = "Goto address must not be empty";
|
$lang['danger']['goto_empty'] = "Goto address must not be empty";
|
||||||
$lang['danger']['policy_list_from_exists'] = "A record with given name exists";
|
$lang['danger']['policy_list_from_exists'] = "A record with given name exists";
|
||||||
$lang['danger']['policy_list_from_invalid'] = "Record has invalid format";
|
$lang['danger']['policy_list_from_invalid'] = "Record has invalid format";
|
||||||
$lang['danger']['alias_invalid'] = "Alias address is invalid";
|
$lang['danger']['alias_invalid'] = "Alias address %s is invalid";
|
||||||
$lang['danger']['goto_invalid'] = "Goto address is invalid";
|
$lang['danger']['goto_invalid'] = "Goto address %s is invalid";
|
||||||
$lang['danger']['alias_domain_invalid'] = "Alias domain is invalid";
|
$lang['danger']['alias_domain_invalid'] = "Alias domain %s is invalid";
|
||||||
$lang['danger']['target_domain_invalid'] = "Goto domain is invalid";
|
$lang['danger']['target_domain_invalid'] = "Target domain %s is invalid";
|
||||||
$lang['danger']['object_exists'] = "Object %s already exists";
|
$lang['danger']['object_exists'] = "Object %s already exists";
|
||||||
$lang['danger']['domain_exists'] = "Domain %s already exists";
|
$lang['danger']['domain_exists'] = "Domain %s already exists";
|
||||||
$lang['danger']['alias_goto_identical'] = "Alias and goto address must not be identical";
|
$lang['danger']['alias_goto_identical'] = "Alias and goto address must not be identical";
|
||||||
$lang['danger']['aliasd_targetd_identical'] = "Alias domain must not be equal to target domain";
|
$lang['danger']['aliasd_targetd_identical'] = "Alias domain must not be equal to target domain: %s";
|
||||||
$lang['danger']['maxquota_empty'] = 'Max. quota per mailbox must not be 0.';
|
$lang['danger']['maxquota_empty'] = 'Max. quota per mailbox must not be 0.';
|
||||||
$lang['success']['alias_added'] = "Alias address/es has/have been added";
|
$lang['success']['alias_added'] = "Alias address %s has been added";
|
||||||
$lang['success']['alias_modified'] = "Changes to alias/es %s have been saved";
|
$lang['success']['alias_modified'] = "Changes to alias address %s have been saved";
|
||||||
$lang['success']['mailbox_modified'] = "Changes to mailbox %s have been saved";
|
$lang['success']['mailbox_modified'] = "Changes to mailbox %s have been saved";
|
||||||
$lang['success']['resource_modified'] = "Changes to mailbox %s have been saved";
|
$lang['success']['resource_modified'] = "Changes to mailbox %s have been saved";
|
||||||
$lang['success']['object_modified'] = "Changes to object %s have been saved";
|
$lang['success']['object_modified'] = "Changes to object %s have been saved";
|
||||||
$lang['success']['f2b_modified'] = "Changes to Fail2ban parameters have been saved";
|
$lang['success']['f2b_modified'] = "Changes to Fail2ban parameters have been saved";
|
||||||
$lang['danger']['targetd_not_found'] = "Target domain not found";
|
$lang['danger']['targetd_not_found'] = "Target domain %s not found";
|
||||||
$lang['success']['aliasd_added'] = "Added alias domain %s";
|
$lang['success']['aliasd_added'] = "Added alias domain %s";
|
||||||
$lang['success']['aliasd_modified'] = "Changes to alias domain %s have been saved";
|
$lang['success']['aliasd_modified'] = "Changes to alias domain %s have been saved";
|
||||||
$lang['success']['domain_modified'] = "Changes to domain %s have been saved";
|
$lang['success']['domain_modified'] = "Changes to domain %s have been saved";
|
||||||
$lang['success']['domain_admin_modified'] = "Changes to domain administrator %s have been saved";
|
$lang['success']['domain_admin_modified'] = "Changes to domain administrator %s have been saved";
|
||||||
$lang['success']['domain_admin_added'] = "Domain administrator %s has been added";
|
$lang['success']['domain_admin_added'] = "Domain administrator %s has been added";
|
||||||
$lang['success']['admin_modified'] = "Changes to administrator have been saved";
|
$lang['success']['admin_modified'] = "Changes to administrator have been saved";
|
||||||
$lang['danger']['username_invalid'] = "Username cannot be used";
|
$lang['danger']['username_invalid'] = "Username %s cannot be used";
|
||||||
$lang['danger']['password_mismatch'] = "Confirmation password does not match";
|
$lang['danger']['password_mismatch'] = "Confirmation password does not match";
|
||||||
$lang['danger']['password_complexity'] = "Password does not meet the policy";
|
$lang['danger']['password_complexity'] = "Password does not meet the policy";
|
||||||
$lang['danger']['password_empty'] = "Password must not be empty";
|
$lang['danger']['password_empty'] = "Password must not be empty";
|
||||||
$lang['danger']['login_failed'] = "Login failed";
|
$lang['danger']['login_failed'] = "Login failed";
|
||||||
$lang['danger']['mailbox_invalid'] = "Mailbox name is invalid";
|
$lang['danger']['mailbox_invalid'] = "Mailbox name is invalid";
|
||||||
$lang['danger']['description_invalid'] = 'Resource description is invalid';
|
$lang['danger']['description_invalid'] = 'Resource description for %s is invalid';
|
||||||
$lang['danger']['resource_invalid'] = "Resource name is invalid";
|
$lang['danger']['resource_invalid'] = "Resource name %s is invalid";
|
||||||
$lang['danger']['is_alias'] = "%s is already known as an alias address";
|
$lang['danger']['is_alias'] = "%s is already known as an alias address";
|
||||||
$lang['danger']['is_alias_or_mailbox'] = "%s is already known as an alias, a mailbox or an alias address expanded from an alias domain.";
|
$lang['danger']['is_alias_or_mailbox'] = "%s is already known as an alias, a mailbox or an alias address expanded from an alias domain.";
|
||||||
$lang['danger']['is_spam_alias'] = "%s is already known as a spam alias address";
|
$lang['danger']['is_spam_alias'] = "%s is already known as a spam alias address";
|
||||||
|
@ -130,7 +133,7 @@ $lang['danger']['max_quota_in_use'] = "Mailbox quota must be greater or equal to
|
||||||
$lang['danger']['domain_quota_m_in_use'] = "Domain quota must be greater or equal to %s MiB";
|
$lang['danger']['domain_quota_m_in_use'] = "Domain quota must be greater or equal to %s MiB";
|
||||||
$lang['danger']['mailboxes_in_use'] = "Max. mailboxes must be greater or equal to %d";
|
$lang['danger']['mailboxes_in_use'] = "Max. mailboxes must be greater or equal to %d";
|
||||||
$lang['danger']['aliases_in_use'] = "Max. aliases must be greater or equal to %d";
|
$lang['danger']['aliases_in_use'] = "Max. aliases must be greater or equal to %d";
|
||||||
$lang['danger']['sender_acl_invalid'] = "Sender ACL value is invalid";
|
$lang['danger']['sender_acl_invalid'] = "Sender ACL value %s is invalid";
|
||||||
$lang['danger']['domain_not_empty'] = "Cannot remove non-empty domain";
|
$lang['danger']['domain_not_empty'] = "Cannot remove non-empty domain";
|
||||||
$lang['danger']['validity_missing'] = 'Please assign a period of validity';
|
$lang['danger']['validity_missing'] = 'Please assign a period of validity';
|
||||||
$lang['user']['loading'] = "Loading...";
|
$lang['user']['loading'] = "Loading...";
|
||||||
|
@ -573,10 +576,13 @@ $lang['success']['app_links'] = "Saved changes to app links";
|
||||||
$lang['success']['ui_texts'] = "Saved changes to UI texts";
|
$lang['success']['ui_texts'] = "Saved changes to UI texts";
|
||||||
$lang['success']['reset_main_logo'] = "Reset to default logo";
|
$lang['success']['reset_main_logo'] = "Reset to default logo";
|
||||||
$lang['success']['items_released'] = "Selected items were released";
|
$lang['success']['items_released'] = "Selected items were released";
|
||||||
|
$lang['success']['item_released'] = "Item %s released";
|
||||||
$lang['danger']['imagick_exception'] = "Error: Imagick exception while reading image";
|
$lang['danger']['imagick_exception'] = "Error: Imagick exception while reading image";
|
||||||
|
|
||||||
$lang['quarantine']['quarantine'] = "Quarantine";
|
$lang['quarantine']['quarantine'] = "Quarantine";
|
||||||
$lang['quarantine']['qinfo'] = "The quarantine system will save rejected mail to the database, while the sender will <em>not</em> be given the impression of a delivered mail.";
|
$lang['quarantine']['learn_spam_delete'] = "Learn as spam and delete";
|
||||||
|
$lang['quarantine']['qinfo'] = 'The quarantine system will save rejected mail to the database, while the sender will <em>not</em> be given the impression of a delivered mail.
|
||||||
|
<br>"' . $lang['quarantine']['learn_spam_delete'] . '" will learn a message as spam via Bayesian theorem and also calculate fuzzy hashes to deny similar messages in the future.
|
||||||
|
<br>Please be aware that learning multiple messages can be - depending on your system - time consuming.';
|
||||||
$lang['quarantine']['release'] = "Release";
|
$lang['quarantine']['release'] = "Release";
|
||||||
$lang['quarantine']['empty'] = 'No results';
|
$lang['quarantine']['empty'] = 'No results';
|
||||||
$lang['quarantine']['toggle_all'] = 'Toggle all';
|
$lang['quarantine']['toggle_all'] = 'Toggle all';
|
||||||
|
@ -594,6 +600,9 @@ $lang['quarantine']['subj'] = "Subject";
|
||||||
$lang['quarantine']['text_plain_content'] = "Content (text/plain)";
|
$lang['quarantine']['text_plain_content'] = "Content (text/plain)";
|
||||||
$lang['quarantine']['text_from_html_content'] = "Content (converted html)";
|
$lang['quarantine']['text_from_html_content'] = "Content (converted html)";
|
||||||
$lang['quarantine']['atts'] = "Attachments";
|
$lang['quarantine']['atts'] = "Attachments";
|
||||||
|
$lang['danger']['fuzzy_learn_error'] = "Fuzzy hash learn error: %s";
|
||||||
|
$lang['danger']['spam_learn_error'] = "Spam learn error: %s";
|
||||||
|
$lang['success']['qlearn_spam'] = "Message ID %s was learned as spam and deleted";
|
||||||
|
|
||||||
$lang['header']['quarantine'] = "Quarantine";
|
$lang['header']['quarantine'] = "Quarantine";
|
||||||
$lang['header']['debug'] = "Debug";
|
$lang['header']['debug'] = "Debug";
|
||||||
|
@ -612,12 +621,15 @@ $lang['quarantine']['release_body'] = "We have attached your message as eml file
|
||||||
$lang['danger']['release_send_failed'] = "Message could not be released: %s";
|
$lang['danger']['release_send_failed'] = "Message could not be released: %s";
|
||||||
$lang['quarantine']['release_subject'] = "Potentially damaging quarantine item %s";
|
$lang['quarantine']['release_subject'] = "Potentially damaging quarantine item %s";
|
||||||
|
|
||||||
|
$lang['mailbox']['bcc_map'] = "BCC map";
|
||||||
$lang['mailbox']['bcc_map_type'] = "BCC type";
|
$lang['mailbox']['bcc_map_type'] = "BCC type";
|
||||||
$lang['mailbox']['bcc_type'] = "BCC type";
|
$lang['mailbox']['bcc_type'] = "BCC type";
|
||||||
$lang['mailbox']['bcc_sender_map'] = "Sender map";
|
$lang['mailbox']['bcc_sender_map'] = "Sender map";
|
||||||
$lang['mailbox']['bcc_rcpt_map'] = "Recipient map";
|
$lang['mailbox']['bcc_rcpt_map'] = "Recipient map";
|
||||||
$lang['mailbox']['bcc_local_dest'] = "Local destination";
|
$lang['mailbox']['bcc_local_dest'] = "Local destination";
|
||||||
$lang['mailbox']['bcc_destinations'] = "BCC destination/s";
|
$lang['mailbox']['bcc_destinations'] = "BCC destination";
|
||||||
|
$lang['mailbox']['bcc_destination'] = "BCC destination";
|
||||||
|
$lang['edit']['bcc_dest_format'] = 'BCC destination must be a single valid email address.';
|
||||||
|
|
||||||
$lang['mailbox']['bcc'] = "BCC";
|
$lang['mailbox']['bcc'] = "BCC";
|
||||||
$lang['mailbox']['bcc_maps'] = "BCC maps";
|
$lang['mailbox']['bcc_maps'] = "BCC maps";
|
||||||
|
|
|
@ -56,7 +56,7 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
|
||||||
<h3 class="modal-title"><?=$lang['admin']['add_domain_admin'];?></h3>
|
<h3 class="modal-title"><?=$lang['admin']['add_domain_admin'];?></h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<form class="form-horizontal" data-cached-form="true" data-id="domain_admin" role="form" method="post">
|
<form class="form-horizontal" data-cached-form="true" data-id="add_domain_admin" role="form" method="post">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-sm-2" for="username"><?=$lang['admin']['username'];?>:</label>
|
<label class="control-label col-sm-2" for="username"><?=$lang['admin']['username'];?>:</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
|
@ -97,7 +97,7 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-offset-2 col-sm-10">
|
<div class="col-sm-offset-2 col-sm-10">
|
||||||
<button class="btn btn-default" id="add_item" data-id="domain_admin" data-api-url='add/domain-admin' data-api-attr='{}' href="#"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> <?=$lang['admin']['add'];?></button>
|
<button class="btn btn-default" id="add_item" data-id="add_domain_admin" data-api-url='add/domain-admin' data-api-attr='{}' href="#"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> <?=$lang['admin']['add'];?></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -614,9 +614,9 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-sm-2" for="bcc_dest"><?=$lang['mailbox']['bcc_destinations'];?>:</label>
|
<label class="control-label col-sm-2" for="bcc_dest"><?=$lang['mailbox']['bcc_destination'];?>:</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<textarea autocorrect="off" spellcheck="false" autocapitalize="none" class="form-control" rows="20" id="bcc_dest" name="bcc_dest" required></textarea>
|
<input type="text" class="form-control" name="bcc_dest" id="bcc_dest">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
|
@ -24,6 +24,8 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li><a id="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"release"}' href="#"><?=$lang['quarantine']['release'];?></a></li>
|
<li><a id="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"release"}' href="#"><?=$lang['quarantine']['release'];?></a></li>
|
||||||
<li role="separator" class="divider"></li>
|
<li role="separator" class="divider"></li>
|
||||||
|
<li><a id="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"learnspam"}' href="#"><?=$lang['quarantine']['learn_spam_delete'];?></a></li>
|
||||||
|
<li role="separator" class="divider"></li>
|
||||||
<li><a id="delete_selected" data-id="qitems" data-api-url='delete/qitem' href="#"><?=$lang['quarantine']['remove'];?></a></li>
|
<li><a id="delete_selected" data-id="qitems" data-api-url='delete/qitem' href="#"><?=$lang['quarantine']['remove'];?></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue