Просмотр файла includes/sessions.php

Размер файла: 16.36Kb
  1. <?php
  2. /***************************************************************************
  3. * mides.ru
  4. * -------------------
  5. ***************************************************************************/
  6. function session_begin($user_id, $user_ip, $page_id, $auto_create = 0, $enable_autologin = 0, $admin = 0)
  7. {
  8. global $db, $board_config;
  9. global $HTTP_COOKIE_VARS, $HTTP_GET_VARS, $SID;
  10.  
  11. $cookiename = $board_config['cookie_name'];
  12. $cookiepath = $board_config['cookie_path'];
  13. $cookiedomain = $board_config['cookie_domain'];
  14. $cookiesecure = $board_config['cookie_secure'];
  15.  
  16. if ( isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) || isset($HTTP_COOKIE_VARS[$cookiename . '_data']) )
  17. {
  18. $session_id = isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) ? $HTTP_COOKIE_VARS[$cookiename . '_sid'] : '';
  19. $sessiondata = isset($HTTP_COOKIE_VARS[$cookiename . '_data']) ? unserialize(stripslashes($HTTP_COOKIE_VARS[$cookiename . '_data'])) : array();
  20. $sessionmethod = SESSION_METHOD_COOKIE;
  21. }
  22. else
  23. {
  24. $sessiondata = array();
  25. $session_id = ( isset($HTTP_GET_VARS['sid']) ) ? $HTTP_GET_VARS['sid'] : '';
  26. $sessionmethod = SESSION_METHOD_GET;
  27. }
  28.  
  29. if (!preg_match('/^[A-Za-z0-9]*$/', $session_id))
  30. {
  31. $session_id = '';
  32. }
  33.  
  34. $page_id = (int) $page_id;
  35.  
  36. $last_visit = 0;
  37. $current_time = time();
  38.  
  39. if (isset($board_config['allow_autologin']) && !$board_config['allow_autologin'])
  40. {
  41. $enable_autologin = $sessiondata['autologinid'] = false;
  42. }
  43.  
  44. $userdata = array();
  45.  
  46. if ($user_id != ANONYMOUS)
  47. {
  48. if (isset($sessiondata['autologinid']) && (string) $sessiondata['autologinid'] != '' && $user_id)
  49. {
  50. $sql = 'SELECT u.*
  51. FROM ' . USERS_TABLE . ' u, ' . SESSIONS_KEYS_TABLE . ' k
  52. WHERE u.user_id = ' . (int) $user_id . "
  53. AND u.user_active = 1
  54. AND k.user_id = u.user_id
  55. AND k.key_id = '" . md5($sessiondata['autologinid']) . "'";
  56. if (!($result = $db->sql_query($sql)))
  57. {
  58. message_die(CRITICAL_ERROR, 'Error doing DB query userdata row fetch', '', __LINE__, __FILE__, $sql);
  59. }
  60.  
  61. $userdata = $db->sql_fetchrow($result);
  62. $db->sql_freeresult($result);
  63. $enable_autologin = $login = 1;
  64. }
  65. else if (!$auto_create)
  66. {
  67. $sessiondata['autologinid'] = '';
  68. $sessiondata['userid'] = $user_id;
  69.  
  70. $sql = 'SELECT *
  71. FROM ' . USERS_TABLE . '
  72. WHERE user_id = ' . (int) $user_id . '
  73. AND user_active = 1';
  74. if (!($result = $db->sql_query($sql)))
  75. {
  76. message_die(CRITICAL_ERROR, 'Error doing DB query userdata row fetch', '', __LINE__, __FILE__, $sql);
  77. }
  78.  
  79. $userdata = $db->sql_fetchrow($result);
  80. $db->sql_freeresult($result);
  81.  
  82. $login = 1;
  83. }
  84. }
  85.  
  86. if (!sizeof($userdata) || !is_array($userdata) || !$userdata)
  87. {
  88. $sessiondata['autologinid'] = '';
  89. $sessiondata['userid'] = $user_id = ANONYMOUS;
  90. $enable_autologin = $login = 0;
  91.  
  92. $sql = 'SELECT *
  93. FROM ' . USERS_TABLE . '
  94. WHERE user_id = ' . (int) $user_id;
  95. if (!($result = $db->sql_query($sql)))
  96. {
  97. message_die(CRITICAL_ERROR, 'Error doing DB query userdata row fetch', '', __LINE__, __FILE__, $sql);
  98. }
  99.  
  100. $userdata = $db->sql_fetchrow($result);
  101. $db->sql_freeresult($result);
  102. }
  103.  
  104. $sql = "UPDATE " . SESSIONS_TABLE . "
  105. SET session_user_id = $user_id, session_start = $current_time, session_time = $current_time, session_page = $page_id, session_logged_in = $login, session_admin = $admin
  106. WHERE session_id = '" . $session_id . "'
  107. AND session_ip = '$user_ip'";
  108. if ( !$db->sql_query($sql) || !$db->sql_affectedrows() )
  109. {
  110. $session_id = md5(dss_rand());
  111.  
  112. $sql = "INSERT INTO " . SESSIONS_TABLE . "
  113. (session_id, session_user_id, session_start, session_time, session_ip, session_page, session_logged_in, session_admin)
  114. VALUES ('$session_id', $user_id, $current_time, $current_time, '$user_ip', $page_id, $login, $admin)";
  115. if ( !$db->sql_query($sql) )
  116. {
  117. message_die(CRITICAL_ERROR, 'Error creating new session', '', __LINE__, __FILE__, $sql);
  118. }
  119. }
  120.  
  121. if ( $user_id != ANONYMOUS )
  122. {
  123. $last_visit = ( $userdata['user_session_time'] > 0 ) ? $userdata['user_session_time'] : $current_time;
  124.  
  125. if (!$admin)
  126. {
  127. $sql = "UPDATE " . USERS_TABLE . "
  128. SET user_session_time = $current_time, user_session_page = $page_id, user_lastvisit = $last_visit
  129. WHERE user_id = $user_id";
  130. if ( !$db->sql_query($sql) )
  131. {
  132. message_die(CRITICAL_ERROR, 'Error updating last visit time', '', __LINE__, __FILE__, $sql);
  133. }
  134. }
  135.  
  136. $userdata['user_lastvisit'] = $last_visit;
  137.  
  138. if ($enable_autologin)
  139. {
  140. $auto_login_key = dss_rand() . dss_rand();
  141. if (isset($sessiondata['autologinid']) && (string) $sessiondata['autologinid'] != '')
  142. {
  143. $sql = 'UPDATE ' . SESSIONS_KEYS_TABLE . "
  144. SET last_ip = '$user_ip', key_id = '" . md5($auto_login_key) . "', last_login = $current_time
  145. WHERE key_id = '" . md5($sessiondata['autologinid']) . "'";
  146. }
  147. else
  148. {
  149. $sql = 'INSERT INTO ' . SESSIONS_KEYS_TABLE . "(key_id, user_id, last_ip, last_login)
  150. VALUES ('" . md5($auto_login_key) . "', $user_id, '$user_ip', $current_time)";
  151. }
  152.  
  153. if ( !$db->sql_query($sql) )
  154. {
  155. message_die(CRITICAL_ERROR, 'Error updating session key', '', __LINE__, __FILE__, $sql);
  156. }
  157. $sessiondata['autologinid'] = $auto_login_key;
  158. unset($auto_login_key);
  159. }
  160. else
  161. {
  162. $sessiondata['autologinid'] = '';
  163. }
  164.  
  165. // $sessiondata['autologinid'] = (!$admin) ? (( $enable_autologin && $sessionmethod == SESSION_METHOD_COOKIE ) ? $auto_login_key : '') : $sessiondata['autologinid'];
  166. $sessiondata['userid'] = $user_id;
  167. }
  168.  
  169. $userdata['session_id'] = $session_id;
  170. $userdata['session_ip'] = $user_ip;
  171. $userdata['session_user_id'] = $user_id;
  172. $userdata['session_logged_in'] = $login;
  173. $userdata['session_page'] = $page_id;
  174. $userdata['session_start'] = $current_time;
  175. $userdata['session_time'] = $current_time;
  176. $userdata['session_admin'] = $admin;
  177. $userdata['session_key'] = $sessiondata['autologinid'];
  178.  
  179. setcookie($cookiename . '_data', serialize($sessiondata), $current_time + 31536000, $cookiepath, $cookiedomain, $cookiesecure);
  180. setcookie($cookiename . '_sid', $session_id, 0, $cookiepath, $cookiedomain, $cookiesecure);
  181.  
  182. $SID = 'sid=' . $session_id;
  183.  
  184. return $userdata;
  185. }
  186.  
  187. function session_pagestart($user_ip, $thispage_id)
  188. {
  189. global $db, $lang, $board_config;
  190. global $HTTP_COOKIE_VARS, $HTTP_GET_VARS, $SID;
  191.  
  192. $cookiename = $board_config['cookie_name'];
  193. $cookiepath = $board_config['cookie_path'];
  194. $cookiedomain = $board_config['cookie_domain'];
  195. $cookiesecure = $board_config['cookie_secure'];
  196.  
  197. $current_time = time();
  198. unset($userdata);
  199.  
  200. if ( isset($HTTP_COOKIE_VARS[$cookiename . '_sid']) || isset($HTTP_COOKIE_VARS[$cookiename . '_data']) )
  201. {
  202. $sessiondata = isset( $HTTP_COOKIE_VARS[$cookiename . '_data'] ) ? unserialize(stripslashes($HTTP_COOKIE_VARS[$cookiename . '_data'])) : array();
  203. $session_id = isset( $HTTP_COOKIE_VARS[$cookiename . '_sid'] ) ? $HTTP_COOKIE_VARS[$cookiename . '_sid'] : '';
  204. $sessionmethod = SESSION_METHOD_COOKIE;
  205. }
  206. else
  207. {
  208. $sessiondata = array();
  209. $session_id = ( isset($HTTP_GET_VARS['sid']) ) ? $HTTP_GET_VARS['sid'] : '';
  210. $sessionmethod = SESSION_METHOD_GET;
  211. }
  212.  
  213. if (!preg_match('/^[A-Za-z0-9]*$/', $session_id))
  214. {
  215. $session_id = '';
  216. }
  217.  
  218. $thispage_id = (int) $thispage_id;
  219.  
  220. if ( !empty($session_id) )
  221. {
  222.  
  223. $sql = "SELECT u.*, s.*
  224. FROM " . SESSIONS_TABLE . " s, " . USERS_TABLE . " u
  225. WHERE s.session_id = '$session_id'
  226. AND u.user_id = s.session_user_id";
  227. if ( !($result = $db->sql_query($sql)) )
  228. {
  229. message_die(CRITICAL_ERROR, 'Error doing DB query userdata row fetch', '', __LINE__, __FILE__, $sql);
  230. }
  231.  
  232. $userdata = $db->sql_fetchrow($result);
  233.  
  234. if ( isset($userdata['user_id']) )
  235. {
  236.  
  237. $ip_check_s = substr($userdata['session_ip'], 0, 6);
  238. $ip_check_u = substr($user_ip, 0, 6);
  239.  
  240. if ($ip_check_s == $ip_check_u)
  241. {
  242. $SID = ($sessionmethod == SESSION_METHOD_GET || defined('IN_ADMIN')) ? 'sid=' . $session_id : '';
  243.  
  244. if ( $current_time - $userdata['session_time'] > 60 )
  245. {
  246. $update_admin = (!defined('IN_ADMIN') && $current_time - $userdata['session_time'] > ($board_config['session_length']+60)) ? ', session_admin = 0' : '';
  247.  
  248. $sql = "UPDATE " . SESSIONS_TABLE . "
  249. SET session_time = $current_time, session_page = $thispage_id$update_admin
  250. WHERE session_id = '" . $userdata['session_id'] . "'";
  251. if ( !$db->sql_query($sql) )
  252. {
  253. message_die(CRITICAL_ERROR, 'Error updating sessions table', '', __LINE__, __FILE__, $sql);
  254. }
  255.  
  256. if ( $userdata['user_id'] != ANONYMOUS )
  257. {
  258. $sql = "UPDATE " . USERS_TABLE . "
  259. SET user_session_time = $current_time, user_session_page = $thispage_id
  260. WHERE user_id = " . $userdata['user_id'];
  261. if ( !$db->sql_query($sql) )
  262. {
  263. message_die(CRITICAL_ERROR, 'Error updating sessions table', '', __LINE__, __FILE__, $sql);
  264. }
  265. }
  266.  
  267. session_clean($userdata['session_id']);
  268.  
  269. setcookie($cookiename . '_data', serialize($sessiondata), $current_time + 31536000, $cookiepath, $cookiedomain, $cookiesecure);
  270. setcookie($cookiename . '_sid', $session_id, 0, $cookiepath, $cookiedomain, $cookiesecure);
  271. }
  272.  
  273. if ( isset($sessiondata['autologinid']) && $sessiondata['autologinid'] != '' )
  274. {
  275. $userdata['session_key'] = $sessiondata['autologinid'];
  276. }
  277.  
  278. return $userdata;
  279. }
  280. }
  281. }
  282.  
  283. $user_id = ( isset($sessiondata['userid']) ) ? intval($sessiondata['userid']) : ANONYMOUS;
  284.  
  285. if ( !($userdata = session_begin($user_id, $user_ip, $thispage_id, TRUE)) )
  286. {
  287. message_die(CRITICAL_ERROR, 'Error creating user session', '', __LINE__, __FILE__, $sql);
  288. }
  289.  
  290. return $userdata;
  291. }
  292.  
  293. function session_end($session_id, $user_id)
  294. {
  295. global $db, $lang, $board_config, $userdata;
  296. global $HTTP_COOKIE_VARS, $HTTP_GET_VARS, $SID;
  297.  
  298. $cookiename = $board_config['cookie_name'];
  299. $cookiepath = $board_config['cookie_path'];
  300. $cookiedomain = $board_config['cookie_domain'];
  301. $cookiesecure = $board_config['cookie_secure'];
  302.  
  303. $current_time = time();
  304.  
  305. if (!preg_match('/^[A-Za-z0-9]*$/', $session_id))
  306. {
  307. return;
  308. }
  309.  
  310. $sql = 'DELETE FROM ' . SESSIONS_TABLE . "
  311. WHERE session_id = '$session_id'
  312. AND session_user_id = $user_id";
  313. if ( !$db->sql_query($sql) )
  314. {
  315. message_die(CRITICAL_ERROR, 'Error removing user session', '', __LINE__, __FILE__, $sql);
  316. }
  317.  
  318. if ( isset($userdata['session_key']) && $userdata['session_key'] != '' )
  319. {
  320. $autologin_key = md5($userdata['session_key']);
  321. $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
  322. WHERE user_id = ' . (int) $user_id . "
  323. AND key_id = '$autologin_key'";
  324. if ( !$db->sql_query($sql) )
  325. {
  326. message_die(CRITICAL_ERROR, 'Error removing auto-login key', '', __LINE__, __FILE__, $sql);
  327. }
  328. }
  329.  
  330. $sql = 'SELECT *
  331. FROM ' . USERS_TABLE . '
  332. WHERE user_id = ' . ANONYMOUS;
  333. if ( !($result = $db->sql_query($sql)) )
  334. {
  335. message_die(CRITICAL_ERROR, 'Error obtaining user details', '', __LINE__, __FILE__, $sql);
  336. }
  337. if ( !($userdata = $db->sql_fetchrow($result)) )
  338. {
  339. message_die(CRITICAL_ERROR, 'Error obtaining user details', '', __LINE__, __FILE__, $sql);
  340. }
  341. $db->sql_freeresult($result);
  342.  
  343.  
  344. setcookie($cookiename . '_data', '', $current_time - 31536000, $cookiepath, $cookiedomain, $cookiesecure);
  345. setcookie($cookiename . '_sid', '', $current_time - 31536000, $cookiepath, $cookiedomain, $cookiesecure);
  346.  
  347. return true;
  348. }
  349.  
  350. function session_clean($session_id)
  351. {
  352. global $board_config, $db;
  353.  
  354. $sql = 'DELETE FROM ' . SESSIONS_TABLE . '
  355. WHERE session_time < ' . (time() - (int) $board_config['session_length']) . "
  356. AND session_id <> '$session_id'";
  357. if ( !$db->sql_query($sql) )
  358. {
  359. message_die(CRITICAL_ERROR, 'Error clearing sessions table', '', __LINE__, __FILE__, $sql);
  360. }
  361.  
  362. if (!empty($board_config['max_autologin_time']) && $board_config['max_autologin_time'] > 0)
  363. {
  364. $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
  365. WHERE last_login < ' . (time() - (86400 * (int) $board_config['max_autologin_time']));
  366. $db->sql_query($sql);
  367. }
  368.  
  369. return true;
  370. }
  371.  
  372. function session_reset_keys($user_id, $user_ip)
  373. {
  374. global $db, $userdata, $board_config;
  375.  
  376. $key_sql = ($user_id == $userdata['user_id'] && !empty($userdata['session_key'])) ? "AND key_id != '" . md5($userdata['session_key']) . "'" : '';
  377.  
  378. $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
  379. WHERE user_id = ' . (int) $user_id . "
  380. $key_sql";
  381.  
  382. if ( !$db->sql_query($sql) )
  383. {
  384. message_die(CRITICAL_ERROR, 'Error removing auto-login keys', '', __LINE__, __FILE__, $sql);
  385. }
  386.  
  387. $where_sql = 'session_user_id = ' . (int) $user_id;
  388. $where_sql .= ($user_id == $userdata['user_id']) ? " AND session_id <> '" . $userdata['session_id'] . "'" : '';
  389. $sql = 'DELETE FROM ' . SESSIONS_TABLE . "
  390. WHERE $where_sql";
  391. if ( !$db->sql_query($sql) )
  392. {
  393. message_die(CRITICAL_ERROR, 'Error removing user session(s)', '', __LINE__, __FILE__, $sql);
  394. }
  395.  
  396. if ( !empty($key_sql) )
  397. {
  398. $auto_login_key = dss_rand() . dss_rand();
  399.  
  400. $current_time = time();
  401. $sql = 'UPDATE ' . SESSIONS_KEYS_TABLE . "
  402. SET last_ip = '$user_ip', key_id = '" . md5($auto_login_key) . "', last_login = $current_time
  403. WHERE key_id = '" . md5($userdata['session_key']) . "'";
  404. if ( !$db->sql_query($sql) )
  405. {
  406. message_die(CRITICAL_ERROR, 'Error updating session key', '', __LINE__, __FILE__, $sql);
  407. }
  408.  
  409. $sessiondata['userid'] = $user_id;
  410. $sessiondata['autologinid'] = $auto_login_key;
  411. $cookiename = $board_config['cookie_name'];
  412. $cookiepath = $board_config['cookie_path'];
  413. $cookiedomain = $board_config['cookie_domain'];
  414. $cookiesecure = $board_config['cookie_secure'];
  415.  
  416. setcookie($cookiename . '_data', serialize($sessiondata), $current_time + 31536000, $cookiepath, $cookiedomain, $cookiesecure);
  417. $userdata['session_key'] = $auto_login_key;
  418. unset($sessiondata);
  419. unset($auto_login_key);
  420. }
  421. }
  422.  
  423. function append_sid($url, $non_html_amp = false)
  424. {
  425. global $SID;
  426.  
  427. if ( !empty($SID) && !preg_match('#sid=#', $url) )
  428. {
  429. $url .= ( ( strpos($url, '?') !== false ) ? ( ( $non_html_amp ) ? '&' : '&amp;' ) : '?' ) . $SID;
  430. }
  431.  
  432. return $url;
  433. }
  434.  
  435. function session_userban($user_ip, $user_id)
  436. {
  437. global $db, $userdata;
  438. preg_match('/(..)(..)(..)(..)/', $user_ip, $user_ip_parts);
  439.  
  440. $sql = "SELECT ban_ip, ban_userid, ban_email
  441. FROM " . BANLIST_TABLE . "
  442. WHERE ban_ip IN ('" . $user_ip_parts[1] . $user_ip_parts[2] . $user_ip_parts[3] . $user_ip_parts[4] . "', '" . $user_ip_parts[1] . $user_ip_parts[2] . $user_ip_parts[3] . "ff', '" . $user_ip_parts[1] . $user_ip_parts[2] . "ffff', '" . $user_ip_parts[1] . "ffffff')
  443. OR ban_userid = $user_id";
  444. if ( $user_id != ANONYMOUS )
  445. {
  446. $sql .= " OR ban_email LIKE '" . str_replace("\'", "''", $userdata['user_email']) . "'
  447. OR ban_email LIKE '" . substr(str_replace("\'", "''", $userdata['user_email']), strpos(str_replace("\'", "''", $userdata['user_email']), "@")) . "'";
  448. }
  449. if ( !($result = $db->sql_query($sql)) )
  450. {
  451. message_die(CRITICAL_ERROR, 'Could not obtain ban information', '', __LINE__, __FILE__, $sql);
  452. }
  453.  
  454. if ( $ban_info = $db->sql_fetchrow($result) )
  455. {
  456. if ( $ban_info['ban_ip'] || $ban_info['ban_userid'] || $ban_info['ban_email'] )
  457. {
  458. $resban = db_query("SELECT * FROM " . REPUTATION_TABLE . " WHERE (`modification` =4 AND `user_id` =$user_id)");
  459. if ( $row = $db->sql_fetchrow($resban) )
  460. {
  461. $moderid = $row['voter_id'];
  462. $resmoder = db_query("SELECT * FROM " . USERS_TABLE . " WHERE (`user_id` =$moderid)");
  463. if ( $mod = $db->sql_fetchrow($resmoder) )
  464. {
  465. $modername = $mod['username'];
  466. }
  467. $razbloktime = $row['expire'] - (time() + (3600 * $board_config['board_timezone']));
  468. $chas = floor(($razbloktime / 3600) + $board_config['board_timezone']);
  469. $min = floor(($razbloktime / 60) + ($board_config['board_timezone'] * 60));
  470. $dni = ceil((($razbloktime / 3600) + $board_config['board_timezone']) / 24);
  471. $ban_information = 'аккуант был заблокирован модератором ' . $modername . ' в связи с несоблюдением правил сайта!<br/>До автоматического восстановления осталось ' . $dni . ' дней (в часах ' . $chas . ' ч, в минутах '. $min . ' мин)<br/>А пока есть время, читаем <a href="../pages/rules.php">правила</a> и думаем над своим поведением.';
  472. } else {
  473. $ban_information = 'аккуант был заблокирован на неопределённое время в связи с несоблюдением правил сайта!<br/>За дополнительной информацией обращайтесь к администрации форума.';
  474. }
  475. }
  476. } else {
  477. $ban_information = false;
  478. }
  479. return $ban_information;
  480. }
  481.  
  482. ?>