2009-05-10 10:50:39 +03:00
|
|
|
|
<?php
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/*-------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* LiveStreet Engine Social Networking
|
|
|
|
|
* Copyright © 2008 Mzhelskiy Maxim
|
|
|
|
|
*
|
|
|
|
|
*--------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* Official site: www.livestreet.ru
|
|
|
|
|
* Contact e-mail: rus.engine@gmail.com
|
|
|
|
|
*
|
|
|
|
|
* GNU General Public License, version 2:
|
|
|
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
|
|
|
*
|
|
|
|
|
---------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Модуль для работы с сессиями
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* Выступает в качестве врапера для стандартного механизма сессий
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @package engine.modules
|
|
|
|
|
* @since 1.0
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*/
|
2010-05-27 17:02:43 +03:00
|
|
|
|
class ModuleSession extends Module {
|
2012-04-27 13:23:02 +03:00
|
|
|
|
/**
|
|
|
|
|
* ID сессии
|
|
|
|
|
*
|
|
|
|
|
* @var null|string
|
|
|
|
|
*/
|
2008-09-21 09:36:57 +03:00
|
|
|
|
protected $sId=null;
|
2012-04-27 13:23:02 +03:00
|
|
|
|
/**
|
|
|
|
|
* Данные сессии
|
|
|
|
|
*
|
|
|
|
|
* @var array
|
|
|
|
|
*/
|
|
|
|
|
protected $aData=array();
|
2011-08-28 18:04:16 +03:00
|
|
|
|
/**
|
|
|
|
|
* Список user-agent'ов для флеш плеера
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* Используется для передачи ID сессии при обращениии к сайту через flash, например, загрузка файлов через flash
|
2011-08-28 18:04:16 +03:00
|
|
|
|
*
|
|
|
|
|
* @var array
|
|
|
|
|
*/
|
|
|
|
|
protected $aFlashUserAgent=array(
|
2011-11-21 14:08:39 +02:00
|
|
|
|
'Shockwave Flash'
|
2011-08-28 18:04:16 +03:00
|
|
|
|
);
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Использовать или нет стандартный механизм сессий
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* ВНИМАНИЕ! Не рекомендуется ставить false - т.к. этот режим до конца не протестирован
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*
|
|
|
|
|
* @var bool
|
|
|
|
|
*/
|
2012-04-27 13:23:02 +03:00
|
|
|
|
protected $bUseStandartSession=true;
|
|
|
|
|
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Инициализация модуля
|
|
|
|
|
*
|
|
|
|
|
*/
|
2009-08-19 16:15:47 +03:00
|
|
|
|
public function Init() {
|
2009-08-19 17:53:16 +03:00
|
|
|
|
$this->bUseStandartSession = Config::Get('sys.session.standart');
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Стартуем сессию
|
|
|
|
|
*/
|
|
|
|
|
$this->Start();
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Старт сессии
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function Start() {
|
|
|
|
|
if ($this->bUseStandartSession) {
|
2012-04-27 13:23:02 +03:00
|
|
|
|
session_name(Config::Get('sys.session.name'));
|
2009-08-19 17:53:16 +03:00
|
|
|
|
session_set_cookie_params(
|
|
|
|
|
Config::Get('sys.session.timeout'),
|
|
|
|
|
Config::Get('sys.session.path'),
|
|
|
|
|
Config::Get('sys.session.host')
|
|
|
|
|
);
|
2010-03-06 18:21:31 +02:00
|
|
|
|
if(!session_id()) {
|
2011-07-24 00:55:56 +03:00
|
|
|
|
/**
|
|
|
|
|
* Даем возможность флешу задавать id сессии
|
|
|
|
|
*/
|
2012-04-27 13:23:02 +03:00
|
|
|
|
$sUserAgent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null;
|
2011-11-21 14:08:39 +02:00
|
|
|
|
if ($sUserAgent and (in_array($sUserAgent,$this->aFlashUserAgent) or strpos($sUserAgent,"Adobe Flash Player")===0) and preg_match("/^[\w\d]{5,40}$/",getRequest('SSID'))) {
|
2011-07-24 00:55:56 +03:00
|
|
|
|
session_id(getRequest('SSID'));
|
|
|
|
|
} else {
|
|
|
|
|
session_regenerate_id();
|
|
|
|
|
}
|
2012-01-22 12:16:18 +02:00
|
|
|
|
session_start();
|
2010-03-06 18:21:31 +02:00
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
} else {
|
|
|
|
|
$this->SetId();
|
|
|
|
|
$this->ReadData();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Устанавливает уникальный идентификатор сессии
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function SetId() {
|
|
|
|
|
/**
|
|
|
|
|
* Если идентификатор есть в куках то берем его
|
|
|
|
|
*/
|
2009-08-19 17:53:16 +03:00
|
|
|
|
if (isset($_COOKIE[Config::Get('sys.session.name')])) {
|
|
|
|
|
$this->sId=$_COOKIE[Config::Get('sys.session.name')];
|
2008-09-21 09:36:57 +03:00
|
|
|
|
} else {
|
|
|
|
|
/**
|
|
|
|
|
* Иначе создаём новый и записываем его в куку
|
|
|
|
|
*/
|
|
|
|
|
$this->sId=$this->GenerateId();
|
2009-08-19 17:53:16 +03:00
|
|
|
|
setcookie(
|
|
|
|
|
Config::Get('sys.session.name'),
|
|
|
|
|
$this->sId,time()+Config::Get('sys.session.timeout'),
|
|
|
|
|
Config::Get('sys.session.path'),
|
|
|
|
|
Config::Get('sys.session.host')
|
|
|
|
|
);
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
2009-10-20 02:42:23 +03:00
|
|
|
|
/**
|
|
|
|
|
* Получает идентификатор текущей сессии
|
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
*/
|
2009-10-20 02:42:23 +03:00
|
|
|
|
public function GetId() {
|
2010-07-05 22:53:56 +03:00
|
|
|
|
if ($this->bUseStandartSession) {
|
|
|
|
|
return session_id();
|
|
|
|
|
} else {
|
|
|
|
|
return $this->sId;
|
|
|
|
|
}
|
2009-10-20 02:42:23 +03:00
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
/**
|
|
|
|
|
* Гинерирует уникальный идентификатор
|
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @return string
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*/
|
|
|
|
|
protected function GenerateId() {
|
|
|
|
|
return md5(func_generator().time());
|
|
|
|
|
}
|
|
|
|
|
/**
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* Читает данные сессии в aData
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function ReadData() {
|
|
|
|
|
$this->aData=$this->Cache_Get($this->sId);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Сохраняет данные сессии
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
protected function Save() {
|
2009-08-19 17:53:16 +03:00
|
|
|
|
$this->Cache_Set($this->aData,$this->sId,array(),Config::Get('sys.session.timeout'));
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Получает значение из сессии
|
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @param string $sName Имя параметра
|
|
|
|
|
* @return mixed|null
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*/
|
|
|
|
|
public function Get($sName) {
|
|
|
|
|
if ($this->bUseStandartSession) {
|
|
|
|
|
return isset($_SESSION[$sName]) ? $_SESSION[$sName] : null;
|
|
|
|
|
} else {
|
|
|
|
|
return isset($this->aData[$sName]) ? $this->aData[$sName] : null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Записывает значение в сессию
|
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @param string $sName Имя параметра
|
|
|
|
|
* @param mixed $data Данные
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*/
|
|
|
|
|
public function Set($sName,$data) {
|
|
|
|
|
if ($this->bUseStandartSession) {
|
|
|
|
|
$_SESSION[$sName]=$data;
|
|
|
|
|
} else {
|
|
|
|
|
$this->aData[$sName]=$data;
|
|
|
|
|
$this->Save();
|
2012-04-27 13:23:02 +03:00
|
|
|
|
}
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Удаляет значение из сессии
|
|
|
|
|
*
|
2012-04-27 13:23:02 +03:00
|
|
|
|
* @param string $sName Имя параметра
|
2008-09-21 09:36:57 +03:00
|
|
|
|
*/
|
|
|
|
|
public function Drop($sName) {
|
|
|
|
|
if ($this->bUseStandartSession) {
|
|
|
|
|
unset($_SESSION[$sName]);
|
|
|
|
|
} else {
|
|
|
|
|
unset($this->aData[$sName]);
|
|
|
|
|
$this->Save();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Получает разом все данные сессии
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public function GetData() {
|
|
|
|
|
if ($this->bUseStandartSession) {
|
|
|
|
|
return $_SESSION;
|
|
|
|
|
} else {
|
|
|
|
|
return $this->aData;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Завершает сессию, дропая все данные
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public function DropSession() {
|
|
|
|
|
if ($this->bUseStandartSession) {
|
|
|
|
|
unset($_SESSION);
|
|
|
|
|
session_destroy();
|
|
|
|
|
} else {
|
|
|
|
|
unset($this->sId);
|
|
|
|
|
unset($this->aData);
|
2009-08-19 17:53:16 +03:00
|
|
|
|
setcookie(
|
|
|
|
|
Config::Get('sys.session.name'),
|
|
|
|
|
'',1,
|
|
|
|
|
Config::Get('sys.session.path'),
|
|
|
|
|
Config::Get('sys.session.host')
|
|
|
|
|
);
|
2008-09-21 09:36:57 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
?>
|