functions.rspamd.inc.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  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. try {
  28. $stmt = $pdo->prepare("INSERT INTO `settingsmap` (`content`, `desc`, `active`)
  29. VALUES (:content, :desc, :active)");
  30. $stmt->execute(array(
  31. ':content' => $content,
  32. ':desc' => $desc,
  33. ':active' => $active
  34. ));
  35. }
  36. catch (PDOException $e) {
  37. $_SESSION['return'][] = array(
  38. 'type' => 'danger',
  39. 'log' => array(__FUNCTION__, $_action, $_data_log),
  40. 'msg' => array('mysql_error', $e)
  41. );
  42. return false;
  43. }
  44. $_SESSION['return'][] = array(
  45. 'type' => 'success',
  46. 'log' => array(__FUNCTION__, $_action, $_data_log),
  47. 'msg' => 'settings_map_added'
  48. );
  49. break;
  50. case 'edit':
  51. if ($_SESSION['mailcow_cc_role'] != "admin") {
  52. $_SESSION['return'][] = array(
  53. 'type' => 'danger',
  54. 'log' => array(__FUNCTION__, $_action, $_data_log),
  55. 'msg' => 'access_denied'
  56. );
  57. return false;
  58. }
  59. $ids = (array)$_data['id'];
  60. foreach ($ids as $id) {
  61. $is_now = rsettings('details', $id);
  62. if (!empty($is_now)) {
  63. $content = (!empty($_data['content'])) ? $_data['content'] : $is_now['content'];
  64. $desc = (!empty($_data['desc'])) ? $_data['desc'] : $is_now['desc'];
  65. $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int'];
  66. }
  67. else {
  68. $_SESSION['return'][] = array(
  69. 'type' => 'danger',
  70. 'log' => array(__FUNCTION__, $_action, $_data_log),
  71. 'msg' => array('settings_map_invalid', $id)
  72. );
  73. continue;
  74. }
  75. $content = trim($content);
  76. try {
  77. $stmt = $pdo->prepare("UPDATE `settingsmap` SET
  78. `content` = :content,
  79. `desc` = :desc,
  80. `active` = :active
  81. WHERE `id` = :id");
  82. $stmt->execute(array(
  83. ':content' => $content,
  84. ':desc' => $desc,
  85. ':active' => $active,
  86. ':id' => $id
  87. ));
  88. }
  89. catch (PDOException $e) {
  90. $_SESSION['return'][] = array(
  91. 'type' => 'danger',
  92. 'log' => array(__FUNCTION__, $_action, $_data_log),
  93. 'msg' => array('mysql_error', $e)
  94. );
  95. continue;
  96. }
  97. $_SESSION['return'][] = array(
  98. 'type' => 'success',
  99. 'log' => array(__FUNCTION__, $_action, $_data_log),
  100. 'msg' => array('object_modified', htmlspecialchars($ids))
  101. );
  102. }
  103. break;
  104. case 'delete':
  105. if ($_SESSION['mailcow_cc_role'] != "admin") {
  106. $_SESSION['return'][] = array(
  107. 'type' => 'danger',
  108. 'log' => array(__FUNCTION__, $_action, $_data_log),
  109. 'msg' => 'access_denied'
  110. );
  111. return false;
  112. }
  113. $ids = (array)$_data['id'];
  114. foreach ($ids as $id) {
  115. try {
  116. $stmt = $pdo->prepare("DELETE FROM `settingsmap` WHERE `id`= :id");
  117. $stmt->execute(array(':id' => $id));
  118. }
  119. catch (PDOException $e) {
  120. $_SESSION['return'][] = array(
  121. 'type' => 'danger',
  122. 'log' => array(__FUNCTION__, $_action, $_data_log),
  123. 'msg' => array('mysql_error', $e)
  124. );
  125. return false;
  126. }
  127. $_SESSION['return'][] = array(
  128. 'type' => 'success',
  129. 'log' => array(__FUNCTION__, $_action, $_data_log),
  130. 'msg' => array('settings_map_removed', htmlspecialchars($id))
  131. );
  132. }
  133. break;
  134. case 'get':
  135. if ($_SESSION['mailcow_cc_role'] != "admin") {
  136. return false;
  137. }
  138. $settingsmaps = array();
  139. $stmt = $pdo->query("SELECT `id`, `desc`, `active` FROM `settingsmap`");
  140. $settingsmaps = $stmt->fetchAll(PDO::FETCH_ASSOC);
  141. return $settingsmaps;
  142. break;
  143. case 'details':
  144. if ($_SESSION['mailcow_cc_role'] != "admin" || !isset($_data)) {
  145. return false;
  146. }
  147. $settingsmapdata = array();
  148. $stmt = $pdo->prepare("SELECT `id`,
  149. `desc`,
  150. `content`,
  151. `active` AS `active_int`,
  152. CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`
  153. FROM `settingsmap`
  154. WHERE `id` = :id");
  155. $stmt->execute(array(':id' => $_data));
  156. $settingsmapdata = $stmt->fetch(PDO::FETCH_ASSOC);
  157. return $settingsmapdata;
  158. break;
  159. }
  160. }
  161. function rspamd($_action, $_data = null) {
  162. global $pdo;
  163. global $lang;
  164. global $RSPAMD_MAPS;
  165. $_data_log = $_data;
  166. switch ($_action) {
  167. case 'add':
  168. if ($_SESSION['mailcow_cc_role'] != "admin") {
  169. $_SESSION['return'][] = array(
  170. 'type' => 'danger',
  171. 'log' => array(__FUNCTION__, $_action, $_data_log),
  172. 'msg' => 'access_denied'
  173. );
  174. return false;
  175. }
  176. $content = $_data['content'];
  177. $desc = $_data['desc'];
  178. $active = intval($_data['active']);
  179. if (empty($content)) {
  180. $_SESSION['return'][] = array(
  181. 'type' => 'danger',
  182. 'log' => array(__FUNCTION__, $_action, $_data_log),
  183. 'msg' => 'map_content_empty'
  184. );
  185. return false;
  186. }
  187. try {
  188. $stmt = $pdo->prepare("INSERT INTO `settingsmap` (`content`, `desc`, `active`)
  189. VALUES (:content, :desc, :active)");
  190. $stmt->execute(array(
  191. ':content' => $content,
  192. ':desc' => $desc,
  193. ':active' => $active
  194. ));
  195. }
  196. catch (PDOException $e) {
  197. $_SESSION['return'][] = array(
  198. 'type' => 'danger',
  199. 'log' => array(__FUNCTION__, $_action, $_data_log),
  200. 'msg' => array('mysql_error', $e)
  201. );
  202. return false;
  203. }
  204. $_SESSION['return'][] = array(
  205. 'type' => 'success',
  206. 'log' => array(__FUNCTION__, $_action, $_data_log),
  207. 'msg' => 'settings_map_added'
  208. );
  209. break;
  210. case 'edit':
  211. if ($_SESSION['mailcow_cc_role'] != "admin") {
  212. $_SESSION['return'][] = array(
  213. 'type' => 'danger',
  214. 'log' => array(__FUNCTION__, $_action, $_data_log),
  215. 'msg' => 'access_denied'
  216. );
  217. return false;
  218. }
  219. $maps = (array)$_data['map'];
  220. foreach ($maps as $map) {
  221. if (!in_array($map, $RSPAMD_MAPS)) {
  222. $_SESSION['return'][] = array(
  223. 'type' => 'danger',
  224. 'log' => array(__FUNCTION__, $_action, $_data_log),
  225. 'msg' => array('global_map_invalid', $map)
  226. );
  227. continue;
  228. }
  229. try {
  230. if (file_exists('/rspamd_custom_maps/' . $map)) {
  231. $map_content = trim($_data['rspamd_map_data']);
  232. $map_handle = fopen('/rspamd_custom_maps/' . $map, 'w');
  233. if (!$map_handle) {
  234. throw new Exception('File cannot be opened for writing.');
  235. }
  236. fwrite($map_handle, $map_content . PHP_EOL);
  237. fclose($map_handle);
  238. }
  239. }
  240. catch (Exception $e) {
  241. $_SESSION['return'][] = array(
  242. 'type' => 'danger',
  243. 'log' => array(__FUNCTION__, $_action, $_data_log),
  244. 'msg' => array('global_map_write_error', htmlspecialchars($map), htmlspecialchars($e->getMessage()))
  245. );
  246. continue;
  247. }
  248. $_SESSION['return'][] = array(
  249. 'type' => 'success',
  250. 'log' => array(__FUNCTION__, $_action, $_data_log),
  251. 'msg' => array('object_modified', htmlspecialchars($map))
  252. );
  253. }
  254. break;
  255. case 'delete':
  256. if ($_SESSION['mailcow_cc_role'] != "admin") {
  257. $_SESSION['return'][] = array(
  258. 'type' => 'danger',
  259. 'log' => array(__FUNCTION__, $_action, $_data_log),
  260. 'msg' => 'access_denied'
  261. );
  262. return false;
  263. }
  264. $ids = (array)$_data['id'];
  265. foreach ($ids as $id) {
  266. try {
  267. $stmt = $pdo->prepare("DELETE FROM `settingsmap` WHERE `id`= :id");
  268. $stmt->execute(array(':id' => $id));
  269. }
  270. catch (PDOException $e) {
  271. $_SESSION['return'][] = array(
  272. 'type' => 'danger',
  273. 'log' => array(__FUNCTION__, $_action, $_data_log),
  274. 'msg' => array('mysql_error', $e)
  275. );
  276. return false;
  277. }
  278. $_SESSION['return'][] = array(
  279. 'type' => 'success',
  280. 'log' => array(__FUNCTION__, $_action, $_data_log),
  281. 'msg' => array('settings_map_removed', htmlspecialchars($id))
  282. );
  283. }
  284. break;
  285. case 'get':
  286. if ($_SESSION['mailcow_cc_role'] != "admin") {
  287. return false;
  288. }
  289. $settingsmaps = array();
  290. $stmt = $pdo->query("SELECT `id`, `desc`, `active` FROM `settingsmap`");
  291. $settingsmaps = $stmt->fetchAll(PDO::FETCH_ASSOC);
  292. return $settingsmaps;
  293. break;
  294. case 'details':
  295. if ($_SESSION['mailcow_cc_role'] != "admin" || !isset($_data)) {
  296. return false;
  297. }
  298. $settingsmapdata = array();
  299. $stmt = $pdo->prepare("SELECT `id`,
  300. `desc`,
  301. `content`,
  302. `active` AS `active_int`,
  303. CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`
  304. FROM `settingsmap`
  305. WHERE `id` = :id");
  306. $stmt->execute(array(':id' => $_data));
  307. $settingsmapdata = $stmt->fetch(PDO::FETCH_ASSOC);
  308. return $settingsmapdata;
  309. break;
  310. }
  311. }