functions.pushover.inc.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <?php
  2. function pushover($_action, $_data = null) {
  3. global $pdo;
  4. global $lang;
  5. switch ($_action) {
  6. case 'edit':
  7. if (!isset($_SESSION['acl']['pushover']) || $_SESSION['acl']['pushover'] != "1" ) {
  8. $_SESSION['return'][] = array(
  9. 'type' => 'danger',
  10. 'log' => array(__FUNCTION__, $_action, $_data),
  11. 'msg' => 'access_denied'
  12. );
  13. return false;
  14. }
  15. if (!is_array($_data['username'])) {
  16. $usernames = array();
  17. $usernames[] = $_data['username'];
  18. }
  19. else {
  20. $usernames = $_data['username'];
  21. }
  22. foreach ($usernames as $username) {
  23. if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $username)) {
  24. $_SESSION['return'][] = array(
  25. 'type' => 'danger',
  26. 'log' => array(__FUNCTION__, $_action, $_data),
  27. 'msg' => 'access_denied'
  28. );
  29. continue;
  30. }
  31. $delete = $_data['delete'];
  32. if ($delete == "true") {
  33. $stmt = $pdo->prepare("DELETE FROM `pushover` WHERE `username` = :username");
  34. $stmt->execute(array(
  35. ':username' => $username
  36. ));
  37. $_SESSION['return'][] = array(
  38. 'type' => 'success',
  39. 'log' => array(__FUNCTION__, $_action, $_data, $_data),
  40. 'msg' => 'pushover_settings_edited'
  41. );
  42. continue;
  43. }
  44. $key = $_data['key'];
  45. $token = $_data['token'];
  46. $evaluate_x_prio = $_data['evaluate_x_prio'];
  47. $only_x_prio = $_data['only_x_prio'];
  48. $senders = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['senders']));
  49. foreach ($senders as $i => &$sender) {
  50. if (empty($sender)) {
  51. continue;
  52. }
  53. if (!filter_var($sender, FILTER_VALIDATE_EMAIL) === true) {
  54. unset($senders[$i]);
  55. continue;
  56. }
  57. $senders[$i] = preg_replace('/\.(?=.*?@gmail\.com$)/', '$1', $sender);
  58. }
  59. $senders = array_filter($senders);
  60. if (empty($senders)) { $senders = ''; }
  61. $senders = implode(",", $senders);
  62. if (!ctype_alnum($key) || strlen($key) != 30) {
  63. $_SESSION['return'][] = array(
  64. 'type' => 'danger',
  65. 'log' => array(__FUNCTION__, $_action, $_data, $_data),
  66. 'msg' => 'pushover_key'
  67. );
  68. continue;
  69. }
  70. if (!ctype_alnum($token) || strlen($token) != 30) {
  71. $_SESSION['return'][] = array(
  72. 'type' => 'danger',
  73. 'log' => array(__FUNCTION__, $_action, $_data, $_data),
  74. 'msg' => 'pushover_token'
  75. );
  76. continue;
  77. }
  78. $title = $_data['title'];
  79. $text = $_data['text'];
  80. $active = intval($_data['active']);
  81. $po_attributes = json_encode(
  82. array(
  83. 'evaluate_x_prio' => strval(intval($evaluate_x_prio)),
  84. 'only_x_prio' => strval(intval($only_x_prio))
  85. )
  86. );
  87. $stmt = $pdo->prepare("REPLACE INTO `pushover` (`username`, `key`, `attributes`, `senders`, `token`, `title`, `text`, `active`)
  88. VALUES (:username, :key, :po_attributes, :senders, :token, :title, :text, :active)");
  89. $stmt->execute(array(
  90. ':username' => $username,
  91. ':key' => $key,
  92. ':po_attributes' => $po_attributes,
  93. ':senders' => $senders,
  94. ':token' => $token,
  95. ':title' => $title,
  96. ':text' => $text,
  97. ':active' => $active
  98. ));
  99. $_SESSION['return'][] = array(
  100. 'type' => 'success',
  101. 'log' => array(__FUNCTION__, $_action, $_data, $_data),
  102. 'msg' => 'pushover_settings_edited'
  103. );
  104. }
  105. break;
  106. case 'get':
  107. if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data)) {
  108. $_SESSION['return'][] = array(
  109. 'type' => 'danger',
  110. 'log' => array(__FUNCTION__, $_action, $_data),
  111. 'msg' => 'access_denied'
  112. );
  113. return false;
  114. }
  115. $stmt = $pdo->prepare("SELECT * FROM `pushover` WHERE `username` = :username");
  116. $stmt->execute(array(
  117. ':username' => $_data
  118. ));
  119. $data = $stmt->fetch(PDO::FETCH_ASSOC);
  120. $data['attributes'] = json_decode($data['attributes'], true);
  121. if (empty($data)) {
  122. return false;
  123. }
  124. else {
  125. return $data;
  126. }
  127. break;
  128. case 'test':
  129. if (!isset($_SESSION['acl']['pushover']) || $_SESSION['acl']['pushover'] != "1" ) {
  130. $_SESSION['return'][] = array(
  131. 'type' => 'danger',
  132. 'log' => array(__FUNCTION__, $_action, $_data),
  133. 'msg' => 'access_denied'
  134. );
  135. return false;
  136. }
  137. if (!is_array($_data['username'])) {
  138. $usernames = array();
  139. $usernames[] = $_data['username'];
  140. }
  141. else {
  142. $usernames = $_data['username'];
  143. }
  144. foreach ($usernames as $username) {
  145. if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $username)) {
  146. $_SESSION['return'][] = array(
  147. 'type' => 'danger',
  148. 'log' => array(__FUNCTION__, $_action, $_data),
  149. 'msg' => 'access_denied'
  150. );
  151. continue;
  152. }
  153. $stmt = $pdo->prepare("SELECT * FROM `pushover`
  154. WHERE `username` = :username");
  155. $stmt->execute(array(
  156. ':username' => $username
  157. ));
  158. $api_data = $stmt->fetch(PDO::FETCH_ASSOC);
  159. if (!empty($api_data)) {
  160. $title = (!empty($api_data['title'])) ? $api_data['title'] : 'Mail';
  161. $text = (!empty($api_data['text'])) ? $api_data['text'] : 'You\'ve got mail 📧';
  162. curl_setopt_array($ch = curl_init(), array(
  163. CURLOPT_URL => "https://api.pushover.net/1/users/validate.json",
  164. CURLOPT_POSTFIELDS => array(
  165. "token" => $api_data['token'],
  166. "user" => $api_data['key']
  167. ),
  168. CURLOPT_SAFE_UPLOAD => true,
  169. CURLOPT_RETURNTRANSFER => true,
  170. ));
  171. $result = curl_exec($ch);
  172. $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  173. curl_close($ch);
  174. if ($httpcode == 200) {
  175. $_SESSION['return'][] = array(
  176. 'type' => 'success',
  177. 'log' => array(__FUNCTION__, $_action, $_data),
  178. 'msg' => sprintf('Pushover API OK (%d): %s', $httpcode, $result)
  179. );
  180. }
  181. else {
  182. $_SESSION['return'][] = array(
  183. 'type' => 'danger',
  184. 'log' => array(__FUNCTION__, $_action, $_data),
  185. 'msg' => sprintf('Pushover API ERR (%d): %s', $httpcode, $result)
  186. );
  187. }
  188. }
  189. else {
  190. $_SESSION['return'][] = array(
  191. 'type' => 'danger',
  192. 'log' => array(__FUNCTION__, $_action, $_data),
  193. 'msg' => 'pushover_credentials_missing'
  194. );
  195. return false;
  196. }
  197. }
  198. break;
  199. }
  200. }