Exemplo n.º 1
0
 protected function _fetchAvatarsFromExternalSites()
 {
     /* @var $externalAuthModel XenForo_Model_UserExternal */
     $externalAuthModel = $this->getModelFromCache('XenForo_Model_UserExternal');
     $external = $externalAuthModel->getExternalAuthAssociationsForUser($this->get('user_id'));
     $fbUser = false;
     if (!empty($external['facebook'])) {
         $extra = @unserialize($external['twitter']['extra_data']);
         if (!empty($extra['token'])) {
             $avatarData = XenForo_Helper_Facebook::getUserPicture($extra['token']);
             if ($avatarData && $this->_applyAvatar($avatarData)) {
                 return true;
             }
         }
     }
     $twitterUser = false;
     if (!empty($external['twitter'])) {
         $extra = @unserialize($external['twitter']['extra_data']);
         if (!empty($extra['token'])) {
             $credentials = XenForo_Helper_Twitter::getUserFromToken($extra['token'], $extra['secret']);
             if (!empty($credentials['profile_image_url'])) {
                 try {
                     // get the original size
                     $url = str_replace('_normal', '', $credentials['profile_image_url']);
                     $request = XenForo_Helper_Http::getClient($url)->request();
                     $avatarData = $request->getBody();
                 } catch (Exception $e) {
                     $avatarData = '';
                 }
                 if ($avatarData && $this->_applyAvatar($avatarData)) {
                     return true;
                 }
             }
         }
     }
     $externalExtendedHelpers = array('battlenet' => 'BattleNet', 'github' => 'GitHub', 'linkedin' => 'LinkedIn', 'live' => 'Live', 'odnoklassniki' => 'Odnoklassniki', 'soundcloud' => 'SoundCloud', 'tumblr' => 'Tumblr', 'twitch' => 'Twitch', 'vk' => 'VK');
     foreach ($externalExtendedHelpers as $provider => $class) {
         if (!empty($external[$provider])) {
             $extra = $external[$provider]['extra_data'];
             if (!empty($extra['token'])) {
                 $helper = $this->_getExternalExtendedHelper($class);
                 if ($helper->avatarExists) {
                     $eeUser = $helper->getUserInfo($extra['token']);
                     $avatarData = $helper->getAvatar($eeUser);
                     if ($avatarData && $this->_applyAvatar($avatarData)) {
                         return true;
                     }
                 }
             }
         }
     }
     return false;
 }
Exemplo n.º 2
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));
 }
Exemplo n.º 3
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());
 }