coalescing_panda 5.0.9 → 5.1.3.beta.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9b34aab2ab63066e86c9799e4e564129b1b30186
4
- data.tar.gz: b486b6be2efcf0807da76b573cd7212b1fdd5d8d
3
+ metadata.gz: c5c88b9fcd0222696f789cd64db4c782ea171d0f
4
+ data.tar.gz: e0dabfcd2034e3859875e073a035672d65dbdea5
5
5
  SHA512:
6
- metadata.gz: cba63bdaeb3f4255e354112f217fe80b134e5c28ed2ebffe931df625f1ff640960ae75510ee0b7018d697ae39ceaec246e63c6410409a43217f37753d956df02
7
- data.tar.gz: 74735105c7609b9524c40f1b5b0122f937a18036ccdaae32ff16324b0f19d3f90d98d309120afc80ea12b6cf6eb3ecb50b5f00fde6c14c68987a3035ec10cd08
6
+ metadata.gz: 1c3721812b472072ee61d2b8760890033975a40cf3dbd79e6c69b034718572a6e631fee1b1cd0b75beddc71b7fecc947cbe68bacdf1c88dbfe3aafa3ada24daa
7
+ data.tar.gz: 1348d332f2651e084f1e458b834c3de5a2c7eb69586343fe602488e008daa3b3d295c31cc5287744e5d2e1a765dbfa30630475aa87885125de11a9deff2b4eca
@@ -34,7 +34,7 @@ module CoalescingPanda
34
34
  private
35
35
 
36
36
  def oauth2_protocol
37
- ENV['OAUTH_PROTOCOL'] || 'https'
37
+ ENV['OAUTH_PROTOCOL'] || (Rails.env.development? ? 'http' : 'https')
38
38
  end
39
39
 
40
40
  def retrieve_oauth_state
@@ -1,51 +1,17 @@
1
1
  require 'browser'
2
+ require_relative 'session_replacement'
2
3
 
3
4
  module CoalescingPanda
4
5
  module ControllerHelpers
5
6
  extend ActiveSupport::Concern
6
-
7
- included do
8
- alias_method :rails_session, :session
9
-
10
- helper_method :encrypted_session_key, :current_session_data, :current_session
11
- append_after_action :save_session, if: -> { @current_session && session_changed? }
12
- end
13
-
14
- class_methods do
15
- def use_native_sessions
16
- after_action do
17
- rails_session['persistent_session_key'] = current_session.session_key if @current_session.present?
18
- end
19
- end
20
- end
21
-
22
- def current_session
23
- @current_session ||= (CoalescingPanda::PersistentSession.find_by(session_key: session_key) if session_key)
24
- @current_session ||= (CoalescingPanda::PersistentSession.create_from_launch(params, current_lti_account.id) if current_lti_account.present?)
25
- @current_session
26
- end
7
+ include SessionReplacement
27
8
 
28
9
  def current_lti_account
29
10
  @account ||= (CoalescingPanda::LtiAccount.find_by!(key: organization_key) if organization_key)
30
11
  @account ||= (CoalescingPanda::LtiAccount.find_by(id: organization_id) if organization_id)
31
12
  @account
32
13
  end
33
-
34
- def current_session_data
35
- current_session.data
36
- end
37
-
38
- def encrypted_session_key
39
- msg_encryptor.encrypt_and_sign(current_session.session_key)
40
- end
41
-
42
- def save_session
43
- current_session.try(:save)
44
- end
45
-
46
- def session_changed?
47
- current_session.changed? && current_session.changes[:data].present?
48
- end
14
+ def current_organization; current_lti_account; end
49
15
 
50
16
  def canvas_oauth2(*roles)
51
17
  return if have_session?
@@ -81,7 +47,7 @@ module CoalescingPanda
81
47
  client = Bearcat::Client.new(prefix: uri.prefix)
82
48
  state = SecureRandom.hex(32)
83
49
  OauthState.create! state_key: state, data: { key: params['oauth_consumer_key'], user_id: user_id, api_domain: uri.api_domain }
84
- @canvas_url = client.auth_redirect_url(client_id, coalescing_panda.oauth2_redirect_url, { state: state })
50
+ @canvas_url = client.auth_redirect_url(client_id, resolve_coalescing_panda_url(:oauth2_redirect_url), { state: state })
85
51
 
86
52
  #delete the added params so the original oauth sig still works
87
53
  @lti_params = params.to_hash
@@ -92,7 +58,7 @@ module CoalescingPanda
92
58
 
93
59
  def refresh_token(uri, api_auth)
94
60
  refresh_client = Bearcat::Client.new(prefix: uri.prefix)
95
- refresh_body = refresh_client.retrieve_token(@lti_account.oauth2_client_id, coalescing_panda.oauth2_redirect_url,
61
+ refresh_body = refresh_client.retrieve_token(@lti_account.oauth2_client_id, resolve_coalescing_panda_url(:oauth2_redirect_url),
96
62
  @lti_account.oauth2_client_key, api_auth.refresh_token, 'refresh_token')
97
63
  api_auth.update({ api_token: refresh_body['access_token'], expires_at: (Time.now + refresh_body['expires_in']) })
98
64
  end
@@ -191,14 +157,21 @@ module CoalescingPanda
191
157
  end
192
158
  end
193
159
 
194
- def session_check
195
- logger.warn 'session_check is deprecated. Functionality moved to lti_authorize.'
160
+ def valid_session?
161
+ return false unless current_session(create_missing: false)&.persisted?
162
+ true
163
+ rescue SessionNonceMismatch
164
+ false
196
165
  end
197
166
 
198
167
  private
199
168
 
200
- def msg_encryptor
201
- @crypt ||= ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base[0..31])
169
+ def find_or_create_session(key:)
170
+ if key == :create
171
+ CoalescingPanda::PersistentSession.create_from_launch(params, current_lti_account.id) if current_lti_account.present?
172
+ else
173
+ CoalescingPanda::PersistentSession.find_by(session_key: key)
174
+ end
202
175
  end
203
176
 
204
177
  def organization_key
@@ -209,51 +182,16 @@ module CoalescingPanda
209
182
  params[:organization_id] || (current_session_data[:launch_params][:organization_id] if @current_session)
210
183
  end
211
184
 
212
- def session_key
213
- if params[:encrypted_session_key]
214
- return msg_encryptor.decrypt_and_verify(params[:encrypted_session_key])
215
- end
216
- params[:session_key] || session_key_header || rails_session['persistent_session_key']
185
+ # This is necessitated by a bug in Rails Engines where it isn't resolving the URL correctly
186
+ # when using coalescing_panda.xyz_url (The Engine Prefix is not included)
187
+ # I believe https://github.com/rails/rails/issues/34452 is the same issue
188
+ def resolve_coalescing_panda_url(key)
189
+ key = key.to_s[0...-4] if key.to_s.ends_with?('_url')
190
+ resolved_path = coalescing_panda.send(:"#{key}_path")
191
+ cpurl = coalescing_panda_url
192
+ cppath = URI.parse(cpurl).path
193
+ resolved_path = cppath + resolved_path unless resolved_path.starts_with?(cppath)
194
+ URI.join(cpurl, resolved_path)
217
195
  end
218
-
219
- def session_key_header
220
- if (match = request.headers['Authorization'].try(:match, /crypted_token=(.+)/))
221
- msg_encryptor.decrypt_and_verify(match[1])
222
- elsif (match = request.headers['Authorization'].try(:match, /token=(.+)/))
223
- match[1]
224
- end
225
- end
226
-
227
- # Redirect with the session key intact. In production,
228
- # handle this by encrypting the session key. That way if the
229
- # url is logged anywhere, it will all be encrypted data. In dev,
230
- # just put it in the URL. Putting it in the URL
231
- # is insecure, but is fine in development.
232
- # Keeping it in the URL in development means that it plays
233
- # nicely with webpack-dev-server live reloading (otherwise
234
- # you get an access error every time it tries to live reload).
235
-
236
- def redirect_with_session_to(path, id_or_resource = nil, redirect_params = {})
237
- if Rails.env.development? || Rails.env.test?
238
- redirect_development_mode(path, id_or_resource, redirect_params)
239
- else
240
- redirect_production_mode(path, id_or_resource, redirect_params)
241
- end
242
- end
243
-
244
- def redirect_development_mode(path, id_or_resource = nil, redirect_params)
245
- redirect_to send(path, id_or_resource, {
246
- session_key: current_session.session_key,
247
- organization_id: current_lti_account.id
248
- }.merge(redirect_params))
249
- end
250
-
251
- def redirect_production_mode(path, id_or_resource = nil, redirect_params)
252
- redirect_to send(path, id_or_resource, {
253
- encrypted_session_key: encrypted_session_key,
254
- organization_id: current_lti_account.id
255
- }.merge(redirect_params))
256
- end
257
-
258
196
  end
259
197
  end
@@ -4,9 +4,9 @@ module CoalescingPanda
4
4
 
5
5
  def self.to_boolean(v)
6
6
  if Rails.version < '5.0'
7
- ActiveRecord::Type::Boolean.new.type_cast_from_user("0")
7
+ ActiveRecord::Type::Boolean.new.type_cast_from_user(v)
8
8
  else
9
- ActiveRecord::Type::Boolean.new.deserialize('0')
9
+ ActiveRecord::Type::Boolean.new.deserialize(v)
10
10
  end
11
11
  end
12
12
  end
@@ -48,11 +48,6 @@ module CoalescingPanda
48
48
  end
49
49
  end
50
50
 
51
- if CoalescingPanda.lti_options.has_key?(:allow_unsafe_eval) && CoalescingPanda.lti_options[:allow_unsafe_eval] == true
52
- # For when code is returned from server and injected into dom. Need to have unsafe-eval or it won't work.
53
- csp_entry(:script_src, "'unsafe-eval'")
54
- end
55
-
56
51
  # Detect and permit Sentry
57
52
  if defined?(Raven) && Raven.configuration.server.present?
58
53
  csp_entry(:connect_src, Raven.configuration.server)
@@ -0,0 +1,196 @@
1
+ module CoalescingPanda
2
+ class SessionNonceMismatch < StandardError; end
3
+
4
+ module SessionReplacement
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ helper_method :link_nonce, :current_session, :current_session_data
9
+ helper_method :link_with_session_to, :url_with_session, :session_url_for
10
+
11
+ prepend_around_action :monkeypatch_flash
12
+ prepend_around_action :auto_save_session
13
+ end
14
+
15
+ class_methods do
16
+ def link_nonce_type(value = :not_given)
17
+ if value == :not_given
18
+ @link_nonce_type || superclass.try(:link_nonce_type) || :nonce
19
+ else
20
+ @link_nonce_type = value
21
+ end
22
+ end
23
+
24
+ def session_expiration_period_minutes
25
+ superclass.try(:session_expiration_period_minutes) || 15
26
+ end
27
+ end
28
+
29
+ def save_session
30
+ current_session.try(:save)
31
+ end
32
+
33
+ def current_session(create_missing: true)
34
+ return @current_session if @current_session.present?
35
+
36
+ if params[:session_token]
37
+ payload = JSON.parse(session_cryptor.decrypt_and_verify(params[:session_token])).with_indifferent_access
38
+ matched_session = find_or_create_session(key: payload[:session_key])
39
+ if matched_session.present?
40
+ if payload[:token_type] == 'nonce' && matched_session.data[:link_nonce] == payload[:nonce]
41
+ @current_session = matched_session
42
+ @current_session.data[:link_nonce] = nil
43
+ elsif payload[:token_type] == 'fixed_ip' && matched_session.data[:remote_ip] == request.remote_ip &&
44
+ DateTime.parse(matched_session.data[:last_ip_token_requested]) > session_expiration_period_minutes.minutes.ago
45
+ @current_session = matched_session
46
+ elsif payload[:token_type] == 'expiring' && DateTime.parse(matched_session.data[:last_token_requested]) > session_expiration_period_minutes.minutes.ago
47
+ @current_session = matched_session
48
+ end
49
+ end
50
+ raise SessionNonceMismatch, "Session Not Found" unless @current_session.present?
51
+ elsif (session_key = params[:session_key] || session_key_header || flash[:session_key] || session[:session_key]).present?
52
+ @current_session = find_or_create_session(key: session_key)
53
+ end
54
+
55
+ @current_session ||= find_or_create_session(key: :create) if create_missing
56
+
57
+ @current_session
58
+ end
59
+
60
+ def current_session_data
61
+ current_session.data
62
+ end
63
+
64
+ def session_changed?
65
+ current_session.changed? && current_session.changes[:data].present?
66
+ end
67
+
68
+ def forbid_access_if_lacking_session
69
+ render plain: 'You should do an LTI Tool Launch.', status: :unauthorized unless valid_session?
70
+ end
71
+
72
+ def verify_authenticity_token
73
+ # No need to check CSRF when no cookies were sent. This fixes CSRF failures in Browsers
74
+ # that restrict Cookie setting within an IFrame.
75
+ return unless request.cookies.keys.length > 0
76
+ super
77
+ end
78
+
79
+ # Redirect with the session key intact. In production,
80
+ # handle this by adding a one-time use encrypted token to the URL.
81
+ # Keeping it in the URL in development means that it plays
82
+ # nicely with webpack-dev-server live reloading (otherwise
83
+ # you get an access error everytime it tries to live reload).
84
+
85
+ def redirect_with_session_to(*args)
86
+ redirect_to url_with_session(*args)
87
+ end
88
+
89
+ def link_with_session_to(*args)
90
+ helpers.link_to url_with_session(*args)
91
+ end
92
+
93
+ def session_url_for(*args)
94
+ url_for(build_session_url_params(*args))
95
+ end
96
+
97
+ def url_with_session(location, *args, route_context: self, **kwargs)
98
+ route_context.send(location, *build_session_url_params(*args, **kwargs))
99
+ end
100
+
101
+ def link_nonce(type: link_nonce_type)
102
+ type = instance_exec(&type) if type.is_a?(Proc)
103
+ type = type.to_s
104
+
105
+ @cached_link_nonces ||= {}
106
+ @cached_link_nonces[type] ||= begin
107
+ payload = {
108
+ token_type: type,
109
+ session_key: current_session.session_key,
110
+ organization_id: current_organization.id,
111
+ }
112
+
113
+ if type == 'nonce'
114
+ current_session_data[:link_nonce] = SecureRandom.hex
115
+ payload.merge!(nonce: current_session_data[:link_nonce])
116
+ elsif type == 'fixed_ip'
117
+ current_session_data[:remote_ip] ||= request.remote_ip
118
+ current_session_data[:last_ip_token_requested] = DateTime.now.iso8601
119
+ elsif type == 'expiring'
120
+ current_session_data[:last_token_requested] = DateTime.now.iso8601
121
+ else
122
+ raise StandardError, "Unsupported link_nonce_type: '#{type}'"
123
+ end
124
+
125
+ session_cryptor.encrypt_and_sign(payload.to_json)
126
+ end
127
+ end
128
+
129
+ def link_nonce_type
130
+ self.class.link_nonce_type
131
+ end
132
+
133
+ def session_expiration_period_minutes
134
+ self.session_expiration_period_minutes
135
+ end
136
+
137
+ private
138
+
139
+ def session_cryptor
140
+ secret_key_base = Rails.application.try(:secret_key_base) || Rails.application.secrets.secret_key_base
141
+ @session_cryptor ||= ActiveSupport::MessageEncryptor.new(secret_key_base[0..31])
142
+ end
143
+
144
+ def session_key_header
145
+ if match = request.headers['Authorization'].try(:match, /token=(.+)/)
146
+ match[1]
147
+ end
148
+ end
149
+
150
+ def build_session_url_params(*args, nonce_type: link_nonce_type, **kwargs)
151
+ if args[-1].is_a?(Hash)
152
+ args[-1] = args[-1].dup
153
+ else
154
+ args.push({})
155
+ end
156
+
157
+ if Rails.env.development?
158
+ args[-1].merge!(
159
+ session_key: current_session.session_key,
160
+ organization_id: current_organization.id,
161
+ )
162
+ else
163
+ args[-1].merge!(
164
+ session_token: link_nonce(type: nonce_type),
165
+ organization_id: current_organization.id,
166
+ )
167
+ end
168
+
169
+ args[-1].merge!(kwargs)
170
+ args
171
+ end
172
+
173
+ def auto_save_session
174
+ yield if block_given?
175
+ save_session if @current_session && session_changed?
176
+ end
177
+
178
+ def monkeypatch_flash
179
+ if valid_session? && (value = current_session_data['flashes']).present?
180
+ flashes = value["flashes"]
181
+ if discard = value["discard"]
182
+ flashes.except!(*discard)
183
+ end
184
+ flash.replace(flashes)
185
+ flash.discard()
186
+ end
187
+
188
+ yield
189
+
190
+ if @current_session.present?
191
+ current_session_data['flashes'] = flash.to_session_value
192
+ flash.discard()
193
+ end
194
+ end
195
+ end
196
+ end
@@ -1,3 +1,3 @@
1
1
  module CoalescingPanda
2
- VERSION = '5.0.9'
2
+ VERSION = '5.1.3.beta.2'
3
3
  end
@@ -11,7 +11,7 @@ describe CoalescingPanda::Oauth2Controller, :type => :controller do
11
11
  Bearcat::Client.any_instance.stub(retrieve_token: { 'access_token' => 'token', 'refresh_token' => 'token', 'expires_in' => 3600 })
12
12
  session[:state] = 'test'
13
13
  CoalescingPanda::OauthState.create!(state_key: session[:state], data: { key: account.key, user_id: user.id, api_domain: 'foo.com' })
14
- get :redirect, {user_id: user.id, api_domain: 'foo.com', code: 'bar', key: account.key, state: 'test'}
14
+ get :redirect, params: {user_id: user.id, api_domain: 'foo.com', code: 'bar', key: account.key, state: 'test'}
15
15
  auth = CoalescingPanda::CanvasApiAuth.find_by_user_id_and_api_domain(user.id, 'foo.com')
16
16
  auth.should_not == nil
17
17
  expect(auth.api_token).to eql 'token'
@@ -20,7 +20,7 @@ describe CoalescingPanda::Oauth2Controller, :type => :controller do
20
20
  end
21
21
 
22
22
  it "doesn't create a token in the db" do
23
- get :redirect, {error: 'your face'}
23
+ get :redirect, params: {error: 'your face'}
24
24
  CoalescingPanda::CanvasApiAuth.all.count.should == 0
25
25
  end
26
26
  end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe CoalescingPanda::CanvasApiAuth do
3
+ describe CoalescingPanda::CanvasApiAuth, type: :model do
4
4
 
5
5
  it { should validate_uniqueness_of(:user_id).scoped_to(:api_domain)}
6
6
  it { should validate_presence_of(:user_id)}
7
- it {should validate_presence_of(:api_domain)}
7
+ it { should validate_presence_of(:api_domain)}
8
8
 
9
9
  describe '#expired?' do
10
10
  let(:auth) { FactoryGirl.create :canvas_api_auth }
@@ -24,6 +24,13 @@ SimpleCov.start
24
24
 
25
25
  ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
26
26
 
27
+ Shoulda::Matchers.configure do |config|
28
+ config.integrate do |with|
29
+ with.test_framework :rspec
30
+ with.library :rails
31
+ end
32
+ end
33
+
27
34
  # This file was generated by the `rails generate rspec:install` command. Conventionally, all
28
35
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
29
36
  # The generated `.rspec` file contains `--require spec_helper` which will cause this
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coalescing_panda
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.9
4
+ version: 5.1.3.beta.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Mills
8
8
  - Cody Tanner
9
9
  - Jake Sorce
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-09-08 00:00:00.000000000 Z
13
+ date: 2020-10-02 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - '>='
19
+ - - ">="
20
20
  - !ruby/object:Gem::Version
21
21
  version: 4.2.1
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - '>='
26
+ - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: 4.2.1
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: bearcat
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - ~>
33
+ - - "~>"
34
34
  - !ruby/object:Gem::Version
35
35
  version: 1.3.0
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - ~>
40
+ - - "~>"
41
41
  - !ruby/object:Gem::Version
42
42
  version: 1.3.0
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: browser
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - '>='
47
+ - - ">="
48
48
  - !ruby/object:Gem::Version
49
49
  version: '0'
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - '>='
54
+ - - ">="
55
55
  - !ruby/object:Gem::Version
56
56
  version: '0'
57
57
  - !ruby/object:Gem::Dependency
@@ -72,331 +72,331 @@ dependencies:
72
72
  name: ims-lti
73
73
  requirement: !ruby/object:Gem::Requirement
74
74
  requirements:
75
- - - ~>
75
+ - - "~>"
76
76
  - !ruby/object:Gem::Version
77
77
  version: 1.2.0
78
- - - <
78
+ - - "<"
79
79
  - !ruby/object:Gem::Version
80
80
  version: '2.0'
81
81
  type: :runtime
82
82
  prerelease: false
83
83
  version_requirements: !ruby/object:Gem::Requirement
84
84
  requirements:
85
- - - ~>
85
+ - - "~>"
86
86
  - !ruby/object:Gem::Version
87
87
  version: 1.2.0
88
- - - <
88
+ - - "<"
89
89
  - !ruby/object:Gem::Version
90
90
  version: '2.0'
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: haml-rails
93
93
  requirement: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  type: :runtime
99
99
  prerelease: false
100
100
  version_requirements: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - '>='
102
+ - - ">="
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  - !ruby/object:Gem::Dependency
106
106
  name: sass-rails
107
107
  requirement: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - '>='
109
+ - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: '3.2'
112
112
  type: :runtime
113
113
  prerelease: false
114
114
  version_requirements: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - '>='
116
+ - - ">="
117
117
  - !ruby/object:Gem::Version
118
118
  version: '3.2'
119
119
  - !ruby/object:Gem::Dependency
120
120
  name: jquery-rails
121
121
  requirement: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - '>='
123
+ - - ">="
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  type: :runtime
127
127
  prerelease: false
128
128
  version_requirements: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - '>='
130
+ - - ">="
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0'
133
133
  - !ruby/object:Gem::Dependency
134
134
  name: coffee-rails
135
135
  requirement: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - '>='
137
+ - - ">="
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0'
140
140
  type: :runtime
141
141
  prerelease: false
142
142
  version_requirements: !ruby/object:Gem::Requirement
143
143
  requirements:
144
- - - '>='
144
+ - - ">="
145
145
  - !ruby/object:Gem::Version
146
146
  version: '0'
147
147
  - !ruby/object:Gem::Dependency
148
148
  name: p3p
149
149
  requirement: !ruby/object:Gem::Requirement
150
150
  requirements:
151
- - - '>='
151
+ - - ">="
152
152
  - !ruby/object:Gem::Version
153
153
  version: '0'
154
154
  type: :runtime
155
155
  prerelease: false
156
156
  version_requirements: !ruby/object:Gem::Requirement
157
157
  requirements:
158
- - - '>='
158
+ - - ">="
159
159
  - !ruby/object:Gem::Version
160
160
  version: '0'
161
161
  - !ruby/object:Gem::Dependency
162
162
  name: delayed_job_active_record
163
163
  requirement: !ruby/object:Gem::Requirement
164
164
  requirements:
165
- - - '>='
165
+ - - ">="
166
166
  - !ruby/object:Gem::Version
167
167
  version: '0'
168
168
  type: :runtime
169
169
  prerelease: false
170
170
  version_requirements: !ruby/object:Gem::Requirement
171
171
  requirements:
172
- - - '>='
172
+ - - ">="
173
173
  - !ruby/object:Gem::Version
174
174
  version: '0'
175
175
  - !ruby/object:Gem::Dependency
176
176
  name: open_uri_redirections
177
177
  requirement: !ruby/object:Gem::Requirement
178
178
  requirements:
179
- - - '>='
179
+ - - ">="
180
180
  - !ruby/object:Gem::Version
181
181
  version: '0'
182
182
  type: :runtime
183
183
  prerelease: false
184
184
  version_requirements: !ruby/object:Gem::Requirement
185
185
  requirements:
186
- - - '>='
186
+ - - ">="
187
187
  - !ruby/object:Gem::Version
188
188
  version: '0'
189
189
  - !ruby/object:Gem::Dependency
190
190
  name: oauth
191
191
  requirement: !ruby/object:Gem::Requirement
192
192
  requirements:
193
- - - ~>
193
+ - - "~>"
194
194
  - !ruby/object:Gem::Version
195
195
  version: 0.5.4
196
196
  type: :runtime
197
197
  prerelease: false
198
198
  version_requirements: !ruby/object:Gem::Requirement
199
199
  requirements:
200
- - - ~>
200
+ - - "~>"
201
201
  - !ruby/object:Gem::Version
202
202
  version: 0.5.4
203
203
  - !ruby/object:Gem::Dependency
204
204
  name: rubyzip
205
205
  requirement: !ruby/object:Gem::Requirement
206
206
  requirements:
207
- - - '>='
207
+ - - ">="
208
208
  - !ruby/object:Gem::Version
209
209
  version: 1.0.0
210
210
  type: :runtime
211
211
  prerelease: false
212
212
  version_requirements: !ruby/object:Gem::Requirement
213
213
  requirements:
214
- - - '>='
214
+ - - ">="
215
215
  - !ruby/object:Gem::Version
216
216
  version: 1.0.0
217
217
  - !ruby/object:Gem::Dependency
218
218
  name: secure_headers
219
219
  requirement: !ruby/object:Gem::Requirement
220
220
  requirements:
221
- - - ~>
221
+ - - "~>"
222
222
  - !ruby/object:Gem::Version
223
223
  version: '6.3'
224
224
  type: :runtime
225
225
  prerelease: false
226
226
  version_requirements: !ruby/object:Gem::Requirement
227
227
  requirements:
228
- - - ~>
228
+ - - "~>"
229
229
  - !ruby/object:Gem::Version
230
230
  version: '6.3'
231
231
  - !ruby/object:Gem::Dependency
232
232
  name: zip-zip
233
233
  requirement: !ruby/object:Gem::Requirement
234
234
  requirements:
235
- - - '>='
235
+ - - ">="
236
236
  - !ruby/object:Gem::Version
237
237
  version: '0'
238
238
  type: :runtime
239
239
  prerelease: false
240
240
  version_requirements: !ruby/object:Gem::Requirement
241
241
  requirements:
242
- - - '>='
242
+ - - ">="
243
243
  - !ruby/object:Gem::Version
244
244
  version: '0'
245
245
  - !ruby/object:Gem::Dependency
246
246
  name: sqlite3
247
247
  requirement: !ruby/object:Gem::Requirement
248
248
  requirements:
249
- - - '>='
249
+ - - ">="
250
250
  - !ruby/object:Gem::Version
251
251
  version: '0'
252
252
  type: :development
253
253
  prerelease: false
254
254
  version_requirements: !ruby/object:Gem::Requirement
255
255
  requirements:
256
- - - '>='
256
+ - - ">="
257
257
  - !ruby/object:Gem::Version
258
258
  version: '0'
259
259
  - !ruby/object:Gem::Dependency
260
260
  name: rspec-rails
261
261
  requirement: !ruby/object:Gem::Requirement
262
262
  requirements:
263
- - - '>='
263
+ - - ">="
264
264
  - !ruby/object:Gem::Version
265
265
  version: '0'
266
266
  type: :development
267
267
  prerelease: false
268
268
  version_requirements: !ruby/object:Gem::Requirement
269
269
  requirements:
270
- - - '>='
270
+ - - ">="
271
271
  - !ruby/object:Gem::Version
272
272
  version: '0'
273
273
  - !ruby/object:Gem::Dependency
274
274
  name: factory_girl_rails
275
275
  requirement: !ruby/object:Gem::Requirement
276
276
  requirements:
277
- - - '>='
277
+ - - ">="
278
278
  - !ruby/object:Gem::Version
279
279
  version: '0'
280
280
  type: :development
281
281
  prerelease: false
282
282
  version_requirements: !ruby/object:Gem::Requirement
283
283
  requirements:
284
- - - '>='
284
+ - - ">="
285
285
  - !ruby/object:Gem::Version
286
286
  version: '0'
287
287
  - !ruby/object:Gem::Dependency
288
288
  name: shoulda-matchers
289
289
  requirement: !ruby/object:Gem::Requirement
290
290
  requirements:
291
- - - '>='
291
+ - - ">="
292
292
  - !ruby/object:Gem::Version
293
293
  version: '0'
294
294
  type: :development
295
295
  prerelease: false
296
296
  version_requirements: !ruby/object:Gem::Requirement
297
297
  requirements:
298
- - - '>='
298
+ - - ">="
299
299
  - !ruby/object:Gem::Version
300
300
  version: '0'
301
301
  - !ruby/object:Gem::Dependency
302
302
  name: nokogiri
303
303
  requirement: !ruby/object:Gem::Requirement
304
304
  requirements:
305
- - - '>='
305
+ - - ">="
306
306
  - !ruby/object:Gem::Version
307
307
  version: '0'
308
308
  type: :development
309
309
  prerelease: false
310
310
  version_requirements: !ruby/object:Gem::Requirement
311
311
  requirements:
312
- - - '>='
312
+ - - ">="
313
313
  - !ruby/object:Gem::Version
314
314
  version: '0'
315
315
  - !ruby/object:Gem::Dependency
316
316
  name: simplecov
317
317
  requirement: !ruby/object:Gem::Requirement
318
318
  requirements:
319
- - - '>='
319
+ - - ">="
320
320
  - !ruby/object:Gem::Version
321
321
  version: '0'
322
322
  type: :development
323
323
  prerelease: false
324
324
  version_requirements: !ruby/object:Gem::Requirement
325
325
  requirements:
326
- - - '>='
326
+ - - ">="
327
327
  - !ruby/object:Gem::Version
328
328
  version: '0'
329
329
  - !ruby/object:Gem::Dependency
330
330
  name: byebug
331
331
  requirement: !ruby/object:Gem::Requirement
332
332
  requirements:
333
- - - '>='
333
+ - - ">="
334
334
  - !ruby/object:Gem::Version
335
335
  version: '0'
336
336
  type: :development
337
337
  prerelease: false
338
338
  version_requirements: !ruby/object:Gem::Requirement
339
339
  requirements:
340
- - - '>='
340
+ - - ">="
341
341
  - !ruby/object:Gem::Version
342
342
  version: '0'
343
343
  - !ruby/object:Gem::Dependency
344
344
  name: pry
345
345
  requirement: !ruby/object:Gem::Requirement
346
346
  requirements:
347
- - - '>='
347
+ - - ">="
348
348
  - !ruby/object:Gem::Version
349
349
  version: '0'
350
350
  type: :development
351
351
  prerelease: false
352
352
  version_requirements: !ruby/object:Gem::Requirement
353
353
  requirements:
354
- - - '>='
354
+ - - ">="
355
355
  - !ruby/object:Gem::Version
356
356
  version: '0'
357
357
  - !ruby/object:Gem::Dependency
358
358
  name: webmock
359
359
  requirement: !ruby/object:Gem::Requirement
360
360
  requirements:
361
- - - '>='
361
+ - - ">="
362
362
  - !ruby/object:Gem::Version
363
363
  version: '0'
364
364
  type: :development
365
365
  prerelease: false
366
366
  version_requirements: !ruby/object:Gem::Requirement
367
367
  requirements:
368
- - - '>='
368
+ - - ">="
369
369
  - !ruby/object:Gem::Version
370
370
  version: '0'
371
371
  - !ruby/object:Gem::Dependency
372
372
  name: lol_dba
373
373
  requirement: !ruby/object:Gem::Requirement
374
374
  requirements:
375
- - - '>='
375
+ - - ">="
376
376
  - !ruby/object:Gem::Version
377
377
  version: '0'
378
378
  type: :development
379
379
  prerelease: false
380
380
  version_requirements: !ruby/object:Gem::Requirement
381
381
  requirements:
382
- - - '>='
382
+ - - ">="
383
383
  - !ruby/object:Gem::Version
384
384
  version: '0'
385
385
  - !ruby/object:Gem::Dependency
386
386
  name: database_cleaner
387
387
  requirement: !ruby/object:Gem::Requirement
388
388
  requirements:
389
- - - '>='
389
+ - - ">="
390
390
  - !ruby/object:Gem::Version
391
391
  version: '0'
392
392
  type: :development
393
393
  prerelease: false
394
394
  version_requirements: !ruby/object:Gem::Requirement
395
395
  requirements:
396
- - - '>='
396
+ - - ">="
397
397
  - !ruby/object:Gem::Version
398
398
  version: '0'
399
- description:
399
+ description:
400
400
  email:
401
401
  - nathanm@instructure.com
402
402
  - ctanner@instructure.com
@@ -405,181 +405,182 @@ executables: []
405
405
  extensions: []
406
406
  extra_rdoc_files: []
407
407
  files:
408
+ - Rakefile
409
+ - app/assets/config/coalescing_panda/manifest.js
410
+ - app/assets/images/bootstrap/glyphicons-halflings-white.png
411
+ - app/assets/images/bootstrap/glyphicons-halflings.png
412
+ - app/assets/javascripts/coalescing_panda/application.js
413
+ - app/assets/javascripts/coalescing_panda/canvas_batch.js.coffee
414
+ - app/assets/javascripts/coalescing_panda/oauth2.js.coffee
415
+ - app/assets/stylesheets/coalescing_panda/application.css.scss
416
+ - app/assets/stylesheets/coalescing_panda/launch.css.scss
417
+ - app/assets/stylesheets/coalescing_panda/progress.css.scss
418
+ - app/controllers/coalescing_panda/application_controller.rb
419
+ - app/controllers/coalescing_panda/canvas_batches_controller.rb
420
+ - app/controllers/coalescing_panda/lti_controller.rb
421
+ - app/controllers/coalescing_panda/oauth2_controller.rb
422
+ - app/helpers/coalescing_panda/canvas_batches_helper.rb
423
+ - app/models/coalescing_panda/assignment.rb
408
424
  - app/models/coalescing_panda/assignment_group.rb
409
- - app/models/coalescing_panda/group_membership.rb
410
- - app/models/coalescing_panda/enrollment.rb
425
+ - app/models/coalescing_panda/canvas_api_auth.rb
411
426
  - app/models/coalescing_panda/canvas_batch.rb
412
- - app/models/coalescing_panda/assignment.rb
427
+ - app/models/coalescing_panda/course.rb
428
+ - app/models/coalescing_panda/enrollment.rb
413
429
  - app/models/coalescing_panda/group.rb
414
- - app/models/coalescing_panda/session.rb
415
- - app/models/coalescing_panda/section.rb
416
- - app/models/coalescing_panda/term.rb
430
+ - app/models/coalescing_panda/group_category.rb
431
+ - app/models/coalescing_panda/group_membership.rb
432
+ - app/models/coalescing_panda/json_with_indifferent_access.rb
433
+ - app/models/coalescing_panda/lti_account.rb
434
+ - app/models/coalescing_panda/lti_nonce.rb
417
435
  - app/models/coalescing_panda/oauth_state.rb
436
+ - app/models/coalescing_panda/persistent_session.rb
437
+ - app/models/coalescing_panda/section.rb
438
+ - app/models/coalescing_panda/session.rb
418
439
  - app/models/coalescing_panda/submission.rb
419
- - app/models/coalescing_panda/canvas_api_auth.rb
440
+ - app/models/coalescing_panda/term.rb
441
+ - app/models/coalescing_panda/user.rb
420
442
  - app/models/coalescing_panda/workers/account_miner.rb
421
- - app/models/coalescing_panda/workers/provisioning_miner.rb
422
443
  - app/models/coalescing_panda/workers/course_miner.rb
423
- - app/models/coalescing_panda/lti_nonce.rb
424
- - app/models/coalescing_panda/course.rb
425
- - app/models/coalescing_panda/persistent_session.rb
426
- - app/models/coalescing_panda/lti_account.rb
427
- - app/models/coalescing_panda/json_with_indifferent_access.rb
428
- - app/models/coalescing_panda/user.rb
429
- - app/models/coalescing_panda/group_category.rb
444
+ - app/models/coalescing_panda/workers/provisioning_miner.rb
430
445
  - app/models/concerns/single_table_polymorphic.rb
431
- - app/controllers/coalescing_panda/oauth2_controller.rb
432
- - app/controllers/coalescing_panda/application_controller.rb
433
- - app/controllers/coalescing_panda/lti_controller.rb
434
- - app/controllers/coalescing_panda/canvas_batches_controller.rb
446
+ - app/views/coalescing_panda/canvas_batches/_canvas_batch.html.haml
447
+ - app/views/coalescing_panda/canvas_batches/_canvas_batch_flash.html.haml
448
+ - app/views/coalescing_panda/launch.html.haml
449
+ - app/views/coalescing_panda/lti/iframe_cookie_fix.html.erb
435
450
  - app/views/coalescing_panda/oauth2/oauth2.html.haml
436
451
  - app/views/coalescing_panda/oauth2/redirect.html.haml
437
- - app/views/coalescing_panda/launch.html.haml
438
452
  - app/views/coalescing_panda/styleguide/styleguide.html
439
- - app/views/coalescing_panda/lti/iframe_cookie_fix.html.erb
440
- - app/views/coalescing_panda/canvas_batches/_canvas_batch.html.haml
441
- - app/views/coalescing_panda/canvas_batches/_canvas_batch_flash.html.haml
442
453
  - app/views/layouts/coalescing_panda/application.html.erb
443
- - app/assets/config/coalescing_panda/manifest.js
444
- - app/assets/images/bootstrap/glyphicons-halflings.png
445
- - app/assets/images/bootstrap/glyphicons-halflings-white.png
446
- - app/assets/javascripts/coalescing_panda/oauth2.js.coffee
447
- - app/assets/javascripts/coalescing_panda/application.js
448
- - app/assets/javascripts/coalescing_panda/canvas_batch.js.coffee
449
- - app/assets/stylesheets/coalescing_panda/progress.css.scss
450
- - app/assets/stylesheets/coalescing_panda/application.css.scss
451
- - app/assets/stylesheets/coalescing_panda/launch.css.scss
452
- - app/helpers/coalescing_panda/canvas_batches_helper.rb
453
454
  - config/routes.rb
454
455
  - config/styleguide.yml
455
- - db/migrate/20141120151432_create_coalescing_panda_sections.rb
456
- - db/migrate/20150602205257_add_option_to_canvas_batches.rb
457
- - db/migrate/20150811140030_add_fields_to_users.rb
456
+ - db/migrate/20131114150001_create_coalescing_panda_canvas_api_auths.rb
458
457
  - db/migrate/20131118211442_create_coalescing_panda_lti_accounts.rb
459
- - db/migrate/20150506192717_add_assignment_group_id_to_assignments.rb
460
- - db/migrate/20160830183155_create_coalescing_panda_oauth_states.rb
458
+ - db/migrate/20131119165343_create_coalescing_panda_lti_nonces.rb
459
+ - db/migrate/20140904223159_create_coalescing_panda_sessions.rb
460
+ - db/migrate/20141119225319_create_coalescing_panda_terms.rb
461
+ - db/migrate/20141119225721_create_coalescing_panda_courses.rb
462
+ - db/migrate/20141120151432_create_coalescing_panda_sections.rb
463
+ - db/migrate/20141120151940_create_coalescing_panda_assignments.rb
464
+ - db/migrate/20141120152458_create_coalescing_panda_users.rb
461
465
  - db/migrate/20141120152546_create_coalescing_panda_submissions.rb
466
+ - db/migrate/20141120153135_create_coalescing_panda_enrollments.rb
467
+ - db/migrate/20141121174846_create_coalescing_panda_canvas_batches.rb
468
+ - db/migrate/20141124160857_create_delayed_jobs.rb
462
469
  - db/migrate/20141208221740_add_submission_types_to_assignments.rb
463
- - db/migrate/20150709192717_add_leader_id_to_groups.rb
470
+ - db/migrate/20150106175418_add_group_category_id_to_assignment.rb
471
+ - db/migrate/20150106180131_add_published_to_assignments.rb
472
+ - db/migrate/20150107205405_create_coalescing_panda_groups.rb
464
473
  - db/migrate/20150107205413_create_coalescing_panda_group_memberships.rb
465
- - db/migrate/20141120152458_create_coalescing_panda_users.rb
466
- - db/migrate/20141121174846_create_coalescing_panda_canvas_batches.rb
467
- - db/migrate/20150708192717_add_group_moderator_to_group_memberships.rb
468
474
  - db/migrate/20150210180516_add_context_to_canvas_batch.rb
469
- - db/migrate/20141120151940_create_coalescing_panda_assignments.rb
470
- - db/migrate/20140904223159_create_coalescing_panda_sessions.rb
471
475
  - db/migrate/20150506183335_create_coalescing_panda_assignment_groups.rb
472
- - db/migrate/20141120153135_create_coalescing_panda_enrollments.rb
473
- - db/migrate/20150107205405_create_coalescing_panda_groups.rb
474
- - db/migrate/20141119225721_create_coalescing_panda_courses.rb
475
- - db/migrate/20200528224505_create_coalescing_panda_persistent_session.rb
476
- - db/migrate/20141124160857_create_delayed_jobs.rb
477
- - db/migrate/20131119165343_create_coalescing_panda_lti_nonces.rb
478
- - db/migrate/20150106180131_add_published_to_assignments.rb
476
+ - db/migrate/20150506192717_add_assignment_group_id_to_assignments.rb
479
477
  - db/migrate/20150526144713_add_account_to_canvas_batches.rb
480
- - db/migrate/20150106175418_add_group_category_id_to_assignment.rb
478
+ - db/migrate/20150602205257_add_option_to_canvas_batches.rb
479
+ - db/migrate/20150708192717_add_group_moderator_to_group_memberships.rb
480
+ - db/migrate/20150709192717_add_leader_id_to_groups.rb
481
481
  - db/migrate/20150714205405_create_coalescing_panda_group_categories.rb
482
+ - db/migrate/20150811140030_add_fields_to_users.rb
482
483
  - db/migrate/20151209155923_add_refresh_settings_to_canvas_api_auth.rb
483
- - db/migrate/20131114150001_create_coalescing_panda_canvas_api_auths.rb
484
- - db/migrate/20141119225319_create_coalescing_panda_terms.rb
485
- - lib/tasks/coalescing_panda_tasks.rake
484
+ - db/migrate/20160830183155_create_coalescing_panda_oauth_states.rb
485
+ - db/migrate/20200528224505_create_coalescing_panda_persistent_session.rb
486
486
  - lib/coalescing_panda.rb
487
- - lib/coalescing_panda/controller_helpers.rb
488
487
  - lib/coalescing_panda/bearcat_uri.rb
489
- - lib/coalescing_panda/misc_helper.rb
488
+ - lib/coalescing_panda/controller_helpers.rb
490
489
  - lib/coalescing_panda/engine.rb
490
+ - lib/coalescing_panda/misc_helper.rb
491
+ - lib/coalescing_panda/route_helpers.rb
491
492
  - lib/coalescing_panda/secure_headers.rb
493
+ - lib/coalescing_panda/session_replacement.rb
492
494
  - lib/coalescing_panda/version.rb
493
- - lib/coalescing_panda/route_helpers.rb
494
- - Rakefile
495
- - spec/spec_helper.rb
496
- - spec/dummy/app/models/account.rb
497
- - spec/dummy/app/models/course.rb
498
- - spec/dummy/app/controllers/application_controller.rb
499
- - spec/dummy/app/views/layouts/application.html.erb
495
+ - lib/tasks/coalescing_panda_tasks.rake
496
+ - spec/controllers/coalescing_panda/canvas_batches_controller_spec.rb
497
+ - spec/controllers/coalescing_panda/lti_controller_spec.rb
498
+ - spec/controllers/coalescing_panda/oauth2_controller_spec.rb
499
+ - spec/dummy/README.rdoc
500
+ - spec/dummy/Rakefile
500
501
  - spec/dummy/app/assets/javascripts/application.js
501
502
  - spec/dummy/app/assets/stylesheets/application.css
503
+ - spec/dummy/app/controllers/application_controller.rb
502
504
  - spec/dummy/app/helpers/application_helper.rb
503
- - spec/dummy/bin/rake
505
+ - spec/dummy/app/models/account.rb
506
+ - spec/dummy/app/models/course.rb
507
+ - spec/dummy/app/views/layouts/application.html.erb
504
508
  - spec/dummy/bin/bundle
505
509
  - spec/dummy/bin/rails
506
- - spec/dummy/config/routes.rb
507
- - spec/dummy/config/locales/en.yml
508
- - spec/dummy/config/environments/production.rb
509
- - spec/dummy/config/environments/development.rb
510
- - spec/dummy/config/environments/test.rb
511
- - spec/dummy/config/environment.rb
510
+ - spec/dummy/bin/rake
511
+ - spec/dummy/config.ru
512
512
  - spec/dummy/config/application.rb
513
- - spec/dummy/config/database.yml
514
513
  - spec/dummy/config/boot.rb
515
- - spec/dummy/config/initializers/lti_initializer.rb
514
+ - spec/dummy/config/database.yml
515
+ - spec/dummy/config/environment.rb
516
+ - spec/dummy/config/environments/development.rb
517
+ - spec/dummy/config/environments/production.rb
518
+ - spec/dummy/config/environments/test.rb
516
519
  - spec/dummy/config/initializers/backtrace_silencers.rb
517
- - spec/dummy/config/initializers/mime_types.rb
518
520
  - spec/dummy/config/initializers/filter_parameter_logging.rb
521
+ - spec/dummy/config/initializers/inflections.rb
522
+ - spec/dummy/config/initializers/lti_initializer.rb
523
+ - spec/dummy/config/initializers/mime_types.rb
524
+ - spec/dummy/config/initializers/secret_token.rb
519
525
  - spec/dummy/config/initializers/session_store.rb
520
526
  - spec/dummy/config/initializers/wrap_parameters.rb
521
- - spec/dummy/config/initializers/secret_token.rb
522
- - spec/dummy/config/initializers/inflections.rb
523
- - spec/dummy/config.ru
524
- - spec/dummy/Rakefile
525
- - spec/dummy/public/favicon.ico
527
+ - spec/dummy/config/locales/en.yml
528
+ - spec/dummy/config/routes.rb
529
+ - spec/dummy/db/schema.rb
530
+ - spec/dummy/public/404.html
526
531
  - spec/dummy/public/422.html
527
532
  - spec/dummy/public/500.html
528
- - spec/dummy/public/404.html
529
- - spec/dummy/db/schema.rb
530
- - spec/dummy/README.rdoc
531
- - spec/models/coalescing_panda/enrollment_spec.rb
532
- - spec/models/coalescing_panda/section_spec.rb
533
- - spec/models/coalescing_panda/lti_nonce_spec.rb
534
- - spec/models/coalescing_panda/lti_account_spec.rb
535
- - spec/models/coalescing_panda/canvas_batch_spec.rb
536
- - spec/models/coalescing_panda/term_spec.rb
537
- - spec/models/coalescing_panda/assignment_spec.rb
538
- - spec/models/coalescing_panda/submission_spec.rb
539
- - spec/models/coalescing_panda/assignment_group_spec.rb
540
- - spec/models/coalescing_panda/group_spec.rb
541
- - spec/models/coalescing_panda/workers/account_miner_spec.rb
542
- - spec/models/coalescing_panda/workers/course_miner_spec.rb
543
- - spec/models/coalescing_panda/canvas_api_auth_spec.rb
544
- - spec/models/coalescing_panda/group_membership_spec.rb
545
- - spec/models/coalescing_panda/user_spec.rb
546
- - spec/models/coalescing_panda/course_spec.rb
547
- - spec/factories/courses.rb
548
- - spec/factories/submissions.rb
533
+ - spec/dummy/public/favicon.ico
534
+ - spec/factories/accounts.rb
549
535
  - spec/factories/assignment_groups.rb
550
536
  - spec/factories/assignments.rb
551
537
  - spec/factories/canvas_api_auths.rb
552
- - spec/factories/enrollments.rb
553
538
  - spec/factories/canvas_batches.rb
539
+ - spec/factories/courses.rb
540
+ - spec/factories/enrollments.rb
554
541
  - spec/factories/sections.rb
555
- - spec/factories/accounts.rb
556
- - spec/factories/users.rb
542
+ - spec/factories/submissions.rb
557
543
  - spec/factories/terms.rb
558
- - spec/controllers/coalescing_panda/canvas_batches_controller_spec.rb
559
- - spec/controllers/coalescing_panda/oauth2_controller_spec.rb
560
- - spec/controllers/coalescing_panda/lti_controller_spec.rb
544
+ - spec/factories/users.rb
545
+ - spec/models/coalescing_panda/assignment_group_spec.rb
546
+ - spec/models/coalescing_panda/assignment_spec.rb
547
+ - spec/models/coalescing_panda/canvas_api_auth_spec.rb
548
+ - spec/models/coalescing_panda/canvas_batch_spec.rb
549
+ - spec/models/coalescing_panda/course_spec.rb
550
+ - spec/models/coalescing_panda/enrollment_spec.rb
551
+ - spec/models/coalescing_panda/group_membership_spec.rb
552
+ - spec/models/coalescing_panda/group_spec.rb
553
+ - spec/models/coalescing_panda/lti_account_spec.rb
554
+ - spec/models/coalescing_panda/lti_nonce_spec.rb
555
+ - spec/models/coalescing_panda/section_spec.rb
556
+ - spec/models/coalescing_panda/submission_spec.rb
557
+ - spec/models/coalescing_panda/term_spec.rb
558
+ - spec/models/coalescing_panda/user_spec.rb
559
+ - spec/models/coalescing_panda/workers/account_miner_spec.rb
560
+ - spec/models/coalescing_panda/workers/course_miner_spec.rb
561
561
  - spec/rails_helper.rb
562
+ - spec/spec_helper.rb
562
563
  homepage: http://www.instructure.com
563
564
  licenses: []
564
565
  metadata: {}
565
- post_install_message:
566
+ post_install_message:
566
567
  rdoc_options: []
567
568
  require_paths:
568
569
  - lib
569
570
  required_ruby_version: !ruby/object:Gem::Requirement
570
571
  requirements:
571
- - - '>='
572
+ - - ">="
572
573
  - !ruby/object:Gem::Version
573
574
  version: '0'
574
575
  required_rubygems_version: !ruby/object:Gem::Requirement
575
576
  requirements:
576
- - - '>='
577
+ - - ">"
577
578
  - !ruby/object:Gem::Version
578
- version: '0'
579
+ version: 1.3.1
579
580
  requirements: []
580
- rubyforge_project:
581
- rubygems_version: 2.0.14
582
- signing_key:
581
+ rubyforge_project:
582
+ rubygems_version: 2.6.14.4
583
+ signing_key:
583
584
  specification_version: 4
584
585
  summary: Canvas LTI and OAUTH2 mountable engine
585
586
  test_files: