keycloak-admin 1.0.21 → 1.0.22

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a01d12df8eb75fcedbf128aacae50192983a47cb4cfac6c52b1dff4d999aa08
4
- data.tar.gz: dae8911b975b7aea1989fc8df565047c144da55868569da02039c53fbc8d6963
3
+ metadata.gz: 0f50997d1b2b3688cb70a8f23ee49d0691dffc312d6b2ebc0ba9860ff2517d65
4
+ data.tar.gz: 9a778464a35c8bf11e90a23249ab7ac11c6d7e95ab39d4bec1e78a3a47f1a685
5
5
  SHA512:
6
- metadata.gz: 8f44444327adcb4622856a7397401b5eaeaa10ad55943cce4606f4539340795a2e444f48613c35cdedb41c34431516b9137fec07f163d51c5e7c691ce3a7db17
7
- data.tar.gz: 2210584caebc4c01e67a7da99740910755759a1edb22fb5c48002c0e51eb3d672460a74723db38bdc0bc639c2effd1cc42e4a8d30b79e185ce0d31a3a6c8ea72
6
+ metadata.gz: 39f2301f9cafc3e4b66cdeadb7347de01ee38f492686e138698d5e48de1da10dc1621df829aa6750fc2bf2198d78d9bfe36e82f7e263c1b1c3b671be94fdd7a6
7
+ data.tar.gz: 2bed1fdf4667cae74c4b843fed95921d41d7f7e5b3a9f66b4437f1dd62fe9cc0413aa778e9184881fc180ecf346dce6b33f4a917b8fd4dac9b7590b66467e81a
data/CHANGELOG.md CHANGED
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.0.22] - 2023-05-29
9
+
10
+ * Fetch user's all active sessions (thanks to @prsanjay)
11
+ * Check whether a user is locked or not (thanks to @prsanjay)
12
+ * Logout users from all the active sessions (thanks to @prsanjay)
13
+
8
14
  ## [1.0.21] - 2023-02-03
9
15
 
10
16
  * List users who are a member of a group (thanks to @tlloydthwaites)
data/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM ruby:2.7.5-slim-bullseye
1
+ FROM ruby:3.2.2-slim-bullseye
2
2
 
3
3
  RUN apt-get update -qq && apt-get install -y build-essential git ruby-dev && apt-get clean && \
4
4
  mkdir -p /usr/src/app/lib/keycloak-admin
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- keycloak-admin (1.0.21)
4
+ keycloak-admin (1.0.22)
5
5
  http-cookie (~> 1.0, >= 1.0.3)
6
6
  rest-client (~> 2.1)
7
7
 
@@ -17,7 +17,7 @@ GEM
17
17
  domain_name (~> 0.5)
18
18
  mime-types (3.4.1)
19
19
  mime-types-data (~> 3.2015)
20
- mime-types-data (3.2022.0105)
20
+ mime-types-data (3.2023.0218.1)
21
21
  netrc (0.11.0)
22
22
  rest-client (2.1.0)
23
23
  http-accept (>= 1.7.0, < 2.0)
@@ -28,12 +28,12 @@ GEM
28
28
  rspec-core (~> 3.12.0)
29
29
  rspec-expectations (~> 3.12.0)
30
30
  rspec-mocks (~> 3.12.0)
31
- rspec-core (3.12.0)
31
+ rspec-core (3.12.2)
32
32
  rspec-support (~> 3.12.0)
33
- rspec-expectations (3.12.1)
33
+ rspec-expectations (3.12.3)
34
34
  diff-lcs (>= 1.2.0, < 2.0)
35
35
  rspec-support (~> 3.12.0)
36
- rspec-mocks (3.12.1)
36
+ rspec-mocks (3.12.5)
37
37
  diff-lcs (>= 1.2.0, < 2.0)
38
38
  rspec-support (~> 3.12.0)
39
39
  rspec-support (3.12.0)
data/README.md CHANGED
@@ -12,7 +12,7 @@ This gem *does not* require Rails.
12
12
  For example, using `bundle`, add this line to your Gemfile.
13
13
 
14
14
  ```ruby
15
- gem "keycloak-admin", "1.0.21"
15
+ gem "keycloak-admin", "1.0.22"
16
16
  ```
17
17
 
18
18
  ## Login
@@ -0,0 +1,42 @@
1
+ module KeycloakAdmin
2
+ class AttackDetectionClient < 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 lock_status(user_id)
10
+ raise ArgumentError.new("user_id must be defined") if user_id.nil?
11
+
12
+ response = execute_http do
13
+ RestClient::Resource.new(brute_force_url(user_id), @configuration.rest_client_options).get(headers)
14
+ end
15
+ AttackDetectionRepresentation.from_hash(JSON.parse(response))
16
+ end
17
+
18
+ def unlock_user(user_id)
19
+ raise ArgumentError.new("user_id must be defined") if user_id.nil?
20
+
21
+ execute_http do
22
+ RestClient::Resource.new(brute_force_url(user_id), @configuration.rest_client_options).delete(headers)
23
+ end
24
+ true
25
+ end
26
+
27
+ def unlock_users
28
+ execute_http do
29
+ RestClient::Resource.new(brute_force_url, @configuration.rest_client_options).delete(headers)
30
+ end
31
+ true
32
+ end
33
+
34
+ def brute_force_url(user_id = nil)
35
+ if user_id
36
+ "#{@realm_client.realm_admin_url}/attack-detection/brute-force/users/#{user_id}"
37
+ else
38
+ "#{@realm_client.realm_admin_url}/attack-detection/brute-force/users"
39
+ end
40
+ end
41
+ end
42
+ end
@@ -33,7 +33,7 @@ module KeycloakAdmin
33
33
  unless response.net_http_res.is_a? Net::HTTPCreated
34
34
  raise "Create method returned status #{response.net_http_res.message} (Code: #{response.net_http_res.code}); expected status: Created (201)"
35
35
  end
36
- (_head, _separator, id) = response.headers[:location].rpartition('/')
36
+ (_head, _separator, id) = response.headers[:location].rpartition("/")
37
37
  id
38
38
  end
39
39
 
@@ -41,7 +41,7 @@ module KeycloakAdmin
41
41
  if value.nil?
42
42
  ""
43
43
  elsif value.kind_of?(Array)
44
- "[#{value.map(&:to_json) * ','}]"
44
+ "[#{value.map(&:to_json) * ","}]"
45
45
  else
46
46
  value.to_json
47
47
  end
@@ -87,6 +87,10 @@ module KeycloakAdmin
87
87
  UserClient.new(@configuration, self)
88
88
  end
89
89
 
90
+ def attack_detections
91
+ AttackDetectionClient.new(@configuration, self)
92
+ end
93
+
90
94
  def identity_providers
91
95
  IdentityProviderClient.new(@configuration, self)
92
96
  end
@@ -20,15 +20,19 @@ module KeycloakAdmin
20
20
  user_representation
21
21
  end
22
22
 
23
- def update(user_id, user_representation_body)
24
- RestClient::Request.execute(
25
- @configuration.rest_client_options.merge(
26
- method: :put,
27
- url: users_url(user_id),
28
- payload: create_payload(user_representation_body),
29
- headers: headers
23
+ def update(user_id, payload = {})
24
+ raise ArgumentError.new("user_id must be defined") if user_id.nil?
25
+
26
+ user = UserRepresentation.new
27
+ user.first_name = payload[:name]
28
+ user.enabled = payload[:enabled]
29
+ user.attributes = payload[:attributes]
30
+ execute_http do
31
+ RestClient::Resource.new(users_url(user_id), @configuration.rest_client_options).put(
32
+ create_payload(user), headers
30
33
  )
31
- )
34
+ end
35
+ true
32
36
  end
33
37
 
34
38
  def add_group(user_id, group_id)
@@ -113,7 +117,7 @@ module KeycloakAdmin
113
117
  @configuration.rest_client_options.merge(
114
118
  method: :put,
115
119
  url: reset_password_url(user_id),
116
- payload: { type: 'password', value: new_password, temporary: false }.to_json,
120
+ payload: { type: "password", value: new_password, temporary: false }.to_json,
117
121
  headers: headers
118
122
  )
119
123
  )
@@ -125,10 +129,13 @@ module KeycloakAdmin
125
129
  execute_actions_email(user_id, ["UPDATE_PASSWORD"], lifespan)
126
130
  end
127
131
 
128
- def execute_actions_email(user_id, actions=[], lifespan=nil)
132
+ def execute_actions_email(user_id, actions=[], lifespan=nil, redirect_uri=nil, client_id=nil)
133
+ raise ArgumentError.new("client_id must be defined") if client_id.nil? && !redirect_uri.nil?
129
134
  execute_http do
130
- lifespan_param = lifespan.nil? ? "" : "lifespan=#{lifespan.seconds}"
131
- RestClient.put("#{execute_actions_email_url(user_id)}?#{lifespan_param}", create_payload(actions), headers)
135
+ lifespan_param = lifespan.nil? ? "" : "&lifespan=#{lifespan.seconds}"
136
+ redirect_uri_param = redirect_uri.nil? ? "" : "&redirect_uri=#{redirect_uri}"
137
+ client_id_param = client_id.nil? ? "" : "client_id=#{client_id}"
138
+ RestClient.put("#{execute_actions_email_url(user_id)}?#{client_id_param}#{redirect_uri_param}#{lifespan_param}", create_payload(actions), headers)
132
139
  end
133
140
  user_id
134
141
  end
@@ -148,6 +155,30 @@ module KeycloakAdmin
148
155
  ImpersonationRepresentation.from_response(response, @configuration.server_domain)
149
156
  end
150
157
 
158
+ def sessions(user_id)
159
+ raise ArgumentError.new("user_id must be defined") if user_id.nil?
160
+
161
+ response = execute_http do
162
+ RestClient::Resource.new("#{users_url(user_id)}/sessions", @configuration.rest_client_options).get(headers)
163
+ end
164
+ JSON.parse(response).map { |session_as_hash| SessionRepresentation.from_hash(session_as_hash) }
165
+ end
166
+
167
+ def logout(user_id)
168
+ raise ArgumentError.new("user_id must be defined") if user_id.nil?
169
+
170
+ execute_http do
171
+ RestClient::Request.execute(
172
+ @configuration.rest_client_options.merge(
173
+ method: :post,
174
+ url: logout_url(user_id),
175
+ headers: headers
176
+ )
177
+ )
178
+ end
179
+ true
180
+ end
181
+
151
182
  def get_redirect_impersonation(user_id)
152
183
  ImpersonationRedirectionRepresentation.from_url(impersonation_url(user_id), headers)
153
184
  end
@@ -214,6 +245,12 @@ module KeycloakAdmin
214
245
  "#{users_url(user_id)}/federated-identity/#{identity_provider}"
215
246
  end
216
247
 
248
+ def logout_url(user_id)
249
+ raise ArgumentError.new("user_id must be defined") if user_id.nil?
250
+
251
+ "#{users_url(user_id)}/logout"
252
+ end
253
+
217
254
  private
218
255
 
219
256
  def build(username, email, password, email_verified, locale, attributes={})
@@ -224,7 +261,7 @@ module KeycloakAdmin
224
261
  user.enabled = true
225
262
  user.attributes = attributes || {}
226
263
  user.attributes[:locale] = locale if locale
227
- user.add_credential(CredentialRepresentation.from_password(password))
264
+ user.add_credential(CredentialRepresentation.from_password(password)) if !password.nil?
228
265
  user
229
266
  end
230
267
  end
@@ -0,0 +1,17 @@
1
+ module KeycloakAdmin
2
+ class AttackDetectionRepresentation < Representation
3
+ attr_accessor :num_failures,
4
+ :disabled,
5
+ :last_ip_failure,
6
+ :last_failure
7
+
8
+ def self.from_hash(hash)
9
+ rep = new
10
+ rep.num_failures = hash["numFailures"]
11
+ rep.disabled = hash["disabled"]
12
+ rep.last_ip_failure = hash["lastIPFailure"]
13
+ rep.last_failure = hash["lastFailure"]
14
+ rep
15
+ end
16
+ end
17
+ end
@@ -6,9 +6,9 @@ module KeycloakAdmin
6
6
 
7
7
  def self.from_hash(hash)
8
8
  rep = new
9
- rep.identity_provider = hash['identityProvider']
10
- rep.user_id = hash['userId']
11
- rep.user_name = hash['userName']
9
+ rep.identity_provider = hash["identityProvider"]
10
+ rep.user_id = hash["userId"]
11
+ rep.user_name = hash["userName"]
12
12
  rep
13
13
  end
14
14
  end
@@ -0,0 +1,23 @@
1
+ module KeycloakAdmin
2
+ class SessionRepresentation < Representation
3
+ attr_accessor :id,
4
+ :username,
5
+ :user_id,
6
+ :ip_address,
7
+ :start,
8
+ :last_access,
9
+ :remember_me,
10
+
11
+ def self.from_hash(hash)
12
+ rep = new
13
+ rep.id = hash["id"]
14
+ rep.username = hash["username"]
15
+ rep.user_id = hash["userId"]
16
+ rep.ip_address = hash["ipAddress"]
17
+ rep.start = hash["start"]
18
+ rep.last_access = hash["lastAccess"]
19
+ rep.remember_me = hash["rememberMe"]
20
+ rep
21
+ end
22
+ end
23
+ end
@@ -10,7 +10,7 @@ module KeycloakAdmin
10
10
  end
11
11
 
12
12
  def resources_name
13
- raise NotImplementedError.new('must override in subclass')
13
+ raise NotImplementedError.new("must override in subclass")
14
14
  end
15
15
 
16
16
  def resource_url
@@ -1,3 +1,3 @@
1
1
  module KeycloakAdmin
2
- VERSION = "1.0.21"
2
+ VERSION = "1.0.22"
3
3
  end
@@ -13,6 +13,7 @@ require_relative "keycloak-admin/client/token_client"
13
13
  require_relative "keycloak-admin/client/user_client"
14
14
  require_relative "keycloak-admin/client/identity_provider_client"
15
15
  require_relative "keycloak-admin/client/configurable_token_client"
16
+ require_relative "keycloak-admin/client/attack_detection_client"
16
17
  require_relative "keycloak-admin/representation/camel_json"
17
18
  require_relative "keycloak-admin/representation/representation"
18
19
  require_relative "keycloak-admin/representation/protocol_mapper_representation"
@@ -28,6 +29,8 @@ require_relative "keycloak-admin/representation/federated_identity_representatio
28
29
  require_relative "keycloak-admin/representation/user_representation"
29
30
  require_relative "keycloak-admin/representation/identity_provider_mapper_representation"
30
31
  require_relative "keycloak-admin/representation/identity_provider_representation"
32
+ require_relative "keycloak-admin/representation/attack_detection_representation"
33
+ require_relative "keycloak-admin/representation/session_representation"
31
34
  require_relative "keycloak-admin/resource/base_role_containing_resource"
32
35
  require_relative "keycloak-admin/resource/group_resource"
33
36
  require_relative "keycloak-admin/resource/user_resource"
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe KeycloakAdmin::AttackDetectionClient do
4
+ describe "#initialize" do
5
+ let(:realm_name) { nil }
6
+ before(:each) do
7
+ @realm = KeycloakAdmin.realm(realm_name)
8
+ end
9
+ context "when realm_name is defined" do
10
+ let(:realm_name) { "master" }
11
+ it "does not raise any error" do
12
+ expect { @realm.attack_detections }.to_not raise_error
13
+ end
14
+ end
15
+
16
+ context "when realm_name is not defined" do
17
+ it "raise argument error" do
18
+ expect { @realm.attack_detections }.to raise_error(ArgumentError)
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "#lock_status" do
24
+ let(:realm_name) { "valid-realm" }
25
+ before(:each) do
26
+ @attack_detections = KeycloakAdmin.realm(realm_name).attack_detections
27
+ stub_token_client
28
+ allow_any_instance_of(RestClient::Resource).to receive(:get).and_return '{"numFailures":1,"disabled":true, "lastFailure":123456}'
29
+ end
30
+
31
+ context "when user_id is defined" do
32
+ let(:user_id) { "test_user_id" }
33
+ it "returns lock details" do
34
+ response = @attack_detections.lock_status(user_id)
35
+ expect(response.num_failures).to eq 1
36
+ end
37
+ end
38
+
39
+ context "when user_id is not defined" do
40
+ let(:user_id) { nil }
41
+ it "raise argument error" do
42
+ expect { @attack_detections.lock_status(user_id) }.to raise_error(ArgumentError)
43
+ end
44
+ end
45
+ end
46
+
47
+ describe "#unlock_user" do
48
+ let(:realm_name) { "valid-realm" }
49
+ before(:each) do
50
+ @attack_detections = KeycloakAdmin.realm(realm_name).attack_detections
51
+ stub_token_client
52
+ allow_any_instance_of(RestClient::Resource).to receive(:delete)
53
+ end
54
+
55
+ context "when user_id is defined" do
56
+ let(:user_id) { "test_user_id" }
57
+ it "returns true" do
58
+ expect(@attack_detections.unlock_user(user_id)).to be_truthy
59
+ end
60
+ end
61
+
62
+ context "when user_id is not defined" do
63
+ let(:user_id) { nil }
64
+ it "raise argument error" do
65
+ expect { @attack_detections.unlock_user(user_id) }.to raise_error(ArgumentError)
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "#unlock_users" do
71
+ let(:realm_name) { "valid-realm" }
72
+ before(:each) do
73
+ @attack_detections = KeycloakAdmin.realm(realm_name).attack_detections
74
+ stub_token_client
75
+ allow_any_instance_of(RestClient::Resource).to receive(:delete)
76
+ end
77
+ it "returns true" do
78
+ expect(@attack_detections.unlock_users).to be_truthy
79
+ end
80
+ end
81
+
82
+ describe "#brute_force_url" do
83
+ let(:realm_name) { "valid-realm" }
84
+ let(:user_id) { nil }
85
+ before(:each) do
86
+ @attack_detections_url = KeycloakAdmin.realm(realm_name).attack_detections.brute_force_url(user_id)
87
+ end
88
+
89
+ context "when user_id is defined" do
90
+ let(:user_id) { "95985b21-d884-4bbd-b852-cb8cd365afc2" }
91
+ it "returns user specific url" do
92
+ expect(@attack_detections_url).to eq "http://auth.service.io/auth/admin/realms/valid-realm/attack-detection/brute-force/users/#{user_id}"
93
+ end
94
+ end
95
+
96
+ context "when user_id is not defined" do
97
+ it "returns url without user" do
98
+ expect(@attack_detections_url).to eq "http://auth.service.io/auth/admin/realms/valid-realm/attack-detection/brute-force/users"
99
+ end
100
+ end
101
+ end
102
+ end
@@ -282,4 +282,81 @@ RSpec.describe KeycloakAdmin::TokenClient do
282
282
  @user_client.delete('test_user_id')
283
283
  end
284
284
  end
285
+
286
+ describe '#update' do
287
+ let(:realm_name) { 'valid-realm' }
288
+ before(:each) do
289
+ @user_client = KeycloakAdmin.realm(realm_name).users
290
+
291
+ stub_token_client
292
+ allow_any_instance_of(RestClient::Resource).to receive(:put)
293
+ end
294
+
295
+ context 'when user_id is defined' do
296
+ let(:user_id) { '95985b21-d884-4bbd-b852-cb8cd365afc2' }
297
+
298
+ it 'updates the user details' do
299
+ response = @user_client.update(user_id, { name: 'Test', enabled: false })
300
+ expect(response).to be_truthy
301
+ end
302
+ end
303
+
304
+ context 'when user_id is not defined' do
305
+ let(:user_id) { '95985b21-d884-4bbd-b852-cb8cd365afc2' }
306
+
307
+ let(:user_id) { nil }
308
+ it 'raise argument error' do
309
+ expect { @user_client.update(user_id, { name: 'Test', enabled: false }) }.to raise_error(ArgumentError)
310
+ end
311
+ end
312
+ end
313
+
314
+ describe '#sessions' do
315
+ let(:realm_name) { "valid-realm" }
316
+
317
+ before(:each) do
318
+ @user_client = KeycloakAdmin.realm(realm_name).users
319
+ stub_token_client
320
+ allow_any_instance_of(RestClient::Resource).to receive(:get).and_return '[{"id":"95985b21-d884-4bbd-b852-dsfsdfsd","username":"test_username", "ip_address":"0.0.0.0"}]'
321
+ end
322
+
323
+ context 'when user_id is defined' do
324
+ let(:user_id) { '95985b21-d884-4bbd-b852-cb8cd365afc2' }
325
+ it 'returns list of active sessions' do
326
+ response = @user_client.sessions(user_id)
327
+ expect(response[0].id).to eq '95985b21-d884-4bbd-b852-dsfsdfsd'
328
+ end
329
+ end
330
+
331
+ context 'when user_id is not defined' do
332
+ let(:user_id) { nil }
333
+ it 'raise argument error' do
334
+ expect { @user_client.sessions(user_id) }.to raise_error(ArgumentError)
335
+ end
336
+ end
337
+ end
338
+
339
+ describe '#logout' do
340
+ let(:realm_name) { 'valid-realm' }
341
+
342
+ before(:each) do
343
+ @user_client = KeycloakAdmin.realm(realm_name).users
344
+ stub_token_client
345
+ allow_any_instance_of(RestClient::Request).to receive(:execute)
346
+ end
347
+
348
+ context 'when user_id is defined' do
349
+ let(:user_id) { '95985b21-d884-4bbd-b852-cb8cd365afc2' }
350
+ it 'logout user and return true' do
351
+ expect(@user_client.logout(user_id)).to be_truthy
352
+ end
353
+ end
354
+
355
+ context 'when user_id is not defined' do
356
+ let(:user_id) { nil }
357
+ it 'raise argument error' do
358
+ expect { @user_client.logout(user_id) }.to raise_error(ArgumentError)
359
+ end
360
+ end
361
+ end
285
362
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe KeycloakAdmin::AttackDetectionRepresentation do
4
+ describe '.from_hash' do
5
+ it 'converts json response to class structure' do
6
+ rep = described_class.from_hash({
7
+ 'numFailures' => 2,
8
+ 'disabled' => true,
9
+ 'lastIPFailure' => 12345,
10
+ 'last_failure' => 12345678
11
+ })
12
+ expect(rep.num_failures).to eq 2
13
+ expect(rep).to be_a described_class
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe KeycloakAdmin::SessionRepresentation do
4
+ describe '.from_hash' do
5
+ it 'converts json response to class structure' do
6
+ rep = described_class.from_hash({
7
+ 'username' => 'test_username',
8
+ 'userId' => '95985b21-d884-4bbd-b852-cb8cd365afc2',
9
+ 'ipAddress' => '1.1.1.1',
10
+ 'start' => 12345678
11
+ })
12
+ expect(rep.user_id).to eq '95985b21-d884-4bbd-b852-cb8cd365afc2'
13
+ expect(rep).to be_a described_class
14
+ end
15
+ end
16
+ end
data/spec/spec_helper.rb CHANGED
@@ -23,8 +23,8 @@ end
23
23
 
24
24
  def stub_token_client
25
25
  allow_any_instance_of(KeycloakAdmin::TokenClient).to receive(:get).and_return KeycloakAdmin::TokenRepresentation.new(
26
- 'test_access_token', 'token_type', 'expires_in', 'refresh_token',
27
- 'refresh_expires_in', 'id_token', 'not_before_policy', 'session_state'
26
+ "test_access_token", "token_type", "expires_in", "refresh_token",
27
+ "refresh_expires_in", "id_token", "not_before_policy", "session_state"
28
28
  )
29
29
  end
30
30
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keycloak-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.21
4
+ version: 1.0.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lorent Lempereur
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-03 00:00:00.000000000 Z
11
+ date: 2023-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http-cookie
@@ -89,6 +89,7 @@ files:
89
89
  - README.md
90
90
  - keycloak-admin.gemspec
91
91
  - lib/keycloak-admin.rb
92
+ - lib/keycloak-admin/client/attack_detection_client.rb
92
93
  - lib/keycloak-admin/client/client.rb
93
94
  - lib/keycloak-admin/client/client_client.rb
94
95
  - lib/keycloak-admin/client/client_role_client.rb
@@ -102,6 +103,7 @@ files:
102
103
  - lib/keycloak-admin/client/token_client.rb
103
104
  - lib/keycloak-admin/client/user_client.rb
104
105
  - lib/keycloak-admin/configuration.rb
106
+ - lib/keycloak-admin/representation/attack_detection_representation.rb
105
107
  - lib/keycloak-admin/representation/camel_json.rb
106
108
  - lib/keycloak-admin/representation/client_representation.rb
107
109
  - lib/keycloak-admin/representation/credential_representation.rb
@@ -115,12 +117,14 @@ files:
115
117
  - lib/keycloak-admin/representation/realm_representation.rb
116
118
  - lib/keycloak-admin/representation/representation.rb
117
119
  - lib/keycloak-admin/representation/role_representation.rb
120
+ - lib/keycloak-admin/representation/session_representation.rb
118
121
  - lib/keycloak-admin/representation/token_representation.rb
119
122
  - lib/keycloak-admin/representation/user_representation.rb
120
123
  - lib/keycloak-admin/resource/base_role_containing_resource.rb
121
124
  - lib/keycloak-admin/resource/group_resource.rb
122
125
  - lib/keycloak-admin/resource/user_resource.rb
123
126
  - lib/keycloak-admin/version.rb
127
+ - spec/client/attack_detection_client_spec.rb
124
128
  - spec/client/client_client_spec.rb
125
129
  - spec/client/client_role_mappings_client_spec.rb
126
130
  - spec/client/client_spec.rb
@@ -133,6 +137,7 @@ files:
133
137
  - spec/client/token_client_spec.rb
134
138
  - spec/client/user_client_spec.rb
135
139
  - spec/configuration_spec.rb
140
+ - spec/representation/attack_detection_representation_spec.rb
136
141
  - spec/representation/client_representation_spec.rb
137
142
  - spec/representation/group_representation_spec.rb
138
143
  - spec/representation/identity_provider_mapper_representation_spec.rb
@@ -140,6 +145,7 @@ files:
140
145
  - spec/representation/impersonation_representation_spec.rb
141
146
  - spec/representation/protocol_mapper_representation_spec.rb
142
147
  - spec/representation/role_representation_spec.rb
148
+ - spec/representation/session_representation_spec.rb
143
149
  - spec/representation/user_representation_spec.rb
144
150
  - spec/resource/group_resource_spec.rb
145
151
  - spec/resource/user_resource_spec.rb
@@ -148,7 +154,7 @@ homepage: https://github.com/looorent/keycloak-admin-ruby
148
154
  licenses:
149
155
  - MIT
150
156
  metadata: {}
151
- post_install_message:
157
+ post_install_message:
152
158
  rdoc_options: []
153
159
  require_paths:
154
160
  - lib
@@ -163,8 +169,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
169
  - !ruby/object:Gem::Version
164
170
  version: '0'
165
171
  requirements: []
166
- rubygems_version: 3.0.3.1
167
- signing_key:
172
+ rubygems_version: 3.4.10
173
+ signing_key:
168
174
  specification_version: 4
169
175
  summary: Keycloak Admin REST API client written in Ruby
170
176
  test_files: []