sessions.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. // Original from http://www.daniweb.com/code/snippet43.html
  3. require_once "config.php";
  4. require_once "db.php";
  5. require_once "lib/accept-to-gettext.php";
  6. require_once "lib/gettext/gettext.inc";
  7. $session_expire = max(SESSION_COOKIE_LIFETIME, 86400);
  8. $session_name = (!defined('TTRSS_SESSION_NAME')) ? "ttrss_sid" : TTRSS_SESSION_NAME;
  9. if (@$_SERVER['HTTPS'] == "on") {
  10. $session_name .= "_ssl";
  11. ini_set("session.cookie_secure", true);
  12. }
  13. ini_set("session.gc_probability", 50);
  14. ini_set("session.name", $session_name);
  15. ini_set("session.use_only_cookies", true);
  16. ini_set("session.gc_maxlifetime", $session_expire);
  17. global $session_connection;
  18. function session_get_schema_version($link, $nocache = false) {
  19. global $schema_version;
  20. if (!$schema_version) {
  21. $result = db_query($link, "SELECT schema_version FROM ttrss_version");
  22. $version = db_fetch_result($result, 0, "schema_version");
  23. $schema_version = $version;
  24. return $version;
  25. } else {
  26. return $schema_version;
  27. }
  28. }
  29. function validate_session($link) {
  30. if (SINGLE_USER_MODE) return true;
  31. if (!$link) return false;
  32. $check_ip = $_SESSION['ip_address'];
  33. switch (SESSION_CHECK_ADDRESS) {
  34. case 0:
  35. $check_ip = '';
  36. break;
  37. case 1:
  38. $check_ip = substr($check_ip, 0, strrpos($check_ip, '.')+1);
  39. break;
  40. case 2:
  41. $check_ip = substr($check_ip, 0, strrpos($check_ip, '.'));
  42. $check_ip = substr($check_ip, 0, strrpos($check_ip, '.')+1);
  43. break;
  44. };
  45. if ($check_ip && strpos($_SERVER['REMOTE_ADDR'], $check_ip) !== 0) {
  46. $_SESSION["login_error_msg"] =
  47. __("Session failed to validate (incorrect IP)");
  48. return false;
  49. }
  50. if ($_SESSION["ref_schema_version"] != session_get_schema_version($link, true))
  51. return false;
  52. if (sha1($_SERVER['HTTP_USER_AGENT']) != $_SESSION["user_agent"])
  53. return false;
  54. if ($_SESSION["uid"]) {
  55. $result = db_query($link,
  56. "SELECT pwd_hash FROM ttrss_users WHERE id = '".$_SESSION["uid"]."'");
  57. // user not found
  58. if (db_num_rows($result) == 0) {
  59. return false;
  60. } else {
  61. $pwd_hash = db_fetch_result($result, 0, "pwd_hash");
  62. if ($pwd_hash != $_SESSION["pwd_hash"]) {
  63. return false;
  64. }
  65. }
  66. }
  67. /* if ($_SESSION["cookie_lifetime"] && $_SESSION["uid"]) {
  68. //print_r($_SESSION);
  69. if (time() > $_SESSION["cookie_lifetime"]) {
  70. return false;
  71. }
  72. } */
  73. return true;
  74. }
  75. function ttrss_open ($s, $n) {
  76. global $session_connection;
  77. $session_connection = db_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  78. return true;
  79. }
  80. function ttrss_read ($id){
  81. global $session_connection,$session_read;
  82. $query = "SELECT data FROM ttrss_sessions WHERE id='$id'";
  83. $res = db_query($session_connection, $query);
  84. if (db_num_rows($res) != 1) {
  85. return "";
  86. } else {
  87. $session_read = db_fetch_assoc($res);
  88. $session_read["data"] = base64_decode($session_read["data"]);
  89. return $session_read["data"];
  90. }
  91. }
  92. function ttrss_write ($id, $data) {
  93. if (! $data) {
  94. return false;
  95. }
  96. global $session_connection, $session_read, $session_expire;
  97. $expire = time() + $session_expire;
  98. $data = db_escape_string($session_connection, base64_encode($data), false);
  99. if ($session_read) {
  100. $query = "UPDATE ttrss_sessions SET data='$data',
  101. expire='$expire' WHERE id='$id'";
  102. } else {
  103. $query = "INSERT INTO ttrss_sessions (id, data, expire)
  104. VALUES ('$id', '$data', '$expire')";
  105. }
  106. db_query($session_connection, $query);
  107. return true;
  108. }
  109. function ttrss_close () {
  110. global $session_connection;
  111. //db_close($session_connection);
  112. return true;
  113. }
  114. function ttrss_destroy ($id) {
  115. global $session_connection;
  116. $query = "DELETE FROM ttrss_sessions WHERE id = '$id'";
  117. db_query($session_connection, $query);
  118. return true;
  119. }
  120. function ttrss_gc ($expire) {
  121. global $session_connection;
  122. $query = "DELETE FROM ttrss_sessions WHERE expire < " . time();
  123. db_query($session_connection, $query);
  124. }
  125. if (!SINGLE_USER_MODE /* && DB_TYPE == "pgsql" */) {
  126. session_set_save_handler("ttrss_open",
  127. "ttrss_close", "ttrss_read", "ttrss_write",
  128. "ttrss_destroy", "ttrss_gc");
  129. }
  130. if (!defined('TTRSS_SESSION_NAME') || TTRSS_SESSION_NAME != 'ttrss_api_sid') {
  131. if (isset($_COOKIE[$session_name])) {
  132. @session_start();
  133. if (!isset($_SESSION["uid"]) || !$_SESSION["uid"] || !validate_session($session_connection)) {
  134. session_destroy();
  135. setcookie(session_name(), '', time()-42000, '/');
  136. }
  137. }
  138. }
  139. ?>