private function getFromProviders(TokenInterface $token, $providerKey) { $drivers = $this->authenticationManager->getDrivers(); foreach ($drivers as $driver) { $found = $this->authenticationManager->authenticate($driver, $token->getUsername(), $token->getCredentials()); if ($found) { $data = $this->authenticationManager->findUser($driver, $token->getUsername()); $user = new User(); $user->setFirstName($data['first_name']); $user->setPlainPassword($data['password']); $user->setLastName($data['last_name']); $user->setUsername($data['username']); $user->setMail($data['email']); $user->setAuthentication($driver); $iser = $this->userManager->createUser($user, false); return new UsernamePasswordToken($user, $user->getPassword(), $providerKey, $user->getRoles()); } } throw new AuthenticationException('Invalid username or password'); }
/** * Import users from an array. * There is the array format: * @todo some batch processing * * array( * array(firstname, lastname, username, pwd, email, code, phone), * array(firstname2, lastname2, username2, pwd2, email2, code2, phone2), * array(firstname3, lastname3, username3, pwd3, email3, code3, phone3), * ) * * @param array $users * @param string $authentication an authentication source * @param boolean $mail do the users need to be mailed * @param \Closure $logger an anonymous function allowing to log actions * * @return array */ public function importUsers(array $users, $sendMail = true, $logger = null, $additionalRoles = array()) { $returnValues = array(); //keep these roles before the clear() will mess everything up. It's not what we want. $tmpRoles = $additionalRoles; $additionalRoles = []; //I need to do that to import roles from models. Please don't ask why, I have no f*****g idea. $this->objectManager->clear(); foreach ($tmpRoles as $role) { if ($role) { $additionalRoles[] = $this->objectManager->merge($role); } } $roleUser = $this->roleManager->getRoleByName('ROLE_USER'); $max = $roleUser->getMaxUsers(); $total = $this->countUsersByRoleIncludingGroup($roleUser); if ($total + count($users) > $max) { throw new AddRoleException(); } $lg = $this->platformConfigHandler->getParameter('locale_language'); $this->objectManager->startFlushSuite(); $i = 1; $j = 0; foreach ($users as $user) { $firstName = $user[0]; $lastName = $user[1]; $username = $user[2]; $pwd = $user[3]; $email = trim($user[4]); if (isset($user[5])) { $code = trim($user[5]) === '' ? null : $user[5]; } else { $code = null; } if (isset($user[6])) { $phone = trim($user[6]) === '' ? null : $user[6]; } else { $phone = null; } if (isset($user[7])) { $authentication = trim($user[7]) === '' ? null : $user[7]; } else { $authentication = null; } if (isset($user[8])) { $modelName = trim($user[8]) === '' ? null : $user[8]; } else { $modelName = null; } if ($modelName) { $model = $this->objectManager->getRepository('Claroline\\CoreBundle\\Entity\\Model\\WorkspaceModel')->findOneByName($modelName); } else { $model = null; } $newUser = new User(); $newUser->setFirstName($firstName); $newUser->setLastName($lastName); $newUser->setUsername($username); $newUser->setPlainPassword($pwd); $newUser->setMail($email); $newUser->setAdministrativeCode($code); $newUser->setPhone($phone); $newUser->setLocale($lg); $newUser->setAuthentication($authentication); $this->createUser($newUser, $sendMail, $additionalRoles, $model, $username . uniqid()); $this->objectManager->persist($newUser); $returnValues[] = $firstName . ' ' . $lastName; if ($logger) { $logger(" [UOW size: " . $this->objectManager->getUnitOfWork()->size() . "]"); } if ($logger) { $logger(" User {$j} ({$username}) being created"); } $i++; $j++; if ($i % self::MAX_USER_BATCH_SIZE === 0) { if ($logger) { $logger(" [UOW size: " . $this->objectManager->getUnitOfWork()->size() . "]"); } $this->objectManager->forceFlush(); if ($logger) { $logger(" flushing users..."); } $tmpRoles = $additionalRoles; $this->objectManager->clear(); $additionalRoles = []; foreach ($tmpRoles as $toAdd) { if ($toAdd) { $additionalRoles[] = $this->objectManager->merge($toAdd); } } if ($this->container->get('security.token_storage')->getToken()) { $this->objectManager->merge($this->container->get('security.token_storage')->getToken()->getUser()); } } } $this->objectManager->endFlushSuite(); return $returnValues; }
/** * Import users from an array. * There is the array format:. * * @todo some batch processing * * array( * array(firstname, lastname, username, pwd, email, code, phone), * array(firstname2, lastname2, username2, pwd2, email2, code2, phone2), * array(firstname3, lastname3, username3, pwd3, email3, code3, phone3), * ) * * @param array $users * @param string $authentication an authentication source * @param bool $mail do the users need to be mailed * @param \Closure $logger an anonymous function allowing to log actions * * @return array */ public function importUsers(array $users, $sendMail = true, $logger = null, $additionalRoles = [], $enableEmailNotifaction = false, $options = []) { //build options if (!isset($options['ignore-update'])) { $options['ignore-update'] = false; } $returnValues = []; $skipped = []; //keep these roles before the clear() will mess everything up. It's not what we want. $tmpRoles = $additionalRoles; $additionalRoles = []; //I need to do that to import roles from models. Please don't ask why, I have no f*****g idea. $this->objectManager->clear(); foreach ($tmpRoles as $role) { if ($role) { $additionalRoles[] = $this->objectManager->merge($role); } } $roleUser = $this->roleManager->getRoleByName('ROLE_USER'); $max = $roleUser->getMaxUsers(); $total = $this->countUsersByRoleIncludingGroup($roleUser); if ($total + count($users) > $max) { throw new AddRoleException(); } $lg = $this->platformConfigHandler->getParameter('locale_language'); $this->objectManager->startFlushSuite(); $i = 1; $j = 0; $countCreated = 0; $countUpdated = 0; foreach ($users as $user) { $firstName = $user[0]; $lastName = $user[1]; $username = $user[2]; $pwd = $user[3]; $email = trim($user[4]); if (isset($user[5])) { $code = trim($user[5]) === '' ? null : $user[5]; } else { $code = null; } if (isset($user[6])) { $phone = trim($user[6]) === '' ? null : $user[6]; } else { $phone = null; } if (isset($user[7])) { $authentication = trim($user[7]) === '' ? null : $user[7]; } else { $authentication = null; } if (isset($user[8])) { $modelName = trim($user[8]) === '' ? null : $user[8]; } else { $modelName = null; } if (isset($user[9])) { $groupName = trim($user[9]) === '' ? null : $user[9]; } else { $groupName = null; } if (isset($user[10])) { $organizationName = trim($user[10]) === '' ? null : $user[10]; } else { $organizationName = null; } $hasPersonalWorkspace = isset($user[11]) ? (bool) $user[11] : false; $isMailValidated = isset($user[12]) ? (bool) $user[12] : false; $isMailNotified = isset($user[13]) ? (bool) $user[13] : $enableEmailNotifaction; if ($modelName) { $model = $this->objectManager->getRepository('Claroline\\CoreBundle\\Entity\\Model\\WorkspaceModel')->findOneByName($modelName); } else { $model = null; } if ($organizationName) { $organizations = [$this->objectManager->getRepository('Claroline\\CoreBundle\\Entity\\Organization\\Organization')->findOneByName($organizationName)]; } else { $organizations = []; } $group = $groupName ? $this->groupManager->getGroupByName($groupName) : null; if ($groupName) { $group = $this->groupManager->getGroupByNameAndScheduledForInsert($groupName); if (!$group) { $group = new Group(); $group->setName($groupName); $group = $this->groupManager->insertGroup($group); } } else { $group = null; } $userEntity = $this->userRepo->findOneByMail($email); if (!$userEntity) { $userEntity = $this->userRepo->findOneByUsername($username); if (!$userEntity && $code !== null) { //the code isn't required afaik $userEntity = $this->userRepo->findOneByAdministrativeCode($code); } } if ($userEntity && $options['ignore-update']) { if ($logger) { $logger(" Skipping {$userEntity->getUsername()}..."); } continue; } $isNew = false; if (!$userEntity) { $isNew = true; $userEntity = new User(); $userEntity->setPlainPassword($pwd); ++$countCreated; } else { if (!empty($pwd)) { $userEntity->setPlainPassword($pwd); } ++$countUpdated; } $userEntity->setUsername($username); $userEntity->setMail($email); $userEntity->setFirstName($firstName); $userEntity->setLastName($lastName); $userEntity->setAdministrativeCode($code); $userEntity->setPhone($phone); $userEntity->setLocale($lg); $userEntity->setAuthentication($authentication); $userEntity->setIsMailNotified($isMailNotified); $userEntity->setIsMailValidated($isMailValidated); if ($options['single-validate']) { $errors = $this->validator->validate($userEntity); if (count($errors) > 0) { $skipped[$i] = $userEntity; if ($isNew) { --$countCreated; } else { --$countUpdated; } continue; } } if (!$isNew && $logger) { $logger(" User {$j} ({$username}) being updated..."); $this->roleManager->associateRoles($userEntity, $additionalRoles); } if ($isNew) { if ($logger) { $logger(" User {$j} ({$username}) being created..."); } $this->createUser($userEntity, $sendMail, $additionalRoles, $model, $username . uniqid(), $organizations, $hasPersonalWorkspace, false); } $this->objectManager->persist($userEntity); $returnValues[] = $firstName . ' ' . $lastName; if ($group) { $this->groupManager->addUsersToGroup($group, [$userEntity]); } if ($logger) { $logger(' [UOW size: ' . $this->objectManager->getUnitOfWork()->size() . ']'); } ++$i; ++$j; if ($i % self::MAX_USER_BATCH_SIZE === 0) { if ($logger) { $logger(' [UOW size: ' . $this->objectManager->getUnitOfWork()->size() . ']'); } $this->objectManager->forceFlush(); if ($logger) { $logger(' flushing users...'); } $tmpRoles = $additionalRoles; $this->objectManager->clear(); $additionalRoles = []; foreach ($tmpRoles as $toAdd) { if ($toAdd) { $additionalRoles[] = $this->objectManager->merge($toAdd); } } if ($this->tokenStorage->getToken()) { $this->objectManager->merge($this->tokenStorage->getToken()->getUser()); } } } $this->objectManager->endFlushSuite(); if ($logger) { $logger($countCreated . ' users created.'); $logger($countUpdated . ' users updated.'); } foreach ($skipped as $key => $user) { $logger('The user ' . $user . ' was skipped at line ' . $key . ' because it failed the validation pass.'); } return $returnValues; }