lti2 0.0.1 → 0.0.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.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/lib/lti2/version.rb +1 -1
  3. data/lti2_tc/Gemfile +14 -0
  4. data/lti2_tc/Gemfile.lock +94 -0
  5. data/lti2_tc/MIT-LICENSE +20 -0
  6. data/lti2_tc/README.rdoc +3 -0
  7. data/lti2_tc/Rakefile +34 -0
  8. data/lti2_tc/app/assets/javascripts/lti2_tc/application.js +13 -0
  9. data/lti2_tc/app/assets/stylesheets/lti2_tc/application.css +13 -0
  10. data/lti2_tc/app/controllers/lti2_tc/application_controller.rb +13 -0
  11. data/lti2_tc/app/controllers/lti2_tc/deployment_requests_controller.rb +9 -0
  12. data/lti2_tc/app/controllers/lti2_tc/tool_consumer_profiles_controller.rb +23 -0
  13. data/lti2_tc/app/controllers/lti2_tc/tool_proxies_controller.rb +8 -0
  14. data/lti2_tc/app/controllers/lti2_tc/tool_settings_controller.rb +215 -0
  15. data/lti2_tc/app/controllers/lti2_tc/tools_controller.rb +361 -0
  16. data/lti2_tc/app/models/lti2_tc/deployment_request.rb +43 -0
  17. data/lti2_tc/app/models/lti2_tc/link.rb +24 -0
  18. data/lti2_tc/app/models/lti2_tc/registry.rb +4 -0
  19. data/lti2_tc/app/models/lti2_tc/resource.rb +6 -0
  20. data/lti2_tc/app/models/lti2_tc/tool.rb +12 -0
  21. data/lti2_tc/app/models/lti2_tc/tool_consumer_profile.rb +4 -0
  22. data/lti2_tc/app/models/lti2_tc/tool_consumer_registry.rb +24 -0
  23. data/lti2_tc/app/models/lti2_tc/tool_registration.rb +83 -0
  24. data/lti2_tc/app/models/lti2_tc/tool_setting.rb +61 -0
  25. data/lti2_tc/app/services/lti2_tc/authorizer.rb +36 -0
  26. data/lti2_tc/app/services/lti2_tc/lti2_launch.rb +259 -0
  27. data/lti2_tc/app/views/layouts/lti2_tc/application.html.erb +14 -0
  28. data/lti2_tc/app/views/lti2_tc/deployment_requests/show.html.erb +2 -0
  29. data/lti2_tc/app/views/lti2_tc/tool_consumer_profiles/index.html.erb +2 -0
  30. data/lti2_tc/app/views/lti2_tc/tool_consumer_profiles/show.html.erb +2 -0
  31. data/lti2_tc/app/views/lti2_tc/tool_proxies_controller/index.html.erb +2 -0
  32. data/lti2_tc/app/views/lti2_tc/tool_settings_controller/show.html.erb +2 -0
  33. data/lti2_tc/app/views/lti2_tc/tool_settings_controller/update.html.erb +2 -0
  34. data/lti2_tc/app/views/lti2_tc/tools_controller/create.html.erb +2 -0
  35. data/lti2_tc/app/views/lti2_tc/tools_controller/show.html.erb +2 -0
  36. data/lti2_tc/bin/rails +8 -0
  37. data/lti2_tc/config/routes.rb +20 -0
  38. data/lti2_tc/db/migrate/20140826141858_create_lti2_tool_consumer_tables.rb +94 -0
  39. data/lti2_tc/db/migrate/20140826150753_create_lti2_tc_resources.rb +37 -0
  40. data/lti2_tc/db/migrate/20141027193548_insert_tool_guid.rb +5 -0
  41. data/lti2_tc/lib/lti2_tc.rb +4 -0
  42. data/lti2_tc/lib/lti2_tc/engine.rb +5 -0
  43. data/lti2_tc/lib/lti2_tc/version.rb +3 -0
  44. data/lti2_tc/lib/tasks/lti2_tc_tasks.rake +4 -0
  45. data/lti2_tc/lti2_tc.gemspec +27 -0
  46. data/lti2_tc/test/controllers/lti2_tc/deployment_requests_controller_test.rb +11 -0
  47. data/lti2_tc/test/controllers/lti2_tc/tool_consumer_profiles_controller_test.rb +16 -0
  48. data/lti2_tc/test/controllers/lti2_tc/tool_proxies_controller_controller_test.rb +11 -0
  49. data/lti2_tc/test/controllers/lti2_tc/tool_settings_controller_controller_test.rb +16 -0
  50. data/lti2_tc/test/controllers/lti2_tc/tools_controller_controller_test.rb +16 -0
  51. data/lti2_tc/test/dummy/README.rdoc +28 -0
  52. data/lti2_tc/test/dummy/Rakefile +6 -0
  53. data/lti2_tc/test/dummy/app/assets/javascripts/application.js +13 -0
  54. data/lti2_tc/test/dummy/app/assets/stylesheets/application.css +13 -0
  55. data/lti2_tc/test/dummy/app/controllers/application_controller.rb +5 -0
  56. data/lti2_tc/test/dummy/app/helpers/application_helper.rb +2 -0
  57. data/lti2_tc/test/dummy/app/views/layouts/application.html.erb +14 -0
  58. data/lti2_tc/test/dummy/bin/bundle +3 -0
  59. data/lti2_tc/test/dummy/bin/rails +4 -0
  60. data/lti2_tc/test/dummy/bin/rake +4 -0
  61. data/lti2_tc/test/dummy/config.ru +4 -0
  62. data/lti2_tc/test/dummy/config/application.rb +23 -0
  63. data/lti2_tc/test/dummy/config/boot.rb +5 -0
  64. data/lti2_tc/test/dummy/config/database.yml +39 -0
  65. data/lti2_tc/test/dummy/config/environment.rb +5 -0
  66. data/lti2_tc/test/dummy/config/environments/development.rb +29 -0
  67. data/lti2_tc/test/dummy/config/environments/production.rb +80 -0
  68. data/lti2_tc/test/dummy/config/environments/test.rb +36 -0
  69. data/lti2_tc/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  70. data/lti2_tc/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  71. data/lti2_tc/test/dummy/config/initializers/inflections.rb +16 -0
  72. data/lti2_tc/test/dummy/config/initializers/mime_types.rb +5 -0
  73. data/lti2_tc/test/dummy/config/initializers/secret_token.rb +12 -0
  74. data/lti2_tc/test/dummy/config/initializers/session_store.rb +3 -0
  75. data/lti2_tc/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  76. data/lti2_tc/test/dummy/config/locales/en.yml +23 -0
  77. data/lti2_tc/test/dummy/config/routes.rb +4 -0
  78. data/lti2_tc/test/dummy/db/database.yml +39 -0
  79. data/lti2_tc/test/dummy/db/migrate/20131121225051_create_lti2_tc_registries.lti2_tc.rb +55 -0
  80. data/lti2_tc/test/dummy/db/schema.rb +68 -0
  81. data/lti2_tc/test/dummy/public/404.html +58 -0
  82. data/lti2_tc/test/dummy/public/422.html +58 -0
  83. data/lti2_tc/test/dummy/public/500.html +57 -0
  84. data/lti2_tc/test/dummy/public/favicon.ico +0 -0
  85. data/lti2_tc/test/fixtures/lti2_tc/registries.yml +7 -0
  86. data/lti2_tc/test/helpers/lti2_tc/deployment_requests_helper_test.rb +6 -0
  87. data/lti2_tc/test/helpers/lti2_tc/tool_consumer_profiles_helper_test.rb +6 -0
  88. data/lti2_tc/test/helpers/lti2_tc/tool_proxies_controller_helper_test.rb +6 -0
  89. data/lti2_tc/test/helpers/lti2_tc/tool_settings_controller_helper_test.rb +6 -0
  90. data/lti2_tc/test/helpers/lti2_tc/tools_controller_helper_test.rb +6 -0
  91. data/lti2_tc/test/integration/navigation_test.rb +10 -0
  92. data/lti2_tc/test/lti2_tc_test.rb +7 -0
  93. data/lti2_tc/test/models/lti2_tc/registries_test.rb +9 -0
  94. data/lti2_tc/test/test_helper.rb +15 -0
  95. metadata +93 -1
@@ -0,0 +1,361 @@
1
+ require_dependency 'lti2_tc/application_controller'
2
+
3
+ module Lti2Tc
4
+ class ToolsController < Lti2Tc::ApplicationController
5
+ include OAuth::OAuthProxy
6
+ include Lti2Commons::Utils
7
+
8
+ LTI2TC_SESSION_MAP = 'lti2_tc_session_map'
9
+
10
+ CORRELATION_ID = 'VND-IMS-CORRELATION-ID'
11
+ DISPOSITION = 'VND-IMS-DISPOSITION'
12
+
13
+ DISPOSITION_COMMIT = 'commit'
14
+ DISPOSITION_ABORT = 'abort'
15
+
16
+
17
+ def create
18
+ rack_parameters = OAuthRequest.collect_rack_parameters request
19
+
20
+ (tool_proxy_wrapper, status, error_msg) = process_tool_proxy(request)
21
+ if error_msg.present?
22
+ ( render :json => { :errors => [error_msg] }, :status => status ) and return
23
+ end
24
+
25
+ end_registration_id = request.headers[CORRELATION_ID]
26
+
27
+ disposition = (tool_proxy_wrapper.root.has_key? 'tool_proxy_guid') ? 'reregister' : 'register'
28
+ if disposition == 'register'
29
+ reg_key = rack_parameters[:oauth_consumer_key]
30
+ @deployment_request = Lti2Tc::DeploymentRequest.where(:reg_key => reg_key).first
31
+ else
32
+ reg_key = tool_proxy_wrapper.root['tool_proxy_guid']
33
+ tool = Lti2Tc::Tool.where(:key => reg_key).first
34
+ @deployment_request = Lti2Tc::DeploymentRequest.where(:tool_proxy_guid => reg_key).first
35
+ end
36
+
37
+ # prompt for disposition
38
+ session_map = {}
39
+ session[LTI2TC_SESSION_MAP] = session_map
40
+ session_map['deployment_request_id'] = @deployment_request.id
41
+ @deployment_request.disposition = disposition
42
+ @deployment_request.end_registration_id = end_registration_id
43
+ @deployment_request.tool_proxy_json = tool_proxy_wrapper.root.to_json
44
+ @deployment_request.save
45
+
46
+ if disposition == 'reregister'
47
+ #tool = Tool.where(:key => reg_key).last
48
+ #tool.new_deployment_request_id = @deployment_request.id
49
+ #tool.save
50
+ (render :nothing => true, :status => 201) and return
51
+ end
52
+
53
+ secret = @deployment_request.reg_password
54
+ begin
55
+ oauth_validation_using_secret secret
56
+ rescue
57
+ (render :json => {:errors => ['Invalid signature']}, :status => 401) and return
58
+ end
59
+
60
+ # generate guid for tool_proxy
61
+ tool_proxy_guid = UUID.generate
62
+ tool_proxy_wrapper.root['tool_proxy_guid'] = tool_proxy_guid
63
+ tool_proxy_wrapper.substitute_text_in_all_nodes '{', '}', {'tool_proxy_guid' => tool_proxy_guid}
64
+ tool_consumer_registry = Rails.application.config.tool_consumer_registry
65
+
66
+ product_name = tool_proxy_wrapper.first_at('tool_profile.product_instance.product_info.product_name.default_value')
67
+
68
+ @tool = Tool.new
69
+ @tool.is_enabled = false
70
+
71
+ @tool.tool_proxy = JSON.pretty_generate tool_proxy_wrapper.root
72
+ @tool.product_name = product_name
73
+ @tool.description = tool_proxy_wrapper.first_at('tool_profile.product_instance.product_info.description.default_value')
74
+ @tool.key = tool_proxy_guid
75
+ @tool.secret = tool_proxy_wrapper.first_at('security_contract.shared_secret')
76
+ @tool.status = 'registered'
77
+ @tool.end_registration_id = end_registration_id
78
+
79
+ # TEMPORARY: enable tool...FOR DEMOS
80
+ # @tool.is_enabled = true
81
+
82
+ @tool.save
83
+
84
+ resource_nodes = tool_proxy_wrapper.first_at('tool_profile.resource_handler')
85
+
86
+ # course 2(SMPL101), 11 & 12 DEP from conformance test
87
+ target_courses = [2, 5, 6]
88
+ for resource_node in resource_nodes
89
+ target_courses.each do |course_id|
90
+ # create resource-relative jsonpath
91
+ resource_json_obj = JsonWrapper.new resource_node
92
+ resource = Resource.new
93
+ resource.tool = @tool
94
+ resource.resource_type = resource_json_obj.first_at('resource_type.code')
95
+ resource.resource_name = resource_json_obj.first_at('resource_name.default_value')
96
+ resource.description = resource_json_obj.first_at('description.default_value')
97
+ resource.save
98
+
99
+ # TEMPORARY: auto-create one link for SMPL101 (#2)
100
+ link = Lti2Tc::Link.new
101
+ link.course_id = course_id
102
+ link.resource = resource
103
+ link.resource_link_label = resource.resource_name
104
+ link_parameter_str = "{"
105
+ if ["Book", "BookSelection", "InteractiveResource"].include? resource.resource_name
106
+ link_parameter_str += "\"vbid\":\"L-999-74180\""
107
+ end
108
+ if resource.resource_name == "BookSelection"
109
+ link_parameter_str += ",\"book_location\":\"outline\/3\""
110
+ end
111
+ link_parameter_str += "}"
112
+ link.link_parameters = link_parameter_str
113
+
114
+ # and a grade_item for resource iResource only
115
+ if resource.resource_name == "InteractiveResource"
116
+ grade_item = GradeItem.new
117
+ grade_item.course_id = link.course_id
118
+ grade_item.label = "IRTestGrade"
119
+ grade_item.save
120
+
121
+ link.grade_item_id = grade_item.id
122
+ end
123
+
124
+ link.is_enabled = true
125
+ link.save
126
+ end
127
+ end
128
+
129
+ # create links for conformance test
130
+ tc_profile_url = tool_proxy_wrapper.first_at('tool_consumer_profile')
131
+ tc_profile_guid = tc_profile_url.split('/').last if tc_profile_url =~ /\//
132
+
133
+ tool_proxy_guid = tool_proxy_wrapper.first_at('tool_proxy_guid')
134
+ tool_proxy_id = "#{tool_consumer_registry.tc_deployment_url}/tools/#{tool_proxy_guid}"
135
+ tool_proxy_wrapper.root['@id'] = tool_proxy_id
136
+ @tool.tool_proxy = JSON.pretty_generate tool_proxy_wrapper.root
137
+
138
+ capture_and_excise_settings(tool_proxy_wrapper.root, @tool)
139
+
140
+ @tool.save
141
+
142
+ @deployment_request.tool_proxy_guid = tool_proxy_guid
143
+ @deployment_request.save
144
+
145
+ #@deployment_request.delete
146
+
147
+
148
+ tool_proxy_response = {
149
+ "@context" => "http://purl.imsglobal.org/ctx/lti/v2/ToolProxyId",
150
+ "@type" => "ToolProxy",
151
+ "@id" => tool_proxy_id,
152
+ "tool_proxy_guid" => tool_proxy_guid
153
+ }
154
+
155
+ content_type = 'application/vnd.ims.lti.v2.toolproxy.id+json'
156
+ logger.info( "Exit from Tool/create(POST)--status 201 content-type: #{content_type}" )
157
+ logger.info( JSON.dump( tool_proxy_response ) )
158
+
159
+ render :json => tool_proxy_response, :content_type => content_type, :status => '201'
160
+ end
161
+
162
+ def show
163
+ oauth_validation
164
+
165
+ id_parm = params[:id]
166
+ match = /^id=(\d+)/.match( id_parm )
167
+ if match.present?
168
+ id = match[1]
169
+ @tool = Lti2Tc::Tool.find_by_id( id )
170
+ else
171
+ @tool = Lti2Tc::Tool.where( :key => id_parm ).first
172
+ end
173
+ ( render :text => "Unauthorized", :status => 401 unless @tool.present? ) and return
174
+ secret = @tool.secret
175
+ #oauth_validation_using_secret secret
176
+
177
+ tool_proxy_str = @tool.tool_proxy
178
+ tool_proxy = JSON.load( tool_proxy_str )
179
+
180
+ # merge in Tool Settings for ToolProxy level
181
+ tool_settings = Lti2Tc::ToolSetting.where( :scopeable_id => @tool.id )
182
+ tool_settings_custom = {}
183
+ tool_settings.each do |tool_setting|
184
+ tool_settings_custom[tool_setting.name] = tool_setting.value
185
+ end
186
+ if tool_settings_custom.length > 0
187
+ tool_settings_custom['@id'] = ""
188
+ tool_proxy[:custom] = tool_settings_custom
189
+ end
190
+
191
+ tool_proxy_pretty_str = JSON.pretty_generate( tool_proxy )
192
+
193
+ content_type = 'application/vnd.ims.lti.v2.toolproxy+json'
194
+
195
+ logger.info( "Exit from Tool/show(GET)--status: 200 content-type: #{content_type}" )
196
+ logger.info( JSON.dump( tool_proxy_pretty_str ) )
197
+
198
+ render :text => "<pre>#{tool_proxy_pretty_str}</pre>", :content_type => content_type
199
+ end
200
+
201
+ def reregister_continue
202
+
203
+
204
+ message_type = "reregistration"
205
+
206
+ tool_id = params[:tool_id]
207
+ @tool = Lti2Tc::Tool.find(tool_id)
208
+ new_deployment_request_id = @tool.new_deployment_request_id
209
+ @deployment_request = DeploymentRequest.find(new_deployment_request_id)
210
+ tool_proxy_wrapper = JsonWrapper.new(@deployment_request.tool_proxy_json)
211
+
212
+ @tool.end_registration_id = @deployment_request.end_registration_id
213
+ @tool.save
214
+
215
+ tool_proxy_guid = tool_proxy_wrapper.first_at('tool_proxy_guid')
216
+ tool_consumer_registry = Rails.application.config.tool_consumer_registry
217
+ tool_proxy_id = "#{tool_consumer_registry.tc_deployment_url}/tools/#{tool_proxy_guid}"
218
+
219
+ # Post EndRegistration
220
+ tool_proxy_service_hash = {}
221
+ content_type = 'application/vnd.ims.lti.v2.toolproxy.id+json'
222
+ reregistration_service = nil
223
+ reregistration_service_endpoint = nil
224
+
225
+ tool_proxy_wrapper.root['tool_profile']['service_offered'].each do |service|
226
+ if service['format'][0] == content_type
227
+ reregistration_service = service
228
+ end
229
+ if reregistration_service.nil?
230
+ return [nil, 500, 'No reregistration service defined']
231
+ end
232
+ reregistration_service_endpoint = reregistration_service['endpoint']
233
+ if reregistration_service_endpoint.nil?
234
+ return [nil, 500, 'No reregistration endpoint defined in reregistration service']
235
+ end
236
+ end
237
+
238
+ end_registration_request = {
239
+ "@context" => "http://purl.imsglobal.org/ctx/lti/v2/ToolProxyId",
240
+ "@type" => "ToolProxy",
241
+ "@id" => tool_proxy_id,
242
+ "tool_proxy_guid" => tool_proxy_guid
243
+ }
244
+
245
+ headers = {}
246
+ headers[CORRELATION_ID] = @tool.end_registration_id
247
+ headers[DISPOSITION] = DISPOSITION_COMMIT
248
+
249
+ #DEBUG ONLY
250
+ if reregistration_service_endpoint.include? 'http://localhost:5000'
251
+ reregistration_service_endpoint.sub!('http://localhost:5000', 'http://localhost:5100')
252
+ end
253
+
254
+ #response = HTTParty.post reregistration_service_endpoint, :body => end_registration_request.to_json, :headers => headers
255
+ signed_request = create_signed_request \
256
+ reregistration_service_endpoint,
257
+ 'POST',
258
+ @tool.key,
259
+ @tool.secret,
260
+ {},
261
+ end_registration_request.to_json,
262
+ "application/vnd.ims.lti.v2.toolproxy.id+json"
263
+
264
+ puts "Register request: #{signed_request.signature_base_string}"
265
+ puts "Register secret: #{@tool.secret}"
266
+ response = invoke_service(signed_request, Rails.application.config.wire_log, "Reregister ToolProxy",
267
+ CORRELATION_ID => @tool.end_registration_id, DISPOSITION => DISPOSITION_COMMIT)
268
+ # handle response error
269
+
270
+ product_name = tool_proxy_wrapper.first_at('tool_profile.product_instance.product_info.product_name.default_value')
271
+
272
+ @tool.tool_proxy = JSON.pretty_generate tool_proxy_wrapper.root
273
+ @tool.product_name = product_name
274
+ @tool.description = tool_proxy_wrapper.first_at('tool_profile.product_instance.product_info.description.default_value')
275
+ @tool.key = tool_proxy_wrapper.first_at('tool_proxy_guid')
276
+ @tool.secret = tool_proxy_wrapper.first_at('security_contract.shared_secret')
277
+ @tool.new_deployment_request_id = nil
278
+
279
+ tool_proxy_wrapper.root['@id'] = tool_proxy_id
280
+
281
+ @tool.tool_proxy = JSON.pretty_generate tool_proxy_wrapper.root
282
+
283
+ capture_and_excise_settings(tool_proxy_wrapper.root, @tool)
284
+
285
+ @tool.save
286
+
287
+ redirect_to @tool.registration_return_url
288
+ end
289
+
290
+ private
291
+
292
+ # for this reference impl: tool proxy settings system-of-record is db not TP itself
293
+ def capture_and_excise_settings( tool_proxy, tool )
294
+ settings = tool_proxy['custom']
295
+ if settings.present?
296
+ Lti2Tc::ToolSetting.where( :scopeable_type => 'Tool', :tool_id => tool.id ).delete_all
297
+
298
+ settings.each_pair do |k,v|
299
+ ts = Lti2Tc::ToolSetting.create(
300
+ :scopeable_type => 'Tool',
301
+ :tool_id => tool.id,
302
+ :scopeable_id => tool.id,
303
+ :name => k,
304
+ :value => v
305
+ )
306
+ ts.save
307
+ end
308
+
309
+ tool_proxy.delete( 'custom' )
310
+
311
+ end
312
+ end
313
+
314
+ def check_for_validity(tool_proxy_wrapper)
315
+ if tool_proxy_wrapper.first_at('security_contract.shared_secret').blank?
316
+ return 'Missing shared_secret'
317
+ end
318
+
319
+ # check that services are a subset of those offered
320
+ # first, grab guid from tc_profile_url
321
+ tc_profile_guid = tool_proxy_wrapper.root['tool_consumer_profile'].split('/').last
322
+ tcp_obj = ToolConsumerProfile.where( :tc_profile_guid => tc_profile_guid ).first
323
+ tcp_str = tcp_obj.tc_profile
324
+ tcp = JsonWrapper.new( tcp_str ).root
325
+ tcp_service_hash = {}
326
+ tcp['service_offered'].each { |service| tcp_service_hash[service['@id']] = service['action'] }
327
+ tool_proxy_wrapper.root['security_contract']['tool_service'].each do |tp_service_item|
328
+ if tcp_service_hash.keys.include?( tp_service_item['service'] )
329
+ tp_service_item['action'].each do |action|
330
+ unless tcp_service_hash[tp_service_item['service']].include?( action )
331
+ return "Service #{tp_service_item['service']} does not support #{action}"
332
+ end
333
+ end
334
+ else
335
+ return "Service mismatch on #{tp_service_item['service']}"
336
+ end
337
+ end
338
+ nil
339
+ end
340
+
341
+ def process_tool_proxy(request)
342
+ json_str = request.body.read
343
+
344
+ begin
345
+ tool_proxy_wrapper = JsonWrapper.new(json_str)
346
+ rescue
347
+ return [ nil, 400, 'JSON validation failure' ]
348
+ end
349
+
350
+ error_msg = check_for_validity(tool_proxy_wrapper)
351
+ if error_msg.present?
352
+ return [ nil, 400, error_msg ]
353
+ end
354
+
355
+ logger.info("ToolProxy as received: ")
356
+ logger.info(JSON.pretty_generate(tool_proxy_wrapper.root))
357
+
358
+ [tool_proxy_wrapper, nil, nil]
359
+ end
360
+ end
361
+ end
@@ -0,0 +1,43 @@
1
+ include Lti2Commons
2
+ include MessageSupport
3
+ include Signer
4
+
5
+ module Lti2Tc
6
+
7
+ class DeploymentRequest < ActiveRecord::Base
8
+
9
+ after_initialize :initialize_fields
10
+
11
+ def create_lti_message( base_url, current_user )
12
+ parameters = create_request_tool_deployment( base_url, current_user.to_s )
13
+ create_lti_message_body( partner_url, parameters,
14
+ Rails.application.config.wire_log, 'Request Tool Registration' )
15
+ end
16
+
17
+ def create_request_tool_deployment( base_url, user_id, lti_message_type = 'ToolProxyRegistrationRequest' )
18
+ parameters = {
19
+ 'lti_message_type' => lti_message_type,
20
+ 'lti_version' => 'LTI-2p0',
21
+ 'user_id' => "#{user_id}",
22
+ 'roles' => 'urn:lti:sysrole:ims/lis/SysAdmin',
23
+ 'tc_profile_url' => "#{base_url}/lti2_tc/tool_consumer_profiles/#{self.tc_profile_guid}",
24
+ 'reg_key' => self.reg_key,
25
+ 'reg_password' => self.reg_password,
26
+ 'launch_presentation_return_url' => "#{base_url}/admin/tool_actions",
27
+ 'launch_presentation_document_target' => 'window'
28
+ }
29
+ parameters
30
+ end
31
+
32
+ private
33
+
34
+ def initialize_fields
35
+ unless persisted?
36
+ self.reg_key = UUID.generate
37
+ self.tc_profile_guid = UUID.generate
38
+ self.reg_password = SecureRandom.hex
39
+ self.status = 'prepared'
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,24 @@
1
+ include Lti2Commons
2
+ include MessageSupport
3
+ include Signer
4
+
5
+ module Lti2Tc
6
+
7
+ class Link < ActiveRecord::Base
8
+ belongs_to :course
9
+ belongs_to :resource
10
+ has_many :tool_settings, :as => :scopeable
11
+
12
+ attr_accessor :is_link_visible, :url, :toggle_label, :grade_item_label, :grade_result
13
+
14
+ def lti_launch( user, return_url )
15
+ enrollment = Enrollment.where( :admin_user_id => user.id, :course_id => course.id ).first
16
+ Lti2Tc::Lti2Launch.new( user, self, self.resource, self.course, enrollment, return_url ).launch()
17
+ end
18
+
19
+ def is_ready_for_use
20
+ self.is_enabled and self.resource.tool.is_enabled
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,4 @@
1
+ module Lti2Tc
2
+ class Registry < ActiveRecord::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module Lti2Tc
2
+ class Resource < ActiveRecord::Base
3
+ belongs_to :tool
4
+
5
+ end
6
+ end
@@ -0,0 +1,12 @@
1
+ module Lti2Tc
2
+ class Tool < ActiveRecord::Base
3
+ has_many :resources
4
+ has_many :tool_settings, :as => :scopeable
5
+
6
+ attr_accessor :toggle_label, :new_tool_proxy_url
7
+
8
+ def get_tool_proxy
9
+ Lti2Commons::JsonWrapper.new( self.tool_proxy )
10
+ end
11
+ end
12
+ end