Skip to content

Commit f35579c

Browse files
committed
Auth: Fix command to synchronize users with Azure - refs BT#22639
1 parent f8a217e commit f35579c

File tree

3 files changed

+50
-69
lines changed

3 files changed

+50
-69
lines changed

src/CoreBundle/Command/AzureSyncAbstractCommand.php

Lines changed: 9 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
namespace Chamilo\CoreBundle\Command;
88

99
use Chamilo\CoreBundle\Entity\AzureSyncState;
10-
use Chamilo\CoreBundle\Entity\User;
1110
use Chamilo\CoreBundle\Helpers\AuthenticationConfigHelper;
1211
use Chamilo\CoreBundle\Helpers\AzureAuthenticatorHelper;
1312
use Chamilo\CoreBundle\Repository\AzureSyncStateRepository;
@@ -43,9 +42,12 @@ public function __construct(
4342
) {
4443
parent::__construct();
4544

45+
$this->providerParams = $configHelper->getProviderConfig('azure');
46+
4647
$this->client = $this->clientRegistry->getClient('azure');
48+
4749
$this->provider = $this->client->getOAuth2Provider();
48-
$this->providerParams = $configHelper->getProviderConfig('azure');
50+
$this->provider->tenant = $this->providerParams['tenant'] ?? null;
4951
}
5052

5153
/**
@@ -67,29 +69,17 @@ protected function generateOrRefreshToken(?AccessTokenInterface &$token): void
6769
*/
6870
protected function getAzureUsers(): Generator
6971
{
70-
$userFields = [
71-
'givenName',
72-
'surname',
73-
'mail',
74-
'userPrincipalName',
75-
'businessPhones',
76-
'mobilePhone',
77-
'accountEnabled',
78-
'mailNickname',
79-
'id',
80-
];
81-
8272
if ($this->providerParams['script_users_delta']) {
8373
$usersDeltaLink = $this->syncStateRepo->findOneBy(['title' => AzureSyncState::USERS_DATALINK]);
8474

8575
$query = $usersDeltaLink
8676
? $usersDeltaLink->getValue()
87-
: \sprintf('$select=%s', implode(',', $userFields));
77+
: \sprintf('$select=%s', implode(',', AzureAuthenticatorHelper::QUERY_FIELDS));
8878
} else {
8979
$query = \sprintf(
9080
'$top=%d&$select=%s',
9181
AzureSyncState::API_PAGE_SIZE,
92-
implode(',', $userFields)
82+
implode(',', AzureAuthenticatorHelper::QUERY_FIELDS)
9383
);
9484
}
9585

@@ -99,16 +89,15 @@ protected function getAzureUsers(): Generator
9989
try {
10090
$this->generateOrRefreshToken($token);
10191

102-
$azureUsersRequest = $this->provider->request(
103-
'get',
104-
$this->providerParams['script_users_delta'] ? "users/delta?$query" : "users?$query",
92+
$azureUsersRequest = $this->provider->get(
93+
$this->providerParams['script_users_delta'] ? "/v1.0/users/delta?$query" : "/v1.0/users?$query",
10594
$token
10695
);
10796
} catch (GuzzleException|Exception $e) {
10897
throw new Exception('Exception when requesting users from Azure: '.$e->getMessage());
10998
}
11099

111-
$azureUsersInfo = $azureUsersRequest['value'] ?? [];
100+
$azureUsersInfo = $azureUsersRequest ?? [];
112101

113102
foreach ($azureUsersInfo as $azureUserInfo) {
114103
$azureUserInfo['mail'] = $azureUserInfo['mail'] ?? null;
@@ -134,50 +123,6 @@ protected function getAzureUsers(): Generator
134123
} while ($hasNextLink);
135124
}
136125

137-
/**
138-
* @return array<string, string|false>
139-
*/
140-
public function getGroupUidByRole(): array
141-
{
142-
$groupUidList = [
143-
'admin' => $this->providerParams['group_id_admin'],
144-
'sessionAdmin' => $this->providerParams['group_id_session_admin'],
145-
'teacher' => $this->providerParams['group_id_teacher'],
146-
];
147-
148-
return array_filter($groupUidList);
149-
}
150-
151-
/**
152-
* @return array<string, callable>
153-
*/
154-
public function getUpdateActionByRole(): array
155-
{
156-
return [
157-
'admin' => function (User $user): void {
158-
$user
159-
->setStatus(COURSEMANAGER)
160-
->addUserAsAdmin()
161-
->setRoleFromStatus(COURSEMANAGER)
162-
;
163-
},
164-
'sessionAdmin' => function (User $user): void {
165-
$user
166-
->setStatus(SESSIONADMIN)
167-
->removeUserAsAdmin()
168-
->setRoleFromStatus(SESSIONADMIN)
169-
;
170-
},
171-
'teacher' => function (User $user): void {
172-
$user
173-
->setStatus(COURSEMANAGER)
174-
->removeUserAsAdmin()
175-
->setRoleFromStatus(COURSEMANAGER)
176-
;
177-
},
178-
];
179-
}
180-
181126
/**
182127
* @throws Exception
183128
*/

src/CoreBundle/Command/AzureSyncUsersCommand.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,13 @@ protected function execute(InputInterface $input, OutputInterface $output): int
5555

5656
$io->section('Updating users status');
5757

58-
$roleGroups = $this->getGroupUidByRole();
59-
$roleActions = $this->getUpdateActionByRole();
58+
$roleActions = $this->azureHelper->getUpdateActionByRole();
59+
60+
foreach ($this->providerParams['group_id'] as $userRole => $groupUid) {
61+
if (empty($groupUid)) {
62+
continue;
63+
}
6064

61-
foreach ($roleGroups as $userRole => $groupUid) {
6265
try {
6366
$azureGroupMembersInfo = iterator_to_array($this->getAzureGroupMembers($groupUid));
6467
} catch (Exception $e) {
@@ -114,7 +117,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
114117
);
115118
}
116119

117-
$io->success('You have a new command! Now make it your own! Pass --help to see your options.');
120+
$io->success('Done.');
118121

119122
return Command::SUCCESS;
120123
}

src/CoreBundle/Helpers/AzureAuthenticatorHelper.php

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ public function getExistingUserVerificationOrder(): array
172172
return [1, 2, 3];
173173
}
174174

175-
private function formatUserData(array $azureUserData): array {
175+
private function formatUserData(array $azureUserData): array
176+
{
176177
$phone = null;
177178

178179
if (isset($azureUserData['telephoneNumber'])) {
@@ -207,4 +208,36 @@ private function formatUserData(array $azureUserData): array {
207208
$extra,
208209
];
209210
}
211+
212+
/**
213+
* The keys are the user roles, as defined for the group_ip parameter in the authentication.yaml file for Azure.
214+
*
215+
* @return array<string, callable>
216+
*/
217+
public function getUpdateActionByRole(): array
218+
{
219+
return [
220+
'admin' => function (User $user): void {
221+
$user
222+
->setStatus(COURSEMANAGER)
223+
->addUserAsAdmin()
224+
->setRoleFromStatus(COURSEMANAGER)
225+
;
226+
},
227+
'session_admin' => function (User $user): void {
228+
$user
229+
->setStatus(SESSIONADMIN)
230+
->removeUserAsAdmin()
231+
->setRoleFromStatus(SESSIONADMIN)
232+
;
233+
},
234+
'teacher' => function (User $user): void {
235+
$user
236+
->setStatus(COURSEMANAGER)
237+
->removeUserAsAdmin()
238+
->setRoleFromStatus(COURSEMANAGER)
239+
;
240+
},
241+
];
242+
}
210243
}

0 commit comments

Comments
 (0)