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 +4 -4
- data/app/controllers/coalescing_panda/oauth2_controller.rb +1 -1
- data/lib/coalescing_panda/controller_helpers.rb +26 -88
- data/lib/coalescing_panda/misc_helper.rb +2 -2
- data/lib/coalescing_panda/secure_headers.rb +0 -5
- data/lib/coalescing_panda/session_replacement.rb +196 -0
- data/lib/coalescing_panda/version.rb +1 -1
- data/spec/controllers/coalescing_panda/oauth2_controller_spec.rb +2 -2
- data/spec/models/coalescing_panda/canvas_api_auth_spec.rb +2 -2
- data/spec/spec_helper.rb +7 -0
- metadata +172 -171
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5c88b9fcd0222696f789cd64db4c782ea171d0f
|
4
|
+
data.tar.gz: e0dabfcd2034e3859875e073a035672d65dbdea5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c3721812b472072ee61d2b8760890033975a40cf3dbd79e6c69b034718572a6e631fee1b1cd0b75beddc71b7fecc947cbe68bacdf1c88dbfe3aafa3ada24daa
|
7
|
+
data.tar.gz: 1348d332f2651e084f1e458b834c3de5a2c7eb69586343fe602488e008daa3b3d295c31cc5287744e5d2e1a765dbfa30630475aa87885125de11a9deff2b4eca
|
@@ -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,
|
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,
|
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
|
195
|
-
|
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
|
201
|
-
|
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
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
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(
|
7
|
+
ActiveRecord::Type::Boolean.new.type_cast_from_user(v)
|
8
8
|
else
|
9
|
-
ActiveRecord::Type::Boolean.new.deserialize(
|
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
|
@@ -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 }
|
data/spec/spec_helper.rb
CHANGED
@@ -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.
|
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-
|
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/
|
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/
|
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/
|
415
|
-
- app/models/coalescing_panda/
|
416
|
-
- app/models/coalescing_panda/
|
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/
|
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/
|
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/
|
432
|
-
- app/
|
433
|
-
- app/
|
434
|
-
- app/
|
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/
|
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/
|
460
|
-
- db/migrate/
|
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/
|
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/
|
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/
|
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/
|
484
|
-
- db/migrate/
|
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/
|
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/
|
494
|
-
-
|
495
|
-
- spec/
|
496
|
-
- spec/
|
497
|
-
- spec/dummy/
|
498
|
-
- spec/dummy/
|
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/
|
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/
|
507
|
-
- spec/dummy/config
|
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/
|
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/
|
522
|
-
- spec/dummy/config/
|
523
|
-
- spec/dummy/
|
524
|
-
- spec/dummy/
|
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/
|
529
|
-
- spec/
|
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/
|
556
|
-
- spec/factories/users.rb
|
542
|
+
- spec/factories/submissions.rb
|
557
543
|
- spec/factories/terms.rb
|
558
|
-
- spec/
|
559
|
-
- spec/
|
560
|
-
- spec/
|
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:
|
579
|
+
version: 1.3.1
|
579
580
|
requirements: []
|
580
|
-
rubyforge_project:
|
581
|
-
rubygems_version: 2.
|
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:
|