19declare(strict_types=1);
56 $auth_arr = explode(
'_', $a_auth_key);
57 if (count($auth_arr) > 1) {
58 return 'lti_' . $auth_arr[1];
70 $auth_arr = explode(
'_', $a_auth_mode);
71 if (count($auth_arr) > 1) {
86 $query =
'SELECT consumer_pk from lti2_consumer where enabled = ' .
$ilDB->quote(1,
'integer');
91 $sids[] = $row->consumer_pk;
104 $query =
'SELECT distinct(consumer_pk) consumer_pk from lti2_consumer';
109 $sids[] = $row->consumer_pk;
123 return $consumer->getTitle();
133 if (self::isAuthModeLTI($a_auth_mode)) {
134 $auth_arr = explode(
'_', $a_auth_mode);
135 return (
int) $auth_arr[1];
151 $auth_arr = explode(
'_', $a_auth_mode);
164 $query =
'SELECT consumer_pk from lti2_consumer where consumer_key = ' .
$ilDB->quote(
165 $a_oauth_consumer_key,
174 $lti_id = $row->consumer_pk;
177 $this->
getLogger()->debug(
'External consumer key is: ' . (
int) $lti_id);
190 $query =
'SELECT prefix from lti_ext_consumer where id = ' .
$ilDB->quote($a_lti_id,
'integer');
197 $prefix = $row->prefix;
199 $this->
getLogger()->debug(
'LTI prefix: ' . $prefix);
212 $query =
'SELECT role from lti_ext_consumer where id = ' .
$ilDB->quote($a_lti_id,
'integer');
218 $role = (
int) $row->role;
220 $this->
getLogger()->debug(
'LTI role: ' . $role);
238 if (
$DIC->http()->wrapper()->post()->has(
'launch_presentation_return_url')) {
239 $this->launchReturnUrl =
$DIC->http()->wrapper()->post()->retrieve(
'launch_presentation_return_url',
$DIC->refinery()->kindlyTo()->string());
240 setcookie(
"launch_presentation_return_url", $this->launchReturnUrl, time() + 86400,
"/",
"",
true,
true);
241 $this->
logger->info(
"Setting launch_presentation_return_url in cookie storage " . $this->launchReturnUrl);
243 $lti_provider->handleRequest();
244 $this->provider = $lti_provider;
245 $this->messageParameters = $this->provider->getMessageParameters();
247 if (!
$DIC->http()->wrapper()->post()->has(
'launch_presentation_return_url')) {
248 $this->launchReturnUrl =
$_COOKIE[
'launch_presentation_return_url'] ??
"";
249 $this->
logger->info(
"Catching launch_presentation_return_url from cookies" . $this->launchReturnUrl);
253 if (!$lti_provider->ok) {
254 $this->
getLogger()->info(
'LTI authentication failed with message: ' . $lti_provider->reason);
255 $status->
setReason($lti_provider->reason);
259 $this->
getLogger()->debug(
'LTI authentication success');
262 if (empty($this->messageParameters)) {
263 $status->
setReason(
'empty_lti_message_parameters');
270 $this->ref_id = $platform->getRefId();
274 if (isset($lti_context_ids) && is_array($lti_context_ids)) {
275 if (!in_array($this->ref_id, $lti_context_ids)) {
276 $this->
getLogger()->debug(
"push new lti ref_id: " . $this->ref_id);
282 $this->
getLogger()->debug(
"lti_context_ids is not set. Create new array...");
287 if (!empty($this->messageParameters[
'launch_presentation_return_url'])) {
288 $post[
'launch_presentation_return_url'] = $this->messageParameters[
'launch_presentation_return_url'];
290 if (!empty($this->messageParameters[
'launch_presentation_css_url'])) {
291 $post[
'launch_presentation_css_url'] = $this->messageParameters[
'launch_presentation_css_url'];
293 if (!empty($this->messageParameters[
'resource_link_title'])) {
294 $post[
'resource_link_title'] = $this->messageParameters[
'resource_link_title'];
300 $obj_definition =
$DIC[
"objDefinition"];
304 if (!$platform->enabled) {
305 $this->
getLogger()->warning(
'Consumer is not enabled');
306 $status->
setReason(
'lti_consumer_inactive');
311 if (!$platform->getActive()) {
312 $this->
getLogger()->warning(
'Consumer is not active');
313 $status->
setReason(
'lti_consumer_inactive');
318 $lti_id = $platform->getExtConsumerId();
320 $status->
setReason(
'lti_auth_failed_invalid_key');
325 $this->
getLogger()->debug(
'Using prefix:' . $platform->getPrefix());
327 $this->
getCredentials()->setUsername($this->messageParameters[
'user_id']);
332 $platform->getPrefix()
335 if ($internal_account) {
336 $this->
updateUser($internal_account, $platform);
338 $internal_account = $this->
createUser($platform);
356 protected function findUserId(
string $a_oauth_user,
string $a_oauth_id,
string $a_user_prefix):
int
359 self::AUTH_MODE_PREFIX .
'_' . $a_oauth_id,
366 $this->
getLogger()->debug(
'Found user with auth mode lti_' . $a_oauth_id .
' with user_id: ' .
$user_id);
379 global $ilClientIniFile,
$DIC;
385 $user_obj =
new ilObjUser($a_local_user_id);
386 if (isset($this->messageParameters[
'lis_person_name_given'])) {
387 $user_obj->setFirstname($this->messageParameters[
'lis_person_name_given']);
389 $user_obj->setFirstname(
'-');
391 if (isset($this->messageParameters[
'lis_person_name_family'])) {
392 $user_obj->setLastname($this->messageParameters[
'lis_person_name_family']);
394 $user_obj->setLastname(
'-');
396 $user_obj->setEmail($this->messageParameters[
'lis_person_contact_email_primary']);
398 $user_obj->setActive(
true);
400 $until = $user_obj->getTimeLimitUntil();
402 if ($until < (time() + (
int) $ilClientIniFile->readVariable(
'session',
'expire'))) {
403 $user_obj->setTimeLimitFrom(time() - 60);
404 $user_obj->setTimeLimitUntil(time() + (
int) $ilClientIniFile->readVariable(
"session",
"expire"));
407 $user_obj->refreshLogin();
409 $GLOBALS[
'DIC']->rbac()->admin()->assignUser($consumer->
getRole(), $user_obj->getId());
412 $this->
getLogger()->info(
'Update of lti user with uid: ' . $user_obj->getId() .
' and login: ' . $user_obj->getLogin());
413 return $user_obj->getId();
426 global $ilClientIniFile,
$DIC;
435 $newUser[
"login"] = $local_user;
436 if (isset($this->messageParameters[
'lis_person_name_given'])) {
437 $newUser[
"firstname"] = $this->messageParameters[
'lis_person_name_given'];
439 $newUser[
"firstname"] =
'-';
441 if (isset($this->messageParameters[
'lis_person_name_family'])) {
442 $newUser[
"lastname"] = $this->messageParameters[
'lis_person_name_family'];
444 $newUser[
"lastname"] =
'-';
446 $newUser[
'email'] = $this->messageParameters[
'lis_person_contact_email_primary'];
454 $newUser[
"profile_incomplete"] = 0;
458 $newUser[
"gender"] =
'n';
459 $newUser[
"title"] =
null;
460 $newUser[
"birthday"] =
null;
461 $newUser[
"institution"] =
null;
462 $newUser[
"department"] =
null;
463 $newUser[
"street"] =
null;
464 $newUser[
"city"] =
null;
465 $newUser[
"zipcode"] =
null;
466 $newUser[
"country"] =
null;
467 $newUser[
"sel_country"] =
null;
468 $newUser[
"phone_office"] =
null;
469 $newUser[
"phone_home"] =
null;
470 $newUser[
"phone_mobile"] =
null;
471 $newUser[
"fax"] =
null;
472 $newUser[
"matriculation"] =
null;
473 $newUser[
"second_email"] =
null;
474 $newUser[
"hobby"] =
null;
475 $newUser[
"client_ip"] =
null;
476 $newUser[
"passwd_salt"] =
null;
477 $newUser[
"latitude"] =
null;
478 $newUser[
"longitude"] =
null;
479 $newUser[
"loc_zoom"] =
null;
480 $newUser[
"last_login"] =
null;
481 $newUser[
"first_login"] =
null;
482 $newUser[
"last_profile_prompt"] =
null;
485 $newUser[
"referral_comment"] =
null;
486 $newUser[
"approve_date"] =
null;
487 $newUser[
"agree_date"] =
null;
488 $newUser[
"inactivation_date"] =
null;
489 $newUser[
"time_limit_from"] =
null;
490 $newUser[
"time_limit_until"] =
null;
491 $newUser[
"is_self_registered"] =
null;
494 $newUser[
"passwd_enc_type"] =
"";
495 $newUser[
"active"] =
true;
496 $newUser[
"time_limit_owner"] = 7;
497 $newUser[
"time_limit_unlimited"] = 0;
498 $newUser[
"time_limit_message"] = 0;
499 $newUser[
"passwd"] =
" ";
503 $userObj->assignData($newUser);
504 $userObj->setTitle($userObj->getFullname());
505 $userObj->setDescription($userObj->getEmail());
511 $userObj->setTimeLimitOwner(7);
512 $userObj->setTimeLimitUnlimited(
false);
513 $userObj->setTimeLimitFrom(time() - 5);
515 $userObj->setTimeLimitUntil(time() + (
int) $ilClientIniFile->readVariable(
"session",
"expire"));
518 $userObj->setOwner(6);
520 $userObj->setActive(
true);
522 $userObj->setLastPasswordChangeTS(time());
523 $userObj->saveAsNew();
524 $userObj->writePrefs();
526 $GLOBALS[
'DIC']->rbac()->admin()->assignUser($consumer->
getRole(), $userObj->getId());
528 $this->
getLogger()->info(
'Created new lti user with uid: ' . $userObj->getId() .
' and login: ' . $userObj->getLogin());
529 return $userObj->getId();
535 $this->
getLogger()->info(
'$target_ref_id: ' . $target_ref_id);
536 if (!$target_ref_id) {
537 $this->
getLogger()->warning(
'No target id given');
543 $roles = $this->messageParameters[
'roles'] ??
'';
545 if (!is_string($roles) || empty($roles)) {
546 $this->
getLogger()->warning(
'No role information given or invalid role format.');
550 $this->
getLogger()->info(
"Deassigning all roles for user: " . $user_id);
551 $DIC->rbac()->admin()->deassignUser($obj_settings->getTutorRole(),
$user_id);
552 $DIC->rbac()->admin()->deassignUser($obj_settings->getMemberRole(),
$user_id);
553 $DIC->rbac()->admin()->deassignUser($obj_settings->getAdminRole(),
$user_id);
555 $role_arr = is_array($roles) ? $roles : explode(
',', $roles);
557 $this->
getLogger()->info(
'Recieved roles: ' . implode(
', ', $role_arr));
559 $tree =
$DIC->repositoryTree();
560 $parent = $tree->getParentId($target_ref_id);
564 foreach ($role_arr as $role) {
567 if (isset($local_role_id)) {
568 $this->
getLogger()->info(
'Assigning local role ID: ' . $local_role_id .
' for LTI role: ' . $role .
' to user ID: ' .
$user_id);
569 $DIC->rbac()->admin()->assignUser($local_role_id,
$user_id);
571 $this->
getLogger()->info(
'No local role mapping found for LTI role: ' . $role);
590 'http://purl.imsglobal.org/vocab/lti/system/person#TestUser' =>
null,
591 'http://purl.imsglobal.org/vocab/lis/v2/system/person#Administrator' => $settings->
getAdminRole(),
592 'http://purl.imsglobal.org/vocab/lis/v2/system/person#None' =>
null,
593 'http://purl.imsglobal.org/vocab/lis/v2/system/person#AccountAdmin' =>
null,
594 'http://purl.imsglobal.org/vocab/lis/v2/system/person#Creator' =>
null,
595 'http://purl.imsglobal.org/vocab/lis/v2/system/person#SysAdmin' =>
null,
596 'http://purl.imsglobal.org/vocab/lis/v2/system/person#SysSupport' =>
null,
597 'http://purl.imsglobal.org/vocab/lis/v2/system/person#User' =>
null,
600 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Administrator' => $settings->
getAdminRole(),
601 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Faculty' => $settings->
getTutorRole(),
602 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Guest' =>
null,
603 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#None' =>
null,
604 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Other' =>
null,
605 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Staff' =>
null,
606 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Student' => $settings->
getMemberRole(),
607 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Alumni' =>
null,
608 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Instructor' => $settings->
getTutorRole(),
609 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Learner' => $settings->
getMemberRole(),
610 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Member' => $settings->
getMemberRole(),
611 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Mentor' =>
null,
612 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Observer' =>
null,
613 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#ProspectiveStudent' =>
null,
616 'http://purl.imsglobal.org/vocab/lis/v2/membership#Administrator' => $settings->
getAdminRole(),
617 'http://purl.imsglobal.org/vocab/lis/v2/membership#ContentDeveloper' =>
null,
618 'http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor' => $settings->
getTutorRole(),
619 'http://purl.imsglobal.org/vocab/lis/v2/membership#Learner' => $settings->
getMemberRole(),
620 'http://purl.imsglobal.org/vocab/lis/v2/membership#Mentor' =>
null,
621 'http://purl.imsglobal.org/vocab/lis/v2/membership#Manager' => $settings->
getAdminRole(),
622 'http://purl.imsglobal.org/vocab/lis/v2/membership#Member' => $settings->
getMemberRole(),
623 'http://purl.imsglobal.org/vocab/lis/v2/membership#Officer' =>
null,
626 'http://purl.imsglobal.org/vocab/lis/v2/membership/Instructor#TeachingAssistant' => $settings->
getTutorRole(),
627 'http://purl.imsglobal.org/vocab/lis/v2/membership/Instructor#TeachingAssistantGroup' => $settings->
getTutorRole(),
628 'http://purl.imsglobal.org/vocab/lis/v2/membership/Instructor#TeachingAssistantOffering' => $settings->
getTutorRole(),
629 'http://purl.imsglobal.org/vocab/lis/v2/membership/Instructor#TeachingAssistantSection' => $settings->
getTutorRole(),
630 'http://purl.imsglobal.org/vocab/lis/v2/membership/Instructor#TeachingAssistantSectionAssociation' => $settings->
getTutorRole(),
631 'http://purl.imsglobal.org/vocab/lis/v2/membership/Instructor#TeachingAssistantTemplate' => $settings->
getTutorRole(),
633 'http://purl.imsglobal.org/vocab/lis/v2/membership/Instructor#Grader' => $settings->
getTutorRole(),
635 'http://purl.imsglobal.org/vocab/lis/v2/membership/Instructor#GuestInstructor' => $settings->
getTutorRole(),
636 'http://purl.imsglobal.org/vocab/lis/v2/membership/Instructor#Lecturer' => $settings->
getTutorRole(),
637 'http://purl.imsglobal.org/vocab/lis/v2/membership/Instructor#PrimaryInstructor' => $settings->
getTutorRole(),
638 'http://purl.imsglobal.org/vocab/lis/v2/membership/Instructor#SecondaryInstructor' => $settings->
getTutorRole(),
640 'http://purl.imsglobal.org/vocab/lis/v2/membership/Instructor#ExternalInstructor' => $settings->
getTutorRole(),
643 'http://purl.imsglobal.org/vocab/lis/v2/membership/Learner#ExternalLearner' => $settings->
getMemberRole(),
644 'http://purl.imsglobal.org/vocab/lis/v2/membership/Learner#GuestLearner' => $settings->
getMemberRole(),
645 'http://purl.imsglobal.org/vocab/lis/v2/membership/Learner#Learner' => $settings->
getMemberRole(),
646 'http://purl.imsglobal.org/vocab/lis/v2/membership/Learner#NonCreditLearner' => $settings->
getMemberRole(),
649 'http://purl.imsglobal.org/vocab/lis/v2/membership/Manager#AreaManager' => $settings->
getAdminRole(),
650 'http://purl.imsglobal.org/vocab/lis/v2/membership/Manager#CourseCoordinator' =>
null,
651 'http://purl.imsglobal.org/vocab/lis/v2/membership/Manager#ExternalObserver' =>
null,
652 'http://purl.imsglobal.org/vocab/lis/v2/membership/Manager#Manager' => $settings->
getAdminRole(),
653 'http://purl.imsglobal.org/vocab/lis/v2/membership/Manager#Observer' =>
null,
656 'http://purl.imsglobal.org/vocab/lis/v2/membership/Mentor#Advisor' =>
null,
657 'http://purl.imsglobal.org/vocab/lis/v2/membership/Mentor#Auditor' =>
null,
658 'http://purl.imsglobal.org/vocab/lis/v2/membership/Mentor#ExternalAdvisor' =>
null,
659 'http://purl.imsglobal.org/vocab/lis/v2/membership/Mentor#ExternalAuditor' =>
null,
660 'http://purl.imsglobal.org/vocab/lis/v2/membership/Mentor#ExternalLearningFacilitator' =>
null,
661 'http://purl.imsglobal.org/vocab/lis/v2/membership/Mentor#ExternalMentor' =>
null,
662 'http://purl.imsglobal.org/vocab/lis/v2/membership/Mentor#ExternalReviewer' =>
null,
663 'http://purl.imsglobal.org/vocab/lis/v2/membership/Mentor#ExternalTutor' =>
null,
664 'http://purl.imsglobal.org/vocab/lis/v2/membership/Mentor#LearningFacilitator' =>
null,
665 'http://purl.imsglobal.org/vocab/lis/v2/membership/Mentor#Mentor' =>
null,
666 'http://purl.imsglobal.org/vocab/lis/v2/membership/Mentor#Reviewer' =>
null,
667 'http://purl.imsglobal.org/vocab/lis/v2/membership/Mentor#Tutor' => $settings->
getTutorRole(),
670 'http://purl.imsglobal.org/vocab/lis/v2/membership/Officer#Chair' =>
null,
671 'http://purl.imsglobal.org/vocab/lis/v2/membership/Officer#Communications' =>
null,
672 'http://purl.imsglobal.org/vocab/lis/v2/membership/Officer#Secretary' =>
null,
673 'http://purl.imsglobal.org/vocab/lis/v2/membership/Officer#Treasurer' =>
null,
674 'http://purl.imsglobal.org/vocab/lis/v2/membership/Officer#Vice-Chair' =>
null,
677 'http://purl.imsglobal.org/vocab/lis/v2/membership/ContentDeveloper#ContentDeveloper' =>
null,
678 'http://purl.imsglobal.org/vocab/lis/v2/membership/ContentDeveloper#ContentExpert' =>
null,
679 'http://purl.imsglobal.org/vocab/lis/v2/membership/ContentDeveloper#ExternalContentExpert' =>
null,
680 'http://purl.imsglobal.org/vocab/lis/v2/membership/ContentDeveloper#Librarian' =>
null,
683 'http://purl.imsglobal.org/vocab/lis/v2/membership/Member#Member' => $settings->
getMemberRole(),
686 'http://purl.imsglobal.org/vocab/lis/v2/membership/Administrator#Administrator' => $settings->
getAdminRole(),
687 'http://purl.imsglobal.org/vocab/lis/v2/membership/Administrator#Developer' =>
null,
688 'http://purl.imsglobal.org/vocab/lis/v2/membership/Administrator#ExternalDeveloper' =>
null,
689 'http://purl.imsglobal.org/vocab/lis/v2/membership/Administrator#ExternalSupport' =>
null,
690 'http://purl.imsglobal.org/vocab/lis/v2/membership/Administrator#ExternalSystemAdministrator' =>
null,
691 'http://purl.imsglobal.org/vocab/lis/v2/membership/Administrator#Support' =>
null,
692 'http://purl.imsglobal.org/vocab/lis/v2/membership/Administrator#SystemAdministrator' =>
null,
699 'ContentDeveloper' =>
null,
708 if (isset($role_map[$lti_role])) {
709 return $role_map[$lti_role];
710 } elseif (isset($simple_name_map[$lti_role])) {
712 return $simple_name_map[$lti_role];
OAuth based lti authentication.
static getServerIdByAuthMode(string $a_auth_mode)
Get auth id by auth mode.
static getActiveAuthModes()
get all active authmode server ids
findAuthKeyId(string $a_oauth_consumer_key)
find consumer key id
static getKeyByAuthMode(string $a_auth_mode)
Get auth id by auth mode.
__construct(ilAuthCredentials $credentials)
Constructor.
static lookupConsumer(int $a_sid)
Lookup consumer title.
static getAuthModeByKey(string $a_auth_key)
Get auth mode by key.
createUser(ilLTIPlatform $consumer)
create new user @access protected
handleLocalRoleAssignments(int $user_id, ilLTIPlatform $consumer, int $target_ref_id, int $default_rol_id=null)
findAuthPrefix(int $a_lti_id)
find lti id
ilLTIDataConnector $dataConnector
mapLTIRoleToLocalRole(string $lti_role, ilLTIProviderObjectSetting $settings)
Maps an LTI role (URI or simple name) to a local ILIAS role ID.
findUserId(string $a_oauth_user, string $a_oauth_id, string $a_user_prefix)
Find user by auth mode and lti id.
updateUser(int $a_local_user_id, ilLTIPlatform $consumer)
update existing user @access protected
static isAuthModeLTI(string $a_auth_mode)
Check if user auth mode is LTI.
findGlobalRole(int $a_lti_id)
find global role of consumer
ilAuthCredentials $credentials
const int STATUS_AUTHENTICATION_FAILED
setReason(string $a_reason)
Set reason.
setAuthenticatedUserId(int $a_id)
setStatus(int $a_status)
Set auth status.
const int STATUS_AUTHENTICATED
static _generateLogin(string $a_login)
generate free login by starting with a default string and adding postfix numbers
const int AUTH_PROVIDER_LTI
static getLogger(string $a_component_id)
Get component logger.
Component logger with individual log levels by component id.
static _lookupId(string|array $a_user_str)
static _checkExternalAuthAccount(string $a_auth, string $a_account, bool $tryFallback=true)
check whether external account and authentication method matches with a user
static _lookupType(int $id, bool $reference=false)
static get(string $a_var)
static clear(string $a_var)
static set(string $a_var, $a_val)
Set a value.
static now()
Return current timestamp in Y-m-d H:i:s format.
doAuthentication(ilAuthStatus $status)
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc