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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 751203d046fbd547e8f194feabb335a81a08be96f6a557712f1673d139576a29
4
- data.tar.gz: b06b642432ce0d1e4a42a4bc93520b3782c6d8cce801e91508b296be60501482
3
+ metadata.gz: 2e3454f04c4cbf7a07dc7a041118bb3b60db681c531ebf228115de69f1114d50
4
+ data.tar.gz: bc600d9940213278b6a0b9e908df51c24012a75ac120746758719faa91e8abbc
5
5
  SHA512:
6
- metadata.gz: cc338a137cec8f7abb900b801ace89f1588b265d534babf98f6bb940307289b8a3175a9ce0d5d70a5ddeb520f3525d13e1ba0f7e52df34e75c6fda40ca03a3de
7
- data.tar.gz: 717e7355ae2cfb990f40c589df6c29c138f55d660fa0095367a275e000a7041e98e99ec631f6dd1bf9e9f3068c7a01006d4a3580ac017cb358a18b9c9711a87f
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,8 @@ require_dependency "panda_pal/application_controller"
2
2
 
3
3
  module PandaPal
4
4
  class LtiV1P0Controller < ApplicationController
5
+ skip_before_action :verify_authenticity_token
6
+
5
7
  def launch
6
8
  current_session_data.merge!({
7
9
  lti_version: 'v1p0',
@@ -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.dup
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.delete(:route_helper_key)
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
- final_url = launch_url(opts, launch_type: launch_type)
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)
@@ -1,3 +1,3 @@
1
1
  module PandaPal
2
- VERSION = "5.3.5"
2
+ VERSION = "5.3.7"
3
3
  end
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.5
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: 2020-10-06 00:00:00.000000000 Z
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