PageRenderTime 44ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/session.php

https://github.com/dreamhackcrew/API
PHP | 205 lines | 145 code | 25 blank | 35 comment | 35 complexity | 4003e094db29875ae8d254fe5d87d124 MD5 | raw file
  1. <?php
  2. /* vim: set expandtab tabstop=3 shiftwidth=3: */
  3. /**
  4. *
  5. * Set_save_session_handler functions
  6. *
  7. * PHP Version 5
  8. *
  9. * @category sessions
  10. * @copyright 2008 the zion group
  11. * @link http://honeydew.se/
  12. * @author Joel Hansson <joel@everlast.se>
  13. * @author Jonathan Svensson-Kรถhler <stamp@stamp.se>
  14. * @author Jonas Falck <jonaz@jonaz.net>
  15. **/
  16. require_once 'config.php';
  17. require_once 'db.php';
  18. class session {
  19. const version = '1.3.1';
  20. const sess_life = 3600; // One hour.
  21. const usefile = 1;
  22. function __construct() {// {{{
  23. // we should alread have made the connection to the database
  24. if ( !db() )
  25. return !trigger_error('No db-object were present',E_USER_WARNING);
  26. session_set_save_handler(
  27. array($this,'open'),
  28. array($this,'close'),
  29. array($this,'read'),
  30. array($this,'write'),
  31. array($this,'destroy'),
  32. array($this,'gc')
  33. );
  34. // Fire it up!
  35. session_start();
  36. //register_shutdown_function('session_write_close');
  37. }
  38. // }}}
  39. function __destruct(){
  40. //session_write_close();
  41. }
  42. function __sleep(){
  43. //session_write_close();
  44. }
  45. static function open( $save_path, $session_name ) {// {{{
  46. return true;
  47. }
  48. // }}}
  49. static function close() {// {{{
  50. return true;
  51. }
  52. // }}}
  53. static function read($key){// {{{
  54. $expiry = time();
  55. if(session::usefile == 1){
  56. $sql = 'SELECT sesskey FROM sessions '.
  57. 'WHERE sesskey = "'.$key.'" '.
  58. 'AND ip = "'.$_SERVER['REMOTE_ADDR'].'" '.
  59. 'AND expiry > "'.$expiry.'" '.
  60. 'LIMIT 1';
  61. if ($result = db()->fetchOne($sql)) {
  62. if ( !is_dir(config::storage) ) {
  63. mkdir(config::storage);
  64. }
  65. if ( !is_dir(config::storage."/sessions/") ) {
  66. mkdir(config::storage."/sessions");
  67. }
  68. if(is_file(config::storage."/sessions/".$result)){
  69. $timeout = time()+2;
  70. while(($content = @file_get_contents(config::storage."/sessions/".$result)) === false || $content == NULL || $content ==''){
  71. if(time() > $timeout)
  72. return "timeout";
  73. error()->note('session read failed, trying again! content:'.$content);
  74. }
  75. return $content;
  76. }else
  77. return;
  78. }
  79. self::destroy($key);
  80. }
  81. else {
  82. $sql = 'SELECT value FROM sessions '.
  83. 'WHERE sesskey = "'.$key.'" '.
  84. 'AND ip = "'.$_SERVER['REMOTE_ADDR'].'" '.
  85. 'AND expiry > "'.$expiry.'" '.
  86. 'LIMIT 1';
  87. if ($result = db::getInstance()->fetchOne($sql)) {
  88. return $result;
  89. }
  90. self::destroy($key);
  91. }
  92. return false;
  93. }
  94. // }}}
  95. static function write($key, $val){// {{{
  96. $expiry = time() + session::sess_life;
  97. $fileval = NULL;
  98. if(session::usefile == 1){
  99. $value = "";
  100. $fileval = $val;
  101. }
  102. else
  103. $value = addslashes($val);
  104. /**
  105. * is there already a row with the correct sesskey and ip?
  106. * if so, we should do update, if not, lets do insert
  107. */
  108. $sql_chk_key = 'SELECT sesskey, expiry,ip '.
  109. 'FROM sessions '.
  110. 'WHERE sesskey="'.$key.'" '.
  111. 'AND ip="'.$_SERVER['REMOTE_ADDR'].'" '.
  112. 'LIMIT 1';
  113. $result = db()->fetchSingle($sql_chk_key);
  114. $user = isset($_SESSION['id']) ? $_SESSION['id'] : 0;
  115. // destroy expired sessions;
  116. if ( isset($result['sesskey']) && ( ($result['expiry'] < time()) || $result['ip']!=$_SERVER['REMOTE_ADDR']) ) {
  117. self::destroy($result['sesskey']);
  118. return false;
  119. } elseif ( isset($result['sesskey']) ) {
  120. $sql = 'UPDATE sessions SET '.
  121. 'expiry = '.$expiry.', '.
  122. 'uid = '.$user.' '.
  123. //'value = "'.$value.'" '.
  124. 'WHERE sesskey = "'.$key.'" '.
  125. 'AND ip = "'.$_SERVER['REMOTE_ADDR'].'"';
  126. if($fileval !=null)
  127. file_put_contents(config::storage."/sessions/".$result['sesskey'],$fileval);
  128. } else {
  129. $sql = 'INSERT INTO sessions SET '.
  130. 'sesskey="'.$key.'", '.
  131. 'expiry='.$expiry.', '.
  132. 'uid='.$user.', '.
  133. //'value="'.$value.'", '.
  134. 'ip ="'.$_SERVER['REMOTE_ADDR'].'"';
  135. if($fileval !=null)
  136. file_put_contents(config::storage."/sessions/".$key,$fileval);
  137. }
  138. $result = db()->query($sql);
  139. if ( date('s') == '42' )
  140. session::gc(123);
  141. if($result)
  142. return true;
  143. return false;
  144. }
  145. // }}}
  146. static function destroy($key){// {{{
  147. $sql = 'DELETE FROM sessions WHERE sesskey = "'.$key.'"';
  148. if(db()->query($sql)){
  149. if(is_file(config::storage."/sessions/".$key))
  150. unlink(config::storage."/sessions/".$key);
  151. return true;
  152. }
  153. return false;
  154. }
  155. // }}}
  156. static function gc($sess_life) {// {{{
  157. $time = time();
  158. if(session::usefile == 1){
  159. if ( $sessions = db()->fetchAllOne("SELECT sesskey FROM sessions WHERE expiry <".$time) )
  160. foreach($sessions AS $sesskey)
  161. if ( is_file(config::storage."/sessions/".$sesskey) )
  162. unlink(config::storage."/sessions/".$sesskey);
  163. //session::cleanFilesWithoutSessions();
  164. }
  165. $sql = 'DELETE FROM sessions WHERE expiry < ' . $time;
  166. db()->query($sql);
  167. //error()->note(' - cleared sessions; '.mysql_affected_rows().' rows removed.');
  168. return db()->affectedRows();
  169. }
  170. // }}}
  171. static function cleanFilesWithoutSessions(){
  172. $sessions = db()->fetchAllOne("SELECT sesskey FROM sessions");
  173. $files = scandir(config::storage."/sessions/");
  174. foreach($files AS $file){
  175. if($file != '.' && $file != '..' && !in_array($file,$sessions))
  176. unlink(config::storage."/sessions/".$file);
  177. }
  178. }
  179. }
  180. ?>