auth.utils.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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. LOG_INFO($db, "login [$login] or password [$pass] undefined from $auth_ip: fail!");
  117. logout();
  118. return false;
  119. }
  120. $login = htmlspecialchars(stripslashes($login));
  121. if (empty($login) or empty($pass)) {
  122. LOG_INFO($db, "login [$login] or password [$pass] undefined from $auth_ip: fail!");
  123. logout();
  124. return false;
  125. }
  126. $query = "SELECT * FROM `Customers` WHERE Login='{$login}'";
  127. $auth_record = get_record_sql($db, $query);
  128. if (!empty($auth_record)) {
  129. if (password_verify($pass, $auth_record['password'])) {
  130. if (empty($_SESSION['session_id'])) {
  131. session_regenerate_id();
  132. $_SESSION['session_id'] = session_id();
  133. }
  134. if (empty($_SESSION['user_id'])) {
  135. LOG_INFO($db, "login user [$login] from " . $_SESSION['IP'] . ": success.");
  136. }
  137. $_SESSION['user_id'] = $auth_record['id'];
  138. $_SESSION['acl'] = $auth_record['rights'];
  139. $_SESSION['login'] = $login;
  140. $session['session_id'] = $_SESSION['session_id'];
  141. $session['session_key'] = bin2hex(random_bytes(20));
  142. $session['customer_id'] = $auth_record['id'];
  143. $session['start_time'] = time();
  144. $ret_id = insert_record($db, 'sessions', $session);
  145. setcookie("Auth", $auth_record['id'] . ":" . $session['session_id'] . ":" . md5($ret_id . ":" . $session['session_key'] . ":" . $_SESSION['IP']), time() + 60 * 60 * 24);
  146. return true;
  147. } else {
  148. LOG_INFO($db, "login user [$login] from " . $_SESSION['IP'] . ": fail!");
  149. logout();
  150. return false;
  151. }
  152. }
  153. LOG_INFO($db, "login user [$login] from " . $_SESSION['IP'] . ": fail!");
  154. logout();
  155. return false;
  156. }
  157. function IsSilentAuthenticated($db)
  158. {
  159. if (!empty($_SESSION['user_id'])) {
  160. return true;
  161. }
  162. if (empty($auth_ip)) {
  163. $auth_ip = get_user_ip();
  164. $_SESSION['IP'] = $auth_ip;
  165. }
  166. if (!empty($_GET['login'])) {
  167. $login = trim($_GET['login']);
  168. }
  169. if (!empty($_POST['login'])) {
  170. $login = trim($_POST['login']);
  171. }
  172. if (!empty($_GET['password'])) {
  173. $pass = trim($_GET['password']);
  174. }
  175. if (!empty($_POST['password'])) {
  176. $pass = trim($_POST['password']);
  177. }
  178. if (!empty($_GET['api_key'])) {
  179. $pass = trim($_GET['api_key']);
  180. }
  181. if (!empty($_POST['api_key'])) {
  182. $pass = trim($_POST['api_key']);
  183. }
  184. if (empty($login) or empty($pass)) {
  185. LOG_INFO($db, "login or password undefined from $auth_ip: fail!");
  186. logout();
  187. return false;
  188. }
  189. $login = htmlspecialchars(stripslashes($login));
  190. if ($login == '' or $pass == '') {
  191. LOG_INFO($db, "login or password undefined from $auth_ip: fail!");
  192. logout();
  193. return false;
  194. }
  195. $query = "SELECT id FROM `Customers` WHERE Login='{$login}' AND `api_key`='{$pass}'";
  196. $auth_record = get_record_sql($db, $query);
  197. if (!empty($auth_record)) {
  198. if (empty($_SESSION['session_id'])) {
  199. session_regenerate_id();
  200. $_SESSION['session_id'] = session_id();
  201. }
  202. if (empty($_SESSION['user_id'])) {
  203. LOG_INFO($db, "Api login user [$login] from " . $_SESSION['IP'] . ": success.");
  204. }
  205. $_SESSION['user_id'] = $auth_record['id'];
  206. $_SESSION['acl'] = $auth_record['rights'];
  207. $_SESSION['login'] = $login;
  208. return true;
  209. }
  210. LOG_INFO($db, "Api login user $login from " . $_SESSION['IP'] . ": fail!");
  211. logout();
  212. return false;
  213. }