functions.ratelimit.inc.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. switch ($_scope) {
  9. case 'domain':
  10. if (!is_array($_data['object'])) {
  11. $objects = array();
  12. $objects[] = $_data['object'];
  13. }
  14. else {
  15. $objects = $_data['object'];
  16. }
  17. foreach ($objects as $object) {
  18. $rl_value = intval($_data['rl_value']);
  19. $rl_frame = $_data['rl_frame'];
  20. if (!in_array($rl_frame, array('s', 'm', 'h'))) {
  21. $_SESSION['return'][] = array(
  22. 'type' => 'danger',
  23. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  24. 'msg' => 'rl_timeframe'
  25. );
  26. continue;
  27. }
  28. if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
  29. $_SESSION['return'][] = array(
  30. 'type' => 'danger',
  31. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  32. 'msg' => 'access_denied'
  33. );
  34. continue;
  35. }
  36. if (empty($rl_value)) {
  37. try {
  38. $redis->hDel('RL_VALUE', $object);
  39. }
  40. catch (RedisException $e) {
  41. $_SESSION['return'][] = array(
  42. 'type' => 'danger',
  43. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  44. 'msg' => array('redis_error', $e)
  45. );
  46. continue;
  47. }
  48. }
  49. else {
  50. try {
  51. $redis->hSet('RL_VALUE', $object, $rl_value . ' / 1' . $rl_frame);
  52. }
  53. catch (RedisException $e) {
  54. $_SESSION['return'][] = array(
  55. 'type' => 'danger',
  56. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  57. 'msg' => array('redis_error', $e)
  58. );
  59. continue;
  60. }
  61. }
  62. $_SESSION['return'][] = array(
  63. 'type' => 'success',
  64. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  65. 'msg' => array('object_modified', $object)
  66. );
  67. }
  68. break;
  69. case 'mailbox':
  70. if (!is_array($_data['object'])) {
  71. $objects = array();
  72. $objects[] = $_data['object'];
  73. }
  74. else {
  75. $objects = $_data['object'];
  76. }
  77. foreach ($objects as $object) {
  78. $rl_value = intval($_data['rl_value']);
  79. $rl_frame = $_data['rl_frame'];
  80. if (!in_array($rl_frame, array('s', 'm', 'h'))) {
  81. $_SESSION['return'][] = array(
  82. 'type' => 'danger',
  83. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  84. 'msg' => 'rl_timeframe'
  85. );
  86. continue;
  87. }
  88. if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)
  89. || ($_SESSION['mailcow_cc_role'] != 'admin' && $_SESSION['mailcow_cc_role'] != 'domainadmin')) {
  90. $_SESSION['return'][] = array(
  91. 'type' => 'danger',
  92. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  93. 'msg' => 'access_denied'
  94. );
  95. continue;
  96. }
  97. if (empty($rl_value)) {
  98. try {
  99. $redis->hDel('RL_VALUE', $object);
  100. }
  101. catch (RedisException $e) {
  102. $_SESSION['return'][] = array(
  103. 'type' => 'danger',
  104. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  105. 'msg' => array('redis_error', $e)
  106. );
  107. continue;
  108. }
  109. }
  110. else {
  111. try {
  112. $redis->hSet('RL_VALUE', $object, $rl_value . ' / 1' . $rl_frame);
  113. }
  114. catch (RedisException $e) {
  115. $_SESSION['return'][] = array(
  116. 'type' => 'danger',
  117. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  118. 'msg' => array('redis_error', $e)
  119. );
  120. continue;
  121. }
  122. }
  123. $_SESSION['return'][] = array(
  124. 'type' => 'success',
  125. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  126. 'msg' => array('object_modified', $object)
  127. );
  128. }
  129. break;
  130. }
  131. break;
  132. case 'get':
  133. switch ($_scope) {
  134. case 'domain':
  135. if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data)) {
  136. return false;
  137. }
  138. try {
  139. if ($rl_value = $redis->hGet('RL_VALUE', $_data)) {
  140. $rl = explode(' / 1', $rl_value);
  141. $data['value'] = $rl[0];
  142. $data['frame'] = $rl[1];
  143. return $data;
  144. }
  145. else {
  146. return false;
  147. }
  148. }
  149. catch (RedisException $e) {
  150. $_SESSION['return'][] = array(
  151. 'type' => 'danger',
  152. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  153. 'msg' => array('redis_error', $e)
  154. );
  155. return false;
  156. }
  157. return false;
  158. break;
  159. case 'mailbox':
  160. if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data)
  161. || ($_SESSION['mailcow_cc_role'] != 'admin' && $_SESSION['mailcow_cc_role'] != 'domainadmin')) {
  162. return false;
  163. }
  164. try {
  165. if ($rl_value = $redis->hGet('RL_VALUE', $_data)) {
  166. $rl = explode(' / 1', $rl_value);
  167. $data['value'] = $rl[0];
  168. $data['frame'] = $rl[1];
  169. return $data;
  170. }
  171. else {
  172. return false;
  173. }
  174. }
  175. catch (RedisException $e) {
  176. $_SESSION['return'][] = array(
  177. 'type' => 'danger',
  178. 'log' => array(__FUNCTION__, $_action, $_scope, $_data_log),
  179. 'msg' => array('redis_error', $e)
  180. );
  181. return false;
  182. }
  183. return false;
  184. break;
  185. }
  186. break;
  187. }
  188. }