[Eis-commits] SF.net SVN: eis: [211] trunk
Status: Pre-Alpha
Brought to you by:
baslijnse
|
From: <bas...@us...> - 2007-09-15 00:40:11
|
Revision: 211
http://eis.svn.sourceforge.net/eis/?rev=211&view=rev
Author: baslijnse
Date: 2007-09-14 17:40:07 -0700 (Fri, 14 Sep 2007)
Log Message:
-----------
added a pluggable session storage mechanism using services similiar to the authentication mechanism
Modified Paths:
--------------
trunk/lib/engine/engine.lib.php
trunk/lib/engine/session.lib.php
trunk/mod/eis_session/config/module.php
Added Paths:
-----------
trunk/lib/base/sessionservice.lib.php
trunk/mod/eis_session/services/
trunk/mod/eis_session/services/FileStoreService.php
Removed Paths:
-------------
trunk/mod/eis_session/info.txt
Added: trunk/lib/base/sessionservice.lib.php
===================================================================
--- trunk/lib/base/sessionservice.lib.php (rev 0)
+++ trunk/lib/base/sessionservice.lib.php 2007-09-15 00:40:07 UTC (rev 211)
@@ -0,0 +1,28 @@
+<?php
+ /**
+ * Base interface class for session services.
+ * If a module implements this interface, EIS can use it to store sessions
+ */
+ class SessionService extends Service {
+
+ /**
+ * Load a session datastructure.
+ *
+ * @return a dictionary containing:
+ * id (integer), key (string), uid, (integer), age (integer), data (structure)
+ */
+ function loadSession($id, $key, $ip) {
+ }
+ /**
+ * Store a session datastructure.
+ */
+ function storeSession($session) {
+ }
+ /**
+ * Purges old sessions from the data storage
+ */
+ function purgeSessions() {
+
+ }
+ }
+?>
Modified: trunk/lib/engine/engine.lib.php
===================================================================
--- trunk/lib/engine/engine.lib.php 2007-09-14 11:20:31 UTC (rev 210)
+++ trunk/lib/engine/engine.lib.php 2007-09-15 00:40:07 UTC (rev 211)
@@ -70,7 +70,6 @@
function _initApplication($application) {
require_once("lib/engine/application.lib.php");
require_once("lib/base/service.lib.php");
- require_once("lib/base/authservice.lib.php");
require_once("lib/base/element.lib.php");
$this->application = new Application($this);
$this->application->load($application);
@@ -105,6 +104,7 @@
*/
function _initSession() {
require("lib/engine/session.lib.php");
+ require("lib/base/sessionservice.lib.php");
$this->session = new Session($this);
$this->session->load();
}
@@ -113,6 +113,7 @@
*/
function _initUser() {
require("lib/engine/user.lib.php");
+ require("lib/base/authservice.lib.php");
$this->user = new User($this);
$this->user->load();
}
Modified: trunk/lib/engine/session.lib.php
===================================================================
--- trunk/lib/engine/session.lib.php 2007-09-14 11:20:31 UTC (rev 210)
+++ trunk/lib/engine/session.lib.php 2007-09-15 00:40:07 UTC (rev 211)
@@ -11,14 +11,9 @@
var $key; /**< Random session key */
var $uid; /**< User id */
- var $status; /**< Session status: new, renewed, expired */
+ var $status; /**< Session status: new, renewed, expired */
var $age; /**< Session age in seconds */
- var $ttlAnonymous = 3600; /**< Time to live for anonymous sessions */
- var $ttlAuthenticated = 3600; /**< Time to live for authenticated sessions */
-
- var $storage = 'file'; /**< Where to store the session data. file or database */
-
var $data = array();
function Session(&$engine) {
@@ -27,7 +22,7 @@
//Clean session
$this->id = 0;
$this->ip = $_SERVER['REMOTE_ADDR'];
- $this->key = "";
+ $this->key = $this->_genKey();
$this->uid = 0;
$this->status = 'new';
@@ -42,19 +37,8 @@
function setKey($key) {
$this->key = $key;
}
- function setTtlAnonymous($ttl) {
- $this->ttlAnonymous = intval($ttl);
- }
- function setTtlAuthenticated($ttl) {
- $this->ttlAuthenticated = intval($ttl);
- }
- function setStorage($storage) {
- if(in_array($storage,array('file','database'))) {
- $this->storage = $storage;
- }
- }
function setUid($uid) {
- //$this->uid = intval($uid);
+ $this->uid = intval($uid);
}
function getStatus() {
@@ -75,17 +59,24 @@
$id = intval($param[0]);
$key = $param[1];
- switch($this->storage) {
- case 'file':
- $this->_cleanFiles();
- $success = $this->_loadFromFile($id, $key);
- break;
- case 'database':
- $this->_cleanDatabase();
- $success = $this->_loadFromDatabase($id, $key);
- break;
+ $backend = $this->e->application->getSessionBackend();
+ if(!is_array($backend)) {
+ $this->status = 'new';
+ return;
}
- if($success) {
+
+ $service =& $this->e->getService($backend['module'],$backend['service']);
+ $session = $service->purgeSessions();
+ $session = $service->loadSession($id, $key,$_SERVER['REMOTE_ADDR']);
+
+ if(is_array($session)) {
+ $this->id = $session['id'];
+ $this->ip = $session['ip'];
+ $this->key = $session['key'];
+ $this->uid = $session['uid'];
+ $this->age = $session['age'];
+ $this->data = $session['data'];
+
$this->status = 'restored';
} else {
$this->status = 'expired';
@@ -97,18 +88,24 @@
}
function save () {
- switch($this->storage) {
- case 'file':
- $success = $this->_saveToFile();
- break;
- case 'database':
- $success = $this->_saveToDatabase();
- break;
+ $backend = $this->e->application->getSessionBackend();
+ if(!is_array($backend)) {
+ return;
}
- if ($success) {
- setcookie('eis-session', base64_encode($this->id.':'.$this->key),null,$this->e->getBasePath());
- }
- return $success;
+
+ $session['id'] = $this->id;
+ $session['ip'] = $this->ip;
+ $session['key'] = $this->key;
+ $session['uid'] = $this->uid;
+ $session['data'] = $this->data;
+
+ //Store session
+ $service =& $this->e->getService($backend['module'],$backend['service']);
+ $service->storeSession($session);
+
+ //Set cookie
+ $cookie = base64_encode($this->id.':'.$this->key);
+ setcookie('eis-session',$cookie,null,$this->e->getBasePath());
}
function set($key, $value, $cat = 'site') {
@@ -162,12 +159,6 @@
}
//Engine scope values
- function getPermissions() {
- return $this->get('permissions','engine');
- }
- function getPreferences() {
- return $this->get('preferences','engine');
- }
function getHistory() {
$history = $this->get('history','engine');
if(is_array($history)) {
@@ -188,102 +179,6 @@
$this->set('history',$history,'engine');
}
- function _loadFromFile($id, $key) {
-
- $pattern = '/tmp/eis-session-'.md5($id.$key).'-*';
- $files = glob($pattern);
-
- if(count($files) == 1 && is_readable($files[0])) {
-
- $filename = $files[0];
-
- //Get content
- $age = time() - filemtime($filename);
- $content = unserialize(implode('',file($filename)));
- if(is_array($content) && count($content) == 3) {
- list($ip, $uid, $data) = $content;
- } else {
- @unlink($filename);
- return false;
- }
- //Check ip
- if($ip != $_SERVER['REMOTE_ADDR']) {
- @unlink($filename);
- return false;
- }
- //Check age
- if(($uid == 0 && $age > $this->ttlAnonymous) ||
- ($uid > 0 && $age > $this->ttlAuthenticated) ) {
- @unlink($filename);
- return false;
- }
- //Touch file
- $f = fopen($filename,'a');
- fclose($f);
-
- //Restore data
- $this->id = $id;
- $this->key = $key;
- $this->uid = $uid;
- $this->age = $age;
- $this->data = $data;
-
- return true;
- } else {
- return false;
- }
- }
- function _loadFromDatabase($id, $key) {
- //TODO
- }
- function _saveToFile() {
- if($this->id == 0) {
- $this->id = 69;//TODO: Gen unique id
- $this->key = $this->_genKey();
- }
-
- $filename = '/tmp/eis-session-'.md5($this->id.$this->key).'-'.$this->uid;
- $content = array($this->ip,$this->uid,$this->data);
- $content = serialize($content);
-
- $f = fopen($filename,'w');
- fwrite($f,$content);
- fclose($f);
-
- return true;
- }
- function _saveToDatabase() {
- return true;
- }
- function _cleanFiles() {
- if(rand(0,20)) { //Cleanup once in 20 hits on average
- return;
- }
- $files = glob('/tmp/eis-session-*');
- if(!is_array($files)) {
- return;
- }
- foreach($files as $filename) {
- if(ereg('/tmp/eis-session-([0-9a-f]+)-([0-9]+)',$filename, $match)) {
- $uid = intval($match[2]);
- $age = time() - filemtime($filename);
- if($uid > 0) { //Authenticated
- if ($age <= $this->ttlAuthenticated) {
- continue;
- }
- } else { //Anonymous
- if ($age <= $this->ttlAnonymous) {
- continue;
- }
- }
- }
- //Remove file
- @unlink($filename);
- }
- }
- function _cleanDatabases() {
- //TODO
- }
function _genKey() {
$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$key = "";
Modified: trunk/mod/eis_session/config/module.php
===================================================================
--- trunk/mod/eis_session/config/module.php 2007-09-14 11:20:31 UTC (rev 210)
+++ trunk/mod/eis_session/config/module.php 2007-09-15 00:40:07 UTC (rev 211)
@@ -1,7 +1,6 @@
<?php
- # Session Settings
- $cfg['session_ttl_user'] = "600"; # Session time to live in minutes for authenticated sessions
- $cfg['session_ttl_anonymous'] = "1200"; # Session time to live for anomous sessions
+ $cfg['ttl_authenticated'] = "1800"; // Session time to live in minutes for authenticated sessions
+ $cfg['ttl_anonymous'] = "3600"; //Session time to live for anomous sessions
-
+ $cfg['tmp_dir'] = '/tmp';
?>
Deleted: trunk/mod/eis_session/info.txt
===================================================================
--- trunk/mod/eis_session/info.txt 2007-09-14 11:20:31 UTC (rev 210)
+++ trunk/mod/eis_session/info.txt 2007-09-15 00:40:07 UTC (rev 211)
@@ -1,15 +0,0 @@
-Module: user
-Version: 0.?
-Status: Testing
-Licencse: BSD
-Maintainer: bas...@en...
-Description:
-EIS uses sessions, which are basicly unrestricted datastructures, to keep
-state between stateless http requests. This module provides the basic
-infrastructure for sessions and some session related user interface
-components, such as statistics and information about currently active
-sessions.
-
-Known issues:
-The module's core session infrastructure is ready and in testing phase, but no
-interface elements as mentioned in the description have been made yet.
Added: trunk/mod/eis_session/services/FileStoreService.php
===================================================================
--- trunk/mod/eis_session/services/FileStoreService.php (rev 0)
+++ trunk/mod/eis_session/services/FileStoreService.php 2007-09-15 00:40:07 UTC (rev 211)
@@ -0,0 +1,92 @@
+<?php
+ class eis_session_FileStoreService extends SessionService {
+
+ function loadSession($id, $key, $ip) {
+
+ $pattern = $this->mc['tmp_dir'].'/eis-session-'.md5($id.$key);
+ $files = glob($pattern);
+
+ if(count($files) == 1 && is_readable($files[0])) {
+
+ $filename = $files[0];
+
+ $session = array();
+ $session['id'] = $id;
+ $session['key'] = $key;
+ $session['age'] = time() - filemtime($filename);
+
+ //Load content
+ $content = unserialize(implode('',file($filename)));
+
+ if(is_array($content) && count($content) == 3) {
+ $session['ip'] = $content[0];
+ $session['uid'] = $content[1];
+ $session['data'] = $content[2];
+ } else {
+ @unlink($filename);
+ return null;
+ }
+ //Check ip
+ if($session['ip'] != $ip) {
+ @unlink($filename);
+ return null;
+ }
+ //Check age
+ if(($session['uid'] == 0 && $session['age'] > $this->mc['ttl_anonymous']) ||
+ ($session['uid'] > 0 && $session['age'] > $this->mc['ttl_authenticated']) ) {
+ @unlink($filename);
+ return null;
+ }
+
+ //Touch file
+ $f = fopen($filename,'a');
+ fclose($f);
+
+ //Return session
+ return $session;
+ }
+
+ return null;
+ }
+
+ function storeSession($session) {
+
+ $filename = $this->mc['tmp_dir'].'/eis-session-'.md5($session['id'].$session['key']);
+ $content = serialize(array($session['ip'],$session['uid'],$session['data']));
+
+ $f = fopen($filename,'w');
+ fwrite($f,$content);
+ fclose($f);
+ }
+
+ function purgeSessions() {
+ if(rand(0,20)) { //Cleanup once in 20 hits on average
+ return;
+ }
+ $files = glob($this->mc['tmp_dir'].'/eis-session-*');
+ if(!is_array($files)) {
+ return;
+ }
+ foreach($files as $filename) {
+
+ $content = unserialize(implode('',file($filename)));
+
+ if(is_array($content) && count($content) == 3) {
+ $uid = intval($content[1]);
+ $age = time() - filemtime($filename);
+ if($uid > 0) { //Authenticated
+ if ($age <= $this->mc['ttl_authenticated']) {
+ continue;
+ }
+ } else { //Anonymous
+ if ($age <= $this->mc['ttl_anonymous']) {
+ continue;
+ }
+ }
+ }
+ //Remove file
+ @unlink($filename);
+ }
+ }
+ }
+?>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|