'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; } }