2017-05-27 05:02:04 +08:00
|
|
|
<?php
|
|
|
|
function fwdhost($_action, $_data = null) {
|
|
|
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/spf.inc.php';
|
|
|
|
global $redis;
|
|
|
|
global $lang;
|
2018-08-04 02:31:33 +08:00
|
|
|
$_data_log = $_data;
|
2017-05-27 05:02:04 +08:00
|
|
|
switch ($_action) {
|
|
|
|
case 'add':
|
|
|
|
global $lang;
|
|
|
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
|
|
|
$_SESSION['return'] = array(
|
|
|
|
'type' => 'danger',
|
2018-08-04 02:31:33 +08:00
|
|
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
|
|
'msg' => 'access_denied'
|
2017-05-27 05:02:04 +08:00
|
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
$source = $_data['hostname'];
|
|
|
|
$host = trim($_data['hostname']);
|
|
|
|
$filter_spam = (isset($_data['filter_spam']) && $_data['filter_spam'] == 1) ? 1 : 0;
|
|
|
|
if (preg_match('/^[0-9a-fA-F:\/]+$/', $host)) { // IPv6 address
|
|
|
|
$hosts = array($host);
|
|
|
|
}
|
|
|
|
elseif (preg_match('/^[0-9\.\/]+$/', $host)) { // IPv4 address
|
|
|
|
$hosts = array($host);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$hosts = get_outgoing_hosts_best_guess($host);
|
|
|
|
}
|
|
|
|
if (empty($hosts)) {
|
|
|
|
$_SESSION['return'] = array(
|
|
|
|
'type' => 'danger',
|
2018-08-04 02:31:33 +08:00
|
|
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
|
|
'msg' => array('invalid_host', htmlspecialchars($host))
|
2017-05-27 05:02:04 +08:00
|
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
foreach ($hosts as $host) {
|
|
|
|
try {
|
|
|
|
$redis->hSet('WHITELISTED_FWD_HOST', $host, $source);
|
|
|
|
if ($filter_spam == 0) {
|
|
|
|
$redis->hSet('KEEP_SPAM', $host, 1);
|
|
|
|
}
|
|
|
|
elseif ($redis->hGet('KEEP_SPAM', $host)) {
|
|
|
|
$redis->hDel('KEEP_SPAM', $host);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (RedisException $e) {
|
|
|
|
$_SESSION['return'] = array(
|
|
|
|
'type' => 'danger',
|
2018-08-04 02:31:33 +08:00
|
|
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
|
|
'msg' => array('redis_error', $e)
|
2017-05-27 05:02:04 +08:00
|
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$_SESSION['return'] = array(
|
|
|
|
'type' => 'success',
|
2018-08-04 02:31:33 +08:00
|
|
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
|
|
'msg' => array('forwarding_host_added', htmlspecialchars(implode(', ', $hosts)))
|
2017-05-27 05:02:04 +08:00
|
|
|
);
|
|
|
|
break;
|
|
|
|
case 'edit':
|
|
|
|
global $lang;
|
|
|
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
|
|
|
$_SESSION['return'] = array(
|
|
|
|
'type' => 'danger',
|
2018-08-04 02:31:33 +08:00
|
|
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
|
|
'msg' => 'access_denied'
|
2017-05-27 05:02:04 +08:00
|
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
$fwdhosts = (array)$_data['fwdhost'];
|
|
|
|
foreach ($fwdhosts as $fwdhost) {
|
|
|
|
$is_now = fwdhost('details', $fwdhost);
|
|
|
|
if (!empty($is_now)) {
|
|
|
|
$keep_spam = (isset($_data['keep_spam'])) ? $_data['keep_spam'] : $is_now['keep_spam'];
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$_SESSION['return'] = array(
|
|
|
|
'type' => 'danger',
|
2018-08-04 02:31:33 +08:00
|
|
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
|
|
'msg' => 'access_denied'
|
2017-05-27 05:02:04 +08:00
|
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
if ($keep_spam == 1) {
|
|
|
|
$redis->hSet('KEEP_SPAM', $fwdhost, 1);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$redis->hDel('KEEP_SPAM', $fwdhost);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (RedisException $e) {
|
|
|
|
$_SESSION['return'] = array(
|
|
|
|
'type' => 'danger',
|
2018-08-04 02:31:33 +08:00
|
|
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
|
|
'msg' => array('redis_error', $e)
|
2017-05-27 05:02:04 +08:00
|
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$_SESSION['return'] = array(
|
|
|
|
'type' => 'success',
|
2018-08-04 02:31:33 +08:00
|
|
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
|
|
'msg' => array('object_modified', htmlspecialchars(implode(', ', $fwdhosts)))
|
2017-05-27 05:02:04 +08:00
|
|
|
);
|
|
|
|
break;
|
|
|
|
case 'delete':
|
|
|
|
$hosts = (array)$_data['forwardinghost'];
|
|
|
|
foreach ($hosts as $host) {
|
|
|
|
try {
|
|
|
|
$redis->hDel('WHITELISTED_FWD_HOST', $host);
|
|
|
|
$redis->hDel('KEEP_SPAM', $host);
|
|
|
|
}
|
|
|
|
catch (RedisException $e) {
|
|
|
|
$_SESSION['return'] = array(
|
|
|
|
'type' => 'danger',
|
2018-08-04 02:31:33 +08:00
|
|
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
|
|
'msg' => array('redis_error', $e)
|
2017-05-27 05:02:04 +08:00
|
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$_SESSION['return'] = array(
|
|
|
|
'type' => 'success',
|
2018-08-04 02:31:33 +08:00
|
|
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
|
|
'msg' => array('forwarding_host_removed', htmlspecialchars(implode(', ', $hosts)))
|
2017-05-27 05:02:04 +08:00
|
|
|
);
|
|
|
|
break;
|
|
|
|
case 'get':
|
|
|
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
$fwdhostsdata = array();
|
|
|
|
try {
|
|
|
|
$fwd_hosts = $redis->hGetAll('WHITELISTED_FWD_HOST');
|
|
|
|
if (!empty($fwd_hosts)) {
|
|
|
|
foreach ($fwd_hosts as $fwd_host => $source) {
|
|
|
|
$keep_spam = ($redis->hGet('KEEP_SPAM', $fwd_host)) ? "yes" : "no";
|
|
|
|
$fwdhostsdata[] = array(
|
|
|
|
'host' => $fwd_host,
|
|
|
|
'source' => $source,
|
|
|
|
'keep_spam' => $keep_spam
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (RedisException $e) {
|
|
|
|
$_SESSION['return'] = array(
|
|
|
|
'type' => 'danger',
|
2018-08-04 02:31:33 +08:00
|
|
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
|
|
'msg' => array('redis_error', $e)
|
2017-05-27 05:02:04 +08:00
|
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return $fwdhostsdata;
|
|
|
|
break;
|
|
|
|
case 'details':
|
|
|
|
$fwdhostdetails = array();
|
|
|
|
if (!isset($_data) || empty($_data)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
if ($source = $redis->hGet('WHITELISTED_FWD_HOST', $_data)) {
|
|
|
|
$fwdhostdetails['host'] = $_data;
|
|
|
|
$fwdhostdetails['source'] = $source;
|
|
|
|
$fwdhostdetails['keep_spam'] = ($redis->hGet('KEEP_SPAM', $_data)) ? "yes" : "no";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (RedisException $e) {
|
|
|
|
$_SESSION['return'] = array(
|
|
|
|
'type' => 'danger',
|
2018-08-04 02:31:33 +08:00
|
|
|
'log' => array(__FUNCTION__, $_action, $_data_log),
|
|
|
|
'msg' => array('redis_error', $e)
|
2017-05-27 05:02:04 +08:00
|
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return $fwdhostdetails;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|