1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-05-15 07:18:18 +03:00
ifhub.club/engine/modules/session/Session.class.php
2013-03-21 20:03:00 +07:00

237 lines
6.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*-------------------------------------------------------
*
* 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
*
---------------------------------------------------------
*/
/**
* Модуль для работы с сессиями
* Выступает в качестве врапера для стандартного механизма сессий
*
* @package engine.modules
* @since 1.0
*/
class ModuleSession extends Module {
/**
* ID сессии
*
* @var null|string
*/
protected $sId=null;
/**
* Данные сессии
*
* @var array
*/
protected $aData=array();
/**
* Список user-agent'ов для флеш плеера
* Используется для передачи ID сессии при обращениии к сайту через flash, например, загрузка файлов через flash
*
* @var array
*/
protected $aFlashUserAgent=array(
'Shockwave Flash'
);
/**
* Использовать или нет стандартный механизм сессий
* ВНИМАНИЕ! Не рекомендуется ставить false - т.к. этот режим до конца не протестирован
*
* @var bool
*/
protected $bUseStandartSession=true;
/**
* Инициализация модуля
*
*/
public function Init() {
$this->bUseStandartSession = Config::Get('sys.session.standart');
/**
* Стартуем сессию
*/
$this->Start();
}
/**
* Старт сессии
*
*/
protected function Start() {
if ($this->bUseStandartSession) {
session_name(Config::Get('sys.session.name'));
session_set_cookie_params(
Config::Get('sys.session.timeout'),
Config::Get('sys.session.path'),
Config::Get('sys.session.host')
);
if(!session_id()) {
/**
* Попытка подменить идентификатор имени сессии через куку
*/
if (isset($_COOKIE[Config::Get ('sys.session.name')]) and !is_string($_COOKIE[Config::Get ('sys.session.name')])) {
unset($_COOKIE[Config::Get ('sys.session.name')]);
setcookie(Config::Get ('sys.session.name').'[]','',1,Config::Get('sys.cookie.path'),Config::Get('sys.cookie.host'));
}
/**
* Попытка подменить идентификатор имени сессии в реквесте
*/
$aRequest=array_merge($_GET,$_POST); // Исключаем попадаение $_COOKIE в реквест
if (@ini_get ('session.use_only_cookies') === "0" and isset($aRequest[Config::Get ('sys.session.name')]) and !is_string($aRequest[Config::Get ('sys.session.name')])) {
session_name($this->GenerateId());
}
/**
* Даем возможность флешу задавать id сессии
*/
$sUserAgent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null;
if ($sUserAgent and (in_array($sUserAgent,$this->aFlashUserAgent) or strpos($sUserAgent,"Adobe Flash Player")===0) and is_string(getRequest('SSID')) and preg_match("/^[\w\d]{5,40}$/",getRequest('SSID'))) {
session_id(getRequest('SSID'));
} else {
session_regenerate_id();
}
session_start();
}
} else {
$this->SetId();
$this->ReadData();
}
}
/**
* Устанавливает уникальный идентификатор сессии
*
*/
protected function SetId() {
/**
* Если идентификатор есть в куках то берем его
*/
if (isset($_COOKIE[Config::Get('sys.session.name')])) {
$this->sId=$_COOKIE[Config::Get('sys.session.name')];
} else {
/**
* Иначе создаём новый и записываем его в куку
*/
$this->sId=$this->GenerateId();
setcookie(
Config::Get('sys.session.name'),
$this->sId,time()+Config::Get('sys.session.timeout'),
Config::Get('sys.session.path'),
Config::Get('sys.session.host')
);
}
}
/**
* Получает идентификатор текущей сессии
*
*/
public function GetId() {
if ($this->bUseStandartSession) {
return session_id();
} else {
return $this->sId;
}
}
/**
* Гинерирует уникальный идентификатор
*
* @return string
*/
protected function GenerateId() {
return md5(func_generator().time());
}
/**
* Читает данные сессии в aData
*
*/
protected function ReadData() {
$this->aData=$this->Cache_Get($this->sId);
}
/**
* Сохраняет данные сессии
*
*/
protected function Save() {
$this->Cache_Set($this->aData,$this->sId,array(),Config::Get('sys.session.timeout'));
}
/**
* Получает значение из сессии
*
* @param string $sName Имя параметра
* @return mixed|null
*/
public function Get($sName) {
if ($this->bUseStandartSession) {
return isset($_SESSION[$sName]) ? $_SESSION[$sName] : null;
} else {
return isset($this->aData[$sName]) ? $this->aData[$sName] : null;
}
}
/**
* Записывает значение в сессию
*
* @param string $sName Имя параметра
* @param mixed $data Данные
*/
public function Set($sName,$data) {
if ($this->bUseStandartSession) {
$_SESSION[$sName]=$data;
} else {
$this->aData[$sName]=$data;
$this->Save();
}
}
/**
* Удаляет значение из сессии
*
* @param string $sName Имя параметра
*/
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);
setcookie(
Config::Get('sys.session.name'),
'',1,
Config::Get('sys.session.path'),
Config::Get('sys.session.host')
);
}
}
}
?>