lti_skydrive 0.0.1

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 (150) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +20 -0
  4. data/app/assets/fonts/skydrive/font/FontAwesome.otf +0 -0
  5. data/app/assets/fonts/skydrive/font/fontawesome-webfont.eot +0 -0
  6. data/app/assets/fonts/skydrive/font/fontawesome-webfont.svg +399 -0
  7. data/app/assets/fonts/skydrive/font/fontawesome-webfont.ttf +0 -0
  8. data/app/assets/fonts/skydrive/font/fontawesome-webfont.woff +0 -0
  9. data/app/assets/images/skydrive/banner.png +0 -0
  10. data/app/assets/images/skydrive/icon-file.png +0 -0
  11. data/app/assets/images/skydrive/icon-folder-back.png +0 -0
  12. data/app/assets/images/skydrive/icon-folder.png +0 -0
  13. data/app/assets/images/skydrive/icon-jpg.png +0 -0
  14. data/app/assets/images/skydrive/icon-pdf.png +0 -0
  15. data/app/assets/images/skydrive/icon-png.png +0 -0
  16. data/app/assets/images/skydrive/icon-word.png +0 -0
  17. data/app/assets/images/skydrive/logo.png +0 -0
  18. data/app/assets/images/skydrive/office_365.jpg +0 -0
  19. data/app/assets/images/skydrive/skydrive_icon.png +0 -0
  20. data/app/assets/javascripts/skydrive/application.js +16 -0
  21. data/app/assets/javascripts/skydrive/vendor/ember.js +23 -0
  22. data/app/assets/javascripts/skydrive/vendor/handlebars.js +362 -0
  23. data/app/assets/javascripts/skydrive/vendor/jquery.js +9597 -0
  24. data/app/assets/stylesheets/skydrive/app.css +5617 -0
  25. data/app/assets/stylesheets/skydrive/font-awesome/font-awesome.min.css +403 -0
  26. data/app/assets/stylesheets/skydrive/normalize.css +405 -0
  27. data/app/assets/stylesheets/skydrive/style.css +27 -0
  28. data/app/controllers/skydrive/api_keys_controller.rb +13 -0
  29. data/app/controllers/skydrive/application_controller.rb +40 -0
  30. data/app/controllers/skydrive/ember_controller.rb +23 -0
  31. data/app/controllers/skydrive/files_controller.rb +62 -0
  32. data/app/controllers/skydrive/launch_controller.rb +152 -0
  33. data/app/controllers/skydrive/session_controller.rb +12 -0
  34. data/app/controllers/skydrive/users_controller.rb +34 -0
  35. data/app/helpers/skydrive/application_helper.rb +4 -0
  36. data/app/helpers/skydrive/ember_helper.rb +4 -0
  37. data/app/models/skydrive/api_key.rb +47 -0
  38. data/app/models/skydrive/lti_key.rb +10 -0
  39. data/app/models/skydrive/token.rb +14 -0
  40. data/app/models/skydrive/user.rb +28 -0
  41. data/app/serializers/api_key_serializer.rb +5 -0
  42. data/app/serializers/user_serializer.rb +5 -0
  43. data/app/views/layouts/skydrive/application.html.erb +21 -0
  44. data/app/views/skydrive/ember/index.html.erb +20 -0
  45. data/config/initializers/sharepoint.rb +1 -0
  46. data/config/routes.rb +24 -0
  47. data/config/sharepoint.yml.example +17 -0
  48. data/db/migrate/20130710195807_create_users.rb +11 -0
  49. data/db/migrate/20130710195819_create_api_keys.rb +15 -0
  50. data/db/migrate/20130722173006_add_skydrive_token_storage.rb +15 -0
  51. data/db/migrate/20130725183724_add_client_domain_to_skydrive_tokens.rb +5 -0
  52. data/db/migrate/20130726170108_add_personal_url_to_skydrive_token.rb +5 -0
  53. data/db/migrate/20130730164700_add_init_params_to_api_key.rb +5 -0
  54. data/db/migrate/20130801181008_create_lti_keys.rb +9 -0
  55. data/db/migrate/20130802231147_change_skydrive_token_length.rb +6 -0
  56. data/db/migrate/20140103221052_skydrive_namespace.rb +13 -0
  57. data/lib/skydrive/client.rb +161 -0
  58. data/lib/skydrive/engine.rb +16 -0
  59. data/lib/skydrive/file.rb +49 -0
  60. data/lib/skydrive/folder.rb +13 -0
  61. data/lib/skydrive/version.rb +3 -0
  62. data/lib/skydrive.rb +4 -0
  63. data/lib/skydrive_proxy.rb +33 -0
  64. data/lib/tasks/ember.rake +48 -0
  65. data/lib/tasks/lti_key.rake +8 -0
  66. data/test/controllers/skydrive/ember_controller_test.rb +11 -0
  67. data/test/dummy/README.rdoc +28 -0
  68. data/test/dummy/Rakefile +6 -0
  69. data/test/dummy/app/assets/javascripts/application.js +13 -0
  70. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  71. data/test/dummy/app/controllers/application_controller.rb +5 -0
  72. data/test/dummy/app/helpers/application_helper.rb +2 -0
  73. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  74. data/test/dummy/bin/bundle +3 -0
  75. data/test/dummy/bin/rails +4 -0
  76. data/test/dummy/bin/rake +4 -0
  77. data/test/dummy/config/application.rb +25 -0
  78. data/test/dummy/config/boot.rb +5 -0
  79. data/test/dummy/config/database.yml +25 -0
  80. data/test/dummy/config/environment.rb +5 -0
  81. data/test/dummy/config/environments/development.rb +29 -0
  82. data/test/dummy/config/environments/production.rb +80 -0
  83. data/test/dummy/config/environments/test.rb +36 -0
  84. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  85. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  86. data/test/dummy/config/initializers/inflections.rb +16 -0
  87. data/test/dummy/config/initializers/mime_types.rb +5 -0
  88. data/test/dummy/config/initializers/secret_token.rb +12 -0
  89. data/test/dummy/config/initializers/session_store.rb +3 -0
  90. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  91. data/test/dummy/config/locales/en.yml +23 -0
  92. data/test/dummy/config/routes.rb +3 -0
  93. data/test/dummy/config/sharepoint.yml +15 -0
  94. data/test/dummy/config.ru +4 -0
  95. data/test/dummy/db/development.sqlite3 +0 -0
  96. data/test/dummy/db/schema.rb +60 -0
  97. data/test/dummy/db/test.sqlite3 +0 -0
  98. data/test/dummy/log/development.log +6484 -0
  99. data/test/dummy/log/test.log +2958 -0
  100. data/test/dummy/public/404.html +58 -0
  101. data/test/dummy/public/422.html +58 -0
  102. data/test/dummy/public/500.html +57 -0
  103. data/test/dummy/public/favicon.ico +0 -0
  104. data/test/dummy/tmp/cache/assets/development/sprockets/00546f7f6da41f471084ed2589ca4442 +0 -0
  105. data/test/dummy/tmp/cache/assets/development/sprockets/049dac97744466d4435aa8de57cc6099 +0 -0
  106. data/test/dummy/tmp/cache/assets/development/sprockets/0c92f67702b0dbd50edf7e6be63359ca +0 -0
  107. data/test/dummy/tmp/cache/assets/development/sprockets/0d26053221de21901f734bd6ba75bb28 +0 -0
  108. data/test/dummy/tmp/cache/assets/development/sprockets/0e383306a92ebd12d003a9e49ef6d508 +0 -0
  109. data/test/dummy/tmp/cache/assets/development/sprockets/16fa9bed5ef4abda841d3ef00e727580 +0 -0
  110. data/test/dummy/tmp/cache/assets/development/sprockets/17588b92c903e02837946f638eca86db +0 -0
  111. data/test/dummy/tmp/cache/assets/development/sprockets/21900b90dba7acf710178f3cd9dad43b +0 -0
  112. data/test/dummy/tmp/cache/assets/development/sprockets/25efc08f115a66b9c241a48e80a207ca +0 -0
  113. data/test/dummy/tmp/cache/assets/development/sprockets/3064fc29e24c9e97f7aad24f7e899cf6 +0 -0
  114. data/test/dummy/tmp/cache/assets/development/sprockets/311d9a5a43eb3fee9bba76971680620f +0 -0
  115. data/test/dummy/tmp/cache/assets/development/sprockets/35a147c1af5b608250e82ccb2f569d4b +0 -0
  116. data/test/dummy/tmp/cache/assets/development/sprockets/3dd0eb5a85d766c8d9fe5b29014edee4 +0 -0
  117. data/test/dummy/tmp/cache/assets/development/sprockets/63616bfc6c3f0267d5951cbbc83308cd +0 -0
  118. data/test/dummy/tmp/cache/assets/development/sprockets/65aa42ce50eac6f72e31861670f94518 +0 -0
  119. data/test/dummy/tmp/cache/assets/development/sprockets/66a8e9d3d86505dece06e6dd0edd18e1 +0 -0
  120. data/test/dummy/tmp/cache/assets/development/sprockets/78c4cbc0498be843f50ebdd02e2ead2f +0 -0
  121. data/test/dummy/tmp/cache/assets/development/sprockets/7caeca69c3c375c50a3c8cad8584be79 +0 -0
  122. data/test/dummy/tmp/cache/assets/development/sprockets/7d2b5e5332f464f65bf745d12ed9cbaa +0 -0
  123. data/test/dummy/tmp/cache/assets/development/sprockets/7e229ef6d57ba0e9f562cc129a3e4dfc +0 -0
  124. data/test/dummy/tmp/cache/assets/development/sprockets/87149d8992d83d7a95023dbfa4b53907 +0 -0
  125. data/test/dummy/tmp/cache/assets/development/sprockets/8bf6a6b96f5c827206f1fd42babe6c5e +0 -0
  126. data/test/dummy/tmp/cache/assets/development/sprockets/8c2066f7cc911ab8803cab8fea4e8bd6 +0 -0
  127. data/test/dummy/tmp/cache/assets/development/sprockets/9157ff048f219d7abc8b0f0fda771c92 +0 -0
  128. data/test/dummy/tmp/cache/assets/development/sprockets/a17c28776c4a2887f0fff4893854ef1d +0 -0
  129. data/test/dummy/tmp/cache/assets/development/sprockets/a29fed21bbc3985a31325c84a77e5f26 +0 -0
  130. data/test/dummy/tmp/cache/assets/development/sprockets/a3119da5b51c1a0a3c5cb7414ec920f5 +0 -0
  131. data/test/dummy/tmp/cache/assets/development/sprockets/a674526f54bc8458ebe36912ef85f003 +0 -0
  132. data/test/dummy/tmp/cache/assets/development/sprockets/aa904c0cc06f37bb0df493db59f18d70 +0 -0
  133. data/test/dummy/tmp/cache/assets/development/sprockets/adfa454123f4741a4b3919023b570d82 +0 -0
  134. data/test/dummy/tmp/cache/assets/development/sprockets/af6eedeceb4b732776dca83f456b2b93 +0 -0
  135. data/test/dummy/tmp/cache/assets/development/sprockets/b40cb2ddb88705f771e77d872feacf6a +0 -0
  136. data/test/dummy/tmp/cache/assets/development/sprockets/bf64c92410e28e00afb6139c5d4c61b9 +0 -0
  137. data/test/dummy/tmp/cache/assets/development/sprockets/dc6268ee4fa18069ce7c21888ea1932e +0 -0
  138. data/test/dummy/tmp/cache/assets/development/sprockets/df9900b8557146382d16cc592306b17f +0 -0
  139. data/test/dummy/tmp/cache/assets/development/sprockets/e3caec07cb46343e49b4f060e2d3392a +0 -0
  140. data/test/dummy/tmp/cache/assets/development/sprockets/e6ebfb0e93a47d0164d0fc4637054c38 +0 -0
  141. data/test/dummy/tmp/cache/assets/development/sprockets/ecb48e7374f399434aedbf30716e489a +0 -0
  142. data/test/dummy/tmp/cache/assets/development/sprockets/eeb495bc326785d2a6a14cf6d97024e4 +0 -0
  143. data/test/dummy/tmp/cache/assets/development/sprockets/ef91e47e51f204a8373f160f13a05a30 +0 -0
  144. data/test/dummy/tmp/cache/assets/development/sprockets/f48290aae486ea863a9f456ba96443e9 +0 -0
  145. data/test/dummy/tmp/cache/assets/development/sprockets/fa078ac6abaaee94445294c5a7c6d793 +0 -0
  146. data/test/helpers/skydrive/ember_helper_test.rb +6 -0
  147. data/test/integration/navigation_test.rb +10 -0
  148. data/test/skydrive_test.rb +7 -0
  149. data/test/test_helper.rb +15 -0
  150. metadata +375 -0
@@ -0,0 +1,152 @@
1
+ require 'ims/lti'
2
+
3
+ module Skydrive
4
+ class LaunchController < ApplicationController
5
+ include ActionController::Cookies
6
+
7
+ before_filter :ensure_authenticated_user, only: :skydrive_authorized
8
+
9
+ def tool_provider
10
+ require 'oauth/request_proxy/rack_request'
11
+
12
+ lti_key = LtiKey.where(key: params['oauth_consumer_key']).first
13
+
14
+ if lti_key
15
+ key = lti_key.key
16
+ secret = lti_key.secret
17
+ end
18
+
19
+ tp = IMS::LTI::ToolProvider.new(key, secret, params)
20
+
21
+ if !key
22
+ tp.lti_errorlog = "No consumer key"
23
+ elsif !secret
24
+ tp.lti_errorlog = "Consumer key wasn't recognized"
25
+ elsif !tp.valid_request?(request)
26
+ tp.lti_errorlog = "The OAuth signature was invalid"
27
+ elsif Time.now.utc.to_i - tp.request_oauth_timestamp.to_i > 120
28
+ tp.lti_errorlog = "Your request is too old."
29
+ end
30
+
31
+ #
32
+ ## this isn't actually checking anything like it should, just want people
33
+ ## implementing real tools to be aware they need to check the nonce
34
+ #if was_nonce_used_in_last_x_minutes?(@tp.request_oauth_nonce, 60)
35
+ # register_error "Why are you reusing the nonce?"
36
+ # return false
37
+ #end
38
+ #
39
+ ## save the launch parameters for use in later request
40
+ ##session['launch_params'] = @tp.to_params
41
+ #
42
+ #@username = @tp.username("Dude")
43
+
44
+ return tp
45
+ end
46
+
47
+ def basic_launch
48
+ tp = tool_provider
49
+ if tp.lti_errorlog
50
+ render text: tp.lti_errorlog, status: 400
51
+ return
52
+ end
53
+
54
+ email = tp.lis_person_contact_email_primary
55
+ unless email.present?
56
+ render text: "Missing email information"
57
+ return
58
+ end
59
+
60
+ unless client_domain = tp.get_custom_param('sharepoint_client_domain')
61
+ render text: "Missing sharepoint client domain", status: 400
62
+ return
63
+ end
64
+
65
+ user = User.where(email: email).first ||
66
+ User.create!(
67
+ name: tp.lis_person_name_full,
68
+ username: tp.user_id,
69
+ email: email
70
+ )
71
+
72
+ if user.token
73
+ user.token.update_attributes(client_domain: "#{client_domain}-my.sharepoint.com")
74
+ else
75
+ user.token = Token.create(client_domain: "#{client_domain}-my.sharepoint.com")
76
+ end
77
+ user.cleanup_api_keys
78
+
79
+ code = user.session_api_key(params).oauth_code
80
+ redirect_to "#{root_path}#/launch/#{code}"
81
+ end
82
+
83
+ def skydrive_authorized
84
+ skydrive_token = current_user.token
85
+ if skydrive_token && skydrive_token.requires_refresh?
86
+ results = skydrive_client.refresh_token(skydrive_token.refresh_token)
87
+ return render json: results if results.key? 'error'
88
+ skydrive_token.update_attributes(results)
89
+ end
90
+
91
+ if skydrive_token && skydrive_token.is_valid?
92
+ render json: {}, status: 201
93
+ else
94
+ code = current_user.api_keys.active.skydrive_oauth.create.oauth_code
95
+ auth_url = skydrive_client.oauth_authorize_redirect_uri(skydrive_redirect_uri, state: code)
96
+ render text: auth_url, status: 401
97
+ end
98
+ end
99
+
100
+ def microsoft_oauth
101
+ @current_user = ApiKey.trade_oauth_code_for_access_token(params['state']).user
102
+
103
+ results = skydrive_client.get_token(skydrive_redirect_uri, params['code'])
104
+ return render text: "#{results['error']} - #{results['error_description']}" if results.key? 'error'
105
+
106
+ results.merge!(personal_url: skydrive_client.get_user['PersonalUrl'])
107
+ @current_user.token.update_attributes(results)
108
+
109
+ redirect_to "#{root_path}#/oauth/callback"
110
+ end
111
+
112
+ def xml_config
113
+ # ie http://localhost:9393/config?sharepoint_client_domain=my_subdomain
114
+ host = request.scheme + "://" + request.host_with_port + "/"
115
+
116
+ if params['sharepoint_client_domain']
117
+ url = "#{request.protocol}#{request.host_with_port}#{launch_path}"
118
+ title = "Skydrive Pro"
119
+ tc = IMS::LTI::ToolConfig.new(:title => title, :launch_url => url)
120
+ tc.extend IMS::LTI::Extensions::Canvas::ToolConfig
121
+ tc.description = 'Allows you to pull in documents from Skydrive Pro to canvas'
122
+ tc.canvas_privacy_public!
123
+ tc.canvas_domain!(request.host)
124
+ tc.canvas_icon_url!("#{host}assets/skydrive/skydrive_icon.png")
125
+ tc.canvas_selector_dimensions!(700,600)
126
+ tc.canvas_text!(title)
127
+ tc.canvas_homework_submission!
128
+ #tc.canvas_editor_button!
129
+ #tc.canvas_resource_selection!
130
+ #tc.canvas_account_navigation!
131
+ #tc.canvas_course_navigation!
132
+ #tc.canvas_user_navigation!
133
+ tc.set_ext_param(
134
+ IMS::LTI::Extensions::Canvas::ToolConfig::PLATFORM, :custom_fields,
135
+ {sharepoint_client_domain: params['sharepoint_client_domain']})
136
+ render xml: tc.to_xml
137
+ else
138
+ render text: 'The sharepoint_client_domain is a required parameter.'
139
+ end
140
+ end
141
+
142
+ private
143
+
144
+ def skydrive_client
145
+ @skydrive_client ||= Client.new(SHAREPOINT.merge(client_domain: current_user.token.client_domain))
146
+ end
147
+
148
+ def skydrive_redirect_uri
149
+ @skydrive_redirect_uri ||= "#{request.protocol}#{request.host_with_port}#{microsoft_oauth_path}"
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,12 @@
1
+ module Skydrive
2
+ class SessionController < ApplicationController
3
+ def create
4
+ user = User.where("username = ? OR email = ?", params[:username_or_email], params[:username_or_email]).first
5
+ if user && user.authenticate(params[:password])
6
+ render json: user.session_api_key, status: 201
7
+ else
8
+ render json: {}, status: 401
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,34 @@
1
+ module Skydrive
2
+ class UsersController < ApplicationController
3
+ before_filter :ensure_authenticated_user, except: [:create]
4
+
5
+ # Returns list of users. This requires authorization
6
+ def index
7
+ render json: User.all
8
+ end
9
+
10
+ def show
11
+ if params[:id] == 'self'
12
+ render json: current_user
13
+ else
14
+ render json: User.find(params[:id])
15
+ end
16
+ end
17
+
18
+ def create
19
+ user = User.create(user_params)
20
+ if user.new_record?
21
+ render json: { errors: user.errors.messages }, status: 422
22
+ else
23
+ render json: user.session_api_key, status: 201
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ # Strong Parameters (Rails 4)
30
+ def user_params
31
+ params.require(:user).permit(:name, :username, :email, :password, :password_confirmation)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,4 @@
1
+ module Skydrive
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Skydrive
2
+ module EmberHelper
3
+ end
4
+ end
@@ -0,0 +1,47 @@
1
+ module Skydrive
2
+ class ApiKey < ActiveRecord::Base
3
+ validates :scope, inclusion: { in: %w( session api skydrive_oauth) }
4
+ #before_create :generate_access_token, :set_expiry_date
5
+ before_create :generate_code, :set_expiry_date
6
+ belongs_to :user
7
+
8
+ scope :session, -> { where(scope: 'session') }
9
+ scope :skydrive_oauth,-> { where(scope: 'skydrive_oauth') }
10
+ scope :api, -> { where(scope: 'api') }
11
+ scope :active, -> { where("expired_at >= ?", Time.now) }
12
+ scope :inactive, -> { where("expired_at < ?", Time.now) }
13
+
14
+ def params
15
+ self.init_params ? JSON.parse(self.init_params) : {}
16
+ end
17
+
18
+ def accepted_extensions
19
+ extensions = params['ext_content_file_extensions']
20
+ extensions ? extensions.split(',') : nil
21
+ end
22
+
23
+ private
24
+
25
+ def set_expiry_date
26
+ self.expired_at = case self.scope
27
+ when 'session'
28
+ 60.minutes.from_now
29
+ when 'skydrive_oauth'
30
+ 30.minutes.from_now
31
+ else
32
+ #Unsupported token types will start expired
33
+ Time.now
34
+ end
35
+ end
36
+
37
+ def generate_code
38
+ self.oauth_code = SecureRandom.uuid
39
+ end
40
+
41
+ def self.trade_oauth_code_for_access_token(oauth_code)
42
+ api_key = ApiKey.active.where(oauth_code: oauth_code).first if oauth_code
43
+ api_key.update(access_token: SecureRandom.uuid, oauth_code: nil) if api_key
44
+ api_key
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,10 @@
1
+ module Skydrive
2
+ class LtiKey < ActiveRecord::Base
3
+ validates :key, presence: true, uniqueness: true
4
+ validates :secret, presence: true
5
+
6
+ def self.new_key
7
+ LtiKey.create(key: SecureRandom.uuid, secret: SecureRandom.hex)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ module Skydrive
2
+ class Token < ActiveRecord::Base
3
+ validates :user_id, uniqueness: true
4
+ belongs_to :user
5
+
6
+ def requires_refresh?
7
+ !!self.not_before && self.not_before < Time.now
8
+ end
9
+
10
+ def is_valid?
11
+ !!self.access_token && self.expires_on && self.expires_on > Time.now
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,28 @@
1
+ module Skydrive
2
+ class User < ActiveRecord::Base
3
+ include ActiveModel::ForbiddenAttributesProtection
4
+
5
+ has_many :api_keys
6
+ has_one :token
7
+
8
+ validates :email, presence: true, uniqueness: true
9
+ validates :username, presence: true, uniqueness: true
10
+ validates :name, presence: true
11
+
12
+ def session_api_key(params={})
13
+ ApiKey.create(
14
+ user_id: self.id,
15
+ scope: 'session',
16
+ init_params: params.to_json
17
+ )
18
+ end
19
+
20
+ def cleanup_api_keys
21
+ api_keys.inactive.each(&:destroy)
22
+ end
23
+
24
+ def valid_skydrive_token?
25
+ self.token && self.token.is_valid?
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,5 @@
1
+ module Skydrive
2
+ class ApiKeySerializer < ActiveModel::Serializer
3
+ attributes :id, :user_id, :access_token
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Skydrive
2
+ class UserSerializer < ActiveModel::Serializer
3
+ attributes :id, :name, :username, :email
4
+ end
5
+ end
@@ -0,0 +1,21 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>Sky Drive</title>
5
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8">
6
+ <%= stylesheet_link_tag "skydrive/stylesheets/font-awesome/font-awesome.min.css", media: "all" %>
7
+ <%= stylesheet_link_tag "skydrive/stylesheets/normalize.css", media: "all" %>
8
+ <%= stylesheet_link_tag "skydrive/stylesheets/app.css", media: "all" %>
9
+ <%= javascript_include_tag "skydrive/javascripts/vendor/jquery.js" %>
10
+ <%= javascript_include_tag "skydrive/javascripts/vendor/handlebars.js" %>
11
+ <%= javascript_include_tag "skydrive/javascripts/vendor/ember.js" %>
12
+ <%= csrf_meta_tags %>
13
+ </head>
14
+ <body>
15
+
16
+ <%#= yield %>
17
+ <script src="skydrive/javascripts/application.js"></script>
18
+
19
+ </body>
20
+ </html>
21
+
@@ -0,0 +1,20 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8">
5
+ <link rel="stylesheet" href="/assets/skydrive/font-awesome/font-awesome.min.css">
6
+ <link rel="stylesheet" href="/assets/skydrive/normalize.css">
7
+ <link rel="stylesheet" href="/assets/skydrive/app.css">
8
+ <script src="/assets/skydrive/vendor/jquery.js"></script>
9
+ <script src="/assets/skydrive/vendor/handlebars.js"></script>
10
+ <script src="/assets/skydrive/vendor/ember.js"></script>
11
+ <title>Sky Drive</title>
12
+ </head>
13
+ <body>
14
+ <script type="text/javascript" charset="utf-8">
15
+ window.ENV = <%= raw @env.to_json %>;
16
+ </script>
17
+ <script src="/assets/skydrive/application.js"></script>
18
+ </body>
19
+ </html>
20
+
@@ -0,0 +1 @@
1
+ SHAREPOINT = YAML.load(File.read("#{Rails.root}/config/sharepoint.yml"))[Rails.env].symbolize_keys
data/config/routes.rb ADDED
@@ -0,0 +1,24 @@
1
+ Skydrive::Engine.routes.draw do
2
+ root "ember#index"
3
+
4
+ get 'health_check' => 'ember#health_check'
5
+ get '/download/file' => 'files#download', as: :download
6
+
7
+ scope "api/v1" do
8
+ resources :users, except: [:new, :edit]
9
+ get 'files(/*uri)' => 'files#index'
10
+ get 'skydrive_authorized' => 'launch#skydrive_authorized'
11
+ end
12
+
13
+ post 'session' => 'session#create'
14
+
15
+ #LTI launch paths
16
+ get 'launch' => 'launch#basic_launch', :as => :launch
17
+ post 'launch' => 'launch#basic_launch'
18
+ get 'backdoor' => 'launch#backdoor_launch'
19
+ get 'microsoft_oauth' => 'launch#microsoft_oauth'
20
+
21
+ get 'config' => 'launch#xml_config'
22
+
23
+ post 'oauth2/token' => 'api_keys#oauth2_token'
24
+ end
@@ -0,0 +1,17 @@
1
+ defaults: &defaults
2
+ guid: 00000003-0000-0ff1-ce00-000000000000
3
+
4
+ development:
5
+ <<: *defaults
6
+ client_id: 00a878a3-fde7-47a3-9c89-3c9912e6bb83
7
+ client_secret: MO2cbtapMB22kKEKqNsTDTVUN0vwS1vNjqaCG+NejaI=
8
+
9
+ test:
10
+ <<: *defaults
11
+ client_id: 00a878a3-fde7-47a3-9c89-3c9912e6bb83
12
+ client_secret: MO2cbtapMB22kKEKqNsTDTVUN0vwS1vNjqaCG+NejaI=
13
+
14
+ production:
15
+ <<: *defaults
16
+ client_id: 00a878a3-fde7-47a3-9c89-3c9912e6bb83
17
+ client_secret: MO2cbtapMB22kKEKqNsTDTVUN0vwS1vNjqaCG+NejaI=
@@ -0,0 +1,11 @@
1
+ class CreateUsers < ActiveRecord::Migration
2
+ def change
3
+ create_table :users do |t|
4
+ t.string :name
5
+ t.string :username
6
+ t.string :email
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ class CreateApiKeys < ActiveRecord::Migration
2
+ def change
3
+ create_table :api_keys do |t|
4
+ t.integer :user_id
5
+ t.string :access_token
6
+ t.string :scope
7
+ t.string :oauth_code
8
+ t.datetime :expired_at
9
+ t.datetime :created_at
10
+ end
11
+ add_index :api_keys, :user_id
12
+ add_index :api_keys, :access_token
13
+ add_index :api_keys, :oauth_code
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ class AddSkydriveTokenStorage < ActiveRecord::Migration
2
+ def change
3
+ create_table :skydrive_tokens do |t|
4
+ t.integer :user_id
5
+ t.string :token_type
6
+ t.string :access_token
7
+ t.integer :expires_in
8
+ t.string :refresh_token
9
+ t.datetime :not_before
10
+ t.datetime :expires_on
11
+ t.string :resource
12
+ end
13
+ add_index :skydrive_tokens, :user_id
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ class AddClientDomainToSkydriveTokens < ActiveRecord::Migration
2
+ def change
3
+ add_column :skydrive_tokens, :client_domain, :string
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddPersonalUrlToSkydriveToken < ActiveRecord::Migration
2
+ def change
3
+ add_column :skydrive_tokens, :personal_url, :string
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddInitParamsToApiKey < ActiveRecord::Migration
2
+ def change
3
+ add_column :api_keys, :init_params, :text
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class CreateLtiKeys < ActiveRecord::Migration
2
+ def change
3
+ create_table :lti_keys do |t|
4
+ t.string :key
5
+ t.string :secret
6
+ end
7
+ add_index :lti_keys, :key
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ class ChangeSkydriveTokenLength < ActiveRecord::Migration
2
+ def change
3
+ change_column :skydrive_tokens, :access_token, :text
4
+ change_column :skydrive_tokens, :refresh_token, :text
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ class SkydriveNamespace < ActiveRecord::Migration
2
+ def self.up
3
+ rename_table :api_keys, :skydrive_api_keys
4
+ rename_table :lti_keys, :skydrive_lti_keys
5
+ rename_table :users, :skydrive_users
6
+ end
7
+
8
+ def self.down
9
+ rename_table :skydrive_api_keys, :api_keys
10
+ rename_table :skydrive_lti_keys, :lti_keys
11
+ rename_table :skydrive_users, :users
12
+ end
13
+ end