0009948: Refactoring of session management
authorFlávio Gomes da Silva Lisboa <flavio.lisboa@serpro.gov.br>
Wed, 28 May 2014 19:10:24 +0000 (16:10 -0300)
committerPhilipp Schüle <p.schuele@metaways.de>
Wed, 15 Oct 2014 14:42:45 +0000 (16:42 +0200)
 - Created a class to manage session: Tinebase_Session_Abstract
 - Applications coupled with the new class

Change-Id: Icdfede5187184bac65595418e7ebdd95e42dadbb
Reviewed-on: https://gerrit.tine20.org/tine20/2910
Reviewed-by: Lars Kneschke <l.kneschke@metaways.de>
Tested-by: jenkins user
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
33 files changed:
tests/tine20/Felamimail/Controller/AccountTest.php
tests/tine20/Felamimail/Controller/Cache/MessageTest.php
tests/tine20/Tinebase/Frontend/JsonTest.php
tine20/Addressbook/Session.php [new file with mode: 0644]
tine20/Calendar/Frontend/WebDAV/Backend.php
tine20/Felamimail/Controller/Account.php
tine20/Felamimail/Frontend/Json.php
tine20/Felamimail/Model/Account.php
tine20/Felamimail/Session.php [new file with mode: 0644]
tine20/Phone/Frontend/Snom.php
tine20/Phone/Session.php [new file with mode: 0644]
tine20/Setup/Controller.php
tine20/Setup/Core.php
tine20/Setup/Session.php [new file with mode: 0644]
tine20/Tasks/Frontend/WebDAV/Backend.php
tine20/Tinebase/Acl/Roles.php
tine20/Tinebase/Auth.php
tine20/Tinebase/Auth/CredentialCache.php
tine20/Tinebase/Backend/Sql/Command/Pgsql.php
tine20/Tinebase/Controller.php
tine20/Tinebase/Core.php
tine20/Tinebase/Frontend/Http.php
tine20/Tinebase/Frontend/Json.php
tine20/Tinebase/Frontend/Json/Abstract.php
tine20/Tinebase/OpenId/Provider/User/Tine20.php
tine20/Tinebase/OpenId/Session.php [new file with mode: 0644]
tine20/Tinebase/Preference.php
tine20/Tinebase/Server/Http.php
tine20/Tinebase/Server/Json.php
tine20/Tinebase/Session.php [new file with mode: 0644]
tine20/Tinebase/Session/Abstract.php [new file with mode: 0644]
tine20/Tinebase/User/Session.php [new file with mode: 0644]
tine20/Voipmanager/Server/Snom.php

index 5e8d4e7..8a39e68 100644 (file)
@@ -147,7 +147,7 @@ class Felamimail_Controller_AccountTest extends PHPUnit_Framework_TestCase
             'no IMAP4(rev1) capability found in ' . print_r($capabilities['capabilities'], TRUE));
         $this->assertTrue(in_array('QUOTA', $capabilities['capabilities']), 'no QUOTA capability found in ' . print_r($capabilities['capabilities'], TRUE));
         
-        $this->assertEquals($capabilities, array_value($this->_account->getId(), Tinebase_Core::getSession()->Felamimail));
+        $this->assertEquals($capabilities, array_value($this->_account->getId(), Felamimail_Session::getSessionNamespace()->account));
     }
 
     /**
@@ -162,7 +162,7 @@ class Felamimail_Controller_AccountTest extends PHPUnit_Framework_TestCase
         $account->type = Felamimail_Model_Account::TYPE_USER;
         $this->_controller->update($account);
         
-        $this->assertFalse(array_key_exists($this->_account->getId(), Tinebase_Core::getSession()->Felamimail), print_r(Tinebase_Core::getSession()->Felamimail, TRUE));
+        $this->assertFalse(array_key_exists($this->_account->getId(), Felamimail_Session::getSessionNamespace()->account), print_r(Felamimail_Session::getSessionNamespace()->account, TRUE));
     }
     
     /**
index 9e7055c..6ba73ad 100644 (file)
@@ -124,6 +124,15 @@ class Felamimail_Controller_Cache_MessageTest extends PHPUnit_Framework_TestCase
     }
     
     /**
+     *  test if there is a user logged in
+     */
+    public function testUser()
+    {
+        $this->assertTrue(is_object($this->_testUser), 'attribute user is of type ' . gettype($this->_testUser));
+        $this->assertTrue(is_object(Tinebase_Core::get(Tinebase_Core::USER)), 'core user is of type ' . gettype($this->_testUser));
+    }
+    
+    /**
      * test clear message cache
      *
      */
index a716a9e..3a01206 100644 (file)
@@ -636,7 +636,7 @@ class Tinebase_Frontend_JsonTest extends TestCase
         
         // make sure, we are sclever
         $this->assertEquals('sclever', Tinebase_Core::getUser()->accountLoginName);
-        $this->assertEquals('sclever', Tinebase_Core::getSession()->currentAccount->accountLoginName);
+        $this->assertEquals('sclever', Tinebase_User_Session::getSessionNamespace()->currentAccount->accountLoginName);
         
         Tinebase_Controller::getInstance()->initUser($this->_originalTestUser, /* $fixCookieHeader = */ false);
     }
diff --git a/tine20/Addressbook/Session.php b/tine20/Addressbook/Session.php
new file mode 100644 (file)
index 0000000..6900115
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Addressbook
+ * @subpackage  Session
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Guilherme Striquer Bisotto <guilherme.bisotto@serpro.gov.br>
+ * @copyright   Copyright (c) 2014-2014 Metaways Infosystems GmbH (http://www.metaways.de)
+ * 
+ */
+
+/**
+ * class for Session and Session Namespaces for Tinebase_User
+ *
+ * @package     Addressbook
+ * @subpackage  Session
+ */
+class Addressbook_Session extends Tinebase_Session_Abstract
+{
+    /**
+     * Addressbook Session Namespace
+     */
+    const NAMESPACE_NAME = 'Addressbook_Session_Namespace';
+}
\ No newline at end of file
index ca835fd..e24c5f7 100644 (file)
@@ -42,7 +42,7 @@ class Calendar_Frontend_CalDAV_Backend extends Sabre\CalDAV\Backend\AbstractBack
         }
         
         $calendars = array();
-//        $sessionUriMap = (array) Tinebase_Core::getSession()->CalDAVUriMap;
+//        $sessionUriMap = (array) Tinebase_Session::getSessionNamespace()->CalDAVUriMap;
         
         foreach($containers as $container) {
             $containerId = $container->getId();
index e78d6c3..b72e646 100644 (file)
@@ -342,11 +342,13 @@ class Felamimail_Controller_Account extends Tinebase_Controller_Record_Abstract
             Tinebase_Core::getCache()->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('getMessageBody'));
         }
         
+        $felamimailSession = Felamimail_Session::getSessionNamespace();
+        
         // reset capabilities if imap host / port changed
-        if (isset(Tinebase_Core::getSession()->Felamimail) && ((isset($diff['host']) || array_key_exists('host', $diff)) || (isset($diff['port']) || array_key_exists('port', $diff)))) {
+        if (isset($felamimailSession->account) && ((isset($diff['host']) || array_key_exists('host', $diff)) || (isset($diff['port']) || array_key_exists('port', $diff)))) {
             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ 
                 . ' Resetting capabilities for account ' . $_record->name);
-            unset(Tinebase_Core::getSession()->Felamimail[$_record->getId()]);
+            unset($felamimailSession->account[$_record->getId()]);
         }
     }
 
@@ -509,9 +511,11 @@ class Felamimail_Controller_Account extends Tinebase_Controller_Record_Abstract
      */
     public function updateCapabilities(Felamimail_Model_Account $_account, Felamimail_Backend_ImapProxy $_imapBackend = NULL)
     {
-        if (isset(Tinebase_Core::getSession()->Felamimail) && array_key_exists($_account->getId(), Tinebase_Core::getSession()->Felamimail)) {
+        $felamimailSession = Felamimail_Session::getSessionNamespace();
+        
+        if (isset($felamimailSession->account) && is_array($felamimailSession->account) && array_key_exists($_account->getId(), $felamimailSession->account)) {
             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Getting capabilities of account ' . $_account->name . ' from SESSION.');
-            return Tinebase_Core::getSession()->Felamimail[$_account->getId()];
+            return $felamimailSession->account[$_account->getId()];
         }
         
         $imapBackend = ($_imapBackend !== NULL) ? $_imapBackend : $this->_getIMAPBackend($_account, TRUE);
@@ -537,7 +541,7 @@ class Felamimail_Controller_Account extends Tinebase_Controller_Record_Abstract
         }
         
         // save capabilities in SESSION
-        Tinebase_Core::getSession()->Felamimail[$_account->getId()] = $capabilities;
+        $felamimailSession->account[$_account->getId()] = $capabilities;
         
         return $capabilities;
     }
index 3b46f99..04a5bfe 100644 (file)
@@ -31,7 +31,7 @@ class Felamimail_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function searchFolders($filter)
     {
         // close session to allow other requests
-        Zend_Session::writeClose(true);
+        Tinebase_Session::writeClose(true);
         
         $result = $this->_search($filter, '', Felamimail_Controller_Folder::getInstance(), 'Felamimail_Model_FolderFilter');
         
@@ -108,7 +108,7 @@ class Felamimail_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function emptyFolder($folderId)
     {
         // close session to allow other requests
-        Zend_Session::writeClose(true);
+        Tinebase_Session::writeClose(true);
         
         $result = Felamimail_Controller_Folder::getInstance()->emptyFolder($folderId, TRUE);
         return $this->_recordToJson($result);
@@ -136,7 +136,7 @@ class Felamimail_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function getFolderStatus($filterData)
     {
         // close session to allow other requests
-        Zend_Session::writeClose(true);
+        Tinebase_Session::writeClose(true);
         
         $filter = new Felamimail_Model_FolderFilter($filterData);
         $result = Felamimail_Controller_Cache_Message::getInstance()->getFolderStatus($filter);
@@ -170,7 +170,7 @@ class Felamimail_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function updateMessageCache($folderId, $time)
     {
         // close session to allow other requests
-        Zend_Session::writeClose(true);
+        Tinebase_Session::writeClose(true);
         
         $folder = Felamimail_Controller_Cache_Message::getInstance()->updateCache($folderId, $time);
         
@@ -186,7 +186,7 @@ class Felamimail_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function getMessage($id)
     {
         // close session to allow other requests
-        Zend_Session::writeClose(true);
+        Tinebase_Session::writeClose(true);
         
         if (strpos($id, '_') !== false) {
             list($messageId, $partId) = explode('_', $id);
@@ -211,7 +211,7 @@ class Felamimail_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function moveMessages($filterData, $targetFolderId)
     {
         // close session to allow other requests
-        Zend_Session::writeClose(true);
+        Tinebase_Session::writeClose(true);
         
         $filter = new Felamimail_Model_MessageFilter(array());
         $filter->setFromArrayInUsersTimezone($filterData);
@@ -271,7 +271,7 @@ class Felamimail_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function addFlags($filterData, $flags)
     {
         // close session to allow other requests
-        Zend_Session::writeClose(true);
+        Tinebase_Session::writeClose(true);
         
         // as long as we get array of ids or filter data from the client, we need to do this legacy handling (1 dimensional -> ids / 2 dimensional -> filter data)
         if (! empty($filterData) && is_array($filterData[0])) {
@@ -376,7 +376,7 @@ class Felamimail_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function updateFlags($folderId, $time)
     {
         // close session to allow other requests
-        Zend_Session::writeClose(true);
+        Tinebase_Session::writeClose(true);
         
         $folder = Felamimail_Controller_Cache_Message::getInstance()->updateFlags($folderId, $time);
         
index a48866b..cc26037 100644 (file)
@@ -431,7 +431,7 @@ class Felamimail_Model_Account extends Tinebase_Record_Abstract
             } else {
                 Tinebase_Core::getLogger()->crit(__METHOD__ . '::' . __LINE__ 
                     . ' Something went wrong with the CredentialsCache! Forcing logout ...');
-                Zend_Session::destroy();
+                Tinebase_Session::destroyAndRemoveCookie();
                 return FALSE;
             }
             
diff --git a/tine20/Felamimail/Session.php b/tine20/Felamimail/Session.php
new file mode 100644 (file)
index 0000000..c910291
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Felamimail
+ * @subpackage  Session
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Guilherme Striquer Bisotto <guilherme.bisotto@serpro.gov.br>
+ * @copyright   Copyright (c) 2014-2014 Metaways Infosystems GmbH (http://www.metaways.de)
+ * 
+ */
+
+/**
+ * class for Session and Session Namespaces for Tinebase_User
+ *
+ * @package     Felamimail
+ * @subpackage  Session
+ */
+class Felamimail_Session extends Tinebase_Session_Abstract
+{
+    /**
+     * Felamimail Session Namespace
+     */
+    const NAMESPACE_NAME = 'Falamimail_Session_Namespace';
+}
\ No newline at end of file
index ada3b95..f321010 100644 (file)
@@ -30,21 +30,21 @@ class Phone_Frontend_Snom extends Voipmanager_Frontend_Snom_Abstract
      */
     protected function _authenticate()
     {
-        if (Zend_Session::isStarted()) {\r
-            $snomSession = new Zend_Session_Namespace('snomPhone');\r
-            \r
-            if (isset($snomSession->phoneIsAuthenticated)) {\r
-                return;\r
-            }\r
-        }\r
+        if (Tinebase_Session::isStarted()) {
+            $snomSession = Phone_Session::getSessionNamespace();
+            
+            if (isset($snomSession->phoneIsAuthenticated)) {
+                return;
+            }
+        }
         
         parent::_authenticate();
         
-        if (!Zend_Session::isStarted()) {
-            Tinebase_Core::startSession('snomPhone');
+        if (!Tinebase_Session::isStarted()) {
+            Tinebase_Core::startCoreSession();
         }
         
-        $snomSession = new Zend_Session_Namespace('snomPhone');
+        $snomSession = Phone_Session::getSessionNamespace();
         $snomSession->phoneIsAuthenticated = 1;
     }
     /**
@@ -80,7 +80,7 @@ class Phone_Frontend_Snom extends Voipmanager_Frontend_Snom_Abstract
                 <URL>' . $baseUrl . '</URL>
                 <InputItem>
                     <DisplayName>' . $translate->_('Enter search') . ':</DisplayName>
-                    <QueryStringParam>method=Phone.searchContacts&TINE20SESSID=' . Zend_Session::getId() . '&mac=' . $mac . '&query</QueryStringParam>
+                    <QueryStringParam>method=Phone.searchContacts&TINE20SESSID=' . Tinebase_Session::getId() . '&mac=' . $mac . '&query</QueryStringParam>
                     <DefaultValue/>
                     <InputFlags>a</InputFlags>
                 </InputItem>
@@ -114,11 +114,11 @@ class Phone_Frontend_Snom extends Voipmanager_Frontend_Snom_Abstract
                 <Title>Menu</Title>
                 <MenuItem>
                     <Name>Call Forward</Name>
-                    <URL>' . $baseUrl . '?method=Phone.getCallForward&TINE20SESSID=' . Zend_Session::getId() . '&activeLine=' . $activeLine . '&mac=' . $mac . '</URL>
+                    <URL>' . $baseUrl . '?method=Phone.getCallForward&TINE20SESSID=' . Tinebase_Session::getId() . '&activeLine=' . $activeLine . '&mac=' . $mac . '</URL>
                 </MenuItem>
                 <MenuItem>
                     <Name>Addressbook</Name>
-                    <URL>' . $baseUrl . '?method=Phone.directory&TINE20SESSID=' . Zend_Session::getId() . '&mac=' . $mac . '</URL>
+                    <URL>' . $baseUrl . '?method=Phone.directory&TINE20SESSID=' . Tinebase_Session::getId() . '&mac=' . $mac . '</URL>
                 </MenuItem>
             </SnomIPPhoneMenu>
         ';
@@ -156,13 +156,13 @@ class Phone_Frontend_Snom extends Voipmanager_Frontend_Snom_Abstract
             $softKeyItem->setSoftKey('F_ABORT');
         } else {
             $softKeyItem->setLabel('Off');
-            $softKeyItem->setURL($baseUrl . '?method=Phone.setCallForward&TINE20SESSID=' . Zend_Session::getId() . '&number=&mode=' . Voipmanager_Model_Asterisk_SipPeer::CFMODE_OFF . '&activeLine=' . $activeLine . '&mac=' . $mac);
+            $softKeyItem->setURL($baseUrl . '?method=Phone.setCallForward&TINE20SESSID=' . Tinebase_Session::getId() . '&number=&mode=' . Voipmanager_Model_Asterisk_SipPeer::CFMODE_OFF . '&activeLine=' . $activeLine . '&mac=' . $mac);
         }
         
         // cfi number key
         $softKeyItem = $ipPhoneInput->addSoftKeyItem('F3');
         $softKeyItem->setLabel( (($sipPeer->cfi_mode == Voipmanager_Model_Asterisk_SipPeer::CFMODE_NUMBER) ? '*' : null) . 'Number' );
-        $softKeyItem->setURL($baseUrl . '?method=Phone.setCallForward&TINE20SESSID=' . Zend_Session::getId() . '&number=&mode=' . Voipmanager_Model_Asterisk_SipPeer::CFMODE_NUMBER . '&activeLine=' . $activeLine . '&mac=' . $mac);        
+        $softKeyItem->setURL($baseUrl . '?method=Phone.setCallForward&TINE20SESSID=' . Tinebase_Session::getId() . '&number=&mode=' . Voipmanager_Model_Asterisk_SipPeer::CFMODE_NUMBER . '&activeLine=' . $activeLine . '&mac=' . $mac);
         
         // cfi mailbox key\r
         $softKeyItem = $ipPhoneInput->addSoftKeyItem('F4');
@@ -171,7 +171,7 @@ class Phone_Frontend_Snom extends Voipmanager_Frontend_Snom_Abstract
             $softKeyItem->setSoftKey('F_ABORT');
         } else {
             $softKeyItem->setLabel('Mailbox');
-            $softKeyItem->setURL($baseUrl . '?method=Phone.setCallForward&TINE20SESSID=' . Zend_Session::getId() . '&number=&mode=' .  Voipmanager_Model_Asterisk_SipPeer::CFMODE_VOICEMAIL . '&activeLine=' . $activeLine . '&mac=' . $mac);
+            $softKeyItem->setURL($baseUrl . '?method=Phone.setCallForward&TINE20SESSID=' . Tinebase_Session::getId() . '&number=&mode=' .  Voipmanager_Model_Asterisk_SipPeer::CFMODE_VOICEMAIL . '&activeLine=' . $activeLine . '&mac=' . $mac);
         }
         
         header('Content-Type: text/xml');
@@ -213,7 +213,7 @@ class Phone_Frontend_Snom extends Voipmanager_Frontend_Snom_Abstract
                 $inputItem->appendChild($doc->createElement('InputFlags', 't'));
                 
                 $queryStringParamElement = $doc->createElement('QueryStringParam');
-                $queryStringParamElement->appendChild($doc->createTextNode('method=Phone.setCallForward&TINE20SESSID=' . Zend_Session::getId() . '&mode=' . Voipmanager_Model_Asterisk_SipPeer::CFMODE_NUMBER . '&activeLine=' . $activeLine . '&mac=' . $mac . '&number'));
+                $queryStringParamElement->appendChild($doc->createTextNode('method=Phone.setCallForward&TINE20SESSID=' . Tinebase_Session::getId() . '&mode=' . Voipmanager_Model_Asterisk_SipPeer::CFMODE_NUMBER . '&activeLine=' . $activeLine . '&mac=' . $mac . '&number'));
                 $inputItem->appendChild($queryStringParamElement);
                 
             } else {
@@ -255,7 +255,7 @@ class Phone_Frontend_Snom extends Voipmanager_Frontend_Snom_Abstract
                 <SnomIPPhoneText>
                 <Title>Nothing found!</Title>
                 <Text>Nothing found!</Text>
-                <fetch mil="1000">' . $baseUrl . '?method=Phone.directory&TINE20SESSID=' . Zend_Session::getId() . '&mac=' . $mac . '</fetch>
+                <fetch mil="1000">' . $baseUrl . '?method=Phone.directory&TINE20SESSID=' . Tinebase_Session::getId() . '&mac=' . $mac . '</fetch>
                 </SnomIPPhoneText>
             ');
             
@@ -299,7 +299,7 @@ class Phone_Frontend_Snom extends Voipmanager_Frontend_Snom_Abstract
             $xml = '<SnomIPPhoneText>
                 <Title>Nothing found!</Title>
                 <Text>Nothing found!</Text>
-                <fetch mil="1000">' . $baseUrl . '?method=Phone.directory&TINE20SESSID=' . Zend_Session::getId() . '&mac=' . $mac . '</fetch>
+                <fetch mil="1000">' . $baseUrl . '?method=Phone.directory&TINE20SESSID=' . Tinebase_Session::getId() . '&mac=' . $mac . '</fetch>
             </SnomIPPhoneText>
             ';
         } else {
diff --git a/tine20/Phone/Session.php b/tine20/Phone/Session.php
new file mode 100644 (file)
index 0000000..067b063
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Phone
+ * @subpackage  Session
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Guilherme Striquer Bisotto <guilherme.bisotto@serpro.gov.br>
+ * @copyright   Copyright (c) 2014-2014 Metaways Infosystems GmbH (http://www.metaways.de)
+ * 
+ */
+
+/**
+ * class for Session and Session Namespaces for Tinebase_User
+ *
+ * @package     Phone
+ * @subpackage  Session
+ */
+class Phone_Session extends Tinebase_Session_Abstract
+{
+    /**
+     * Phone Session Namespace
+     */
+    const NAMESPACE_NAME = 'Phone_Session_Namespace';
+}
\ No newline at end of file
index 0f48cee..72860ec 100644 (file)
@@ -782,7 +782,7 @@ class Setup_Controller
             ),
             'tmpdir' => $defaultPath,
             'session' => array(
-                'path'      => Setup_Core::getSessionDir(),
+                'path'      => Tinebase_Session::getSessionDir(),
                 'liftime'   => 86400,
             ),
         );
@@ -1319,16 +1319,16 @@ class Setup_Controller
         
         if ($authResult->isValid()) {
             Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Valid credentials, setting username in session and registry.');
-            //Zend_Session::registerValidator(new Zend_Session_Validator_HttpUserAgent());
-            Zend_Session::regenerateId();
+            //Tinebase_Session::registerValidator(new Tinebase_Session_Validator_HttpUserAgent());
+            Tinebase_Session::regenerateId();
             
             Setup_Core::set(Setup_Core::USER, $_username);
-            Setup_Core::getSession()->setupuser = $_username;
+            Setup_Session::getSessionNamespace()->setupuser = $_username;
             return true;
             
         } else {
             Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' Invalid credentials! ' . print_r($authResult->getMessages(), TRUE));
-            Zend_Session::expireSessionCookie();
+            Tinebase_Session::expireSessionCookie();
             sleep(2);
             return false;
         }
@@ -1343,7 +1343,7 @@ class Setup_Controller
     {
         $_SESSION = array();
         
-        Zend_Session::destroy();
+        Tinebase_Session::destroyAndRemoveCookie();
     }
     
     /**
@@ -1820,10 +1820,10 @@ class Setup_Controller
     public function isFilesystemAvailable()
     {
         if ($this->_isFileSystemAvailable === null) {
-            $session = Tinebase_Core::getSession();
+            $session = Tinebase_Session::getSessionNamespace();
             if (! isset($session->filesystemAvailable)) {
                 $this->_isFileSystemAvailable = (! empty(Tinebase_Core::getConfig()->filesdir) && is_writeable(Tinebase_Core::getConfig()->filesdir));
-                if (is_object($session) && Zend_Session::isWritable()) {
+                if (is_object($session) && Tinebase_Session::isWritable()) {
                     $session->filesystemAvailable = $this->_isFileSystemAvailable;
                 }
                 if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Setup_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ 
index 1222db2..e6d541a 100644 (file)
@@ -48,7 +48,7 @@ class Setup_Core extends Tinebase_Core
         
         Setup_Core::setupSession();
         
-        Setup_Core::startSession();
+        Setup_Core::startSetupSession();
         
         // setup a temporary user locale/timezone. This will be overwritten later but we 
         // need to handle exceptions during initialisation process such as seesion timeout
@@ -61,6 +61,25 @@ class Setup_Core extends Tinebase_Core
     }
     
     /**
+     * 
+     * @throws Exception
+     */
+    public static function startSetupSession ()
+    {
+        try {
+            $setupSession = Setup_Session::getSessionNamespace();
+        } catch (Exception $e) {
+            throw $e;
+        }
+        
+        if (isset($setupSession->setupuser)) {
+            self::set(self::USER, $setupSession->setupuser);
+        }
+        
+        Tinebase_Core::startCoreSession();
+    }
+    
+    /**
      * dispatch request
      *
      */
@@ -256,7 +275,7 @@ class Setup_Core extends Tinebase_Core
      */
     public static function setupSession()
     {
-        self::setSessionOptions(array(\r
+        Tinebase_Session::setSessionOptions(array(\r
             'name' => 'TINE20SETUPSESSID'\r
         ));\r
     }
diff --git a/tine20/Setup/Session.php b/tine20/Setup/Session.php
new file mode 100644 (file)
index 0000000..1487e88
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Setup
+ * @subpackage  Session
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Guilherme Striquer Bisotto <guilherme.bisotto@serpro.gov.br>
+ * @copyright   Copyright (c) 2014-2014 Metaways Infosystems GmbH (http://www.metaways.de)
+ * 
+ */
+
+/**
+ * class for Session and Session Namespaces for Tinebase_User
+ *
+ * @package     Setup
+ * @subpackage  Session
+ */
+class Setup_Session extends Tinebase_Session_Abstract
+{
+    /**
+     * Session namespace for Setup
+     */
+    const NAMESPACE_NAME = 'Setup_Session_Namespace';
+}
\ No newline at end of file
index bd402d8..daa563b 100644 (file)
@@ -46,7 +46,7 @@ class Tasks_Frontend_CalDAV_Backend extends Sabre\CalDAV\Backend\AbstractBackend
         }
         
         $calendars = array();
-//        $sessionUriMap = (array) Tinebase_Core::getSession()->CalDAVUriMap;
+//        $sessionUriMap = (array) Tinebase_Session::getSessionNamespace()->CalDAVUriMap;
         
         foreach($containers as $container) {
             $containerId = $container->getId();
index f743848..d7c33cd 100644 (file)
@@ -127,7 +127,7 @@ class Tinebase_Acl_Roles
             Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' ' . $_accountId . ' has no role/group memberships.');
             if (is_object(Tinebase_Core::getUser()) && Tinebase_Core::getUser()->getId() === $_accountId) {
                 // @todo throw exception in this case?
-                Zend_Session::destroy();
+                Tinebase_Session::destroyAndRemoveCookie();
             }
             
             return false;
index 390d40f..0e50080 100755 (executable)
@@ -208,7 +208,7 @@ class Tinebase_Auth
         $this->_backend->setIdentity($_username);
         $this->_backend->setCredential($_password);
         
-        if (Zend_Session::isStarted()) {
+        if (Tinebase_Session::isStarted()) {
             Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_Session());
         } else {
             Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_NonPersistent());
index 82dffcb..283f40f 100644 (file)
@@ -153,7 +153,7 @@ class Tinebase_Auth_CredentialCache extends Tinebase_Backend_Sql_Abstract implem
      */
     protected function _saveInSession(Tinebase_Model_CredentialCache $cache)
     {
-        $session = Tinebase_Core::getSession();
+        $session = Tinebase_Session::getSessionNamespace();
         if ($session && is_object($session)) {
             $session->{self::SESSION_NAMESPACE}[$cache->getId()] = $cache->toArray();
         }
@@ -202,7 +202,7 @@ class Tinebase_Auth_CredentialCache extends Tinebase_Backend_Sql_Abstract implem
      */
     protected function _getCache($id)
     {
-        $session = Tinebase_Core::getSession();
+        $session = Tinebase_Session::getSessionNamespace();
         $credentialSessionCache = ($session && is_object($session)) ? $session->{self::SESSION_NAMESPACE} : NULL;
         if (isset($credentialSessionCache) && isset($credentialSessionCache[$id])) {
             $result = new Tinebase_Model_CredentialCache($credentialSessionCache[$id]);
index f01afc9..69aab20 100755 (executable)
@@ -164,7 +164,7 @@ class Tinebase_Backend_Sql_Command_Pgsql implements Tinebase_Backend_Sql_Command
      */
     protected function _hasUnaccentExtension()
     {
-        $session = Tinebase_Core::getSession();
+        $session = Tinebase_Session::getSessionNamespace();
         if ($session instanceof Zend_Session_Namespace && isset($session->dbcapabilities) && (isset($session->dbcapabilities['unaccent']) || array_key_exists('unaccent', $session->dbcapabilities))) {
             $result = $session->dbcapabilities['unaccent'];
         } else {
index c51e06b..5e6ff7d 100644 (file)
@@ -37,7 +37,7 @@ class Tinebase_Controller extends Tinebase_Controller_Event
      * the constructor
      *
      */
-    private function __construct() 
+    private function __construct()
     {
         $this->_writeAccessLog = Tinebase_Core::get('serverclassname') !== 'ActiveSync_Server_Http' ||
             !(ActiveSync_Config::getInstance()->get(ActiveSync_Config::DISABLE_ACCESS_LOG));
@@ -54,7 +54,7 @@ class Tinebase_Controller extends Tinebase_Controller_Event
      *
      * @return Tinebase_Controller
      */
-    public static function getInstance() 
+    public static function getInstance()
     {
         if (self::$_instance === NULL) {
             self::$_instance = new Tinebase_Controller;
@@ -77,7 +77,7 @@ class Tinebase_Controller extends Tinebase_Controller_Event
     {
         $authResult = Tinebase_Auth::getInstance()->authenticate($loginName, $password);
         
-        $accessLog = $this->_getModelAccessLog($loginName, $authResult, $request, $clientIdString);
+        $accessLog = $this->_getAccessLogEntry($loginName, $authResult, $request, $clientIdString);
         
         $user = $this->_validateAuthResult($authResult, $accessLog);
         
@@ -116,7 +116,7 @@ class Tinebase_Controller extends Tinebase_Controller_Event
                  * catch all exceptions during user data sync
                  * either it's the first sync and no user data get synchronized or
                  * we can work with the data synced during previous login
-                 */ 
+                 */
                 try {
                     Tinebase_User::syncUser($_username,array('syncContactData' => TRUE));
                 } catch (Exception $e) {
@@ -216,7 +216,7 @@ class Tinebase_Controller extends Tinebase_Controller_Event
     protected function _initUserSession(Tinebase_Model_FullUser $user, $fixCookieHeader = true)
     {
         if (Tinebase_Config::getInstance()->get(Tinebase_Config::SESSIONUSERAGENTVALIDATION, TRUE)) {
-            Zend_Session::registerValidator(new Zend_Session_Validator_HttpUserAgent());
+            Tinebase_Session::registerValidatorHttpUserAgent();
         } else {
             Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' User agent validation disabled.');
         }
@@ -224,13 +224,13 @@ class Tinebase_Controller extends Tinebase_Controller_Event
         // we only need to activate ip session validation for non-encrypted connections
         $ipSessionValidationDefault = Tinebase_Core::isHttpsRequest() ? FALSE : TRUE;
         if (Tinebase_Config::getInstance()->get(Tinebase_Config::SESSIONIPVALIDATION, $ipSessionValidationDefault)) {
-            Zend_Session::registerValidator(new Zend_Session_Validator_IpAddress());
+            Tinebase_Session::registerValidatorIpAddress();
         } else {
             Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Session ip validation disabled.');
         }
         
-        if (Zend_Session::isStarted()) {
-            Zend_Session::regenerateId();
+        if (Tinebase_Session::isStarted()) {
+            Tinebase_Session::regenerateId();
             Tinebase_Core::set(Tinebase_Core::SESSIONID, session_id());
             
             if ($fixCookieHeader) {
@@ -248,7 +248,7 @@ class Tinebase_Controller extends Tinebase_Controller_Event
                 /** end of fix **/
             }
             
-            Tinebase_Core::getSession()->currentAccount = $user;
+            Tinebase_User_Session::getSessionNamespace()->currentAccount = $user;
         }
     }
     
@@ -332,7 +332,7 @@ class Tinebase_Controller extends Tinebase_Controller_Event
             imagedestroy($image);
             $result = array();
             $result['1'] = base64_encode($image_code);
-            $_SESSION['captcha']['code'] = $code;
+            Tinebase_Session::getSessionNamespace()->captcha['code'] = $code;
         } catch (Exception $e) {
             if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' ' . $e->getMessage());
         }
@@ -357,8 +357,11 @@ class Tinebase_Controller extends Tinebase_Controller_Event
          * but the user is not logged into Tine 2.0
          * we use this to validate passwords for OpenId for example
          */
-        unset(Tinebase_Core::getSession()->Zend_Auth);
-        unset(Tinebase_Core::getSession()->currentAccount);
+        $coreSession = Tinebase_Session::getSessionNamespace();
+        unset($coreSession->Zend_Auth);
+        
+        $userSession = Tinebase_User_Session::getSessionNamespace();
+        unset($userSession->currentAccount);        
         
         return $result;
     }
@@ -397,40 +400,42 @@ class Tinebase_Controller extends Tinebase_Controller_Event
     public function changeUserAccount($loginName)
     {
         $allowedRoleChanges = Tinebase_Config::getInstance()->get(Tinebase_Config::ROLE_CHANGE_ALLOWED);
+        
+        if (!$allowedRoleChanges) {
+            throw new Tinebase_Exception_AccessDenied('It is not allowed to switch to this account');
+        }
+        
         $currentAccountName = Tinebase_Core::getUser()->accountLoginName;
-        if ($allowedRoleChanges) {
-            $allowedRoleChangesArray = $allowedRoleChanges->toArray();
-            
-            if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(
-                __METHOD__ . '::' . __LINE__ . ' ROLE_CHANGE_ALLOWED: ' . print_r($allowedRoleChangesArray, true));
-            
-            $user = null;
-            
-            if (isset($allowedRoleChangesArray[$currentAccountName])
-                && in_array($loginName, $allowedRoleChangesArray[$currentAccountName])
-            ) {
-                $user = Tinebase_User::getInstance()->getFullUserByLoginName($loginName);
-                Tinebase_Core::getSession()->userAccountChanged = true;
-                Tinebase_Core::getSession()->originalAccountName = $currentAccountName;
-                
-            } else if (Tinebase_Core::getSession()->userAccountChanged 
-                && isset($allowedRoleChangesArray[Tinebase_Core::getSession()->originalAccountName])
-            ) {
-                $user = Tinebase_User::getInstance()->getFullUserByLoginName(Tinebase_Core::getSession()->originalAccountName);
-                Tinebase_Core::getSession()->userAccountChanged = false;
-                Tinebase_Core::getSession()->originalAccountName = null;
-            }
+        
+        $allowedRoleChangesArray = $allowedRoleChanges->toArray();
+        
+        if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(
+            __METHOD__ . '::' . __LINE__ . ' ROLE_CHANGE_ALLOWED: ' . print_r($allowedRoleChangesArray, true));
+        
+        $user = null;
+        
+        if (isset($allowedRoleChangesArray[$currentAccountName])
+            && in_array($loginName, $allowedRoleChangesArray[$currentAccountName])
+        ) {
+            $user = Tinebase_User::getInstance()->getFullUserByLoginName($loginName);
+            Tinebase_Session::getSessionNamespace()->userAccountChanged = true;
+            Tinebase_Session::getSessionNamespace()->originalAccountName = $currentAccountName;
             
-            if ($user) {
-                if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(
-                    __METHOD__ . '::' . __LINE__ . ' Switching to user account ' . $user->accountLoginName);
-                
-                $this->initUser($user, /* $fixCookieHeader = */ false);
-                return true;
-            }
-        } 
+        } else if (Tinebase_Session::getSessionNamespace()->userAccountChanged 
+            && isset($allowedRoleChangesArray[Tinebase_Session::getSessionNamespace()->originalAccountName])
+        ) {
+            $user = Tinebase_User::getInstance()->getFullUserByLoginName(Tinebase_Session::getSessionNamespace()->originalAccountName);
+            Tinebase_Session::getSessionNamespace()->userAccountChanged = false;
+            Tinebase_Session::getSessionNamespace()->originalAccountName = null;
+        }
         
-        throw new Tinebase_Exception_AccessDenied('It is not allowed to switch to this account');
+        if ($user) {
+            if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(
+                __METHOD__ . '::' . __LINE__ . ' Switching to user account ' . $user->accountLoginName);
+            
+            $this->initUser($user, /* $fixCookieHeader = */ false);
+            return true;
+        }
     }
     
     /**
@@ -561,7 +566,7 @@ class Tinebase_Controller extends Tinebase_Controller_Event
      * @param string $clientIdString
      * @return Tinebase_Model_AccessLog
      */
-    protected function _getModelAccessLog($loginName, Zend_Auth_Result $authResult, Zend_Controller_Request_Abstract $request, $clientIdString)
+    protected function _getAccessLogEntry($loginName, Zend_Auth_Result $authResult, Zend_Controller_Request_Abstract $request, $clientIdString)
     {
         $accessLog = new Tinebase_Model_AccessLog(array(
             'ip'         => $request->getClientIp(),
@@ -570,7 +575,7 @@ class Tinebase_Controller extends Tinebase_Controller_Event
             'clienttype' => $clientIdString,
             'login_name' => $loginName ? $loginName : $authResult->getIdentity(),
             'user_agent' => substr($request->getHeader('USER_AGENT'), 0, 255)
-        ), TRUE);
+        ), true);
         
         return $accessLog;
     }
@@ -684,8 +689,8 @@ class Tinebase_Controller extends Tinebase_Controller_Event
      */
     public function userAccountChanged()
     {
-        return (is_object(Tinebase_Core::getSession()) && isset(Tinebase_Core::getSession()->userAccountChanged)) 
-                ? Tinebase_Core::getSession()->userAccountChanged
+        return (is_object(Tinebase_Session::getSessionNamespace()) && isset(Tinebase_Session::getSessionNamespace()->userAccountChanged)) 
+                ? Tinebase_Session::getSessionNamespace()->userAccountChanged
                 : false;
     }
 }
index 1de131e..631938c 100644 (file)
@@ -257,7 +257,7 @@ class Tinebase_Core
         $server->handle();
         $method = get_class($server) . '::' . $server->getRequestMethod();
         self::set(self::METHOD, $method);
-
+        
         self::finishProfiling();
         self::getDbProfiling();
     }
@@ -428,10 +428,10 @@ class Tinebase_Core
         
         Tinebase_Core::setupBuildConstants();
         
-        Tinebase_Core::setupSession();
+        Tinebase_Session::setupSession();
         
-        if (Zend_Session::sessionExists()) {
-            Tinebase_Core::startSession();
+        if (Tinebase_Session::sessionExists()) {
+            Tinebase_Core::startCoreSession();
         }
         
         // setup a temporary user locale/timezone. This will be overwritten later but we 
@@ -457,6 +457,33 @@ class Tinebase_Core
     }
     
     /**
+     * start session helper function
+     *
+     * @param array $_options
+     * @throws Exception
+     */
+    public static function startCoreSession ($namespace = null)
+    {
+        try {
+            $coreSession = Tinebase_Session::getSessionNamespace();
+            $userSession = Tinebase_User_Session::getSessionNamespace();
+        } catch (Exception $e) {
+            throw $e;
+        }
+        
+        if (isset($userSession->currentAccount)) {
+            self::set(self::USER, $userSession->currentAccount);
+        }
+        
+        if (! isset($coreSession->jsonKey)) {
+            $coreSession->jsonKey = Tinebase_Record_Abstract::generateUID();
+        }
+        
+        Tinebase_Core::set('jsonKey', $coreSession->jsonKey);
+        Tinebase_Core::setDbCapabilitiesInSession($coreSession);
+    }
+    
+    /**
      * initializes the build constants like buildtype, package information, ...
      */
     public static function setupBuildConstants()
@@ -485,7 +512,7 @@ class Tinebase_Core
         if (error_reporting() == 0) {
             return;
         }
-
+        
         $logLine = " $errstr in {$errfile}::{$errline} ($severity)";
         $e = new Exception('just to get trace');
         $trace = $e->getTraceAsString();
@@ -499,7 +526,7 @@ class Tinebase_Core
             case E_USER_ERROR:
                 throw new ErrorException($errstr, 0, $severity, $errfile, $errline);
                 break;
-
+                
             case E_COMPILE_WARNING:
             case E_CORE_WARNING:
             case E_USER_WARNING:
@@ -512,7 +539,7 @@ class Tinebase_Core
                     error_log(__METHOD__ . '::' . __LINE__ . ' ' . $trace);
                 }
                 break;
-
+                
             case E_NOTICE:
             case E_STRICT:
             case E_USER_NOTICE:
@@ -555,7 +582,7 @@ class Tinebase_Core
     public static function guessTempDir()
     {
         $config = self::getConfig();
-
+        
         $tmpdir = $config->tmpdir;
         if ($tmpdir == Tinebase_Model_Config::NOTSET || !@is_writable($tmpdir)) {
             $tmpdir = sys_get_temp_dir();
@@ -566,10 +593,10 @@ class Tinebase_Core
                 }
             }
         }
-
+        
         return $tmpdir;
     }
-
+    
     /**
      * initializes the logger
      *
@@ -579,7 +606,7 @@ class Tinebase_Core
     {
         $config = self::getConfig();
         $logger = new Tinebase_Log();
-
+        
         if (isset($config->logger) && $config->logger->active) {
             try {
                 $logger->addWriterByConfig($config->logger);
@@ -593,7 +620,7 @@ class Tinebase_Core
                 $writer = ($_defaultWriter === NULL) ? new Zend_Log_Writer_Null() : $_defaultWriter;
                 $logger->addWriter($writer);
             }
-
+            
             // For saving log into syslog too, create a key syslog into logger (value does not matter)
             if ((bool) $config->logger->syslog){
                 $writer = new Zend_Log_Writer_Syslog(array(
@@ -615,12 +642,12 @@ class Tinebase_Core
         }
         
         self::set(self::LOGGER, $logger);
-
+        
         if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) $logger->info(__METHOD__ . '::' . __LINE__ .' Logger initialized');
         if (isset($loggerConfig) && Tinebase_Core::isLogLevel(Zend_Log::TRACE)) $logger->trace(__METHOD__ . '::' . __LINE__ 
             .' Logger settings: ' . print_r($loggerConfig->toArray(), TRUE));
     }
-
+    
     /**
      * setup the cache and add it to zend registry
      *
@@ -642,7 +669,7 @@ class Tinebase_Core
                 self::set(self::SHAREDCACHE, false);
             }
         }
-
+        
         // create zend cache
         if ($_enabled === true && $config->caching && $config->caching->active) {
             $frontendOptions = array(
@@ -654,10 +681,10 @@ class Tinebase_Core
                 'logging'                   => (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)),
                 'logger'                    => self::getLogger(),
             );
-
+            
             $backendType = ($config->caching->backend) ? ucfirst($config->caching->backend) : 'File';
             $backendOptions = ($config->caching->backendOptions) ? $config->caching->backendOptions->toArray() : false;
-
+            
             if (! $backendOptions) {
                 switch ($backendType) {
                     case 'File':
@@ -698,7 +725,7 @@ class Tinebase_Core
                         break;
                 }
             }
-
+            
             Tinebase_Core::getLogger()->INFO(__METHOD__ . '::' . __LINE__ . " cache of backend type '{$backendType}' enabled");
             
             if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) {
@@ -709,7 +736,7 @@ class Tinebase_Core
                 }
                 Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . " backend options: " . print_r($backendOptionsWithoutLogger, TRUE));
             }
-
+            
         } else {
             Tinebase_Core::getLogger()->INFO(__METHOD__ . '::' . __LINE__ . ' cache disabled');
             $backendType = 'Test';
@@ -719,7 +746,7 @@ class Tinebase_Core
             $backendOptions = array(
             );
         }
-
+        
         // getting a Zend_Cache_Core object
         try {
             $cache = Zend_Cache::factory('Core', $backendType, $frontendOptions, $backendOptions);
@@ -734,12 +761,11 @@ class Tinebase_Core
             }
             
             Tinebase_Core::getLogger()->WARN(__METHOD__ . '::' . __LINE__ . ' Cache error: ' . $e->getMessage());
-
+            
             self::setupCache($enabled);
             return;
         }
-
-
+        
         // some important caches
         Zend_Locale::setCache($cache);
         Zend_Translate::setCache($cache);
@@ -764,17 +790,6 @@ class Tinebase_Core
             self::set(self::USERCREDENTIALCACHE, $cache);
         }
     }
-
-    /**
-     * initializes the session
-     */
-    public static function setupSession()
-    {
-        self::setSessionOptions(array(
-            'name' => 'TINE20SESSID'
-        ));
-        self::setSessionBackend();
-    }
     
     /**
      * setup stream wrapper for tine20:// prefix
@@ -792,41 +807,6 @@ class Tinebase_Core
     }
     
     /**
-     * start session helper function
-     * 
-     * @param array $_options
-     * @throws Exception
-     */
-    public static function startSession()
-    {
-        try {
-            $session = new Zend_Session_Namespace('TinebaseCore');
-        } catch (Exception $e) {
-            self::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' Session error: ' . $e->getMessage());
-            self::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $e->getTraceAsString());
-            
-            Zend_Session::expireSessionCookie();
-            
-            throw $e;
-        }
-
-        if (isset($session->currentAccount)) {
-            self::set(self::USER, $session->currentAccount);
-        }
-        if (isset($session->setupuser)) {
-            self::set(self::USER, $session->setupuser);
-        }
-        if (!isset($session->jsonKey)) {
-            $session->jsonKey = Tinebase_Record_Abstract::generateUID();
-        }
-        self::set('jsonKey', $session->jsonKey);
-        
-        self::set(self::SESSION, $session);
-        self::set(self::SESSIONID, session_id());
-        self::setDbCapabilitiesInSession($session);
-    }
-    
-    /**
      * set database capabilities in session
      * 
      * @param Zend_Session_Namespace $session
@@ -844,114 +824,6 @@ class Tinebase_Core
     }
     
     /**
-     * set session options
-     * 
-     * @param array $_options
-     */
-    public static function setSessionOptions($_options = array())
-    {
-        Zend_Session::setOptions(array_merge($_options, array(
-            'cookie_httponly'   => true,
-            'hash_function'     => 1
-        )));
-        
-        if (isset($_SERVER['REQUEST_URI'])) {
-            // cut of path behind caldav/webdav (removeme when dispatching is refactored)
-            if (isset($_SERVER['REDIRECT_WEBDAV']) && $_SERVER['REDIRECT_WEBDAV'] == 'true') {
-                $decodedUri = Sabre\DAV\URLUtil::decodePath($_SERVER['REQUEST_URI']);
-                $baseUri = '/' . substr($decodedUri, 0, strpos($decodedUri, 'webdav/') + strlen('webdav/'));
-            } else if (isset($_SERVER['REDIRECT_CALDAV']) && $_SERVER['REDIRECT_CALDAV'] == 'true') {
-                $decodedUri = Sabre\DAV\URLUtil::decodePath($_SERVER['REQUEST_URI']);
-                $baseUri = '/' . substr($decodedUri, 0, strpos($decodedUri, 'caldav/') + strlen('caldav/'));
-            } else {
-                $baseUri = dirname($_SERVER['REQUEST_URI']);
-            }
-            
-            if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
-                $exploded = explode("/", $_SERVER['REQUEST_URI']);
-                if (strtolower($exploded[1]) == strtolower($_SERVER['HTTP_HOST'])) {
-                     $baseUri = '/' . $_SERVER['HTTP_HOST'] . (($baseUri == '/') ? '' : $baseUri);
-                }
-            }
-            
-            // fix for windows server with backslash directory separator
-            $baseUri = str_replace(DIRECTORY_SEPARATOR, '/', $baseUri);
-            
-            Zend_Session::setOptions(array(
-                'cookie_path'     => $baseUri
-            ));
-        }
-        
-        if (self::isHttpsRequest()) {
-            Zend_Session::setOptions(array(
-                'cookie_secure'     => true
-            ));
-        }
-    }
-        
-    /**
-     * set session backend
-     */
-    public static function setSessionBackend()
-    {
-        $config = self::getConfig();
-        $backendType = ($config->session && $config->session->backend) ? ucfirst($config->session->backend) : 'File';
-        $maxLifeTime = ($config->session && $config->session->lifetime) ? $config->session->lifetime : 86400; // one day is default
-        
-        switch ($backendType) {
-            case 'File':
-                if ($config->gc_maxlifetime) {
-                    self::getLogger()->warn(__METHOD__ . '::' . __LINE__ . " config.inc.php key 'gc_maxlifetime' should be renamed to 'lifetime' and moved to 'session' group.");
-                    $maxLifeTime = $config->get('gc_maxlifetime', 86400);
-                }
-                Zend_Session::setOptions(array(
-                    'gc_maxlifetime'     => $maxLifeTime
-                ));
-                
-                $sessionSavepath = self::getSessionDir();
-                if (ini_set('session.save_path', $sessionSavepath) !== FALSE) {
-                    if (!is_dir($sessionSavepath)) {
-                        mkdir($sessionSavepath, 0700);
-                    }
-                }
-                
-                $lastSessionCleanup = Tinebase_Config::getInstance()->get(Tinebase_Config::LAST_SESSIONS_CLEANUP_RUN);
-                if ($lastSessionCleanup instanceof DateTime && $lastSessionCleanup > Tinebase_DateTime::now()->subHour(2)) {
-                    Zend_Session::setOptions(array(
-                        'gc_probability' => 0,
-                        'gc_divisor'     => 100
-                    ));
-                } else if (@opendir(ini_get('session.save_path')) !== FALSE) {
-                    Zend_Session::setOptions(array(
-                        'gc_probability' => 1,
-                        'gc_divisor'     => 100
-                    ));
-                } else {
-                    self::getLogger()->warn(__METHOD__ . '::' . __LINE__ . " Unable to initialize automatic session cleanup. Check permissions to " . ini_get('session.save_path'));
-                }
-                
-                break;
-                
-            case 'Redis':
-                $host   = ($config->session->host) ? $config->session->host : 'localhost';
-                $port   = ($config->session->port) ? $config->session->port : 6379;
-                $prefix = Tinebase_Application::getInstance()->getApplicationByName('Tinebase')->getId() . '_SESSION_';
-                
-                Zend_Session::setOptions(array(
-                    'gc_maxlifetime' => $maxLifeTime,
-                    'save_handler'   => 'redis',
-                    'save_path'      => "tcp://$host:$port?prefix=$prefix"
-                ));
-                break;
-                
-            default:
-                break;
-        }
-        
-        Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . " Session of backend type '{$backendType}' configured.");
-    }
-    
-    /**
      * initializes the database connection
      */
     public static function setupDatabaseConnection()
@@ -1074,11 +946,11 @@ class Tinebase_Core
     {
         $tableName = 'pg_extension';
         $cols = 'COUNT(*)';
-
+        
         $select = $db->select()
             ->from($tableName, $cols)
             ->where("extname = 'unaccent'");
-
+        
         // if there is no table pg_extension, returns 0 (false)
         try {
             // checks if unaccent extension is installed or not
@@ -1169,10 +1041,10 @@ class Tinebase_Core
      */
     public static function setupUserLocale($localeString = 'auto', $saveaspreference = FALSE)
     {
-        $session = self::get(self::SESSION);
-
+        $session = Tinebase_User_Session::getSessionNamespace();
+        
         if (self::isLogLevel(Zend_Log::DEBUG)) self::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " given localeString '$localeString'");
-
+        
         // get locale object from session or ...
         if (   $session !== NULL 
             && isset($session->userLocale) 
@@ -1204,7 +1076,7 @@ class Tinebase_Core
             }
             
             $locale = Tinebase_Translation::getLocale($localeString);
-    
+            
             // save in session
             if ($session !== NULL) {
                 $session->userLocale = $locale;
@@ -1242,7 +1114,7 @@ class Tinebase_Core
      */
     public static function setupUserTimezone($_timezone = NULL, $_saveaspreference = FALSE)
     {
-        $session = self::get(self::SESSION);
+        $session = Tinebase_User_Session::getSessionNamespace();
 
         if ($_timezone === NULL) {
             
@@ -1355,9 +1227,9 @@ class Tinebase_Core
         
         return ' Real patch cache size: ' . $realPathCacheSize;
     }
-
+    
     /******************************* REGISTRY ************************************/
-
+    
     /**
      * get a value from the registry
      *
@@ -1366,7 +1238,7 @@ class Tinebase_Core
     {
         return (Zend_Registry::isRegistered($index)) ? Zend_Registry::get($index) : NULL;
     }
-
+    
     /**
      * set a registry value
      * 
@@ -1394,7 +1266,7 @@ class Tinebase_Core
         
         Zend_Registry::set($index, $value);
     }
-
+    
     /**
      * checks a registry value
      *
@@ -1420,7 +1292,7 @@ class Tinebase_Core
 
         return ucfirst($authType);
     }
-
+    
     /**
      * get config from the registry
      *
@@ -1433,7 +1305,7 @@ class Tinebase_Core
         }
         return self::get(self::CONFIG);
     }
-
+    
     /**
      * get max configured loglevel
      * 
@@ -1446,6 +1318,7 @@ class Tinebase_Core
             $logLevel = Tinebase_Log::getMaxLogLevel(isset($config->logger) ? $config->logger : NULL);
             self::set(self::LOGLEVEL, $logLevel);
         }
+        
         return $logLevel;
     }
     
@@ -1473,7 +1346,7 @@ class Tinebase_Core
         
         return self::get(self::LOGGER);
     }
-
+    
     /**
      * get cache from the registry
      *
@@ -1483,17 +1356,7 @@ class Tinebase_Core
     {
         return self::get(self::CACHE);
     }
-        
-    /**
-     * get session namespace from the registry
-     *
-     * @return Zend_Session_Namespace tinebase session namespace
-     */
-    public static function getSession()
-    {
-        return self::get(self::SESSION);
-    }
-
+    
     /**
      * get locale from the registry
      *
@@ -1588,7 +1451,7 @@ class Tinebase_Core
         
         return self::get(self::DBNAME);
     }
-
+    
     /**
      * get temp dir string (without PATH_SEP at the end)
      *
@@ -1598,47 +1461,6 @@ class Tinebase_Core
     {
         return self::get(self::TMPDIR);
     }
-
-    /**
-     * get session dir string (without PATH_SEP at the end)
-     *
-     * @return string
-     * 
-     * @todo remove obsolete session config paths in 2011-05
-     */
-    public static function getSessionDir()
-    {
-        $sessionDirName ='tine20_sessions';
-        $config = self::getConfig();
-        
-        $sessionDir = ($config->session && $config->session->path) ? $config->session->path : null;
-        
-        #####################################
-        # LEGACY/COMPATIBILITY: 
-        # (1) had to rename session.save_path key to sessiondir because otherwise the
-        # generic save config method would interpret the "_" as array key/value seperator
-        # (2) moved session config to subgroup 'session'
-        if (empty($sessionDir)) {
-            foreach (array('session.save_path', 'sessiondir') as $deprecatedSessionDir) {
-                $sessionDir = $config->get($deprecatedSessionDir, null);
-                if ($sessionDir) {
-                    self::getLogger()->warn(__METHOD__ . '::' . __LINE__ . " config.inc.php key '{$deprecatedSessionDir}' should be renamed to 'path' and moved to 'session' group.");
-                }
-            }
-        }
-        #####################################
-
-        if (empty($sessionDir) || !@is_writable($sessionDir)) {
-
-            $sessionDir = session_save_path();
-            if (empty($sessionDir) || !@is_writable($sessionDir)) {
-                $sessionDir = self::guessTempDir();
-            }
-
-            $sessionDir .= DIRECTORY_SEPARATOR . $sessionDirName;
-        }
-        return $sessionDir;
-    }
     
     /**
      * returns protocol + hostname
@@ -1679,7 +1501,7 @@ class Tinebase_Core
         }
         return self::get(self::SCHEDULER);
     }
-
+    
     /**
      * filter input string for database as some databases (looking at you, MySQL) can't cope with some chars
      * 
index 8c6c24b..50884fe 100644 (file)
@@ -327,7 +327,7 @@ class Tinebase_Frontend_Http extends Tinebase_Frontend_Http_Abstract
      */
     public function loginFromPost($username, $password)
     {
-        Tinebase_Core::startSession();
+        Tinebase_Core::startCoreSession();
         
         if (!empty($username)) {
             // try to login user
@@ -356,7 +356,7 @@ class Tinebase_Frontend_Http extends Tinebase_Frontend_Http_Abstract
         // authentication failed
         if ($success !== TRUE) {
             $_SESSION = array();
-            Zend_Session::destroy();
+            Tinebase_Session::destroyAndRemoveCookie();
             
             // redirect back to loginurl if needed
             $defaultUrl = ((isset($_SERVER['HTTP_REFERER']) || array_key_exists('HTTP_REFERER', $_SERVER))) ? $_SERVER['HTTP_REFERER'] : '';
@@ -388,7 +388,7 @@ class Tinebase_Frontend_Http extends Tinebase_Frontend_Http_Abstract
      */
     public function sessionException()
     {
-        Zend_Session::expireSessionCookie();
+        Tinebase_Session::expireSessionCookie();
         echo "
             <script type='text/javascript'>
                 window.location.href = window.location.href;
@@ -521,7 +521,7 @@ class Tinebase_Frontend_Http extends Tinebase_Frontend_Http_Abstract
     protected function _deliverChangedFiles($_fileType)
     {
         // close session to allow other requests
-        Zend_Session::writeClose(true);
+        Tinebase_Session::writeClose(true);
         
         $cacheId         = null;
         $clientETag      = null;
@@ -653,7 +653,7 @@ class Tinebase_Frontend_Http extends Tinebase_Frontend_Http_Abstract
             $this->checkAuth();
             
             // close session to allow other requests
-            Zend_Session::writeClose(true);
+            Tinebase_Session::writeClose(true);
         
             $tempFile = Tinebase_TempFile::getInstance()->uploadTempFile();
             
@@ -688,7 +688,7 @@ class Tinebase_Frontend_Http extends Tinebase_Frontend_Http_Abstract
         $this->checkAuth();
 
         // close session to allow other requests
-        Zend_Session::writeClose(true);
+        Tinebase_Session::writeClose(true);
         
         $clientETag      = null;
         $ifModifiedSince = null;
index fb5fcc2..d5afe07 100644 (file)
@@ -25,7 +25,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
      * @var boolean
      */
     protected $_hasCaptcha = null;
-
+    
     /**
      * wait for changes
      * 
@@ -33,11 +33,11 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
      */
     public function ping()
     {
-        Zend_Session::writeClose(true);
+        Tinebase_Session::writeClose(true);
         sleep(10);
         return array('changes' => 'contacts');
     }
-
+    
     /**
      * get list of translated country names
      * 
@@ -49,7 +49,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         return Tinebase_Translation::getCountryList();
     }
-
+    
     /**
      * returns list of all available translations
      *
@@ -58,14 +58,16 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function getAvailableTranslations()
     {
         $availableTranslations = Tinebase_Translation::getAvailableTranslations();
-        foreach($availableTranslations as &$info) unset($info['path']);
-
+        foreach($availableTranslations as &$info) {
+            unset($info['path']);
+        }
+        
         return array(
             'results'    => array_values($availableTranslations),
             'totalcount' => count($availableTranslations)
         );
     }
-
+    
     /**
      * sets locale
      *
@@ -78,17 +80,17 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         Tinebase_Core::setupUserLocale($localeString, $saveaspreference);
         $locale = Tinebase_Core::get('locale');
-
+        
         // save in cookie (expires in 365 days)
         if ($setcookie) {
             setcookie('TINE20LOCALE', $localeString, time()+60*60*24*365);
         }
-
+        
         return array(
             'success'      => TRUE
         );
     }
-
+    
     /**
      * sets timezone
      *
@@ -99,10 +101,10 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function setTimezone($timezoneString, $saveaspreference)
     {
         $timezone = Tinebase_Core::setupUserTimezone($timezoneString, $saveaspreference);
-
+        
         return $timezone;
     }
-
+    
     /**
      * get users
      *
@@ -119,7 +121,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
             'results'     => array(),
             'totalcount'  => 0
         );
-
+        
         if($rows = Tinebase_User::getInstance()->getUsers($filter, $sort, $dir, $start, $limit)) {
             $result['results']    = $rows->toArray();
             if($start == 0 && count($result['results']) < $limit) {
@@ -128,10 +130,10 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
                 //$result['totalcount'] = $backend->getCountByAddressbookId($addressbookId, $filter);
             }
         }
-
+        
         return $result;
     }
-
+    
     /**
      * Search for roles
      *
@@ -145,21 +147,21 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
             'results'     => array(),
             'totalcount'  => 0
         );
-
+        
         $filter = new Tinebase_Model_RoleFilter(array(
             'name'        => '%' . $filter[0]['value'] . '%',
             'description' => '%' . $filter[0]['value'] . '%'
         ));
-
+        
         $paging['sort'] = isset($paging['sort']) ? $paging['sort'] : 'name';
         $paging['dir'] = isset($paging['dir']) ? $paging['dir'] : 'ASC';
-
+        
         $result['results'] = Tinebase_Acl_Roles::getInstance()->searchRoles($filter, new Tinebase_Model_Pagination($paging))->toArray();
         $result['totalcount'] = Tinebase_Acl_Roles::getInstance()->searchCount($filter);
-
+        
         return $result;
     }
-
+    
     /**
      * change password of user
      *
@@ -172,7 +174,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         $response = array(
             'success'      => TRUE
         );
-
+        
         try {
             Tinebase_Controller::getInstance()->changePassword($oldPassword, $newPassword);
         } catch (Tinebase_Exception $e) {
@@ -181,10 +183,10 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
                 'errorMessage' => "New password could not be set! Error: " . $e->getMessage()
             );
         }
-
+        
         return $response;
     }
-
+    
     /**
      * clears state
      *
@@ -195,7 +197,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         Tinebase_State::getInstance()->clearState($name);
     }
-
+    
     /**
      * retuns all states
      *
@@ -205,7 +207,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         return Tinebase_State::getInstance()->loadStateInfo();
     }
-
+    
     /**
      * set state
      *
@@ -218,7 +220,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Setting state: {$name} -> {$value}");
         Tinebase_State::getInstance()->setState($name, $value);
     }
-
+    
     /**
      * adds a new personal tag
      *
@@ -228,7 +230,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function saveTag($tag)
     {
         $inTag = new Tinebase_Model_Tag($tag);
-
+        
         if (strlen($inTag->getId()) < 40) {
             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' creating tag: ' . print_r($inTag->toArray(), true));
             $outTag = Tinebase_Tags::getInstance()->createTag($inTag);
@@ -236,9 +238,10 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' updating tag: ' .print_r($inTag->toArray(), true));
             $outTag = Tinebase_Tags::getInstance()->updateTag($inTag);
         }
+        
         return $outTag->toArray();
     }
-
+    
     /**
      * Used for updating multiple records
      * 
@@ -271,13 +274,13 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         $filter = new Tinebase_Model_TagFilter($filter);
         $paging = new Tinebase_Model_Pagination($paging);
-
+        
         return array(
             'results'    => Tinebase_Tags::getInstance()->searchTags($filter, $paging)->toArray(),
             'totalCount' => Tinebase_Tags::getInstance()->getSearchTagsCount($filter)
         );
     }
-
+    
     /**
     * search tags by foreign filter
     *
@@ -288,14 +291,14 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function searchTagsByForeignFilter($filterData, $filterName)
     {
         $filter = $this->_getFilterGroup($filterData, $filterName);
-
+        
         $result = Tinebase_Tags::getInstance()->searchTagsByForeignFilter($filter)->toArray();
         return array(
             'results'    => $result,
             'totalCount' => count($result)
         );
     }
-
+    
     /**
      * get filter group defined by filterName and filterData
      *
@@ -313,23 +316,23 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
             Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' spoofing attempt detected, affected account: ' . print_r(Tinebase_Core::getUser()->toArray(), TRUE));
             die('go away!');
         }
-
+        
         if (! Tinebase_Core::getUser()->hasRight($appName, Tinebase_Acl_Rights_Abstract::RUN)) {
             throw new Tinebase_Exception_AccessDenied('No right to access application');
         }
-
+        
         $filterGroup = new $_filterName(array());
         if (! $filterGroup instanceof Tinebase_Model_Filter_FilterGroup) {
             Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' spoofing attempt detected, affected account: ' . print_r(Tinebase_Core::getUser()->toArray(), TRUE));
             die('go away!');
         }
-
+        
         // at this point we are sure request is save ;-)
         $filterGroup->setFromArray($_filterData);
-
+        
         return $filterGroup;
     }
-
+    
     /**
      * attach tag to multiple records identified by a filter
      *
@@ -342,11 +345,11 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         $this->_longRunningRequest();
         $filter = $this->_getFilterGroup($filterData, $filterName);
-
+        
         Tinebase_Tags::getInstance()->attachTagToMultipleRecords($filter, $tag);
         return array('success' => true);
     }
-
+    
     /**
      * detach tags to multiple records identified by a filter
      *
@@ -359,11 +362,11 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         $this->_longRunningRequest();
         $filter = $this->_getFilterGroup($filterData, $filterName);
-
+        
         Tinebase_Tags::getInstance()->detachTagsFromMultipleRecords($filter, $tag);
         return array('success' => true);
     }
-
+    
     /**
      * search / get notes
      * - used by activities grid
@@ -379,13 +382,13 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         
         $records = Tinebase_Notes::getInstance()->searchNotes($filter, $paging, /* ignoreACL = */ false);
         $result = $this->_multipleRecordsToJson($records);
-
+        
         return array(
             'results'       => $result,
             'totalcount'    => Tinebase_Notes::getInstance()->searchNotesCount($filter, /* ignoreACL = */ false)
         );
     }
-
+    
     /**
      * get note types
      *
@@ -394,13 +397,13 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         $noteTypes = Tinebase_Notes::getInstance()->getNoteTypes();
         $noteTypes->translate();
-
+        
         return array(
             'results'       => $noteTypes->toArray(),
             'totalcount'    => count($noteTypes)
         );
     }
-
+    
     /**
      * deletes tags identified by an array of identifiers
      *
@@ -423,7 +426,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function authenticate($username, $password)
     {
         $authResult = Tinebase_Auth::getInstance()->authenticate($username, $password);
-
+        
         if ($authResult->isValid()) {
             $response = array(
                 'status'    => 'success',
@@ -436,7 +439,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
                 'msg'       => 'authentication failed',
             );
         }
-
+        
         return $response;
     }
 
@@ -450,7 +453,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
      */
     public function login($username, $password, $securitycode = null)
     {
-        Tinebase_Core::startSession('tinebase');
+        Tinebase_Core::startCoreSession();
         
         if (is_array(($response = $this->_getCaptchaResponse($securitycode)))) {
             return $response;
@@ -495,10 +498,15 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         if ($this->_hasCaptcha()) {
             $config_count = Tinebase_Core::getConfig()->captcha->count;
             
-            $count = (isset($_SESSION['captcha']['count']) ? $_SESSION['captcha']['count'] : 1);
+            $count = (isset(Tinebase_Session::getSessionNamespace()->captcha['count'])
+                ? Tinebase_Session::getSessionNamespace()->captcha['count']
+                : 1
+            );
             
             if ($count >= $config_count) {
-                $aux = isset($_SESSION['captcha']['code']) ? $_SESSION['captcha']['code'] : null;
+                $aux = isset(Tinebase_Session::getSessionNamespace()->captcha['code'])
+                    ? Tinebase_Session::getSessionNamespace()->captcha['code']
+                    : null;
                 
                 if ($aux != $securitycode) {
                     $rets = Tinebase_Controller::getInstance()->makeCaptcha(); 
@@ -515,7 +523,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         
         return null;
     }
-        
+    
     /**
      *
      * @param string $username
@@ -558,13 +566,13 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         if ($this->_hasCaptcha()) {
             $config_count = Tinebase_Core::getConfig()->captcha->count;
             
-            if (!isset($_SESSION['captcha']['count'])) {
-                $_SESSION['captcha']['count'] = 1;
+            if (!isset(Tinebase_Session::getSessionNamespace()->captcha['count'])) {
+                Tinebase_Session::getSessionNamespace()->captcha['count'] = 1;
             } else {
-                $_SESSION['captcha']['count'] = $_SESSION['captcha']['count'] + 1;
+                Tinebase_Session::getSessionNamespace()->captcha['count'] = Tinebase_Session::getSessionNamespace()->captcha['count'] + 1;
             }
             
-            if ($_SESSION['captcha']['count'] >= $config_count) {
+            if (Tinebase_Session::getSessionNamespace()->captcha['count'] >= $config_count) {
                 $rets = Tinebase_Controller::getInstance()->makeCaptcha(); 
                 $response = array(
                     'success'      => false,
@@ -573,7 +581,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
                 );
             }
         } else {
-            Zend_Session::destroy(false,true);
+            Tinebase_Session::destroyAndMantainCookie();
         }
         
         return $response;
@@ -586,14 +594,14 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
      */
     protected function _setCredentialCacheCookie()
     {
-        if (Tinebase_Core::isRegistered(Tinebase_Core::USERCREDENTIALCACHE)) {
-            Tinebase_Auth_CredentialCache::getInstance()->getCacheAdapter()->setCache(Tinebase_Core::get(Tinebase_Core::USERCREDENTIALCACHE));
-        } else {
+        if (!Tinebase_Core::isRegistered(Tinebase_Core::USERCREDENTIALCACHE)) {
             Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' Something went wrong with the CredentialCache / no CC registered.');
             
             return false;
         }
-
+        
+        Tinebase_Auth_CredentialCache::getInstance()->getCacheAdapter()->setCache(Tinebase_Core::get(Tinebase_Core::USERCREDENTIALCACHE));
+        
         return true;
     }
 
@@ -610,16 +618,16 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         $oldCredentialCache = Tinebase_Core::get(Tinebase_Core::USERCREDENTIALCACHE);
         $credentialCache = Tinebase_Auth_CredentialCache::getInstance()->cacheCredentials(Tinebase_Core::getUser()->accountLoginName, $password);
         Tinebase_Core::set(Tinebase_Core::USERCREDENTIALCACHE, $credentialCache);
-
+        
         $success = $this->_setCredentialCacheCookie();
-
+        
         if ($success) {
             // close session to allow other requests
-            Zend_Session::writeClose(true);
+            Tinebase_Session::writeClose(true);
             $event = new Tinebase_Event_User_ChangeCredentialCache($oldCredentialCache);
             Tinebase_Event::fireEvent($event);
         }
-
+        
         return array(
             'success'      => $success
         );
@@ -636,17 +644,17 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         
         Tinebase_Auth_CredentialCache::getInstance()->getCacheAdapter()->resetCache();
         
-        if (Zend_Session::isStarted()) {
-            Zend_Session::destroy();
+        if (Tinebase_Session::isStarted()) {
+            Tinebase_Session::destroyAndRemoveCookie();
         }
-
+        
         $result = array(
             'success'=> true,
         );
-
+        
         return $result;
     }
-
+    
     /**
      * Returns registry data of tinebase.
      * @see Tinebase_Application_Json_Abstract
@@ -858,7 +866,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         
         return $registryData;
     }
-
+    
     /**
      * search / get custom field values
      *
@@ -871,9 +879,9 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         $result = $this->_search($filter, $paging, Tinebase_CustomField::getInstance(), 'Tinebase_Model_CustomField_ValueFilter');
         return $result;
     }
-
+    
     /************************ preferences functions ***************************/
-
+    
     /**
      * search preferences
      *
@@ -884,14 +892,14 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function searchPreferencesForApplication($applicationName, $filter)
     {
         $decodedFilter = is_array($filter) ? $filter : Zend_Json::decode($filter);
-
+        
         $filter = new Tinebase_Model_PreferenceFilter();
         if (! empty($decodedFilter)) {
             $filter->setFromArrayInUsersTimezone($decodedFilter);
         }
         $appId = Tinebase_Application::getInstance()->getApplicationByName($applicationName)->getId();
         $filter->addFilter($filter->createFilter(array('field'     => 'application_id',  'operator'  => 'equals', 'value'     => $appId)));
-
+        
         $backend = Tinebase_Core::getPreference($applicationName);
         if ($backend) {
             $records = $backend->search($filter);
@@ -902,7 +910,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
                 . ' ' . print_r($records->toArray(), TRUE));
             
             $result = $this->_multipleRecordsToJson($records, $filter);
-
+            
             // add translated labels and descriptions
             $translations = $backend->getTranslatedPreferences();
             foreach ($result as $key => $prefArray) {
@@ -928,13 +936,13 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         } else {
             $result = array();
         }
-
+        
         return array(
             'results'       => $result,
             'totalcount'    => count($result)
         );
     }
-
+    
     /**
      * save preferences for application
      *
@@ -947,17 +955,17 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function savePreferences($data, $adminMode)
     {
         $decodedData = is_array($data) ? $data : Zend_Json::decode($data);
-
+        
         $result = array();
         foreach ($decodedData as $applicationName => $data) {
-
+            
             if ($applicationName == 'Tinebase.UserProfile') {
                 $userProfileData = array();
                 foreach($data as $fieldName => $valueArray) {
                     $userProfileData[$fieldName] = $valueArray['value'];
                 }
                 $this->updateUserProfile($userProfileData);
-
+                
             } else {
                 $backend = Tinebase_Core::getPreference($applicationName);
                 if ($backend !== NULL) {
@@ -974,7 +982,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
                 }
             }
         }
-
+        
         return array(
             'status'    => 'success',
             'results'   => $result
@@ -991,18 +999,18 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         // NOTE: $userProfile is a contact where non readable fields are clearad out!
         $userProfile = Tinebase_UserProfile::getInstance()->get($userId);
-
+        
         // NOTE: This hurts! We don't have methods to call in our frontends yet which convert
         //       a record to the json representaion :( Thus image link will be broken!
         $userProfile->setTimezone(Tinebase_Core::get(Tinebase_Core::USERTIMEZONE));
-
+        
         return array(
             'userProfile'      => $userProfile->toArray(),
             'readableFields'   => Tinebase_UserProfile::getInstance()->getReadableFields(),
             'updateableFields' => Tinebase_UserProfile::getInstance()->getUpdateableFields(),
         );
     }
-
+    
     /**
      * update user profile
      *
@@ -1013,16 +1021,16 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         $contact = new Addressbook_Model_Contact(array(), TRUE);
         $contact->setFromJsonInUsersTimezone($profileData);
-
+        
         // NOTE: $userProfile is a contact where non readable fields are clearad out!
         $userProfile = Tinebase_UserProfile::getInstance()->update($contact);
-
+        
         // NOTE: This hurts! We don't have methods to call in our frontends yet which convert
         //       a record to the json representaion :( Thus image link will be broken!
         $userProfile->setTimezone(Tinebase_Core::get(Tinebase_Core::USERTIMEZONE));
         return $userProfile->toArray();
     }
-
+    
     /**
      * dummy function to measure speed of framework initialization
      */
@@ -1030,7 +1038,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         return array();
     }
-
+    
     /**
      * gets the userProfile config
      *
@@ -1044,7 +1052,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
             'updateableFields' => array_values(Tinebase_UserProfile::getInstance()->getUpdateableFields()),
         );
     }
-
+    
     /**
      * saves userProfile config
      *
@@ -1055,7 +1063,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         Tinebase_UserProfile::getInstance()->setReadableFields($configData['readableFields']);
         Tinebase_UserProfile::getInstance()->setUpdateableFields($configData['updateableFields']);
     }
-
+    
     /**
      * switch to another user's account
      * 
@@ -1071,7 +1079,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     }
     
     /************************ department functions **************************/
-
+    
     /**
      * search / get departments
      *
@@ -1084,9 +1092,9 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         $result = $this->_search($filter, $paging, Tinebase_Department::getInstance(), 'Tinebase_Model_DepartmentFilter');
         return $result;
     }
-
+    
     /************************ config functions ******************************/
-
+    
     /**
      * get config settings for application
      *
@@ -1097,13 +1105,13 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     {
         $controllerName = $id . '_Controller';
         $appController = Tinebase_Controller_Abstract::getController($controllerName);
-
+        
         return array(
             'id'        => $id,
             'settings'  => $appController->getConfigSettings(TRUE),
         );
     }
-
+    
     /**
      * save application config
      *
@@ -1113,16 +1121,16 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     public function saveConfig($recordData)
     {
         //if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . print_r($recordData, TRUE));
-
+        
         $controllerName = $recordData['id'] . '_Controller';
         $appController = Tinebase_Controller_Abstract::getController($controllerName);
         $appController->saveConfigSettings($recordData['settings']);
-
+        
         return $this->getConfig($recordData['id']);
     }
-
+    
     /************************ tempFile functions ******************************/
-
+    
     /**
      * joins all given tempfiles in given order to a single new tempFile
      *
@@ -1137,14 +1145,14 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
             $record->setFromJsonInUsersTimezone($tempFileData);
             $tempFileRecords->addRecord($record);
         }
-
+        
         $joinedTempFile = Tinebase_TempFile::getInstance()->joinTempFiles($tempFileRecords);
-
+        
         return $joinedTempFile->toArray();
     }
-
+    
     /************************ protected functions ***************************/
-
+    
     /**
      * returns multiple records prepared for json transport
      *
@@ -1158,7 +1166,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         if (count($_records) == 0) {
             return array();
         }
-
+        
         switch ($_records->getRecordClassName()) {
             case 'Tinebase_Model_Preference':
                 $accountFilterArray = $_filter->getFilter('account')->toArray();
@@ -1175,7 +1183,7 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
                 }
                 break;
         }
-
+        
         $result = parent::_multipleRecordsToJson($_records, $_filter, $_pagination);
         return $result;
     }
@@ -1195,40 +1203,40 @@ class Tinebase_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         $recordClassName = $appName . '_Model_' . $modelName;
         $controller      = Tinebase_Core::getApplicationInstance($appName, $modelName);
         $filterClassName = $recordClassName . 'Filter';
-    
+        
         if (! class_exists($recordClassName)) {
             throw new Tinebase_Exception_InvalidArgument('A record class for the given appName and modelName does not exist!');
         }
-    
+        
         if (! $controller) {
             throw new Tinebase_Exception_InvalidArgument('A controller for the given appName and modelName does not exist!');
         }
-    
+        
         if (! class_exists($filterClassName)) {
             throw new Tinebase_Exception_InvalidArgument('A filter for the given appName and modelName does not exist!');
         }
-    
+        
         if (! in_array($property, $recordClassName::getAutocompleteFields())) {
             throw new Tinebase_Exception_UnexpectedValue('bad property name');
         }
-    
+        
         $filter = new $filterClassName(array(
             array('field' => $property, 'operator' => 'startswith', 'value' => $startswith),
         ));
-    
+        
         $paging = new Tinebase_Model_Pagination(array('sort' => $property));
-    
+        
         $values = array_unique($controller->search($filter, $paging)->{$property});
-    
+        
         $result = array(
             'results'   => array(),
             'totalcount' => count($values)
         );
-    
+        
         foreach($values as $value) {
             $result['results'][] = array($property => $value);
         }
-    
+        
         return $result;
     }
 }
index 619793c..f2a6040 100644 (file)
@@ -319,7 +319,7 @@ abstract class Tinebase_Frontend_Json_Abstract extends Tinebase_Frontend_Abstrac
     {
         $oldMaxExcecutionTime = Tinebase_Core::setExecutionLifeTime(0);
         // close session to allow other requests
-        Zend_Session::writeClose(true);
+        Tinebase_Session::writeClose(true);
         
         return $oldMaxExcecutionTime;
     }
index 82a85e1..72023ee 100644 (file)
@@ -32,7 +32,7 @@ class Tinebase_OpenId_Provider_User_Tine20 extends Zend_OpenId_Provider_User
      */
     public function __construct(Zend_Session_Namespace $session = null)
     {
-        $this->_sessionNameSpace = new Zend_Session_Namespace("openid");
+        $this->_sessionNameSpace = Tinebase_OpenId_Session::getSessionNamespace();
     }
 
     /**
diff --git a/tine20/Tinebase/OpenId/Session.php b/tine20/Tinebase/OpenId/Session.php
new file mode 100644 (file)
index 0000000..0f5907e
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     OpenId
+ * @subpackage  Session
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Guilherme Striquer Bisotto <guilherme.bisotto@serpro.gov.br>
+ * @copyright   Copyright (c) 2014-2014 Metaways Infosystems GmbH (http://www.metaways.de)
+ * 
+ */
+
+/**
+ * class for Session and Session Namespaces in Core
+ * 
+ * @package     OpenId
+ * @subpackage  Session
+ */
+class Tinebase_OpenId_Session extends Tinebase_Session_Abstract
+{
+    /**
+     * Session namespace for OpenId
+     */
+    const NAMESPACE_NAME = 'Tinebase_OpenId_Session_Namespace';
+}
\ No newline at end of file
index 62b211d..0fa8499 100644 (file)
@@ -353,7 +353,7 @@ class Tinebase_Preference extends Tinebase_Preference_Abstract
                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Using default (' . $value . ') for ' . $name);
             }
             
-            $session = Tinebase_Core::get(Tinebase_Core::SESSION);
+            $session = Tinebase_Core::get(Tinebase_Session::SESSION);
             
             switch ($name) {
                 case Tinebase_Preference::LOCALE:
index 091fff3..0f306bb 100644 (file)
@@ -40,16 +40,16 @@ class Tinebase_Server_Http extends Tinebase_Server_Abstract implements Tinebase_
         try {
             try {
                 Tinebase_Core::initFramework();
-            } catch (Zend_Session_Exception $zse) {
+            } catch (Tinebase_Session_Exception $zse) {
                 // expire session cookie on client
-                Zend_Session::expireSessionCookie();
+                Tinebase_Session::expireSessionCookie();
             }
             
             if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ .' Is HTTP request. method: ' . $this->getRequestMethod());
             if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ .' REQUEST: ' . print_r($_REQUEST, TRUE));
             
             // register addidional HTTP apis only available for authorised users
-            if (Zend_Session::isStarted() && Zend_Auth::getInstance()->hasIdentity()) {
+            if (Tinebase_Session::isStarted() && Zend_Auth::getInstance()->hasIdentity()) {
                 if (empty($_REQUEST['method'])) {
                     $_REQUEST['method'] = 'Tinebase.mainScreen';
                 }
@@ -71,9 +71,9 @@ class Tinebase_Server_Http extends Tinebase_Server_Abstract implements Tinebase_
                 }
                 
                 // sessionId got send by client, but we don't use sessions for non authenticated users
-                if (Zend_Session::sessionExists()) {
+                if (Tinebase_Session::sessionExists()) {
                     // expire session cookie on client
-                    Zend_Session::expireSessionCookie();
+                    Tinebase_Session::expireSessionCookie();
                 }
             }
             
index 9eba14c..b2193d4 100644 (file)
@@ -68,11 +68,11 @@ class Tinebase_Server_Json extends Tinebase_Server_Abstract implements Tinebase_
             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ .' initFramework exception: ' . $exception);
             
             // handle all kind of session exceptions as 'Not Authorised'
-            if ($exception instanceof Zend_Session_Exception) {
+            if ($exception instanceof Tinebase_Session_Exception) {
                 $exception = new Tinebase_Exception_AccessDenied('Not Authorised', 401);
                 
                 // expire session cookie for client
-                Zend_Session::expireSessionCookie();
+                Tinebase_Session::expireSessionCookie();
             }
         }
         
@@ -210,7 +210,7 @@ class Tinebase_Server_Json extends Tinebase_Server_Abstract implements Tinebase_
             $classes['Tinebase_Frontend_Json'] = 'Tinebase';
             
             // register additional Json apis only available for authorised users
-            if (Zend_Session::isStarted() && Zend_Auth::getInstance()->hasIdentity()) {
+            if (Tinebase_Session::isStarted() && Zend_Auth::getInstance()->hasIdentity()) {
                 
                 $applicationParts = explode('.', $method);
                 $applicationName = ucfirst($applicationParts[0]);
@@ -338,22 +338,22 @@ class Tinebase_Server_Json extends Tinebase_Server_Abstract implements Tinebase_
             'Tinebase.getTranslations',
             'Tinebase.setLocale'
         );
+        
         // check json key for all methods but some exceptions
-        if ( !(in_array($method, $anonymnousMethods))
-                && $jsonKey != Tinebase_Core::get('jsonKey')) {
+        if ( !(in_array($method, $anonymnousMethods)) && $jsonKey !== Tinebase_Core::get('jsonKey')) {
         
             if (! Tinebase_Core::isRegistered(Tinebase_Core::USER)) {
-                Tinebase_Core::getLogger()->INFO(__METHOD__ . '::' . __LINE__ . ' Attempt to request a privileged Json-API method (' . $method . ') without authorisation from "' . $_SERVER['REMOTE_ADDR'] . '". (session timeout?)');
-                
-                throw new Tinebase_Exception_AccessDenied('Not Authorised', 401);
+                Tinebase_Core::getLogger()->INFO(__METHOD__ . '::' . __LINE__ .
+                    ' Attempt to request a privileged Json-API method (' . $method . ') without authorisation from "' .
+                    $_SERVER['REMOTE_ADDR'] . '". (session timeout?)');
             } else {
                 Tinebase_Core::getLogger()->WARN(__METHOD__ . '::' . __LINE__ . ' Fatal: got wrong json key! (' . $jsonKey . ') Possible CSRF attempt!' .
                     ' affected account: ' . print_r(Tinebase_Core::getUser()->toArray(), true) .
                     ' request: ' . print_r($_REQUEST, true)
                 );
-                
-                throw new Tinebase_Exception_AccessDenied('Not Authorised', 401);
             }
+            
+            throw new Tinebase_Exception_AccessDenied('Not Authorised', 401);
         }
     }
     
diff --git a/tine20/Tinebase/Session.php b/tine20/Tinebase/Session.php
new file mode 100644 (file)
index 0000000..fa813b2
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Tinebase
+ * @subpackage  Session
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Guilherme Striquer Bisotto <guilherme.bisotto@serpro.gov.br>
+ * @copyright   Copyright (c) 2014-2014 Metaways Infosystems GmbH (http://www.metaways.de)
+ * 
+ */
+
+/**
+ * class for Session and Session Namespaces in Core
+ * 
+ * @package     Tinebase
+ * @subpackage  Session
+ */
+class Tinebase_Session extends Tinebase_Session_Abstract
+{
+    /**
+     * Session namespace for Tinebase Core data
+     */
+    const NAMESPACE_NAME = 'Tinebase_Core_Session_Namespace';
+    
+    /**
+     * initializes the session
+     */
+    public static function setupSession()
+    {
+        self::setSessionOptions(array(
+            'name' => 'TINE20SESSID'
+        ));
+        self::setSessionBackend();
+    }
+    
+    /**
+     * Register Validator for Http User Agent
+     */
+    public static function registerValidatorHttpUserAgent()
+    {
+        Zend_Session::registerValidator(new Zend_Session_Validator_HttpUserAgent());
+    }
+    
+    /**
+     * Register Validator for Ip Address
+     */
+    public static function registerValidatorIpAddress()
+    {
+        Zend_Session::registerValidator(new Zend_Session_Validator_IpAddress());
+    }
+}
\ No newline at end of file
diff --git a/tine20/Tinebase/Session/Abstract.php b/tine20/Tinebase/Session/Abstract.php
new file mode 100644 (file)
index 0000000..c2e5759
--- /dev/null
@@ -0,0 +1,309 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Tinebase
+ * @subpackage  Session
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Guilherme Striquer Bisotto <guilherme.bisotto@serpro.gov.br>
+ * @copyright   Copyright (c) 2014-2014 Metaways Infosystems GmbH (http://www.metaways.de)
+ * 
+ */
+
+/**
+ * Abstract class for Session and Session Namespaces
+ * 
+ * @package     Tinebase
+ * @subpackage  Session
+ */
+abstract class Tinebase_Session_Abstract extends Zend_Session_Namespace
+{
+    /**
+     * Default session directory name
+     */
+    const SESSION_DIR_NAME = 'tine20_sessions';
+    
+    /**
+     * constant for session namespace (tinebase) registry index
+     */
+    const SESSION = 'session';
+    
+    /**
+     * get a value from the registry
+     *
+     */
+    protected static function get($index)
+    {
+        return (Zend_Registry::isRegistered($index)) ? Zend_Registry::get($index) : NULL;
+    }
+    
+    /**
+     * set a registry value
+     *
+     * @return mixed value
+     */
+    protected static function set($index, $value)
+    {
+        Zend_Registry::set($index, $value);
+    }
+    
+    /**
+     * Create a session namespace or return an existing one
+     *
+     * @param unknown $_namespace
+     * @throws Exception
+     * @return Zend_Session_Namespace
+     */
+    protected static function _getSessionNamespace($_namespace)
+    {
+        $sessionNamespace = self::get($_namespace);
+        
+        if ($sessionNamespace == null) {
+            try {
+                $sessionNamespace = new Zend_Session_Namespace($_namespace);
+                self::set($_namespace, $sessionNamespace);
+            } catch (Exception $e) {
+                self::expireSessionCookie();
+                throw $e;
+            }
+        }
+        
+        return $sessionNamespace;
+    }
+    
+    /**
+     * Zend_Session::sessionExists encapsulation
+     *
+     * @return boolean
+     */
+    public static function sessionExists()
+    {
+        return Zend_Session::sessionExists();
+    }
+    
+    /**
+     * Zend_Session::isStarted encapsulation
+     *
+     * @return boolean
+     */
+    public static function isStarted()
+    {
+        return Zend_Session::isStarted();
+    }
+    
+    /**
+     * Destroy session and remove cookie
+     */
+    public static function destroyAndRemoveCookie()
+    {
+        Zend_Session::destroy(true, true);
+    }
+    
+    /**
+     * Destroy session but not remove cookie
+     */
+    public static function destroyAndMantainCookie()
+    {
+        Zend_Session::destroy(false, true);
+    }
+    
+    /**
+     * Zend_Session::writeClose encapsulation
+     *
+     * @param string $readonly
+     */
+    public static function writeClose($readonly = true)
+    {
+        Zend_Session::writeClose($readonly);
+    }
+    
+    /**
+     * Zend_Session::isWritable encapsulation
+     *
+     * @return boolean
+     */
+    public static function isWritable()
+    {
+        return Zend_Session::isWritable();
+    }
+    
+    /**
+     * Zend_Session::getId encapsulation
+     *
+     * @return string
+     */
+    public static function getId()
+    {
+        return Zend_Session::getId();
+    }
+    
+    /**
+     * Zend_Session::expireSessionCookie encapsulation
+     */
+    public static function expireSessionCookie()
+    {
+        Zend_Session::expireSessionCookie();
+    }
+    
+    /**
+     * Zend_Session::regenerateId encapsulation
+     */
+    public static function regenerateId()
+    {
+       Zend_Session::regenerateId();
+    }
+    
+    /**
+     * get session dir string (without PATH_SEP at the end)
+     *
+     * @return string
+     */
+    public static function getSessionDir()
+    {
+        $config = Tinebase_Core::getConfig();
+        $sessionDir = ($config->session && $config->session->path)
+            ? $config->session->path
+            : null;
+        
+        if (empty($sessionDir) || !@is_writable($sessionDir)) {
+            $sessionDir = session_save_path();
+            if (empty($sessionDir) || !@is_writable($sessionDir)) {
+                $sessionDir = Tinebase_Core::guessTempDir();
+            }
+            
+            $sessionDirName = self::SESSION_DIR_NAME;
+            $sessionDir .= DIRECTORY_SEPARATOR . $sessionDirName;
+        }
+        
+        return $sessionDir;
+    }
+    
+    /**
+     * set session backend
+     */
+    public static function setSessionBackend()
+    {
+        $config = Tinebase_Core::getConfig();
+        $backendType = ($config->session && $config->session->backend) ? ucfirst($config->session->backend) : 'File';
+        $maxLifeTime = ($config->session && $config->session->lifetime) ? $config->session->lifetime : 86400; // one day is default
+        
+        switch ($backendType) {
+            case 'File':
+                if ($config->gc_maxlifetime) {
+                    Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . " config.inc.php key 'gc_maxlifetime' should be renamed to 'lifetime' and moved to 'session' group.");
+                    $maxLifeTime = $config->get('gc_maxlifetime', 86400);
+                }
+                
+                Zend_Session::setOptions(array(
+                    'gc_maxlifetime'     => $maxLifeTime
+                ));
+                
+                $sessionSavepath = self::getSessionDir();
+                if (ini_set('session.save_path', $sessionSavepath) !== FALSE) {
+                    if (!is_dir($sessionSavepath)) {
+                        mkdir($sessionSavepath, 0700);
+                    }
+                }
+                
+                $lastSessionCleanup = Tinebase_Config::getInstance()->get(Tinebase_Config::LAST_SESSIONS_CLEANUP_RUN);
+                if ($lastSessionCleanup instanceof DateTime && $lastSessionCleanup > Tinebase_DateTime::now()->subHour(2)) {
+                    Zend_Session::setOptions(array(
+                        'gc_probability' => 0,
+                        'gc_divisor'     => 100
+                    ));
+                } else if (@opendir(ini_get('session.save_path')) !== FALSE) {
+                    Zend_Session::setOptions(array(
+                        'gc_probability' => 1,
+                        'gc_divisor'     => 100
+                    ));
+                } else {
+                    Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . " Unable to initialize automatic session cleanup. Check permissions to " . ini_get('session.save_path'));
+                }
+                
+                break;
+                
+            case 'Redis':
+                
+                $host   = ($config->session->host) ? $config->session->host : 'localhost';
+                $port   = ($config->session->port) ? $config->session->port : 6379;
+                $prefix = Tinebase_Application::getInstance()->getApplicationByName('Tinebase')->getId() . '_SESSION_';
+                
+                Zend_Session::setOptions(array(
+                    'gc_maxlifetime' => $maxLifeTime,
+                    'save_handler'   => 'redis',
+                    'save_path'      => "tcp://$host:$port?prefix=$prefix"
+                ));
+                
+                break;
+                
+            default:
+                break;
+        }
+        
+        Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . " Session of backend type '{$backendType}' configured.");
+    }
+
+    /**
+     * set session options
+     *
+     * @param array $_options
+     */
+    public static function setSessionOptions($_options = array())
+    {
+        $array_options = array_merge($_options,
+                                     array(
+                                        'cookie_httponly' => true,
+                                        'hash_function'   => 1
+                                     )
+        );
+        Zend_Session::setOptions($array_options);
+        
+        if (isset($_SERVER['REQUEST_URI'])) {
+            // cut of path behind caldav/webdav (removeme when dispatching is refactored)
+            if (isset($_SERVER['REDIRECT_WEBDAV']) && $_SERVER['REDIRECT_WEBDAV'] == 'true') {
+                $decodedUri = Sabre_DAV_URLUtil::decodePath($_SERVER['REQUEST_URI']);
+                $baseUri = '/' . substr($decodedUri, 0, strpos($decodedUri, 'webdav/') + strlen('webdav/'));
+            } else if (isset($_SERVER['REDIRECT_CALDAV']) && $_SERVER['REDIRECT_CALDAV'] == 'true') {
+                $decodedUri = Sabre_DAV_URLUtil::decodePath($_SERVER['REQUEST_URI']);
+                $baseUri = '/' . substr($decodedUri, 0, strpos($decodedUri, 'caldav/') + strlen('caldav/'));
+            } else {
+                $baseUri = dirname($_SERVER['REQUEST_URI']);
+            }
+            
+            if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
+                $baseUri = '/' . $_SERVER['HTTP_HOST'] . (($baseUri == '/') ? '' : $baseUri);
+            }
+            
+            // fix for windows server with backslash directory separator
+            $baseUri = str_replace(DIRECTORY_SEPARATOR, '/', $baseUri);
+            
+            Zend_Session::setOptions(array(
+                'cookie_path'     => $baseUri
+            ));
+        }
+        
+        if (!empty($_SERVER['HTTPS']) && strtoupper($_SERVER['HTTPS']) != 'OFF') {
+            Zend_Session::setOptions(array(
+                'cookie_secure'     => true
+            ));
+        }
+    }
+    
+    /**
+     * Gets Tinebase User session namespace
+     *
+     * @throws Exception
+     * @return Ambigous <Zend_Session_Namespace, NULL, mixed>
+     */
+    public static function getSessionNamespace()
+    {
+        try {
+           return self::_getSessionNamespace(static::NAMESPACE_NAME);
+           
+        } catch(Exception $e) {
+            Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' Session error: ' . $e->getMessage());
+            Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $e->getTraceAsString());
+            throw $e;
+        }
+    }
+}
\ No newline at end of file
diff --git a/tine20/Tinebase/User/Session.php b/tine20/Tinebase/User/Session.php
new file mode 100644 (file)
index 0000000..578cae9
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Tinebase
+ * @subpackage  User
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Guilherme Striquer Bisotto <guilherme.bisotto@serpro.gov.br>
+ * @copyright   Copyright (c) 2014-2014 Metaways Infosystems GmbH (http://www.metaways.de)
+ * 
+ */
+
+/**
+ * class for Session and Session Namespaces for Tinebase_User
+ * 
+ * @package     Tinebase
+ * @subpackage  User
+ */
+class Tinebase_User_Session extends Tinebase_Session_Abstract
+{
+    /**
+     * Tinebase User Session Namespace
+     */
+    const NAMESPACE_NAME = 'Tinebase_User_Session_Namespace';
+}
\ No newline at end of file
index 2fa9b84..11c05e8 100644 (file)
@@ -25,9 +25,9 @@ class Voipmanager_Server_Snom implements Tinebase_Server_Interface
      */
     public function handle()
     {
-        Tinebase_Core::setSessionOptions(array(\r
-            'use_cookies'      => 0,\r
-            'use_only_cookies' => 0\r
+        Tinebase_Session::setSessionOptions(array(
+            'use_cookies'      => 0,
+            'use_only_cookies' => 0
         ));\r
         
         Tinebase_Core::initFramework();