/** * Get the default user group * * @return object */ function getDefaultUsergroup() { $params = JFusionFactory::getParams($this->getJname()); $usergroup_id = $params->get('usergroup'); // We want to output the usergroup name $db = JFusionFactory::getDatabase($this->getJname()); $query = 'SELECT title from xf_user_group WHERE user_group_id = ' . (int) $usergroup_id; $db->setQuery($query); return $db->loadResult(); }
/** * 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; }
/** * Creat XenForo User * * @param object $userinfo User info * * @return void|string */ public function createUser($userinfo) { $datestamp = time(); $ip = ip2long($this->ipaddress); $params = JFusionFactory::getParams($this->getJname()); // Update $userinfo with group premission info $this->mapUsergroup($params->get('usergroup'), $userinfo); /* Create basic user details */ $user = new stdClass(); $user->username = $this->filterUsername($userinfo->username); $user->email = $userinfo->email; $user->gender = ''; $user->custom_title = ''; // 1 is English, the default $user->language_id = 1; $user->style_id = 0; $user->timezone = 'Europe/London'; $user->visible = 1; $user->user_group_id = $userinfo->user_group_id; $user->secondary_group_ids = ''; // Research $user->display_style_group_id = $userinfo->display_style_group_id; // From xf_permission_combination, needs research $user->permission_combination_id = $userinfo->permission_combination_id; $user->message_count = 0; $user->conversations_unread = 0; $user->trophy_points = 0; $user->alerts_unread = 0; $user->avatar_date = 0; $user->avatar_width = 0; $user->avatar_height = 0; $user->gravatar = ''; $user->user_state = 'valid'; $user->is_moderator = 0; $user->is_admin = 0; $user->is_banned = intval($userinfo->block); $user->like_count = 0; // Insert user record if (!$this->db->insertObject('xf_user', $user, 'user_id')) { // Return the error $status['error'][] = JText::_('USER_CREATION_ERROR') . $this->db->stderr(); return; } else { // Return the good news $status['debug'][] = JText::_('USER_CREATION'); $userinfo->user_id = $user->user_id; // TODO $status['userinfo'] = $this->getUser($userinfo); } // Create authentication record if (!$this->db->insertObject('xf_user_authenticate', $this->createAuthObject($userinfo))) { // Return the error $status['error'][] = JText::_('USER_CREATION_ERROR') . $this->db->stderr(); return; } // Insert primary user group $primaryGroup = new stdClass(); $primaryGroup->user_id = $user->user_id; $primaryGroup->user_group_id = $userinfo->user_group_id; $primaryGroup->is_primary = 1; if (!$this->db->insertObject('xf_user_group_relation', $primaryGroup)) { // Return the error $status['error'][] = JText::_('USER_CREATION_ERROR') . $this->db->stderr(); return; } // TODO insert additional user groups, if any $ipRecord = new stdClass(); $ipRecord->user_id = $user->user_id; $ipRecord->content_type = 'user'; $ipRecord->content_id = 1; $ipRecord->action = 'login'; $ipRecord->ip = $ip; $ipRecord->log_date = $datestamp; if (!$this->db->insertObject('xf_ip', $ipRecord)) { // Return the error $status['error'][] = JText::_('USER_CREATION_ERROR') . $this->db->stderr(); return; } // Get default user options $query = "SELECT option_value, default_value\n\t\t\t\tFROM xf_option\n\t\t\t\tWHERE option_id = 'registrationDefaults'"; $this->db->setQuery($query); $userDefaultOption = $this->db->loadObject(); $options = (object) unserialize(empty($userDefaultOption->option_value) ? $userDefaultOption->default_value : $userDefaultOption->option_value); $userOptions = new stdClass(); $userOptions->user_id = $user->user_id; $userOptions->show_dob_year = $options->show_dob_year; $userOptions->show_dob_date = $options->show_dob_date; $userOptions->content_show_signature = $options->content_show_signature; $userOptions->receive_admin_email = $options->receive_admin_email; $userOptions->email_on_conversation = $options->email_on_conversation; $userOptions->default_watch_state = $options->default_watch_state; $userOptions->is_discouraged = 0; $userOptions->alert_optout = 0; $userOptions->enable_rte = 1; if (!$this->db->insertObject('xf_user_option', $userOptions)) { // Return the error $status['error'][] = JText::_('USER_CREATION_ERROR') . $this->db->stderr(); return; } $privacyRecord = new stdClass(); $privacyRecord->user_id = $user->user_id; $privacyRecord->allow_view_profile = 'everyone'; $privacyRecord->allow_post_profile = 'everyone'; $privacyRecord->allow_send_personal_conversation = 'everyone'; $privacyRecord->allow_view_identities = 'everyone'; $privacyRecord->allow_receive_news_feed = 'everyone'; if (!$this->db->insertObject('xf_user_privacy', $privacyRecord)) { // Return the error $status['error'][] = JText::_('USER_CREATION_ERROR') . $this->db->stderr(); return; } $this->createuserProfile($user, $status); $confirmation_key = $this->generateRandomString(16); $confirmRecord = new stdClass(); $confirmRecord->user_id = $user->user_id; $confirmRecord->confirmation_type = 'email'; $confirmRecord->confirmation_key = $this->generateRandomString(16); $confirmRecord->confirmation_date = $datestamp; if (!$this->db->insertObject('xf_user_confirmation', $confirmRecord)) { // Return the error $status['error'][] = JText::_('USER_CREATION_ERROR') . $this->db->stderr(); return; } return $status; }