git subrepo clone https://github.com/mailcow/mailcow-dockerized.git mailcow/src/mailcow-dockerized
subrepo: subdir: "mailcow/src/mailcow-dockerized"
merged: "a832becb"
upstream: origin: "https://github.com/mailcow/mailcow-dockerized.git"
branch: "master"
commit: "a832becb"
git-subrepo: version: "0.4.3"
origin: "???"
commit: "???"
Change-Id: If5be2d621a211e164c9b6577adaa7884449f16b5
diff --git a/mailcow/src/mailcow-dockerized/data/web/inc/functions.fwdhost.inc.php b/mailcow/src/mailcow-dockerized/data/web/inc/functions.fwdhost.inc.php
new file mode 100644
index 0000000..5c511f4
--- /dev/null
+++ b/mailcow/src/mailcow-dockerized/data/web/inc/functions.fwdhost.inc.php
@@ -0,0 +1,183 @@
+<?php
+function fwdhost($_action, $_data = null) {
+ require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/spf.inc.php';
+ global $redis;
+ global $lang;
+ $_data_log = $_data;
+ switch ($_action) {
+ case 'add':
+ global $lang;
+ if ($_SESSION['mailcow_cc_role'] != "admin") {
+ $_SESSION['return'][] = array(
+ 'type' => 'danger',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
+ 'msg' => 'access_denied'
+ );
+ 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',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
+ 'msg' => array('invalid_host', htmlspecialchars($host))
+ );
+ 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',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
+ 'msg' => array('redis_error', $e)
+ );
+ return false;
+ }
+ }
+ $_SESSION['return'][] = array(
+ 'type' => 'success',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
+ 'msg' => array('forwarding_host_added', htmlspecialchars(implode(', ', $hosts)))
+ );
+ break;
+ case 'edit':
+ global $lang;
+ if ($_SESSION['mailcow_cc_role'] != "admin") {
+ $_SESSION['return'][] = array(
+ 'type' => 'danger',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
+ 'msg' => 'access_denied'
+ );
+ 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',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
+ 'msg' => 'access_denied'
+ );
+ continue;
+ }
+ 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',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
+ 'msg' => array('redis_error', $e)
+ );
+ continue;
+ }
+ $_SESSION['return'][] = array(
+ 'type' => 'success',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
+ 'msg' => array('object_modified', htmlspecialchars($fwdhost))
+ );
+ }
+ 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',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
+ 'msg' => array('redis_error', $e)
+ );
+ continue;
+ }
+ $_SESSION['return'][] = array(
+ 'type' => 'success',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
+ 'msg' => array('forwarding_host_removed', htmlspecialchars($host))
+ );
+ }
+ 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',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
+ 'msg' => array('redis_error', $e)
+ );
+ 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',
+ 'log' => array(__FUNCTION__, $_action, $_data_log),
+ 'msg' => array('redis_error', $e)
+ );
+ return false;
+ }
+ return $fwdhostdetails;
+ break;
+ }
+}
\ No newline at end of file