Пример #1
0
 /**
  * Registers a new account (or associates with an existing one) using Facebook.
  *
  * @return XenForo_ControllerResponse_Abstract
  */
 public function actionFacebookRegister()
 {
     $this->_assertPostOnly();
     $fbToken = XenForo_Application::getSession()->get('fbToken');
     $fbUser = XenForo_Helper_Facebook::getUserInfo($fbToken);
     if (empty($fbUser['id'])) {
         return $this->responseError(new XenForo_Phrase('error_occurred_while_connecting_with_facebook'));
     }
     if (empty($fbUser['email'])) {
         return $this->responseError(new XenForo_Phrase('facebook_did_not_provide_email'));
     }
     $userExternalModel = $this->_getUserExternalModel();
     $redirect = XenForo_Application::getSession()->get('loginRedirect');
     if (!$redirect) {
         $redirect = $this->getDynamicRedirect(false, false);
     }
     $doAssoc = $this->_input->filterSingle('associate', XenForo_Input::STRING) || $this->_input->filterSingle('force_assoc', XenForo_Input::UINT);
     if ($doAssoc) {
         $userId = $this->_associateExternalAccount();
         $userExternalModel->updateExternalAuthAssociation('facebook', $fbUser['id'], $userId, array('token' => $fbToken));
         XenForo_Helper_Facebook::setUidCookie($fbUser['id']);
         XenForo_Application::getSession()->remove('loginRedirect');
         XenForo_Application::getSession()->remove('fbToken');
         return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, $redirect);
     }
     $data = $this->_input->filter(array('username' => XenForo_Input::STRING, 'timezone' => XenForo_Input::STRING, 'location' => XenForo_Input::STRING, 'dob_day' => XenForo_Input::UINT, 'dob_month' => XenForo_Input::UINT, 'dob_year' => XenForo_Input::UINT));
     if (isset($fbUser['gender'])) {
         switch ($fbUser['gender']) {
             case 'man':
             case 'male':
                 $data['gender'] = 'male';
                 break;
             case 'woman':
             case 'female':
                 $data['gender'] = 'female';
                 break;
         }
     }
     if (!empty($fbUser['birthday'])) {
         $birthday = $this->_validateBirthdayString($fbUser['birthday'], 'm/d/y');
         if ($birthday) {
             $data['dob_year'] = $birthday[0];
             $data['dob_month'] = $birthday[1];
             $data['dob_day'] = $birthday[2];
         }
     }
     if (!empty($fbUser['website'])) {
         list($website) = preg_split('/\\r?\\n/', $fbUser['website']);
         if ($website && Zend_Uri::check($website)) {
             $data['homepage'] = $website;
         }
     }
     $data['email'] = $fbUser['email'];
     if (!empty($fbUser['location']['name'])) {
         $data['location'] = $fbUser['location']['name'];
     }
     $writer = $this->_setupExternalUser($data);
     if (!$this->_validateBirthdayInput($writer, $birthdayError)) {
         $writer->error($birthdayError);
     }
     $spamModel = $this->_runSpamCheck($writer);
     $writer->advanceRegistrationUserState(false);
     $writer->save();
     $user = $writer->getMergedData();
     $spamModel->logSpamTrigger('user', $user['user_id']);
     if ($this->_canApplyAvatar()) {
         $avatarData = XenForo_Helper_Facebook::getUserPicture($fbToken);
         $this->_applyAvatar($user, $avatarData);
     }
     $userExternalModel->updateExternalAuthAssociation('facebook', $fbUser['id'], $user['user_id'], array('token' => $fbToken));
     XenForo_Helper_Facebook::setUidCookie($fbUser['id']);
     XenForo_Application::getSession()->remove('loginRedirect');
     XenForo_Application::getSession()->remove('fbToken');
     return $this->_completeRegistration($user, array('redirect' => $redirect));
 }
Пример #2
0
 public function actionExternalAccountsDisassociate()
 {
     $this->_assertPostOnly();
     $visitor = XenForo_Visitor::getInstance();
     $auth = $this->_getUserModel()->getUserAuthenticationObjectByUserId($visitor['user_id']);
     if (!$auth) {
         return $this->responseNoPermission();
     }
     /** @var XenForo_Model_UserExternal $externalAuthModel */
     $externalAuthModel = $this->getModelFromCache('XenForo_Model_UserExternal');
     $input = $this->_input->filter(array('disassociate' => XenForo_Input::STRING, 'account' => XenForo_Input::STRING));
     if ($input['disassociate'] && $input['account']) {
         $externalAuthModel->deleteExternalAuthAssociationForUser($input['account'], $visitor['user_id']);
         if (!$auth->hasPassword() && !$externalAuthModel->getExternalAuthAssociationsForUser($visitor['user_id'])) {
             $this->getModelFromCache('XenForo_Model_UserConfirmation')->resetPassword($visitor['user_id']);
         }
         if ($input['account'] == 'facebook') {
             XenForo_Helper_Facebook::setUidCookie(0);
         }
     }
     return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, XenForo_Link::buildPublicLink('account/external-accounts'));
 }
Пример #3
0
 protected function _getExternalRegisterFormResponse($viewName, $templateName, array $extraParams = array())
 {
     $registerTemplates = array('register_facebook', 'register_twitter', 'register_google', 'register_tumblr', 'register_ee');
     if (!empty($extraParams['existingUser'])) {
         if (in_array($templateName, $registerTemplates)) {
             /* @var $userExternalModel XenForo_Model_UserExternal */
             $userExternalModel = $this->_getUserExternalModel();
             $session = XenForo_Application::getSession();
             $userId = $extraParams['existingUser']['user_id'];
             $redirect = $extraParams['redirect'];
             switch ($templateName) {
                 case 'register_facebook':
                     $fbToken = $session->get('fbToken');
                     $fbUser = XenForo_Helper_Facebook::getUserInfo($fbToken);
                     if (empty($fbUser['id'])) {
                         return $this->responseError(new XenForo_Phrase('error_occurred_while_connecting_with_facebook'));
                     }
                     $provider = 'facebook';
                     $providerKey = $fbUser['id'];
                     $extra = array('token' => $fbToken);
                     XenForo_Helper_Facebook::setUidCookie($fbUser['id']);
                     XenForo_Application::getSession()->remove('loginRedirect');
                     XenForo_Application::getSession()->remove('fbToken');
                     break;
                 case 'register_twitter':
                     $accessToken = @unserialize($session->get('twitterAccessToken'));
                     $credentials = @unserialize($session->get('twitterCredentials'));
                     if (!$accessToken || !$credentials) {
                         return $this->responseError(new XenForo_Phrase('unexpected_error_occurred'));
                     }
                     $provider = 'twitter';
                     $providerKey = $credentials['id_str'];
                     $extra = array('token' => $accessToken->getToken(), 'secret' => $accessToken->getTokenSecret());
                     XenForo_Application::getSession()->remove('twitterAccessToken');
                     XenForo_Application::getSession()->remove('twitterCredentials');
                     break;
                 case 'register_google':
                     $credentials = $session->get('googleCredentials');
                     if (!$credentials) {
                         return $this->responseError(new XenForo_Phrase('unexpected_error_occurred'));
                     }
                     $provider = 'google';
                     $providerKey = $credentials['basic']['sub'];
                     $extra = $credentials['extra'];
                     break;
                 case 'register_tumblr':
                     $session = XenForo_Application::getSession();
                     $accessToken = @unserialize($session->get('tumblrAccessToken'));
                     $credentials = @unserialize($session->get('tumblrCredentials'));
                     if (!$accessToken || !$credentials) {
                         return $this->responseError(new XenForo_Phrase('unexpected_error_occurred'));
                     }
                     $provider = 'tumblr';
                     $providerKey = $credentials['response']['user']['name'];
                     $extra = array('token' => $accessToken->getToken(), 'secret' => $accessToken->getTokenSecret());
                     break;
                 case 'register_ee':
                     $provider = $extraParams['provider'];
                     switch ($provider) {
                         case 'battlenet':
                             $helper = $this->getHelper('ExternalExtended_Helper_BattleNet');
                             break;
                         case 'github':
                             $helper = $this->getHelper('ExternalExtended_Helper_GitHub');
                             break;
                         case 'linkedin':
                             $helper = $this->getHelper('ExternalExtended_Helper_LinkedIn');
                             break;
                         case 'live':
                             $helper = $this->getHelper('ExternalExtended_Helper_Live');
                             break;
                         case 'odnoklassniki':
                             $helper = $this->getHelper('ExternalExtended_Helper_Odnoklassniki');
                             break;
                         case 'soundcloud':
                             $helper = $this->getHelper('ExternalExtended_Helper_SoundCloud');
                             break;
                         case 'twitch':
                             $helper = $this->getHelper('ExternalExtended_Helper_Twitch');
                             break;
                         case 'vk':
                             $helper = $this->getHelper('ExternalExtended_Helper_VK');
                             break;
                         case 'strava':
                             $helper = $this->getHelper('ExternalExtended_Helper_Strava');
                             break;
                         case 'vimeo':
                             $helper = $this->getHelper('ExternalExtended_Helper_Vimeo');
                             break;
                     }
                     $eeToken = XenForo_Application::getSession()->get('eeToken');
                     $eeUser = $helper->getUserInfo($eeToken);
                     $providerKey = $eeUser[$helper->authUser];
                     $extra = $helper->getAssociation($eeToken, $eeUser);
                     XenForo_Application::getSession()->remove('loginRedirect');
                     XenForo_Application::getSession()->remove('eeToken');
                     break;
             }
             $userExternalModel->updateExternalAuthAssociation($provider, $providerKey, $userId, $extra);
             $visitor = XenForo_Visitor::setup($userId);
             XenForo_Application::getSession()->userLogin($userId, $visitor['password_date']);
             $this->_getUserModel()->setUserRememberCookie($userId);
             return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, XenForo_Link::buildPublicLink('index'));
         }
     }
     return parent::_getExternalRegisterFormResponse($viewName, $templateName, $extraParams);
 }
Пример #4
0
 /**
  * Registers a new account (or associates with an existing one) using Facebook.
  *
  * @return XenForo_ControllerResponse_Abstract
  */
 public function actionFacebookRegister()
 {
     $this->_assertPostOnly();
     $fbToken = $this->_input->filterSingle('fb_token', XenForo_Input::STRING);
     $fbUser = XenForo_Helper_Facebook::getUserInfo($fbToken);
     if (empty($fbUser['id'])) {
         return $this->responseError(new XenForo_Phrase('error_occurred_while_connecting_with_facebook'));
     }
     $userModel = $this->_getUserModel();
     $userExternalModel = $this->_getUserExternalModel();
     $doAssoc = $this->_input->filterSingle('associate', XenForo_Input::STRING) || $this->_input->filterSingle('force_assoc', XenForo_Input::UINT);
     if ($doAssoc) {
         $associate = $this->_input->filter(array('associate_login' => XenForo_Input::STRING, 'associate_password' => XenForo_Input::STRING));
         $loginModel = $this->_getLoginModel();
         if ($loginModel->requireLoginCaptcha($associate['associate_login'])) {
             return $this->responseError(new XenForo_Phrase('your_account_has_temporarily_been_locked_due_to_failed_login_attempts'));
         }
         $userId = $userModel->validateAuthentication($associate['associate_login'], $associate['associate_password'], $error);
         if (!$userId) {
             $loginModel->logLoginAttempt($associate['associate_login']);
             return $this->responseError($error);
         }
         $userExternalModel->updateExternalAuthAssociation('facebook', $fbUser['id'], $userId);
         XenForo_Helper_Facebook::setUidCookie($fbUser['id']);
         XenForo_Application::get('session')->changeUserId($userId);
         XenForo_Visitor::setup($userId);
         $redirect = XenForo_Application::get('session')->get('fbRedirect');
         XenForo_Application::get('session')->remove('fbRedirect');
         if (!$redirect) {
             $redirect = $this->getDynamicRedirect(false, false);
         }
         return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, $redirect);
     }
     $this->_assertRegistrationActive();
     $data = $this->_input->filter(array('username' => XenForo_Input::STRING, 'timezone' => XenForo_Input::STRING));
     if (XenForo_Dependencies_Public::getTosUrl() && !$this->_input->filterSingle('agree', XenForo_Input::UINT)) {
         return $this->responseError(new XenForo_Phrase('you_must_agree_to_terms_of_service'));
     }
     $options = XenForo_Application::get('options');
     $gender = '';
     if (isset($fbUser['gender'])) {
         switch ($fbUser['gender']) {
             case 'man':
             case 'male':
                 $gender = 'male';
                 break;
             case 'woman':
             case 'female':
                 $gender = 'female';
                 break;
         }
     }
     $writer = XenForo_DataWriter::create('XenForo_DataWriter_User');
     if ($options->registrationDefaults) {
         $writer->bulkSet($options->registrationDefaults, array('ignoreInvalidFields' => true));
     }
     $writer->bulkSet($data);
     $writer->bulkSet(array('gender' => $gender, 'email' => $fbUser['email'], 'location' => isset($fbUser['location']['name']) ? $fbUser['location']['name'] : ''));
     if (!empty($fbUser['birthday'])) {
         $birthdayParts = explode('/', $fbUser['birthday']);
         if (count($birthdayParts) == 3) {
             list($month, $day, $year) = $birthdayParts;
             $userAge = $this->_getUserProfileModel()->calculateAge($year, $month, $day);
             if ($userAge < intval($options->get('registrationSetup', 'minimumAge'))) {
                 // TODO: set a cookie to prevent re-registration attempts
                 return $this->responseError(new XenForo_Phrase('sorry_you_too_young_to_create_an_account'));
             }
             $writer->bulkSet(array('dob_year' => $year, 'dob_month' => $month, 'dob_day' => $day));
         }
     }
     if (!empty($fbUser['website'])) {
         list($website) = preg_split('/\\r?\\n/', $fbUser['website']);
         if ($website && Zend_Uri::check($website)) {
             $writer->set('homepage', $website);
         }
     }
     $auth = XenForo_Authentication_Abstract::create('XenForo_Authentication_NoPassword');
     $writer->set('scheme_class', $auth->getClassName());
     $writer->set('data', $auth->generate(''), 'xf_user_authenticate');
     $writer->set('user_group_id', XenForo_Model_User::$defaultRegisteredGroupId);
     $writer->set('language_id', XenForo_Visitor::getInstance()->get('language_id'));
     $writer->advanceRegistrationUserState(false);
     $writer->preSave();
     // TODO: option for extra user group
     $writer->save();
     $user = $writer->getMergedData();
     $avatarFile = tempnam(XenForo_Helper_File::getTempDir(), 'xf');
     if ($avatarFile) {
         $data = XenForo_Helper_Facebook::getUserPicture($fbToken);
         if ($data && $data[0] != '{') {
             file_put_contents($avatarFile, $data);
             try {
                 $user = array_merge($user, $this->getModelFromCache('XenForo_Model_Avatar')->applyAvatar($user['user_id'], $avatarFile));
             } catch (XenForo_Exception $e) {
             }
         }
         @unlink($avatarFile);
     }
     $userExternalModel->updateExternalAuthAssociation('facebook', $fbUser['id'], $user['user_id']);
     XenForo_Model_Ip::log($user['user_id'], 'user', $user['user_id'], 'register');
     XenForo_Helper_Facebook::setUidCookie($fbUser['id']);
     XenForo_Application::get('session')->changeUserId($user['user_id']);
     XenForo_Visitor::setup($user['user_id']);
     $redirect = $this->_input->filterSingle('redirect', XenForo_Input::STRING);
     $viewParams = array('user' => $user, 'redirect' => $redirect ? XenForo_Link::convertUriToAbsoluteUri($redirect) : '', 'facebook' => true);
     return $this->responseView('XenForo_ViewPublic_Register_Process', 'register_process', $viewParams, $this->_getRegistrationContainerParams());
 }
Пример #5
0
 public function actionFacebook()
 {
     $visitor = XenForo_Visitor::getInstance();
     $auth = $this->_getUserModel()->getUserAuthenticationObjectByUserId($visitor['user_id']);
     if (!$auth) {
         return $this->responseNoPermission();
     }
     if ($this->isConfirmedPost()) {
         $disassociate = $this->_input->filter(array('disassociate' => XenForo_Input::STRING, 'disassociate_confirm' => XenForo_Input::STRING));
         if ($disassociate['disassociate'] && $disassociate['disassociate_confirm']) {
             XenForo_Helper_Facebook::setUidCookie(0);
             $this->getModelFromCache('XenForo_Model_UserExternal')->deleteExternalAuthAssociation('facebook', $visitor['facebook_auth_id'], $visitor['user_id']);
             if (!$auth->hasPassword()) {
                 $this->getModelFromCache('XenForo_Model_UserConfirmation')->resetPassword($visitor['user_id']);
             }
         }
         return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, XenForo_Link::buildPublicLink('account/facebook'));
     } else {
         if ($visitor['facebook_auth_id']) {
             $fbUser = XenForo_Helper_Facebook::getUserInfo('', $visitor['facebook_auth_id']);
         } else {
             $fbUser = false;
         }
         $viewParams = array('fbUser' => $fbUser, 'hasPassword' => $auth->hasPassword());
         return $this->_getWrapper('account', 'facebook', $this->responseView('XenForo_ViewPublic_Account_Facebook', 'account_facebook', $viewParams));
     }
 }