functions.xmpp.inc.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. function xmpp_control($_action, $_data = null) {
  3. global $lang;
  4. $_data_log = $_data;
  5. switch ($_action) {
  6. case 'reload':
  7. $curl = curl_init();
  8. curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
  9. curl_setopt($curl, CURLOPT_URL, 'https://ejabberd:5443/api/reload_config');
  10. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  11. curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
  12. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  13. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  14. $response = curl_exec($curl);
  15. curl_close($curl);
  16. if ($response === "0") {
  17. $_SESSION['return'][] = array(
  18. 'type' => 'success',
  19. 'log' => array(__FUNCTION__, $_action, $_data_log),
  20. 'msg' => 'xmpp_reloaded'
  21. );
  22. }
  23. else {
  24. $_SESSION['return'][] = array(
  25. 'type' => 'danger',
  26. 'log' => array(__FUNCTION__, $_action, $_data_log),
  27. 'msg' => 'xmpp_reload_failed'
  28. );
  29. }
  30. break;
  31. case 'restart':
  32. $curl = curl_init();
  33. curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
  34. curl_setopt($curl, CURLOPT_URL, 'https://ejabberd:5443/api/restart');
  35. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  36. curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
  37. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  38. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  39. $response = curl_exec($curl);
  40. curl_close($curl);
  41. if ($response === "0") {
  42. $_SESSION['return'][] = array(
  43. 'type' => 'success',
  44. 'log' => array(__FUNCTION__, $_action, $_data_log),
  45. 'msg' => 'xmpp_restarted'
  46. );
  47. }
  48. else {
  49. // If no host is available, the container might be in sleeping state, we need to restart the container
  50. $response = json_decode(docker('post', 'ejabberd-mailcow', 'restart'), true);
  51. if (isset($response['type']) && $response['type'] == "success") {
  52. $_SESSION['return'][] = array(
  53. 'type' => 'success',
  54. 'log' => array(__FUNCTION__, $_action, $_data_log),
  55. 'msg' => 'xmpp_restarted'
  56. );
  57. }
  58. else {
  59. $_SESSION['return'][] = array(
  60. 'type' => 'danger',
  61. 'log' => array(__FUNCTION__, $_action, $_data_log),
  62. 'msg' => 'xmpp_restart_failed'
  63. );
  64. }
  65. }
  66. break;
  67. case 'status':
  68. if ($_SESSION['mailcow_cc_role'] != "admin") {
  69. $_SESSION['return'][] = array(
  70. 'type' => 'danger',
  71. 'log' => array(__FUNCTION__, $_action, $_data_log),
  72. 'msg' => 'access_denied'
  73. );
  74. return false;
  75. }
  76. foreach (array(
  77. 'onlineusers' => 'stats?name=onlineusers',
  78. 'uptimeseconds' => 'stats?name=uptimeseconds',
  79. 'muc_online_rooms' => 'muc_online_rooms?service=global'
  80. ) as $stat => $url) {
  81. $curl = curl_init();
  82. curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
  83. curl_setopt($curl, CURLOPT_URL, 'https://ejabberd:5443/api/' . $url);
  84. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  85. curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
  86. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  87. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  88. $response_json = json_decode(curl_exec($curl), true);
  89. if (isset($response_json['stat'])) {
  90. $response_data[$stat] = $response_json['stat'];
  91. }
  92. else {
  93. $response_data[$stat] = $response_json;
  94. }
  95. curl_close($curl);
  96. // Something went wrong
  97. if ($response_data[$stat] === false) {
  98. $response_data[$stat] = '?';
  99. }
  100. }
  101. return $response_data;
  102. break;
  103. }
  104. }
  105. function xmpp_rebuild_configs() {
  106. global $pdo;
  107. global $lang;
  108. $_data_log = $_data;
  109. try {
  110. $xmpp_domains = array();
  111. $stmt = $pdo->query('SELECT CONCAT(`xmpp_prefix`, ".", `domain`) AS `xmpp_host`, `domain` FROM `domain` WHERE `xmpp` = 1');
  112. $xmpp_domain_rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  113. foreach ($xmpp_domain_rows as $xmpp_domain_row) {
  114. $xmpp_domains[$xmpp_domain_row['domain']] = array('xmpp_host' => $xmpp_domain_row['xmpp_host']);
  115. $stmt = $pdo->query('SELECT CONCAT(`local_part`, "@", CONCAT(`domain`.`xmpp_prefix`, ".", `domain`.`domain`)) AS `xmpp_username` FROM `mailbox`
  116. JOIN `domain`
  117. WHERE `domain`.`xmpp` = 1
  118. AND JSON_VALUE(`attributes`, "$.xmpp_admin") = 1');
  119. $xmpp_admin_rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  120. foreach ($xmpp_admin_rows as $xmpp_admin_row) {
  121. $xmpp_domains[$xmpp_domain_row['domain']]['xmpp_admins'][] = $xmpp_admin_row['xmpp_username'];
  122. }
  123. }
  124. touch('/ejabberd/ejabberd_hosts.yml');
  125. touch('/ejabberd/ejabberd_acl.yml');
  126. $ejabberd_hosts_md5 = md5_file('/ejabberd/ejabberd_hosts.yml');
  127. $ejabberd_acl_md5 = md5_file('/ejabberd/ejabberd_acl.yml');
  128. if (!empty($xmpp_domains)) {
  129. // Handle hosts file
  130. $map_handle = fopen('/ejabberd/ejabberd_hosts.yml', 'w');
  131. if (!$map_handle) {
  132. throw new Exception($lang['danger']['file_open_error']);
  133. }
  134. fwrite($map_handle, '# Autogenerated by mailcow' . PHP_EOL);
  135. fwrite($map_handle, 'hosts:' . PHP_EOL);
  136. foreach ($xmpp_domains as $domain => $domain_values) {
  137. fwrite($map_handle, ' - ' . $xmpp_domains[$domain]['xmpp_host'] . PHP_EOL);
  138. }
  139. fclose($map_handle);
  140. // Handle ACL file
  141. $map_handle = fopen('/ejabberd/ejabberd_acl.yml', 'w');
  142. if (!$map_handle) {
  143. throw new Exception($lang['danger']['file_open_error']);
  144. }
  145. fwrite($map_handle, '# Autogenerated by mailcow' . PHP_EOL);
  146. fwrite($map_handle, 'append_host_config:' . PHP_EOL);
  147. foreach ($xmpp_domains as $domain => $domain_values) {
  148. fwrite($map_handle, ' ' . $xmpp_domains[$domain]['xmpp_host'] . ':' . PHP_EOL);
  149. fwrite($map_handle, ' acl:' . PHP_EOL);
  150. fwrite($map_handle, ' admin:' . PHP_EOL);
  151. fwrite($map_handle, ' user:' . PHP_EOL);
  152. foreach ($xmpp_domains[$domain]['xmpp_admins'] as $xmpp_admin) {
  153. fwrite($map_handle, ' - ' . $xmpp_admin . PHP_EOL);
  154. }
  155. }
  156. fclose($map_handle);
  157. }
  158. else {
  159. // Write empty hosts file
  160. $map_handle = fopen('/ejabberd/ejabberd_hosts.yml', 'w');
  161. if (!$map_handle) {
  162. throw new Exception($lang['danger']['file_open_error']);
  163. }
  164. fwrite($map_handle, '# Autogenerated by mailcow' . PHP_EOL);
  165. fclose($map_handle);
  166. // Write empty ACL file
  167. $map_handle = fopen('/ejabberd/ejabberd_acl.yml', 'w');
  168. if (!$map_handle) {
  169. throw new Exception($lang['danger']['file_open_error']);
  170. }
  171. fwrite($map_handle, '# Autogenerated by mailcow' . PHP_EOL);
  172. fclose($map_handle);
  173. }
  174. if (md5_file('/ejabberd/ejabberd_acl.yml') != $ejabberd_acl_md5) {
  175. xmpp_control('restart');
  176. $_SESSION['return'][] = array(
  177. 'type' => 'success',
  178. 'log' => array(__FUNCTION__, $_action, $_data_log),
  179. 'msg' => 'xmpp_maps_updated'
  180. );
  181. }
  182. elseif (md5_file('/ejabberd/ejabberd_hosts.yml') != $ejabberd_hosts_md5) {
  183. xmpp_control('reload');
  184. $_SESSION['return'][] = array(
  185. 'type' => 'success',
  186. 'log' => array(__FUNCTION__, $_action, $_data_log),
  187. 'msg' => 'xmpp_maps_updated'
  188. );
  189. }
  190. }
  191. catch (Exception $e) {
  192. $_SESSION['return'][] = array(
  193. 'type' => 'danger',
  194. 'log' => array(__FUNCTION__, $_action, $_data_log),
  195. 'msg' => array('xmpp_map_write_error', htmlspecialchars($e->getMessage()))
  196. );
  197. }
  198. }