1
1
<?php
2
2
/* For license terms, see /license.txt */
3
3
4
+ use League \OAuth2 \Client \Token \AccessTokenInterface ;
4
5
use TheNetworg \OAuth2 \Client \Provider \Azure ;
5
6
6
7
/**
@@ -160,8 +161,7 @@ function ($position) use ($defaultOrder): bool {
160
161
return $ defaultOrder ;
161
162
}
162
163
163
- public function getUserIdByVerificationOrder (array $ azureUserData ): ?int
164
- {
164
+ public function getUserIdByVerificationOrder (array $ azureUserData , string $ azureUidKey = 'objectId ' ): ?int {
165
165
$ selectedOrder = $ this ->getExistingUserVerificationOrder ();
166
166
167
167
$ extraFieldValue = new ExtraFieldValue ('user ' );
@@ -176,7 +176,7 @@ public function getUserIdByVerificationOrder(array $azureUserData): ?int
176
176
),
177
177
3 => $ extraFieldValue ->get_item_id_from_field_variable_and_field_value (
178
178
AzureActiveDirectory::EXTRA_FIELD_AZURE_UID ,
179
- $ azureUserData [' objectId ' ]
179
+ $ azureUserData [$ azureUidKey ]
180
180
),
181
181
];
182
182
@@ -188,4 +188,108 @@ public function getUserIdByVerificationOrder(array $azureUserData): ?int
188
188
189
189
return null ;
190
190
}
191
+
192
+ /**
193
+ * @throws Exception
194
+ */
195
+ public function registerUser (
196
+ AccessTokenInterface $ token ,
197
+ Azure $ provider ,
198
+ array $ azureUserInfo ,
199
+ string $ apiGroupsRef = 'me/memberOf ' ,
200
+ string $ objectIdKey = 'objectId ' ,
201
+ string $ azureUidKey = 'objectId '
202
+ ) {
203
+ if (empty ($ azureUserInfo )) {
204
+ throw new Exception ('Groups info not found. ' );
205
+ }
206
+
207
+ $ userId = $ this ->getUserIdByVerificationOrder ($ azureUserInfo , $ azureUidKey );
208
+
209
+ if (empty ($ userId )) {
210
+ // If we didn't find the user
211
+ if ($ this ->get (self ::SETTING_PROVISION_USERS ) === 'true ' ) {
212
+ [$ userRole , $ isAdmin ] = $ this ->getUserRoleAndCheckIsAdmin (
213
+ $ token ,
214
+ $ provider ,
215
+ $ apiGroupsRef ,
216
+ $ objectIdKey
217
+ );
218
+
219
+ $ phone = null ;
220
+
221
+ if (isset ($ azureUserInfo ['telephoneNumber ' ])) {
222
+ $ phone = $ azureUserInfo ['telephoneNumber ' ];
223
+ } elseif (isset ($ azureUserInfo ['businessPhones ' ][0 ])) {
224
+ $ phone = $ azureUserInfo ['businessPhones ' ][0 ];
225
+ } elseif (isset ($ azureUserInfo ['mobilePhone ' ])) {
226
+ $ phone = $ azureUserInfo ['mobilePhone ' ];
227
+ }
228
+
229
+ // If the option is set to create users, create it
230
+ $ userId = UserManager::create_user (
231
+ $ azureUserInfo ['givenName ' ],
232
+ $ azureUserInfo ['surname ' ],
233
+ $ userRole ,
234
+ $ azureUserInfo ['mail ' ],
235
+ $ azureUserInfo ['userPrincipalName ' ],
236
+ '' ,
237
+ null ,
238
+ null ,
239
+ $ phone ,
240
+ null ,
241
+ 'azure ' ,
242
+ null ,
243
+ ($ azureUserInfo ['accountEnabled ' ] ? 1 : 0 ),
244
+ null ,
245
+ [
246
+ 'extra_ ' .self ::EXTRA_FIELD_ORGANISATION_EMAIL => $ azureUserInfo ['mail ' ],
247
+ 'extra_ ' .self ::EXTRA_FIELD_AZURE_ID => $ azureUserInfo ['mailNickname ' ],
248
+ 'extra_ ' .self ::EXTRA_FIELD_AZURE_UID => $ azureUserInfo [$ azureUidKey ],
249
+ ],
250
+ null ,
251
+ null ,
252
+ $ isAdmin
253
+ );
254
+ if (!$ userId ) {
255
+ throw new Exception (get_lang ('UserNotAdded ' ).' ' .$ azureUserInfo ['userPrincipalName ' ]);
256
+ }
257
+ } else {
258
+ throw new Exception ('User not found when checking the extra fields from ' .$ azureUserInfo ['mail ' ].' or ' .$ azureUserInfo ['mailNickname ' ].' or ' .$ azureUserInfo [$ azureUidKey ].'. ' );
259
+ }
260
+ }
261
+
262
+ return $ userId ;
263
+ }
264
+
265
+ private function getUserRoleAndCheckIsAdmin (
266
+ AccessTokenInterface $ token ,
267
+ Azure $ provider = null ,
268
+ string $ apiRef = 'me/memberOf ' ,
269
+ string $ objectIdKey = 'objectId '
270
+ ): array {
271
+ $ provider = $ provider ?: $ this ->getProvider ();
272
+
273
+ $ groups = $ provider ->get ($ apiRef , $ token );
274
+
275
+ // If any specific group ID has been defined for a specific role, use that
276
+ // ID to give the user the right role
277
+ $ givenAdminGroup = $ this ->get (self ::SETTING_GROUP_ID_ADMIN );
278
+ $ givenSessionAdminGroup = $ this ->get (self ::SETTING_GROUP_ID_SESSION_ADMIN );
279
+ $ givenTeacherGroup = $ this ->get (self ::SETTING_GROUP_ID_TEACHER );
280
+ $ userRole = STUDENT ;
281
+ $ isAdmin = false ;
282
+ foreach ($ groups as $ group ) {
283
+ if ($ givenAdminGroup == $ group [$ objectIdKey ]) {
284
+ $ userRole = COURSEMANAGER ;
285
+ $ isAdmin = true ;
286
+ } elseif ($ givenSessionAdminGroup == $ group [$ objectIdKey ]) {
287
+ $ userRole = SESSIONADMIN ;
288
+ } elseif ($ userRole != SESSIONADMIN && $ givenTeacherGroup == $ group [$ objectIdKey ]) {
289
+ $ userRole = COURSEMANAGER ;
290
+ }
291
+ }
292
+
293
+ return [$ userRole , $ isAdmin ];
294
+ }
191
295
}
0 commit comments