keycloak-admin 1.1.4 → 1.1.6

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.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/Dockerfile +24 -24
  3. data/.github/workflows/ci.yml +80 -80
  4. data/.gitignore +9 -9
  5. data/.rspec +2 -2
  6. data/CHANGELOG.md +23 -0
  7. data/Dockerfile +12 -12
  8. data/Gemfile +3 -3
  9. data/Gemfile.lock +1 -1
  10. data/MIT-LICENSE +20 -20
  11. data/README.md +20 -1
  12. data/bin/console +9 -9
  13. data/keycloak-admin.gemspec +24 -24
  14. data/lib/keycloak-admin/client/attack_detection_client.rb +41 -41
  15. data/lib/keycloak-admin/client/client.rb +56 -56
  16. data/lib/keycloak-admin/client/client_authz_permission_client.rb +80 -80
  17. data/lib/keycloak-admin/client/client_authz_policy_client.rb +75 -75
  18. data/lib/keycloak-admin/client/client_authz_resource_client.rb +92 -92
  19. data/lib/keycloak-admin/client/client_authz_scope_client.rb +70 -70
  20. data/lib/keycloak-admin/client/client_client.rb +71 -71
  21. data/lib/keycloak-admin/client/client_role_client.rb +20 -20
  22. data/lib/keycloak-admin/client/client_role_mappings_client.rb +32 -32
  23. data/lib/keycloak-admin/client/configurable_token_client.rb +35 -35
  24. data/lib/keycloak-admin/client/group_client.rb +148 -148
  25. data/lib/keycloak-admin/client/identity_provider_client.rb +51 -51
  26. data/lib/keycloak-admin/client/organization_client.rb +245 -0
  27. data/lib/keycloak-admin/client/realm_client.rb +126 -122
  28. data/lib/keycloak-admin/client/role_client.rb +59 -59
  29. data/lib/keycloak-admin/client/role_mapper_client.rb +47 -47
  30. data/lib/keycloak-admin/client/token_client.rb +29 -29
  31. data/lib/keycloak-admin/client/user_client.rb +278 -266
  32. data/lib/keycloak-admin/configuration.rb +52 -52
  33. data/lib/keycloak-admin/representation/attack_detection_representation.rb +17 -17
  34. data/lib/keycloak-admin/representation/camel_json.rb +12 -12
  35. data/lib/keycloak-admin/representation/client_authz_permission_representation.rb +33 -33
  36. data/lib/keycloak-admin/representation/client_authz_policy_config_representation.rb +14 -14
  37. data/lib/keycloak-admin/representation/client_authz_policy_representation.rb +26 -26
  38. data/lib/keycloak-admin/representation/client_authz_resource_representation.rb +25 -25
  39. data/lib/keycloak-admin/representation/client_authz_scope_representation.rb +16 -16
  40. data/lib/keycloak-admin/representation/client_representation.rb +71 -71
  41. data/lib/keycloak-admin/representation/credential_representation.rb +71 -38
  42. data/lib/keycloak-admin/representation/federated_identity_representation.rb +15 -15
  43. data/lib/keycloak-admin/representation/group_representation.rb +21 -21
  44. data/lib/keycloak-admin/representation/identity_provider_mapper_representation.rb +19 -19
  45. data/lib/keycloak-admin/representation/identity_provider_representation.rb +71 -67
  46. data/lib/keycloak-admin/representation/impersonation_redirection_representation.rb +16 -16
  47. data/lib/keycloak-admin/representation/impersonation_representation.rb +43 -43
  48. data/lib/keycloak-admin/representation/member_representation.rb +11 -0
  49. data/lib/keycloak-admin/representation/organization_domain_representation.rb +18 -0
  50. data/lib/keycloak-admin/representation/organization_representation.rb +30 -0
  51. data/lib/keycloak-admin/representation/protocol_mapper_representation.rb +19 -19
  52. data/lib/keycloak-admin/representation/realm_representation.rb +14 -14
  53. data/lib/keycloak-admin/representation/representation.rb +23 -23
  54. data/lib/keycloak-admin/representation/role_representation.rb +19 -19
  55. data/lib/keycloak-admin/representation/session_representation.rb +22 -22
  56. data/lib/keycloak-admin/representation/token_representation.rb +39 -39
  57. data/lib/keycloak-admin/representation/user_representation.rb +47 -47
  58. data/lib/keycloak-admin/resource/base_role_containing_resource.rb +28 -28
  59. data/lib/keycloak-admin/resource/group_resource.rb +11 -11
  60. data/lib/keycloak-admin/resource/user_resource.rb +7 -7
  61. data/lib/keycloak-admin/version.rb +3 -3
  62. data/lib/keycloak-admin.rb +88 -84
  63. data/spec/client/attack_detection_client_spec.rb +102 -102
  64. data/spec/client/client_authz_permission_client_spec.rb +170 -170
  65. data/spec/client/client_authz_policy_client_spec.rb +169 -169
  66. data/spec/client/client_authz_resource_client_spec.rb +150 -150
  67. data/spec/client/client_authz_scope_client_spec.rb +133 -133
  68. data/spec/client/client_client_spec.rb +133 -133
  69. data/spec/client/client_role_mappings_client_spec.rb +82 -82
  70. data/spec/client/client_spec.rb +28 -28
  71. data/spec/client/configurable_token_client_spec.rb +34 -34
  72. data/spec/client/group_client_spec.rb +328 -328
  73. data/spec/client/identity_provider_client_spec.rb +92 -92
  74. data/spec/client/organization_client_spec.rb +595 -0
  75. data/spec/client/realm_client_spec.rb +155 -155
  76. data/spec/client/role_client_spec.rb +79 -79
  77. data/spec/client/role_mapper_client_spec.rb +113 -113
  78. data/spec/client/token_client_spec.rb +68 -68
  79. data/spec/client/user_client_spec.rb +418 -373
  80. data/spec/configuration_spec.rb +113 -113
  81. data/spec/integration/client_authorization_spec.rb +93 -93
  82. data/spec/representation/attack_detection_representation_spec.rb +15 -15
  83. data/spec/representation/client_authz_permission_representation_spec.rb +52 -52
  84. data/spec/representation/client_authz_policy_representation_spec.rb +46 -46
  85. data/spec/representation/client_authz_resource_representation_spec.rb +33 -33
  86. data/spec/representation/client_authz_scope_representation_spec.rb +18 -18
  87. data/spec/representation/client_representation_spec.rb +119 -119
  88. data/spec/representation/credential_representation_spec.rb +68 -0
  89. data/spec/representation/group_representation_spec.rb +22 -22
  90. data/spec/representation/identity_provider_mapper_representation_spec.rb +24 -24
  91. data/spec/representation/identity_provider_representation_spec.rb +113 -113
  92. data/spec/representation/impersonation_representation_spec.rb +163 -163
  93. data/spec/representation/organization_representation_spec.rb +64 -0
  94. data/spec/representation/protocol_mapper_representation_spec.rb +57 -57
  95. data/spec/representation/role_representation_spec.rb +37 -37
  96. data/spec/representation/session_representation_spec.rb +15 -15
  97. data/spec/representation/user_representation_spec.rb +15 -15
  98. data/spec/resource/group_resource_spec.rb +14 -14
  99. data/spec/resource/user_resource_spec.rb +14 -14
  100. data/spec/spec_helper.rb +37 -37
  101. metadata +13 -6
@@ -1,71 +1,71 @@
1
- module KeycloakAdmin
2
- class ClientAuthzScopeClient < Client
3
- def initialize(configuration, realm_client, client_id, resource_id = nil)
4
- super(configuration)
5
- raise ArgumentError.new("realm must be defined") unless realm_client.name_defined?
6
- @realm_client = realm_client
7
- @client_id = client_id
8
- @resource_id = resource_id
9
- end
10
-
11
- def create!(name, display_name, icon_uri)
12
- response = save(build(name, display_name, icon_uri))
13
- ClientAuthzScopeRepresentation.from_hash(JSON.parse(response))
14
- end
15
-
16
- def list
17
- response = execute_http do
18
- RestClient::Resource.new(authz_scopes_url(@client_id, @resource_id), @configuration.rest_client_options).get(headers)
19
- end
20
- JSON.parse(response).map { |role_as_hash| ClientAuthzScopeRepresentation.from_hash(role_as_hash) }
21
- end
22
-
23
- def delete(scope_id)
24
- execute_http do
25
- RestClient::Resource.new(authz_scopes_url(@client_id, nil, scope_id), @configuration.rest_client_options).delete(headers)
26
- end
27
- true
28
- end
29
-
30
- def get(scope_id)
31
- response = execute_http do
32
- RestClient::Resource.new(authz_scopes_url(@client_id, nil, scope_id), @configuration.rest_client_options).get(headers)
33
- end
34
- ClientAuthzScopeRepresentation.from_hash(JSON.parse(response))
35
- end
36
-
37
- def search(name)
38
- url = "#{authz_scopes_url(@client_id)}?first=0&max=11&deep=false&name=#{name}"
39
- response = execute_http do
40
- RestClient::Resource.new(url, @configuration.rest_client_options).get(headers)
41
- end
42
- JSON.parse(response).map { |role_as_hash| ClientAuthzScopeRepresentation.from_hash(role_as_hash) }
43
- end
44
-
45
- def authz_scopes_url(client_id, resource_id = nil, id = nil)
46
- if resource_id
47
- "#{@realm_client.realm_admin_url}/clients/#{client_id}/authz/resource-server/resource/#{resource_id}/scopes"
48
- elsif id
49
- "#{@realm_client.realm_admin_url}/clients/#{client_id}/authz/resource-server/scope/#{id}"
50
- else
51
- "#{@realm_client.realm_admin_url}/clients/#{client_id}/authz/resource-server/scope"
52
- end
53
- end
54
-
55
- def save(scope_representation)
56
- execute_http do
57
- RestClient::Resource.new(authz_scopes_url(@client_id), @configuration.rest_client_options).post(
58
- create_payload(scope_representation), headers
59
- )
60
- end
61
- end
62
-
63
- def build(name, display_name, icon_uri)
64
- scope = ClientAuthzScopeRepresentation.new
65
- scope.name = name
66
- scope.icon_uri = icon_uri
67
- scope.display_name = display_name
68
- scope
69
- end
70
- end
1
+ module KeycloakAdmin
2
+ class ClientAuthzScopeClient < Client
3
+ def initialize(configuration, realm_client, client_id, resource_id = nil)
4
+ super(configuration)
5
+ raise ArgumentError.new("realm must be defined") unless realm_client.name_defined?
6
+ @realm_client = realm_client
7
+ @client_id = client_id
8
+ @resource_id = resource_id
9
+ end
10
+
11
+ def create!(name, display_name, icon_uri)
12
+ response = save(build(name, display_name, icon_uri))
13
+ ClientAuthzScopeRepresentation.from_hash(JSON.parse(response))
14
+ end
15
+
16
+ def list
17
+ response = execute_http do
18
+ RestClient::Resource.new(authz_scopes_url(@client_id, @resource_id), @configuration.rest_client_options).get(headers)
19
+ end
20
+ JSON.parse(response).map { |role_as_hash| ClientAuthzScopeRepresentation.from_hash(role_as_hash) }
21
+ end
22
+
23
+ def delete(scope_id)
24
+ execute_http do
25
+ RestClient::Resource.new(authz_scopes_url(@client_id, nil, scope_id), @configuration.rest_client_options).delete(headers)
26
+ end
27
+ true
28
+ end
29
+
30
+ def get(scope_id)
31
+ response = execute_http do
32
+ RestClient::Resource.new(authz_scopes_url(@client_id, nil, scope_id), @configuration.rest_client_options).get(headers)
33
+ end
34
+ ClientAuthzScopeRepresentation.from_hash(JSON.parse(response))
35
+ end
36
+
37
+ def search(name)
38
+ url = "#{authz_scopes_url(@client_id)}?first=0&max=11&deep=false&name=#{name}"
39
+ response = execute_http do
40
+ RestClient::Resource.new(url, @configuration.rest_client_options).get(headers)
41
+ end
42
+ JSON.parse(response).map { |role_as_hash| ClientAuthzScopeRepresentation.from_hash(role_as_hash) }
43
+ end
44
+
45
+ def authz_scopes_url(client_id, resource_id = nil, id = nil)
46
+ if resource_id
47
+ "#{@realm_client.realm_admin_url}/clients/#{client_id}/authz/resource-server/resource/#{resource_id}/scopes"
48
+ elsif id
49
+ "#{@realm_client.realm_admin_url}/clients/#{client_id}/authz/resource-server/scope/#{id}"
50
+ else
51
+ "#{@realm_client.realm_admin_url}/clients/#{client_id}/authz/resource-server/scope"
52
+ end
53
+ end
54
+
55
+ def save(scope_representation)
56
+ execute_http do
57
+ RestClient::Resource.new(authz_scopes_url(@client_id), @configuration.rest_client_options).post(
58
+ create_payload(scope_representation), headers
59
+ )
60
+ end
61
+ end
62
+
63
+ def build(name, display_name, icon_uri)
64
+ scope = ClientAuthzScopeRepresentation.new
65
+ scope.name = name
66
+ scope.icon_uri = icon_uri
67
+ scope.display_name = display_name
68
+ scope
69
+ end
70
+ end
71
71
  end
@@ -1,71 +1,71 @@
1
- module KeycloakAdmin
2
- class ClientClient < Client
3
- def initialize(configuration, realm_client)
4
- super(configuration)
5
- raise ArgumentError.new("realm must be defined") unless realm_client.name_defined?
6
- @realm_client = realm_client
7
- end
8
-
9
- def get(id)
10
- response = execute_http do
11
- RestClient::Resource.new(clients_url(id), @configuration.rest_client_options).get(headers)
12
- end
13
- ClientRepresentation.from_hash(JSON.parse(response))
14
- end
15
-
16
- def save(client_representation)
17
- execute_http do
18
- RestClient::Resource.new(clients_url, @configuration.rest_client_options).post(
19
- create_payload(client_representation), headers
20
- )
21
- end
22
- end
23
-
24
- def list
25
- response = execute_http do
26
- RestClient::Resource.new(clients_url, @configuration.rest_client_options).get(headers)
27
- end
28
- JSON.parse(response).map { |client_as_hash| ClientRepresentation.from_hash(client_as_hash) }
29
- end
30
-
31
- def find_by_client_id(client_id)
32
- list.find { |client| client.client_id == client_id }
33
- end
34
-
35
- def delete(id)
36
- execute_http do
37
- RestClient::Resource.new(clients_url(id), @configuration.rest_client_options).delete(headers)
38
- end
39
- true
40
- end
41
-
42
- def update(client_representation)
43
- execute_http do
44
- RestClient::Resource.new(clients_url(client_representation.id), @configuration.rest_client_options).put(
45
- create_payload(client_representation), headers
46
- )
47
- end
48
-
49
- get(client_representation.id)
50
- end
51
-
52
- def get_service_account_user(client_id)
53
- response = execute_http do
54
- RestClient::Resource.new(service_account_user_url(client_id), @configuration.rest_client_options).get(headers)
55
- end
56
- UserRepresentation.from_hash(JSON.parse(response))
57
- end
58
-
59
- def clients_url(id=nil)
60
- if id
61
- "#{@realm_client.realm_admin_url}/clients/#{id}"
62
- else
63
- "#{@realm_client.realm_admin_url}/clients"
64
- end
65
- end
66
-
67
- def service_account_user_url(client_id)
68
- "#{clients_url(client_id)}/service-account-user"
69
- end
70
- end
71
- end
1
+ module KeycloakAdmin
2
+ class ClientClient < Client
3
+ def initialize(configuration, realm_client)
4
+ super(configuration)
5
+ raise ArgumentError.new("realm must be defined") unless realm_client.name_defined?
6
+ @realm_client = realm_client
7
+ end
8
+
9
+ def get(id)
10
+ response = execute_http do
11
+ RestClient::Resource.new(clients_url(id), @configuration.rest_client_options).get(headers)
12
+ end
13
+ ClientRepresentation.from_hash(JSON.parse(response))
14
+ end
15
+
16
+ def save(client_representation)
17
+ execute_http do
18
+ RestClient::Resource.new(clients_url, @configuration.rest_client_options).post(
19
+ create_payload(client_representation), headers
20
+ )
21
+ end
22
+ end
23
+
24
+ def list
25
+ response = execute_http do
26
+ RestClient::Resource.new(clients_url, @configuration.rest_client_options).get(headers)
27
+ end
28
+ JSON.parse(response).map { |client_as_hash| ClientRepresentation.from_hash(client_as_hash) }
29
+ end
30
+
31
+ def find_by_client_id(client_id)
32
+ list.find { |client| client.client_id == client_id }
33
+ end
34
+
35
+ def delete(id)
36
+ execute_http do
37
+ RestClient::Resource.new(clients_url(id), @configuration.rest_client_options).delete(headers)
38
+ end
39
+ true
40
+ end
41
+
42
+ def update(client_representation)
43
+ execute_http do
44
+ RestClient::Resource.new(clients_url(client_representation.id), @configuration.rest_client_options).put(
45
+ create_payload(client_representation), headers
46
+ )
47
+ end
48
+
49
+ get(client_representation.id)
50
+ end
51
+
52
+ def get_service_account_user(client_id)
53
+ response = execute_http do
54
+ RestClient::Resource.new(service_account_user_url(client_id), @configuration.rest_client_options).get(headers)
55
+ end
56
+ UserRepresentation.from_hash(JSON.parse(response))
57
+ end
58
+
59
+ def clients_url(id=nil)
60
+ if id
61
+ "#{@realm_client.realm_admin_url}/clients/#{id}"
62
+ else
63
+ "#{@realm_client.realm_admin_url}/clients"
64
+ end
65
+ end
66
+
67
+ def service_account_user_url(client_id)
68
+ "#{clients_url(client_id)}/service-account-user"
69
+ end
70
+ end
71
+ end
@@ -1,20 +1,20 @@
1
- module KeycloakAdmin
2
- class ClientRoleClient < Client
3
- def initialize(configuration, realm_client)
4
- super(configuration)
5
- raise ArgumentError.new("realm must be defined") unless realm_client.name_defined?
6
- @realm_client = realm_client
7
- end
8
-
9
- def list(client_id)
10
- response = execute_http do
11
- RestClient::Resource.new(clients_url(client_id), @configuration.rest_client_options).get(headers)
12
- end
13
- JSON.parse(response).map { |role_as_hash| RoleRepresentation.from_hash(role_as_hash) }
14
- end
15
-
16
- def clients_url(id)
17
- "#{@realm_client.realm_admin_url}/clients/#{id}/roles"
18
- end
19
- end
20
- end
1
+ module KeycloakAdmin
2
+ class ClientRoleClient < Client
3
+ def initialize(configuration, realm_client)
4
+ super(configuration)
5
+ raise ArgumentError.new("realm must be defined") unless realm_client.name_defined?
6
+ @realm_client = realm_client
7
+ end
8
+
9
+ def list(client_id)
10
+ response = execute_http do
11
+ RestClient::Resource.new(clients_url(client_id), @configuration.rest_client_options).get(headers)
12
+ end
13
+ JSON.parse(response).map { |role_as_hash| RoleRepresentation.from_hash(role_as_hash) }
14
+ end
15
+
16
+ def clients_url(id)
17
+ "#{@realm_client.realm_admin_url}/clients/#{id}/roles"
18
+ end
19
+ end
20
+ end
@@ -1,32 +1,32 @@
1
- module KeycloakAdmin
2
- class ClientRoleMappingsClient < Client
3
- def initialize(configuration, user_resource, client_id)
4
- super(configuration)
5
- @user_resource = user_resource
6
- @client_id = client_id
7
- end
8
-
9
- def list_available
10
- response = execute_http do
11
- RestClient::Resource.new(list_available_url, @configuration.rest_client_options).get(headers)
12
- end
13
- JSON.parse(response).map { |role_as_hash| RoleRepresentation.from_hash(role_as_hash) }
14
- end
15
-
16
- def save(role_representation_list)
17
- execute_http do
18
- RestClient::Resource.new(base_url, @configuration.rest_client_options).post(
19
- create_payload(role_representation_list), headers
20
- )
21
- end
22
- end
23
-
24
- def list_available_url
25
- "#{@user_resource.resource_url}/role-mappings/clients/#{@client_id}/available"
26
- end
27
-
28
- def base_url
29
- "#{@user_resource.resource_url}/role-mappings/clients/#{@client_id}"
30
- end
31
- end
32
- end
1
+ module KeycloakAdmin
2
+ class ClientRoleMappingsClient < Client
3
+ def initialize(configuration, user_resource, client_id)
4
+ super(configuration)
5
+ @user_resource = user_resource
6
+ @client_id = client_id
7
+ end
8
+
9
+ def list_available
10
+ response = execute_http do
11
+ RestClient::Resource.new(list_available_url, @configuration.rest_client_options).get(headers)
12
+ end
13
+ JSON.parse(response).map { |role_as_hash| RoleRepresentation.from_hash(role_as_hash) }
14
+ end
15
+
16
+ def save(role_representation_list)
17
+ execute_http do
18
+ RestClient::Resource.new(base_url, @configuration.rest_client_options).post(
19
+ create_payload(role_representation_list), headers
20
+ )
21
+ end
22
+ end
23
+
24
+ def list_available_url
25
+ "#{@user_resource.resource_url}/role-mappings/clients/#{@client_id}/available"
26
+ end
27
+
28
+ def base_url
29
+ "#{@user_resource.resource_url}/role-mappings/clients/#{@client_id}"
30
+ end
31
+ end
32
+ end
@@ -1,35 +1,35 @@
1
- module KeycloakAdmin
2
- class ConfigurableTokenClient < Client
3
- def initialize(configuration, realm_client)
4
- super(configuration)
5
- raise ArgumentError.new("realm must be defined") unless realm_client.name_defined?
6
- @realm_client = realm_client
7
- end
8
-
9
- def token_url
10
- "#{realm_url}/configurable-token"
11
- end
12
-
13
- def realm_url
14
- @realm_client.realm_url
15
- end
16
-
17
- def exchange_with(user_access_token, token_lifespan_in_seconds)
18
- response = execute_http do
19
- RestClient::Request.execute(
20
- @configuration.rest_client_options.merge(
21
- method: :post,
22
- url: token_url,
23
- payload: { tokenLifespanInSeconds: token_lifespan_in_seconds }.to_json,
24
- headers: {
25
- Authorization: "Bearer #{user_access_token}",
26
- content_type: :json,
27
- accept: :json
28
- }
29
- )
30
- )
31
- end
32
- TokenRepresentation.from_json(response.body)
33
- end
34
- end
35
- end
1
+ module KeycloakAdmin
2
+ class ConfigurableTokenClient < Client
3
+ def initialize(configuration, realm_client)
4
+ super(configuration)
5
+ raise ArgumentError.new("realm must be defined") unless realm_client.name_defined?
6
+ @realm_client = realm_client
7
+ end
8
+
9
+ def token_url
10
+ "#{realm_url}/configurable-token"
11
+ end
12
+
13
+ def realm_url
14
+ @realm_client.realm_url
15
+ end
16
+
17
+ def exchange_with(user_access_token, token_lifespan_in_seconds)
18
+ response = execute_http do
19
+ RestClient::Request.execute(
20
+ @configuration.rest_client_options.merge(
21
+ method: :post,
22
+ url: token_url,
23
+ payload: { tokenLifespanInSeconds: token_lifespan_in_seconds }.to_json,
24
+ headers: {
25
+ Authorization: "Bearer #{user_access_token}",
26
+ content_type: :json,
27
+ accept: :json
28
+ }
29
+ )
30
+ )
31
+ end
32
+ TokenRepresentation.from_json(response.body)
33
+ end
34
+ end
35
+ end