functions.relayhost.inc.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. function relayhost($_action, $_data = null) {
  3. global $pdo;
  4. global $lang;
  5. switch ($_action) {
  6. case 'add':
  7. if ($_SESSION['mailcow_cc_role'] != "admin") {
  8. $_SESSION['return'] = array(
  9. 'type' => 'danger',
  10. 'msg' => sprintf($lang['danger']['access_denied'])
  11. );
  12. return false;
  13. }
  14. $hostname = trim($_data['hostname']);
  15. $username = str_replace(':', '\:', trim($_data['username']));
  16. $password = str_replace(':', '\:', trim($_data['password']));
  17. if (empty($hostname)) {
  18. $_SESSION['return'] = array(
  19. 'type' => 'danger',
  20. 'msg' => 'Invalid host specified: '. htmlspecialchars($host)
  21. );
  22. return false;
  23. }
  24. try {
  25. $stmt = $pdo->prepare("INSERT INTO `relayhosts` (`hostname`, `username` ,`password`, `active`)
  26. VALUES (:hostname, :username, :password, :active)");
  27. $stmt->execute(array(
  28. ':hostname' => $hostname,
  29. ':username' => $username,
  30. ':password' => str_replace(':', '\:', $password),
  31. ':active' => '1'
  32. ));
  33. }
  34. catch (PDOException $e) {
  35. $_SESSION['return'] = array(
  36. 'type' => 'danger',
  37. 'msg' => 'MySQL: '.$e
  38. );
  39. return false;
  40. }
  41. $_SESSION['return'] = array(
  42. 'type' => 'success',
  43. 'msg' => sprintf($lang['success']['relayhost_added'], htmlspecialchars(implode(', ', $hosts)))
  44. );
  45. break;
  46. case 'edit':
  47. if ($_SESSION['mailcow_cc_role'] != "admin") {
  48. $_SESSION['return'] = array(
  49. 'type' => 'danger',
  50. 'msg' => sprintf($lang['danger']['access_denied'])
  51. );
  52. return false;
  53. }
  54. $ids = (array)$_data['id'];
  55. foreach ($ids as $id) {
  56. $is_now = relayhost('details', $id);
  57. if (!empty($is_now)) {
  58. $hostname = (!empty($_data['hostname'])) ? trim($_data['hostname']) : $is_now['hostname'];
  59. $username = (!empty($_data['username'])) ? trim($_data['username']) : $is_now['username'];
  60. $password = (!empty($_data['password'])) ? trim($_data['password']) : $is_now['password'];
  61. $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int'];
  62. }
  63. else {
  64. $_SESSION['return'] = array(
  65. 'type' => 'danger',
  66. 'msg' => 'Relayhost invalid'
  67. );
  68. return false;
  69. }
  70. try {
  71. $stmt = $pdo->prepare("UPDATE `relayhosts` SET
  72. `hostname` = :hostname,
  73. `username` = :username,
  74. `password` = :password,
  75. `active` = :active
  76. WHERE `id` = :id");
  77. $stmt->execute(array(
  78. ':id' => $id,
  79. ':hostname' => $hostname,
  80. ':username' => $username,
  81. ':password' => $password,
  82. ':active' => $active
  83. ));
  84. }
  85. catch (PDOException $e) {
  86. $_SESSION['return'] = array(
  87. 'type' => 'danger',
  88. 'msg' => 'MySQL: '.$e
  89. );
  90. return false;
  91. }
  92. }
  93. $_SESSION['return'] = array(
  94. 'type' => 'success',
  95. 'msg' => sprintf($lang['success']['object_modified'], htmlspecialchars(implode(', ', $hostnames)))
  96. );
  97. break;
  98. case 'delete':
  99. if ($_SESSION['mailcow_cc_role'] != "admin") {
  100. $_SESSION['return'] = array(
  101. 'type' => 'danger',
  102. 'msg' => sprintf($lang['danger']['access_denied'])
  103. );
  104. return false;
  105. }
  106. $ids = (array)$_data['id'];
  107. foreach ($ids as $id) {
  108. try {
  109. $stmt = $pdo->prepare("DELETE FROM `relayhosts` WHERE `id`= :id");
  110. $stmt->execute(array(':id' => $id));
  111. $stmt = $pdo->prepare("UPDATE `domain` SET `relayhost` = '0' WHERE `relayhost`= :id");
  112. $stmt->execute(array(':id' => $id));
  113. }
  114. catch (PDOException $e) {
  115. $_SESSION['return'] = array(
  116. 'type' => 'danger',
  117. 'msg' => 'MySQL: '.$e
  118. );
  119. return false;
  120. }
  121. }
  122. $_SESSION['return'] = array(
  123. 'type' => 'success',
  124. 'msg' => sprintf($lang['success']['relayhost_removed'], htmlspecialchars(implode(', ', $hostnames)))
  125. );
  126. break;
  127. case 'get':
  128. if ($_SESSION['mailcow_cc_role'] != "admin") {
  129. return false;
  130. }
  131. $relayhosts = array();
  132. try {
  133. $stmt = $pdo->query("SELECT `id`, `hostname`, `username` FROM `relayhosts`");
  134. $relayhosts = $stmt->fetchAll(PDO::FETCH_ASSOC);
  135. }
  136. catch(PDOException $e) {
  137. $_SESSION['return'] = array(
  138. 'type' => 'danger',
  139. 'msg' => 'MySQL: '.$e
  140. );
  141. }
  142. return $relayhosts;
  143. break;
  144. case 'details':
  145. if ($_SESSION['mailcow_cc_role'] != "admin" || !isset($_data)) {
  146. return false;
  147. }
  148. $relayhostdata = array();
  149. try {
  150. $stmt = $pdo->prepare("SELECT `id`,
  151. `hostname`,
  152. `username`,
  153. `password`,
  154. `active` AS `active_int`,
  155. CONCAT(LEFT(`password`, 3), '...') AS `password_short`,
  156. CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`
  157. FROM `relayhosts`
  158. WHERE `id` = :id");
  159. $stmt->execute(array(':id' => $_data));
  160. $relayhostdata = $stmt->fetch(PDO::FETCH_ASSOC);
  161. if (!empty($relayhostdata)) {
  162. $stmt = $pdo->prepare("SELECT GROUP_CONCAT(`domain` SEPARATOR ', ') AS `used_by_domains` FROM `domain` WHERE `relayhost` = :id");
  163. $stmt->execute(array(':id' => $_data));
  164. $used_by_domains = $stmt->fetch(PDO::FETCH_ASSOC)['used_by_domains'];
  165. $used_by_domains = (empty($used_by_domains)) ? '' : $used_by_domains;
  166. $relayhostdata['used_by_domains'] = $used_by_domains;
  167. }
  168. }
  169. catch(PDOException $e) {
  170. $_SESSION['return'] = array(
  171. 'type' => 'danger',
  172. 'msg' => 'MySQL: '.$e
  173. );
  174. }
  175. return $relayhostdata;
  176. break;
  177. }
  178. }