panda_pal 5.3.5 → 5.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +8 -0
- data/app/controllers/panda_pal/lti_v1_p0_controller.rb +2 -0
- data/app/controllers/panda_pal/lti_v1_p3_controller.rb +2 -2
- data/app/lib/lti_xml/base_platform.rb +1 -1
- data/app/lib/panda_pal/launch_url_helpers.rb +9 -3
- data/app/models/panda_pal/organization_concerns/settings_validation.rb +14 -0
- data/lib/panda_pal.rb +1 -0
- data/lib/panda_pal/helpers/controller_helper.rb +2 -1
- data/lib/panda_pal/helpers/route_helper.rb +1 -0
- data/lib/panda_pal/version.rb +1 -1
- data/panda_pal.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e3454f04c4cbf7a07dc7a041118bb3b60db681c531ebf228115de69f1114d50
|
4
|
+
data.tar.gz: bc600d9940213278b6a0b9e908df51c24012a75ac120746758719faa91e8abbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 507728d1f3dbe751125f4bd7fbda5a2245c20eee20ea8d446f12d5b701007ab1fbee5cfe81d741d400966db2f526d484e4f8ffde1c82f5db43a1e685f96362cc
|
7
|
+
data.tar.gz: c97afd8ec0a896f46a5b63a6eb8d9b9f13d31d995d448d29800f88f23c6fd4897877e7958e54d5d47e23dab04277c1eba7c73b852dc61704d197f3ec47ed27aa
|
data/README.md
CHANGED
@@ -21,6 +21,14 @@ PandaPal::stage_navigation(:account_navigation, {
|
|
21
21
|
|
22
22
|
Configuration data for an installation can be set by creating a `PandaPal::Organization` record. Due to the nature of the data segregation, once created, the name of the organization should not be changed (and will raise a validation error).
|
23
23
|
|
24
|
+
### LTI 1.3 Configuration
|
25
|
+
LTI 1.3 has some additional configuration steps required to setup an LTI:
|
26
|
+
|
27
|
+
1. If you're running Canvas locally, make sure the `config/redis.yml` and `config/dynamic_settings.yml` files exist in Canvas.
|
28
|
+
2. In prod, you'll need to generate a RSA Private Key for the LTI to use. You can set the `LTI_PRIVATE_KEY` ENV variable, or manually set `PandaPal.lti_private_key = OpenSSL::PKey::RSA.new(key)`.
|
29
|
+
3. Make sure you have Redis installed and linked correctly
|
30
|
+
4. Your PandaPal::Organization's `key` should be `CLIENT_ID/DEPLOYMENT_ID` (which can be found in Canvas). If a Deployment ID is not given, the key should just be `CLIENT_ID`.
|
31
|
+
|
24
32
|
### Launch URL property
|
25
33
|
LTI Spec: `The launch_url contains the URL to which the LTI Launch is to be sent. The secure_launch_url is the URL to use if secure http is required. One of either the launch_url or the secure_launch_url must be specified.`
|
26
34
|
|
@@ -2,6 +2,7 @@ require_dependency "panda_pal/application_controller"
|
|
2
2
|
|
3
3
|
module PandaPal
|
4
4
|
class LtiV1P3Controller < ApplicationController
|
5
|
+
skip_before_action :verify_authenticity_token
|
5
6
|
before_action :validate_launch!, only: [:resource_link_request]
|
6
7
|
around_action :switch_tenant, only: [:resource_link_request]
|
7
8
|
|
@@ -54,8 +55,7 @@ module PandaPal
|
|
54
55
|
parsed_request_url = URI.parse(request_url)
|
55
56
|
|
56
57
|
mapped_placements = PandaPal.lti_paths.map do |k, opts|
|
57
|
-
opts = opts
|
58
|
-
opts.delete(:route_helper_key)
|
58
|
+
opts = LaunchUrlHelpers.normalize_lti_launch_desc(opts)
|
59
59
|
opts.merge!({
|
60
60
|
placement: k,
|
61
61
|
target_link_uri: LaunchUrlHelpers.absolute_launch_url(k.to_sym, host: parsed_request_url, launch_handler: v1p3_resource_link_request_path),
|
@@ -85,7 +85,7 @@ module LtiXml
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def ext_params(options, k)
|
88
|
-
options.
|
88
|
+
options = PandaPal::LaunchUrlHelpers.normalize_lti_launch_desc(options)
|
89
89
|
options[:url] = PandaPal::LaunchUrlHelpers.absolute_launch_url(k.to_sym, host: parsed_request_url, launch_handler: nil)
|
90
90
|
options
|
91
91
|
end
|
@@ -2,11 +2,10 @@ module PandaPal
|
|
2
2
|
module LaunchUrlHelpers
|
3
3
|
def self.absolute_launch_url(launch_type, host:, launch_handler: nil)
|
4
4
|
opts = PandaPal.lti_paths[launch_type]
|
5
|
-
|
6
|
-
|
7
|
-
is_direct = opts[:route_helper_key].present? || !launch_handler.present?
|
5
|
+
is_direct = opts[:no_redirect] || !launch_handler.present?
|
8
6
|
|
9
7
|
if is_direct
|
8
|
+
final_url = launch_url(opts, launch_type: launch_type)
|
10
9
|
return final_url if URI.parse(final_url).absolute?
|
11
10
|
return [host.to_s, final_url].join
|
12
11
|
else
|
@@ -17,6 +16,13 @@ module PandaPal
|
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
19
|
+
def self.normalize_lti_launch_desc(opts)
|
20
|
+
opts = opts.dup
|
21
|
+
opts.delete(:route_helper_key)
|
22
|
+
opts.delete(:no_redirect)
|
23
|
+
opts
|
24
|
+
end
|
25
|
+
|
20
26
|
def self.launch_url(opts, launch_type: nil)
|
21
27
|
url = launch_route(opts, launch_type: launch_type)
|
22
28
|
url = resolve_url_symbol(url) if url.is_a?(Symbol)
|
@@ -99,6 +99,20 @@ module PandaPal
|
|
99
99
|
errors.concat(val_errors)
|
100
100
|
end
|
101
101
|
|
102
|
+
if settings.is_a?(Array)
|
103
|
+
if spec[:length].is_a?(Range)
|
104
|
+
errors << "#{human_path} should contain #{spec[:length]} items" unless spec[:length].include?(settings.count)
|
105
|
+
elsif spec[:length].is_a?(Numeric)
|
106
|
+
errors << "#{human_path} should contain exactly #{spec[:length]} items" unless spec[:length] == settings.count
|
107
|
+
end
|
108
|
+
|
109
|
+
if spec[:item] != nil
|
110
|
+
settings.each_with_index do |value, i|
|
111
|
+
validate_settings_level(settings[i], spec[:item], path: [*path, i], errors: errors)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
102
116
|
if settings.is_a?(Hash)
|
103
117
|
if spec[:properties] != nil
|
104
118
|
spec[:properties].each do |key, pspec|
|
data/lib/panda_pal.rb
CHANGED
@@ -81,6 +81,7 @@ module PandaPal
|
|
81
81
|
|
82
82
|
def self.validate_lti_navigation(errors = [])
|
83
83
|
@@lti_navigation.each do |k, v|
|
84
|
+
next if v[:route_helper_key]
|
84
85
|
errors << "lti navigation '#{k}' does not have a Route!" unless (LaunchUrlHelpers.launch_url(k) rescue nil)
|
85
86
|
end
|
86
87
|
errors
|
@@ -127,7 +127,8 @@ module PandaPal::Helpers
|
|
127
127
|
|
128
128
|
def organization_key
|
129
129
|
org_key ||= params[:oauth_consumer_key]
|
130
|
-
org_key ||= "#{params[:client_id]}/#{params[:deployment_id]}" if params[:client_id].present?
|
130
|
+
org_key ||= "#{params[:client_id]}/#{params[:deployment_id]}" if params[:client_id].present? && params[:deployment_id].present?
|
131
|
+
org_key ||= params[:client_id] if params[:client_id].present?
|
131
132
|
org_key ||= session[:organization_key]
|
132
133
|
org_key
|
133
134
|
end
|
@@ -9,6 +9,7 @@ module PandaPal::Helpers::RouteHelper
|
|
9
9
|
path = "#{base_path}/#{nav.to_s}"
|
10
10
|
|
11
11
|
lti_options = options.delete(:lti_options) || {}
|
12
|
+
lti_options[:no_redirect] = options.delete(:no_redirect)
|
12
13
|
lti_options[:route_helper_key] = path.split('/').reject(&:empty?).join('_')
|
13
14
|
post(path, options.dup, &block)
|
14
15
|
get(path, options.dup, &block)
|
data/lib/panda_pal/version.rb
CHANGED
data/panda_pal.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_dependency 'attr_encrypted', '~> 3.0.0'
|
24
24
|
s.add_dependency 'secure_headers', '~> 6.1'
|
25
25
|
s.add_dependency 'json-jwt'
|
26
|
+
s.add_dependency 'httparty'
|
26
27
|
|
27
28
|
s.add_development_dependency 'sidekiq'
|
28
29
|
s.add_development_dependency 'sidekiq-scheduler'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: panda_pal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.3.
|
4
|
+
version: 5.3.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Instructure ProServe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -128,6 +128,20 @@ dependencies:
|
|
128
128
|
- - ">="
|
129
129
|
- !ruby/object:Gem::Version
|
130
130
|
version: '0'
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
name: httparty
|
133
|
+
requirement: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
type: :runtime
|
139
|
+
prerelease: false
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
131
145
|
- !ruby/object:Gem::Dependency
|
132
146
|
name: sidekiq
|
133
147
|
requirement: !ruby/object:Gem::Requirement
|