From a61c65b68a64205ef70091a6d2d42e48e5633025 Mon Sep 17 00:00:00 2001 From: Nicolas Clerc Date: Thu, 9 Jan 2025 09:03:01 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B(backend)=20fix=20blackboard=20LTI?= =?UTF-8?q?=20roles=20parsing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Parsing LTI roles sent by blackboard was broken. Fixes #2676 --- CHANGELOG.md | 4 ++++ src/backend/marsha/core/lti/__init__.py | 2 +- src/backend/marsha/core/tests/lti/tests.py | 5 +++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e25e2937e..cdddfee30a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Fixed + +- Fix blackboard LTI roles parsing + ## [5.5.2] - 2024-12-19 ### Added diff --git a/src/backend/marsha/core/lti/__init__.py b/src/backend/marsha/core/lti/__init__.py index 67cbecb299..0e11b153e4 100644 --- a/src/backend/marsha/core/lti/__init__.py +++ b/src/backend/marsha/core/lti/__init__.py @@ -265,7 +265,7 @@ def roles(self): """ roles = self.request.POST.get("roles", "") # remove LIS roles prefix - roles = re.sub(r"^urn:lti:instrole:ims/lis/", "", roles) + roles = re.sub(r"urn:lti:(inst)?role:ims/lis/", "", roles) # Remove all spaces from the string and extra trailing or leading commas roles = re.sub(r"[\s+]", "", roles).strip(",") # Return a set of the roles mentioned in the request diff --git a/src/backend/marsha/core/tests/lti/tests.py b/src/backend/marsha/core/tests/lti/tests.py index 7fc0d8a726..b4b3f6d7d6 100644 --- a/src/backend/marsha/core/tests/lti/tests.py +++ b/src/backend/marsha/core/tests/lti/tests.py @@ -97,15 +97,16 @@ def test_lti_video_instructor(self): ", staff", # a leading comma should be ignored "staff,", # a trailing comma should be ignored "urn:lti:instrole:ims/lis/Instructor", # the LIS role identifier should be recognized + "urn:lti:role:ims/lis/Instructor,urn:lti:instrole:ims/lis/Faculty", ]: request = self.factory.post("/", {"roles": roles_string}) lti = LTI(request, uuid.uuid4()) - self.assertTrue(lti.is_instructor) + self.assertTrue(lti.is_instructor, roles_string) for roles_string in ["", "instructori", "student", "administrator,student"]: request = self.factory.post("/", {"roles": roles_string}) lti = LTI(request, uuid.uuid4()) - self.assertFalse(lti.is_instructor) + self.assertFalse(lti.is_instructor, roles_string) @mock.patch.object(lti_module, "verify_request_common", return_value=True) def test_lti_passport_unknown(self, mock_verify):