lti_skydrive 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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