/** * Sync user session * * @param bool $keepalive Keep session alive * * @return number */ function syncSessions($keepalive = false) { $debug = defined('DEBUG_SYSTEM_PLUGIN') ? true : false; if ($debug) { JError::raiseNotice('500', 'XenForo syncSessions called'); } $helper =& JFusionFactory::getHelper($this->getJname()); $params =& JFusionFactory::getParams($this->getJname()); $options = array(); $options['action'] = 'core.login.site'; $expiry = 60 * 60 * 24 * 365; $JUser =& JFactory::getUser(); // Do we have a Joomla persistant session ? if (JPluginHelper::isEnabled('system', 'remember')) { jimport('joomla.utilities.utility'); $hash = JApplicationHelper::getHash('JLOGIN_REMEMBER'); $joomla_persistant_cookie = JRequest::getString($hash, '', 'cookie', JREQUEST_ALLOWRAW | JREQUEST_NOTRIM); } else { $joomla_persistant_cookie = ''; } if (!$JUser->get('guest', true)) { // User logged into Joomla so check for active XenForo session if ($helper->persistantUser()) { // We have a persistant cookie for XenForo // Lets check that the user's match $xenforo_user = (object) $helper->xenUserFromSession(); if (isset($xenforo_user->email) && isset($xenforo_user->username)) { if ($xenforo_user->email == $JUser->email && $xenforo_user->username == $JUser->username) { // Users match, so do nothing. XenForo auto login // will sort out the sessions. } else { // TODO User mismatch, terminate both sessions // for security reasons } } else { // Unknown XenForo user, do nothing } } else { // Do we have an active XenForo session ? if ($helper->sessionCookie()) { // Is this a user session ? $xenuser = $helper->xenUserFromSession(); if (empty($xenuser['user_id'])) { // This is a Xenforo guest session // Log user into XenForo $userinfo = $helper->xenUserFromJUser($JUser); if (isset($userinfo['username'])) { $helper->createSession($userinfo['userid'], $expiry, $userinfo['remember_key']); } else { // No matching user, so do nothing } } else { if (isset($xenuser->email) && isset($xenforo_user->username)) { if ($xenuser->email == $JUser->email && $xenuser->username == $JUser->username) { // Users match, so do nothing. // We are already logged in } else { // TODO User mismatch, terminate both sessions // for security reasons } } else { // Unknown XenForo user, do nothing } } } } } else { // Not logged into Joomla if ($helper->persistantUser()) { // Login to Joomla persistant // First identify the xenforo user $xenuser = (object) $helper->xenUserFromSession(); // Verify that this is a user session if (!empty($xenuser->email) && !empty($xenuser->username)) { // We have a XenForo user session, try to find matching Joomla user $JoomlaUser = JFusionFactory::getUser('joomla_int'); $userinfo = $JoomlaUser->getUser($xenuser); if (!empty($userinfo)) { // We have a valid Joomla user, so create user session. global $JFusionActivePlugin; $JFusionActivePlugin = $this->getJname(); $options['remember'] = true; $status = $JoomlaUser->createSession($userinfo, $options); if ($debug) { JFusionFunction::raiseWarning('500', $status); } // No refresh needed return 0; } else { // No Joomla user, so lets create one. $status = array(); $userinfo = $this->getUser($xenuser); JFusionJplugin::createUser($userinfo, $status, 'joomla_int'); // $jfusion = new JFusionJplugin(); // $result = $jfusion->createUser($userinfo, $status, 'joomla_int'); // Now we have a Joomla user, lets create the Joomla session $JoomlaUser = JFusionFactory::getUser('joomla_int'); $userinfo = $JoomlaUser->getUser($xenuser); if (!empty($userinfo)) { header('Location: http://' . $_SERVER['HTTP_HOST']); exit(0); // We have a valid Joomla user, so create user session.. /*global $JFusionActivePlugin; $JFusionActivePlugin = $this->getJname(); $status = $JoomlaUser->createSession($userinfo, $options); if ($debug) { JFusionFunction::raiseWarning('500',$status); }*/ } return 0; } } // Just create the correct cookie and login } else { // Do we have an active XenForo session ? if ($helper->sessionCookie()) { // Login to Joomla not persistant $xenuser = (object) $helper->xenUserFromSession(); // Verify that this is a user session if (!empty($xenuser->email) && !empty($xenuser->username)) { // We have a XenForo user session, try to find matching Joomla user $JoomlaUser = JFusionFactory::getUser('joomla_int'); $userinfo = $JoomlaUser->getUser($xenuser); if (!empty($userinfo)) { // We have a valid Joomla user, so create user session. global $JFusionActivePlugin; $JFusionActivePlugin = $this->getJname(); $status = $JoomlaUser->createSession($userinfo, $options); if ($debug) { JFusionFunction::raiseWarning('500', $status); } // No refresh needed return 0; } else { // No Joomla user exists yet, so create one. $status = array(); $userinfo = $this->getUser($xenuser); JFusionJplugin::createUser($userinfo, $status, 'joomla_int'); // $jfusion = new JFusionJplugin(); // $result = $jfusion->createUser($userinfo, $status, 'joomla_int'); // Now we have a Joomla user, lets create the Joomla session $JoomlaUser = JFusionFactory::getUser('joomla_int'); $userinfo = $JoomlaUser->getUser($xenuser); if (!empty($userinfo)) { header('Location: http://' . $_SERVER['HTTP_HOST']); exit(0); // We have a valid Joomla user, so create user session. /*global $JFusionActivePlugin; $JFusionActivePlugin = $this->getJname(); $status = $JoomlaUser->createSession($userinfo, $options); if ($debug) { JFusionFunction::raiseWarning('500',$status); }*/ } return 0; } } } else { // Not logged into either app, do nothing } } } return 0; }