diff options
| author | Murtaza Sultani <sultani@data-quest.de> | 2026-02-16 15:43:22 +0100 |
|---|---|---|
| committer | Murtaza Sultani <sultani@data-quest.de> | 2026-02-16 15:43:22 +0100 |
| commit | cef8e072ff354be2d1495531bbb42501b841490c (patch) | |
| tree | 20b964d2786f23cd313160ee97b2faed95e88d47 | |
| parent | 7295a1eb22d399d457245383b593835bdc98f0e3 (diff) | |
Resolve "LTI 1.3a: User-Roles wird beim Launch nicht korrekt übermittelt"
Closes #6266
Merge request studip/studip!4738
| -rw-r--r-- | app/controllers/course/lti.php | 7 | ||||
| -rw-r--r-- | lib/classes/LTI13a/PlatformManager.php | 15 | ||||
| -rw-r--r-- | lib/classes/LTI13a/RoleMapper.php | 53 |
3 files changed, 56 insertions, 19 deletions
diff --git a/app/controllers/course/lti.php b/app/controllers/course/lti.php index 6069a00..df419e4 100644 --- a/app/controllers/course/lti.php +++ b/app/controllers/course/lti.php @@ -15,6 +15,7 @@ use Studip\LTI13a\Registration; use Studip\LTI13a\RegistrationManager; use OAT\Library\Lti1p3Core\Message\Payload\MessagePayloadInterface\MessagePayloadInterface; use LtiResourceLink as LtiResourceLinkModel; +use Studip\LTI13a\RoleMapper; /** * course/lti.php - LTI consumer API for Stud.IP @@ -306,9 +307,7 @@ class Course_LtiController extends StudipController $registration, $GLOBALS['user']->id, $this->resource_link->deployment_id, - [ - PlatformManager::getLtiRoleClaimForStudipRole($GLOBALS['perm']->get_studip_perm($this->course_id)) - ], + RoleMapper::fromLocal($GLOBALS['perm']->get_studip_perm($this->course_id)), array_merge( [ new ContextClaim( @@ -538,7 +537,7 @@ class Course_LtiController extends StudipController $GLOBALS['user']->id, null, $this->link->deployment_id, - [PlatformManager::getLtiRoleClaimForStudipRole($GLOBALS['perm']->get_studip_perm($this->course_id))] + RoleMapper::fromLocal($GLOBALS['perm']->get_studip_perm($this->course_id)) ); $this->render_text($message->toHtmlRedirectForm()); } else { diff --git a/lib/classes/LTI13a/PlatformManager.php b/lib/classes/LTI13a/PlatformManager.php index 9017267..95c4c66 100644 --- a/lib/classes/LTI13a/PlatformManager.php +++ b/lib/classes/LTI13a/PlatformManager.php @@ -70,21 +70,6 @@ class PlatformManager return \Keyring::generate('lti13a_platform', 'global'); } - public static function getLtiRoleClaimForStudipRole(string $role) : string - { - if (in_array($role, ['dozent', 'admin', 'root'])) { - //Lecturer/admin - return 'http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor'; - } elseif ($role === 'tutor') { - return 'http://purl.imsglobal.org/vocab/lis/v2/membership#Mentor'; - } elseif (in_array($role, ['user', 'autor'])) { - //Learner - return 'http://purl.imsglobal.org/vocab/lis/v2/membership#Learner'; - } - //Invalid role: - return ''; - } - /** * Generates the URL for returning from the tool in an LTI deep linking process. * diff --git a/lib/classes/LTI13a/RoleMapper.php b/lib/classes/LTI13a/RoleMapper.php new file mode 100644 index 0000000..c94abea --- /dev/null +++ b/lib/classes/LTI13a/RoleMapper.php @@ -0,0 +1,53 @@ +<?php +namespace Studip\LTI13a; + +final class RoleMapper +{ + // Global + const LTI_SYSTEM_ADMIN = 'http://purl.imsglobal.org/vocab/lis/v2/system/person#Administrator'; + const LTI_SYSTEM_USER = 'http://purl.imsglobal.org/vocab/lis/v2/system/person#User'; + + // Institution + const LTI_INSTITUTION_ADMIN = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Administrator'; + + + // Course + const LTI_COURSE_ADMIN = 'http://purl.imsglobal.org/vocab/lis/v2/membership#Administrator'; + const LTI_COURSE_INSTRUCTOR = 'http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor'; + const LTI_COURSE_TA = 'http://purl.imsglobal.org/vocab/lis/v2/membership#TeachingAssistant'; + const LTI_COURSE_MENTOR = 'http://purl.imsglobal.org/vocab/lis/v2/membership#Mentor'; + const LTI_COURSE_LEARNER = 'http://purl.imsglobal.org/vocab/lis/v2/membership#Learner'; + const LTI_COURSE_OBSERVER = 'http://purl.imsglobal.org/vocab/lis/v2/membership#Observer'; + + public static function fromLocal(string $localRole): array + { + return match(strtolower($localRole)) { + 'root' => [ + self::LTI_SYSTEM_ADMIN, + self::LTI_INSTITUTION_ADMIN, + self::LTI_COURSE_ADMIN + ], + 'admin' => [ + self::LTI_INSTITUTION_ADMIN, + self::LTI_COURSE_ADMIN + ], + 'dozent' => [ + self::LTI_COURSE_INSTRUCTOR, + self::LTI_COURSE_TA, + self::LTI_COURSE_MENTOR + ], + 'tutor' => [ + self::LTI_COURSE_TA, + self::LTI_COURSE_MENTOR + ], + 'autor' => [ + self::LTI_COURSE_LEARNER, + self::LTI_COURSE_OBSERVER + ], + 'user' => [ + self::LTI_COURSE_OBSERVER + ], + default => [] + }; + } +} |
