functions.app_passwd.inc.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <?php
  2. function app_passwd($_action, $_data = null) {
  3. global $pdo;
  4. global $lang;
  5. $_data_log = $_data;
  6. if (isset($_data['username']) && filter_var($_data['username'], FILTER_VALIDATE_EMAIL)) {
  7. if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data['username'])) {
  8. $_SESSION['return'][] = array(
  9. 'type' => 'danger',
  10. 'log' => array(__FUNCTION__, $_action, $_data_log),
  11. 'msg' => 'access_denied'
  12. );
  13. return false;
  14. }
  15. else {
  16. $username = $_data['username'];
  17. }
  18. }
  19. else {
  20. $username = $_SESSION['mailcow_cc_username'];
  21. }
  22. switch ($_action) {
  23. case 'add':
  24. $name = trim($_data['name']);
  25. $password = $_data['password'];
  26. $password2 = $_data['password2'];
  27. $active = intval($_data['active']);
  28. $domain = mailbox('get', 'mailbox_details', $username)['domain'];
  29. if (empty($domain)) {
  30. $_SESSION['return'][] = array(
  31. 'type' => 'danger',
  32. 'log' => array(__FUNCTION__, $_action, $_data_log),
  33. 'msg' => 'access_denied'
  34. );
  35. return false;
  36. }
  37. if (!empty($password) && !empty($password2)) {
  38. if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
  39. $_SESSION['return'][] = array(
  40. 'type' => 'danger',
  41. 'log' => array(__FUNCTION__, $_action, $_data_log),
  42. 'msg' => 'password_complexity'
  43. );
  44. return false;
  45. }
  46. if ($password != $password2) {
  47. $_SESSION['return'][] = array(
  48. 'type' => 'danger',
  49. 'log' => array(__FUNCTION__, $_action, $_data_log),
  50. 'msg' => 'password_mismatch'
  51. );
  52. return false;
  53. }
  54. $password_hashed = hash_password($password);
  55. }
  56. if (empty($name)) {
  57. $_SESSION['return'][] = array(
  58. 'type' => 'danger',
  59. 'log' => array(__FUNCTION__, $_action, $_data_log),
  60. 'msg' => 'app_name_empty'
  61. );
  62. return false;
  63. }
  64. try {
  65. $stmt = $pdo->prepare("INSERT INTO `app_passwd` (`name`, `mailbox`, `domain`, `password`, `active`)
  66. VALUES (:name, :mailbox, :domain, :password, :active)");
  67. $stmt->execute(array(
  68. ':name' => $name,
  69. ':mailbox' => $mailbox,
  70. ':domain' => $domain,
  71. ':password' => $password,
  72. ':active' => $active
  73. ));
  74. }
  75. catch (PDOException $e) {
  76. $_SESSION['return'][] = array(
  77. 'type' => 'danger',
  78. 'log' => array(__FUNCTION__, $_action, $_data_log),
  79. 'msg' => array('mysql_error', $e)
  80. );
  81. return false;
  82. }
  83. $_SESSION['return'][] = array(
  84. 'type' => 'success',
  85. 'log' => array(__FUNCTION__, $_action, $_data_log),
  86. 'msg' => 'app_passwd_added'
  87. );
  88. break;
  89. case 'edit':
  90. $ids = (array)$_data['id'];
  91. foreach ($ids as $id) {
  92. $is_now = app_passwd('details', $id);
  93. if (!empty($is_now)) {
  94. $name = (!empty($_data['name'])) ? $_data['name'] : $is_now['name'];
  95. $password = (!empty($_data['password'])) ? $_data['password'] : null;
  96. $password2 = (!empty($_data['password2'])) ? $_data['password2'] : null;
  97. $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int'];
  98. }
  99. else {
  100. $_SESSION['return'][] = array(
  101. 'type' => 'danger',
  102. 'log' => array(__FUNCTION__, $_action, $_data_log),
  103. 'msg' => array('settings_map_invalid', $id)
  104. );
  105. continue;
  106. }
  107. $name = trim($name);
  108. if (!empty($password) && !empty($password2)) {
  109. if (!preg_match('/' . $GLOBALS['PASSWD_REGEP'] . '/', $password)) {
  110. $_SESSION['return'][] = array(
  111. 'type' => 'danger',
  112. 'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
  113. 'msg' => 'password_complexity'
  114. );
  115. continue;
  116. }
  117. if ($password != $password2) {
  118. $_SESSION['return'][] = array(
  119. 'type' => 'danger',
  120. 'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
  121. 'msg' => 'password_mismatch'
  122. );
  123. continue;
  124. }
  125. $password_hashed = hash_password($password);
  126. $stmt = $pdo->prepare("UPDATE `app_passwd` SET
  127. `password` = :password_hashed
  128. WHERE `mailbox` = :username AND `id` = :id");
  129. $stmt->execute(array(
  130. ':password_hashed' => $password_hashed,
  131. ':username' => $username,
  132. ':id' => $id
  133. ));
  134. }
  135. try {
  136. $stmt = $pdo->prepare("UPDATE `app_passwd` SET
  137. `name` = :name,
  138. `mailbox` = :username,
  139. `active` = :active
  140. WHERE `id` = :id");
  141. $stmt->execute(array(
  142. ':name' => $name,
  143. ':username' => $username,
  144. ':active' => $active,
  145. ':id' => $id
  146. ));
  147. }
  148. catch (PDOException $e) {
  149. $_SESSION['return'][] = array(
  150. 'type' => 'danger',
  151. 'log' => array(__FUNCTION__, $_action, $_data_log),
  152. 'msg' => array('mysql_error', $e)
  153. );
  154. continue;
  155. }
  156. $_SESSION['return'][] = array(
  157. 'type' => 'success',
  158. 'log' => array(__FUNCTION__, $_action, $_data_log),
  159. 'msg' => array('object_modified', htmlspecialchars($ids))
  160. );
  161. }
  162. break;
  163. case 'delete':
  164. $ids = (array)$_data['id'];
  165. foreach ($ids as $id) {
  166. try {
  167. $stmt = $pdo->prepare("DELETE FROM `app_passwd` WHERE `id`= :id AND `mailbox`= :username");
  168. $stmt->execute(array(':id' => $id, ':username' => $username));
  169. }
  170. catch (PDOException $e) {
  171. $_SESSION['return'][] = array(
  172. 'type' => 'danger',
  173. 'log' => array(__FUNCTION__, $_action, $_data_log),
  174. 'msg' => array('mysql_error', $e)
  175. );
  176. return false;
  177. }
  178. $_SESSION['return'][] = array(
  179. 'type' => 'success',
  180. 'log' => array(__FUNCTION__, $_action, $_data_log),
  181. 'msg' => array('app_passwd_removed', htmlspecialchars($id))
  182. );
  183. }
  184. break;
  185. case 'get':
  186. $app_passwds = array();
  187. $stmt = $pdo->prepare("SELECT `id`, `name` FROM `app_passwd` WHERE `mailbox` = :username");
  188. $stmt->execute(array(':username' => $username));
  189. $app_passwds = $stmt->fetchAll(PDO::FETCH_ASSOC);
  190. return $app_passwds;
  191. break;
  192. case 'details':
  193. $app_passwd_data = array();
  194. $stmt = $pdo->prepare("SELECT `id`,
  195. `name`,
  196. `mailbox`,
  197. `domain`,
  198. `created`,
  199. `modified`,
  200. `active` AS `active_int`,
  201. CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`
  202. FROM `app_passwd`
  203. WHERE `id` = :id
  204. AND `mailbox` = :username");
  205. $stmt->execute(array(':id' => $_data, ':username' => $username));
  206. $app_passwd_data = $stmt->fetch(PDO::FETCH_ASSOC);
  207. return $app_passwd_data;
  208. break;
  209. }
  210. }