lti_skydrive 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +20 -0
- data/app/assets/fonts/skydrive/font/FontAwesome.otf +0 -0
- data/app/assets/fonts/skydrive/font/fontawesome-webfont.eot +0 -0
- data/app/assets/fonts/skydrive/font/fontawesome-webfont.svg +399 -0
- data/app/assets/fonts/skydrive/font/fontawesome-webfont.ttf +0 -0
- data/app/assets/fonts/skydrive/font/fontawesome-webfont.woff +0 -0
- data/app/assets/images/skydrive/banner.png +0 -0
- data/app/assets/images/skydrive/icon-file.png +0 -0
- data/app/assets/images/skydrive/icon-folder-back.png +0 -0
- data/app/assets/images/skydrive/icon-folder.png +0 -0
- data/app/assets/images/skydrive/icon-jpg.png +0 -0
- data/app/assets/images/skydrive/icon-pdf.png +0 -0
- data/app/assets/images/skydrive/icon-png.png +0 -0
- data/app/assets/images/skydrive/icon-word.png +0 -0
- data/app/assets/images/skydrive/logo.png +0 -0
- data/app/assets/images/skydrive/office_365.jpg +0 -0
- data/app/assets/images/skydrive/skydrive_icon.png +0 -0
- data/app/assets/javascripts/skydrive/application.js +16 -0
- data/app/assets/javascripts/skydrive/vendor/ember.js +23 -0
- data/app/assets/javascripts/skydrive/vendor/handlebars.js +362 -0
- data/app/assets/javascripts/skydrive/vendor/jquery.js +9597 -0
- data/app/assets/stylesheets/skydrive/app.css +5617 -0
- data/app/assets/stylesheets/skydrive/font-awesome/font-awesome.min.css +403 -0
- data/app/assets/stylesheets/skydrive/normalize.css +405 -0
- data/app/assets/stylesheets/skydrive/style.css +27 -0
- data/app/controllers/skydrive/api_keys_controller.rb +13 -0
- data/app/controllers/skydrive/application_controller.rb +40 -0
- data/app/controllers/skydrive/ember_controller.rb +23 -0
- data/app/controllers/skydrive/files_controller.rb +62 -0
- data/app/controllers/skydrive/launch_controller.rb +152 -0
- data/app/controllers/skydrive/session_controller.rb +12 -0
- data/app/controllers/skydrive/users_controller.rb +34 -0
- data/app/helpers/skydrive/application_helper.rb +4 -0
- data/app/helpers/skydrive/ember_helper.rb +4 -0
- data/app/models/skydrive/api_key.rb +47 -0
- data/app/models/skydrive/lti_key.rb +10 -0
- data/app/models/skydrive/token.rb +14 -0
- data/app/models/skydrive/user.rb +28 -0
- data/app/serializers/api_key_serializer.rb +5 -0
- data/app/serializers/user_serializer.rb +5 -0
- data/app/views/layouts/skydrive/application.html.erb +21 -0
- data/app/views/skydrive/ember/index.html.erb +20 -0
- data/config/initializers/sharepoint.rb +1 -0
- data/config/routes.rb +24 -0
- data/config/sharepoint.yml.example +17 -0
- data/db/migrate/20130710195807_create_users.rb +11 -0
- data/db/migrate/20130710195819_create_api_keys.rb +15 -0
- data/db/migrate/20130722173006_add_skydrive_token_storage.rb +15 -0
- data/db/migrate/20130725183724_add_client_domain_to_skydrive_tokens.rb +5 -0
- data/db/migrate/20130726170108_add_personal_url_to_skydrive_token.rb +5 -0
- data/db/migrate/20130730164700_add_init_params_to_api_key.rb +5 -0
- data/db/migrate/20130801181008_create_lti_keys.rb +9 -0
- data/db/migrate/20130802231147_change_skydrive_token_length.rb +6 -0
- data/db/migrate/20140103221052_skydrive_namespace.rb +13 -0
- data/lib/skydrive/client.rb +161 -0
- data/lib/skydrive/engine.rb +16 -0
- data/lib/skydrive/file.rb +49 -0
- data/lib/skydrive/folder.rb +13 -0
- data/lib/skydrive/version.rb +3 -0
- data/lib/skydrive.rb +4 -0
- data/lib/skydrive_proxy.rb +33 -0
- data/lib/tasks/ember.rake +48 -0
- data/lib/tasks/lti_key.rake +8 -0
- data/test/controllers/skydrive/ember_controller_test.rb +11 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/config/application.rb +25 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +29 -0
- data/test/dummy/config/environments/production.rb +80 -0
- data/test/dummy/config/environments/test.rb +36 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +12 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +3 -0
- data/test/dummy/config/sharepoint.yml +15 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/schema.rb +60 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +6484 -0
- data/test/dummy/log/test.log +2958 -0
- data/test/dummy/public/404.html +58 -0
- data/test/dummy/public/422.html +58 -0
- data/test/dummy/public/500.html +57 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/00546f7f6da41f471084ed2589ca4442 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/049dac97744466d4435aa8de57cc6099 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/0c92f67702b0dbd50edf7e6be63359ca +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/0d26053221de21901f734bd6ba75bb28 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/0e383306a92ebd12d003a9e49ef6d508 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/16fa9bed5ef4abda841d3ef00e727580 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/17588b92c903e02837946f638eca86db +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/21900b90dba7acf710178f3cd9dad43b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/25efc08f115a66b9c241a48e80a207ca +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3064fc29e24c9e97f7aad24f7e899cf6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/311d9a5a43eb3fee9bba76971680620f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/35a147c1af5b608250e82ccb2f569d4b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3dd0eb5a85d766c8d9fe5b29014edee4 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/63616bfc6c3f0267d5951cbbc83308cd +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/65aa42ce50eac6f72e31861670f94518 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/66a8e9d3d86505dece06e6dd0edd18e1 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/78c4cbc0498be843f50ebdd02e2ead2f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7caeca69c3c375c50a3c8cad8584be79 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7d2b5e5332f464f65bf745d12ed9cbaa +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7e229ef6d57ba0e9f562cc129a3e4dfc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/87149d8992d83d7a95023dbfa4b53907 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/8bf6a6b96f5c827206f1fd42babe6c5e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/8c2066f7cc911ab8803cab8fea4e8bd6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/9157ff048f219d7abc8b0f0fda771c92 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a17c28776c4a2887f0fff4893854ef1d +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a29fed21bbc3985a31325c84a77e5f26 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a3119da5b51c1a0a3c5cb7414ec920f5 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a674526f54bc8458ebe36912ef85f003 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/aa904c0cc06f37bb0df493db59f18d70 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/adfa454123f4741a4b3919023b570d82 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/af6eedeceb4b732776dca83f456b2b93 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b40cb2ddb88705f771e77d872feacf6a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/bf64c92410e28e00afb6139c5d4c61b9 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/dc6268ee4fa18069ce7c21888ea1932e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/df9900b8557146382d16cc592306b17f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e3caec07cb46343e49b4f060e2d3392a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e6ebfb0e93a47d0164d0fc4637054c38 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ecb48e7374f399434aedbf30716e489a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/eeb495bc326785d2a6a14cf6d97024e4 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ef91e47e51f204a8373f160f13a05a30 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f48290aae486ea863a9f456ba96443e9 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/fa078ac6abaaee94445294c5a7c6d793 +0 -0
- data/test/helpers/skydrive/ember_helper_test.rb +6 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/skydrive_test.rb +7 -0
- data/test/test_helper.rb +15 -0
- 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,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,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,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,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,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
|