coalescing_panda 1.4.1 → 2.0.0
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/lti_controller.rb +1 -10
- data/app/controllers/coalescing_panda/oauth2_controller.rb +11 -20
- data/app/models/coalescing_panda/canvas_api_auth.rb +1 -3
- data/app/models/coalescing_panda/lti_account.rb +1 -0
- data/lib/coalescing_panda.rb +0 -9
- data/lib/coalescing_panda/controller_helpers.rb +35 -74
- data/lib/coalescing_panda/version.rb +1 -1
- data/spec/controllers/coalescing_panda/lti_controller_spec.rb +4 -13
- data/spec/controllers/coalescing_panda/oauth2_controller_spec.rb +4 -9
- data/spec/dummy/log/development.log +0 -0
- data/spec/models/coalescing_panda/canvas_api_auth_spec.rb +1 -11
- data/spec/spec_helper.rb +1 -2
- metadata +13 -34
- data/app/models/coalescing_panda/oauth_state.rb +0 -8
- data/db/migrate/20151209155923_add_refresh_settings_to_canvas_api_auth.rb +0 -6
- data/db/migrate/20160830183155_create_coalescing_panda_oauth_states.rb +0 -11
- data/lib/coalescing_panda/bearcat_uri.rb +0 -24
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/factories/accounts.rb +0 -24
- data/spec/factories/canvas_api_auths.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ec1b5c9bfc79b28575ac9681953bc1589aaec58
|
4
|
+
data.tar.gz: 9cae9d48dbb29ed1ccaeab79498b293caee9653a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35b2bde2067e5ce0e3c2eb863caa36c047ec88c6892b4a9590a9affbd34fc4199433759096f55c03d84b47710b8ad435f69f1ffb62e583a3a81d68edb3981d13
|
7
|
+
data.tar.gz: 855909206eebdcc7625cc2a0e21fce3966f6015b4bd441433cd7e59716489c75226982a44ee6e60fd408da655e6f68934e29995cea13ae4cf39201b5fc05dc75
|
@@ -6,13 +6,6 @@ module CoalescingPanda
|
|
6
6
|
def lti_config
|
7
7
|
lti_options = CoalescingPanda.lti_options
|
8
8
|
lti_nav = CoalescingPanda.lti_paths
|
9
|
-
lti_environments = CoalescingPanda.lti_environments
|
10
|
-
|
11
|
-
if lti_environments.empty?
|
12
|
-
render text: 'Domains must be set in lti_environments'
|
13
|
-
return
|
14
|
-
end
|
15
|
-
|
16
9
|
lti_nav[:course][:text] = params[:course_navigation_label] if params[:course_navigation_label].present?
|
17
10
|
lti_nav[:account][:text] = params[:account_navigation_label] if params[:account_navigation_label].present?
|
18
11
|
platform = 'canvas.instructure.com'
|
@@ -31,8 +24,6 @@ module CoalescingPanda
|
|
31
24
|
tc.set_ext_param(platform, setting_name(k.to_s), ext_params(v))
|
32
25
|
end
|
33
26
|
|
34
|
-
tc.set_ext_param(platform, :environments, lti_environments)
|
35
|
-
|
36
27
|
#strip the launch url
|
37
28
|
xml = tc.to_xml
|
38
29
|
xml = xml.sub(/<blti:launch_url>.*<\/blti:launch_url>/, '') if lti_options[:launch_route].blank?
|
@@ -69,4 +60,4 @@ module CoalescingPanda
|
|
69
60
|
end
|
70
61
|
|
71
62
|
end
|
72
|
-
end
|
63
|
+
end
|
@@ -7,24 +7,19 @@ module CoalescingPanda
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def redirect
|
10
|
-
if !params[:error] &&
|
11
|
-
lti_account = LtiAccount.find_by_key(
|
10
|
+
if !params[:error] && valid_state_token
|
11
|
+
lti_account = LtiAccount.find_by_key(params[:key])
|
12
12
|
client_id = lti_account.oauth2_client_id
|
13
13
|
client_key = lti_account.oauth2_client_key
|
14
|
-
user_id =
|
15
|
-
api_domain =
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
auth.refresh_token = token_body['refresh_token']
|
24
|
-
auth.expires_at = Time.now + token_body['expires_in'] if token_body['expires_in']
|
25
|
-
auth.user_id = user_id
|
26
|
-
auth.api_domain = api_domain
|
27
|
-
auth.save!
|
14
|
+
user_id = params[:user_id]
|
15
|
+
api_domain = params[:api_domain]
|
16
|
+
client = Bearcat::Client.new(prefix: oauth2_protocol+'://'+api_domain)
|
17
|
+
token = client.retrieve_token(client_id, coalescing_panda.oauth2_redirect_url, client_key, params['code'])
|
18
|
+
CanvasApiAuth.where('user_id = ? and api_domain = ?', user_id, api_domain).first_or_create do |auth|
|
19
|
+
auth.api_token = token
|
20
|
+
auth.user_id = user_id
|
21
|
+
auth.api_domain = api_domain
|
22
|
+
end
|
28
23
|
end
|
29
24
|
end
|
30
25
|
|
@@ -35,10 +30,6 @@ module CoalescingPanda
|
|
35
30
|
ENV['OAUTH_PROTOCOL'] || 'https'
|
36
31
|
end
|
37
32
|
|
38
|
-
def retrieve_oauth_state
|
39
|
-
@oauth_state ||= params[:state].present? && OauthState.find_by(state_key: params[:state])
|
40
|
-
end
|
41
|
-
|
42
33
|
def valid_state_token
|
43
34
|
return false unless params['state'].present? && session['state'].present?
|
44
35
|
params['state'] == session['state']
|
@@ -6,6 +6,7 @@ module CoalescingPanda
|
|
6
6
|
:foreign_key => :coalescing_panda_lti_account_id,
|
7
7
|
:class_name => 'CoalescingPanda::LtiNonce'
|
8
8
|
|
9
|
+
attr_accessible :name, :key, :secret, :oauth2_client_id, :oauth2_client_key, :settings
|
9
10
|
serialize :settings
|
10
11
|
|
11
12
|
def validate_nonce(nonce, timestamp)
|
data/lib/coalescing_panda.rb
CHANGED
@@ -15,7 +15,6 @@ module CoalescingPanda
|
|
15
15
|
@@lti_navigation = {}
|
16
16
|
@@staged_navigation = {}
|
17
17
|
@@lti_options = {}
|
18
|
-
@@lti_environments = {}
|
19
18
|
|
20
19
|
def self.lti_options= lti_options
|
21
20
|
@@lti_options = lti_options
|
@@ -25,14 +24,6 @@ module CoalescingPanda
|
|
25
24
|
@@lti_options.deep_dup
|
26
25
|
end
|
27
26
|
|
28
|
-
def self.lti_environments=(lti_environments)
|
29
|
-
@@lti_environments = lti_environments
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.lti_environments
|
33
|
-
@@lti_environments.deep_dup
|
34
|
-
end
|
35
|
-
|
36
27
|
def self.register_navigation(navigation)
|
37
28
|
@@lti_navigation[navigation] ||= {}
|
38
29
|
end
|
@@ -7,73 +7,34 @@ module CoalescingPanda
|
|
7
7
|
if lti_authorize!(*roles)
|
8
8
|
user_id = params['user_id']
|
9
9
|
launch_presentation_return_url = @lti_account.settings[:launch_presentation_return_url] || params['launch_presentation_return_url']
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
10
|
+
uri = URI.parse(launch_presentation_return_url)
|
11
|
+
api_domain = uri.host
|
12
|
+
api_domain = "#{api_domain}:#{uri.port.to_s}" if uri.port
|
13
|
+
scheme = uri.scheme + '://'
|
14
|
+
@lti_params = params.to_hash
|
15
|
+
session['user_id'] = user_id
|
16
|
+
session['uri'] = launch_presentation_return_url
|
17
|
+
session['lis_person_sourcedid'] = params['lis_person_sourcedid']
|
18
|
+
session['oauth_consumer_key'] = params['oauth_consumer_key']
|
19
|
+
session['custom_canvas_account_id'] = params['custom_canvas_account_id']
|
20
|
+
|
21
|
+
if token = CanvasApiAuth.where('user_id = ? and api_domain = ?', user_id, api_domain).pluck(:api_token).first
|
22
|
+
@client = Bearcat::Client.new(token: token, prefix: scheme+api_domain)
|
23
|
+
elsif @lti_account = params['oauth_consumer_key'] && LtiAccount.find_by_key(params['oauth_consumer_key'])
|
24
|
+
client_id = @lti_account.oauth2_client_id
|
25
|
+
client = Bearcat::Client.new(prefix: scheme+api_domain)
|
26
|
+
session['state'] = SecureRandom.hex(32)
|
27
|
+
@canvas_url = client.auth_redirect_url(client_id,
|
28
|
+
coalescing_panda.oauth2_redirect_url({key: params['oauth_consumer_key'],
|
29
|
+
user_id: user_id, api_domain: api_domain, state: session['state']}))
|
30
|
+
#delete the added params so the original oauth sig still works
|
31
|
+
@lti_params.delete('action')
|
32
|
+
@lti_params.delete('controller')
|
33
|
+
render 'coalescing_panda/oauth2/oauth2'
|
27
34
|
end
|
28
35
|
end
|
29
36
|
end
|
30
37
|
|
31
|
-
def render_oauth2_page(uri, user_id)
|
32
|
-
@lti_account = params['oauth_consumer_key'] && LtiAccount.find_by_key(params['oauth_consumer_key'])
|
33
|
-
return unless @lti_account
|
34
|
-
|
35
|
-
client_id = @lti_account.oauth2_client_id
|
36
|
-
client = Bearcat::Client.new(prefix: uri.prefix)
|
37
|
-
state = SecureRandom.hex(32)
|
38
|
-
OauthState.create! state_key: state, data: { key: params['oauth_consumer_key'], user_id: user_id, api_domain: uri.api_domain }
|
39
|
-
redirect_path = coalescing_panda.oauth2_redirect_path
|
40
|
-
redirect_url = [coalescing_panda_url, redirect_path.sub(/^\/lti/, '')].join
|
41
|
-
@canvas_url = client.auth_redirect_url(client_id, redirect_url, { state: state })
|
42
|
-
|
43
|
-
#delete the added params so the original oauth sig still works
|
44
|
-
@lti_params = params.to_hash
|
45
|
-
@lti_params.delete('action')
|
46
|
-
@lti_params.delete('controller')
|
47
|
-
render 'coalescing_panda/oauth2/oauth2', layout: 'coalescing_panda/application'
|
48
|
-
end
|
49
|
-
|
50
|
-
def refresh_token(uri, api_auth)
|
51
|
-
refresh_client = Bearcat::Client.new(prefix: uri.prefix)
|
52
|
-
refresh_body = refresh_client.retrieve_token(@lti_account.oauth2_client_id, coalescing_panda.oauth2_redirect_url,
|
53
|
-
@lti_account.oauth2_client_key, api_auth.refresh_token, 'refresh_token')
|
54
|
-
api_auth.update({ api_token: refresh_body['access_token'], expires_at: (Time.now + refresh_body['expires_in']) })
|
55
|
-
end
|
56
|
-
|
57
|
-
def check_refresh_token
|
58
|
-
return unless session['uri'] && session['user_id'] && session['oauth_consumer_key']
|
59
|
-
uri = BearcatUri.new(session['uri'])
|
60
|
-
api_auth = CanvasApiAuth.find_by(user_id: session['user_id'], api_domain: uri.api_domain)
|
61
|
-
@lti_account = LtiAccount.find_by(key: session['oauth_consumer_key'])
|
62
|
-
return if @lti_account.nil? || api_auth.nil? # Not all tools use oauth
|
63
|
-
|
64
|
-
refresh_token(uri, api_auth) if api_auth.expired?
|
65
|
-
rescue Footrest::HttpError::BadRequest
|
66
|
-
render_oauth2_page uri, session['user_id']
|
67
|
-
end
|
68
|
-
|
69
|
-
def set_session(launch_presentation_return_url)
|
70
|
-
session['user_id'] = params['user_id']
|
71
|
-
session['uri'] = launch_presentation_return_url
|
72
|
-
session['lis_person_sourcedid'] = params['lis_person_sourcedid']
|
73
|
-
session['oauth_consumer_key'] = params['oauth_consumer_key']
|
74
|
-
session['custom_canvas_account_id'] = params['custom_canvas_account_id']
|
75
|
-
end
|
76
|
-
|
77
38
|
def have_session?
|
78
39
|
if params['tool_consumer_instance_guid'] && session['user_id'] != params['user_id']
|
79
40
|
reset_session
|
@@ -82,19 +43,17 @@ module CoalescingPanda
|
|
82
43
|
end
|
83
44
|
|
84
45
|
if (session['user_id'] && session['uri'])
|
85
|
-
uri =
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
46
|
+
uri = URI.parse(session['uri'])
|
47
|
+
api_domain = uri.host
|
48
|
+
api_domain = "#{api_domain}:#{uri.port.to_s}" if uri.port
|
49
|
+
scheme = uri.scheme + '://'
|
50
|
+
token = CanvasApiAuth.where('user_id = ? and api_domain = ?', session['user_id'], api_domain).pluck(:api_token).first
|
51
|
+
@client = Bearcat::Client.new(token: token, prefix: scheme+api_domain) if token
|
91
52
|
end
|
92
53
|
|
93
54
|
@lti_account = LtiAccount.find_by_key(session['oauth_consumer_key']) if session['oauth_consumer_key']
|
94
55
|
|
95
56
|
!!@client
|
96
|
-
rescue Footrest::HttpError::Unauthorized
|
97
|
-
false
|
98
57
|
end
|
99
58
|
|
100
59
|
def lti_authorize!(*roles)
|
@@ -108,12 +67,14 @@ module CoalescingPanda
|
|
108
67
|
logger.info 'not authorized on roles' if !authorized
|
109
68
|
authorized = authorized && @lti_account.validate_nonce(params['oauth_nonce'], DateTime.strptime(params['oauth_timestamp'], '%s'))
|
110
69
|
logger.info 'not authorized on nonce' if !authorized
|
111
|
-
|
70
|
+
if !authorized
|
71
|
+
render :text => 'Invalid Credentials, please contact your Administrator.', :status => :unauthorized
|
72
|
+
end
|
112
73
|
authorized
|
113
74
|
end
|
114
75
|
|
115
76
|
def lti_editor_button_response(return_type, return_params)
|
116
|
-
valid_return_types = [:image_url, :iframe, :url
|
77
|
+
valid_return_types = [:image_url, :iframe, :url]
|
117
78
|
raise "invalid editor button return type #{return_type}" unless valid_return_types.include?(return_type)
|
118
79
|
return_params[:return_type] = return_type.to_s
|
119
80
|
return_url = "#{params['launch_presentation_return_url']}?#{return_params.to_query}"
|
@@ -154,7 +115,7 @@ module CoalescingPanda
|
|
154
115
|
|
155
116
|
def session_check
|
156
117
|
user_agent = UserAgent.parse(request.user_agent) # Uses useragent gem!
|
157
|
-
if user_agent.browser == 'Safari'
|
118
|
+
if user_agent.browser == 'Safari' # we apply the fix..
|
158
119
|
return if session[:safari_cookie_fixed] # it is already fixed.. continue
|
159
120
|
if params[:safari_cookie_fix].present? # we should be top window and able to set cookies.. so fix the issue :)
|
160
121
|
session[:safari_cookie_fixed] = true
|
@@ -1,13 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe CoalescingPanda::LtiController
|
3
|
+
describe CoalescingPanda::LtiController do
|
4
4
|
routes { CoalescingPanda::Engine.routes }
|
5
5
|
|
6
6
|
describe '#lti_config' do
|
7
|
-
before :each do
|
8
|
-
CoalescingPanda.class_variable_set(:@@lti_navigation, {})
|
9
|
-
CoalescingPanda.lti_environments = { test_domain: 'test' }
|
10
|
-
end
|
11
7
|
|
12
8
|
it 'generates lti xml config'do
|
13
9
|
controller.main_app.stub(:test_action_url) {'foo'}
|
@@ -35,19 +31,14 @@ describe CoalescingPanda::LtiController, type: :controller do
|
|
35
31
|
account_nav.at_xpath('lticm:property[@name="url"]').text.should == 'foo'
|
36
32
|
end
|
37
33
|
|
38
|
-
it 'includes environment information' do
|
39
|
-
get(:lti_config)
|
40
|
-
xml = Nokogiri::XML(response.body)
|
41
|
-
environments = xml.at_xpath('//lticm:options[@name="environments"]')
|
42
|
-
environments.at_xpath('lticm:property[@name="test_domain"]').text.should == 'test'
|
43
|
-
end
|
44
|
-
|
45
34
|
end
|
46
35
|
|
36
|
+
|
47
37
|
it 'get the url, from the action string' do
|
48
38
|
controller.main_app.stub(:test_action_url) {'foo'}
|
49
39
|
options = controller.send(:ext_params, {url:'test_action'})
|
50
40
|
options[:url].should == 'foo'
|
51
41
|
end
|
52
42
|
|
53
|
-
|
43
|
+
|
44
|
+
end
|
@@ -1,20 +1,15 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe CoalescingPanda::Oauth2Controller
|
3
|
+
describe CoalescingPanda::Oauth2Controller do
|
4
4
|
routes { CoalescingPanda::Engine.routes }
|
5
|
-
let(:account) { FactoryGirl.create(:account, settings: {base_url: 'foo.com'}) }
|
6
5
|
|
7
6
|
describe "#redirect" do
|
8
7
|
it 'creates a token in the db' do
|
9
8
|
ENV['OAUTH_PROTOCOL'] = 'http'
|
10
|
-
Bearcat::Client.any_instance.stub(retrieve_token:
|
11
|
-
|
12
|
-
get :redirect, {user_id: 1, api_domain: 'foo.com', code: 'bar', key: account.key, state: 'test'}
|
9
|
+
Bearcat::Client.any_instance.stub(retrieve_token: 'foobar')
|
10
|
+
get :redirect, {user_id: 1, api_domain:'foo.com', code:'bar'}
|
13
11
|
auth = CoalescingPanda::CanvasApiAuth.find_by_user_id_and_api_domain(1, 'foo.com')
|
14
12
|
auth.should_not == nil
|
15
|
-
expect(auth.api_token).to eql 'token'
|
16
|
-
expect(auth.refresh_token).to eql 'token'
|
17
|
-
expect(auth.expires_at).to be > 50.minutes.from_now
|
18
13
|
end
|
19
14
|
|
20
15
|
it "doesn't create a token in the db" do
|
@@ -24,4 +19,4 @@ describe CoalescingPanda::Oauth2Controller, type: :controller do
|
|
24
19
|
|
25
20
|
end
|
26
21
|
|
27
|
-
end
|
22
|
+
end
|
File without changes
|
@@ -6,16 +6,6 @@ describe CoalescingPanda::CanvasApiAuth do
|
|
6
6
|
it { should validate_presence_of(:user_id)}
|
7
7
|
it {should validate_presence_of(:api_domain)}
|
8
8
|
|
9
|
-
describe '#expired?' do
|
10
|
-
let(:auth) { FactoryGirl.create :canvas_api_auth }
|
11
9
|
|
12
|
-
it 'is not expired if expires_at is null or in the future' do
|
13
|
-
auth.expires_at = nil
|
14
|
-
expect(auth.expired?).to be_falsey
|
15
|
-
auth.expires_at = 1.hour.ago
|
16
|
-
expect(auth.expired?).to be_truthy
|
17
|
-
auth.expires_at = 1.hour.from_now
|
18
|
-
expect(auth.expired?).to be_falsey
|
19
|
-
end
|
20
|
-
end
|
21
10
|
end
|
11
|
+
|
data/spec/spec_helper.rb
CHANGED
@@ -2,11 +2,10 @@ ENV["RAILS_ENV"] ||= 'test'
|
|
2
2
|
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
3
3
|
require 'rspec/rails'
|
4
4
|
require 'rspec/autorun'
|
5
|
-
require 'shoulda/matchers'
|
5
|
+
require 'shoulda/matchers/integrations/rspec'
|
6
6
|
require 'nokogiri'
|
7
7
|
require 'haml'
|
8
8
|
require 'simplecov'
|
9
|
-
require 'factory_girl_rails'
|
10
9
|
|
11
10
|
SimpleCov.start
|
12
11
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coalescing_panda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Mills
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-10-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.3
|
33
|
+
version: 1.0.3
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.3
|
40
|
+
version: 1.0.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: macaddr
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -262,20 +262,6 @@ dependencies:
|
|
262
262
|
- - '>='
|
263
263
|
- !ruby/object:Gem::Version
|
264
264
|
version: '0'
|
265
|
-
- !ruby/object:Gem::Dependency
|
266
|
-
name: factory_girl_rails
|
267
|
-
requirement: !ruby/object:Gem::Requirement
|
268
|
-
requirements:
|
269
|
-
- - '>='
|
270
|
-
- !ruby/object:Gem::Version
|
271
|
-
version: '0'
|
272
|
-
type: :development
|
273
|
-
prerelease: false
|
274
|
-
version_requirements: !ruby/object:Gem::Requirement
|
275
|
-
requirements:
|
276
|
-
- - '>='
|
277
|
-
- !ruby/object:Gem::Version
|
278
|
-
version: '0'
|
279
265
|
description:
|
280
266
|
email:
|
281
267
|
- nathanm@instructure.com
|
@@ -283,7 +269,6 @@ executables: []
|
|
283
269
|
extensions: []
|
284
270
|
extra_rdoc_files: []
|
285
271
|
files:
|
286
|
-
- Rakefile
|
287
272
|
- app/assets/images/bootstrap/glyphicons-halflings-white.png
|
288
273
|
- app/assets/images/bootstrap/glyphicons-halflings.png
|
289
274
|
- app/assets/javascripts/bootstrap/bootstrap-datepicker.js
|
@@ -303,7 +288,6 @@ files:
|
|
303
288
|
- app/models/coalescing_panda/canvas_api_auth.rb
|
304
289
|
- app/models/coalescing_panda/lti_account.rb
|
305
290
|
- app/models/coalescing_panda/lti_nonce.rb
|
306
|
-
- app/models/coalescing_panda/oauth_state.rb
|
307
291
|
- app/models/coalescing_panda/session.rb
|
308
292
|
- app/views/coalescing_panda/launch.html.haml
|
309
293
|
- app/views/coalescing_panda/oauth2/oauth2.html.haml
|
@@ -317,19 +301,15 @@ files:
|
|
317
301
|
- db/migrate/20131119165343_create_coalescing_panda_lti_nonces.rb
|
318
302
|
- db/migrate/20140722210735_add_settings_to_coalescing_panda_lti_account.rb
|
319
303
|
- db/migrate/20140904223159_create_coalescing_panda_sessions.rb
|
320
|
-
- db/migrate/20151209155923_add_refresh_settings_to_canvas_api_auth.rb
|
321
|
-
- db/migrate/20160830183155_create_coalescing_panda_oauth_states.rb
|
322
|
-
- lib/coalescing_panda.rb
|
323
|
-
- lib/coalescing_panda/bearcat_uri.rb
|
324
304
|
- lib/coalescing_panda/controller_helpers.rb
|
325
305
|
- lib/coalescing_panda/engine.rb
|
326
306
|
- lib/coalescing_panda/route_helpers.rb
|
327
307
|
- lib/coalescing_panda/version.rb
|
308
|
+
- lib/coalescing_panda.rb
|
328
309
|
- lib/tasks/coalescing_panda_tasks.rake
|
310
|
+
- Rakefile
|
329
311
|
- spec/controllers/coalescing_panda/lti_controller_spec.rb
|
330
312
|
- spec/controllers/coalescing_panda/oauth2_controller_spec.rb
|
331
|
-
- spec/dummy/README.rdoc
|
332
|
-
- spec/dummy/Rakefile
|
333
313
|
- spec/dummy/app/assets/javascripts/application.js
|
334
314
|
- spec/dummy/app/assets/stylesheets/application.css
|
335
315
|
- spec/dummy/app/controllers/application_controller.rb
|
@@ -338,7 +318,6 @@ files:
|
|
338
318
|
- spec/dummy/bin/bundle
|
339
319
|
- spec/dummy/bin/rails
|
340
320
|
- spec/dummy/bin/rake
|
341
|
-
- spec/dummy/config.ru
|
342
321
|
- spec/dummy/config/application.rb
|
343
322
|
- spec/dummy/config/boot.rb
|
344
323
|
- spec/dummy/config/database.yml
|
@@ -356,14 +335,15 @@ files:
|
|
356
335
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
357
336
|
- spec/dummy/config/locales/en.yml
|
358
337
|
- spec/dummy/config/routes.rb
|
338
|
+
- spec/dummy/config.ru
|
359
339
|
- spec/dummy/db/schema.rb
|
360
|
-
- spec/dummy/
|
340
|
+
- spec/dummy/log/development.log
|
361
341
|
- spec/dummy/public/404.html
|
362
342
|
- spec/dummy/public/422.html
|
363
343
|
- spec/dummy/public/500.html
|
364
344
|
- spec/dummy/public/favicon.ico
|
365
|
-
- spec/
|
366
|
-
- spec/
|
345
|
+
- spec/dummy/Rakefile
|
346
|
+
- spec/dummy/README.rdoc
|
367
347
|
- spec/models/coalescing_panda/canvas_api_auth_spec.rb
|
368
348
|
- spec/spec_helper.rb
|
369
349
|
homepage: http://www.instructure.com
|
@@ -385,7 +365,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
385
365
|
version: '0'
|
386
366
|
requirements: []
|
387
367
|
rubyforge_project:
|
388
|
-
rubygems_version: 2.
|
368
|
+
rubygems_version: 2.0.3
|
389
369
|
signing_key:
|
390
370
|
specification_version: 4
|
391
371
|
summary: Canvas LTI and OAUTH2 mountable engine
|
@@ -419,14 +399,13 @@ test_files:
|
|
419
399
|
- spec/dummy/config/routes.rb
|
420
400
|
- spec/dummy/config.ru
|
421
401
|
- spec/dummy/db/schema.rb
|
422
|
-
- spec/dummy/
|
402
|
+
- spec/dummy/log/development.log
|
423
403
|
- spec/dummy/public/404.html
|
424
404
|
- spec/dummy/public/422.html
|
425
405
|
- spec/dummy/public/500.html
|
426
406
|
- spec/dummy/public/favicon.ico
|
427
407
|
- spec/dummy/Rakefile
|
428
408
|
- spec/dummy/README.rdoc
|
429
|
-
- spec/factories/accounts.rb
|
430
|
-
- spec/factories/canvas_api_auths.rb
|
431
409
|
- spec/models/coalescing_panda/canvas_api_auth_spec.rb
|
432
410
|
- spec/spec_helper.rb
|
411
|
+
has_rdoc:
|
@@ -1,11 +0,0 @@
|
|
1
|
-
class CreateCoalescingPandaOauthStates < ActiveRecord::Migration
|
2
|
-
def change
|
3
|
-
create_table :coalescing_panda_oauth_states do |t|
|
4
|
-
t.string :state_key
|
5
|
-
t.text :data
|
6
|
-
|
7
|
-
t.timestamps
|
8
|
-
end
|
9
|
-
add_index :coalescing_panda_oauth_states, :state_key, unique: true
|
10
|
-
end
|
11
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
class CoalescingPanda::BearcatUri
|
2
|
-
attr_accessor :uri
|
3
|
-
|
4
|
-
def initialize(uri)
|
5
|
-
Rails.logger.info "Parsing Bearcat URI: #{uri}"
|
6
|
-
@uri = URI.parse(uri)
|
7
|
-
end
|
8
|
-
|
9
|
-
def api_domain
|
10
|
-
if Rails.env.test? or Rails.env.development?
|
11
|
-
uri.port.present? ? URI.encode("#{uri.host}:#{uri.port.to_s}") : uri.host
|
12
|
-
else
|
13
|
-
uri.host
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def scheme
|
18
|
-
[uri.scheme, '://'].join
|
19
|
-
end
|
20
|
-
|
21
|
-
def prefix
|
22
|
-
[scheme, api_domain].join
|
23
|
-
end
|
24
|
-
end
|
data/spec/dummy/db/test.sqlite3
DELETED
Binary file
|
data/spec/factories/accounts.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
FactoryGirl.define do
|
2
|
-
factory :account, class: CoalescingPanda::LtiAccount do
|
3
|
-
sequence :name do |n|
|
4
|
-
"Account #{n}"
|
5
|
-
end
|
6
|
-
|
7
|
-
sequence :key do |n|
|
8
|
-
"Key #{n}"
|
9
|
-
end
|
10
|
-
|
11
|
-
sequence :secret do |n|
|
12
|
-
"Account #{n}"
|
13
|
-
end
|
14
|
-
|
15
|
-
sequence :canvas_account_id do |n|
|
16
|
-
"#{n}"
|
17
|
-
end
|
18
|
-
|
19
|
-
oauth2_client_id "1234"
|
20
|
-
oauth2_client_key "thisisadeveloperkey"
|
21
|
-
settings { {base_url: "http://localhost:3000", account_admin_api_token: "9q2083uy4poiahjfgpoawy"} }
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|