2
0

json_api.php 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122
  1. <?php
  2. /*
  3. edit/alias => POST data:
  4. {
  5. address: {a, b, c}, (where a, b, c represent alias addresses)
  6. active: 1 (0 or 1)
  7. }
  8. delete/alias => POST data:
  9. {
  10. address: {a, b, c}, (where a, b, c represent alias addresses)
  11. }
  12. */
  13. header('Content-Type: application/json');
  14. require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/prerequisites.inc.php';
  15. error_reporting(0);
  16. function api_log($postarray) {
  17. global $redis;
  18. $data_var = array();
  19. foreach ($postarray as $data => &$value) {
  20. if ($data == 'csrf_token') {
  21. continue;
  22. }
  23. if ($value = json_decode($value, true)) {
  24. unset($value["csrf_token"]);
  25. foreach ($value as $key => &$val) {
  26. if(preg_match("/pass/i", $key)) {
  27. $val = '********';
  28. }
  29. }
  30. $value = json_encode($value);
  31. }
  32. $data_var[] = $data . "='" . $value . "'";
  33. }
  34. try {
  35. $log_line = array(
  36. 'time' => time(),
  37. 'uri' => $_SERVER['REQUEST_URI'],
  38. 'method' => $_SERVER['REQUEST_METHOD'],
  39. 'remote' => $_SERVER['REMOTE_ADDR'],
  40. 'data' => implode(', ', $data_var)
  41. );
  42. $redis->lPush('API_LOG', json_encode($log_line));
  43. }
  44. catch (RedisException $e) {
  45. $_SESSION['return'] = array(
  46. 'type' => 'danger',
  47. 'msg' => 'Redis: '.$e
  48. );
  49. return false;
  50. }
  51. }
  52. api_log($_POST);
  53. if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_username'])) {
  54. if (isset($_GET['query'])) {
  55. $query = explode('/', $_GET['query']);
  56. $action = (isset($query[0])) ? $query[0] : null;
  57. $category = (isset($query[1])) ? $query[1] : null;
  58. $object = (isset($query[2])) ? $query[2] : null;
  59. $extra = (isset($query[3])) ? $query[3] : null;
  60. $request_incomplete = json_encode(array(
  61. 'type' => 'error',
  62. 'msg' => 'Cannot find attributes in post data'
  63. ));
  64. switch ($action) {
  65. case "add":
  66. function process_add_return($return) {
  67. $generic_failure = json_encode(array(
  68. 'type' => 'error',
  69. 'msg' => 'Cannot add item'
  70. ));
  71. $generic_success = json_encode(array(
  72. 'type' => 'success',
  73. 'msg' => 'Task completed'
  74. ));
  75. if ($return === false) {
  76. echo isset($_SESSION['return']) ? json_encode($_SESSION['return']) : $generic_failure;
  77. }
  78. else {
  79. echo isset($_SESSION['return']) ? json_encode($_SESSION['return']) : $generic_success;
  80. }
  81. }
  82. if (!isset($_POST['attr'])) {
  83. echo $request_incomplete;
  84. exit;
  85. }
  86. else {
  87. $attr = (array)json_decode($_POST['attr'], true);
  88. }
  89. switch ($category) {
  90. case "time_limited_alias":
  91. process_add_return(mailbox('add', 'time_limited_alias', $attr));
  92. break;
  93. case "relayhost":
  94. process_add_return(relayhost('add', $attr));
  95. break;
  96. case "rsetting":
  97. process_add_return(rsettings('add', $attr));
  98. break;
  99. case "mailbox":
  100. process_add_return(mailbox('add', 'mailbox', $attr));
  101. break;
  102. case "domain":
  103. process_add_return(mailbox('add', 'domain', $attr));
  104. break;
  105. case "domain":
  106. process_add_return(mailbox('add', 'resource', $attr));
  107. break;
  108. case "alias":
  109. process_add_return(mailbox('add', 'alias', $attr));
  110. break;
  111. case "filter":
  112. process_add_return(mailbox('add', 'filter', $attr));
  113. break;
  114. case "domain-policy":
  115. process_add_return(policy('add', 'domain', $attr));
  116. break;
  117. case "mailbox-policy":
  118. process_add_return(policy('add', 'mailbox', $attr));
  119. break;
  120. case "alias-domain":
  121. process_add_return(mailbox('add', 'alias_domain', $attr));
  122. break;
  123. case "fwdhost":
  124. process_add_return(fwdhost('add', $attr));
  125. break;
  126. case "dkim":
  127. process_add_return(dkim('add', $attr));
  128. break;
  129. case "dkim_import":
  130. process_add_return(dkim('import', $attr));
  131. break;
  132. case "domain-admin":
  133. process_add_return(domain_admin('add', $attr));
  134. break;
  135. case "syncjob":
  136. process_add_return(mailbox('add', 'syncjob', $attr));
  137. break;
  138. case "bcc":
  139. process_add_return(bcc('add', $attr));
  140. break;
  141. case "recipient_map":
  142. process_add_return(recipient_map('add', $attr));
  143. break;
  144. }
  145. break;
  146. case "get":
  147. function process_get_return($data) {
  148. echo (!isset($data) || empty($data)) ? '{}' : json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
  149. }
  150. switch ($category) {
  151. case "rspamd":
  152. switch ($object) {
  153. case "stat":
  154. $data = file_get_contents('http://rspamd-mailcow:11334/stat');
  155. process_get_return($data);
  156. break;
  157. case "graph":
  158. switch ($extra) {
  159. case "hourly":
  160. $data = file_get_contents('http://rspamd-mailcow:11334/graph?type=hourly');
  161. if (!empty($data)) {
  162. $data_array = json_decode($data, true);
  163. $rejected['label'] = "reject";
  164. foreach ($data_array[0] as $dataset) {
  165. $rejected['data'][] = $dataset;
  166. }
  167. $temp_reject['label'] = "temp_reject";
  168. foreach ($data_array[1] as $dataset) {
  169. $temp_reject['data'][] = $dataset;
  170. }
  171. $add_header['label'] = "add_header";
  172. foreach ($data_array[2] as $dataset) {
  173. $add_header['data'][] = $dataset;
  174. }
  175. $prob_spam['label'] = "prob_spam";
  176. foreach ($data_array[3] as $dataset) {
  177. $prob_spam['data'][] = $dataset;
  178. }
  179. $greylist['label'] = "greylist";
  180. foreach ($data_array[4] as $dataset) {
  181. $greylist['data'][] = $dataset;
  182. }
  183. $clean['label'] = "clean";
  184. $clean['pointStyle'] = "cross";
  185. foreach ($data_array[5] as $dataset) {
  186. $clean['data'][] = $dataset;
  187. }
  188. echo json_encode(array($rejected, $temp_reject, $add_header, $prob_spam, $greylist, $clean), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
  189. }
  190. elseif (!isset($data) || empty($data)) {
  191. echo '{}';
  192. }
  193. break;
  194. case "daily":
  195. $data = file_get_contents('http://rspamd-mailcow:11334/graph?type=daily');
  196. if (!empty($data)) {
  197. $data_array = json_decode($data, true);
  198. $rejected['label'] = "reject";
  199. foreach ($data_array[0] as $dataset) {
  200. $rejected['data'][] = $dataset;
  201. }
  202. $temp_reject['label'] = "temp_reject";
  203. foreach ($data_array[1] as $dataset) {
  204. $temp_reject['data'][] = $dataset;
  205. }
  206. $add_header['label'] = "add_header";
  207. foreach ($data_array[2] as $dataset) {
  208. $add_header['data'][] = $dataset;
  209. }
  210. $prob_spam['label'] = "prob_spam";
  211. foreach ($data_array[3] as $dataset) {
  212. $prob_spam['data'][] = $dataset;
  213. }
  214. $greylist['label'] = "greylist";
  215. foreach ($data_array[4] as $dataset) {
  216. $greylist['data'][] = $dataset;
  217. }
  218. $clean['label'] = "clean";
  219. $clean['pointStyle'] = "cross";
  220. foreach ($data_array[5] as $dataset) {
  221. $clean['data'][] = $dataset;
  222. }
  223. echo json_encode(array($rejected, $temp_reject, $add_header, $prob_spam, $greylist, $clean), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
  224. }
  225. elseif (!isset($data) || empty($data)) {
  226. echo '{}';
  227. }
  228. break;
  229. case "weekly":
  230. $data = file_get_contents('http://rspamd-mailcow:11334/graph?type=weekly');
  231. if (!empty($data)) {
  232. $data_array = json_decode($data, true);
  233. $rejected['label'] = "reject";
  234. foreach ($data_array[0] as $dataset) {
  235. $rejected['data'][] = $dataset;
  236. }
  237. $temp_reject['label'] = "temp_reject";
  238. foreach ($data_array[1] as $dataset) {
  239. $temp_reject['data'][] = $dataset;
  240. }
  241. $add_header['label'] = "add_header";
  242. foreach ($data_array[2] as $dataset) {
  243. $add_header['data'][] = $dataset;
  244. }
  245. $prob_spam['label'] = "prob_spam";
  246. foreach ($data_array[3] as $dataset) {
  247. $prob_spam['data'][] = $dataset;
  248. }
  249. $greylist['label'] = "greylist";
  250. foreach ($data_array[4] as $dataset) {
  251. $greylist['data'][] = $dataset;
  252. }
  253. $clean['label'] = "clean";
  254. $clean['pointStyle'] = "cross";
  255. foreach ($data_array[5] as $dataset) {
  256. $clean['data'][] = $dataset;
  257. }
  258. echo json_encode(array($rejected, $temp_reject, $add_header, $prob_spam, $greylist, $clean), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
  259. }
  260. elseif (!isset($data) || empty($data)) {
  261. echo '{}';
  262. }
  263. break;
  264. case "monthly":
  265. $data = file_get_contents('http://rspamd-mailcow:11334/graph?type=monthly');
  266. if (!empty($data)) {
  267. $data_array = json_decode($data, true);
  268. $rejected['label'] = "reject";
  269. foreach ($data_array[0] as $dataset) {
  270. $rejected['data'][] = $dataset;
  271. }
  272. $temp_reject['label'] = "temp_reject";
  273. foreach ($data_array[1] as $dataset) {
  274. $temp_reject['data'][] = $dataset;
  275. }
  276. $add_header['label'] = "add_header";
  277. foreach ($data_array[2] as $dataset) {
  278. $add_header['data'][] = $dataset;
  279. }
  280. $prob_spam['label'] = "prob_spam";
  281. foreach ($data_array[3] as $dataset) {
  282. $prob_spam['data'][] = $dataset;
  283. }
  284. $greylist['label'] = "greylist";
  285. foreach ($data_array[4] as $dataset) {
  286. $greylist['data'][] = $dataset;
  287. }
  288. $clean['label'] = "clean";
  289. $clean['pointStyle'] = "cross";
  290. foreach ($data_array[5] as $dataset) {
  291. $clean['data'][] = $dataset;
  292. }
  293. echo json_encode(array($rejected, $temp_reject, $add_header, $prob_spam, $greylist, $clean), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
  294. }
  295. elseif (!isset($data) || empty($data)) {
  296. echo '{}';
  297. }
  298. break;
  299. }
  300. break;
  301. }
  302. break;
  303. case "domain":
  304. switch ($object) {
  305. case "all":
  306. $domains = mailbox('get', 'domains');
  307. if (!empty($domains)) {
  308. foreach ($domains as $domain) {
  309. if ($details = mailbox('get', 'domain_details', $domain)) {
  310. $data[] = $details;
  311. }
  312. else {
  313. continue;
  314. }
  315. }
  316. process_get_return($data);
  317. }
  318. else {
  319. echo '{}';
  320. }
  321. break;
  322. default:
  323. $data = mailbox('get', 'domain_details', $object);
  324. process_get_return($data);
  325. break;
  326. }
  327. break;
  328. case "relayhost":
  329. switch ($object) {
  330. case "all":
  331. $relayhosts = relayhost('get');
  332. if (!empty($relayhosts)) {
  333. foreach ($relayhosts as $relayhost) {
  334. if ($details = relayhost('details', $relayhost['id'])) {
  335. $data[] = $details;
  336. }
  337. else {
  338. continue;
  339. }
  340. }
  341. process_get_return($data);
  342. }
  343. else {
  344. echo '{}';
  345. }
  346. break;
  347. default:
  348. $data = relayhost('details', $object);
  349. process_get_return($data);
  350. break;
  351. }
  352. break;
  353. case "rsetting":
  354. switch ($object) {
  355. case "all":
  356. $rsettings = rsettings('get');
  357. if (!empty($rsettings)) {
  358. foreach ($rsettings as $rsetting) {
  359. if ($details = rsettings('details', $rsetting['id'])) {
  360. $data[] = $details;
  361. }
  362. else {
  363. continue;
  364. }
  365. }
  366. process_get_return($data);
  367. }
  368. else {
  369. echo '{}';
  370. }
  371. break;
  372. default:
  373. $data = rsetting('details', $object);
  374. process_get_return($data);
  375. break;
  376. }
  377. break;
  378. case "oauth2-client":
  379. switch ($object) {
  380. case "all":
  381. $clients = oauth2('get', 'clients');
  382. if (!empty($clients)) {
  383. foreach ($clients as $client) {
  384. if ($details = oauth2('details', 'client', $client)) {
  385. $data[] = $details;
  386. }
  387. else {
  388. continue;
  389. }
  390. }
  391. process_get_return($data);
  392. }
  393. else {
  394. echo '{}';
  395. }
  396. break;
  397. default:
  398. $data = oauth2('details', 'client', $object);
  399. process_get_return($data);
  400. break;
  401. }
  402. break;
  403. case "logs":
  404. switch ($object) {
  405. case "dovecot":
  406. // 0 is first record, so empty is fine
  407. if (isset($extra)) {
  408. $extra = preg_replace('/[^\d\-]/i', '', $extra);
  409. $logs = get_logs('dovecot-mailcow', $extra);
  410. }
  411. else {
  412. $logs = get_logs('dovecot-mailcow');
  413. }
  414. echo (isset($logs) && !empty($logs)) ? json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) : '{}';
  415. break;
  416. case "netfilter":
  417. // 0 is first record, so empty is fine
  418. if (isset($extra)) {
  419. $extra = preg_replace('/[^\d\-]/i', '', $extra);
  420. $logs = get_logs('netfilter-mailcow', $extra);
  421. }
  422. else {
  423. $logs = get_logs('netfilter-mailcow');
  424. }
  425. echo (isset($logs) && !empty($logs)) ? json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) : '{}';
  426. break;
  427. case "postfix":
  428. // 0 is first record, so empty is fine
  429. if (isset($extra)) {
  430. $extra = preg_replace('/[^\d\-]/i', '', $extra);
  431. $logs = get_logs('postfix-mailcow', $extra);
  432. }
  433. else {
  434. $logs = get_logs('postfix-mailcow');
  435. }
  436. echo (isset($logs) && !empty($logs)) ? json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) : '{}';
  437. break;
  438. case "autodiscover":
  439. // 0 is first record, so empty is fine
  440. if (isset($extra)) {
  441. $extra = preg_replace('/[^\d\-]/i', '', $extra);
  442. $logs = get_logs('autodiscover-mailcow', $extra);
  443. }
  444. else {
  445. $logs = get_logs('autodiscover-mailcow');
  446. }
  447. echo (isset($logs) && !empty($logs)) ? json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) : '{}';
  448. break;
  449. case "sogo":
  450. // 0 is first record, so empty is fine
  451. if (isset($extra)) {
  452. $extra = preg_replace('/[^\d\-]/i', '', $extra);
  453. $logs = get_logs('sogo-mailcow', $extra);
  454. }
  455. else {
  456. $logs = get_logs('sogo-mailcow');
  457. }
  458. echo (isset($logs) && !empty($logs)) ? json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) : '{}';
  459. break;
  460. case "watchdog":
  461. // 0 is first record, so empty is fine
  462. if (isset($extra)) {
  463. $extra = preg_replace('/[^\d\-]/i', '', $extra);
  464. $logs = get_logs('watchdog-mailcow', $extra);
  465. }
  466. else {
  467. $logs = get_logs('watchdog-mailcow');
  468. }
  469. echo (isset($logs) && !empty($logs)) ? json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) : '{}';
  470. break;
  471. case "acme":
  472. // 0 is first record, so empty is fine
  473. if (isset($extra)) {
  474. $extra = preg_replace('/[^\d\-]/i', '', $extra);
  475. $logs = get_logs('acme-mailcow', $extra);
  476. }
  477. else {
  478. $logs = get_logs('acme-mailcow');
  479. }
  480. echo (isset($logs) && !empty($logs)) ? json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) : '{}';
  481. break;
  482. case "api":
  483. // 0 is first record, so empty is fine
  484. if (isset($extra)) {
  485. $extra = preg_replace('/[^\d\-]/i', '', $extra);
  486. $logs = get_logs('api-mailcow', $extra);
  487. }
  488. else {
  489. $logs = get_logs('api-mailcow');
  490. }
  491. echo (isset($logs) && !empty($logs)) ? json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) : '{}';
  492. break;
  493. case "rspamd-history":
  494. // 0 is first record, so empty is fine
  495. if (isset($extra)) {
  496. $extra = preg_replace('/[^\d\-]/i', '', $extra);
  497. $logs = get_logs('rspamd-history', $extra);
  498. }
  499. else {
  500. $logs = get_logs('rspamd-history');
  501. }
  502. echo (isset($logs) && !empty($logs)) ? json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) : '{}';
  503. break;
  504. }
  505. break;
  506. case "mailbox":
  507. switch ($object) {
  508. case "all":
  509. $domains = mailbox('get', 'domains');
  510. if (!empty($domains)) {
  511. foreach ($domains as $domain) {
  512. $mailboxes = mailbox('get', 'mailboxes', $domain);
  513. if (!empty($mailboxes)) {
  514. foreach ($mailboxes as $mailbox) {
  515. if ($details = mailbox('get', 'mailbox_details', $mailbox)) {
  516. $data[] = $details;
  517. }
  518. else {
  519. continue;
  520. }
  521. }
  522. }
  523. }
  524. process_get_return($data);
  525. }
  526. else {
  527. echo '{}';
  528. }
  529. break;
  530. default:
  531. $data = mailbox('get', 'mailbox_details', $object);
  532. process_get_return($data);
  533. break;
  534. }
  535. break;
  536. case "syncjobs":
  537. switch ($object) {
  538. case "all":
  539. $domains = mailbox('get', 'domains');
  540. if (!empty($domains)) {
  541. foreach ($domains as $domain) {
  542. $mailboxes = mailbox('get', 'mailboxes', $domain);
  543. if (!empty($mailboxes)) {
  544. foreach ($mailboxes as $mailbox) {
  545. $syncjobs = mailbox('get', 'syncjobs', $mailbox);
  546. if (!empty($syncjobs)) {
  547. foreach ($syncjobs as $syncjob) {
  548. if (isset($extra)) {
  549. $details = mailbox('get', 'syncjob_details', $syncjob, explode(',', $extra));
  550. }
  551. else {
  552. $details = mailbox('get', 'syncjob_details', $syncjob);
  553. }
  554. if ($details) {
  555. $data[] = $details;
  556. }
  557. else {
  558. continue;
  559. }
  560. }
  561. }
  562. }
  563. }
  564. }
  565. process_get_return($data);
  566. }
  567. else {
  568. echo '{}';
  569. }
  570. break;
  571. default:
  572. $syncjobs = mailbox('get', 'syncjobs', $object);
  573. if (!empty($syncjobs)) {
  574. foreach ($syncjobs as $syncjob) {
  575. if (isset($extra)) {
  576. $details = mailbox('get', 'syncjob_details', $syncjob, explode(',', $extra));
  577. }
  578. else {
  579. $details = mailbox('get', 'syncjob_details', $syncjob);
  580. }
  581. if ($details) {
  582. $data[] = $details;
  583. }
  584. else {
  585. continue;
  586. }
  587. }
  588. }
  589. process_get_return($data);
  590. break;
  591. }
  592. break;
  593. case "active-user-sieve":
  594. if (isset($object)) {
  595. $sieve_filter = mailbox('get', 'active_user_sieve', $object);
  596. if (!empty($sieve_filter)) {
  597. $data[] = $sieve_filter;
  598. }
  599. }
  600. process_get_return($data);
  601. break;
  602. case "filters":
  603. switch ($object) {
  604. case "all":
  605. $domains = mailbox('get', 'domains');
  606. if (!empty($domains)) {
  607. foreach ($domains as $domain) {
  608. $mailboxes = mailbox('get', 'mailboxes', $domain);
  609. if (!empty($mailboxes)) {
  610. foreach ($mailboxes as $mailbox) {
  611. $filters = mailbox('get', 'filters', $mailbox);
  612. if (!empty($filters)) {
  613. foreach ($filters as $filter) {
  614. if ($details = mailbox('get', 'filter_details', $filter)) {
  615. $data[] = $details;
  616. }
  617. else {
  618. continue;
  619. }
  620. }
  621. }
  622. }
  623. }
  624. }
  625. process_get_return($data);
  626. }
  627. else {
  628. echo '{}';
  629. }
  630. break;
  631. default:
  632. $filters = mailbox('get', 'filters', $object);
  633. if (!empty($filters)) {
  634. foreach ($filters as $filter) {
  635. if ($details = mailbox('get', 'filter_details', $filter)) {
  636. $data[] = $details;
  637. }
  638. else {
  639. continue;
  640. }
  641. }
  642. }
  643. process_get_return($data);
  644. break;
  645. }
  646. break;
  647. case "bcc":
  648. switch ($object) {
  649. case "all":
  650. $bcc_items = bcc('get');
  651. if (!empty($bcc_items)) {
  652. foreach ($bcc_items as $bcc_item) {
  653. if ($details = bcc('details', $bcc_item)) {
  654. $data[] = $details;
  655. }
  656. else {
  657. continue;
  658. }
  659. }
  660. }
  661. process_get_return($data);
  662. break;
  663. default:
  664. $data = bcc('details', $object);
  665. if (!empty($data)) {
  666. $data[] = $details;
  667. }
  668. process_get_return($data);
  669. break;
  670. }
  671. break;
  672. case "recipient_map":
  673. switch ($object) {
  674. case "all":
  675. $recipient_map_items = recipient_map('get');
  676. if (!empty($recipient_map_items)) {
  677. foreach ($recipient_map_items as $recipient_map_item) {
  678. if ($details = recipient_map('details', $recipient_map_item)) {
  679. $data[] = $details;
  680. }
  681. else {
  682. continue;
  683. }
  684. }
  685. }
  686. process_get_return($data);
  687. break;
  688. default:
  689. $data = recipient_map('details', $object);
  690. if (!empty($data)) {
  691. $data[] = $details;
  692. }
  693. process_get_return($data);
  694. break;
  695. }
  696. break;
  697. case "policy_wl_mailbox":
  698. switch ($object) {
  699. default:
  700. $data = policy('get', 'mailbox', $object)['whitelist'];
  701. process_get_return($data);
  702. break;
  703. }
  704. break;
  705. case "policy_bl_mailbox":
  706. switch ($object) {
  707. default:
  708. $data = policy('get', 'mailbox', $object)['blacklist'];
  709. process_get_return($data);
  710. break;
  711. }
  712. break;
  713. case "policy_wl_domain":
  714. switch ($object) {
  715. default:
  716. $data = policy('get', 'domain', $object)['whitelist'];
  717. process_get_return($data);
  718. break;
  719. }
  720. break;
  721. case "policy_bl_domain":
  722. switch ($object) {
  723. default:
  724. $data = policy('get', 'domain', $object)['blacklist'];
  725. process_get_return($data);
  726. break;
  727. }
  728. break;
  729. case "time_limited_aliases":
  730. switch ($object) {
  731. default:
  732. $data = mailbox('get', 'time_limited_aliases', $object);
  733. process_get_return($data);
  734. break;
  735. }
  736. break;
  737. case "resource":
  738. switch ($object) {
  739. case "all":
  740. $domains = mailbox('get', 'domains');
  741. if (!empty($domains)) {
  742. foreach ($domains as $domain) {
  743. $resources = mailbox('get', 'resources', $domain);
  744. if (!empty($resources)) {
  745. foreach ($resources as $resource) {
  746. if ($details = mailbox('get', 'resource_details', $resource)) {
  747. $data[] = $details;
  748. }
  749. else {
  750. continue;
  751. }
  752. }
  753. }
  754. }
  755. process_get_return($data);
  756. }
  757. else {
  758. echo '{}';
  759. }
  760. break;
  761. default:
  762. $data = mailbox('get', 'resource_details', $object);
  763. process_get_return($data);
  764. break;
  765. }
  766. break;
  767. case "fwdhost":
  768. switch ($object) {
  769. case "all":
  770. process_get_return(fwdhost('get'));
  771. break;
  772. default:
  773. process_get_return(fwdhost('details', $object));
  774. break;
  775. }
  776. break;
  777. case "quarantine":
  778. // "all" will not print details
  779. switch ($object) {
  780. case "all":
  781. process_get_return(quarantine('get'));
  782. break;
  783. default:
  784. process_get_return(quarantine('details', $object));
  785. break;
  786. }
  787. break;
  788. case "alias-domain":
  789. switch ($object) {
  790. case "all":
  791. $alias_domains = mailbox('get', 'alias_domains');
  792. if (!empty($alias_domains)) {
  793. foreach ($alias_domains as $alias_domain) {
  794. if ($details = mailbox('get', 'alias_domain_details', $alias_domain)) {
  795. $data[] = $details;
  796. }
  797. else {
  798. continue;
  799. }
  800. }
  801. }
  802. process_get_return($data);
  803. break;
  804. default:
  805. process_get_return(mailbox('get', 'alias_domain_details', $object));
  806. break;
  807. }
  808. break;
  809. case "alias":
  810. switch ($object) {
  811. case "all":
  812. $domains = array_merge(mailbox('get', 'domains'), mailbox('get', 'alias_domains'));
  813. if (!empty($domains)) {
  814. foreach ($domains as $domain) {
  815. $aliases = mailbox('get', 'aliases', $domain);
  816. if (!empty($aliases)) {
  817. foreach ($aliases as $alias) {
  818. if ($details = mailbox('get', 'alias_details', $alias)) {
  819. $data[] = $details;
  820. }
  821. else {
  822. continue;
  823. }
  824. }
  825. }
  826. }
  827. process_get_return($data);
  828. }
  829. else {
  830. echo '{}';
  831. }
  832. break;
  833. default:
  834. process_get_return(mailbox('get', 'alias_details', $object));
  835. break;
  836. }
  837. break;
  838. case "domain-admin":
  839. switch ($object) {
  840. case "all":
  841. $domain_admins = domain_admin('get');
  842. if (!empty($domain_admins)) {
  843. foreach ($domain_admins as $domain_admin) {
  844. if ($details = domain_admin('details', $domain_admin)) {
  845. $data[] = $details;
  846. }
  847. else {
  848. continue;
  849. }
  850. }
  851. process_get_return($data);
  852. }
  853. else {
  854. echo '{}';
  855. }
  856. break;
  857. default:
  858. process_get_return(domain_admin('details', $object));
  859. break;
  860. }
  861. break;
  862. case "u2f-registration":
  863. header('Content-Type: application/javascript');
  864. if (($_SESSION["mailcow_cc_role"] == "admin" || $_SESSION["mailcow_cc_role"] == "domainadmin") && $_SESSION["mailcow_cc_username"] == $object) {
  865. list($req, $sigs) = $u2f->getRegisterData(get_u2f_registrations($object));
  866. $_SESSION['regReq'] = json_encode($req);
  867. $_SESSION['regSigs'] = json_encode($sigs);
  868. echo 'var req = ' . json_encode($req) . ';';
  869. echo 'var registeredKeys = ' . json_encode($sigs) . ';';
  870. echo 'var appId = req.appId;';
  871. echo 'var registerRequests = [{version: req.version, challenge: req.challenge}];';
  872. }
  873. else {
  874. return;
  875. }
  876. break;
  877. case "u2f-authentication":
  878. header('Content-Type: application/javascript');
  879. if (isset($_SESSION['pending_mailcow_cc_username']) && $_SESSION['pending_mailcow_cc_username'] == $object) {
  880. $auth_data = $u2f->getAuthenticateData(get_u2f_registrations($object));
  881. $challenge = $auth_data[0]->challenge;
  882. $appId = $auth_data[0]->appId;
  883. foreach ($auth_data as $each) {
  884. $key = array(); // Empty array
  885. $key['version'] = $each->version;
  886. $key['keyHandle'] = $each->keyHandle;
  887. $registeredKey[] = $key;
  888. }
  889. $_SESSION['authReq'] = json_encode($auth_data);
  890. echo 'var appId = "' . $appId . '";';
  891. echo 'var challenge = ' . json_encode($challenge) . ';';
  892. echo 'var registeredKeys = ' . json_encode($registeredKey) . ';';
  893. }
  894. else {
  895. return;
  896. }
  897. break;
  898. default:
  899. echo '{}';
  900. break;
  901. }
  902. break;
  903. case "delete":
  904. function process_delete_return($return) {
  905. $generic_failure = json_encode(array(
  906. 'type' => 'error',
  907. 'msg' => 'Cannot delete item'
  908. ));
  909. $generic_success = json_encode(array(
  910. 'type' => 'success',
  911. 'msg' => 'Task completed'
  912. ));
  913. if ($return === false) {
  914. echo isset($_SESSION['return']) ? json_encode($_SESSION['return']) : $generic_failure;
  915. }
  916. else {
  917. echo isset($_SESSION['return']) ? json_encode($_SESSION['return']) : $generic_success;
  918. }
  919. }
  920. if (!isset($_POST['items'])) {
  921. echo $request_incomplete;
  922. exit;
  923. }
  924. else {
  925. $items = (array)json_decode($_POST['items'], true);
  926. }
  927. switch ($category) {
  928. case "alias":
  929. process_delete_return(mailbox('delete', 'alias', array('address' => $items)));
  930. break;
  931. case "relayhost":
  932. process_delete_return(relayhost('delete', array('id' => $items)));
  933. break;
  934. case "rsetting":
  935. process_delete_return(rsettings('delete', array('id' => $items)));
  936. break;
  937. case "syncjob":
  938. process_delete_return(mailbox('delete', 'syncjob', array('id' => $items)));
  939. break;
  940. case "filter":
  941. process_delete_return(mailbox('delete', 'filter', array('id' => $items)));
  942. break;
  943. case "qitem":
  944. process_delete_return(quarantine('delete', array('id' => $items)));
  945. break;
  946. case "bcc":
  947. process_delete_return(bcc('delete', array('id' => $items)));
  948. break;
  949. case "recipient_map":
  950. process_delete_return(recipient_map('delete', array('id' => $items)));
  951. break;
  952. case "fwdhost":
  953. process_delete_return(fwdhost('delete', array('forwardinghost' => $items)));
  954. break;
  955. case "dkim":
  956. process_delete_return(dkim('delete', array('domains' => $items)));
  957. break;
  958. case "domain":
  959. file_put_contents('/tmp/dssaa', $items);
  960. process_delete_return(mailbox('delete', 'domain', array('domain' => $items)));
  961. break;
  962. case "alias-domain":
  963. process_delete_return(mailbox('delete', 'alias_domain', array('alias_domain' => $items)));
  964. break;
  965. case "mailbox":
  966. process_delete_return(mailbox('delete', 'mailbox', array('username' => $items)));
  967. break;
  968. case "resource":
  969. process_delete_return(mailbox('delete', 'resource', array('name' => $items)));
  970. break;
  971. case "mailbox-policy":
  972. process_delete_return(policy('delete', 'mailbox', array('prefid' => $items)));
  973. break;
  974. case "domain-policy":
  975. process_delete_return(policy('delete', 'domain', array('prefid' => $items)));
  976. break;
  977. case "time_limited_alias":
  978. process_delete_return(mailbox('delete', 'time_limited_alias', array('address' => $items)));
  979. break;
  980. case "eas_cache":
  981. process_delete_return(mailbox('delete', 'eas_cache', array('username' => $items)));
  982. break;
  983. case "domain-admin":
  984. process_delete_return(domain_admin('delete', array('username' => $items)));
  985. break;
  986. }
  987. break;
  988. case "edit":
  989. function process_edit_return($return) {
  990. $generic_failure = json_encode(array(
  991. 'type' => 'error',
  992. 'msg' => 'Cannot edit item'
  993. ));
  994. $generic_success = json_encode(array(
  995. 'type' => 'success',
  996. 'msg' => 'Task completed'
  997. ));
  998. if ($return === false) {
  999. echo isset($_SESSION['return']) ? json_encode($_SESSION['return']) : $generic_failure;
  1000. }
  1001. else {
  1002. echo isset($_SESSION['return']) ? json_encode($_SESSION['return']) : $generic_success;
  1003. }
  1004. }
  1005. if (!isset($_POST['attr'])) {
  1006. echo $request_incomplete;
  1007. exit;
  1008. }
  1009. else {
  1010. $attr = (array)json_decode($_POST['attr'], true);
  1011. $items = isset($_POST['items']) ? (array)json_decode($_POST['items'], true) : null;
  1012. }
  1013. switch ($category) {
  1014. case "bcc":
  1015. process_edit_return(bcc('edit', array_merge(array('id' => $items), $attr)));
  1016. break;
  1017. case "oauth2-client":
  1018. process_edit_return(oauth2('edit', 'client', array_merge(array('id' => $items), $attr)));
  1019. break;
  1020. case "recipient_map":
  1021. process_edit_return(recipient_map('edit', array_merge(array('id' => $items), $attr)));
  1022. break;
  1023. case "alias":
  1024. process_edit_return(mailbox('edit', 'alias', array_merge(array('address' => $items), $attr)));
  1025. break;
  1026. case "app_links":
  1027. process_edit_return(customize('edit', 'app_links', $attr));
  1028. break;
  1029. case "relayhost":
  1030. process_edit_return(relayhost('edit', array_merge(array('id' => $items), $attr)));
  1031. break;
  1032. case "rsetting":
  1033. process_edit_return(rsettings('edit', array_merge(array('id' => $items), $attr)));
  1034. break;
  1035. case "delimiter_action":
  1036. process_edit_return(mailbox('edit', 'delimiter_action', array_merge(array('username' => $items), $attr)));
  1037. break;
  1038. case "tls_policy":
  1039. process_edit_return(mailbox('edit', 'tls_policy', array_merge(array('username' => $items), $attr)));
  1040. break;
  1041. case "qitem":
  1042. process_edit_return(quarantine('edit', array_merge(array('id' => $items), $attr)));
  1043. break;
  1044. case "quarantine":
  1045. process_edit_return(quarantine('edit', $attr));
  1046. break;
  1047. case "time_limited_alias":
  1048. process_edit_return(mailbox('edit', 'time_limited_alias', array_merge(array('address' => $items), $attr)));
  1049. break;
  1050. case "mailbox":
  1051. process_edit_return(mailbox('edit', 'mailbox', array_merge(array('username' => $items), $attr)));
  1052. break;
  1053. case "syncjob":
  1054. process_edit_return(mailbox('edit', 'syncjob', array_merge(array('id' => $items), $attr)));
  1055. break;
  1056. case "filter":
  1057. process_edit_return(mailbox('edit', 'filter', array_merge(array('id' => $items), $attr)));
  1058. break;
  1059. case "resource":
  1060. process_edit_return(mailbox('edit', 'resource', array_merge(array('name' => $items), $attr)));
  1061. break;
  1062. case "domain":
  1063. process_edit_return(mailbox('edit', 'domain', array_merge(array('domain' => $items), $attr)));
  1064. break;
  1065. case "ratelimit":
  1066. process_edit_return(mailbox('edit', 'ratelimit', array_merge(array('object' => $items), $attr)));
  1067. break;
  1068. case "alias-domain":
  1069. process_edit_return(mailbox('edit', 'alias_domain', array_merge(array('alias_domain' => $items), $attr)));
  1070. break;
  1071. case "spam-score":
  1072. process_edit_return(mailbox('edit', 'spam_score', array_merge(array('username' => $items), $attr)));
  1073. break;
  1074. case "domain-admin":
  1075. process_edit_return(domain_admin('edit', array_merge(array('username' => $items), $attr)));
  1076. break;
  1077. case "fwdhost":
  1078. process_edit_return(fwdhost('edit', array_merge(array('fwdhost' => $items), $attr)));
  1079. break;
  1080. case "fail2ban":
  1081. process_edit_return(fail2ban('edit', $attr));
  1082. break;
  1083. case "ui_texts":
  1084. process_edit_return(customize('edit', 'ui_texts', $attr));
  1085. break;
  1086. case "self":
  1087. if ($_SESSION['mailcow_cc_role'] == "domainadmin") {
  1088. process_edit_return(domain_admin('edit', $attr));
  1089. }
  1090. elseif ($_SESSION['mailcow_cc_role'] == "user") {
  1091. process_edit_return(edit_user_account($attr));
  1092. }
  1093. elseif ($_SESSION['mailcow_cc_role'] == "admin") {
  1094. process_edit_return(edit_admin_account($attr));
  1095. }
  1096. break;
  1097. }
  1098. break;
  1099. }
  1100. }
  1101. }