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. 52
      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 int $creatorId
* @param array $emailTemplate * @param array $emailTemplate
* @param string $redirectToURLAfterLogin * @param string $redirectToURLAfterLogin
* @param bool $addUserToNode Only needed during installation.
* *
* @return mixed new user id - if the new user creation succeeds, false otherwise * @return mixed new user id - if the new user creation succeeds, false otherwise
* @desc The function tries to retrieve user id from the session. * @desc The function tries to retrieve user id from the session.
@ -172,14 +171,12 @@ class UserManager
$form = null, $form = null,
$creatorId = 0, $creatorId = 0,
$emailTemplate = [], $emailTemplate = [],
$redirectToURLAfterLogin = '', $redirectToURLAfterLogin = ''
$addUserToNode = true,
$addUserToUrl = true
) { ) {
$authSource = !empty($authSource) ? $authSource : PLATFORM_AUTH_SOURCE; $authSource = !empty($authSource) ? $authSource : PLATFORM_AUTH_SOURCE;
$creatorId = empty($creatorId) ? api_get_user_id() : 0; $creatorId = empty($creatorId) ? api_get_user_id() : 0;
if ($addUserToNode && 0 === $creatorId) { if (0 === $creatorId) {
Display::addFlash( Display::addFlash(
Display::return_message(get_lang('A user creator is needed')) Display::return_message(get_lang('A user creator is needed'))
); );
@ -187,7 +184,7 @@ class UserManager
} }
$creatorInfo = api_get_user_info($creatorId); $creatorInfo = api_get_user_info($creatorId);
$creatorEmail = isset($creatorInfo['email']) ? $creatorInfo['email'] : ''; $creatorEmail = $creatorInfo['email'] ?? '';
// First check if the login exists. // First check if the login exists.
if (!self::is_username_available($loginName)) { if (!self::is_username_available($loginName)) {
@ -331,19 +328,6 @@ class UserManager
$em = Database::getManager(); $em = Database::getManager();
$repo = Container::getUserRepository(); $repo = Container::getUserRepository();
$repo->updateUser($user, false); $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->persist($user);
$em->flush(); $em->flush();
@ -374,13 +358,11 @@ class UserManager
self::addUserAsAdmin($user); self::addUserAsAdmin($user);
} }
if ($addUserToUrl) { if (api_get_multiple_access_url()) {
if (api_get_multiple_access_url()) { UrlManager::add_user_to_url($userId, api_get_current_access_url_id());
UrlManager::add_user_to_url($userId, api_get_current_access_url_id()); } else {
} else { //we are adding by default the access_url_user table with access_url_id = 1
//we are adding by default the access_url_user table with access_url_id = 1 UrlManager::add_user_to_url($userId, 1);
UrlManager::add_user_to_url($userId, 1);
}
} }
if (is_array($extra) && count($extra) > 0) { if (is_array($extra) && count($extra) > 0) {
@ -5084,18 +5066,16 @@ class UserManager
public static function addUserAsAdmin(User $user) public static function addUserAsAdmin(User $user)
{ {
if ($user) { $userId = $user->getId();
$userId = $user->getId();
if (!self::is_admin($userId)) {
$table = Database::get_main_table(TABLE_MAIN_ADMIN);
$sql = "INSERT INTO $table SET user_id = $userId";
Database::query($sql);
}
$user->addRole('ROLE_SUPER_ADMIN'); if (!self::is_admin($userId)) {
self::getRepository()->updateUser($user, true); $table = Database::get_main_table(TABLE_MAIN_ADMIN);
$sql = "INSERT INTO $table SET user_id = $userId";
Database::query($sql);
} }
$user->addRole('ROLE_SUPER_ADMIN');
self::getRepository()->updateUser($user, true);
} }
public static function removeUserAdmin(User $user) public static function removeUserAdmin(User $user)

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

@ -35,15 +35,15 @@ class UserListener
$this->userRepository->updateCanonicalFields($user); $this->userRepository->updateCanonicalFields($user);
$this->userRepository->updatePassword($user); $this->userRepository->updatePassword($user);
$addResourceNode = true; if ($user->isSkipResourceNode()) {
if (0 === $user->getCreatorId()) { return;
$addResourceNode = false;
} }
if ($addResourceNode && !$user->hasResourceNode()) { if (!$user->hasResourceNode()) {
// @todo use the creator id.
$token = $this->security->getToken(); $token = $this->security->getToken();
if (null === $token) { 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(); $em = $args->getEntityManager();

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

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

Loading…
Cancel
Save