 a11cce6765
			
		
	
	
		a11cce6765
		
	
	
	
	
		
			
			[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 cleaning
		
			
				
	
	
		
			183 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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;
 | |
|   }
 | |
| } |