/**
* {@inheritdoc}
*/
protected function retrieveUser($username, UsernamePasswordToken $token)
{
$user = $token->getUser();
if ($user instanceof UserInterface) {
return $user;
}
try {
if ($this->getAuthService()->hasPartnerAuth()) {
try {
$user = $this->userProvider->loadUserByUsername($username);
$bind = $this->getUserService()->getUserBindByTypeAndUserId($this->getAuthService()->getPartnerName(), $user['id']);
if ($bind) {
$partnerUser = $this->getAuthService()->checkPartnerLoginById($bind['fromId'], $token->getCredentials());
if ($partnerUser) {
$user = $this->syncEmailAndPassword($user, $partnerUser, $token);
}
}
} catch (UsernameNotFoundException $notFound) {
if (filter_var($username, FILTER_VALIDATE_EMAIL)) {
$partnerUser = $this->getAuthService()->checkPartnerLoginByEmail($username, $token->getCredentials());
} else {
$partnerUser = $this->getAuthService()->checkPartnerLoginByNickname($username, $token->getCredentials());
}
if (empty($partnerUser)) {
throw $notFound;
}
$bind = $this->getUserService()->getUserBindByTypeAndFromId($this->getAuthService()->getPartnerName(), $partnerUser['id']);
if ($bind) {
$user = $this->getUserService()->getUser($bind['toId']);
$user = $this->syncEmailAndPassword($user, $partnerUser, $token);
} else {
$setting = $this->getSettingService()->get('user_partner', array());
$email_filter = explode("\n", $setting['email_filter']);
if (in_array($partnerUser['email'], $email_filter)) {
$partnerUser['email'] = $partnerUser['id'] . '_dz_' . $this->getRandomString(5) . '@edusoho.net';
}
$registration = array();
$registration['nickname'] = $partnerUser['nickname'];
$registration['email'] = $partnerUser['email'];
$registration['password'] = $token->getCredentials();
$registration['createdIp'] = $partnerUser['createdIp'];
$registration['token'] = array('userId' => $partnerUser['id']);
$this->getUserService()->register($registration, $this->getAuthService()->getPartnerName());
$user = $this->userProvider->loadUserByUsername($username);
}
}
} else {
$user = $this->userProvider->loadUserByUsername($username);
}
if (!$user instanceof UserInterface) {
throw new AuthenticationServiceException('The user provider must return a UserInterface object.');
}
return $user;
} catch (UsernameNotFoundException $notFound) {
$notFound->setUsername($username);
throw $notFound;
} catch (\Exception $repositoryProblem) {
$ex = new AuthenticationServiceException($repositoryProblem->getMessage(), 0, $repositoryProblem);
$ex->setToken($token);
throw $ex;
}
}