public function validateAuthentication($nameOrEmail, $password, &$error = '') { $userId = parent::validateAuthentication($nameOrEmail, $password, $error); if (empty($userId) and strpos($nameOrEmail, '@') === false and bdApiConsumer_Option::get('takeOver', 'login')) { // try to login with external providers $providers = bdApiConsumer_Option::getProviders(); foreach ($providers as $provider) { $externalToken = bdApiConsumer_Helper_Api::getAccessTokenFromUsernamePassword($provider, $nameOrEmail, $password); if (empty($externalToken)) { continue; } $externalVisitor = bdApiConsumer_Helper_Api::getVisitor($provider, $externalToken['access_token']); if (empty($externalVisitor)) { continue; } /** @var bdApiConsumer_XenForo_Model_UserExternal $userExternalModel */ $userExternalModel = $this->getModelFromCache('XenForo_Model_UserExternal'); $existingAssoc = $userExternalModel->getExternalAuthAssociation($userExternalModel->bdApiConsumer_getProviderCode($provider), $externalVisitor['user_id']); if (!empty($existingAssoc)) { // yay, found an associated user! $error = ''; $userExternalModel->bdApiConsumer_updateExternalAuthAssociation($provider, $externalVisitor['user_id'], $existingAssoc['user_id'], $externalVisitor + array('token' => $externalToken)); return $existingAssoc['user_id']; } $existingUser = $this->getUserByEmail($externalVisitor['user_email']); if (!empty($existingUser)) { // this is not good, an user with matched email // this user will have to associate manually continue; } $sameName = $this->getUserByName($externalVisitor['username']); if (!empty($sameName)) { // not good continue; } $data = array('username' => $externalVisitor['username']); if (bdApiConsumer_Option::get('autoRegister') === 'id_sync') { // additionally look for user with same ID $sameId = $this->getUserById($externalVisitor['user_id']); if (!empty($sameId)) { // not good continue; } $data['user_id'] = $externalVisitor['user_id']; } $user = bdApiConsumer_Helper_AutoRegister::createUser($data, $provider, $externalToken, $externalVisitor, $userExternalModel); if (!empty($user)) { $error = ''; return $user['user_id']; } } } return $userId; }
protected function _bdApiConsumer_autoRegister($provider, $externalToken, array $externalVisitor) { $mode = bdApiConsumer_Option::get('autoRegister'); if ($mode !== 'on' and $mode !== 'id_sync') { // not in working mode return false; } $data = array(); $sameName = $this->_getUserModel()->getUserByName($externalVisitor['username']); if (!empty($sameName)) { // username conflict found, too bad return false; } $data['username'] = $externalVisitor['username']; if ($mode === 'id_sync') { // additionally look for user with same ID $sameId = $this->_getUserModel()->getUserById($externalVisitor['user_id']); if (!empty($sameId)) { // ID conflict found... return false; } $data['user_id'] = $externalVisitor['user_id']; } /** @var bdApiConsumer_XenForo_Model_UserExternal $userExternalModel */ $userExternalModel = $this->_getUserExternalModel(); $user = bdApiConsumer_Helper_AutoRegister::createUser($data, $provider, $externalToken, $externalVisitor, $userExternalModel); if (empty($user)) { // for some reason, the user could not be created return false; } return $userExternalModel->getExternalAuthAssociation($userExternalModel->bdApiConsumer_getProviderCode($provider), $externalVisitor['user_id']); }