1: <?php
2: 3: 4: 5: 6: 7: 8: 9:
10: class Horde_Core_Factory_SessionHandler extends Horde_Core_Factory_Injector
11: {
12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
24: public function create(Horde_Injector $injector)
25: {
26: global $conf;
27:
28: if (empty($conf['sessionhandler']['type'])) {
29: $driver = 'Builtin';
30: } else {
31: $driver = $conf['sessionhandler']['type'];
32: if (!strcasecmp($driver, 'None')) {
33: $driver = 'Builtin';
34: }
35: }
36: $params = Horde::getDriverConfig('sessionhandler', $driver);
37:
38: $driver = basename(Horde_String::lower($driver));
39: $noset = false;
40:
41: switch ($driver) {
42: case 'builtin':
43: $noset = true;
44: break;
45:
46: case 'memcache':
47: $params['memcache'] = $injector->getInstance('Horde_Memcache');
48: break;
49:
50: case 'sql':
51: $factory = $injector->getInstance('Horde_Core_Factory_Db');
52: $config = $factory->getConfig('sessionhandler');
53: unset($config['umask'], $config['driverconfig']);
54: $params['db'] = $factory->createDb($config);
55: break;
56: }
57:
58: $class = 'Horde_SessionHandler_Storage_' . Horde_String::ucfirst($driver);
59: if (!class_exists($class)) {
60: throw new Horde_SessionHandler_Exception('Driver not found: ' . $class);
61: }
62: $storage = new $class($params);
63:
64: if (!empty($conf['sessionhandler']['memcache']) &&
65: !in_array($driver, array('builtin', 'memcache'))) {
66: $storage = new Horde_SessionHandler_Storage_Stack(array(
67: 'stack' => array(
68: new Horde_SessionHandler_Storage_Memcache(array(
69: 'memcache' => $injector->getInstance('Horde_Memcache')
70: )),
71: $storage
72: )
73: ));
74: }
75:
76: return new Horde_SessionHandler(
77: $storage,
78: array(
79: 'logger' => $injector->getInstance('Horde_Log_Logger'),
80: 'no_md5' => true,
81: 'noset' => $noset,
82: 'parse' => array($this, 'readSessionData')
83: )
84: );
85: }
86:
87: 88: 89: 90: 91: 92: 93: 94: 95: 96:
97: public function readSessionData($session_data)
98: {
99: if (empty($session_data)) {
100: return false;
101: }
102:
103: 104: 105: 106:
107: $old_sess = $_SESSION;
108: $_SESSION = array();
109:
110: if (session_id()) {
111: $new_sess = false;
112: } else {
113: $stub = new Horde_Support_Stub();
114:
115: session_set_save_handler(
116: array($stub, 'open'),
117: array($stub, 'close'),
118: array($stub, 'read'),
119: array($stub, 'write'),
120: array($stub, 'destroy'),
121: array($stub, 'gc')
122: );
123:
124: ob_start();
125: session_start();
126: ob_end_clean();
127:
128: $new_sess = true;
129: }
130:
131: session_decode($session_data);
132:
133: $data = $GLOBALS['session']->get('horde', 'auth/');
134: $apps = $GLOBALS['session']->get('horde', 'auth_app/');
135:
136: if ($new_sess) {
137: session_destroy();
138: }
139:
140: $_SESSION = $old_sess;
141:
142: return isset($data['userId'])
143: ? array(
144: 'apps' => array_keys($apps),
145: 'browser' => $data['browser'],
146: 'remoteAddr' => $data['remoteAddr'],
147: 'timestamp' => $data['timestamp'],
148: 'userid' => $data['userId']
149: )
150: : false;
151: }
152:
153: }
154: