scimaenaga 0.7.0 → 0.9.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.
- checksums.yaml +4 -4
- data/README.md +22 -7
- data/Rakefile +6 -8
- data/app/controllers/concerns/{scim_rails → scimaenaga}/exception_handler.rb +47 -37
- data/app/controllers/concerns/scimaenaga/response.rb +94 -0
- data/app/controllers/scimaenaga/application_controller.rb +72 -0
- data/app/controllers/{scim_rails → scimaenaga}/scim_groups_controller.rb +26 -26
- data/app/controllers/scimaenaga/scim_schemas_controller.rb +42 -0
- data/app/controllers/scimaenaga/scim_users_controller.rb +104 -0
- data/app/helpers/{scim_rails → scimaenaga}/application_helper.rb +1 -1
- data/app/libraries/scim_patch.rb +16 -9
- data/app/libraries/scim_patch_operation.rb +51 -141
- data/app/libraries/scim_patch_operation_converter.rb +90 -0
- data/app/libraries/scim_patch_operation_group.rb +100 -0
- data/app/libraries/scim_patch_operation_user.rb +53 -0
- data/app/models/{scim_rails → scimaenaga}/application_record.rb +1 -1
- data/app/models/scimaenaga/authorize_api_request.rb +39 -0
- data/app/models/{scim_rails → scimaenaga}/scim_count.rb +8 -4
- data/app/models/scimaenaga/scim_query_parser.rb +49 -0
- data/config/routes.rb +15 -13
- data/lib/generators/scimaenaga/USAGE +8 -0
- data/lib/generators/scimaenaga/scimaenaga_generator.rb +7 -0
- data/lib/generators/{scim_rails → scimaenaga}/templates/initializer.rb +128 -22
- data/lib/{scim_rails → scimaenaga}/config.rb +9 -7
- data/lib/scimaenaga/encoder.rb +27 -0
- data/lib/scimaenaga/engine.rb +12 -0
- data/lib/scimaenaga/version.rb +5 -0
- data/lib/scimaenaga.rb +6 -0
- data/lib/tasks/{scim_rails_tasks.rake → scimaenaga_tasks.rake} +1 -1
- data/spec/controllers/{scim_rails → scimaenaga}/scim_groups_controller_spec.rb +8 -8
- data/spec/controllers/{scim_rails → scimaenaga}/scim_groups_request_spec.rb +18 -18
- data/spec/controllers/scimaenaga/scim_schemas_controller_spec.rb +238 -0
- data/spec/controllers/scimaenaga/scim_schemas_request_spec.rb +39 -0
- data/spec/controllers/{scim_rails → scimaenaga}/scim_users_controller_spec.rb +14 -15
- data/spec/controllers/{scim_rails → scimaenaga}/scim_users_request_spec.rb +20 -20
- data/spec/dummy/app/assets/config/manifest.js +1 -1
- data/spec/dummy/config/application.rb +1 -2
- data/spec/dummy/config/initializers/{scim_rails_config.rb → scimaenaga_config.rb} +25 -25
- data/spec/dummy/config/routes.rb +1 -1
- data/spec/factories/company.rb +3 -3
- data/spec/lib/scimaenaga/encoder_spec.rb +64 -0
- data/spec/libraries/scim_patch_operation_group_spec.rb +165 -0
- data/spec/libraries/scim_patch_operation_user_spec.rb +101 -0
- data/spec/libraries/scim_patch_spec.rb +129 -45
- data/spec/models/scim_query_parser_spec.rb +5 -6
- metadata +107 -108
- data/app/controllers/concerns/scim_rails/response.rb +0 -94
- data/app/controllers/scim_rails/application_controller.rb +0 -72
- data/app/controllers/scim_rails/scim_users_controller.rb +0 -107
- data/app/models/scim_rails/authorize_api_request.rb +0 -40
- data/app/models/scim_rails/scim_query_parser.rb +0 -49
- data/lib/generators/scim_rails/USAGE +0 -8
- data/lib/generators/scim_rails/scim_rails_generator.rb +0 -7
- data/lib/scim_rails/encoder.rb +0 -25
- data/lib/scim_rails/engine.rb +0 -12
- data/lib/scim_rails/version.rb +0 -5
- data/lib/scim_rails.rb +0 -6
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +0 -0
- data/spec/dummy/log/test.log +0 -5770
- data/spec/dummy/put_group.http +0 -5
- data/spec/dummy/tmp/restart.txt +0 -0
- data/spec/lib/scim_rails/encoder_spec.rb +0 -62
- data/spec/libraries/scim_patch_operation_spec.rb +0 -116
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scimaenaga
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Studist Corporation
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-02-
|
11
|
+
date: 2022-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -135,7 +135,7 @@ dependencies:
|
|
135
135
|
- !ruby/object:Gem::Version
|
136
136
|
version: '1.5'
|
137
137
|
description: SCIM Adapter for Rails.
|
138
|
-
email:
|
138
|
+
email:
|
139
139
|
executables: []
|
140
140
|
extensions: []
|
141
141
|
extra_rdoc_files: []
|
@@ -143,33 +143,39 @@ files:
|
|
143
143
|
- MIT-LICENSE
|
144
144
|
- README.md
|
145
145
|
- Rakefile
|
146
|
-
- app/controllers/concerns/
|
147
|
-
- app/controllers/concerns/
|
148
|
-
- app/controllers/
|
149
|
-
- app/controllers/
|
150
|
-
- app/controllers/
|
151
|
-
- app/
|
146
|
+
- app/controllers/concerns/scimaenaga/exception_handler.rb
|
147
|
+
- app/controllers/concerns/scimaenaga/response.rb
|
148
|
+
- app/controllers/scimaenaga/application_controller.rb
|
149
|
+
- app/controllers/scimaenaga/scim_groups_controller.rb
|
150
|
+
- app/controllers/scimaenaga/scim_schemas_controller.rb
|
151
|
+
- app/controllers/scimaenaga/scim_users_controller.rb
|
152
|
+
- app/helpers/scimaenaga/application_helper.rb
|
152
153
|
- app/libraries/scim_patch.rb
|
153
154
|
- app/libraries/scim_patch_operation.rb
|
154
|
-
- app/
|
155
|
-
- app/
|
156
|
-
- app/
|
157
|
-
- app/models/
|
155
|
+
- app/libraries/scim_patch_operation_converter.rb
|
156
|
+
- app/libraries/scim_patch_operation_group.rb
|
157
|
+
- app/libraries/scim_patch_operation_user.rb
|
158
|
+
- app/models/scimaenaga/application_record.rb
|
159
|
+
- app/models/scimaenaga/authorize_api_request.rb
|
160
|
+
- app/models/scimaenaga/scim_count.rb
|
161
|
+
- app/models/scimaenaga/scim_query_parser.rb
|
158
162
|
- config/initializers/mime_types.rb
|
159
163
|
- config/routes.rb
|
160
|
-
- lib/generators/
|
161
|
-
- lib/generators/
|
162
|
-
- lib/generators/
|
163
|
-
- lib/
|
164
|
-
- lib/
|
165
|
-
- lib/
|
166
|
-
- lib/
|
167
|
-
- lib/
|
168
|
-
- lib/tasks/
|
169
|
-
- spec/controllers/
|
170
|
-
- spec/controllers/
|
171
|
-
- spec/controllers/
|
172
|
-
- spec/controllers/
|
164
|
+
- lib/generators/scimaenaga/USAGE
|
165
|
+
- lib/generators/scimaenaga/scimaenaga_generator.rb
|
166
|
+
- lib/generators/scimaenaga/templates/initializer.rb
|
167
|
+
- lib/scimaenaga.rb
|
168
|
+
- lib/scimaenaga/config.rb
|
169
|
+
- lib/scimaenaga/encoder.rb
|
170
|
+
- lib/scimaenaga/engine.rb
|
171
|
+
- lib/scimaenaga/version.rb
|
172
|
+
- lib/tasks/scimaenaga_tasks.rake
|
173
|
+
- spec/controllers/scimaenaga/scim_groups_controller_spec.rb
|
174
|
+
- spec/controllers/scimaenaga/scim_groups_request_spec.rb
|
175
|
+
- spec/controllers/scimaenaga/scim_schemas_controller_spec.rb
|
176
|
+
- spec/controllers/scimaenaga/scim_schemas_request_spec.rb
|
177
|
+
- spec/controllers/scimaenaga/scim_users_controller_spec.rb
|
178
|
+
- spec/controllers/scimaenaga/scim_users_request_spec.rb
|
173
179
|
- spec/dummy/Rakefile
|
174
180
|
- spec/dummy/app/assets/config/manifest.js
|
175
181
|
- spec/dummy/app/assets/javascripts/application.js
|
@@ -211,7 +217,7 @@ files:
|
|
211
217
|
- spec/dummy/config/initializers/inflections.rb
|
212
218
|
- spec/dummy/config/initializers/mime_types.rb
|
213
219
|
- spec/dummy/config/initializers/new_framework_defaults.rb
|
214
|
-
- spec/dummy/config/initializers/
|
220
|
+
- spec/dummy/config/initializers/scimaenaga_config.rb
|
215
221
|
- spec/dummy/config/initializers/session_store.rb
|
216
222
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
217
223
|
- spec/dummy/config/locales/en.yml
|
@@ -219,7 +225,6 @@ files:
|
|
219
225
|
- spec/dummy/config/routes.rb
|
220
226
|
- spec/dummy/config/secrets.yml
|
221
227
|
- spec/dummy/config/spring.rb
|
222
|
-
- spec/dummy/db/development.sqlite3
|
223
228
|
- spec/dummy/db/migrate/20181206184304_create_users.rb
|
224
229
|
- spec/dummy/db/migrate/20181206184313_create_companies.rb
|
225
230
|
- spec/dummy/db/migrate/20210423075859_create_groups.rb
|
@@ -228,22 +233,18 @@ files:
|
|
228
233
|
- spec/dummy/db/migrate/20220131090107_add_deletable_to_users.rb
|
229
234
|
- spec/dummy/db/schema.rb
|
230
235
|
- spec/dummy/db/seeds.rb
|
231
|
-
- spec/dummy/db/test.sqlite3
|
232
|
-
- spec/dummy/log/development.log
|
233
|
-
- spec/dummy/log/test.log
|
234
236
|
- spec/dummy/public/404.html
|
235
237
|
- spec/dummy/public/422.html
|
236
238
|
- spec/dummy/public/500.html
|
237
239
|
- spec/dummy/public/apple-touch-icon-precomposed.png
|
238
240
|
- spec/dummy/public/apple-touch-icon.png
|
239
241
|
- spec/dummy/public/favicon.ico
|
240
|
-
- spec/dummy/put_group.http
|
241
|
-
- spec/dummy/tmp/restart.txt
|
242
242
|
- spec/factories/company.rb
|
243
243
|
- spec/factories/group.rb
|
244
244
|
- spec/factories/user.rb
|
245
|
-
- spec/lib/
|
246
|
-
- spec/libraries/
|
245
|
+
- spec/lib/scimaenaga/encoder_spec.rb
|
246
|
+
- spec/libraries/scim_patch_operation_group_spec.rb
|
247
|
+
- spec/libraries/scim_patch_operation_user_spec.rb
|
247
248
|
- spec/libraries/scim_patch_spec.rb
|
248
249
|
- spec/models/scim_query_parser_spec.rb
|
249
250
|
- spec/spec_helper.rb
|
@@ -252,8 +253,9 @@ files:
|
|
252
253
|
homepage: https://github.com/StudistCorporation/scimaenaga
|
253
254
|
licenses:
|
254
255
|
- MIT
|
255
|
-
metadata:
|
256
|
-
|
256
|
+
metadata:
|
257
|
+
rubygems_mfa_required: 'true'
|
258
|
+
post_install_message:
|
257
259
|
rdoc_options: []
|
258
260
|
require_paths:
|
259
261
|
- lib
|
@@ -272,90 +274,87 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
272
274
|
version: '0'
|
273
275
|
requirements: []
|
274
276
|
rubygems_version: 3.0.3
|
275
|
-
signing_key:
|
277
|
+
signing_key:
|
276
278
|
specification_version: 4
|
277
279
|
summary: SCIM Adapter for Rails.
|
278
280
|
test_files:
|
279
|
-
- spec/
|
280
|
-
- spec/dummy/
|
281
|
-
- spec/dummy/
|
282
|
-
- spec/dummy/
|
283
|
-
- spec/dummy/
|
284
|
-
- spec/dummy/
|
285
|
-
- spec/dummy/
|
286
|
-
- spec/dummy/
|
287
|
-
- spec/dummy/
|
288
|
-
- spec/dummy/app/views/layouts/application.html.erb
|
289
|
-
- spec/dummy/app/views/layouts/mailer.html.erb
|
290
|
-
- spec/dummy/app/views/layouts/mailer.text.erb
|
291
|
-
- spec/dummy/app/assets/config/manifest.js
|
292
|
-
- spec/dummy/app/assets/javascripts/cable.js
|
293
|
-
- spec/dummy/app/assets/javascripts/application.js
|
294
|
-
- spec/dummy/app/assets/stylesheets/application.css
|
295
|
-
- spec/dummy/app/helpers/application_helper.rb
|
296
|
-
- spec/dummy/app/channels/application_cable/connection.rb
|
297
|
-
- spec/dummy/app/channels/application_cable/channel.rb
|
298
|
-
- spec/dummy/bin/update
|
299
|
-
- spec/dummy/bin/rake
|
300
|
-
- spec/dummy/bin/setup
|
301
|
-
- spec/dummy/bin/bundle
|
302
|
-
- spec/dummy/bin/rails
|
303
|
-
- spec/dummy/config/secrets.yml
|
304
|
-
- spec/dummy/config/routes.rb
|
305
|
-
- spec/dummy/config/locales/en.yml
|
306
|
-
- spec/dummy/config/cable.yml
|
307
|
-
- spec/dummy/config/environments/production.rb
|
308
|
-
- spec/dummy/config/environments/development.rb
|
309
|
-
- spec/dummy/config/environments/test.rb
|
281
|
+
- spec/dummy/config.ru
|
282
|
+
- spec/dummy/db/migrate/20181206184313_create_companies.rb
|
283
|
+
- spec/dummy/db/migrate/20181206184304_create_users.rb
|
284
|
+
- spec/dummy/db/migrate/20210423075950_create_group_users.rb
|
285
|
+
- spec/dummy/db/migrate/20210423075859_create_groups.rb
|
286
|
+
- spec/dummy/db/migrate/20220131090107_add_deletable_to_users.rb
|
287
|
+
- spec/dummy/db/migrate/20220117095407_add_country_to_users.rb
|
288
|
+
- spec/dummy/db/schema.rb
|
289
|
+
- spec/dummy/db/seeds.rb
|
310
290
|
- spec/dummy/config/spring.rb
|
311
291
|
- spec/dummy/config/environment.rb
|
312
|
-
- spec/dummy/config/
|
313
|
-
- spec/dummy/config/
|
292
|
+
- spec/dummy/config/routes.rb
|
293
|
+
- spec/dummy/config/cable.yml
|
314
294
|
- spec/dummy/config/database.yml
|
315
|
-
- spec/dummy/config/
|
316
|
-
- spec/dummy/config/
|
317
|
-
- spec/dummy/config/initializers/backtrace_silencers.rb
|
295
|
+
- spec/dummy/config/secrets.yml
|
296
|
+
- spec/dummy/config/application.rb
|
318
297
|
- spec/dummy/config/initializers/mime_types.rb
|
319
|
-
- spec/dummy/config/initializers/
|
320
|
-
- spec/dummy/config/initializers/session_store.rb
|
298
|
+
- spec/dummy/config/initializers/backtrace_silencers.rb
|
321
299
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
322
|
-
- spec/dummy/config/initializers/new_framework_defaults.rb
|
323
300
|
- spec/dummy/config/initializers/assets.rb
|
324
|
-
- spec/dummy/config/initializers/cookies_serializer.rb
|
325
|
-
- spec/dummy/config/initializers/scim_rails_config.rb
|
326
301
|
- spec/dummy/config/initializers/inflections.rb
|
327
|
-
- spec/dummy/config.
|
328
|
-
- spec/dummy/
|
302
|
+
- spec/dummy/config/initializers/new_framework_defaults.rb
|
303
|
+
- spec/dummy/config/initializers/filter_parameter_logging.rb
|
304
|
+
- spec/dummy/config/initializers/session_store.rb
|
305
|
+
- spec/dummy/config/initializers/scimaenaga_config.rb
|
306
|
+
- spec/dummy/config/initializers/cookies_serializer.rb
|
307
|
+
- spec/dummy/config/initializers/application_controller_renderer.rb
|
308
|
+
- spec/dummy/config/boot.rb
|
309
|
+
- spec/dummy/config/puma.rb
|
310
|
+
- spec/dummy/config/environments/test.rb
|
311
|
+
- spec/dummy/config/environments/production.rb
|
312
|
+
- spec/dummy/config/environments/development.rb
|
313
|
+
- spec/dummy/config/locales/en.yml
|
314
|
+
- spec/dummy/app/views/layouts/mailer.html.erb
|
315
|
+
- spec/dummy/app/views/layouts/mailer.text.erb
|
316
|
+
- spec/dummy/app/views/layouts/application.html.erb
|
317
|
+
- spec/dummy/app/channels/application_cable/channel.rb
|
318
|
+
- spec/dummy/app/channels/application_cable/connection.rb
|
319
|
+
- spec/dummy/app/jobs/application_job.rb
|
320
|
+
- spec/dummy/app/assets/config/manifest.js
|
321
|
+
- spec/dummy/app/assets/javascripts/application.js
|
322
|
+
- spec/dummy/app/assets/javascripts/cable.js
|
323
|
+
- spec/dummy/app/assets/stylesheets/application.css
|
324
|
+
- spec/dummy/app/helpers/application_helper.rb
|
325
|
+
- spec/dummy/app/controllers/application_controller.rb
|
326
|
+
- spec/dummy/app/models/user.rb
|
327
|
+
- spec/dummy/app/models/group.rb
|
328
|
+
- spec/dummy/app/models/application_record.rb
|
329
|
+
- spec/dummy/app/models/group_user.rb
|
330
|
+
- spec/dummy/app/models/company.rb
|
331
|
+
- spec/dummy/app/mailers/application_mailer.rb
|
329
332
|
- spec/dummy/Rakefile
|
330
|
-
- spec/dummy/
|
331
|
-
- spec/dummy/
|
332
|
-
- spec/dummy/
|
333
|
+
- spec/dummy/bin/setup
|
334
|
+
- spec/dummy/bin/rails
|
335
|
+
- spec/dummy/bin/bundle
|
336
|
+
- spec/dummy/bin/rake
|
337
|
+
- spec/dummy/bin/update
|
333
338
|
- spec/dummy/public/500.html
|
334
|
-
- spec/dummy/public/404.html
|
335
339
|
- spec/dummy/public/apple-touch-icon-precomposed.png
|
336
|
-
- spec/dummy/
|
337
|
-
- spec/dummy/
|
338
|
-
- spec/dummy/
|
339
|
-
- spec/dummy/
|
340
|
-
- spec/dummy/db/migrate/20220131090107_add_deletable_to_users.rb
|
341
|
-
- spec/dummy/db/migrate/20181206184304_create_users.rb
|
342
|
-
- spec/dummy/db/migrate/20210423075950_create_group_users.rb
|
343
|
-
- spec/dummy/db/migrate/20181206184313_create_companies.rb
|
344
|
-
- spec/dummy/db/migrate/20210423075859_create_groups.rb
|
345
|
-
- spec/dummy/db/development.sqlite3
|
346
|
-
- spec/dummy/log/test.log
|
347
|
-
- spec/dummy/log/development.log
|
348
|
-
- spec/dummy/tmp/restart.txt
|
349
|
-
- spec/libraries/scim_patch_operation_spec.rb
|
350
|
-
- spec/libraries/scim_patch_spec.rb
|
351
|
-
- spec/models/scim_query_parser_spec.rb
|
340
|
+
- spec/dummy/public/favicon.ico
|
341
|
+
- spec/dummy/public/404.html
|
342
|
+
- spec/dummy/public/apple-touch-icon.png
|
343
|
+
- spec/dummy/public/422.html
|
352
344
|
- spec/support/factory_bot.rb
|
353
345
|
- spec/support/auth_helper.rb
|
346
|
+
- spec/lib/scimaenaga/encoder_spec.rb
|
347
|
+
- spec/controllers/scimaenaga/scim_users_controller_spec.rb
|
348
|
+
- spec/controllers/scimaenaga/scim_schemas_request_spec.rb
|
349
|
+
- spec/controllers/scimaenaga/scim_users_request_spec.rb
|
350
|
+
- spec/controllers/scimaenaga/scim_schemas_controller_spec.rb
|
351
|
+
- spec/controllers/scimaenaga/scim_groups_request_spec.rb
|
352
|
+
- spec/controllers/scimaenaga/scim_groups_controller_spec.rb
|
353
|
+
- spec/libraries/scim_patch_operation_user_spec.rb
|
354
|
+
- spec/libraries/scim_patch_spec.rb
|
355
|
+
- spec/libraries/scim_patch_operation_group_spec.rb
|
356
|
+
- spec/factories/user.rb
|
354
357
|
- spec/factories/group.rb
|
355
358
|
- spec/factories/company.rb
|
356
|
-
- spec/
|
357
|
-
- spec/
|
358
|
-
- spec/controllers/scim_rails/scim_users_request_spec.rb
|
359
|
-
- spec/controllers/scim_rails/scim_users_controller_spec.rb
|
360
|
-
- spec/controllers/scim_rails/scim_groups_controller_spec.rb
|
361
|
-
- spec/controllers/scim_rails/scim_groups_request_spec.rb
|
359
|
+
- spec/spec_helper.rb
|
360
|
+
- spec/models/scim_query_parser_spec.rb
|
@@ -1,94 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ScimRails
|
4
|
-
module Response
|
5
|
-
CONTENT_TYPE = "application/scim+json"
|
6
|
-
|
7
|
-
def json_response(object, status = :ok)
|
8
|
-
render \
|
9
|
-
json: object,
|
10
|
-
status: status,
|
11
|
-
content_type: CONTENT_TYPE
|
12
|
-
end
|
13
|
-
|
14
|
-
def json_scim_response(object:, status: :ok, counts: nil)
|
15
|
-
case params[:action]
|
16
|
-
when "index"
|
17
|
-
render \
|
18
|
-
json: list_response(object, counts),
|
19
|
-
status: status,
|
20
|
-
content_type: CONTENT_TYPE
|
21
|
-
when "show", "create", "put_update", "patch_update"
|
22
|
-
render \
|
23
|
-
json: object_response(object),
|
24
|
-
status: status,
|
25
|
-
content_type: CONTENT_TYPE
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def list_response(object, counts)
|
32
|
-
object = object
|
33
|
-
.order(:id)
|
34
|
-
.offset(counts.offset)
|
35
|
-
.limit(counts.limit)
|
36
|
-
{
|
37
|
-
schemas: [
|
38
|
-
"urn:ietf:params:scim:api:messages:2.0:ListResponse"
|
39
|
-
],
|
40
|
-
totalResults: counts.total,
|
41
|
-
startIndex: counts.start_index,
|
42
|
-
itemsPerPage: counts.limit,
|
43
|
-
Resources: list_objects(object)
|
44
|
-
}
|
45
|
-
end
|
46
|
-
|
47
|
-
def list_objects(objects)
|
48
|
-
objects.map do |object|
|
49
|
-
object_response(object)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def object_response(object)
|
54
|
-
schema = case object
|
55
|
-
when ScimRails.config.scim_users_model
|
56
|
-
ScimRails.config.user_schema
|
57
|
-
when ScimRails.config.scim_groups_model
|
58
|
-
ScimRails.config.group_schema
|
59
|
-
else
|
60
|
-
raise ScimRails::ExceptionHandler::InvalidQuery,
|
61
|
-
"Unknown model: #{object}"
|
62
|
-
end
|
63
|
-
find_value(object, schema)
|
64
|
-
end
|
65
|
-
|
66
|
-
# `find_value` is a recursive method that takes a "user" and a
|
67
|
-
# "user schema" and replaces any symbols in the schema with the
|
68
|
-
# corresponding value from the user. Given a schema with symbols,
|
69
|
-
# `find_value` will search through the object for the symbols,
|
70
|
-
# send those symbols to the model, and replace the symbol with
|
71
|
-
# the return value.
|
72
|
-
|
73
|
-
def find_value(object, schema)
|
74
|
-
case schema
|
75
|
-
when Hash
|
76
|
-
schema.each.with_object({}) do |(key, value), hash|
|
77
|
-
hash[key] = find_value(object, value)
|
78
|
-
end
|
79
|
-
when Array, ActiveRecord::Associations::CollectionProxy
|
80
|
-
schema.map do |value|
|
81
|
-
find_value(object, value)
|
82
|
-
end
|
83
|
-
when ScimRails.config.scim_users_model
|
84
|
-
find_value(schema, ScimRails.config.user_abbreviated_schema)
|
85
|
-
when ScimRails.config.scim_groups_model
|
86
|
-
find_value(schema, ScimRails.config.group_abbreviated_schema)
|
87
|
-
when Symbol
|
88
|
-
find_value(object, object.public_send(schema))
|
89
|
-
else
|
90
|
-
schema
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ScimRails
|
4
|
-
class ApplicationController < ActionController::API
|
5
|
-
include ActionController::HttpAuthentication::Basic::ControllerMethods
|
6
|
-
include ExceptionHandler
|
7
|
-
include Response
|
8
|
-
|
9
|
-
before_action :authorize_request
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def authorize_request
|
14
|
-
send(authentication_strategy) do |searchable_attribute, authentication_attribute|
|
15
|
-
authorization = AuthorizeApiRequest.new(
|
16
|
-
searchable_attribute: searchable_attribute,
|
17
|
-
authentication_attribute: authentication_attribute
|
18
|
-
)
|
19
|
-
@company = authorization.company
|
20
|
-
end
|
21
|
-
raise ScimRails::ExceptionHandler::InvalidCredentials if @company.blank?
|
22
|
-
end
|
23
|
-
|
24
|
-
def authentication_strategy
|
25
|
-
if request.headers["Authorization"]&.include?("Bearer")
|
26
|
-
:authenticate_with_oauth_bearer
|
27
|
-
else
|
28
|
-
:authenticate_with_http_basic
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def authenticate_with_oauth_bearer
|
33
|
-
authentication_attribute = request.headers["Authorization"].split.last
|
34
|
-
payload = ScimRails::Encoder.decode(authentication_attribute).with_indifferent_access
|
35
|
-
searchable_attribute = payload[ScimRails.config.basic_auth_model_searchable_attribute]
|
36
|
-
|
37
|
-
yield searchable_attribute, authentication_attribute
|
38
|
-
end
|
39
|
-
|
40
|
-
def find_value_for(attribute)
|
41
|
-
params.dig(*path_for(attribute))
|
42
|
-
end
|
43
|
-
|
44
|
-
# `path_for` is a recursive method used to find the "path" for
|
45
|
-
# `.dig` to take when looking for a given attribute in the
|
46
|
-
# params.
|
47
|
-
#
|
48
|
-
# Example: `path_for(:name)` should return an array that looks
|
49
|
-
# like [:names, 0, :givenName]. `.dig` can then use that path
|
50
|
-
# against the params to translate the :name attribute to "John".
|
51
|
-
|
52
|
-
def path_for(attribute, object = controller_schema, path = [])
|
53
|
-
at_path = path.empty? ? object : object.dig(*path)
|
54
|
-
return path if at_path == attribute
|
55
|
-
|
56
|
-
case at_path
|
57
|
-
when Hash
|
58
|
-
at_path.each do |key, _value|
|
59
|
-
found_path = path_for(attribute, object, [*path, key])
|
60
|
-
return found_path if found_path
|
61
|
-
end
|
62
|
-
nil
|
63
|
-
when Array
|
64
|
-
at_path.each_with_index do |_value, index|
|
65
|
-
found_path = path_for(attribute, object, [*path, index])
|
66
|
-
return found_path if found_path
|
67
|
-
end
|
68
|
-
nil
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,107 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ScimRails
|
4
|
-
class ScimUsersController < ScimRails::ApplicationController
|
5
|
-
|
6
|
-
|
7
|
-
def index
|
8
|
-
if params[:filter].present?
|
9
|
-
query = ScimRails::ScimQueryParser.new(
|
10
|
-
params[:filter], ScimRails.config.queryable_user_attributes
|
11
|
-
)
|
12
|
-
|
13
|
-
users = @company
|
14
|
-
.public_send(ScimRails.config.scim_users_scope)
|
15
|
-
.where(
|
16
|
-
"#{ScimRails.config.scim_users_model
|
17
|
-
.connection.quote_column_name(query.attribute)} #{query.operator} ?",
|
18
|
-
query.parameter
|
19
|
-
)
|
20
|
-
.order(ScimRails.config.scim_users_list_order)
|
21
|
-
else
|
22
|
-
users = @company
|
23
|
-
.public_send(ScimRails.config.scim_users_scope)
|
24
|
-
.order(ScimRails.config.scim_users_list_order)
|
25
|
-
end
|
26
|
-
|
27
|
-
counts = ScimCount.new(
|
28
|
-
start_index: params[:startIndex],
|
29
|
-
limit: params[:count],
|
30
|
-
total: users.count
|
31
|
-
)
|
32
|
-
|
33
|
-
json_scim_response(object: users, counts: counts)
|
34
|
-
end
|
35
|
-
|
36
|
-
def create
|
37
|
-
if ScimRails.config.scim_user_prevent_update_on_create
|
38
|
-
user = @company
|
39
|
-
.public_send(ScimRails.config.scim_users_scope)
|
40
|
-
.create!(permitted_user_params)
|
41
|
-
else
|
42
|
-
username_key = ScimRails.config.queryable_user_attributes[:userName]
|
43
|
-
find_by_username = {}
|
44
|
-
find_by_username[username_key] = permitted_user_params[username_key]
|
45
|
-
user = @company
|
46
|
-
.public_send(ScimRails.config.scim_users_scope)
|
47
|
-
.find_or_create_by(find_by_username)
|
48
|
-
user.update!(permitted_user_params)
|
49
|
-
end
|
50
|
-
json_scim_response(object: user, status: :created)
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
def show
|
56
|
-
user = @company.public_send(ScimRails.config.scim_users_scope).find(params[:id])
|
57
|
-
json_scim_response(object: user)
|
58
|
-
end
|
59
|
-
|
60
|
-
def put_update
|
61
|
-
user = @company.public_send(ScimRails.config.scim_users_scope).find(params[:id])
|
62
|
-
user.update!(permitted_user_params)
|
63
|
-
json_scim_response(object: user)
|
64
|
-
end
|
65
|
-
|
66
|
-
def patch_update
|
67
|
-
user = @company.public_send(ScimRails.config.scim_users_scope).find(params[:id])
|
68
|
-
patch = ScimPatch.new(params, ScimRails.config.mutable_user_attributes_schema)
|
69
|
-
patch.save(user)
|
70
|
-
|
71
|
-
json_scim_response(object: user)
|
72
|
-
end
|
73
|
-
|
74
|
-
def destroy
|
75
|
-
unless ScimRails.config.user_destroy_method
|
76
|
-
raise ScimRails::ExceptionHandler::InvalidConfiguration
|
77
|
-
end
|
78
|
-
|
79
|
-
user = @company.public_send(ScimRails.config.scim_users_scope).find(params[:id])
|
80
|
-
raise ActiveRecord::RecordNotFound unless user
|
81
|
-
|
82
|
-
begin
|
83
|
-
user.public_send(ScimRails.config.user_destroy_method)
|
84
|
-
rescue NoMethodError => e
|
85
|
-
raise ScimRails::ExceptionHandler::InvalidConfiguration, e.message
|
86
|
-
rescue ActiveRecord::RecordNotDestroyed => e
|
87
|
-
raise ScimRails::ExceptionHandler::InvalidRequest, e.message
|
88
|
-
rescue => e
|
89
|
-
raise ScimRails::ExceptionHandler::UnexpectedError, e.message
|
90
|
-
end
|
91
|
-
|
92
|
-
head :no_content
|
93
|
-
end
|
94
|
-
|
95
|
-
private
|
96
|
-
|
97
|
-
def permitted_user_params
|
98
|
-
ScimRails.config.mutable_user_attributes.each.with_object({}) do |attribute, hash|
|
99
|
-
hash[attribute] = find_value_for(attribute)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def controller_schema
|
104
|
-
ScimRails.config.mutable_user_attributes_schema
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module ScimRails
|
2
|
-
class AuthorizeApiRequest
|
3
|
-
|
4
|
-
def initialize(searchable_attribute:, authentication_attribute:)
|
5
|
-
@searchable_attribute = searchable_attribute
|
6
|
-
@authentication_attribute = authentication_attribute
|
7
|
-
|
8
|
-
raise ScimRails::ExceptionHandler::InvalidCredentials if searchable_attribute.blank? || authentication_attribute.blank?
|
9
|
-
|
10
|
-
@search_parameter = { ScimRails.config.basic_auth_model_searchable_attribute => @searchable_attribute }
|
11
|
-
end
|
12
|
-
|
13
|
-
def company
|
14
|
-
company = find_company
|
15
|
-
authorize(company)
|
16
|
-
company
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
attr_reader :authentication_attribute
|
22
|
-
attr_reader :search_parameter
|
23
|
-
attr_reader :searchable_attribute
|
24
|
-
|
25
|
-
def find_company
|
26
|
-
@company ||= ScimRails.config.basic_auth_model.find_by!(search_parameter)
|
27
|
-
|
28
|
-
rescue ActiveRecord::RecordNotFound
|
29
|
-
raise ScimRails::ExceptionHandler::InvalidCredentials
|
30
|
-
end
|
31
|
-
|
32
|
-
def authorize(authentication_model)
|
33
|
-
authorized = ActiveSupport::SecurityUtils.secure_compare(
|
34
|
-
authentication_model.public_send(ScimRails.config.basic_auth_model_authenticatable_attribute),
|
35
|
-
authentication_attribute
|
36
|
-
)
|
37
|
-
raise ScimRails::ExceptionHandler::InvalidCredentials unless authorized
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ScimRails
|
4
|
-
class ScimQueryParser
|
5
|
-
attr_accessor :query_elements, :query_attributes
|
6
|
-
|
7
|
-
def initialize(query_string, queryable_attributes)
|
8
|
-
self.query_elements = query_string.gsub(/\[(.+?)\]/, ".0").split
|
9
|
-
self.query_attributes = queryable_attributes
|
10
|
-
end
|
11
|
-
|
12
|
-
def attribute
|
13
|
-
attribute = query_elements[0]
|
14
|
-
raise ScimRails::ExceptionHandler::InvalidQuery if attribute.blank?
|
15
|
-
|
16
|
-
dig_keys = attribute.split(".").map do |step|
|
17
|
-
step == "0" ? 0 : step.to_sym
|
18
|
-
end
|
19
|
-
|
20
|
-
mapped_attribute = query_attributes.dig(*dig_keys)
|
21
|
-
raise ScimRails::ExceptionHandler::InvalidQuery if mapped_attribute.blank?
|
22
|
-
|
23
|
-
mapped_attribute
|
24
|
-
end
|
25
|
-
|
26
|
-
def operator
|
27
|
-
sql_comparison_operator(query_elements[1])
|
28
|
-
end
|
29
|
-
|
30
|
-
def parameter
|
31
|
-
parameter = query_elements[2..-1].join(" ")
|
32
|
-
return if parameter.blank?
|
33
|
-
|
34
|
-
parameter.gsub(/"/, "")
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def sql_comparison_operator(element)
|
40
|
-
case element
|
41
|
-
when "eq"
|
42
|
-
"="
|
43
|
-
else
|
44
|
-
# TODO: implement additional query filters
|
45
|
-
raise ScimRails::ExceptionHandler::InvalidQuery
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|