AbstractStorage.php
1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
namespace Nextend\Framework\Session;
use Nextend\Framework\Plugin;
abstract class AbstractStorage {
protected static $expire = 86400; // 1 day
protected static $salt = 'nextendSalt';
protected $hash;
protected $storage = array();
public $storageChanged = false;
public function __construct($userIdentifier) {
$this->register();
if (!isset($_COOKIE['nextendsession']) || substr($_COOKIE['nextendsession'], 0, 2) != 'n2' || !preg_match('/^[a-f0-9]{32}$/', substr($_COOKIE['nextendsession'], 2))) {
$this->hash = 'n2' . md5(self::$salt . $userIdentifier);
setcookie('nextendsession', $this->hash, time() + self::$expire, $_SERVER["HTTP_HOST"]);
$_COOKIE['nextendsession'] = $this->hash;
} else {
$this->hash = $_COOKIE['nextendsession'];
}
$this->load();
}
/**
* Load the whole session
* $this->storage = json_decode(result for $this->hash);
*/
protected abstract function load();
/**
* Store the whole session
* $this->hash json_encode($this->storage);
*/
protected abstract function store();
public function get($key, $default = '') {
return isset($this->storage[$key]) ? $this->storage[$key] : $default;
}
public function set($key, $value) {
$this->storageChanged = true;
$this->storage[$key] = $value;
}
public function delete($key) {
$this->storageChanged = true;
unset($this->storage[$key]);
}
/**
* Register our method for PHP shut down
*/
protected function register() {
Plugin::addAction('exit', array(
$this,
'shutdown'
));
}
/**
* When PHP shuts down, we have to save our session's data if the data changed
*/
public function shutdown() {
Plugin::doAction('beforeSessionSave');
if ($this->storageChanged) {
$this->store();
}
}
}