242 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			242 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| function ratelimit($_action, $_scope, $_data = null) {
 | |
|   global $redis;
 | |
|   $_data_log = $_data;
 | |
|   switch ($_action) {
 | |
|     case 'edit':
 | |
|       if (!isset($_SESSION['acl']['ratelimit']) || $_SESSION['acl']['ratelimit'] != "1" ) {
 | |
|         $_SESSION['return'][] = array(
 | |
|           'type' => 'danger',
 | |
|           'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
 | |
|           'msg' => 'access_denied'
 | |
|         );
 | |
|         return false;
 | |
|       }
 | |
|       switch ($_scope) {
 | |
|         case 'domain':
 | |
|           if (!is_array($_data['object'])) {
 | |
|             $objects = array();
 | |
|             $objects[] = $_data['object'];
 | |
|           }
 | |
|           else {
 | |
|             $objects = $_data['object'];
 | |
|           }
 | |
|           foreach ($objects as $object) {
 | |
|             $rl_value = intval($_data['rl_value']);
 | |
|             $rl_frame = $_data['rl_frame'];
 | |
|             if (!in_array($rl_frame, array('s', 'm', 'h', 'd'))) {
 | |
|               $_SESSION['return'][] = array(
 | |
|                 'type' => 'danger',
 | |
|                 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|                 'msg' => 'rl_timeframe'
 | |
|               );
 | |
|               continue;
 | |
|             }
 | |
|             if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
 | |
|               $_SESSION['return'][] = array(
 | |
|                 'type' => 'danger',
 | |
|                 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|                 'msg' => 'access_denied'
 | |
|               );
 | |
|               continue;
 | |
|             }
 | |
|             if (empty($rl_value)) {
 | |
|               try {
 | |
|                 $redis->hDel('RL_VALUE', $object);
 | |
|               }
 | |
|               catch (RedisException $e) {
 | |
|                 $_SESSION['return'][] = array(
 | |
|                   'type' => 'danger',
 | |
|                   'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|                   'msg' => array('redis_error', $e)
 | |
|                 );
 | |
|                 continue;
 | |
|               }
 | |
|             }
 | |
|             else {
 | |
|               try {
 | |
|                 $redis->hSet('RL_VALUE', $object, $rl_value . ' / 1' . $rl_frame);
 | |
|               }
 | |
|               catch (RedisException $e) {
 | |
|                 $_SESSION['return'][] = array(
 | |
|                   'type' => 'danger',
 | |
|                   'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|                   'msg' => array('redis_error', $e)
 | |
|                 );
 | |
|                 continue;
 | |
|               }
 | |
|             }
 | |
|             $_SESSION['return'][] = array(
 | |
|               'type' => 'success',
 | |
|               'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|               'msg' => array('rl_saved', $object)
 | |
|             );
 | |
|           }
 | |
|         break;
 | |
|         case 'mailbox':
 | |
|           if (!is_array($_data['object'])) {
 | |
|             $objects = array();
 | |
|             $objects[] = $_data['object'];
 | |
|           }
 | |
|           else {
 | |
|             $objects = $_data['object'];
 | |
|           }
 | |
|           foreach ($objects as $object) {
 | |
|             $rl_value = intval($_data['rl_value']);
 | |
|             $rl_frame = $_data['rl_frame'];
 | |
|             if (!in_array($rl_frame, array('s', 'm', 'h', 'd'))) {
 | |
|               $_SESSION['return'][] = array(
 | |
|                 'type' => 'danger',
 | |
|                 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|                 'msg' => 'rl_timeframe'
 | |
|               );
 | |
|               continue;
 | |
|             }
 | |
|             if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)
 | |
|               || ($_SESSION['mailcow_cc_role'] != 'admin' && $_SESSION['mailcow_cc_role'] != 'domainadmin')) {
 | |
|               $_SESSION['return'][] = array(
 | |
|                 'type' => 'danger',
 | |
|                 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|                 'msg' => 'access_denied'
 | |
|               );
 | |
|               continue;
 | |
|             }
 | |
|             if (empty($rl_value)) {
 | |
|               try {
 | |
|                 $redis->hDel('RL_VALUE', $object);
 | |
|               }
 | |
|               catch (RedisException $e) {
 | |
|                 $_SESSION['return'][] = array(
 | |
|                   'type' => 'danger',
 | |
|                   'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|                   'msg' => array('redis_error', $e)
 | |
|                 );
 | |
|                 continue;
 | |
|               }
 | |
|             }
 | |
|             else {
 | |
|               try {
 | |
|                 $redis->hSet('RL_VALUE', $object, $rl_value . ' / 1' . $rl_frame);
 | |
|               }
 | |
|               catch (RedisException $e) {
 | |
|                 $_SESSION['return'][] = array(
 | |
|                   'type' => 'danger',
 | |
|                   'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|                   'msg' => array('redis_error', $e)
 | |
|                 );
 | |
|                 continue;
 | |
|               }
 | |
|             }
 | |
|             $_SESSION['return'][] = array(
 | |
|               'type' => 'success',
 | |
|               'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|               'msg' => array('rl_saved', $object)
 | |
|             );
 | |
|           }
 | |
|         break;
 | |
|       }
 | |
|     break;
 | |
|     case 'get':
 | |
|       switch ($_scope) {
 | |
|         case 'domain':
 | |
|           if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data)) {
 | |
|             return false;
 | |
|           }
 | |
|           try {
 | |
|             if ($rl_value = $redis->hGet('RL_VALUE', $_data)) {
 | |
|               $rl = explode(' / 1', $rl_value);
 | |
|               $data['value'] = $rl[0];
 | |
|               $data['frame'] = $rl[1];
 | |
|               return $data;
 | |
|             }
 | |
|             else {
 | |
|               return false;
 | |
|             }
 | |
|           }
 | |
|           catch (RedisException $e) {
 | |
|             $_SESSION['return'][] = array(
 | |
|               'type' => 'danger',
 | |
|               'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|               'msg' => array('redis_error', $e)
 | |
|             );
 | |
|             return false;
 | |
|           }
 | |
|           return false;
 | |
|         break;
 | |
|         case 'mailbox':
 | |
|           if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data)
 | |
|             || ($_SESSION['mailcow_cc_role'] != 'admin' && $_SESSION['mailcow_cc_role'] != 'domainadmin')) {
 | |
|             return false;
 | |
|           }
 | |
|           try {
 | |
|             if ($rl_value = $redis->hGet('RL_VALUE', $_data)) {
 | |
|               $rl = explode(' / 1', $rl_value);
 | |
|               $data['value'] = $rl[0];
 | |
|               $data['frame'] = $rl[1];
 | |
|               return $data;
 | |
|             }
 | |
|             else {
 | |
|               return false;
 | |
|             }
 | |
|           }
 | |
|           catch (RedisException $e) {
 | |
|             $_SESSION['return'][] = array(
 | |
|               'type' => 'danger',
 | |
|               'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|               'msg' => array('redis_error', $e)
 | |
|             );
 | |
|             return false;
 | |
|           }
 | |
|           return false;
 | |
|         break;
 | |
|       }
 | |
|     break;
 | |
|     case 'delete':
 | |
|       $data['hash'] = $_data;
 | |
|       if ($_SESSION['mailcow_cc_role'] != 'admin' || !preg_match('/^RL[0-9A-Za-z=]+$/i', trim($data['hash']))) {
 | |
|         $_SESSION['return'][] = array(
 | |
|           'type' => 'danger',
 | |
|           'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
 | |
|           'msg' => 'access_denied'
 | |
|         );
 | |
|         return false;
 | |
|       }
 | |
|       try {
 | |
|         $data_rllog = $redis->lRange('RL_LOG', 0, -1);
 | |
|         if ($data_rllog) {
 | |
|           foreach ($data_rllog as $json_line) {
 | |
|             if (preg_match('/' . $data['hash'] . '/i', $json_line)) {
 | |
|               $redis->lRem('RL_LOG', $json_line, 0);
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|         if ($redis->type($data['hash']) == Redis::REDIS_HASH) {
 | |
|           $redis->delete($data['hash']);
 | |
|           $_SESSION['return'][] = array(
 | |
|             'type' => 'success',
 | |
|             'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|             'msg' => 'hash_deleted'
 | |
|           );
 | |
|           return true;
 | |
|         }
 | |
|         else {
 | |
|           $_SESSION['return'][] = array(
 | |
|             'type' => 'warning',
 | |
|             'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|             'msg' => 'hash_not_found'
 | |
|           );
 | |
|           return false;
 | |
|         }
 | |
|       }
 | |
|       catch (RedisException $e) {
 | |
|         $_SESSION['return'][] = array(
 | |
|           'type' => 'danger',
 | |
|           'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
 | |
|           'msg' => array('redis_error', $e)
 | |
|         );
 | |
|         return false;
 | |
|       }
 | |
|       return false;
 | |
|     break;
 | |
|   }
 | |
| } | 
