| 
									
										
										
										
											2009-06-27 05:15:59 -07:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Table Definition for session | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2009-08-25 18:14:12 -04:00
										 |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * Copyright (C) 2009, StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2009-06-27 05:15:59 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 10:41:36 -04:00
										 |  |  | if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } | 
					
						
							| 
									
										
										
										
											2009-06-27 05:15:59 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Session extends Memcached_DataObject | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ###START_AUTOCODE
 | 
					
						
							|  |  |  |     /* the code below is auto generated do not remove the above tag */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public $__table = 'session';                         // table name
 | 
					
						
							|  |  |  |     public $id;                              // varchar(32)  primary_key not_null
 | 
					
						
							|  |  |  |     public $session_data;                    // text()
 | 
					
						
							|  |  |  |     public $created;                         // datetime()   not_null
 | 
					
						
							|  |  |  |     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Static get */ | 
					
						
							|  |  |  |     function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Session',$k,$v); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* the code above is auto generated do not remove the tag below */ | 
					
						
							|  |  |  |     ###END_AUTOCODE
 | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-27 07:09:21 -07:00
										 |  |  |     static function logdeb($msg) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-06-27 08:11:09 -07:00
										 |  |  |         if (common_config('sessions', 'debug')) { | 
					
						
							|  |  |  |             common_debug("Session: " . $msg); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-06-27 07:09:21 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |     static function open($save_path, $session_name) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function close() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function read($id) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-06-27 07:09:21 -07:00
										 |  |  |         self::logdeb("Fetching session '$id'"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |         $session = Session::staticGet('id', $id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($session)) { | 
					
						
							| 
									
										
										
										
											2010-01-28 13:53:28 -05:00
										 |  |  |             self::logdeb("Couldn't find '$id'"); | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |             return ''; | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2010-01-28 13:53:28 -05:00
										 |  |  |             self::logdeb("Found '$id', returning " . | 
					
						
							|  |  |  |                          strlen($session->session_data) . | 
					
						
							|  |  |  |                          " chars of data"); | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |             return (string)$session->session_data; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function write($id, $session_data) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-06-27 07:09:21 -07:00
										 |  |  |         self::logdeb("Writing session '$id'"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |         $session = Session::staticGet('id', $id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($session)) { | 
					
						
							| 
									
										
										
										
											2010-01-28 13:53:28 -05:00
										 |  |  |             self::logdeb("'$id' doesn't yet exist; inserting."); | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |             $session = new Session(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $session->id           = $id; | 
					
						
							|  |  |  |             $session->session_data = $session_data; | 
					
						
							|  |  |  |             $session->created      = common_sql_now(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-28 13:53:28 -05:00
										 |  |  |             $result = $session->insert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!$result) { | 
					
						
							|  |  |  |                 common_log_db_error($session, 'INSERT', __FILE__); | 
					
						
							|  |  |  |                 self::logdeb("Failed to insert '$id'."); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 self::logdeb("Successfully inserted '$id' (result = $result)."); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return $result; | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2010-01-28 13:53:28 -05:00
										 |  |  |             self::logdeb("'$id' already exists; updating."); | 
					
						
							| 
									
										
										
										
											2009-10-09 10:39:56 -04:00
										 |  |  |             if (strcmp($session->session_data, $session_data) == 0) { | 
					
						
							|  |  |  |                 self::logdeb("Not writing session '$id'; unchanged"); | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 self::logdeb("Session '$id' data changed; updating"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $orig = clone($session); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $session->session_data = $session_data; | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-28 13:53:28 -05:00
										 |  |  |                 $result = $session->update($orig); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (!$result) { | 
					
						
							|  |  |  |                     common_log_db_error($session, 'UPDATE', __FILE__); | 
					
						
							|  |  |  |                     self::logdeb("Failed to update '$id'."); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     self::logdeb("Successfully updated '$id' (result = $result)."); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 return $result; | 
					
						
							| 
									
										
										
										
											2009-10-09 10:39:56 -04:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function destroy($id) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-06-27 07:09:21 -07:00
										 |  |  |         self::logdeb("Deleting session $id"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |         $session = Session::staticGet('id', $id); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-28 13:53:28 -05:00
										 |  |  |         if (empty($session)) { | 
					
						
							|  |  |  |             self::logdeb("Can't find '$id' to delete."); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $result = $session->delete(); | 
					
						
							|  |  |  |             if (!$result) { | 
					
						
							|  |  |  |                 common_log_db_error($session, 'DELETE', __FILE__); | 
					
						
							|  |  |  |                 self::logdeb("Failed to delete '$id'."); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 self::logdeb("Successfully deleted '$id' (result = $result)."); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return $result; | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function gc($maxlifetime) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-06-27 07:09:21 -07:00
										 |  |  |         self::logdeb("garbage collection (maxlifetime = $maxlifetime)"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 11:31:34 -07:00
										 |  |  |         $epoch = common_sql_date(time() - $maxlifetime); | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-02 11:18:41 -04:00
										 |  |  |         $ids = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |         $session = new Session(); | 
					
						
							| 
									
										
										
										
											2009-07-21 11:31:34 -07:00
										 |  |  |         $session->whereAdd('modified < "'.$epoch.'"'); | 
					
						
							| 
									
										
										
										
											2009-08-02 11:18:41 -04:00
										 |  |  |         $session->selectAdd(); | 
					
						
							|  |  |  |         $session->selectAdd('id'); | 
					
						
							| 
									
										
										
										
											2009-06-27 07:09:21 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-27 12:07:29 -08:00
										 |  |  |         $limit = common_config('sessions', 'gc_limit'); | 
					
						
							|  |  |  |         if ($limit > 0) { | 
					
						
							|  |  |  |             // On large sites, too many sessions to expire
 | 
					
						
							|  |  |  |             // at once will just result in failure.
 | 
					
						
							|  |  |  |             $session->limit($limit); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-02 10:34:23 -04:00
										 |  |  |         $session->find(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         while ($session->fetch()) { | 
					
						
							| 
									
										
										
										
											2009-08-02 11:18:41 -04:00
										 |  |  |             $ids[] = $session->id; | 
					
						
							| 
									
										
										
										
											2009-08-02 10:34:23 -04:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $session->free(); | 
					
						
							| 
									
										
										
										
											2009-08-02 11:18:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-28 13:53:28 -05:00
										 |  |  |         self::logdeb("Found " . count($ids) . " ids to delete."); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-02 11:18:41 -04:00
										 |  |  |         foreach ($ids as $id) { | 
					
						
							| 
									
										
										
										
											2010-01-28 13:53:28 -05:00
										 |  |  |             self::logdeb("Destroying session '$id'."); | 
					
						
							| 
									
										
										
										
											2009-08-02 11:18:41 -04:00
										 |  |  |             self::destroy($id); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function setSaveHandler() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-06-27 07:09:21 -07:00
										 |  |  |         self::logdeb("setting save handlers"); | 
					
						
							|  |  |  |         $result = session_set_save_handler('Session::open', 'Session::close', 'Session::read', | 
					
						
							|  |  |  |                                            'Session::write', 'Session::destroy', 'Session::gc'); | 
					
						
							|  |  |  |         self::logdeb("save handlers result = $result"); | 
					
						
							| 
									
										
										
										
											2010-12-10 22:08:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // PHP 5.3 with APC ends up destroying a bunch of object stuff before the session
 | 
					
						
							|  |  |  |         // save handlers get called on request teardown.
 | 
					
						
							|  |  |  |         // Registering an explicit shutdown function should take care of this before
 | 
					
						
							|  |  |  |         // everything breaks on us.
 | 
					
						
							|  |  |  |         register_shutdown_function('Session::cleanup'); | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2009-06-27 07:09:21 -07:00
										 |  |  |         return $result; | 
					
						
							| 
									
										
										
										
											2009-06-27 05:48:22 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-12-10 22:08:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static function cleanup() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         session_write_close(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-06-27 05:15:59 -07:00
										 |  |  | } |