From 869d3c5c5a07ac1e3451628465998bab6338e423 Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos <1697880+AngelFQC@users.noreply.github.com> Date: Wed, 26 Feb 2025 12:27:50 -0500 Subject: [PATCH] Auth: Extend the user.auth_source field #6046 --- public/main/admin/course_import.php | 4 +- public/main/admin/ldap_synchro.php | 4 +- public/main/admin/user_add.php | 21 +++- public/main/admin/user_edit.php | 36 +++++-- public/main/admin/user_export.php | 17 +++- public/main/admin/user_import.php | 7 +- public/main/admin/user_update_import.php | 9 +- public/main/auth/inscription.php | 3 +- public/main/auth/lostPassword.php | 5 +- public/main/auth/profile.php | 5 +- public/main/cron/import_csv.php | 11 ++- public/main/inc/lib/api.lib.php | 10 +- public/main/inc/lib/login.lib.php | 96 +++++++++--------- public/main/inc/lib/myspace.lib.php | 3 +- public/main/inc/lib/online.inc.php | 13 ++- public/main/inc/lib/usermanager.lib.php | 67 +++++++------ public/main/inc/lib/webservices/Rest.php | 12 ++- .../inc/lib/zombie/zombie_manager.class.php | 21 ++-- .../inc/lib/zombie/zombie_report.class.php | 4 +- public/main/install/install.lib.php | 7 +- public/main/my_space/user_edit.php | 5 +- public/main/session/session_import.php | 5 +- public/main/user/user_export.php | 25 ++++- .../azure_active_directory/src/callback.php | 2 +- .../index.php | 5 +- .../plugin/lti_provider/src/LtiProvider.php | 2 +- .../src/Loader/UsersLoader.php | 2 +- .../DataFixtures/AccessUserFixtures.php | 9 +- .../OAuth2ProviderFactoryDecorator.php | 8 +- src/CoreBundle/Entity/User.php | 97 ++++++++++++++++++- src/CoreBundle/Entity/UserAuthSource.php | 77 +++++++++++++++ .../AnonymousUserSubscriber.php | 7 +- .../Schema/V200/Version20250221113400.php | 46 +++++++++ .../Repository/UserAuthSourceRepository.php | 22 +++++ .../OAuth2/GenericAuthenticator.php | 3 +- .../AuthenticationConfigHelper.php | 39 ++++++-- tests/datafiller/fill_many_users.php | 2 +- tests/datafiller/fill_users.php | 2 +- 38 files changed, 531 insertions(+), 182 deletions(-) create mode 100644 src/CoreBundle/Entity/UserAuthSource.php create mode 100644 src/CoreBundle/Migrations/Schema/V200/Version20250221113400.php create mode 100644 src/CoreBundle/Repository/UserAuthSourceRepository.php diff --git a/public/main/admin/course_import.php b/public/main/admin/course_import.php index bb00f572d5c..9ec28218d8b 100644 --- a/public/main/admin/course_import.php +++ b/public/main/admin/course_import.php @@ -7,6 +7,8 @@ * Copyright (c) 2005 Bart Mollet . */ +use Chamilo\CoreBundle\Entity\UserAuthSource; + /** * Validates imported data. * @@ -167,7 +169,7 @@ function parse_csv_courses_data($file) $this_section = SECTION_PLATFORM_ADMIN; api_protect_admin_script(); -$defined_auth_sources[] = PLATFORM_AUTH_SOURCE; +$defined_auth_sources[] = UserAuthSource::PLATFORM; if (isset($extAuthSource) && is_array($extAuthSource)) { $defined_auth_sources = array_merge($defined_auth_sources, array_keys($extAuthSource)); diff --git a/public/main/admin/ldap_synchro.php b/public/main/admin/ldap_synchro.php index 34ec98897f8..72f7e149c0f 100644 --- a/public/main/admin/ldap_synchro.php +++ b/public/main/admin/ldap_synchro.php @@ -95,7 +95,7 @@ $password = $val[0]; // Pour faciliter la gestion on ajoute le code "etape-annee" $official_code = $etape."-".$annee; - $auth_source = "ldap"; + $auth_source = ["ldap"]; // Pas de date d'expiration d'etudiant (a recuperer par rapport au shadow expire LDAP) $expiration_date = ''; $active = 1; @@ -126,7 +126,7 @@ $lastname, $username, null, - null, + [], $email, $status, $official_code, diff --git a/public/main/admin/user_add.php b/public/main/admin/user_add.php index 3a48c1fa68d..9aed0cb9d7f 100644 --- a/public/main/admin/user_add.php +++ b/public/main/admin/user_add.php @@ -2,8 +2,12 @@ /* For licensing terms, see /license.txt */ +use Chamilo\CoreBundle\Entity\AccessUrl; use Chamilo\CoreBundle\Entity\User; +use Chamilo\CoreBundle\Entity\UserAuthSource; use Chamilo\CoreBundle\Framework\Container; +use Chamilo\CoreBundle\ServiceHelper\AccessUrlHelper; +use Chamilo\CoreBundle\ServiceHelper\AuthenticationConfigHelper; $cidReset = true; require_once __DIR__.'/../inc/global.inc.php'; @@ -15,6 +19,12 @@ api_protect_admin_script(true); api_protect_limit_for_session_admin(); +/** @var AuthenticationConfigHelper $authenticationConfigHelper */ +$authenticationConfigHelper = Container::$container->get(AuthenticationConfigHelper::class); + +/** @var AccessUrl $accessUrl */ +$accessUrl = Container::$container->get(AccessUrlHelper::class)->getCurrent(); + $is_platform_admin = api_is_platform_admin() ? 1 : 0; $message = null; @@ -175,23 +185,24 @@ function updateStatus(){ // Password $group = []; +$extAuthSource = $authenticationConfigHelper->getAuthSourceAuthentications($accessUrl); $auth_sources = 0; //make available wider as we need it in case of form reset (see below) $nb_ext_auth_source_added = 0; -if (isset($extAuthSource) && count($extAuthSource) > 0) { +if (count($extAuthSource) > 0) { $auth_sources = []; - foreach ($extAuthSource as $key => $info) { + foreach ($extAuthSource as $key) { // @todo : make uniform external authentification configuration (ex : cas and external_login ldap) // Special case for CAS. CAS is activated from Chamilo > Administration > Configuration > CAS // extAuthSource always on for CAS even if not activated // same action for file user_edit.php - if ((CAS_AUTH_SOURCE == $key && 'true' === api_get_setting('cas_activate')) || (CAS_AUTH_SOURCE != $key)) { + if ((UserAuthSource::CAS == $key && 'true' === api_get_setting('cas_activate')) || (UserAuthSource::CAS != $key)) { $auth_sources[$key] = $key; $nb_ext_auth_source_added++; } } if ($nb_ext_auth_source_added > 0) { $group[] = $form->createElement('radio', 'password_auto', null, get_lang('External authentification').' ', 2); - $group[] = $form->createElement('select', 'auth_source', null, $auth_sources); + $group[] = $form->createElement('select', 'auth_source', null, $auth_sources, ['multiple' => 'multiple']); $group[] = $form->createElement('static', '', '', '
'); } } @@ -366,7 +377,7 @@ function updateStatus(){ $auth_source = $user['password']['auth_source']; $password = 'PLACEHOLDER'; } else { - $auth_source = PLATFORM_AUTH_SOURCE; + $auth_source = [UserAuthSource::PLATFORM]; $password = '1' === $user['password']['password_auto'] ? api_generate_password() : $user['password']['password']; } diff --git a/public/main/admin/user_edit.php b/public/main/admin/user_edit.php index 720b4a741ab..c3168a8a107 100644 --- a/public/main/admin/user_edit.php +++ b/public/main/admin/user_edit.php @@ -2,8 +2,12 @@ /* For licensing terms, see /license.txt */ +use Chamilo\CoreBundle\Entity\AccessUrl; use Chamilo\CoreBundle\Entity\User; +use Chamilo\CoreBundle\Entity\UserAuthSource; use Chamilo\CoreBundle\Framework\Container; +use Chamilo\CoreBundle\ServiceHelper\AccessUrlHelper; +use Chamilo\CoreBundle\ServiceHelper\AuthenticationConfigHelper; use ChamiloSession as Session; use Chamilo\CoreBundle\Component\Utils\ActionIcon; @@ -21,6 +25,12 @@ $userObj = api_get_user_entity($user_id); $illustrationRepo = Container::getIllustrationRepository(); +/** @var AuthenticationConfigHelper $authenticationConfigHelper */ +$authenticationConfigHelper = Container::$container->get(AuthenticationConfigHelper::class); + +/** @var AccessUrl $accessUrl */ +$accessUrl = Container::$container->get(AccessUrlHelper::class)->getCurrent(); + $htmlHeadXtra[] = '