Skip to content

Commit ec1a47f

Browse files
committed
schemas endpoints
1 parent 3bd9fca commit ec1a47f

File tree

7 files changed

+141
-22
lines changed

7 files changed

+141
-22
lines changed

app/controllers/concerns/scim_rails/response.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ def json_scim_response(object:, status: :ok, counts: nil)
3434
content_type: CONTENT_TYPE
3535
end
3636

37+
def json_schema_response(object)
38+
render \
39+
json: object,
40+
status: :ok,
41+
content_type: CONTENT_TYPE
42+
end
43+
3744
def json_scim_group_response(object:, status: :ok, counts: nil)
3845
response = nil
3946
case params[:action]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
module ScimRails
2+
class ScimSchemaController < ApplicationController
3+
def get_schema
4+
ScimRails.config.before_scim_response.call(request.params) unless ScimRails.config.before_scim_response.nil?
5+
6+
if request.params[:id] == "urn:ietf:params:scim:schemas:core:2.0:User"
7+
object = ScimRails.config.retrievable_user_schema
8+
elsif request.params[:id] == "urn:ietf:params:scim:schemas:core:2.0:Group"
9+
object = ScimRails.config.retrievable_group_schema
10+
else
11+
object = {}
12+
end
13+
14+
ScimRails.config.after_scim_response.call(object, “RETRIEVED”) unless ScimRails.config.after_scim_response.nil?
15+
16+
json_schema_response(object)
17+
end
18+
end
19+
end

config/routes.rb

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
ScimRails::Engine.routes.draw do
2-
get 'scim/v2/Users', action: :index, controller: 'scim_users'
3-
post 'scim/v2/Users', action: :create, controller: 'scim_users'
4-
get 'scim/v2/Users/:id', action: :show, controller: 'scim_users'
5-
put 'scim/v2/Users/:id', action: :put_update, controller: 'scim_users'
6-
patch 'scim/v2/Users/:id', action: :patch_update, controller: 'scim_users'
7-
delete 'scim/v2/Users/:id', action: :delete, controller: 'scim_users'
8-
9-
get 'scim/v2/Groups', action: :index, controller: 'scim_groups'
10-
post 'scim/v2/Groups', action: :create, controller: 'scim_groups'
11-
get 'scim/v2/Groups/:id', action: :show, controller: 'scim_groups'
12-
put 'scim/v2/Groups/:id', action: :put_update, controller: 'scim_groups'
13-
patch 'scim/v2/Groups/:id', action: :patch_update, controller: 'scim_groups'
14-
delete 'scim/v2/Groups/:id', action: :delete, controller: 'scim_groups'
15-
16-
get 'scim/v2/ServiceProviderConfig', action: :configuration, controller: 'scim_service'
17-
get 'scim/v2/ServiceProviderConfigs', action: :configuration, controller: 'scim_service'
18-
19-
get 'scim/v2/ResourceTypes/User', action: :resource_user, controller: 'scim_resource'
20-
get 'scim/v2/ResourceTypes/Group', action: :resource_group, controller: 'scim_resource'
2+
get 'scim/v2/Users', action: :index, controller: 'scim_users'
3+
post 'scim/v2/Users', action: :create, controller: 'scim_users'
4+
get 'scim/v2/Users/:id', action: :show, controller: 'scim_users'
5+
put 'scim/v2/Users/:id', action: :put_update, controller: 'scim_users'
6+
patch 'scim/v2/Users/:id', action: :patch_update, controller: 'scim_users'
7+
delete 'scim/v2/Users/:id', action: :delete, controller: 'scim_users'
8+
9+
get 'scim/v2/Groups', action: :index, controller: 'scim_groups'
10+
post 'scim/v2/Groups', action: :create, controller: 'scim_groups'
11+
get 'scim/v2/Groups/:id', action: :show, controller: 'scim_groups'
12+
put 'scim/v2/Groups/:id', action: :put_update, controller: 'scim_groups'
13+
patch 'scim/v2/Groups/:id', action: :patch_update, controller: 'scim_groups'
14+
delete 'scim/v2/Groups/:id', action: :delete, controller: 'scim_groups'
15+
16+
get 'scim/v2/ServiceProviderConfig', action: :configuration, controller: 'scim_service'
17+
get 'scim/v2/ServiceProviderConfigs', action: :configuration, controller: 'scim_service'
18+
19+
get 'scim/v2/ResourceTypes/User', action: :resource_user, controller: 'scim_resource'
20+
get 'scim/v2/ResourceTypes/Group', action: :resource_group, controller: 'scim_resource'
21+
22+
get 'scim/v2/Schemas/:id', action: :get_schema, controller: 'scim_schema'
23+
# get 'scim/v2/Schemas/urn:ietf:params:scim:schemas:core:2.0:Group', action: :group_schema, controller: 'scim_schema'
2124
end

lib/scim_rails/config.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ class Config
4949
:scim_attribute_type_mappings,
5050
:config_schema,
5151
:resource_user_schema,
52-
:resource_group_schema
52+
:resource_group_schema,
53+
:retrievable_user_schema,
54+
:retrievable_group_schema
5355

5456
def initialize
5557
@basic_auth_model = "Company"

spec/controllers/scim_rails/scim_resource_controller_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
expect(response.status).to eq(200)
5050
end
5151

52-
it "successfully returns the configuration of the app" do
52+
it "successfully returns the resource schema of users" do
5353
get :resource_user
5454

5555
expect(body.deep_symbolize_keys).to eq(ScimRails.config.resource_user_schema)
@@ -101,7 +101,7 @@
101101
expect(response.status).to eq(200)
102102
end
103103

104-
it "successfully returns the configuration of the app" do
104+
it "successfully returns the resource schema of groups" do
105105
get :resource_group
106106

107107
expect(body.deep_symbolize_keys).to eq(ScimRails.config.resource_group_schema)
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
require 'spec_helper'
2+
3+
module ScimRails
4+
RSpec.describe ScimSchemaController, type: :controller do
5+
include AuthHelper
6+
routes { ScimRails::Engine.routes }
7+
8+
describe "get_schema" do
9+
let(:company) { create(:company) }
10+
11+
context "when unauthorized" do
12+
it "returns scim+json content type" do
13+
get :get_schema, params: { id: 1 }
14+
15+
expect(response.content_type).to eq("application/scim+json")
16+
end
17+
18+
it "fails with no credentials" do
19+
get :get_schema, params: { id: 1 }
20+
21+
expect(response.status).to eq(401)
22+
end
23+
24+
it "fails with invalid credentials" do
25+
request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials("unauthorized","123456")
26+
27+
get :get_schema, params: { id: 1 }
28+
29+
expect(response.status).to eq(401)
30+
end
31+
end
32+
33+
context "when authorized" do
34+
let(:body) { JSON.parse(response.body) }
35+
36+
before :each do
37+
http_login(company)
38+
end
39+
40+
it "returns scim+json content type" do
41+
get :get_schema, params: { id: 1 }
42+
43+
expect(response.content_type).to eq("application/scim+json")
44+
end
45+
46+
it "is successful with valid credentials" do
47+
get :get_schema, params: { id: 1 }
48+
49+
expect(response.status).to eq(200)
50+
end
51+
52+
it "successfully returns the user schema" do
53+
get :get_schema, params: { id: "urn:ietf:params:scim:schemas:core:2.0:User" }
54+
55+
expect(body.deep_symbolize_keys).to eq(ScimRails.config.retrievable_user_schema)
56+
end
57+
58+
it "successfully returns the group schema" do
59+
get :get_schema, params: { id: "urn:ietf:params:scim:schemas:core:2.0:Group" }
60+
61+
expect(body.deep_symbolize_keys).to eq(ScimRails.config.retrievable_group_schema)
62+
end
63+
end
64+
end
65+
end
66+
end

spec/support/scim_rails_config.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,26 @@
168168
endpoint: "/Groups",
169169
schema: "urn:ietf:params:scim:schemas:core:2.0:Group"
170170
}
171+
172+
config.retrievable_user_schema = {
173+
schemas: ["urn:ietf:params:scim:schemas:core:2.0:Schema"],
174+
id: "urn:ietf:params:scim:schemas:core:2.0:User",
175+
name: "User",
176+
attributes: [
177+
{
178+
179+
}
180+
]
181+
}
182+
183+
config.retrievable_group_schema = {
184+
schemas: ["urn:ietf:params:scim:schemas:core:2.0:Schema"],
185+
id: "urn:ietf:params:scim:schemas:core:2.0:Group",
186+
name: "Group",
187+
attributes: [
188+
{
189+
190+
}
191+
]
192+
}
171193
end

0 commit comments

Comments
 (0)