Fix installation

Fix admin/anon creation use entities on create_user function
pull/3904/head
Julio Montoya 4 years ago
parent d3d7f5787a
commit b090544ba6
  1. 26
      public/main/inc/lib/usermanager.lib.php
  2. 114
      public/main/install/install.lib.php
  3. 10
      src/CoreBundle/Entity/Listener/UserListener.php
  4. 16
      src/CoreBundle/Entity/User.php
  5. 2
      src/CoreBundle/Repository/Node/UserRepository.php

@ -140,7 +140,6 @@ class UserManager
* @param int $creatorId
* @param array $emailTemplate
* @param string $redirectToURLAfterLogin
* @param bool $addUserToNode Only needed during installation.
*
* @return mixed new user id - if the new user creation succeeds, false otherwise
* @desc The function tries to retrieve user id from the session.
@ -172,14 +171,12 @@ class UserManager
$form = null,
$creatorId = 0,
$emailTemplate = [],
$redirectToURLAfterLogin = '',
$addUserToNode = true,
$addUserToUrl = true
$redirectToURLAfterLogin = ''
) {
$authSource = !empty($authSource) ? $authSource : PLATFORM_AUTH_SOURCE;
$creatorId = empty($creatorId) ? api_get_user_id() : 0;
if ($addUserToNode && 0 === $creatorId) {
if (0 === $creatorId) {
Display::addFlash(
Display::return_message(get_lang('A user creator is needed'))
);
@ -187,7 +184,7 @@ class UserManager
}
$creatorInfo = api_get_user_info($creatorId);
$creatorEmail = isset($creatorInfo['email']) ? $creatorInfo['email'] : '';
$creatorEmail = $creatorInfo['email'] ?? '';
// First check if the login exists.
if (!self::is_username_available($loginName)) {
@ -331,19 +328,6 @@ class UserManager
$em = Database::getManager();
$repo = Container::getUserRepository();
$repo->updateUser($user, false);
// Add user as a node
if ($addUserToNode) {
$resourceNode = new ResourceNode();
$resourceNode
->setTitle($loginName)
->setCreator(api_get_user_entity($creatorId))
->setResourceType($repo->getResourceType())
;
$em->persist($resourceNode);
$user->setResourceNode($resourceNode);
}
$em->persist($user);
$em->flush();
@ -374,14 +358,12 @@ class UserManager
self::addUserAsAdmin($user);
}
if ($addUserToUrl) {
if (api_get_multiple_access_url()) {
UrlManager::add_user_to_url($userId, api_get_current_access_url_id());
} else {
//we are adding by default the access_url_user table with access_url_id = 1
UrlManager::add_user_to_url($userId, 1);
}
}
if (is_array($extra) && count($extra) > 0) {
$extra['item_id'] = $userId;
@ -5084,7 +5066,6 @@ class UserManager
public static function addUserAsAdmin(User $user)
{
if ($user) {
$userId = $user->getId();
if (!self::is_admin($userId)) {
@ -5096,7 +5077,6 @@ class UserManager
$user->addRole('ROLE_SUPER_ADMIN');
self::getRepository()->updateUser($user, true);
}
}
public static function removeUserAdmin(User $user)
{

@ -2478,68 +2478,63 @@ function finishInstallationWithContainer(
$result->free();
UserManager::setPasswordEncryption($encryptPassForm);
$timezone = api_get_timezone();
error_log('user creation - admin');
// Create admin user.
$adminId = UserManager::create_user(
$adminFirstName,
$adminLastName,
1,
$emailForm,
$loginForm,
$passForm,
'ADMIN',
$languageForm,
$adminPhoneForm,
'',
PLATFORM_AUTH_SOURCE,
'',
1,
0,
[],
'',
false,
true,
'',
false,
'',
0,
[],
'',
false,
false
);
$now = new DateTime();
// Creating admin user.
$admin = new User();
$admin
->setSkipResourceNode(true)
->setLastname($adminFirstName)
->setFirstname($adminLastName)
->setUsername($loginForm)
->setStatus(1)
->setPlainPassword($passForm)
->setEmail($emailForm)
->setOfficialCode('ADMIN')
->setCreatorId(1)
->setAuthSource(PLATFORM_AUTH_SOURCE)
->setPhone($adminPhoneForm)
->setLocale($languageForm)
->setRegistrationDate($now)
->setActive(1)
->setEnabled(1)
->setTimezone($timezone)
;
$repo = Container::getUserRepository();
$repo->updateUser($admin);
UserManager::addUserAsAdmin($admin);
$adminId = $admin->getId();
error_log('user creation - anon');
// Create anonymous user.
$anonId = UserManager::create_user(
'Joe',
'Anonymous',
6,
'anonymous@localhost',
'anon',
'anon',
'anonymous',
$languageForm,
'',
'',
PLATFORM_AUTH_SOURCE,
'',
1,
0,
null,
'',
false,
false,
'',
false,
'',
$adminId,
[],
'',
false,
false
);
$anon = new User();
$anon
->setSkipResourceNode(true)
->setLastname('Joe')
->setFirstname('Anonymous')
->setUsername('anon')
->setStatus(ANONYMOUS)
->setPlainPassword('anon')
->setEmail('anonymous@localhost')
->setOfficialCode('anonymous')
->setCreatorId(1)
->setAuthSource(PLATFORM_AUTH_SOURCE)
->setLocale($languageForm)
->setRegistrationDate($now)
->setActive(1)
->setEnabled(1)
->setTimezone($timezone)
;
$repo->updateUser($anon);
$anonId = $anon->getId();
$userRepo = $container->get(UserRepository::class);
$urlRepo = $container->get(AccessUrlRepository::class);
@ -2561,6 +2556,9 @@ function finishInstallationWithContainer(
$userRepo->addUserToResourceNode($adminId, $adminId);
$userRepo->addUserToResourceNode($anonId, $adminId);
$manager->persist($anon);
$manager->flush();
installSchemas($container);

@ -35,15 +35,15 @@ class UserListener
$this->userRepository->updateCanonicalFields($user);
$this->userRepository->updatePassword($user);
$addResourceNode = true;
if (0 === $user->getCreatorId()) {
$addResourceNode = false;
if ($user->isSkipResourceNode()) {
return;
}
if ($addResourceNode && !$user->hasResourceNode()) {
if (!$user->hasResourceNode()) {
// @todo use the creator id.
$token = $this->security->getToken();
if (null === $token) {
throw new Exception('A user creator is needed');
throw new Exception('A user creator is needed, to adding the user in a ResourceNode');
}
$em = $args->getEntityManager();

@ -690,6 +690,9 @@ class User implements UserInterface, EquatableInterface, ResourceInterface, Reso
*/
protected $uuid;
// Property used only during installation.
protected bool $skipResourceNode;
public function __construct()
{
$this->uuid = Uuid::v4();
@ -702,6 +705,7 @@ class User implements UserInterface, EquatableInterface, ResourceInterface, Reso
$this->active = true;
$this->registrationDate = new DateTime();
$this->authSource = 'platform';
$this->skipResourceNode = false;
$this->courses = new ArrayCollection();
//$this->items = new ArrayCollection();
$this->classes = new ArrayCollection();
@ -2136,6 +2140,18 @@ class User implements UserInterface, EquatableInterface, ResourceInterface, Reso
return $this->sessionsRelUser;
}
public function isSkipResourceNode(): bool
{
return $this->skipResourceNode;
}
public function setSkipResourceNode(bool $skipResourceNode): self
{
$this->skipResourceNode = $skipResourceNode;
return $this;
}
/**
* Retreives this user's related sessions.
*

@ -523,6 +523,8 @@ class UserRepository extends ResourceRepository implements UserLoaderInterface,
/**
* Find potential users to send a message.
*
* @todo remove api_is_platform_admin
*
* @param int $currentUserId The current user ID
* @param string $searchFilter Optional. The search text to filter the user list
* @param int $limit Optional. Sets the maximum number of results to retrieve

Loading…
Cancel
Save