2
0

functions.rspamd.inc.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <?php
  2. function rsettings($_action, $_data = null) {
  3. global $pdo;
  4. global $lang;
  5. $_data_log = $_data;
  6. switch ($_action) {
  7. case 'add':
  8. if ($_SESSION['mailcow_cc_role'] != "admin") {
  9. $_SESSION['return'][] = array(
  10. 'type' => 'danger',
  11. 'log' => array(__FUNCTION__, $_action, $_data_log),
  12. 'msg' => 'access_denied'
  13. );
  14. return false;
  15. }
  16. $content = $_data['content'];
  17. $desc = $_data['desc'];
  18. $active = intval($_data['active']);
  19. if (empty($content)) {
  20. $_SESSION['return'][] = array(
  21. 'type' => 'danger',
  22. 'log' => array(__FUNCTION__, $_action, $_data_log),
  23. 'msg' => 'map_content_empty'
  24. );
  25. return false;
  26. }
  27. $stmt = $pdo->prepare("INSERT INTO `settingsmap` (`content`, `desc`, `active`)
  28. VALUES (:content, :desc, :active)");
  29. $stmt->execute(array(
  30. ':content' => $content,
  31. ':desc' => $desc,
  32. ':active' => $active
  33. ));
  34. $_SESSION['return'][] = array(
  35. 'type' => 'success',
  36. 'log' => array(__FUNCTION__, $_action, $_data_log),
  37. 'msg' => 'settings_map_added'
  38. );
  39. break;
  40. case 'edit':
  41. if ($_SESSION['mailcow_cc_role'] != "admin") {
  42. $_SESSION['return'][] = array(
  43. 'type' => 'danger',
  44. 'log' => array(__FUNCTION__, $_action, $_data_log),
  45. 'msg' => 'access_denied'
  46. );
  47. return false;
  48. }
  49. $ids = (array)$_data['id'];
  50. foreach ($ids as $id) {
  51. $is_now = rsettings('details', $id);
  52. if (!empty($is_now)) {
  53. $content = (!empty($_data['content'])) ? $_data['content'] : $is_now['content'];
  54. $desc = (!empty($_data['desc'])) ? $_data['desc'] : $is_now['desc'];
  55. $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active'];
  56. }
  57. else {
  58. $_SESSION['return'][] = array(
  59. 'type' => 'danger',
  60. 'log' => array(__FUNCTION__, $_action, $_data_log),
  61. 'msg' => array('settings_map_invalid', $id)
  62. );
  63. continue;
  64. }
  65. $content = trim($content);
  66. $stmt = $pdo->prepare("UPDATE `settingsmap` SET
  67. `content` = :content,
  68. `desc` = :desc,
  69. `active` = :active
  70. WHERE `id` = :id");
  71. $stmt->execute(array(
  72. ':content' => $content,
  73. ':desc' => $desc,
  74. ':active' => $active,
  75. ':id' => $id
  76. ));
  77. $_SESSION['return'][] = array(
  78. 'type' => 'success',
  79. 'log' => array(__FUNCTION__, $_action, $_data_log),
  80. 'msg' => array('object_modified', htmlspecialchars(implode(',', $ids)))
  81. );
  82. }
  83. break;
  84. case 'delete':
  85. if ($_SESSION['mailcow_cc_role'] != "admin") {
  86. $_SESSION['return'][] = array(
  87. 'type' => 'danger',
  88. 'log' => array(__FUNCTION__, $_action, $_data_log),
  89. 'msg' => 'access_denied'
  90. );
  91. return false;
  92. }
  93. $ids = (array)$_data['id'];
  94. foreach ($ids as $id) {
  95. $stmt = $pdo->prepare("DELETE FROM `settingsmap` WHERE `id`= :id");
  96. $stmt->execute(array(':id' => $id));
  97. $_SESSION['return'][] = array(
  98. 'type' => 'success',
  99. 'log' => array(__FUNCTION__, $_action, $_data_log),
  100. 'msg' => array('settings_map_removed', htmlspecialchars($id))
  101. );
  102. }
  103. break;
  104. case 'get':
  105. if ($_SESSION['mailcow_cc_role'] != "admin") {
  106. return false;
  107. }
  108. $settingsmaps = array();
  109. $stmt = $pdo->query("SELECT `id`, `desc`, `active` FROM `settingsmap`");
  110. $settingsmaps = $stmt->fetchAll(PDO::FETCH_ASSOC);
  111. return $settingsmaps;
  112. break;
  113. case 'details':
  114. if ($_SESSION['mailcow_cc_role'] != "admin" || !isset($_data)) {
  115. return false;
  116. }
  117. $settingsmapdata = array();
  118. $stmt = $pdo->prepare("SELECT `id`,
  119. `desc`,
  120. `content`,
  121. `active`
  122. FROM `settingsmap`
  123. WHERE `id` = :id");
  124. $stmt->execute(array(':id' => $_data));
  125. $settingsmapdata = $stmt->fetch(PDO::FETCH_ASSOC);
  126. return $settingsmapdata;
  127. break;
  128. }
  129. }
  130. function rspamd_maps($_action, $_data = null) {
  131. global $pdo;
  132. global $lang;
  133. global $RSPAMD_MAPS;
  134. $_data_log = $_data;
  135. switch ($_action) {
  136. case 'edit':
  137. if ($_SESSION['mailcow_cc_role'] != "admin") {
  138. $_SESSION['return'][] = array(
  139. 'type' => 'danger',
  140. 'log' => array(__FUNCTION__, $_action, '-'),
  141. 'msg' => 'access_denied'
  142. );
  143. return false;
  144. }
  145. $maps = (array)$_data['map'];
  146. foreach ($maps as $map) {
  147. foreach ($RSPAMD_MAPS as $rspamd_map_type) {
  148. if (!in_array($map, $rspamd_map_type)) {
  149. $_SESSION['return'][] = array(
  150. 'type' => 'danger',
  151. 'log' => array(__FUNCTION__, $_action, '-'),
  152. 'msg' => array('global_map_invalid', $map)
  153. );
  154. continue;
  155. }
  156. }
  157. try {
  158. if (file_exists('/rspamd_custom_maps/' . $map)) {
  159. $map_content = trim($_data['rspamd_map_data']);
  160. $map_handle = fopen('/rspamd_custom_maps/' . $map, 'w');
  161. if (!$map_handle) {
  162. throw new Exception($lang['danger']['file_open_error']);
  163. }
  164. fwrite($map_handle, $map_content . PHP_EOL);
  165. fclose($map_handle);
  166. sleep(1.5);
  167. touch('/rspamd_custom_maps/' . $map);
  168. }
  169. }
  170. catch (Exception $e) {
  171. $_SESSION['return'][] = array(
  172. 'type' => 'danger',
  173. 'log' => array(__FUNCTION__, $_action, '-'),
  174. 'msg' => array('global_map_write_error', htmlspecialchars($map), htmlspecialchars($e->getMessage()))
  175. );
  176. continue;
  177. }
  178. $_SESSION['return'][] = array(
  179. 'type' => 'success',
  180. 'log' => array(__FUNCTION__, $_action, '-'),
  181. 'msg' => array('object_modified', htmlspecialchars($map))
  182. );
  183. }
  184. break;
  185. }
  186. }
  187. function rspamd_actions() {
  188. if (isset($_SESSION["mailcow_cc_role"]) && $_SESSION["mailcow_cc_role"] == "admin") {
  189. $curl = curl_init();
  190. curl_setopt($curl, CURLOPT_UNIX_SOCKET_PATH, '/var/lib/rspamd/rspamd.sock');
  191. curl_setopt($curl, CURLOPT_URL,"http://rspamd/stat");
  192. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  193. $data = curl_exec($curl);
  194. if ($data) {
  195. $return = array();
  196. $stats_array = json_decode($data, true)['actions'];
  197. $stats_array['soft reject'] = $stats_array['soft reject'] + $stats_array['greylist'];
  198. unset($stats_array['greylist']);
  199. foreach ($stats_array as $action => $count) {
  200. $return[] = array($action, $count);
  201. }
  202. return $return;
  203. }
  204. else {
  205. return false;
  206. }
  207. }
  208. else {
  209. return false;
  210. }
  211. }