auth.utils.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <?php
  2. define("CONFIG", 1);
  3. define("SQL", 1);
  4. require_once($_SERVER['DOCUMENT_ROOT'] . "/cfg/config.php");
  5. require_once($_SERVER['DOCUMENT_ROOT'] . "/inc/sql.php");
  6. require_once($_SERVER['DOCUMENT_ROOT'] . "/inc/common.php");
  7. ini_set('session.use_trans_sid', true);
  8. ini_set('session.use_only_cookies', false);
  9. function logout()
  10. {
  11. if (!session_id()) {
  12. session_start();
  13. }
  14. if (session_id()) {
  15. // Если есть активная сессия, удаляем куки сессии
  16. setcookie(session_name(), session_id(), time() - 60 * 60 * 24);
  17. if (isset($_COOKIE["Auth"])) {
  18. unset($_COOKIE["Auth"]);
  19. setcookie("Auth", null, -1);
  20. }
  21. session_unset();
  22. session_destroy();
  23. }
  24. header("Location: /login.php");
  25. }
  26. function qlogout()
  27. {
  28. if (!session_id()) {
  29. session_start();
  30. }
  31. if (session_id()) {
  32. // Если есть активная сессия, удаляем куки сессии
  33. setcookie(session_name(), session_id(), time() - 60 * 60 * 24);
  34. if (isset($_COOKIE["Auth"])) {
  35. unset($_COOKIE["Auth"]);
  36. setcookie("Auth", null, -1);
  37. }
  38. session_unset();
  39. session_destroy();
  40. }
  41. exit;
  42. }
  43. //login by password
  44. function login($db)
  45. {
  46. if (!session_id()) {
  47. if (!session_start()) {
  48. logout();
  49. exit();
  50. }
  51. }
  52. #get cookie
  53. if (isset($_COOKIE["Auth"])) {
  54. $data_array = explode(":", $_COOKIE["Auth"]);
  55. # 0 - customer_id
  56. # 1 - session_id
  57. # 2 - md5 (session_key.':'. user ip)
  58. #clear old sessions history
  59. $old_time = time() - 60 * 60 * 24;
  60. run_sql($db, "DELETE FROM sessions WHERE start_time<" . $old_time);
  61. $session = get_record_sql($db, "SELECT * FROM sessions WHERE session_id='" . $data_array[1] . "' AND customer_id=" . $data_array[0]);
  62. if (!empty($session)) {
  63. $auth_ip = get_user_ip();
  64. #check session
  65. $current_hash = md5($session['id'] . ":" . $session['session_key'] . ":" . $auth_ip);
  66. #enable access
  67. if (isset($data_array[2]) and $current_hash === $data_array[2]) {
  68. $auth_record = get_record_sql($db, "SELECT * FROM `Customers` WHERE id='" . $data_array[0] . "'");
  69. $_SESSION['IP'] = $auth_ip;
  70. $_SESSION['user_id'] = $auth_record['id'];
  71. $_SESSION['login'] = $auth_record['Login'];
  72. $_SESSION['acl'] = $auth_record['rights'];
  73. } else {
  74. unset($_COOKIE["Auth"]);
  75. setcookie("Auth", null, -1);
  76. }
  77. }
  78. }
  79. if (!IsAuthenticated($db)) {
  80. logout();
  81. exit();
  82. }
  83. return true;
  84. }
  85. //login by api_key
  86. function Silentlogin($db)
  87. {
  88. if (!session_id()) {
  89. if (!session_start()) {
  90. logout();
  91. exit();
  92. }
  93. }
  94. if (!IsSilentAuthenticated($db)) {
  95. logout();
  96. exit();
  97. }
  98. return true;
  99. }
  100. function IsAuthenticated($db)
  101. {
  102. if (!empty($_SESSION['user_id'])) {
  103. return true;
  104. }
  105. if (empty($auth_ip)) {
  106. $auth_ip = get_user_ip();
  107. $_SESSION['IP'] = $auth_ip;
  108. }
  109. if (!empty($_POST['login'])) {
  110. $login = trim($_POST['login']);
  111. }
  112. if (!empty($_POST['password'])) {
  113. $pass = trim($_POST['password']);
  114. }
  115. if (empty($login) or empty($pass)) {
  116. logout();
  117. return false;
  118. }
  119. $login = htmlspecialchars(stripslashes($login));
  120. if (empty($login) or empty($pass)) {
  121. logout();
  122. return false;
  123. }
  124. $query = "SELECT * FROM `Customers` WHERE Login='{$login}'";
  125. $auth_record = get_record_sql($db, $query);
  126. if (!empty($auth_record)) {
  127. if (password_verify($pass, $auth_record['password'])) {
  128. if (empty($_SESSION['session_id'])) {
  129. session_regenerate_id();
  130. $_SESSION['session_id'] = session_id();
  131. }
  132. if (empty($_SESSION['user_id'])) {
  133. LOG_INFO($db, "login user [$login] from " . $_SESSION['IP'] . ": success.");
  134. }
  135. $_SESSION['user_id'] = $auth_record['id'];
  136. $_SESSION['acl'] = $auth_record['rights'];
  137. $_SESSION['login'] = $login;
  138. $session['session_id'] = $_SESSION['session_id'];
  139. $session['session_key'] = bin2hex(random_bytes(20));
  140. $session['customer_id'] = $auth_record['id'];
  141. $session['start_time'] = time();
  142. $ret_id = insert_record($db, 'sessions', $session);
  143. setcookie("Auth", $auth_record['id'] . ":" . $session['session_id'] . ":" . md5($ret_id . ":" . $session['session_key'] . ":" . $_SESSION['IP']), time() + 60 * 60 * 24);
  144. return true;
  145. } else {
  146. LOG_ERROR($db, "login user [$login] from " . $_SESSION['IP'] . ": fail!");
  147. logout();
  148. return false;
  149. }
  150. }
  151. LOG_ERROR($db, "login user [$login] from " . $_SESSION['IP'] . ": fail!");
  152. logout();
  153. return false;
  154. }
  155. function IsSilentAuthenticated($db)
  156. {
  157. if (!empty($_SESSION['user_id'])) {
  158. return true;
  159. }
  160. if (empty($auth_ip)) {
  161. $auth_ip = get_user_ip();
  162. $_SESSION['IP'] = $auth_ip;
  163. }
  164. if (!empty($_GET['login'])) {
  165. $login = trim($_GET['login']);
  166. }
  167. if (!empty($_POST['login'])) {
  168. $login = trim($_POST['login']);
  169. }
  170. if (!empty($_GET['password'])) {
  171. $pass = trim($_GET['password']);
  172. }
  173. if (!empty($_POST['password'])) {
  174. $pass = trim($_POST['password']);
  175. }
  176. if (!empty($_GET['api_key'])) {
  177. $pass = trim($_GET['api_key']);
  178. }
  179. if (!empty($_POST['api_key'])) {
  180. $pass = trim($_POST['api_key']);
  181. }
  182. if (empty($login) or empty($pass)) {
  183. logout();
  184. return false;
  185. }
  186. $login = htmlspecialchars(stripslashes($login));
  187. if ($login == '' or $pass == '') {
  188. logout();
  189. return false;
  190. }
  191. $query = "SELECT id FROM `Customers` WHERE Login='{$login}' AND `api_key`='{$pass}'";
  192. $auth_record = get_record_sql($db, $query);
  193. if (!empty($auth_record)) {
  194. if (empty($_SESSION['session_id'])) {
  195. session_regenerate_id();
  196. $_SESSION['session_id'] = session_id();
  197. }
  198. if (empty($_SESSION['user_id'])) {
  199. LOG_VERBOSE($db, "Api login user [$login] from " . $_SESSION['IP'] . ": success.");
  200. }
  201. $_SESSION['user_id'] = $auth_record['id'];
  202. $_SESSION['acl'] = $auth_record['rights'];
  203. $_SESSION['login'] = $login;
  204. return true;
  205. }
  206. LOG_ERROR($db, "Api login user $login from " . $_SESSION['IP'] . ": fail!");
  207. logout();
  208. return false;
  209. }