functions.ratelimit.inc.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <?php
  2. function ratelimit($_action, $_scope, $_data = null) {
  3. global $redis;
  4. global $lang;
  5. $_data_log = $_data;
  6. switch ($_action) {
  7. case 'edit':
  8. if (!isset($_SESSION['acl']['ratelimit']) || $_SESSION['acl']['ratelimit'] != "1" ) {
  9. $_SESSION['return'][] = array(
  10. 'type' => 'danger',
  11. 'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
  12. 'msg' => 'access_denied'
  13. );
  14. return false;
  15. }
  16. switch ($_scope) {
  17. case 'domain':
  18. if (!is_array($_data['object'])) {
  19. $objects = array();
  20. $objects[] = $_data['object'];
  21. }
  22. else {
  23. $objects = $_data['object'];
  24. }
  25. foreach ($objects as $object) {
  26. $rl_value = intval($_data['rl_value']);
  27. $rl_frame = $_data['rl_frame'];
  28. if (!in_array($rl_frame, array('s', 'm', 'h'))) {
  29. $_SESSION['return'][] = array(
  30. 'type' => 'danger',
  31. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  32. 'msg' => 'rl_timeframe'
  33. );
  34. continue;
  35. }
  36. if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
  37. $_SESSION['return'][] = array(
  38. 'type' => 'danger',
  39. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  40. 'msg' => 'access_denied'
  41. );
  42. continue;
  43. }
  44. if (empty($rl_value)) {
  45. try {
  46. $redis->hDel('RL_VALUE', $object);
  47. }
  48. catch (RedisException $e) {
  49. $_SESSION['return'][] = array(
  50. 'type' => 'danger',
  51. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  52. 'msg' => array('redis_error', $e)
  53. );
  54. continue;
  55. }
  56. }
  57. else {
  58. try {
  59. $redis->hSet('RL_VALUE', $object, $rl_value . ' / 1' . $rl_frame);
  60. }
  61. catch (RedisException $e) {
  62. $_SESSION['return'][] = array(
  63. 'type' => 'danger',
  64. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  65. 'msg' => array('redis_error', $e)
  66. );
  67. continue;
  68. }
  69. }
  70. $_SESSION['return'][] = array(
  71. 'type' => 'success',
  72. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  73. 'msg' => array('rl_saved', $object)
  74. );
  75. }
  76. break;
  77. case 'mailbox':
  78. if (!is_array($_data['object'])) {
  79. $objects = array();
  80. $objects[] = $_data['object'];
  81. }
  82. else {
  83. $objects = $_data['object'];
  84. }
  85. foreach ($objects as $object) {
  86. $rl_value = intval($_data['rl_value']);
  87. $rl_frame = $_data['rl_frame'];
  88. if (!in_array($rl_frame, array('s', 'm', 'h'))) {
  89. $_SESSION['return'][] = array(
  90. 'type' => 'danger',
  91. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  92. 'msg' => 'rl_timeframe'
  93. );
  94. continue;
  95. }
  96. if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)
  97. || ($_SESSION['mailcow_cc_role'] != 'admin' && $_SESSION['mailcow_cc_role'] != 'domainadmin')) {
  98. $_SESSION['return'][] = array(
  99. 'type' => 'danger',
  100. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  101. 'msg' => 'access_denied'
  102. );
  103. continue;
  104. }
  105. if (empty($rl_value)) {
  106. try {
  107. $redis->hDel('RL_VALUE', $object);
  108. }
  109. catch (RedisException $e) {
  110. $_SESSION['return'][] = array(
  111. 'type' => 'danger',
  112. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  113. 'msg' => array('redis_error', $e)
  114. );
  115. continue;
  116. }
  117. }
  118. else {
  119. try {
  120. $redis->hSet('RL_VALUE', $object, $rl_value . ' / 1' . $rl_frame);
  121. }
  122. catch (RedisException $e) {
  123. $_SESSION['return'][] = array(
  124. 'type' => 'danger',
  125. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  126. 'msg' => array('redis_error', $e)
  127. );
  128. continue;
  129. }
  130. }
  131. $_SESSION['return'][] = array(
  132. 'type' => 'success',
  133. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  134. 'msg' => array('rl_saved', $object)
  135. );
  136. }
  137. break;
  138. }
  139. break;
  140. case 'get':
  141. switch ($_scope) {
  142. case 'domain':
  143. if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data)) {
  144. return false;
  145. }
  146. try {
  147. if ($rl_value = $redis->hGet('RL_VALUE', $_data)) {
  148. $rl = explode(' / 1', $rl_value);
  149. $data['value'] = $rl[0];
  150. $data['frame'] = $rl[1];
  151. return $data;
  152. }
  153. else {
  154. return false;
  155. }
  156. }
  157. catch (RedisException $e) {
  158. $_SESSION['return'][] = array(
  159. 'type' => 'danger',
  160. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  161. 'msg' => array('redis_error', $e)
  162. );
  163. return false;
  164. }
  165. return false;
  166. break;
  167. case 'mailbox':
  168. if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data)
  169. || ($_SESSION['mailcow_cc_role'] != 'admin' && $_SESSION['mailcow_cc_role'] != 'domainadmin')) {
  170. return false;
  171. }
  172. try {
  173. if ($rl_value = $redis->hGet('RL_VALUE', $_data)) {
  174. $rl = explode(' / 1', $rl_value);
  175. $data['value'] = $rl[0];
  176. $data['frame'] = $rl[1];
  177. return $data;
  178. }
  179. else {
  180. return false;
  181. }
  182. }
  183. catch (RedisException $e) {
  184. $_SESSION['return'][] = array(
  185. 'type' => 'danger',
  186. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  187. 'msg' => array('redis_error', $e)
  188. );
  189. return false;
  190. }
  191. return false;
  192. break;
  193. }
  194. break;
  195. case 'delete':
  196. $data['hash'] = $_data;
  197. if ($_SESSION['mailcow_cc_role'] != 'admin' || !preg_match('/^RL[0-9A-Za-z=]+$/i', trim($data['hash']))) {
  198. $_SESSION['return'][] = array(
  199. 'type' => 'danger',
  200. 'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
  201. 'msg' => 'access_denied'
  202. );
  203. return false;
  204. }
  205. try {
  206. if ($redis->exists($data['hash'])) {
  207. $redis->delete($data['hash']);
  208. $_SESSION['return'][] = array(
  209. 'type' => 'success',
  210. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  211. 'msg' => 'hash_deleted'
  212. );
  213. return true;
  214. }
  215. else {
  216. $_SESSION['return'][] = array(
  217. 'type' => 'warning',
  218. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  219. 'msg' => 'hash_not_found'
  220. );
  221. return false;
  222. }
  223. }
  224. catch (RedisException $e) {
  225. $_SESSION['return'][] = array(
  226. 'type' => 'danger',
  227. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  228. 'msg' => array('redis_error', $e)
  229. );
  230. return false;
  231. }
  232. return false;
  233. break;
  234. }
  235. }