ims-lti 2.0.0.beta.1 → 2.0.0.beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d9a9be3ac5b5acb2c58f5c961cb68be59accfa3f
4
- data.tar.gz: d5dba5360e965a35e54fe010800735e4d087fe25
3
+ metadata.gz: 26f070c1a552e6a85696dbf87fc187b14f7a252d
4
+ data.tar.gz: 56a2303e4793715a1c2e301f62488fc4091219da
5
5
  SHA512:
6
- metadata.gz: 9b45fee316f01a2681c78bc047d7710e3d7ad502afb170407a15e00e2f1f3305742e03024b92d9feca47b650bc93792d1b9ab26176fd92f3ea00137200961350
7
- data.tar.gz: 947ca33099a7285791b82e5e0b9d1fa92202d1370a36a0fae5fb83f2d35fb84cbb790f40cff88fc57a18b1e2e0525018b5585e26995547ff7108ede73768acb7
6
+ metadata.gz: c55c3788464a299201d8d513d89981917b37b7c752a55c8563c838f61b78d86b6214695e043898f4b97280efc034b82d79ed613a1cfce2ddb1e67769f94999d3
7
+ data.tar.gz: 42b4177176b634b61164ff40719d6867d1f64ff7adffe2016104d6031c55692b292081b2c00c1a98b2aa64c890b0a7a499799697f70da97f03cca5d768d1817b
@@ -1,5 +1,8 @@
1
1
  require 'json'
2
2
  require 'securerandom'
3
+ require 'simple_oauth'
4
+ require 'faraday'
5
+ require 'faraday_middleware'
3
6
  require 'oauth'
4
7
 
5
8
  module IMS
@@ -42,7 +42,11 @@ module IMS::LTI::Models
42
42
 
43
43
  def attributes=(attrs)
44
44
  attrs.each do |k, v|
45
- instance_variable_set("@#{k.to_s}", v)
45
+ if self.class.attributes.include?(k.to_sym)
46
+ instance_variable_set("@#{k.to_s}", v)
47
+ else
48
+ warn("Unknown attribute '#{k}'")
49
+ end
46
50
  end
47
51
  end
48
52
 
@@ -3,14 +3,30 @@ module IMS::LTI::Models::Messages
3
3
  LAUNCH_TARGET_IFRAME = 'iframe'
4
4
  LAUNCH_TARGET_WINDOW = 'window'
5
5
 
6
+ EXTENSION_PREFIX = 'ext_'
7
+ CUSTOM_PREFIX = 'custom_'
8
+
6
9
  add_attributes :lti_message_type, :lti_version, :user_id, :roles, :launch_presentation_local,
7
10
  :launch_presentation_document_target, :launch_presentation_css_url, :launch_presentation_width,
8
11
  :launch_presentation_height
9
12
 
10
13
  def initialize(attrs = {})
11
- super(attrs)
12
14
  @custom_params = {}
13
15
  @ext_params = {}
16
+ attributes = {}
17
+
18
+ attrs.each do |k,v|
19
+ str_key = k.to_s
20
+ if str_key.start_with?(EXTENSION_PREFIX)
21
+ @ext_params[str_key.sub(EXTENSION_PREFIX, '')] = v
22
+ elsif str_key.start_with?(CUSTOM_PREFIX)
23
+ @custom_params[str_key.sub(CUSTOM_PREFIX, '')] = v
24
+ else
25
+ attributes[k] = v
26
+ end
27
+ end
28
+
29
+ super(attributes)
14
30
  end
15
31
 
16
32
  def post_params
@@ -19,13 +35,13 @@ module IMS::LTI::Models::Messages
19
35
 
20
36
  def get_ext_params
21
37
  params = {}
22
- @ext_params.each { |k, v| params["ext_#{k}"] = v }
38
+ @ext_params.each { |k, v| params["#{EXTENSION_PREFIX}#{k}"] = v }
23
39
  params
24
40
  end
25
41
 
26
42
  def get_custom_params
27
43
  params = {}
28
- @custom_params.each { |k, v| params["custom_#{k}"] = v }
44
+ @custom_params.each { |k, v| params["#{CUSTOM_PREFIX}#{k}"] = v }
29
45
  params
30
46
  end
31
47
 
@@ -39,5 +55,6 @@ module IMS::LTI::Models::Messages
39
55
  end
40
56
  end
41
57
 
58
+ private
42
59
  end
43
60
  end
@@ -14,5 +14,9 @@ module IMS::LTI::Models
14
14
  description && description.default_value
15
15
  end
16
16
 
17
+ def messages
18
+ [*message]
19
+ end
20
+
17
21
  end
18
22
  end
@@ -6,8 +6,24 @@ module IMS::LTI::Models
6
6
  add_attribute :id, json_key:'@id'
7
7
  add_attribute :type, json_key: '@type'
8
8
 
9
- def initialize
9
+ def initialize(attributes = {})
10
10
  @type = TYPE
11
+ super(attributes)
12
+ end
13
+
14
+ def profile
15
+ RestServiceProfile.new(
16
+ service: endpoint,
17
+ action: action
18
+ )
19
+ end
20
+
21
+ def actions
22
+ [*action]
23
+ end
24
+
25
+ def formats
26
+ [*format]
11
27
  end
12
28
 
13
29
  end
@@ -3,5 +3,13 @@ module IMS::LTI::Models
3
3
  add_attributes :service, :action
4
4
  add_attribute :type, json_key: '@type'
5
5
 
6
+ def initialize(attributes = {})
7
+ @type = "RestServiceProfile"
8
+ super(attributes)
9
+ end
10
+
11
+ def actions
12
+ [*action]
13
+ end
6
14
  end
7
15
  end
@@ -11,9 +11,14 @@ module IMS::LTI::Models
11
11
  add_attribute :product_instance, relation:'IMS::LTI::Models::ProductInstance'
12
12
  add_attribute :service_offered, relation: 'IMS::LTI::Models::RestService'
13
13
 
14
- def initialize
14
+ def initialize(attr = {})
15
15
  @context = [CONTEXT]
16
16
  @type = TYPE
17
+ super(attr)
18
+ end
19
+
20
+ def services_offered
21
+ [*@service_offered]
17
22
  end
18
23
 
19
24
  end
@@ -18,5 +18,13 @@ module IMS::LTI::Models
18
18
  end
19
19
  end
20
20
 
21
+ def resource_handlers
22
+ [*@resource_handler]
23
+ end
24
+
25
+ def messages
26
+ [*@message]
27
+ end
28
+
21
29
  end
22
30
  end
@@ -7,5 +7,11 @@ module IMS::LTI::Models
7
7
  add_attribute :tool_consumer_profile
8
8
  add_attribute :tool_profile, relation:'IMS::LTI::Models::ToolProfile'
9
9
  add_attribute :security_contract, relation:'IMS::LTI::Models::SecurityContract'
10
+
11
+ def initialize(attr = {})
12
+ @context = ['http://purl.imsglobal.org/ctx/lti/v2/ToolProxy']
13
+ super(attr)
14
+ @type = 'ToolProxy'
15
+ end
10
16
  end
11
17
  end
@@ -1,5 +1,6 @@
1
1
  module IMS::LTI
2
2
  module Services
3
3
  require_relative 'services/message_service'
4
+ require_relative 'services/tool_proxy_registration_service'
4
5
  end
5
6
  end
@@ -2,39 +2,47 @@ module IMS::LTI::Services
2
2
  class MessageService
3
3
 
4
4
  def initialize(key, secret)
5
- @key = key
6
- @secret = secret
5
+ @credentials = {consumer_key: key, consumer_secret: secret}
7
6
  end
8
7
 
9
- def signed_request(url, message)
10
- uri = URI.parse(url)
11
- oauth_consumer = OAuth::Consumer.new(@key, @secret, {
12
- :site => "#{uri.scheme}://#{uri.host}",
13
- :scheme => :body
14
- })
15
- request = oauth_consumer.create_signed_request(:post, uri.request_uri, nil, {}, message.post_params)
8
+ def signed_params(url, message)
9
+ params = message.post_params
10
+ header = SimpleOAuth::Header.new(:post, url, params, @credentials)
11
+ params = header.signed_attributes.merge(params)
12
+ params
13
+ end
16
14
 
17
- request
15
+ def valid_signature?(url, params)
16
+ options, parsed_params = parse_params(params)
17
+ signature = parsed_params.delete(:oauth_signature)
18
+ header = SimpleOAuth::Header.new(:post, url, parsed_params, options.merge(@credentials))
19
+ header.valid?(signature: signature)
18
20
  end
19
21
 
20
- def signed_params(url, message)
21
- signed_request = signed_request(url, message)
22
+ private
22
23
 
23
- params = {}
24
- CGI.parse(signed_request.body).each do |key, value|
25
- params[key] = value.first
24
+ def parse_params(params)
25
+ params.inject([{}, {}]) do |array, (k, v)|
26
+ attr = k.to_s.sub('oauth_', '').to_sym
27
+ if SimpleOAuth::Header::ATTRIBUTE_KEYS.include?(attr)
28
+ array[0][attr] = v
29
+ else
30
+ array[1][k] = v
31
+ end
32
+ array
26
33
  end
27
- params
28
34
  end
29
35
 
30
- def valid_signature?(url, params)
31
- request = {
32
- 'method' => 'POST',
33
- 'uri' => url,
34
- 'parameters' => params
35
- }
36
+ def signed_request(url, message)
37
+ uri = URI.parse(url)
38
+ oauth_consumer = OAuth::Consumer.new(@key, @secret, {
39
+ :site => "#{uri.scheme}://#{uri.host}",
40
+ :scheme => :body
41
+ })
42
+ request = oauth_consumer.create_signed_request(:post, uri.request_uri, nil, {}, message.post_params)
36
43
 
37
- OAuth::Signature.build(request, :consumer_secret => @secret).verify()
44
+ request
38
45
  end
46
+
39
47
  end
40
48
  end
@@ -0,0 +1,39 @@
1
+ module IMS::LTI::Services
2
+ class ToolProxyRegistrationService
3
+ def initialize(registration_request)
4
+ @registration_request = registration_request
5
+ end
6
+
7
+ def tool_consumer_profile
8
+ return @tool_consumer_profile if @tool_consumer_profile
9
+
10
+ connection = Faraday.new
11
+ response = connection.get(@registration_request.tc_profile_url)
12
+ @tool_consumer_profile = IMS::LTI::Models::ToolConsumerProfile.new.from_json(response.body)
13
+ end
14
+
15
+ def service_profiles
16
+ tool_consumer_profile.services_offered.map(&:profile)
17
+ end
18
+
19
+ def register_tool_proxy(tool_proxy)
20
+ service = tool_consumer_profile.services_offered.find{|s| s.formats.include?('application/vnd.ims.lti.v2.toolproxy+json') && s.actions.include?('POST')}
21
+
22
+ conn = Faraday.new do |conn|
23
+ conn.request :oauth, {:consumer_key => @registration_request.reg_key, :consumer_secret => @registration_request.reg_password}
24
+ conn.adapter :net_http
25
+ end
26
+
27
+ response = conn.post do |req|
28
+ req.url service.endpoint
29
+ req.headers['Content-Type'] = 'application/json'
30
+ req.body = tool_proxy.to_json
31
+ end
32
+
33
+ if response.status == 201
34
+ IMS::LTI::Models::ToolProxy.new.from_json(tool_proxy.to_json).from_json(response.body)
35
+ end
36
+ end
37
+
38
+ end
39
+ end
metadata CHANGED
@@ -1,43 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ims-lti
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.beta.1
4
+ version: 2.0.0.beta.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Instructure
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-15 00:00:00.000000000 Z
11
+ date: 2014-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: json-ld
14
+ name: oauth
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.1.4
19
+ version: '0.4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.1.4
26
+ version: '0.4'
27
27
  - !ruby/object:Gem::Dependency
28
- name: oauth
28
+ name: simple_oauth
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.4.7
33
+ version: '0.2'
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: 0.4.7
40
+ version: '0.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faraday_middleware
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.9'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.9'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: rake
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +94,20 @@ dependencies:
66
94
  - - ">="
67
95
  - !ruby/object:Gem::Version
68
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
69
111
  description:
70
112
  email:
71
113
  executables: []
@@ -110,6 +152,7 @@ files:
110
152
  - lib/ims/lti/models/vendor.rb
111
153
  - lib/ims/lti/services.rb
112
154
  - lib/ims/lti/services/message_service.rb
155
+ - lib/ims/lti/services/tool_proxy_registration_service.rb
113
156
  - lib/ims/lti/version.rb
114
157
  homepage: http://github.com/instructure/ims-lti
115
158
  licenses:
@@ -136,3 +179,4 @@ signing_key:
136
179
  specification_version: 4
137
180
  summary: Ruby library for creating IMS LTI tool providers and consumers
138
181
  test_files: []
182
+ has_rdoc: