Page MenuHomeIn-Portal Phabricator

in-portal
No OneTemporary

File Metadata

Created
Thu, Jul 3, 7:39 PM

in-portal

Index: branches/unlabeled/unlabeled-1.55.2/core/kernel/session/session.php
===================================================================
--- branches/unlabeled/unlabeled-1.55.2/core/kernel/session/session.php (nonexistent)
+++ branches/unlabeled/unlabeled-1.55.2/core/kernel/session/session.php (revision 7657)
@@ -0,0 +1,865 @@
+<?php
+
+/*
+
+The session works the following way:
+
+1. When a visitor loads a page from the site the script checks if cookies_on varibale has been passed to it as a cookie.
+2. If it has been passed, the script tries to get Session ID (SID) from the request:
+3. Depending on session mode the script is getting SID differently.
+ The following modes are available:
+
+ smAUTO - Automatic mode: if cookies are on at the client side, the script relays only on cookies and
+ ignore all other methods of passing SID.
+ If cookies are off at the client side, the script relays on SID passed through query string
+ and referal passed by the client. THIS METHOD IS NOT 100% SECURE, as long as attacker may
+ get SID and substitude referal to gain access to user' session. One of the faults of this method
+ is that the session is only created when the visitor clicks the first link on the site, so
+ there is NO session at the first load of the page. (Actually there is a session, but it gets lost
+ after the first click because we do not use SID in query string while we are not sure if we need it)
+
+ smCOOKIES_ONLY - Cookies only: in this mode the script relays solely on cookies passed from the browser
+ and ignores all other methods. In this mode there is no way to use sessions for clients
+ without cookies support or cookies support disabled. The cookies are stored with the
+ full domain name and path to base-directory of script installation.
+
+ smGET_ONLY - GET only: the script will not set any cookies and will use only SID passed in
+ query string using GET, it will also check referal. The script will set SID at the
+ first load of the page
+
+ smCOOKIES_AND_GET - Combined mode: the script will use both cookies and GET right from the start. If client has
+ cookies enabled, the script will check SID stored in cookie and passed in query string, and will
+ use this SID only if both cookie and query string matches. However if cookies are disabled on the
+ client side, the script will work the same way as in GET_ONLY mode.
+
+4. After the script has the SID it tries to load it from the Storage (default is database)
+5. If such SID is found in the database, the script checks its expiration time. If session is not expired, it updates
+ its expiration, and resend the cookie (if applicable to session mode)
+6. Then the script loads all the data (session variables) pertaining to the SID.
+
+
+
+Usage:
+
+$session =& new Session(smAUTO); //smAUTO is default, you could just leave the brackets empty, or provide another mode
+
+$session->SetCookieDomain('my.domain.com');
+$session->SetCookiePath('/myscript');
+$session->SetCookieName('my_sid_cookie');
+$session->SetGETName('sid');
+$session->InitSession();
+
+...
+
+//link output:
+
+echo "<a href='index.php?'". ( $session->NeedQueryString() ? 'sid='.$session->SID : '' ) .">My Link</a>";
+
+*/
+
+//Implements session storage in the database
+class SessionStorage extends kDBBase {
+
+ var $Expiration;
+ var $SessionTimeout=0;
+
+ var $DirectVars = Array();
+ var $ChangedDirectVars = Array();
+
+ var $PersistentVars = Array ();
+
+ var $OriginalData=Array();
+
+ var $TimestampField;
+ var $SessionDataTable;
+ var $DataValueField;
+ var $DataVarField;
+
+ function Init($prefix,$special)
+ {
+ parent::Init($prefix,$special);
+ $this->setTableName('sessions');
+ $this->setIDField('sid');
+ $this->TimestampField = 'expire';
+ $this->SessionDataTable = 'SessionData';
+ $this->DataValueField = 'value';
+ $this->DataVarField = 'var';
+ }
+
+ function setSessionTimeout($new_timeout)
+ {
+ $this->SessionTimeout = $new_timeout;
+ }
+
+ function StoreSession(&$session, $additional_fields = Array())
+ {
+ $fields_hash = Array (
+ $this->IDField => $session->SID,
+ $this->TimestampField => $session->Expiration
+ );
+
+ $this->Conn->doInsert($fields_hash, $this->TableName);
+
+ foreach ($additional_fields as $field_name => $field_value) {
+ $this->SetField($session, $field_name, $field_value);
+ }
+ }
+
+ function DeleteSession(&$session)
+ {
+ $query = ' DELETE FROM '.$this->TableName.' WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->SID);
+ $this->Conn->Query($query);
+
+ $query = ' DELETE FROM '.$this->SessionDataTable.' WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->SID);
+ $this->Conn->Query($query);
+
+ $this->OriginalData = Array();
+ }
+
+ function UpdateSession(&$session, $timeout=0)
+ {
+ $this->SetField($session, $this->TimestampField, $session->Expiration);
+ $query = ' UPDATE '.$this->TableName.' SET '.$this->TimestampField.' = '.$session->Expiration.' WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->SID);
+ $this->Conn->Query($query);
+ }
+
+ function LocateSession($sid)
+ {
+ $query = ' SELECT * FROM '.$this->TableName.' WHERE '.$this->IDField.' = '.$this->Conn->qstr($sid);
+ $result = $this->Conn->GetRow($query);
+
+ if($result===false) return false;
+
+ $this->DirectVars = $result;
+
+ $this->Expiration = $result[$this->TimestampField];
+ return true;
+ }
+
+ function GetExpiration()
+ {
+ return $this->Expiration;
+ }
+
+ function LoadData(&$session)
+ {
+ $query = 'SELECT '.$this->DataValueField.','.$this->DataVarField.' FROM '.$this->SessionDataTable.' WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->SID);
+
+ $this->OriginalData = $this->Conn->GetCol($query, $this->DataVarField);
+ return $this->OriginalData;
+ }
+
+ /**
+ * Enter description here...
+ *
+ * @param Session $session
+ * @param string $var_name
+ * @param mixed $default
+ */
+ function GetField(&$session, $var_name, $default = false)
+ {
+ return isset($this->DirectVars[$var_name]) ? $this->DirectVars[$var_name] : $default;
+ //return $this->Conn->GetOne('SELECT '.$var_name.' FROM '.$this->TableName.' WHERE `'.$this->IDField.'` = '.$this->Conn->qstr($session->GetID()) );
+ }
+
+ function SetField(&$session, $var_name, $value)
+ {
+ $value_changed = !isset($this->DirectVars[$var_name]) || ($this->DirectVars[$var_name] != $value);
+ if ($value_changed) {
+ $this->DirectVars[$var_name] = $value;
+ $this->ChangedDirectVars[] = $var_name;
+ $this->ChangedDirectVars = array_unique($this->ChangedDirectVars);
+ }
+ //return $this->Conn->Query('UPDATE '.$this->TableName.' SET '.$var_name.' = '.$this->Conn->qstr($value).' WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->GetID()) );
+ }
+
+ function SaveData(&$session)
+ {
+ if(!$session->SID) return false; // can't save without sid
+
+ $ses_data = $session->Data->GetParams();
+
+ $replace = '';
+ foreach ($ses_data as $key => $value)
+ {
+ if ( isset($this->OriginalData[$key]) && $this->OriginalData[$key] == $value)
+ {
+ continue; //skip unchanged session data
+ }
+ else
+ {
+ $replace .= sprintf("(%s, %s, %s),",
+ $this->Conn->qstr($session->SID),
+ $this->Conn->qstr($key),
+ $this->Conn->qstr($value));
+ }
+ }
+ $replace = rtrim($replace, ',');
+ if ($replace != '') {
+ $query = ' REPLACE INTO '.$this->SessionDataTable. ' ('.$this->IDField.', '.$this->DataVarField.', '.$this->DataValueField.') VALUES '.$replace;
+ $this->Conn->Query($query);
+ }
+
+ if ($this->ChangedDirectVars) {
+ $changes = array();
+ foreach ($this->ChangedDirectVars as $var) {
+ $changes[] = $var.' = '.$this->Conn->qstr($this->DirectVars[$var]);
+ }
+ $query = 'UPDATE '.$this->TableName.' SET '.implode(',', $changes).' WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->GetID());
+ $this->Conn->Query($query);
+ }
+ }
+
+ function RemoveFromData(&$session, $var)
+ {
+ $query = 'DELETE FROM '.$this->SessionDataTable.' WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->SID).
+ ' AND '.$this->DataVarField.' = '.$this->Conn->qstr($var);
+ $this->Conn->Query($query);
+ unset($this->OriginalData[$var]);
+ }
+
+ function GetFromData(&$session, $var)
+ {
+ return getArrayValue($this->OriginalData, $var);
+ }
+
+ function GetExpiredSIDs()
+ {
+ $query = ' SELECT '.$this->IDField.' FROM '.$this->TableName.' WHERE '.$this->TimestampField.' > '.adodb_mktime();
+ return $this->Conn->GetCol($query);
+ }
+
+ function DeleteExpired()
+ {
+ $expired_sids = $this->GetExpiredSIDs();
+ if ($expired_sids) {
+ $where_clause=' WHERE '.$this->IDField.' IN ("'.implode('","',$expired_sids).'")';
+ $sql = 'DELETE FROM '.$this->SessionDataTable.$where_clause;
+ $this->Conn->Query($sql);
+
+ $sql = 'DELETE FROM '.$this->TableName.$where_clause;
+ $this->Conn->Query($sql);
+
+ // delete debugger ouputs left of expired sessions
+ foreach ($expired_sids as $expired_sid) {
+ $debug_file = KERNEL_PATH.'/../cache/debug_@'.$expired_sid.'@.txt';
+ if (file_exists($debug_file)) {
+ @unlink($debug_file);
+ }
+ }
+ }
+ return $expired_sids;
+ }
+
+ function LoadPersistentVars(&$session)
+ {
+ $user_id = $this->Application->RecallVar('user_id');
+ if ($user_id != -2) {
+ // root & normal users
+ $sql = 'SELECT VariableValue, VariableName
+ FROM '.TABLE_PREFIX.'PersistantSessionData
+ WHERE PortalUserId = '.$user_id;
+ $this->PersistentVars = $this->Conn->GetCol($sql, 'VariableName');
+ }
+ else {
+ $this->PersistentVars = Array ();
+ }
+ }
+
+ function StorePersistentVar(&$session, $var_name, $var_value)
+ {
+ $this->PersistentVars[$var_name] = $var_value;
+
+ $replace_hash = Array (
+ 'PortalUserId' => $this->Application->RecallVar('user_id'),
+ 'VariableName' => $var_name,
+ 'VariableValue' => $var_value
+ );
+ $this->Conn->doInsert($replace_hash, TABLE_PREFIX.'PersistantSessionData', 'REPLACE');
+
+ }
+
+ function RecallPersistentVar(&$session, $var_name, $default = false)
+ {
+ return isset($this->PersistentVars[$var_name]) ? $this->PersistentVars[$var_name] : $default;
+ }
+
+ function RemovePersistentVar(&$session, $var_name)
+ {
+ unset($this->PersistentVars[$var_name]);
+
+ $user_id = $this->Application->RecallVar('user_id');
+
+ if ($user_id != -2) {
+ $sql = 'DELETE FROM '.TABLE_PREFIX.'PersistantSessionData
+ WHERE PortalUserId = '.$user_id.' AND VariableName = '.$this->Conn->qstr($var_name);
+ $this->Conn->Query($sql);
+ }
+ }
+}
+
+define('smAUTO', 1);
+define('smCOOKIES_ONLY', 2);
+define('smGET_ONLY', 3);
+define('smCOOKIES_AND_GET', 4);
+
+class Session extends kBase {
+ var $Checkers;
+
+ var $Mode;
+ var $OriginalMode = null;
+ var $GETName = 'sid';
+
+ var $CookiesEnabled = true;
+ var $CookieName = 'sid';
+ var $CookieDomain;
+ var $CookiePath;
+ var $CookieSecure = 0;
+
+ var $SessionTimeout = 3600;
+ var $Expiration;
+
+ var $SID;
+
+ /**
+ * Enter description here...
+ *
+ * @var SessionStorage
+ */
+ var $Storage;
+
+ var $CachedNeedQueryString = null;
+
+ var $Data;
+
+
+ function Session($mode=smAUTO)
+ {
+ parent::kBase();
+ $this->SetMode($mode);
+ }
+
+ function SetMode($mode)
+ {
+ $this->Mode = $mode;
+ $this->CachedNeedQueryString = null;
+ $this->CachedSID = null;
+ }
+
+ function SetCookiePath($path)
+ {
+ $this->CookiePath = $path;
+ }
+
+ function SetCookieDomain($domain)
+ {
+ $this->CookieDomain = '.'.ltrim($domain, '.');
+ }
+
+ function SetGETName($get_name)
+ {
+ $this->GETName = $get_name;
+ }
+
+ function SetCookieName($cookie_name)
+ {
+ $this->CookieName = $cookie_name;
+ }
+
+ function InitStorage()
+ {
+ $this->Storage =& $this->Application->recallObject('SessionStorage');
+ $this->Storage->setSessionTimeout($this->SessionTimeout);
+ }
+
+ function Init($prefix,$special)
+ {
+ parent::Init($prefix,$special);
+
+ $this->CheckIfCookiesAreOn();
+ if ($this->CookiesEnabled) $_COOKIE['cookies_on'] = 1;
+
+ $this->Checkers = Array();
+ $this->InitStorage();
+ $this->Data =& new Params();
+
+ $tmp_sid = $this->GetPassedSIDValue();
+
+ $check = $this->Check();
+ if( !(defined('IS_INSTALL') && IS_INSTALL) )
+ {
+ $expired_sids = $this->DeleteExpired();
+ if( ( $expired_sids && in_array($tmp_sid,$expired_sids) ) || ( $tmp_sid && !$check ) )
+ {
+ $this->SetSession();
+ $this->Application->HandleEvent($event, 'u:OnSessionExpire');
+ }
+ }
+
+ if ($check) {
+ $this->SID = $this->GetPassedSIDValue();
+ $this->Refresh();
+ $this->LoadData();
+ }
+ else {
+ $this->SetSession();
+ }
+
+ if (!is_null($this->OriginalMode)) $this->SetMode($this->OriginalMode);
+ }
+
+ function IsHTTPSRedirect()
+ {
+ $http_referer = getArrayValue($_SERVER, 'HTTP_REFERER');
+ return (
+ ( PROTOCOL == 'https://' && preg_match('#http:\/\/#', $http_referer) )
+ ||
+ ( PROTOCOL == 'http://' && preg_match('#https:\/\/#', $http_referer) )
+ );
+ }
+
+ function CheckReferer($for_cookies=0)
+ {
+ if (!$for_cookies) {
+ if ( !$this->Application->ConfigValue('SessionReferrerCheck') || $_SERVER['REQUEST_METHOD'] != 'POST') {
+ return true;
+ }
+ }
+ $path = preg_replace('/admin[\/]{0,1}$/', '', $this->CookiePath); // removing /admin for compatability with in-portal (in-link/admin/add_link.php)
+ $reg = '#^'.preg_quote(PROTOCOL.ltrim($this->CookieDomain, '.').$path).'#';
+ return preg_match($reg, getArrayValue($_SERVER, 'HTTP_REFERER') ) || (defined('IS_POPUP') && IS_POPUP);
+ }
+
+ /*function CheckDuplicateCookies()
+ {
+ if (isset($_SERVER['HTTP_COOKIE'])) {
+ $cookie_str = $_SERVER['HTTP_COOKIE'];
+ $cookies = explode('; ', $cookie_str);
+ $all_cookies = array();
+ foreach ($cookies as $cookie) {
+ list($name, $value) = explode('=', $cookie);
+ if (isset($all_cookies[$name])) {
+ //double cookie name!!!
+ $this->RemoveCookie($name);
+ }
+ else $all_cookies[$name] = $value;
+ }
+ }
+ }
+
+ function RemoveCookie($name)
+ {
+ $path = $_SERVER['PHP_SELF'];
+ $path_parts = explode('/', $path);
+ $cur_path = '';
+ setcookie($name, false, null, $cur_path);
+ foreach ($path_parts as $part) {
+ $cur_path .= $part;
+ setcookie($name, false, null, $cur_path);
+ $cur_path .= '/';
+ setcookie($name, false, null, $cur_path);
+ }
+ }*/
+
+ function CheckIfCookiesAreOn()
+ {
+// $this->CheckDuplicateCookies();
+ if ($this->Mode == smGET_ONLY)
+ {
+ //we don't need to bother checking if we would not use it
+ $this->CookiesEnabled = false;
+ return;
+ }
+ $http_query =& $this->Application->recallObject('HTTPQuery');
+ $cookies_on = isset($http_query->Cookie['cookies_on']); // not good here
+
+ $get_sid = getArrayValue($http_query->Get, $this->GETName);
+ if ($this->IsHTTPSRedirect() && $get_sid) { //Redirect from http to https on different domain
+ $this->OriginalMode = $this->Mode;
+ $this->SetMode(smGET_ONLY);
+ }
+
+ if (!$cookies_on || $this->IsHTTPSRedirect()) {
+ //If referer is our server, but we don't have our cookies_on, it's definetly off
+ $is_install = defined('IS_INSTALL') && IS_INSTALL;
+ if (!$is_install && $this->CheckReferer(1) && !$this->Application->GetVar('admin') && !$this->IsHTTPSRedirect()) {
+ $this->CookiesEnabled = false;
+ }
+ else {
+ //Otherwise we still suppose cookies are on, because may be it's the first time user visits the site
+ //So we send cookies on to get it next time (when referal will tell us if they are realy off
+ $this->SetCookie('cookies_on', 1, adodb_mktime() + 31104000); //one year should be enough
+ }
+ }
+ else
+ $this->CookiesEnabled = true;
+ return $this->CookiesEnabled;
+ }
+
+ /**
+ * Sets cookie for current site using path and domain
+ *
+ * @param string $name
+ * @param mixed $value
+ * @param int $expires
+ */
+ function SetCookie($name, $value, $expires = null)
+ {
+ setcookie($name, $value, $expires, $this->CookiePath, $this->CookieDomain, $this->CookieSecure);
+ }
+
+ function Check()
+ {
+ // we should check referer if cookies are disabled, and in combined mode
+ // auto mode would detect cookies, get only mode would turn it off - so we would get here
+ // and we don't care about referal in cookies only mode
+
+ if ( $this->Mode != smCOOKIES_ONLY && (!$this->CookiesEnabled || $this->Mode == smCOOKIES_AND_GET) ) {
+ if (!$this->CheckReferer())
+ return false;
+ }
+
+ $sid = $this->GetPassedSIDValue();
+
+ if (empty($sid)) return false;
+
+ //try to load session by sid, if everything is fine
+ $result = $this->LoadSession($sid);
+
+ return $result;
+ }
+
+ function LoadSession($sid)
+ {
+ if( $this->Storage->LocateSession($sid) ) {
+ //if we have session with such SID - get its expiration
+ $this->Expiration = $this->Storage->GetExpiration();
+
+ //If session has expired
+ if ($this->Expiration < adodb_mktime()) return false;
+
+ //Otherwise it's ok
+ return true;
+ }
+ else //fake or deleted due to expiration SID
+ return false;
+ }
+
+ function GetPassedSIDValue($use_cache = 1)
+ {
+ if (!empty($this->CachedSID) && $use_cache) return $this->CachedSID;
+ $http_query =& $this->Application->recallObject('HTTPQuery');
+ $get_sid = getArrayValue($http_query->Get, $this->GETName);
+
+ if ($this->Application->GetVar('admin') == 1 && $get_sid) {
+ $sid = $get_sid;
+ }
+ else {
+ switch ($this->Mode) {
+ case smAUTO:
+ //Cookies has the priority - we ignore everything else
+ $sid = $this->CookiesEnabled ? $this->GetSessionCookie() : $get_sid;
+ break;
+ case smCOOKIES_ONLY:
+ $sid = $this->GetSessionCookie();
+ break;
+ case smGET_ONLY:
+ $sid = $get_sid;
+ break;
+ case smCOOKIES_AND_GET:
+ $cookie_sid = $this->GetSessionCookie();
+ //both sids should match if cookies are enabled
+ if (!$this->CookiesEnabled || ($cookie_sid == $get_sid))
+ {
+ $sid = $get_sid; //we use get here just in case cookies are disabled
+ }
+ else
+ {
+ $sid = '';
+ }
+ break;
+ }
+ }
+
+
+ $this->CachedSID = $sid;
+ return $this->CachedSID;
+ }
+
+ /**
+ * Returns session id
+ *
+ * @return int
+ * @access public
+ */
+ function GetID()
+ {
+ return $this->SID;
+ }
+
+ /**
+ * Generates new session id
+ *
+ * @return int
+ * @access private
+ */
+ function GenerateSID()
+ {
+ list($usec, $sec) = explode(" ",microtime());
+
+ $sid_part_1 = substr($usec, 4, 4);
+ $sid_part_2 = mt_rand(1,9);
+ $sid_part_3 = substr($sec, 6, 4);
+ $digit_one = substr($sid_part_1, 0, 1);
+ if ($digit_one == 0) {
+ $digit_one = mt_rand(1,9);
+ $sid_part_1 = ereg_replace("^0","",$sid_part_1);
+ $sid_part_1=$digit_one.$sid_part_1;
+ }
+ $this->setSID($sid_part_1.$sid_part_2.$sid_part_3);
+ return $this->SID;
+ }
+
+ /**
+ * Set's new session id
+ *
+ * @param int $new_sid
+ * @access private
+ */
+ function setSID($new_sid)
+ {
+ $this->SID=$new_sid;
+ $this->Application->SetVar($this->GETName,$new_sid);
+ }
+
+ function SetSession()
+ {
+ $this->GenerateSID();
+ $this->Expiration = adodb_mktime() + $this->SessionTimeout;
+ switch ($this->Mode) {
+ case smAUTO:
+ if ($this->CookiesEnabled) {
+ $this->SetSessionCookie();
+ }
+ break;
+ case smGET_ONLY:
+ break;
+ case smCOOKIES_ONLY:
+ case smCOOKIES_AND_GET:
+ $this->SetSessionCookie();
+ break;
+ }
+ $this->Storage->StoreSession($this);
+ }
+
+ /**
+ * Returns SID from cookie
+ *
+ * @return int
+ */
+ function GetSessionCookie()
+ {
+ return isset($this->Application->HttpQuery->Cookie[$this->CookieName]) ? $this->Application->HttpQuery->Cookie[$this->CookieName] : false;
+ }
+
+ /**
+ * Updates SID in cookie with new value
+ *
+ */
+ function SetSessionCookie()
+ {
+ $this->SetCookie($this->CookieName, $this->SID, $this->Expiration);
+ $_COOKIE[$this->CookieName] = $this->SID; // for compatibility with in-portal
+ }
+
+ /**
+ * Refreshes session expiration time
+ *
+ * @access private
+ */
+ function Refresh()
+ {
+ if ($this->CookiesEnabled) $this->SetSessionCookie(); //we need to refresh the cookie
+ $this->Storage->UpdateSession($this);
+ }
+
+ function Destroy()
+ {
+ $this->Storage->DeleteSession($this);
+ $this->Data =& new Params();
+ $this->SID = '';
+ if ($this->CookiesEnabled) $this->SetSessionCookie(); //will remove the cookie due to value (sid) is empty
+ $this->SetSession(); //will create a new session
+ }
+
+ function NeedQueryString($use_cache = 1)
+ {
+ if ($this->CachedNeedQueryString != null && $use_cache) return $this->CachedNeedQueryString;
+
+ $result = false;
+ switch ($this->Mode)
+ {
+ case smAUTO:
+ if (!$this->CookiesEnabled) $result = true;
+ break;
+ /*case smCOOKIES_ONLY:
+ break;*/
+ case smGET_ONLY:
+ case smCOOKIES_AND_GET:
+ $result = true;
+ break;
+ }
+ $this->CachedNeedQueryString = $result;
+ return $result;
+ }
+
+ function LoadData()
+ {
+ $this->Data->AddParams($this->Storage->LoadData($this));
+ }
+
+ function PrintSession($comment='')
+ {
+ if($this->Application->isDebugMode() && constOn('DBG_SHOW_SESSIONDATA')) {
+ // dump session data
+ $this->Application->Debugger->appendHTML('SessionStorage ('.$comment.'):');
+ $session_data = $this->Data->GetParams();
+ ksort($session_data);
+ foreach ($session_data as $session_key => $session_value) {
+ if (IsSerialized($session_value)) {
+ $session_data[$session_key] = unserialize($session_value);
+ }
+ }
+ $this->Application->Debugger->dumpVars($session_data);
+ }
+ if ($this->Application->isDebugMode() && constOn('DBG_SHOW_PERSISTENTDATA')) {
+ // dump persistent session data
+ if ($this->Storage->PersistentVars) {
+ $this->Application->Debugger->appendHTML('Persistant Session:');
+ $session_data = $this->Storage->PersistentVars;
+ ksort($session_data);
+ foreach ($session_data as $session_key => $session_value) {
+ if (IsSerialized($session_value)) {
+ $session_data[$session_key] = unserialize($session_value);
+ }
+ }
+ $this->Application->Debugger->dumpVars($session_data);
+ }
+ }
+ }
+
+ function SaveData()
+ {
+ if (!$this->Application->GetVar('skip_last_template') && $this->Application->GetVar('ajax') != 'yes') {
+ $this->SaveLastTemplate( $this->Application->GetVar('t') );
+ }
+
+ $this->PrintSession('after save');
+ $this->Storage->SaveData($this);
+ }
+
+ function SaveLastTemplate($t)
+ {
+ // save last_template
+ $wid = $this->Application->GetVar('m_wid');
+
+ $last_env = $this->getLastTemplateENV($t, Array('m_opener' => 'u'));
+ $last_template = basename($_SERVER['PHP_SELF']).'|'.substr($last_env, strlen(ENV_VAR_NAME) + 1);
+ $this->StoreVar(rtrim('last_template_'.$wid, '_'), $last_template);
+
+ $last_env = $this->getLastTemplateENV($t, Array());
+ $last_template = basename($_SERVER['PHP_SELF']).'|'.substr($last_env, strlen(ENV_VAR_NAME) + 1);
+ $this->StoreVar(rtrim('last_template_popup_'.$wid, '_'), $last_template);
+
+ // save other last... variables for mistical purposes (customizations may be)
+ $this->StoreVar('last_url', $_SERVER['REQUEST_URI']); // needed by ord:StoreContinueShoppingLink
+ $this->StoreVar('last_env', substr($last_env, strlen(ENV_VAR_NAME)+1));
+ }
+
+ function getLastTemplateENV($t, $params)
+ {
+ $params['__URLENCODE__'] = 1;
+ return $this->Application->BuildEnv($t, $params, 'all');
+ }
+
+ function StoreVar($name, $value)
+ {
+ $this->Data->Set($name, $value);
+ }
+
+ function StorePersistentVar($name, $value)
+ {
+ $this->Storage->StorePersistentVar($this, $name, $value);
+ }
+
+ function LoadPersistentVars()
+ {
+ $this->Storage->LoadPersistentVars($this);
+ }
+
+ function StoreVarDefault($name, $value)
+ {
+ $tmp = $this->RecallVar($name);
+ if($tmp === false || $tmp == '')
+ {
+ $this->StoreVar($name, $value);
+ }
+ }
+
+ function RecallVar($name, $default = false)
+ {
+ $ret = $this->Data->Get($name);
+ return ($ret === false) ? $default : $ret;
+ }
+
+ function RecallPersistentVar($name, $default = false)
+ {
+ return $this->Storage->RecallPersistentVar($this, $name, $default);
+ }
+
+
+ function RemoveVar($name)
+ {
+ $this->Storage->RemoveFromData($this, $name);
+ $this->Data->Remove($name);
+ }
+
+ function RemovePersistentVar($name)
+ {
+ return $this->Storage->RemovePersistentVar($this, $name);
+ }
+
+ /**
+ * Ignores session varible value set before
+ *
+ * @param string $name
+ */
+ function RestoreVar($name)
+ {
+ return $this->StoreVar($name, $this->Storage->GetFromData($this, $name));
+ }
+
+ function GetField($var_name, $default = false)
+ {
+ return $this->Storage->GetField($this, $var_name, $default);
+ }
+
+ function SetField($var_name, $value)
+ {
+ $this->Storage->SetField($this, $var_name, $value);
+ }
+
+ /**
+ * Deletes expired sessions
+ *
+ * @return Array expired sids if any
+ * @access private
+ */
+ function DeleteExpired()
+ {
+ return $this->Storage->DeleteExpired();
+ }
+
+}
+
+?>
\ No newline at end of file
Property changes on: branches/unlabeled/unlabeled-1.55.2/core/kernel/session/session.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.55
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: branches/unlabeled/unlabeled-1.55.2/core/units/categories/categories_config.php
===================================================================
--- branches/unlabeled/unlabeled-1.55.2/core/units/categories/categories_config.php (nonexistent)
+++ branches/unlabeled/unlabeled-1.55.2/core/units/categories/categories_config.php (revision 7657)
@@ -0,0 +1,278 @@
+<?php
+
+$config = Array(
+ 'Prefix' => 'c',
+ 'ItemClass' => Array('class'=>'CategoriesItem','file'=>'categories_item.php','build_event'=>'OnItemBuild'),
+ 'ListClass' => Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
+ 'EventHandlerClass' => Array('class'=>'CategoriesEventHandler','file'=>'categories_event_handler.php','build_event'=>'OnBuild'),
+ 'TagProcessorClass' => Array('class'=>'CategoriesTagProcessor','file'=>'categories_tag_processor.php','build_event'=>'OnBuild'),
+
+ 'RegisterClasses' => Array(
+ Array('pseudo' => 'kPermCacheUpdater','class' => 'kPermCacheUpdater', 'file' => 'cache_updater.php','build_event'=>''),
+ ),
+
+ 'AutoLoad' => true,
+ 'CatalogItem' => true,
+ 'AdminTemplatePath' => 'categories',
+ 'AdminTemplatePrefix' => 'categories_',
+
+ 'QueryString' => Array(
+ 1 => 'id',
+ 2 => 'page',
+ 3 => 'event',
+ 4 => 'mode',
+ ),
+ 'AggregateTags' => Array(
+ Array(
+ 'AggregateTo' => 'm',
+ 'AggregatedTagName' => 'CategoryLink',
+ 'LocalTagName' => 'CategoryLink',
+ ),
+ ),
+ 'IDField' => 'CategoryId',
+
+ 'StatusField' => Array('Status'),
+
+ 'TitleField' => 'Name', // field, used in bluebar when editing existing item
+ 'TitlePhrase' => 'la_Text_Category',
+ 'ItemType' => 1, // used for custom fields only
+
+ 'StatisticsInfo' => Array(
+ 'pending' => Array(
+ 'icon' => 'icon16_cat_pending.gif',
+ 'label' => 'la_tab_Categories',
+ 'js_url' => '#url#',
+ 'url' => Array('t' => 'in-portal/advanced_view', 'SetTab' => 'c', 'pass' => 'm,c.showall', 'c.showall_event' => 'OnSetFilterPattern', 'c.showall_filters' => 'show_active=0,show_pending=1,show_disabled=0,show_new=1,show_pick=1'),
+ 'status' => STATUS_PENDING,
+ ),
+ ),
+
+ 'TableName' => TABLE_PREFIX.'Category',
+
+ 'ViewMenuPhrase' => 'la_text_Categories',
+
+ 'TitlePresets' => Array(
+ 'default' => Array( 'new_status_labels' => Array('c' => '!la_title_Adding_Category!'),
+ 'edit_status_labels' => Array('c' => '!la_title_Editing_Category!'),
+ 'new_titlefield' => Array('c' => '!la_title_New_Category!'),
+ ),
+ 'category_list' => Array('prefixes' => Array('c_List'), 'format' => "!la_title_Categories! (#c_recordcount#)"),
+
+ 'catalog' => Array('prefixes' => Array('c_List'), 'format' => "!la_title_Categories! (<span id='c_item_count'>#c_recordcount#</span>)"),
+
+ 'advanced_view' => Array('prefixes' => Array('c_List'), 'format' => "!la_title_AdvancedView!"),
+
+ 'categories_edit' => Array('prefixes' => Array('c'), 'format' => "#c_status# '#c_titlefield#' - !la_title_General!"),
+ 'categories_properties' => Array('prefixes' => Array('c'), 'format' => "#c_status# '#c_titlefield#' - !la_title_Properties!"),
+ 'categories_relations' => Array('prefixes' => Array('c'), 'format' => "#c_status# '#c_titlefield#' - !la_title_Relations!"),
+ 'categories_images' => Array('prefixes' => Array('c'), 'format' => "#c_status# '#c_titlefield#' - !la_title_Images!"),
+ 'categories_permissions'=> Array('prefixes' => Array('c', 'g_List'), 'format' => "#c_status# '#c_titlefield#' - !la_title_Permissions!"),
+ 'categories_custom' => Array('prefixes' => Array('c'), 'format' => "#c_status# '#c_titlefield#' - !la_title_Custom!"),
+
+ 'categories_update' => Array('prefixes' => Array(), 'format' => "!la_title_UpdatingCategories!"),
+
+ 'images_edit' => Array( 'prefixes' => Array('c', 'c-img'),
+ 'new_status_labels' => Array('c-img'=>'!la_title_Adding_Image!'),
+ 'edit_status_labels' => Array('c-img'=>'!la_title_Editing_Image!'),
+ 'new_titlefield' => Array('c-img'=>'!la_title_New_Image!'),
+ 'format' => "#c_status# '#c_titlefield#' - #c-img_status# '#c-img_titlefield#'",
+ ),
+
+ 'relations_edit' => Array( 'prefixes' => Array('c', 'c-rel'),
+ 'new_status_labels' => Array('c-rel'=>"!la_title_Adding_Relationship! '!la_title_New_Relationship!'"),
+ 'edit_status_labels' => Array('c-rel'=>'!la_title_Editing_Relationship!'),
+ 'format' => "#c_status# '#c_titlefield#' - #c-rel_status#",
+ ),
+
+ 'tree_site' => Array('format' => '!la_selecting_categories!'),
+ ),
+
+ 'PermItemPrefix' => 'CATEGORY',
+
+ 'PermSection' => Array('main' => 'CATEGORY:in-portal:categories', /*'search' => 'in-portal:configuration_search',*/ 'email' => 'in-portal:configuration_email', 'custom' => 'in-portal:configuration_custom'),
+
+
+ /* 'Sections' => Array(
+ // "Structure & Data" section
+ 'in-portal:site' => Array(
+ 'parent' => 'in-portal:root',
+ 'icon' => 'struct',
+ 'label' => 'la_tab_Site_Structure',
+ 'url' => Array('t' => 'sections_list', 'pass_section' => true, 'pass' => 'm'),
+ 'permissions' => Array('view'),
+ 'priority' => 1,
+ 'type' => stTREE,
+ ),
+
+ 'in-portal:browse' => Array(
+ 'parent' => 'in-portal:site',
+ 'icon' => 'catalog',
+ 'label' => 'la_tab_Browse',
+ 'url' => Array('t' => 'in-portal/catalog', 'pass' => 'm'),
+ 'late_load' => Array('t' => 'in-portal/xml/tree_categories', 'pass' => 'm', 'm_cat_id' => 0),
+ 'onclick' => 'checkCatalog(0)',
+ 'permissions' => Array('view'),
+ 'priority' => 0.1,
+ 'type' => stTREE,
+ ),
+ 'in-portal:advanced_view' => Array(
+ 'parent' => 'in-portal:site',
+ 'icon' => 'advanced_view',
+ 'label' => 'la_tab_AdvancedView',
+ 'url' => Array('t' => 'in-portal/advanced_view', 'pass' => 'm'),
+ 'permissions' => Array('view'),
+ 'priority' => 0.2,
+ 'type' => stTREE,
+ ),
+
+ 'in-portal:reviews' => Array(
+ 'parent' => 'in-portal:site',
+ 'icon' => 'reviews',
+ 'label' => 'la_tab_Reviews',
+ 'url' => Array('index_file' => 'reviews.php', 'pass' => 'm'),
+ 'permissions' => Array('view'),
+ 'priority' => 3,
+ 'type' => stTREE,
+ ),
+
+ 'in-portal:configure_categories' => Array(
+ 'parent' => 'in-portal:site',
+ 'icon' => 'cat_settings',
+ 'label' => 'la_tab_Settings',
+ 'url' => Array('t' => 'config/config_universal', 'pass_section' => true, 'pass' => 'm'),
+ 'permissions' => Array('view', 'edit'),
+ 'priority' => 4,
+ 'type' => stTREE,
+ ),
+
+ 'in-portal:configuration_search' => Array(
+ 'parent' => 'in-portal:site',
+ 'icon' => 'settings_search',
+ 'label' => 'la_tab_ConfigSearch',
+ 'url' => Array('t' => 'in-portal/config/config_search', 'module_key' => 'category', 'pass_section' => true, 'pass' => 'm'),
+ 'permissions' => Array('view', 'edit'),
+ 'priority' => 5,
+ 'type' => stTREE,
+ ),
+
+ 'in-portal:configuration_email' => Array(
+ 'parent' => 'in-portal:site',
+ 'icon' => 'settings_email',
+ 'label' => 'la_tab_ConfigE-mail',
+ 'url' => Array('t' => 'in-portal/config/config_email', 'module' => 'In-Portal:Category', 'pass_section' => true, 'pass' => 'm'),
+ 'permissions' => Array('view', 'edit'),
+ 'priority' => 6,
+ 'type' => stTREE,
+ ),
+
+ 'in-portal:configuration_custom' => Array(
+ 'parent' => 'in-portal:site',
+ 'icon' => 'settings_custom',
+ 'label' => 'la_tab_ConfigCustom',
+ 'url' => Array('t' => 'in-portal/custom_fields/custom_fields_list', 'cf_type' => 1, 'pass_section' => true, 'pass' => 'm,cf'),
+ 'permissions' => Array('view', 'add', 'edit', 'delete'),
+ 'priority' => 7,
+ 'type' => stTREE,
+ ),
+
+ ),*/
+
+ 'FilterMenu' => Array(
+ 'Groups' => Array(
+ Array('mode' => 'AND', 'filters' => Array('show_active','show_pending','show_disabled'), 'type' => WHERE_FILTER),
+ Array('mode' => 'AND', 'filters' => Array('show_new'), 'type' => HAVING_FILTER),
+ Array('mode' => 'AND', 'filters' => Array('show_pick'), 'type' => WHERE_FILTER),
+ ),
+ 'Filters' => Array(
+ 'show_active' => Array('label' =>'la_Active', 'on_sql' => '', 'off_sql' => 'Status != 1' ),
+ 'show_pending' => Array('label' => 'la_Pending', 'on_sql' => '', 'off_sql' => 'Status != 2' ),
+ 'show_disabled' => Array('label' => 'la_Disabled', 'on_sql' => '', 'off_sql' => 'Status != 0' ),
+ 's1' => Array(),
+ 'show_new' => Array('label' => 'la_Text_New', 'on_sql' => '', 'off_sql' => '`IsNew` != 1' ),
+ 'show_pick' => Array('label' => 'la_prompt_EditorsPick', 'on_sql' => '', 'off_sql' => '`EditorsPick` != 1' ),
+ )
+ ),
+
+ 'ListSQLs' => Array( ''=> ' SELECT %1$s.* %2$s
+ FROM %1$s
+ LEFT JOIN '.TABLE_PREFIX.'PermCache ON '.TABLE_PREFIX.'PermCache.CategoryId = %1$s.CategoryId
+ LEFT JOIN '.TABLE_PREFIX.'%3$sCategoryCustomData cust ON %1$s.ResourceId = cust.ResourceId'),
+
+ 'ItemSQLs' => Array( ''=> ' SELECT %1$s.* %2$s
+ FROM %1$s
+ LEFT JOIN '.TABLE_PREFIX.'PermCache ON '.TABLE_PREFIX.'PermCache.CategoryId = %1$s.CategoryId
+ LEFT JOIN '.TABLE_PREFIX.'%3$sCategoryCustomData cust ON %1$s.ResourceId = cust.ResourceId'),
+
+ 'SubItems' => Array('c-rel', 'c-img', 'c-cdata', 'c-perm'),
+
+ 'ListSortings' => Array(
+ '' => Array(
+ 'ForcedSorting' => Array("CurrentSort" => 'asc', 'Priority' => 'desc', 'Name' => 'asc'),
+ 'Sorting' => Array('Name' => 'asc'),
+ )
+ ),
+
+ 'CalculatedFields' => Array(
+ '' => Array(
+ 'CurrentSort' => "REPLACE(ParentPath, CONCAT('|', ".'%1$s'.".CategoryId, '|'), '')",
+ )
+ ),
+
+ 'Fields' => Array
+ (
+ 'CategoryId' => Array('type' => 'int','not_null' => 1,'default' => ''),
+ 'Type' => Array('type' => 'int','not_null' => 1,'default' => 0),
+ 'ParentId' => Array('type' => 'int','not_null' => 1,'default' => 0),
+ 'Name' => Array('type' => 'string', 'formatter' => 'kMultiLanguage', 'not_null' => 1, 'required' => 1, 'default' => ''),
+ 'Filename' => Array('type' => 'string', 'not_null' => 1, 'default' => ''),
+ 'AutomaticFilename' => Array('type' => 'int', 'not_null' => 1, 'default' => 1),
+ 'Description' => Array('type' => 'string', 'formatter' => 'kMultiLanguage', 'not_null' => 1, 'required' => 1, 'default' => ''),
+ 'CreatedOn' => Array('formatter' => 'kDateFormatter', 'default'=>'#NOW#', 'required' => 1, 'not_null' => 1),
+ 'EditorsPick' => Array('type' => 'int', 'not_null' => 1, 'default' => 0),
+ 'Status' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Active', 2 => 'la_Pending', 0 => 'la_Disabled' ), 'use_phrases' => 1, 'not_null' => 1,'default' => 2),
+ 'Pop' => Array('type' => 'int', 'default' => ''),
+ 'Priority' => Array('type' => 'int', 'not_null' => 1, 'default' => ''),
+ 'MetaKeywords' => Array('type' => 'string', 'default' => ''),
+ 'CachedDescendantCatsQty' => Array('type' => 'int', 'default' => ''),
+ 'CachedNavbar' => Array('type' => 'string', 'formatter' => 'kMultiLanguage', 'not_null' => 1, 'default' => ''),
+ 'CreatedById' => Array('type' => 'int', 'formatter' => 'kLEFTFormatter', 'options' => Array(-1 => 'root', -2 => 'Guest'),'left_sql'=>'SELECT %s FROM '.TABLE_PREFIX.'PortalUser WHERE `%s` = \'%s\'', 'left_key_field' => 'PortalUserId', 'left_title_field' => 'Login', 'not_null' => 1,'default' => '0'),
+ 'ResourceId' => Array('type' => 'int', 'default' => ''),
+ 'ParentPath' => Array('type' => 'string', 'not_null' => 1, 'default' => ''),
+ 'NamedParentPath' => Array('type' => 'string', 'not_null' => 1, 'default' => ''),
+ 'MetaDescription' => Array('type' => 'string', 'default' => ''),
+ 'HotItem' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (2 => 'la_Auto', 1 => 'la_Always', 0 => 'la_Never'), 'use_phrases' => 1, 'not_null' => 1, 'default' => 2),
+ 'NewItem' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (2 => 'la_Auto', 1 => 'la_Always', 0 => 'la_Never'), 'use_phrases' => 1, 'not_null' => 1, 'default' => 2),
+ 'PopItem' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (2 => 'la_Auto', 1 => 'la_Always', 0 => 'la_Never'), 'use_phrases' => 1, 'not_null' => 1, 'default' => 2),
+ 'Modified' => Array('type' => 'int', 'formatter' => 'kDateFormatter', 'not_null' => 1,'default' => '#NOW#'),
+ 'ModifiedById' => Array('type' => 'int', 'formatter' => 'kLEFTFormatter', 'options' => Array(-1 => 'root', -2 => 'Guest'),'left_sql'=>'SELECT %s FROM '.TABLE_PREFIX.'PortalUser WHERE `%s` = \'%s\'', 'left_key_field' => 'PortalUserId', 'left_title_field' => 'Login', 'not_null' => 1,'default' => '0'),
+ 'CategoryTemplate' => Array('type' => 'string', 'not_null' => 1, 'default' => ''),
+ 'CachedCategoryTemplate' => Array('type' => 'string', 'not_null' => 1, 'default' => ''),
+ ),
+
+ 'VirtualFields' => Array(
+ 'CurrentSort' => Array('type' => 'string', 'default' => ''),
+ 'IsNew' => Array('type' => 'int', 'default' => 0),
+ ),
+
+ 'Grids' => Array(
+ 'Default' => Array(
+ 'Icons' => Array('default'=>'icon16_cat.gif'),
+ 'Fields' => Array(
+ 'Name' => Array('title' => 'la_col_Name', 'data_block' => 'category_td'),
+ 'Description' => Array('title' => 'la_col_Description'),
+ 'CreatedOn_formatted' => Array('title' => 'la_col_CreatedOn', 'sort_field' => 'CreatedOn'),
+ ),
+
+ ),
+ ),
+
+ 'ConfigMapping' => Array(
+ 'PerPage' => 'Perpage_Category',
+ 'DefaultSorting1Field' => 'Category_Sortfield',
+ 'DefaultSorting2Field' => 'Category_Sortfield2',
+ 'DefaultSorting1Dir' => 'Category_Sortorder',
+ 'DefaultSorting2Dir' => 'Category_Sortorder2',
+ ),
+ );
+
+?>
\ No newline at end of file
Property changes on: branches/unlabeled/unlabeled-1.55.2/core/units/categories/categories_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.55
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property

Event Timeline