first
This commit is contained in:
@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
namespace Nextend\Framework\Session;
|
||||
|
||||
use Nextend\Framework\Plugin;
|
||||
use Nextend\Framework\Request\Request;
|
||||
|
||||
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();
|
||||
$cookie = Request::$COOKIE->getCmd('nextendsession');
|
||||
if ($cookie === '' || substr($cookie, 0, 2) != 'n2' || !preg_match('/^[a-f0-9]{32}$/', substr($cookie, 2))) {
|
||||
$this->hash = 'n2' . md5(self::$salt . $userIdentifier);
|
||||
setcookie('nextendsession', $this->hash, time() + self::$expire, Request::$SERVER->getVar('HTTP_HOST'));
|
||||
Request::$COOKIE->set('nextendsession', $this->hash);
|
||||
} else {
|
||||
$this->hash = $cookie;
|
||||
}
|
||||
|
||||
$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();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace Nextend\Framework\Session;
|
||||
|
||||
|
||||
use Nextend\Framework\Session\Joomla\JoomlaStorage;
|
||||
use Nextend\Framework\Session\WordPress\WordPressStorage;
|
||||
|
||||
class Session {
|
||||
|
||||
/**
|
||||
* @var $storage AbstractStorage
|
||||
*/
|
||||
private static $storage = false;
|
||||
|
||||
private static function getStorage() {
|
||||
if (!self::$storage) {
|
||||
self::$storage = new WordPressStorage();
|
||||
}
|
||||
|
||||
return self::$storage;
|
||||
}
|
||||
|
||||
public static function get($key, $default = null) {
|
||||
return self::getStorage()
|
||||
->get($key, $default);
|
||||
}
|
||||
|
||||
public static function set($key, $value) {
|
||||
|
||||
self::getStorage()
|
||||
->set($key, $value);
|
||||
}
|
||||
|
||||
public static function delete($key) {
|
||||
|
||||
self::getStorage()
|
||||
->delete($key);
|
||||
}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace Nextend\Framework\Session\WordPress;
|
||||
|
||||
use Nextend\Framework\Session\AbstractStorage;
|
||||
use function delete_transient;
|
||||
use function get_current_user_id;
|
||||
use function get_transient;
|
||||
use function set_transient;
|
||||
|
||||
class WordPressStorage extends AbstractStorage {
|
||||
|
||||
public function __construct() {
|
||||
parent::__construct(get_current_user_id());
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the whole session
|
||||
*/
|
||||
protected function load() {
|
||||
$stored = get_transient($this->hash);
|
||||
|
||||
if (!is_array($stored)) {
|
||||
$stored = array();
|
||||
}
|
||||
$this->storage = $stored;
|
||||
}
|
||||
|
||||
/**
|
||||
* Store the whole session
|
||||
*/
|
||||
protected function store() {
|
||||
if (count($this->storage) > 0) {
|
||||
set_transient($this->hash, $this->storage, self::$expire);
|
||||
} else {
|
||||
delete_transient($this->hash);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user