public function validate($value, Constraint $constraint) { $mode = $constraint->getDefaultOption(); $lines = str_getcsv(file_get_contents($value), PHP_EOL); $authDrivers = $this->authenticationManager->getDrivers(); foreach ($lines as $line) { $linesTab = explode(';', $line); $nbElements = count($linesTab); if (trim($line) != '') { if ($nbElements < 5) { $this->context->addViolation($constraint->message); return; } } } $usernames = array(); $mails = array(); if ($mode === 1) { $currentDate = new \DateTime(); $timestamp = $currentDate->getTimestamp(); $fakeUsername = '******' . $timestamp . '@@@'; $fakeMail = 'fake_email_' . $timestamp . '@fake-' . $timestamp . '-claroline-connect.com'; } foreach ($lines as $i => $line) { if (trim($line) != '') { $user = explode(';', $line); $firstName = $user[0]; $lastName = $user[1]; $username = $user[2]; $pwd = $user[3]; $email = $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[7]) === '' ? null : $user[7]; } else { $modelName = null; } !array_key_exists($email, $mails) ? $mails[$email] = array($i + 1) : ($mails[$email][] = $i + 1); !array_key_exists($username, $usernames) ? $usernames[$username] = array($i + 1) : ($usernames[$username][] = $i + 1); $existingUser = null; if ($mode === 1) { try { $existingUser = $this->userManager->getUserByUsernameOrMail($username, $email); } catch (NonUniqueResultException $e) { $msg = $this->translator->trans('line_number', array('%line%' => $i + 1), 'platform'); $msg .= ' ' . $this->translator->trans('username_and_email_from_two_different_users', array('%username%' => $username, '%email%' => $email), 'platform'); $this->context->addViolation($msg); continue; } } if (!is_null($existingUser)) { // For an update, we will validate user with a fake username and email $upperExistingUsername = strtoupper(trim($existingUser->getUsername())); $upperExistingMail = strtoupper(trim($existingUser->getMail())); $upperUsername = strtoupper(trim($username)); $upperMail = strtoupper(trim($email)); if ($upperExistingUsername === $upperUsername && $upperExistingMail === $upperMail) { $existingUser->setUsername($fakeUsername); $existingUser->setMail($fakeMail); } elseif ($upperExistingUsername === $upperUsername) { $existingUser->setUsername($fakeUsername); $existingUser->setMail($email); } else { $existingUser->setUsername($username); $existingUser->setMail($fakeMail); } $existingUser->setFirstName($firstName); $existingUser->setLastName($lastName); $existingUser->setPlainPassword($pwd); $existingUser->setAdministrativeCode($code); $existingUser->setPhone($phone); $errors = $this->validator->validate($existingUser, array('registration', 'Default')); $existingUser->setUsername($username); $existingUser->setMail($email); } else { $newUser = new User(); $newUser->setFirstName($firstName); $newUser->setLastName($lastName); $newUser->setUsername($username); $newUser->setPlainPassword($pwd); $newUser->setMail($email); $newUser->setAdministrativeCode($code); $newUser->setPhone($phone); $errors = $this->validator->validate($newUser, array('registration', 'Default')); } if ($authentication) { if (!in_array($authentication, $authDrivers)) { $msg = $this->translator->trans('authentication_invalid', array('%authentication%' => $authentication, '%line%' => $i + 1), 'platform') . ' '; $this->context->addViolation($msg); } } foreach ($errors as $error) { $this->context->addViolation($this->translator->trans('line_number', array('%line%' => $i + 1), 'platform') . ' ' . $error->getInvalidValue() . ' : ' . $error->getMessage()); } } } if ($modelName) { $model = $this->om->getRepository('ClarolineCoreBundle:Model\\WorkspaceModel')->findOneByName($modelName); if (!$model) { $msg = $this->translator->trans('model_invalid', array('%model%' => $modelName, '%line%' => $i + 1), 'platform') . ' '; $this->context->addViolation($msg); } } foreach ($usernames as $username => $lines) { if (count($lines) > 1) { $msg = $this->translator->trans('username_found_at', array('%username%' => $username, '%lines%' => $this->getLines($lines)), 'platform') . ' '; $this->context->addViolation($msg); } } foreach ($mails as $mail => $lines) { if (count($lines) > 1) { $msg = $this->translator->trans('email_found_at', array('%email%' => $mail, '%lines%' => $this->getLines($lines)), 'platform') . ' '; $this->context->addViolation($msg); } } }
/** * 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; }