From 9b0b472dd603656e6c6be39b9fac9abb843cc023 Mon Sep 17 00:00:00 2001 From: Adrian Hutchinson Date: Mon, 17 Feb 2020 09:29:38 -0800 Subject: [PATCH] MDL-67072 mod_lti: OIDC additional login parameters --- mod/lti/locallib.php | 63 +++++++++++++++++++++------------ mod/lti/tests/locallib_test.php | 32 +++++++++++++++++ 2 files changed, 73 insertions(+), 22 deletions(-) diff --git a/mod/lti/locallib.php b/mod/lti/locallib.php index d8e1ef8d730..4cd77860c2b 100644 --- a/mod/lti/locallib.php +++ b/mod/lti/locallib.php @@ -3278,7 +3278,44 @@ function lti_post_launch_html($newparms, $endpoint, $debug=false) { */ function lti_initiate_login($courseid, $id, $instance, $config, $messagetype = 'basic-lti-launch-request', $title = '', $text = '') { - global $SESSION, $USER, $CFG; + global $SESSION; + + $params = lti_build_login_request($courseid, $id, $instance, $config, $messagetype); + $SESSION->lti_message_hint = "{$courseid},{$config->typeid},{$id}," . base64_encode($title) . ',' . + base64_encode($text); + + $r = "
lti_initiatelogin . + "\" name=\"ltiInitiateLoginForm\" id=\"ltiInitiateLoginForm\" method=\"post\" " . + "encType=\"application/x-www-form-urlencoded\">\n"; + + foreach ($params as $key => $value) { + $key = htmlspecialchars($key); + $value = htmlspecialchars($value); + $r .= " \n"; + } + $r .= "
\n"; + + $r .= "\n"; + + return $r; +} + +/** + * Prepares an LTI 1.3 login request + * + * @param int $courseid Course ID + * @param int $id LTI instance ID + * @param stdClass|null $instance LTI instance + * @param stdClass $config Tool type configuration + * @param string $messagetype LTI message type + * @return array Login request parameters + */ +function lti_build_login_request($courseid, $id, $instance, $config, $messagetype) { + global $USER, $CFG; if (!empty($instance)) { $endpoint = !empty($instance->toolurl) ? $instance->toolurl : $config->lti_toolurl; @@ -3302,27 +3339,9 @@ function lti_initiate_login($courseid, $id, $instance, $config, $messagetype = ' $params['target_link_uri'] = $endpoint; $params['login_hint'] = $USER->id; $params['lti_message_hint'] = $id; - $SESSION->lti_message_hint = "{$courseid},{$config->typeid},{$id}," . base64_encode($title) . ',' . - base64_encode($text); - - $r = "
lti_initiatelogin . - "\" name=\"ltiInitiateLoginForm\" id=\"ltiInitiateLoginForm\" method=\"post\" " . - "encType=\"application/x-www-form-urlencoded\">\n"; - - foreach ($params as $key => $value) { - $key = htmlspecialchars($key); - $value = htmlspecialchars($value); - $r .= " \n"; - } - $r .= "
\n"; - - $r .= "\n"; - - return $r; + $params['client_id'] = $config->lti_clientid; + $params['lti_deployment_id'] = $config->typeid; + return $params; } function lti_get_type($typeid) { diff --git a/mod/lti/tests/locallib_test.php b/mod/lti/tests/locallib_test.php index f79359a9a93..d9c90cafe2e 100644 --- a/mod/lti/tests/locallib_test.php +++ b/mod/lti/tests/locallib_test.php @@ -1383,4 +1383,36 @@ MwIDAQAB $this->assertEquals($token->timecreated + LTI_ACCESS_TOKEN_LIFE, $token->validuntil); $this->assertNull($token->lastaccess); } + + /** + * Test lti_build_login_request(). + */ + public function test_lti_build_login_request() { + global $USER, $CFG; + + $this->resetAfterTest(); + + $USER->id = 123456789; + + $course = $this->getDataGenerator()->create_course(); + $instance = $this->getDataGenerator()->create_module('lti', + [ + 'course' => $course->id, + ] + ); + + $config = new stdClass(); + $config->lti_clientid = 'some-client-id'; + $config->typeid = 'some-type-id'; + $config->lti_toolurl = 'some-lti-tool-url'; + + $request = lti_build_login_request($course->id, $instance->id, $instance, $config, 'basic-lti-launch-request'); + + $this->assertEquals($CFG->wwwroot, $request['iss']); + $this->assertEquals('http://some-lti-tool-url', $request['target_link_uri']); + $this->assertEquals(123456789, $request['login_hint']); + $this->assertEquals($instance->id, $request['lti_message_hint']); + $this->assertEquals('some-client-id', $request['client_id']); + $this->assertEquals('some-type-id', $request['lti_deployment_id']); + } }