From ef4ff9cb1dcb985e70a93f2aaa430b5c71f89733 Mon Sep 17 00:00:00 2001 From: Markos Gogoulos Date: Sun, 28 Dec 2025 14:33:51 +0200 Subject: [PATCH] this --- lti/adapters.py | 35 +++++++++++++++++++++++++++++++++-- lti/views.py | 12 +++++++++--- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/lti/adapters.py b/lti/adapters.py index b1ab8458..16ec5e21 100644 --- a/lti/adapters.py +++ b/lti/adapters.py @@ -8,14 +8,44 @@ import json from typing import Any, Dict, Optional from django.core.cache import cache +from pylti1p3.request import Request from pylti1p3.tool_config import ToolConfAbstract +class DjangoRequest(Request): + """Django request adapter for PyLTI1p3""" + + def __init__(self, request): + self._request = request + self._cookies = request.COOKIES + self._session = request.session + + def get_param(self, key): + """Get parameter from GET or POST""" + if self._request.method == 'POST': + return self._request.POST.get(key) + return self._request.GET.get(key) + + def get_cookie(self, key): + """Get cookie value""" + return self._cookies.get(key) + + def is_secure(self): + """Check if request is secure (HTTPS)""" + return self._request.is_secure() + + @property + def session(self): + """Get session""" + return self._session + + class DjangoOIDCLogin: """Handles OIDC login initiation""" def __init__(self, request, tool_config, launch_data_storage=None): self.request = request + self.lti_request = DjangoRequest(request) self.tool_config = tool_config self.launch_data_storage = launch_data_storage or DjangoSessionService(request) @@ -23,7 +53,7 @@ class DjangoOIDCLogin: """Get the redirect object for OIDC login""" from pylti1p3.oidc_login import OIDCLogin - oidc_login = OIDCLogin(self.request, self.tool_config, session_service=self.launch_data_storage, cookie_service=self.launch_data_storage) + oidc_login = OIDCLogin(self.lti_request, self.tool_config, session_service=self.launch_data_storage, cookie_service=self.launch_data_storage) return oidc_login.enable_check_cookies().redirect(redirect_url) @@ -33,6 +63,7 @@ class DjangoMessageLaunch: def __init__(self, request, tool_config, launch_data_storage=None): self.request = request + self.lti_request = DjangoRequest(request) self.tool_config = tool_config self.launch_data_storage = launch_data_storage or DjangoSessionService(request) @@ -40,7 +71,7 @@ class DjangoMessageLaunch: """Validate the LTI launch message""" from pylti1p3.message_launch import MessageLaunch - message_launch = MessageLaunch(self.request, self.tool_config, session_service=self.launch_data_storage, cookie_service=self.launch_data_storage) + message_launch = MessageLaunch(self.lti_request, self.tool_config, session_service=self.launch_data_storage, cookie_service=self.launch_data_storage) return message_launch diff --git a/lti/views.py b/lti/views.py index 28735f3d..db348930 100644 --- a/lti/views.py +++ b/lti/views.py @@ -30,7 +30,7 @@ from rest_framework.views import APIView from files.models import Media from rbac.models import RBACMembership -from .adapters import DjangoSessionService, DjangoToolConfig +from .adapters import DjangoRequest, DjangoSessionService, DjangoToolConfig from .handlers import ( apply_lti_roles, create_lti_session, @@ -85,10 +85,13 @@ class OIDCLoginView(View): # Create tool config for this platform tool_config = DjangoToolConfig.from_platform(platform) + # Wrap Django request for PyLTI1p3 + lti_request = DjangoRequest(request) + # Create OIDC login handler with session and cookie services session_service = DjangoSessionService(request) cookie_service = DjangoSessionService(request) # Using same service for cookies - oidc_login = OIDCLogin(request, tool_config, session_service=session_service, cookie_service=cookie_service) + oidc_login = OIDCLogin(lti_request, tool_config, session_service=session_service, cookie_service=cookie_service) # Redirect to platform's authorization endpoint redirect_obj = oidc_login.enable_check_cookies().redirect(target_link_uri) @@ -138,10 +141,13 @@ class LaunchView(View): # Create tool config tool_config = DjangoToolConfig.from_platform(platform) + # Wrap Django request for PyLTI1p3 + lti_request = DjangoRequest(request) + # Validate JWT and get launch data session_service = DjangoSessionService(request) cookie_service = DjangoSessionService(request) - message_launch = MessageLaunch(request, tool_config, session_service=session_service, cookie_service=cookie_service) + message_launch = MessageLaunch(lti_request, tool_config, session_service=session_service, cookie_service=cookie_service) # Get validated launch data launch_data = message_launch.get_launch_data()