qalam_oauth_engine 3.0.3 → 3.0.7
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.
- checksums.yaml +4 -4
- data/app/controllers/canvas_oauth/canvas_controller.rb +10 -1
- data/app/models/canvas_oauth/authorization.rb +10 -1
- data/db/migrate/20121121005358_create_canvas_oauth_authorizations.rb +1 -0
- data/lib/canvas_oauth/canvas_api.rb +89 -57
- data/lib/canvas_oauth/canvas_api_extensions.rb +3 -2
- data/lib/canvas_oauth/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ce5f3ea19a895f5964a450249d587a9a9e847064071bb260f42f078d3a5ed58
|
4
|
+
data.tar.gz: d2621e2449cb88ec7dfcaea89219c4e825a981e4ed82eaaf2dd9af40beb554a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68a55695a6a6b196a6cb7cc3402d314b987473ed58a1b78dd538b35f80903b0035beff1dd00acb714c1a2f521348f9baf978f941584098c742e182f2be003a0b
|
7
|
+
data.tar.gz: df1b190fb6e62609f9867ca96c6365786137681c2c5bc3f0b14fef895308912fce6d1956d40385e1a06d233c7e2437fd0bf5ebf3f2c98372d2ec0ea9cc62743c
|
@@ -5,8 +5,9 @@ module CanvasOauth
|
|
5
5
|
def oauth
|
6
6
|
if verify_oauth2_state(params[:state]) && params[:code]
|
7
7
|
if token = canvas.get_access_token(params[:code])
|
8
|
+
set_root_account
|
8
9
|
refresh_token = canvas.refresh_token
|
9
|
-
if CanvasOauth::Authorization.cache_token(token, refresh_token, user_id, tool_consumer_instance_guid)
|
10
|
+
if CanvasOauth::Authorization.cache_token(token, refresh_token, user_id, @root_account_id, tool_consumer_instance_guid)
|
10
11
|
redirect_to main_app.root_path
|
11
12
|
else
|
12
13
|
render plain: "Error: unable to save token"
|
@@ -22,5 +23,13 @@ module CanvasOauth
|
|
22
23
|
def verify_oauth2_state(callback_state)
|
23
24
|
callback_state.present? && callback_state == session.delete(:oauth2_state)
|
24
25
|
end
|
26
|
+
|
27
|
+
def set_root_account
|
28
|
+
if session[:account_id]
|
29
|
+
@root_account_id = canvas.root_account_id(session[:account_id])
|
30
|
+
elsif session[:course_id]
|
31
|
+
@root_account_id = canvas.course_root_account_id(session[:course_id])
|
32
|
+
end
|
33
|
+
end
|
25
34
|
end
|
26
35
|
end
|
@@ -2,16 +2,25 @@ module CanvasOauth
|
|
2
2
|
class Authorization < ActiveRecord::Base
|
3
3
|
validates :canvas_user_id, :token, :refresh_token, :last_used_at, presence: true
|
4
4
|
|
5
|
-
def self.cache_token(token, refresh_token, user_id, tool_consumer_instance_guid)
|
5
|
+
def self.cache_token(token, refresh_token, user_id, account_id, tool_consumer_instance_guid)
|
6
6
|
create do |t|
|
7
7
|
t.token = token
|
8
8
|
t.refresh_token = refresh_token
|
9
9
|
t.canvas_user_id = user_id
|
10
|
+
t.canvas_root_account_id = account_id
|
10
11
|
t.tool_consumer_instance_guid = tool_consumer_instance_guid
|
11
12
|
t.last_used_at = Time.now
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
16
|
+
def self.fetch_account(user_id, tool_consumer_instance_guid)
|
17
|
+
user_accounts = where(canvas_user_id: user_id, tool_consumer_instance_guid: tool_consumer_instance_guid).order("created_at DESC")
|
18
|
+
if canvas_auth = user_accounts.first
|
19
|
+
canvas_auth.update_attribute(:last_used_at, Time.now)
|
20
|
+
return canvas_auth.canvas_root_account_id
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
15
24
|
def self.fetch_token(user_id, tool_consumer_instance_guid)
|
16
25
|
user_tokens = where(canvas_user_id: user_id, tool_consumer_instance_guid: tool_consumer_instance_guid).order("created_at DESC")
|
17
26
|
if canvas_auth = user_tokens.first
|
@@ -2,6 +2,7 @@ class CreateCanvasOauthAuthorizations < ActiveRecord::Migration[4.2]
|
|
2
2
|
def change
|
3
3
|
create_table "canvas_oauth_authorizations", :force => true do |t|
|
4
4
|
t.integer "canvas_user_id", :limit => 8
|
5
|
+
t.integer "canvas_root_account_id", :limit => 8
|
5
6
|
t.string "tool_consumer_instance_guid", :null => false
|
6
7
|
t.string "token"
|
7
8
|
t.string "refresh_token"
|
@@ -6,7 +6,7 @@ module CanvasOauth
|
|
6
6
|
attr_accessor :token, :refresh_token, :key, :secret
|
7
7
|
attr_reader :canvas_url, :canvas_user_id
|
8
8
|
|
9
|
-
def initialize(canvas_url, canvas_user_id, token, refresh_token, key, secret)
|
9
|
+
def initialize(canvas_url, canvas_user_id, canvas_root_account_id, token, refresh_token, key, secret)
|
10
10
|
unless [key, secret].all?(&:present?)
|
11
11
|
raise "Invalid Qalam oAuth configuration"
|
12
12
|
end
|
@@ -14,6 +14,7 @@ module CanvasOauth
|
|
14
14
|
self.refresh_token = refresh_token
|
15
15
|
self.canvas_url = canvas_url
|
16
16
|
self.canvas_user_id = canvas_user_id
|
17
|
+
self.canvas_root_account_id = canvas_root_account_id
|
17
18
|
self.token = token
|
18
19
|
self.key = key
|
19
20
|
self.secret = secret
|
@@ -103,18 +104,23 @@ module CanvasOauth
|
|
103
104
|
authenticated_request(:put, *params)
|
104
105
|
end
|
105
106
|
|
106
|
-
def paginated_get(url, params
|
107
|
+
def paginated_get(url, params={})
|
107
108
|
params[:query] ||= {}
|
108
|
-
params[:query][:per_page]
|
109
|
-
|
109
|
+
params[:query][:per_page] ||= PER_PAGE
|
110
|
+
params[:query][:page] ||= 1
|
110
111
|
all_pages = []
|
111
112
|
|
112
|
-
|
113
|
-
|
113
|
+
if params[:all_pages]
|
114
|
+
while url && current_page = authenticated_get(url, params) do
|
115
|
+
all_pages.concat(current_page) if valid_page?(current_page)
|
114
116
|
|
115
|
-
|
116
|
-
|
117
|
-
|
117
|
+
links = LinkHeader.parse(current_page.headers['link'])
|
118
|
+
url = links.find_link(["rel", "next"]).try(:href)
|
119
|
+
params[:query] = nil if params[:query]
|
120
|
+
end
|
121
|
+
else
|
122
|
+
current_page = authenticated_get(url, params)
|
123
|
+
all_pages.concat(current_page) if valid_page?(current_page)
|
118
124
|
end
|
119
125
|
|
120
126
|
all_pages
|
@@ -130,6 +136,10 @@ module CanvasOauth
|
|
130
136
|
def canvas_user_id=(value)
|
131
137
|
@canvas_user_id = value
|
132
138
|
end
|
139
|
+
|
140
|
+
def canvas_root_account_id=(value)
|
141
|
+
@canvas_root_account_id = value
|
142
|
+
end
|
133
143
|
|
134
144
|
def hex_sis_id(name, value)
|
135
145
|
hex = value.unpack("H*")[0]
|
@@ -190,7 +200,7 @@ module CanvasOauth
|
|
190
200
|
# root_account_id
|
191
201
|
# course_root_account_id
|
192
202
|
|
193
|
-
def get_report(account_id, report_type, params)
|
203
|
+
def get_report(account_id, report_type, params={})
|
194
204
|
report = authenticated_post("/api/v1/accounts/#{account_id}/reports/#{report_type}", { body: params })
|
195
205
|
report = authenticated_get "/api/v1/accounts/#{account_id}/reports/#{report_type}/#{report['id']}"
|
196
206
|
while (report['status'] == 'created' || report['status'] == 'running')
|
@@ -207,108 +217,108 @@ module CanvasOauth
|
|
207
217
|
end
|
208
218
|
end
|
209
219
|
|
210
|
-
def get_file(file_id)
|
220
|
+
def get_file(file_id, params={})
|
211
221
|
authenticated_get "/api/v1/files/#{file_id}"
|
212
222
|
end
|
213
223
|
|
214
|
-
def get_accounts_provisioning_report(account_id)
|
224
|
+
def get_accounts_provisioning_report(account_id, params={})
|
215
225
|
get_report(account_id, :provisioning_csv, 'parameters[accounts]' => true)
|
216
226
|
end
|
217
227
|
|
218
|
-
def get_courses
|
228
|
+
def get_courses(params={})
|
219
229
|
paginated_get "/api/v1/courses"
|
220
230
|
end
|
221
231
|
|
222
|
-
def get_account(account_id)
|
232
|
+
def get_account(account_id, params={})
|
223
233
|
authenticated_get "/api/v1/accounts/#{account_id}"
|
224
234
|
end
|
225
235
|
|
226
|
-
def get_account_sub_accounts(account_id)
|
236
|
+
def get_account_sub_accounts(account_id, params={})
|
227
237
|
paginated_get "/api/v1/accounts/#{account_id}/sub_accounts", { query: { :recursive => true } }
|
228
238
|
end
|
229
239
|
|
230
|
-
def get_account_courses(account_id)
|
240
|
+
def get_account_courses(account_id, params={})
|
231
241
|
paginated_get "/api/v1/accounts/#{account_id}/courses"
|
232
242
|
end
|
233
243
|
|
234
|
-
def get_account_users(account_id)
|
244
|
+
def get_account_users(account_id, params={})
|
235
245
|
paginated_get "/api/v1/accounts/#{account_id}/users"
|
236
246
|
end
|
237
247
|
|
238
|
-
def get_course(course_id)
|
248
|
+
def get_course(course_id, params={})
|
239
249
|
authenticated_get "/api/v1/courses/#{course_id}"
|
240
250
|
end
|
241
251
|
|
242
|
-
def get_section_enrollments(section_id)
|
252
|
+
def get_section_enrollments(section_id, params={})
|
243
253
|
paginated_get "/api/v1/sections/#{section_id}/enrollments"
|
244
254
|
end
|
245
255
|
|
246
|
-
def get_user_enrollments(user_id)
|
256
|
+
def get_user_enrollments(user_id, params={})
|
247
257
|
paginated_get "/api/v1/users/#{user_id}/enrollments"
|
248
258
|
end
|
249
259
|
|
250
|
-
def get_course_users(course_id)
|
260
|
+
def get_course_users(course_id, params={})
|
251
261
|
paginated_get "/api/v1/courses/#{course_id}/users"
|
252
262
|
end
|
253
263
|
|
254
|
-
def get_all_course_users(course_id)
|
264
|
+
def get_all_course_users(course_id, params={})
|
255
265
|
paginated_get "/api/v1/courses/#{course_id}/users", { query: {enrollment_state: ["active","invited","rejected","completed","inactive"] } }
|
256
266
|
end
|
257
267
|
|
258
|
-
def get_course_teachers_and_tas(course_id)
|
268
|
+
def get_course_teachers_and_tas(course_id, params={})
|
259
269
|
paginated_get "/api/v1/courses/#{course_id}/users", { query: { enrollment_type: ['teacher', 'ta'] } }
|
260
270
|
end
|
261
271
|
|
262
|
-
def get_course_students(course_id)
|
272
|
+
def get_course_students(course_id, params={})
|
263
273
|
paginated_get "/api/v1/courses/#{course_id}/students"
|
264
274
|
end
|
265
275
|
|
266
|
-
def get_course_active_students(course_id)
|
276
|
+
def get_course_active_students(course_id, params={})
|
267
277
|
paginated_get "/api/v1/courses/#{course_id}/active_users"
|
268
278
|
end
|
269
279
|
|
270
|
-
def get_section(section_id)
|
280
|
+
def get_section(section_id, params={})
|
271
281
|
authenticated_get "/api/v1/sections/#{section_id}"
|
272
282
|
end
|
273
283
|
|
274
|
-
def get_sections(course_id)
|
284
|
+
def get_sections(course_id, params={})
|
275
285
|
paginated_get "/api/v1/courses/#{course_id}/sections", { query: { :include => ['students', 'avatar_url', 'enrollments'] } }
|
276
286
|
end
|
277
287
|
|
278
|
-
def get_assignments(course_id)
|
288
|
+
def get_assignments(course_id, params={})
|
279
289
|
paginated_get "/api/v1/courses/#{course_id}/assignments"
|
280
290
|
end
|
281
291
|
|
282
|
-
def get_assignment(course_id, assignment_id)
|
292
|
+
def get_assignment(course_id, assignment_id, params={})
|
283
293
|
authenticated_get "/api/v1/courses/#{course_id}/assignments/#{assignment_id}"
|
284
294
|
end
|
285
295
|
|
286
|
-
def get_user_profile(user_id)
|
296
|
+
def get_user_profile(user_id, params={})
|
287
297
|
authenticated_get "/api/v1/users/#{user_id}/profile"
|
288
298
|
end
|
289
299
|
|
290
|
-
def create_assignment(course_id, params)
|
300
|
+
def create_assignment(course_id, params={})
|
291
301
|
authenticated_post "/api/v1/courses/#{course_id}/assignments", { body: { assignment: params } }
|
292
302
|
end
|
293
303
|
|
294
|
-
def update_assignment(course_id, assignment_id, params)
|
304
|
+
def update_assignment(course_id, assignment_id, params={})
|
295
305
|
authenticated_put "/api/v1/courses/#{course_id}/assignments/#{assignment_id}", { body: { assignment: params } }
|
296
306
|
end
|
297
307
|
|
298
|
-
def grade_assignment(course_id, assignment_id, user_id, params)
|
308
|
+
def grade_assignment(course_id, assignment_id, user_id, params={})
|
299
309
|
authenticated_put "/api/v1/courses/#{course_id}/assignments/#{assignment_id}/submissions/#{user_id}", { body: params }
|
300
310
|
end
|
301
311
|
|
302
|
-
def get_submission(course_id, assignment_id, user_id)
|
312
|
+
def get_submission(course_id, assignment_id, user_id, params={})
|
303
313
|
authenticated_get "/api/v1/courses/#{course_id}/assignments/#{assignment_id}/submissions/#{user_id}"
|
304
314
|
end
|
305
315
|
|
306
|
-
def course_account_id(course_id)
|
316
|
+
def course_account_id(course_id, params={})
|
307
317
|
course = get_course(course_id)
|
308
318
|
course['account_id'] if course
|
309
319
|
end
|
310
320
|
|
311
|
-
def root_account_id(account_id)
|
321
|
+
def root_account_id(account_id, params={})
|
312
322
|
if account_id && account = get_account(account_id)
|
313
323
|
root_id = account['root_account_id']
|
314
324
|
end
|
@@ -316,7 +326,7 @@ module CanvasOauth
|
|
316
326
|
root_id || account_id
|
317
327
|
end
|
318
328
|
|
319
|
-
def course_root_account_id(course_id)
|
329
|
+
def course_root_account_id(course_id, params={})
|
320
330
|
root_account_id(course_account_id(course_id))
|
321
331
|
end
|
322
332
|
### END CANVAS API ###
|
@@ -324,44 +334,66 @@ module CanvasOauth
|
|
324
334
|
### QALAM API ENDPOINTS ###
|
325
335
|
# get_canvas_user_profile
|
326
336
|
# get_course_active_pages
|
327
|
-
#
|
328
|
-
# account_external_tool_update
|
337
|
+
# update_external_tool_nav
|
329
338
|
# get_school_details
|
330
|
-
#
|
331
|
-
#
|
339
|
+
# get_school_grades
|
340
|
+
# get_school_class_rooms
|
341
|
+
# get_school_subjects
|
342
|
+
# get_students_by_grade
|
343
|
+
# get_students_by_class_room
|
332
344
|
|
333
|
-
def get_canvas_user_profile
|
345
|
+
def get_canvas_user_profile(params={})
|
334
346
|
authenticated_get "/api/v1/users/#{canvas_user_id}/profile"
|
335
347
|
end
|
336
348
|
|
337
|
-
def get_course_active_pages(course_id, publish=nil)
|
349
|
+
def get_course_active_pages(course_id, publish=nil, params={})
|
338
350
|
unless publish.nil?
|
339
|
-
paginated_get "/api/v1/courses/#{course_id}/pages?published=#{publish}&sort=created_at&order=desc"
|
351
|
+
paginated_get "/api/v1/courses/#{course_id}/pages?published=#{publish}&sort=created_at&order=desc", params
|
340
352
|
else
|
341
|
-
paginated_get "/api/v1/courses/#{course_id}/pages?sort=created_at&order=desc"
|
353
|
+
paginated_get "/api/v1/courses/#{course_id}/pages?sort=created_at&order=desc", params
|
342
354
|
end
|
343
355
|
end
|
344
356
|
|
345
|
-
def
|
346
|
-
|
347
|
-
|
357
|
+
def update_external_tool_nav(external_tool_url, tool_id, publish, type, account_id=@canvas_root_account_id, params={})
|
358
|
+
account_id ||= @canvas_root_account_id
|
359
|
+
if type == 'account'
|
360
|
+
body = {"account_navigation"=>{"enabled"=>"#{publish}"},
|
361
|
+
"tool_id"=>tool_id, "external_tool_url"=>external_tool_url}
|
362
|
+
elsif type == 'course'
|
363
|
+
body = {"course_navigation"=>{"enabled"=>"#{publish}"},
|
364
|
+
"tool_id"=>tool_id, "external_tool_url"=>external_tool_url}
|
365
|
+
end
|
366
|
+
authenticated_put "/api/v1/accounts/#{account_id}/external_tools_url", { body: body } if body
|
348
367
|
end
|
349
368
|
|
350
|
-
def
|
351
|
-
|
352
|
-
|
369
|
+
def get_school_details(account_id=@canvas_root_account_id, params={})
|
370
|
+
account_id ||= @canvas_root_account_id
|
371
|
+
authenticated_get "/api/v1/accounts/#{account_id}/school_details"
|
353
372
|
end
|
354
373
|
|
355
|
-
def
|
356
|
-
|
374
|
+
def get_school_grades(account_id=@canvas_root_account_id, params={})
|
375
|
+
account_id ||= @canvas_root_account_id
|
376
|
+
paginated_get "/api/v1/accounts/#{account_id}/school_grades", params
|
377
|
+
end
|
378
|
+
|
379
|
+
def get_school_subjects(account_id=@canvas_root_account_id, params={})
|
380
|
+
account_id ||= @canvas_root_account_id
|
381
|
+
paginated_get "/api/v1/accounts/#{account_id}/school_subjects", params
|
382
|
+
end
|
383
|
+
|
384
|
+
def get_school_class_rooms(account_id=@canvas_root_account_id, params={})
|
385
|
+
account_id ||= @canvas_root_account_id
|
386
|
+
paginated_get "/api/v1/accounts/#{account_id}/school_class_rooms", params
|
357
387
|
end
|
358
388
|
|
359
|
-
def
|
360
|
-
|
389
|
+
def get_students_by_grade(grade_id, account_id=@canvas_root_account_id, params={})
|
390
|
+
account_id ||= @canvas_root_account_id
|
391
|
+
paginated_get "/api/v1/accounts/#{account_id}/grade_students/#{grade_id}", params
|
361
392
|
end
|
362
393
|
|
363
|
-
def
|
364
|
-
|
394
|
+
def get_students_by_class_room(class_room_id, account_id=@canvas_root_account_id, params={})
|
395
|
+
account_id ||= @canvas_root_account_id
|
396
|
+
paginated_get "/api/v1/accounts/#{account_id}/class_room_students/#{class_room_id}", params
|
365
397
|
end
|
366
398
|
### END QALAM API ###
|
367
399
|
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
module CanvasOauth
|
2
2
|
class CanvasApiExtensions
|
3
3
|
def self.build(canvas_url, user_id, tool_consumer_instance_guid)
|
4
|
-
|
4
|
+
account_id = CanvasOauth::Authorization.fetch_account(user_id, tool_consumer_instance_guid)
|
5
5
|
token = CanvasOauth::Authorization.fetch_token(user_id, tool_consumer_instance_guid)
|
6
|
+
refresh_token = CanvasOauth::Authorization.fetch_refresh_token(user_id, tool_consumer_instance_guid)
|
6
7
|
canvas_key = ((CanvasLtiKey.table_exists? && CanvasLtiKey.find_by(canvas_url: canvas_url)&.key) or CanvasConfig.key)
|
7
8
|
canvas_secret = ((CanvasLtiKey.table_exists? && CanvasLtiKey.find_by(key: canvas_key, canvas_url: canvas_url)&.secret) or CanvasConfig.secret)
|
8
|
-
CanvasApi.new(canvas_url, user_id, token, refresh_token, canvas_key, canvas_secret)
|
9
|
+
CanvasApi.new(canvas_url, user_id, account_id, token, refresh_token, canvas_key, canvas_secret)
|
9
10
|
end
|
10
11
|
end
|
11
12
|
end
|
data/lib/canvas_oauth/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qalam_oauth_engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dave Donahue
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2021-08-
|
14
|
+
date: 2021-08-24 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: httparty
|