| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 | <?phpfunction 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;  }}
 |