functions.oauth2.inc.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. function oauth2($_action, $_type, $_data = null) {
  3. global $pdo;
  4. global $redis;
  5. global $lang;
  6. if ($_SESSION['mailcow_cc_role'] != "admin") {
  7. $_SESSION['return'] = array(
  8. 'type' => 'danger',
  9. 'msg' => sprintf($lang['danger']['access_denied'])
  10. );
  11. return false;
  12. }
  13. switch ($_action) {
  14. case 'add':
  15. switch ($_type) {
  16. case 'client':
  17. $client_id = $_data['client_id'];
  18. $client_secret = $_data['client_secret'];
  19. $redirect_uri = $_data['redirect_uri'];
  20. // $grant_type = isset($_data['grant_type']) ? $_data['grant_type'] : 'authorization_code';
  21. // $scope = isset($_data['scope']) ? $_data['scope'] : 'profile';
  22. if ($grant_type != "authorization_code" && $grant_type != "password") {
  23. $_SESSION['return'] = array(
  24. 'type' => 'danger',
  25. 'msg' => sprintf($lang['danger']['access_denied'])
  26. );
  27. return false;
  28. }
  29. // For future use
  30. if ($scope != "profile") {
  31. $_SESSION['return'] = array(
  32. 'type' => 'danger',
  33. 'msg' => sprintf($lang['danger']['access_denied'])
  34. );
  35. return false;
  36. }
  37. if (!ctype_alnum($client_id) || !ctype_alnum($client_secret)) {
  38. $_SESSION['return'] = array(
  39. 'type' => 'danger',
  40. 'msg' => sprintf($lang['danger']['access_denied'])
  41. );
  42. return false;
  43. }
  44. $stmt = $pdo->prepare("SELECT 'client' FROM `oauth_clients`
  45. WHERE `client_id` = :client_id");
  46. $stmt->execute(array(':client_id' => $client_id));
  47. $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
  48. if ($num_results != 0) {
  49. $_SESSION['return'] = array(
  50. 'type' => 'danger',
  51. 'msg' => 'Client ID exists'
  52. );
  53. return false;
  54. }
  55. $stmt = $pdo->prepare("INSERT INTO `oauth_clients` (`client_id`, `client_secret` ,`redirect_uri`)
  56. VALUES (:client_id, :client_secret, :redirect_uri)");
  57. $stmt->execute(array(
  58. ':client_id' => $client_id,
  59. ':client_secret' => $client_secret,
  60. ':redirect_uri' => $redirect_uri
  61. ));
  62. $_SESSION['return'] = array(
  63. 'type' => 'success',
  64. 'msg' => 'Added client access'
  65. );
  66. break;
  67. }
  68. break;
  69. case 'edit':
  70. switch ($_type) {
  71. case 'client':
  72. $ids = (array)$_data['id'];
  73. foreach ($ids as $id) {
  74. $is_now = oauth2('details', 'client', $id);
  75. if (!empty($is_now)) {
  76. $client_id = (!empty($_data['client_id'])) ? $_data['client_id'] : $is_now['client_id'];
  77. $client_secret = (!empty($_data['client_secret'])) ? $_data['client_secret'] : $is_now['client_secret'];
  78. $redirect_uri = (!empty($_data['redirect_uri'])) ? $_data['redirect_uri'] : $is_now['redirect_uri'];
  79. }
  80. else {
  81. $_SESSION['return'] = array(
  82. 'type' => 'danger',
  83. 'msg' => sprintf($lang['danger']['access_denied'])
  84. );
  85. return false;
  86. }
  87. if (!ctype_alnum($client_id) || !ctype_alnum($client_secret)) {
  88. $_SESSION['return'] = array(
  89. 'type' => 'danger',
  90. 'msg' => 'Client ID and secret must be alphanumeric'
  91. );
  92. return false;
  93. }
  94. if (empty($redirect_uri)) {
  95. $_SESSION['return'] = array(
  96. 'type' => 'danger',
  97. 'msg' => 'Redirect/Callback URL cannot be empty'
  98. );
  99. return false;
  100. }
  101. $stmt = $pdo->prepare("UPDATE `oauth_clients` SET
  102. `client_id` = :client_id,
  103. `client_secret` = :client_secret,
  104. `redirect_uri` = :redirect_uri
  105. WHERE `id` = :id");
  106. $stmt->execute(array(
  107. ':id' => $id,
  108. ':client_id' => $client_id,
  109. ':client_secret' => $client_secret,
  110. ':redirect_uri' => $redirect_uri
  111. ));
  112. }
  113. $_SESSION['return'] = array(
  114. 'type' => 'success',
  115. 'msg' => sprintf($lang['success']['object_modified'], htmlspecialchars(implode(', ', $ids)))
  116. );
  117. break;
  118. }
  119. break;
  120. case 'delete':
  121. switch ($_type) {
  122. case 'client':
  123. (array)$ids = $_data['id'];
  124. foreach ($ids as $id) {
  125. if (!is_numeric($id)) {
  126. $_SESSION['return'] = array(
  127. 'type' => 'danger',
  128. 'msg' => sprintf($lang['danger']['access_denied'])
  129. );
  130. return false;
  131. }
  132. $stmt = $pdo->prepare("DELETE FROM `oauth_clients` WHERE `id` = :id");
  133. $stmt->execute(array(
  134. ':id' => $id
  135. ));
  136. }
  137. $_SESSION['return'] = array(
  138. 'type' => 'success',
  139. 'msg' => sprintf($lang['success']['items_deleted'], implode(', ', $ids))
  140. );
  141. break;
  142. case 'access_token':
  143. (array)$access_tokens = $_data['access_token'];
  144. foreach ($access_tokens as $access_token) {
  145. if (!ctype_alnum($access_token)) {
  146. $_SESSION['return'] = array(
  147. 'type' => 'danger',
  148. 'msg' => sprintf($lang['danger']['access_denied'])
  149. );
  150. return false;
  151. }
  152. $stmt = $pdo->prepare("DELETE FROM `oauth_access_tokens` WHERE `access_token` = :access_token");
  153. $stmt->execute(array(
  154. ':access_token' => $access_token
  155. ));
  156. }
  157. $_SESSION['return'] = array(
  158. 'type' => 'success',
  159. 'msg' => sprintf($lang['success']['items_deleted'], implode(', ', $access_tokens))
  160. );
  161. break;
  162. case 'refresh_token':
  163. (array)$refresh_tokens = $_data['refresh_token'];
  164. foreach ($refresh_tokens as $refresh_token) {
  165. if (!ctype_alnum($refresh_token)) {
  166. $_SESSION['return'] = array(
  167. 'type' => 'danger',
  168. 'msg' => sprintf($lang['danger']['access_denied'])
  169. );
  170. return false;
  171. }
  172. $stmt = $pdo->prepare("DELETE FROM `oauth_refresh_tokens` WHERE `refresh_token` = :refresh_token");
  173. $stmt->execute(array(
  174. ':refresh_token' => $refresh_token
  175. ));
  176. }
  177. $_SESSION['return'] = array(
  178. 'type' => 'success',
  179. 'msg' => sprintf($lang['success']['items_deleted'], implode(', ', $refresh_tokens))
  180. );
  181. break;
  182. }
  183. break;
  184. case 'get':
  185. switch ($_type) {
  186. case 'clients':
  187. $stmt = $pdo->query("SELECT `id` FROM `oauth_clients`");
  188. $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  189. while ($row = array_shift($rows)) {
  190. $oauth_clients[] = $row['id'];
  191. }
  192. return $oauth_clients;
  193. break;
  194. }
  195. break;
  196. case 'details':
  197. switch ($_type) {
  198. case 'client':
  199. $stmt = $pdo->prepare("SELECT * FROM `oauth_clients`
  200. WHERE `id` = :id");
  201. $stmt->execute(array(':id' => $_data));
  202. $oauth_client_details = $stmt->fetch(PDO::FETCH_ASSOC);
  203. return $oauth_client_details;
  204. break;
  205. }
  206. break;
  207. }
  208. }