From 7704e5d6a5603a73c9982e7245c60978a7001b05 Mon Sep 17 00:00:00 2001 From: Han Ngo Date: Fri, 17 Aug 2018 14:22:04 -0600 Subject: [PATCH] Support User Placement for LTI 1.3 Launch Closes PLAT-3636 Test Plan: - Verify the LTI 1.3 Launch for `User Navigation` works Change-Id: Idc1924269632f7d6e16f5c2e56d45d1fa47e27b0 Reviewed-on: https://gerrit.instructure.com/161216 Reviewed-by: Marc Alan Phillips Tested-by: Jenkins QA-Review: Weston Dransfield Product-Review: Weston Dransfield --- app/controllers/users_controller.rb | 13 ++++++- spec/controllers/users_controller_spec.rb | 42 ++++++++++++++++------- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index fa9a9c0c793..bbe52ef7681 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1253,7 +1253,18 @@ class UsersController < ApplicationController current_user: @current_user, current_pseudonym: @current_pseudonym, tool: @tool}) - adapter = Lti::LtiOutboundAdapter.new(@tool, @current_user, @domain_root_account).prepare_tool_launch(@return_url, variable_expander, opts) + adapter = if @tool.settings.fetch('use_1_3', false) + Lti::LtiAdvantageAdapter.new( + tool: @tool, + user: @current_user, + context: @domain_root_account, + return_url: @return_url, + expander: variable_expander, + opts: opts + ) + else + Lti::LtiOutboundAdapter.new(@tool, @current_user, @domain_root_account).prepare_tool_launch(@return_url, variable_expander, opts) + end @lti_launch.params = adapter.generate_post_payload @lti_launch.resource_url = @tool.user_navigation(:url) diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index b9d6f42518e..0e8f89cd637 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -17,6 +17,7 @@ # require_relative '../sharding_spec_helper' +require File.expand_path(File.dirname(__FILE__) + '/../lti_1_3_spec_helper') describe UsersController do let(:group_helper) { Factories::GradingPeriodGroupHelper.new } @@ -50,37 +51,52 @@ describe UsersController do tool end + let_once(:user) { user_factory(active_all: true) } + before do + account.account_users.create!(user: user) + user_session(user) + end + it "removes query string when post_only = true" do - u = user_factory(active_all: true) - account.account_users.create!(user: u) - user_session(@user) tool.user_navigation = { text: "example" } tool.settings['post_only'] = 'true' tool.save! - get :external_tool, params: {id:tool.id, user_id:u.id} + get :external_tool, params: {id:tool.id, user_id:user.id} expect(assigns[:lti_launch].resource_url).to eq 'http://www.example.com/basic_lti' end it "does not remove query string from url" do - u = user_factory(active_all: true) - account.account_users.create!(user: u) - user_session(@user) tool.user_navigation = { text: "example" } tool.save! - get :external_tool, params: {id:tool.id, user_id:u.id} + get :external_tool, params: {id:tool.id, user_id:user.id} expect(assigns[:lti_launch].resource_url).to eq 'http://www.example.com/basic_lti?first=john&last=smith' end it "uses localized labels" do - u = user_factory(active_all: true) - account.account_users.create!(user: u) - user_session(@user) - - get :external_tool, params: {id:tool.id, user_id:u.id} + get :external_tool, params: {id:tool.id, user_id:user.id} expect(tool.label_for(:user_navigation, :en)).to eq 'English Label' end + + context 'using LTI 1.3 when specified' do + include_context 'lti_1_3_spec_helper' + + subject do + get :external_tool, params: {id:tool.id, user_id:user.id} + JSON::JWT.decode(assigns[:lti_launch].params[:id_token], :skip_verification) + end + + before do + tool.settings['use_1_3'] = true + tool.developer_key = DeveloperKey.create! + tool.save! + end + + it 'does LTI 1.3 launch' do + expect(subject["https://purl.imsglobal.org/spec/lti/claim/message_type"]).to eq "LtiResourceLinkRequest" + end + end end describe "GET oauth" do