Пример #1
0
 /**
  * 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;
 }