qalam_ims_lti 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/Changelog.txt +0 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +39 -0
  5. data/lib/ims/lis/context_type/handles.rb +10 -0
  6. data/lib/ims/lis/context_type/urns.rb +10 -0
  7. data/lib/ims/lis/roles/context/handles.rb +60 -0
  8. data/lib/ims/lis/roles/context/urns.rb +60 -0
  9. data/lib/ims/lis/roles/institution/handles.rb +22 -0
  10. data/lib/ims/lis/roles/institution/urns.rb +22 -0
  11. data/lib/ims/lis/roles/system/handles.rb +15 -0
  12. data/lib/ims/lis/roles/system/urns.rb +15 -0
  13. data/lib/ims/lis/statuses/simple_names.rb +9 -0
  14. data/lib/ims/lis/statuses/uris.rb +9 -0
  15. data/lib/ims/lis.rb +14 -0
  16. data/lib/ims/lti/converters/time_json_converter.rb +13 -0
  17. data/lib/ims/lti/converters.rb +5 -0
  18. data/lib/ims/lti/deprecated_role_checks.rb +52 -0
  19. data/lib/ims/lti/errors/authentication_failed_error.rb +11 -0
  20. data/lib/ims/lti/errors/invalid_lti_config_error.rb +4 -0
  21. data/lib/ims/lti/errors/invalid_tool_consumer_profile.rb +4 -0
  22. data/lib/ims/lti/errors/tool_proxy_registration_error.rb +15 -0
  23. data/lib/ims/lti/errors.rb +8 -0
  24. data/lib/ims/lti/extensions/canvas.rb +125 -0
  25. data/lib/ims/lti/extensions/content.rb +209 -0
  26. data/lib/ims/lti/extensions/outcome_data.rb +216 -0
  27. data/lib/ims/lti/extensions.rb +45 -0
  28. data/lib/ims/lti/launch_params.rb +166 -0
  29. data/lib/ims/lti/models/base_url_choice.rb +15 -0
  30. data/lib/ims/lti/models/base_url_selector.rb +5 -0
  31. data/lib/ims/lti/models/contact.rb +5 -0
  32. data/lib/ims/lti/models/content_item_container.rb +14 -0
  33. data/lib/ims/lti/models/content_item_placement.rb +20 -0
  34. data/lib/ims/lti/models/content_items/content_item.rb +32 -0
  35. data/lib/ims/lti/models/content_items/file_item.rb +15 -0
  36. data/lib/ims/lti/models/content_items/lti_link_item.rb +14 -0
  37. data/lib/ims/lti/models/content_items.rb +7 -0
  38. data/lib/ims/lti/models/icon_endpoint.rb +5 -0
  39. data/lib/ims/lti/models/icon_info.rb +6 -0
  40. data/lib/ims/lti/models/image.rb +7 -0
  41. data/lib/ims/lti/models/localized_name.rb +12 -0
  42. data/lib/ims/lti/models/localized_text.rb +12 -0
  43. data/lib/ims/lti/models/lti_model.rb +227 -0
  44. data/lib/ims/lti/models/membership_service/agent.rb +11 -0
  45. data/lib/ims/lti/models/membership_service/container.rb +11 -0
  46. data/lib/ims/lti/models/membership_service/context.rb +11 -0
  47. data/lib/ims/lti/models/membership_service/lis_membership_container.rb +13 -0
  48. data/lib/ims/lti/models/membership_service/lis_person.rb +14 -0
  49. data/lib/ims/lti/models/membership_service/membership.rb +14 -0
  50. data/lib/ims/lti/models/membership_service/organization.rb +14 -0
  51. data/lib/ims/lti/models/membership_service/page.rb +16 -0
  52. data/lib/ims/lti/models/membership_service/person.rb +13 -0
  53. data/lib/ims/lti/models/membership_service.rb +16 -0
  54. data/lib/ims/lti/models/message_handler.rb +14 -0
  55. data/lib/ims/lti/models/messages/basic_lti_launch_request.rb +24 -0
  56. data/lib/ims/lti/models/messages/content_item_selection.rb +32 -0
  57. data/lib/ims/lti/models/messages/content_item_selection_request.rb +26 -0
  58. data/lib/ims/lti/models/messages/message.rb +222 -0
  59. data/lib/ims/lti/models/messages/registration_request.rb +20 -0
  60. data/lib/ims/lti/models/messages/request_message.rb +12 -0
  61. data/lib/ims/lti/models/messages/tool_proxy_update_request.rb +15 -0
  62. data/lib/ims/lti/models/messages.rb +11 -0
  63. data/lib/ims/lti/models/parameter.rb +28 -0
  64. data/lib/ims/lti/models/product_family.rb +8 -0
  65. data/lib/ims/lti/models/product_info.rb +26 -0
  66. data/lib/ims/lti/models/product_instance.rb +10 -0
  67. data/lib/ims/lti/models/resource_handler.rb +22 -0
  68. data/lib/ims/lti/models/resource_type.rb +6 -0
  69. data/lib/ims/lti/models/rest_service.rb +30 -0
  70. data/lib/ims/lti/models/rest_service_profile.rb +15 -0
  71. data/lib/ims/lti/models/security_contract.rb +21 -0
  72. data/lib/ims/lti/models/security_profile.rb +10 -0
  73. data/lib/ims/lti/models/serializable.rb +12 -0
  74. data/lib/ims/lti/models/service_owner.rb +26 -0
  75. data/lib/ims/lti/models/service_provider.rb +11 -0
  76. data/lib/ims/lti/models/tool_consumer_profile.rb +45 -0
  77. data/lib/ims/lti/models/tool_profile.rb +35 -0
  78. data/lib/ims/lti/models/tool_proxy.rb +21 -0
  79. data/lib/ims/lti/models/tool_setting.rb +12 -0
  80. data/lib/ims/lti/models/tool_setting_container.rb +14 -0
  81. data/lib/ims/lti/models/vendor.rb +28 -0
  82. data/lib/ims/lti/models.rb +38 -0
  83. data/lib/ims/lti/outcome_request.rb +225 -0
  84. data/lib/ims/lti/outcome_response.rb +166 -0
  85. data/lib/ims/lti/request_validator.rb +56 -0
  86. data/lib/ims/lti/role_checks.rb +101 -0
  87. data/lib/ims/lti/serializers/base.rb +125 -0
  88. data/lib/ims/lti/serializers/membership_service/agent_serializer.rb +5 -0
  89. data/lib/ims/lti/serializers/membership_service/container_serializer.rb +6 -0
  90. data/lib/ims/lti/serializers/membership_service/context_serializer.rb +9 -0
  91. data/lib/ims/lti/serializers/membership_service/lis_membership_container_serializer.rb +9 -0
  92. data/lib/ims/lti/serializers/membership_service/lis_person_serializer.rb +12 -0
  93. data/lib/ims/lti/serializers/membership_service/membership_serializer.rb +7 -0
  94. data/lib/ims/lti/serializers/membership_service/organization_serializer.rb +8 -0
  95. data/lib/ims/lti/serializers/membership_service/page_serializer.rb +10 -0
  96. data/lib/ims/lti/serializers/membership_service/person_serializer.rb +8 -0
  97. data/lib/ims/lti/serializers/membership_service.rb +13 -0
  98. data/lib/ims/lti/serializers.rb +6 -0
  99. data/lib/ims/lti/services/authentication_service.rb +67 -0
  100. data/lib/ims/lti/services/message_authenticator.rb +80 -0
  101. data/lib/ims/lti/services/oauth2_client.rb +18 -0
  102. data/lib/ims/lti/services/tool_config.rb +223 -0
  103. data/lib/ims/lti/services/tool_consumer_profile_service.rb +16 -0
  104. data/lib/ims/lti/services/tool_proxy_registration_service.rb +84 -0
  105. data/lib/ims/lti/services/tool_proxy_validator.rb +182 -0
  106. data/lib/ims/lti/services.rb +11 -0
  107. data/lib/ims/lti/tool_base.rb +29 -0
  108. data/lib/ims/lti/tool_config.rb +231 -0
  109. data/lib/ims/lti/tool_consumer.rb +86 -0
  110. data/lib/ims/lti/tool_provider.rb +143 -0
  111. data/lib/ims/lti/version.rb +5 -0
  112. data/lib/ims/lti.rb +61 -0
  113. data/lib/ims.rb +4 -0
  114. metadata +379 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: db3b34151420c4a9527ad921f50c2dde950ceba6932641d5574797a2048fa884
4
+ data.tar.gz: '00001549f129c5702ed5a65efe41215076333b27abfdb3057cd935291e642644'
5
+ SHA512:
6
+ metadata.gz: 9d94160ee5062445d50f72aac11f69806421b0cc727582b9d15c04fcabb1c0e27b54dcddf71c718a8585e41f5cba07c92a1fca4562865b8704d3def4bfa157b3
7
+ data.tar.gz: a13ed5905cad8ce70a0e433403c02d831129f3e8a674c037afc36da6df37d9bbae9d4ef41f6537645adef97d88e80a2c98f50a911db334ab24b604421306e276
data/Changelog.txt ADDED
File without changes
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Instructure
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # IMS LTI
2
+
3
+ [![Build Status](https://travis-ci.org/instructure/ims-lti.svg?branch=2.1.x)](https://travis-ci.org/instructure/ims-lti)
4
+
5
+ LTI ruby implementation
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'qalam_ims_lti'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ ## Usage
18
+
19
+ ### LTI 1.x
20
+
21
+ #### Validating Launches
22
+
23
+ You can use the classes in the IMS::LTI::Models::Messages module to valdiate Launches
24
+
25
+ For example in a rails app you would do the following
26
+
27
+ ```ruby
28
+
29
+ authenticator = IMS::LTI::Services::MessageAuthenticator.new(request.url, request.request_parameters, shared_secret)
30
+
31
+ #Check if the signature is valid
32
+ return false unless authenticator.valid_signature?
33
+
34
+ # check if `params['oauth_nonce']` has already been used
35
+
36
+ #check if the message is too old
37
+ return false if DateTime.strptime(request.request_parameters['oauth_timestamp'],'%s') < 5.minutes.ago
38
+
39
+ ```
@@ -0,0 +1,10 @@
1
+ module IMS::LIS
2
+ module ContextType
3
+ module Handles
4
+ CourseTemplate = "CourseTemplate"
5
+ CourseOffering = "CourseOffering"
6
+ CourseSection = "CourseSection"
7
+ Group = "Group"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module IMS::LIS
2
+ module ContextType
3
+ module URNs
4
+ CourseTemplate = "urn:lti:context-type:ims/lis/CourseTemplate"
5
+ CourseOffering = "urn:lti:context-type:ims/lis/CourseOffering"
6
+ CourseSection = "urn:lti:context-type:ims/lis/CourseSection"
7
+ Group = "urn:lti:context-type:ims/lis/Group"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,60 @@
1
+ module IMS::LIS
2
+ module Roles
3
+ module Context
4
+ module Handles
5
+ Learner = "Learner"
6
+ Learner_Learner = "Learner/Learner"
7
+ Learner_NonCreditLearner = "Learner/NonCreditLearner"
8
+ Learner_GuestLearner = "Learner/GuestLearner"
9
+ Learner_ExternalLearner = "Learner/ExternalLearner"
10
+ Learner_Instructor = "Learner/Instructor"
11
+ Instructor = "Instructor"
12
+ Instructor_PrimaryInstructor = "Instructor/PrimaryInstructor"
13
+ Instructor_Lecturer = "Instructor/Lecturer"
14
+ Instructor_GuestInstructor = "Instructor/GuestInstructor"
15
+ Instructor_ExternalInstructor = "Instructor/ExternalInstructor"
16
+ ContentDeveloper = "ContentDeveloper"
17
+ ContentDeveloper_ContentDeveloper = "ContentDeveloper/ContentDeveloper"
18
+ ContentDeveloper_Librarian = "ContentDeveloper/Librarian"
19
+ ContentDeveloper_ContentExpert = "ContentDeveloper/ContentExpert"
20
+ ContentDeveloper_ExternalContentExpert = "ContentDeveloper/ExternalContentExpert"
21
+ Member = "Member"
22
+ Member_Member = "Member/Member"
23
+ Manager = "Manager"
24
+ Manager_AreaManager = "Manager/AreaManager"
25
+ Manager_CourseCoordinator = "Manager/CourseCoordinator"
26
+ Manager_Observer = "Manager/Observer"
27
+ Manager_ExternalObserver = "Manager/ExternalObserver"
28
+ Mentor = "Mentor"
29
+ Mentor_Mentor = "Mentor/Mentor"
30
+ Mentor_Reviewer = "Mentor/Reviewer"
31
+ Mentor_Advisor = "Mentor/Advisor"
32
+ Mentor_Auditor = "Mentor/Auditor"
33
+ Mentor_Tutor = "Mentor/Tutor"
34
+ Mentor_LearningFacilitator = "Mentor/LearningFacilitator"
35
+ Mentor_ExternalMentor = "Mentor/ExternalMentor"
36
+ Mentor_ExternalReviewer = "Mentor/ExternalReviewer"
37
+ Mentor_ExternalAdvisor = "Mentor/ExternalAdvisor"
38
+ Mentor_ExternalAuditor = "Mentor/ExternalAuditor"
39
+ Mentor_ExternalTutor = "Mentor/ExternalTutor"
40
+ Mentor_ExternalLearningFacilitator = "Mentor/ExternalLearningFacilitator"
41
+ Administrator = "Administrator"
42
+ Administrator_Administrator = "Administrator/Administrator"
43
+ Administrator_Support = "Administrator/Support"
44
+ Administrator_Developer = "Administrator/Developer"
45
+ Administrator_SystemAdministrator = "Administrator/SystemAdministrator"
46
+ Administrator_ExternalSystemAdministrator = "Administrator/ExternalSystemAdministrator"
47
+ Administrator_ExternalDeveloper = "Administrator/ExternalDeveloper"
48
+ Administrator_ExternalSupport = "Administrator/ExternalSupport"
49
+ TeachingAssistant = "TeachingAssistant"
50
+ TeachingAssistant_TeachingAssistant = "TeachingAssistant/TeachingAssistant"
51
+ TeachingAssistant_TeachingAssistantSection = "TeachingAssistant/TeachingAssistantSection"
52
+ TeachingAssistant_TeachingAssistantSectionAssociation = "TeachingAssistant/TeachingAssistantSectionAssociation"
53
+ TeachingAssistant_TeachingAssistantOffering = "TeachingAssistant/TeachingAssistantOffering"
54
+ TeachingAssistant_TeachingAssistantTemplate = "TeachingAssistant/TeachingAssistantTemplate"
55
+ TeachingAssistant_TeachingAssistantGroup = "TeachingAssistant/TeachingAssistantGroup"
56
+ TeachingAssistant_Grader = "TeachingAssistant/Grader"
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,60 @@
1
+ module IMS::LIS
2
+ module Roles
3
+ module Context
4
+ module URNs
5
+ Learner = "urn:lti:role:ims/lis/Learner"
6
+ Learner_Learner = "urn:lti:role:ims/lis/Learner/Learner"
7
+ Learner_NonCreditLearner = "urn:lti:role:ims/lis/Learner/NonCreditLearner"
8
+ Learner_GuestLearner = "urn:lti:role:ims/lis/Learner/GuestLearner"
9
+ Learner_ExternalLearner = "urn:lti:role:ims/lis/Learner/ExternalLearner"
10
+ Learner_Instructor = "urn:lti:role:ims/lis/Learner/Instructor"
11
+ Instructor = "urn:lti:role:ims/lis/Instructor"
12
+ Instructor_PrimaryInstructor = "urn:lti:role:ims/lis/Instructor/PrimaryInstructor"
13
+ Instructor_Lecturer = "urn:lti:role:ims/lis/Instructor/Lecturer"
14
+ Instructor_GuestInstructor = "urn:lti:role:ims/lis/Instructor/GuestInstructor"
15
+ Instructor_ExternalInstructor = "urn:lti:role:ims/lis/Instructor/ExternalInstructor"
16
+ ContentDeveloper = "urn:lti:role:ims/lis/ContentDeveloper"
17
+ ContentDeveloper_ContentDeveloper = "urn:lti:role:ims/lis/ContentDeveloper/ContentDeveloper"
18
+ ContentDeveloper_Librarian = "urn:lti:role:ims/lis/ContentDeveloper/Librarian"
19
+ ContentDeveloper_ContentExpert = "urn:lti:role:ims/lis/ContentDeveloper/ContentExpert"
20
+ ContentDeveloper_ExternalContentExpert = "urn:lti:role:ims/lis/ContentDeveloper/ExternalContentExpert"
21
+ Member = "urn:lti:role:ims/lis/Member"
22
+ Member_Member = "urn:lti:role:ims/lis/Member/Member"
23
+ Manager = "urn:lti:role:ims/lis/Manager"
24
+ Manager_AreaManager = "urn:lti:role:ims/lis/Manager/AreaManager"
25
+ Manager_CourseCoordinator = "urn:lti:role:ims/lis/Manager/CourseCoordinator"
26
+ Manager_Observer = "urn:lti:role:ims/lis/Manager/Observer"
27
+ Manager_ExternalObserver = "urn:lti:role:ims/lis/Manager/ExternalObserver"
28
+ Mentor = "urn:lti:role:ims/lis/Mentor"
29
+ Mentor_Mentor = "urn:lti:role:ims/lis/Mentor/Mentor"
30
+ Mentor_Reviewer = "urn:lti:role:ims/lis/Mentor/Reviewer"
31
+ Mentor_Advisor = "urn:lti:role:ims/lis/Mentor/Advisor"
32
+ Mentor_Auditor = "urn:lti:role:ims/lis/Mentor/Auditor"
33
+ Mentor_Tutor = "urn:lti:role:ims/lis/Mentor/Tutor"
34
+ Mentor_LearningFacilitator = "urn:lti:role:ims/lis/Mentor/LearningFacilitator"
35
+ Mentor_ExternalMentor = "urn:lti:role:ims/lis/Mentor/ExternalMentor"
36
+ Mentor_ExternalReviewer = "urn:lti:role:ims/lis/Mentor/ExternalReviewer"
37
+ Mentor_ExternalAdvisor = "urn:lti:role:ims/lis/Mentor/ExternalAdvisor"
38
+ Mentor_ExternalAuditor = "urn:lti:role:ims/lis/Mentor/ExternalAuditor"
39
+ Mentor_ExternalTutor = "urn:lti:role:ims/lis/Mentor/ExternalTutor"
40
+ Mentor_ExternalLearningFacilitator = "urn:lti:role:ims/lis/Mentor/ExternalLearningFacilitator"
41
+ Administrator = "urn:lti:role:ims/lis/Administrator"
42
+ Administrator_Administrator = "urn:lti:role:ims/lis/Administrator/Administrator"
43
+ Administrator_Support = "urn:lti:role:ims/lis/Administrator/Support"
44
+ Administrator_Developer = "urn:lti:role:ims/lis/Administrator/Developer"
45
+ Administrator_SystemAdministrator = "urn:lti:role:ims/lis/Administrator/SystemAdministrator"
46
+ Administrator_ExternalSystemAdministrator = "urn:lti:role:ims/lis/Administrator/ExternalSystemAdministrator"
47
+ Administrator_ExternalDeveloper = "urn:lti:role:ims/lis/Administrator/ExternalDeveloper"
48
+ Administrator_ExternalSupport = "urn:lti:role:ims/lis/Administrator/ExternalSupport"
49
+ TeachingAssistant = "urn:lti:role:ims/lis/TeachingAssistant"
50
+ TeachingAssistant_TeachingAssistant = "urn:lti:role:ims/lis/TeachingAssistant/TeachingAssistant"
51
+ TeachingAssistant_TeachingAssistantSection = "urn:lti:role:ims/lis/TeachingAssistant/TeachingAssistantSection"
52
+ TeachingAssistant_TeachingAssistantSectionAssociation = "urn:lti:role:ims/lis/TeachingAssistant/TeachingAssistantSectionAssociation"
53
+ TeachingAssistant_TeachingAssistantOffering = "urn:lti:role:ims/lis/TeachingAssistant/TeachingAssistantOffering"
54
+ TeachingAssistant_TeachingAssistantTemplate = "urn:lti:role:ims/lis/TeachingAssistant/TeachingAssistantTemplate"
55
+ TeachingAssistant_TeachingAssistantGroup = "urn:lti:role:ims/lis/TeachingAssistant/TeachingAssistantGroup"
56
+ TeachingAssistant_Grader = "urn:lti:role:ims/lis/TeachingAssistant/Grader"
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,22 @@
1
+ module IMS::LIS
2
+ module Roles
3
+ module Institution
4
+ module Handles
5
+ Student = "Student"
6
+ Faculty = "Faculty"
7
+ Member = "Member"
8
+ Learner = "Learner"
9
+ Instructor = "Instructor"
10
+ Mentor = "Mentor"
11
+ Staff = "Staff"
12
+ Alumni = "Alumni"
13
+ ProspectiveStudent = "ProspectiveStudent"
14
+ Guest = "Guest"
15
+ Other = "Other"
16
+ Administrator = "Administrator"
17
+ Observer = "Observer"
18
+ None = "None"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ module IMS::LIS
2
+ module Roles
3
+ module Institution
4
+ module URNs
5
+ Student = "urn:lti:instrole:ims/lis/Student"
6
+ Faculty = "urn:lti:instrole:ims/lis/Faculty"
7
+ Member = "urn:lti:instrole:ims/lis/Member"
8
+ Learner = "urn:lti:instrole:ims/lis/Learner"
9
+ Instructor = "urn:lti:instrole:ims/lis/Instructor"
10
+ Mentor = "urn:lti:instrole:ims/lis/Mentor"
11
+ Staff = "urn:lti:instrole:ims/lis/Staff"
12
+ Alumni = "urn:lti:instrole:ims/lis/Alumni"
13
+ ProspectiveStudent = "urn:lti:instrole:ims/lis/ProspectiveStudent"
14
+ Guest = "urn:lti:instrole:ims/lis/Guest"
15
+ Other = "urn:lti:instrole:ims/lis/Other"
16
+ Administrator = "urn:lti:instrole:ims/lis/Administrator"
17
+ Observer = "urn:lti:instrole:ims/lis/Observer"
18
+ None = "urn:lti:instrole:ims/lis/None"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ module IMS::LIS
2
+ module Roles
3
+ module System
4
+ module Handles
5
+ SysAdmin = "SysAdmin"
6
+ SysSupport = "SysSupport"
7
+ Creator = "Creator"
8
+ AccountAdmin = "AccountAdmin"
9
+ User = "User"
10
+ Administrator = "Administrator"
11
+ None = "None"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module IMS::LIS
2
+ module Roles
3
+ module System
4
+ module URNs
5
+ SysAdmin = "urn:lti:sysrole:ims/lis/SysAdmin"
6
+ SysSupport = "urn:lti:sysrole:ims/lis/SysSupport"
7
+ Creator = "urn:lti:sysrole:ims/lis/Creator"
8
+ AccountAdmin = "urn:lti:sysrole:ims/lis/AccountAdmin"
9
+ User = "urn:lti:sysrole:ims/lis/User"
10
+ Administrator = "urn:lti:sysrole:ims/lis/Administrator"
11
+ None = "urn:lti:sysrole:ims/lis/None"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ module IMS::LIS
2
+ module Statuses
3
+ module SimpleNames
4
+ Active = 'Active'
5
+ Deleted = 'Deleted'
6
+ Inactive = 'Inactive'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module IMS::LIS
2
+ module Statuses
3
+ module URIs
4
+ Active = 'http://purl.imsglobal.org/vocab/lis/v2/status#Active'
5
+ Deleted = 'http://purl.imsglobal.org/vocab/lis/v2/status#Deleted'
6
+ Inactive = 'http://purl.imsglobal.org/vocab/lis/v2/status#Inactive'
7
+ end
8
+ end
9
+ end
data/lib/ims/lis.rb ADDED
@@ -0,0 +1,14 @@
1
+ module IMS
2
+ module LIS
3
+ require_relative 'lis/context_type/handles'
4
+ require_relative 'lis/context_type/urns'
5
+ require_relative 'lis/roles/institution/handles'
6
+ require_relative 'lis/roles/institution/urns'
7
+ require_relative 'lis/roles/system/handles'
8
+ require_relative 'lis/roles/system/urns'
9
+ require_relative 'lis/roles/context/handles'
10
+ require_relative 'lis/roles/context/urns'
11
+ require_relative 'lis/statuses/simple_names'
12
+ require_relative 'lis/statuses/uris'
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module IMS::LTI::Converters
2
+ class TimeJSONConverter
3
+
4
+ def self.to_json_value(time)
5
+ time
6
+ end
7
+
8
+ def self.from_json_value(json_val)
9
+ Time.parse(json_val)
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ module IMS::LTI
2
+ module Converters
3
+ require_relative 'converters/time_json_converter'
4
+ end
5
+ end
@@ -0,0 +1,52 @@
1
+ # These are here for backwards-compatibility
2
+ # But they are deprecated and the new ones in
3
+ # role_checks.rb should be used
4
+ module IMS::LTI
5
+ module DeprecatedRoleChecks
6
+ # Check whether the Launch Parameters have a role
7
+ def has_role?(role)
8
+ role = role.downcase
9
+ @roles && @roles.any?{|r| r.downcase.index(role)}
10
+ end
11
+
12
+ # Convenience method for checking if the user has 'learner' or 'student' role
13
+ def student?
14
+ has_role?('learner') || has_role?('student')
15
+ end
16
+
17
+ # Convenience method for checking if the user has 'instructor' or 'faculty' or 'staff' role
18
+ def instructor?
19
+ has_role?('instructor') || has_role?('faculty') || has_role?('staff')
20
+ end
21
+
22
+ # Convenience method for checking if the user has 'contentdeveloper' role
23
+ def content_developer?
24
+ has_role?('ContentDeveloper')
25
+ end
26
+
27
+ # Convenience method for checking if the user has 'Member' role
28
+ def member?
29
+ has_role?('Member')
30
+ end
31
+
32
+ # Convenience method for checking if the user has 'Manager' role
33
+ def manager?
34
+ has_role?('Manager')
35
+ end
36
+
37
+ # Convenience method for checking if the user has 'Mentor' role
38
+ def mentor?
39
+ has_role?('Mentor')
40
+ end
41
+
42
+ # Convenience method for checking if the user has 'administrator' role
43
+ def admin?
44
+ has_role?('administrator')
45
+ end
46
+
47
+ # Convenience method for checking if the user has 'TeachingAssistant' role
48
+ def ta?
49
+ has_role?('TeachingAssistant')
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,11 @@
1
+ module IMS::LTI::Errors
2
+ class AuthenticationFailedError < StandardError
3
+
4
+ attr_reader :response
5
+
6
+ def initialize(response: nil)
7
+ @response = response
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ module IMS::LTI::Errors
2
+ class InvalidLTIConfigError < StandardError
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module IMS::LTI::Errors
2
+ class InvalidToolConsumerProfile < StandardError
3
+ end
4
+ end
@@ -0,0 +1,15 @@
1
+ module IMS::LTI::Errors
2
+ class ToolProxyRegistrationError < StandardError
3
+ attr_reader :response_status, :response_body
4
+
5
+ def initialize(response_status, response_body = nil)
6
+ @response_status = response_status
7
+ @response_body = response_body
8
+ super <<-EOF
9
+ Unexpected response for tool proxy registration.
10
+ HTTP Response Status: #{response_status}
11
+ HTTP Response Body: #{response_body}
12
+ EOF
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ module IMS::LTI
2
+ module Errors
3
+ require_relative 'errors/invalid_lti_config_error'
4
+ require_relative 'errors/tool_proxy_registration_error'
5
+ require_relative 'errors/invalid_tool_consumer_profile'
6
+ require_relative 'errors/authentication_failed_error'
7
+ end
8
+ end
@@ -0,0 +1,125 @@
1
+ module IMS::LTI
2
+ module Extensions
3
+ # Module that adds Canvas specific LTI extensions
4
+ #
5
+ # It adds convenience methods for generating common canvas use case LTI configurations
6
+ #
7
+ # == Usage
8
+ # To generate an XML configuration:
9
+ #
10
+ # # Create a config object and set some options
11
+ # tc = IMS::LTI::ToolConfig.new(:title => "Example Sinatra Tool Provider", :launch_url => url)
12
+ # tc.description = "This example LTI Tool Provider supports LIS Outcome pass-back."
13
+ #
14
+ # # Extend the Canvas Tool config and add canvas related extensions
15
+ # tc.extend IMS::LTI::Extensions::Canvas::ToolConfig
16
+ # tc.homework_submission! 'http://someplace.com/homework', 'Find Homework'
17
+ #
18
+ # # generate the XML
19
+ # tc.to_xml
20
+ #
21
+ # Or to create a config object from an XML String:
22
+ #
23
+ # tc = IMS::LTI::ToolConfig.create_from_xml(xml)
24
+
25
+ module Canvas
26
+ module ToolConfig
27
+ PLATFORM = 'canvas.instructure.com'
28
+
29
+ # Canvas extension defaults
30
+ # These properties will cascade down to any options that are configured
31
+ def set_canvas_ext_param(key, value)
32
+ set_ext_param(PLATFORM, key, value)
33
+ end
34
+
35
+ def get_canvas_param(param_key)
36
+ get_ext_param PLATFORM, param_key
37
+ end
38
+
39
+ def canvas_privacy_public!()
40
+ set_canvas_ext_param(:privacy_level, 'public')
41
+ end
42
+
43
+ def canvas_privacy_name_only!()
44
+ set_canvas_ext_param(:privacy_level, 'name_only')
45
+ end
46
+
47
+ def canvas_privacy_anonymous!()
48
+ set_canvas_ext_param(:privacy_level, 'anonymous')
49
+ end
50
+
51
+ def canvas_domain!(domain)
52
+ set_canvas_ext_param(:domain, domain)
53
+ end
54
+
55
+ def canvas_text!(text)
56
+ set_canvas_ext_param(:text, text)
57
+ end
58
+
59
+ def canvas_icon_url!(icon_url)
60
+ set_canvas_ext_param(:icon_url, icon_url)
61
+ end
62
+
63
+ def canvas_tool_id!(tool_id)
64
+ set_canvas_ext_param(:tool_id, tool_id)
65
+ end
66
+
67
+ def canvas_selector_dimensions!(width, height)
68
+ set_canvas_ext_param(:selection_width, width)
69
+ set_canvas_ext_param(:selection_height, height)
70
+ end
71
+
72
+ # Canvas options
73
+ # These configure canvas to expose the tool in various locations. Any properties that are set
74
+ # at this level will override the defaults for this launch of the tool
75
+
76
+ # Enables homework submissions via the tool
77
+ # Valid properties are url, text, selection_width, selection_height, enabled
78
+ def canvas_homework_submission!(params = {})
79
+ set_canvas_ext_param(:homework_submission, params)
80
+ end
81
+
82
+ # Adds the tool to canvas' rich text editor
83
+ # Valid properties are url, icon_url, text, selection_width, selection_height, enabled
84
+ def canvas_editor_button!(params = {})
85
+ set_canvas_ext_param(:editor_button, params)
86
+ end
87
+
88
+ # Adds the tool to canvas' resource selector
89
+ # Valid properties are url, text, selection_width, selection_height, enabled
90
+ def canvas_resource_selection!(params = {})
91
+ set_canvas_ext_param(:resource_selection, params)
92
+ end
93
+
94
+ # Adds the tool to account level navigation in canvas
95
+ # Valid properties are url, text, enabled
96
+ def canvas_account_navigation!(params = {})
97
+ set_canvas_ext_param(:account_navigation, params)
98
+ end
99
+
100
+ # Adds the tool to course level navigation in canvas
101
+ # Valid properties are url, text, visibility, default, enabled
102
+ # Visibility describes who will see the navigation element. Possible values are "admins", "members", and nil
103
+ # Default determines if it is on or off by default. Possible values are "admins", "members", and nil
104
+ def canvas_course_navigation!(params = {})
105
+ set_canvas_ext_param(:course_navigation, params)
106
+ end
107
+
108
+ # Adds the tool to user level navigation in canvas
109
+ # Valid properties are url, text, enabled
110
+ def canvas_user_navigation!(params = {})
111
+ set_canvas_ext_param(:user_navigation, params)
112
+ end
113
+
114
+ def canvas_course_home_sub_navigation!(params = {})
115
+ set_canvas_ext_param(:course_home_sub_navigation, params)
116
+ end
117
+ # Adds canvas environment configurations options
118
+ # Valid properties are launch_url, domain, test_launch_url, test_domain, beta_launch_url, beta_domain
119
+ def canvas_environments!(params = {})
120
+ set_canvas_ext_param(:environments, params)
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end