From 64312ecedc7b4290d560ce827c263b1e8da11b92 Mon Sep 17 00:00:00 2001 From: Michael M Slusarz Date: Wed, 17 Nov 2010 14:53:11 -0700 Subject: [PATCH] Have SyncML use Horde_Session --- framework/SyncML/SyncML.php | 12 ++++------ framework/SyncML/SyncML/Backend.php | 11 +++++++--- framework/SyncML/SyncML/Backend/Horde.php | 11 ++++++++-- framework/SyncML/SyncML/Command/Alert.php | 3 ++- framework/SyncML/SyncML/Command/Final.php | 2 +- framework/SyncML/SyncML/Command/Get.php | 2 +- framework/SyncML/SyncML/Command/Map.php | 2 +- framework/SyncML/SyncML/Command/Put.php | 2 +- framework/SyncML/SyncML/Command/Status.php | 2 +- framework/SyncML/SyncML/Command/Sync.php | 6 ++--- framework/SyncML/SyncML/Command/SyncHdr.php | 33 ++++++++++++++-------------- framework/SyncML/SyncML/Device.php | 2 +- framework/SyncML/SyncML/Device/Nokia.php | 2 +- framework/SyncML/SyncML/Device/P800.php | 2 +- framework/SyncML/SyncML/Device/Sync4j.php | 4 ++-- framework/SyncML/SyncML/Device/Synthesis.php | 4 ++-- framework/SyncML/SyncML/Sync.php | 9 ++++---- framework/SyncML/SyncML/XMLOutput.php | 21 +++++++++--------- framework/SyncML/tests/testpacket.php | 6 ++--- 19 files changed, 72 insertions(+), 64 deletions(-) diff --git a/framework/SyncML/SyncML.php b/framework/SyncML/SyncML.php index af148e067..bcbe842b0 100644 --- a/framework/SyncML/SyncML.php +++ b/framework/SyncML/SyncML.php @@ -1,11 +1,7 @@ setupState(); - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; $state->wbxml = $this->_xmlWriter->isWBXML(); /* Check auth. */ @@ -459,7 +455,7 @@ class SyncML_ContentHandler { { global $messageFull; - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; /* If there's pending sync data and space left in the message, send * data now. */ diff --git a/framework/SyncML/SyncML/Backend.php b/framework/SyncML/SyncML/Backend.php index f98de3d5f..9db4999a7 100644 --- a/framework/SyncML/SyncML/Backend.php +++ b/framework/SyncML/SyncML/Backend.php @@ -188,6 +188,13 @@ define ('SYNCML_BACKENDMODE_TEST', 3); class SyncML_Backend { /** + * The State object. + * + * @var SyncML_State + */ + var $state; + + /** * The concatenated log messages. * * @var string @@ -387,10 +394,8 @@ class SyncML_Backend { /** * Is called after the SyncML_State object has been set up, either * restored from the session, or freshly created. - * - * @param SyncML_State The current state object. */ - function setupState(&$state) + function setupState() { } diff --git a/framework/SyncML/SyncML/Backend/Horde.php b/framework/SyncML/SyncML/Backend/Horde.php index 9726acc1e..0aa22d4ee 100644 --- a/framework/SyncML/SyncML/Backend/Horde.php +++ b/framework/SyncML/SyncML/Backend/Horde.php @@ -61,15 +61,22 @@ class SyncML_Backend_Horde extends SyncML_Backend { $backendMode = SYNCML_BACKENDMODE_SERVER) { $this->_backendMode = $backendMode; + $this->_syncDeviceID = $syncDeviceID; /* Only the server needs to start a session. */ if ($this->_backendMode == SYNCML_BACKENDMODE_SERVER) { /* Reload the Horde SessionHandler if necessary. */ - $GLOBALS['session'] = new Horde_Session(); $GLOBALS['session']->setup(false); + $this->state = $GLOBALS['session']->get('horde', 'syncml'); + register_shutdown_function(array($this, 'sessionShutdown')); } + } - parent::sessionStart($syncDeviceID, $sessionId, $backendMode); + function sessionShutdown() + { + if ($this->state) { + $GLOBALS['session']->set('horde', 'syncml', $this->state); + } } /** diff --git a/framework/SyncML/SyncML/Command/Alert.php b/framework/SyncML/SyncML/Command/Alert.php index 6e1a26af2..ea945b6af 100644 --- a/framework/SyncML/SyncML/Command/Alert.php +++ b/framework/SyncML/SyncML/Command/Alert.php @@ -117,7 +117,8 @@ class SyncML_Command_Alert extends SyncML_Command { */ function handleCommand($debug = false) { - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; + // Handle unauthenticated first. if (!$state->authenticated) { $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName, diff --git a/framework/SyncML/SyncML/Command/Final.php b/framework/SyncML/SyncML/Command/Final.php index 8be2be98b..939fe4070 100644 --- a/framework/SyncML/SyncML/Command/Final.php +++ b/framework/SyncML/SyncML/Command/Final.php @@ -33,7 +33,7 @@ class SyncML_Command_Final extends SyncML_Command { */ function handleCommand($debug = false) { - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; // If the client hasn't sent us device info, request it now. // @todo: only do this once, not in every msg if the client does not diff --git a/framework/SyncML/SyncML/Command/Get.php b/framework/SyncML/SyncML/Command/Get.php index 6f72fdfca..8c20dd084 100644 --- a/framework/SyncML/SyncML/Command/Get.php +++ b/framework/SyncML/SyncML/Command/Get.php @@ -34,7 +34,7 @@ class SyncML_Command_Get extends SyncML_Command { */ function handleCommand($debug = false) { - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; // Create status response. $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName, diff --git a/framework/SyncML/SyncML/Command/Map.php b/framework/SyncML/SyncML/Command/Map.php index bfe16bc6b..914f2ba3f 100644 --- a/framework/SyncML/SyncML/Command/Map.php +++ b/framework/SyncML/SyncML/Command/Map.php @@ -97,7 +97,7 @@ class SyncML_Command_Map extends SyncML_Command { function handleCommand($debug = false) { if (!$debug && $this->_mapSources) { - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; $sync = &$state->getSync($this->_targetLocURI); if (!$state->authenticated) { $GLOBALS['backend']->logMessage( diff --git a/framework/SyncML/SyncML/Command/Put.php b/framework/SyncML/SyncML/Command/Put.php index 738368dbb..6551e6266 100644 --- a/framework/SyncML/SyncML/Command/Put.php +++ b/framework/SyncML/SyncML/Command/Put.php @@ -247,7 +247,7 @@ class SyncML_Command_Put extends SyncML_Command { */ function handleCommand($debug = false) { - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; // Store received data. $state->deviceInfo = $this->_devinf; diff --git a/framework/SyncML/SyncML/Command/Status.php b/framework/SyncML/SyncML/Command/Status.php index be8a52a87..0757a1e8c 100644 --- a/framework/SyncML/SyncML/Command/Status.php +++ b/framework/SyncML/SyncML/Command/Status.php @@ -108,7 +108,7 @@ class SyncML_Command_Status extends SyncML_Command { break; case 1: - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; switch ($this->_Cmd) { case 'Replace': case 'Add': diff --git a/framework/SyncML/SyncML/Command/Sync.php b/framework/SyncML/SyncML/Command/Sync.php index dd7c1f3c7..e1bf14dbb 100644 --- a/framework/SyncML/SyncML/Command/Sync.php +++ b/framework/SyncML/SyncML/Command/Sync.php @@ -124,7 +124,7 @@ class SyncML_Command_Sync extends SyncML_Command { function startElement($uri, $element, $attrs) { parent::startElement($uri, $element, $attrs); - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; switch (count($this->_stack)) { case 2: @@ -183,7 +183,7 @@ class SyncML_Command_Sync extends SyncML_Command { case 'Item': if ($this->_itemMoreData) { // Store to continue in next session. - $_SESSION['SyncML.state']->curSyncItem = $this->_curItem; + $GLOBALS['backend']->state->curSyncItem = $this->_curItem; } else { // Finished. Store to syncElements[]. if (empty($this->_curItem->contentType)) { @@ -268,7 +268,7 @@ class SyncML_Command_Sync extends SyncML_Command { */ function handleCommand($debug = false) { - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; // Handle unauthenticated first. if (!$state->authenticated) { diff --git a/framework/SyncML/SyncML/Command/SyncHdr.php b/framework/SyncML/SyncML/Command/SyncHdr.php index 69184122c..2db6a1ab9 100644 --- a/framework/SyncML/SyncML/Command/SyncHdr.php +++ b/framework/SyncML/SyncML/Command/SyncHdr.php @@ -185,31 +185,30 @@ class SyncML_Command_SyncHdr extends SyncML_Command { */ function setupState() { - $GLOBALS['backend']->sessionStart($this->_sourceURI, - $this->_sessionID); + global $backend; - if (!isset($_SESSION['SyncML.state'])) { - $GLOBALS['backend']->logMessage( + $backend->sessionStart($this->_sourceURI, $this->_sessionID); + + if (!$backend->state) { + $backend->logMessage( 'New session created: ' . session_id(), 'DEBUG'); - $_SESSION['SyncML.state'] = new SyncML_State($this->_sourceURI, - $this->user, - $this->_sessionID); + $backend->state = new SyncML_State($this->_sourceURI, + $this->user, + $this->_sessionID); } else { - $GLOBALS['backend']->logMessage( - 'Existing session continued: ' . session_id(), 'DEBUG'); + $backend->logMessage('Existing session continued: ' . session_id(), 'DEBUG'); } - $state = &$_SESSION['SyncML.state']; - $state->setVersion($this->_version); - $state->messageID = $this->_message; - $state->targetURI = $this->_targetURI; - $state->sourceURI = $this->_sourceURI; - $state->sessionID = $this->_sessionID; + $backend->state->setVersion($this->_version); + $backend->state->messageID = $this->_message; + $backend->state->targetURI = $this->_targetURI; + $backend->state->sourceURI = $this->_sourceURI; + $backend->state->sessionID = $this->_sessionID; if (!empty($this->_maxMsgSize)) { - $state->maxMsgSize = $this->_maxMsgSize; + $backend->state->maxMsgSize = $this->_maxMsgSize; } - $GLOBALS['backend']->setupState($state); + $backend->setupState(); } } diff --git a/framework/SyncML/SyncML/Device.php b/framework/SyncML/SyncML/Device.php index 1e7502106..c1080373f 100644 --- a/framework/SyncML/SyncML/Device.php +++ b/framework/SyncML/SyncML/Device.php @@ -115,7 +115,7 @@ class SyncML_Device { */ function getPreferredContentTypeClient($serverSyncURI, $sourceSyncURI) { - $di = $_SESSION['SyncML.state']->deviceInfo; + $di = $GLOBALS['backend']->state->deviceInfo; $ds = $di->getDataStore($sourceSyncURI); if (!empty($ds)) { $r = $ds->getPreferredRXContentType(); diff --git a/framework/SyncML/SyncML/Device/Nokia.php b/framework/SyncML/SyncML/Device/Nokia.php index b4cfa016c..aabb7c0d0 100644 --- a/framework/SyncML/SyncML/Device/Nokia.php +++ b/framework/SyncML/SyncML/Device/Nokia.php @@ -29,7 +29,7 @@ class SyncML_Device_Nokia extends SyncML_Device { /* At least the Nokia E series seems to prefix category values with * X-, see bugs #6849 and #7824. */ - $di = $_SESSION['SyncML.state']->deviceInfo; + $di = $GLOBALS['backend']->state->deviceInfo; if ($di->Mod[0] == 'E') { $content = preg_replace('/(\r\n|\r|\n)CATEGORIES:X-/', '\1CATEGORIES:', $content, 1); diff --git a/framework/SyncML/SyncML/Device/P800.php b/framework/SyncML/SyncML/Device/P800.php index 84e1f511c..1c22ef41b 100644 --- a/framework/SyncML/SyncML/Device/P800.php +++ b/framework/SyncML/SyncML/Device/P800.php @@ -128,7 +128,7 @@ class SyncML_Device_P800 extends SyncML_Device { */ function handleTasksInCalendar() { - $di = $_SESSION['SyncML.state']->deviceInfo; + $di = $GLOBALS['backend']->state->deviceInfo; if (isset($di->CTCaps['text/x-vcalendar']) && !empty($di->CTCaps['text/x-vcalendar']['BEGIN']->ValEnum['VEVENT']) && diff --git a/framework/SyncML/SyncML/Device/Sync4j.php b/framework/SyncML/SyncML/Device/Sync4j.php index 0fe47ce0d..5bd6d0e9b 100644 --- a/framework/SyncML/SyncML/Device/Sync4j.php +++ b/framework/SyncML/SyncML/Device/Sync4j.php @@ -63,7 +63,7 @@ class SyncML_Device_sync4j extends SyncML_Device { case 'text/calendar': case 'text/x-vcalendar': - $si = $_SESSION['SyncML.state']->sourceURI; + $si = $GLOBALS['backend']->state->sourceURI; if (stristr($si, 'fol-') !== false) { // The Funambol Outlook connector uses invalid STATUS // values. Actually it maps MeetingStatus values of the @@ -107,7 +107,7 @@ class SyncML_Device_sync4j extends SyncML_Device { if ($this->requestedContentType == $contentType) { if ($contentType == 'text/calendar' || $contentType == 'text/x-vcalendar') { - $si = $_SESSION['SyncML.state']->sourceURI; + $si = $GLOBALS['backend']->state->sourceURI; if (stristr($si, 'fol-') !== false) { // The Funambol Outlook connector uses invalid STATUS // values. Actually it maps MeetingStatus values of the diff --git a/framework/SyncML/SyncML/Device/Synthesis.php b/framework/SyncML/SyncML/Device/Synthesis.php index da1ab8803..8cce68ef3 100644 --- a/framework/SyncML/SyncML/Device/Synthesis.php +++ b/framework/SyncML/SyncML/Device/Synthesis.php @@ -34,7 +34,7 @@ class SyncML_Device_Synthesis extends SyncML_Device { list($content, $contentType, $encodingType) = parent::convertServer2Client($content, $contentType, $database); - $di = $_SESSION['SyncML.state']->deviceInfo; + $di = $GLOBALS['backend']->state->deviceInfo; if (stristr($di->Mod,'palm') === false) { // Some special priority handling is required. Synthesis uses // 1 (high), 2 (medium), 3(low), at least for my windows mobile device. @@ -71,7 +71,7 @@ class SyncML_Device_Synthesis extends SyncML_Device { list($content, $contentType) = parent::convertClient2Server($content, $contentType); - $di = $_SESSION['SyncML.state']->deviceInfo; + $di = $GLOBALS['backend']->state->deviceInfo; if (stristr($di->Mod, 'palm') === false) { // Some special priority handling is required. Synthesis uses 1 // (high), 2 (medium), 3(low), at least for my windows mobile diff --git a/framework/SyncML/SyncML/Sync.php b/framework/SyncML/SyncML/Sync.php index 7efb6723b..7e13617b4 100644 --- a/framework/SyncML/SyncML/Sync.php +++ b/framework/SyncML/SyncML/Sync.php @@ -232,7 +232,7 @@ class SyncML_Sync { } } - $device = $_SESSION['SyncML.state']->getDevice(); + $device = $GLOBALS['backend']->state->getDevice(); $hordedatabase = $database = $this->_targetLocURI; $content = $item->content; if ($item->contentFormat == 'b64') { @@ -241,7 +241,7 @@ class SyncML_Sync { if (($item->contentType == 'text/calendar' || $item->contentType == 'text/x-vcalendar') && - $backend->_normalize($database) == 'calendar' && + $backend->_normalize($database) == 'calendar' && $device->handleTasksInCalendar()) { $tasksincalendar = true; /* Check if the client sends us a vtodo in a calendar sync. */ @@ -369,7 +369,7 @@ class SyncML_Sync { * pending Sync data, the final command will sent the pending data. */ $messageFull = false; - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; $device = $state->getDevice(); $contentType = $device->getPreferredContentTypeClient( $this->_targetLocURI, $this->_sourceLocURI); @@ -741,7 +741,7 @@ class SyncML_Sync { function createUidMap($databaseURI, $cuid, $suid) { - $device = $_SESSION['SyncML.state']->getDevice(); + $device = $GLOBALS['backend']->state->getDevice(); if ($GLOBALS['backend']->_normalize($databaseURI) == 'calendar' && $device->handleTasksInCalendar() && @@ -755,7 +755,6 @@ class SyncML_Sync { $GLOBALS['backend']->logMessage( 'Created map for client id ' . $cuid . ' and server id ' . $suid . ' in database ' . $db, 'DEBUG'); - } /** diff --git a/framework/SyncML/SyncML/XMLOutput.php b/framework/SyncML/SyncML/XMLOutput.php index abf59203c..2f9ea5401 100644 --- a/framework/SyncML/SyncML/XMLOutput.php +++ b/framework/SyncML/SyncML/XMLOutput.php @@ -85,7 +85,8 @@ class SyncML_XMLOutput { */ function outputHeader($respURI) { - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; + $this->_uriMeta = $state->uriMeta; $this->_output->startElement($this->_uri, 'SyncHdr'); @@ -157,7 +158,7 @@ class SyncML_XMLOutput { function outputInit() { - $this->_uri = $_SESSION['SyncML.state']->getURI(); + $this->_uri = $GLOBALS['backend']->state->getURI(); $this->_output->startElement($this->_uri, 'SyncML', array()); } @@ -185,7 +186,7 @@ class SyncML_XMLOutput { $syncAnchorNext = '', $syncAnchorLast = '') { - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; $uriMeta = $state->uriMeta; $this->_output->startElement($this->_uri, 'Status'); @@ -277,7 +278,7 @@ class SyncML_XMLOutput { function outputDevInf($cmdRef) { - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; $uriMeta = $state->uriMeta; $uriDevInf = $state->uriDevInf; @@ -373,7 +374,7 @@ class SyncML_XMLOutput { function _writeDataStore($sourceref, $mimetype, $version, &$output, $additionaltypes = array()) { - $uriDevInf = $_SESSION['SyncML.state']->uriDevInf; + $uriDevInf = $GLOBALS['backend']->state->uriDevInf; $output->startElement($uriDevInf , 'DataStore'); $output->startElement($uriDevInf , 'SourceRef'); @@ -434,7 +435,7 @@ class SyncML_XMLOutput { function outputAlert($alertCode, $clientDB = '', $serverDB = '', $lastAnchor = '', $nextAnchor = '') { - $uriMeta = $_SESSION['SyncML.state']->uriMeta; + $uriMeta = $GLOBALS['backend']->state->uriMeta; $this->_output->startElement($this->_uri, 'Alert'); $this->_outputCmdID(); @@ -478,7 +479,7 @@ class SyncML_XMLOutput { // MaxObjSize, required by protocol for SyncML1.1 and higher. - if ($_SESSION['SyncML.state']->version > 0) { + if ($GLOBALS['backend']->state->version > 0) { $this->_output->startElement($uriMeta, 'MaxObjSize'); $this->_output->characters(SERVER_MAXOBJSIZE); $this->_output->endElement($uriMeta, 'MaxObjSize'); @@ -493,7 +494,7 @@ class SyncML_XMLOutput { function outputGetDevInf() { - $state = &$_SESSION['SyncML.state']; + $state = $GLOBALS['backend']->state; $uriMeta = $state->uriMeta; $this->_output->startElement($this->_uri, 'Get'); @@ -536,7 +537,7 @@ class SyncML_XMLOutput { function outputSyncCommand($command, $content = null, $contentType = null, $encodingType = null, $cuid = null, $suid = null) { - $uriMeta = $_SESSION['SyncML.state']->uriMeta; + $uriMeta = $GLOBALS['backend']->state->uriMeta; $this->_output->startElement($this->_uri, $command); $this->_outputCmdID(); @@ -579,7 +580,7 @@ class SyncML_XMLOutput { if($this->isWBXML()) { $this->_output->characters($content); } else { - $device = $_SESSION['SyncML.state']->getDevice(); + $device = $GLOBALS['backend']->state->getDevice(); if ($device->useCdataTag()) { /* Enclose data in CDATA if possible to avoid */ /* problems with &,< and >. */ diff --git a/framework/SyncML/tests/testpacket.php b/framework/SyncML/tests/testpacket.php index ca7343938..eeaa50c1e 100755 --- a/framework/SyncML/tests/testpacket.php +++ b/framework/SyncML/tests/testpacket.php @@ -40,10 +40,10 @@ class Backend extends SyncML_Backend { return strlen($username) ? $username : true; } - function setupState(&$state) + function setupState() { - $state->user = 'dummyUser'; - $state->authenticated = true; + $this->state->user = 'dummyUser'; + $this->state->authenticated = true; } function addEntry($databaseURI, $content, $contentType, $cuid) -- 2.11.0