castle-rb 7.2.0 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/lib/castle/api/authenticate.rb +3 -12
  3. data/lib/castle/api/end_impersonation.rb +1 -3
  4. data/lib/castle/api/filter.rb +2 -10
  5. data/lib/castle/api/log.rb +2 -10
  6. data/lib/castle/api/risk.rb +2 -10
  7. data/lib/castle/api/start_impersonation.rb +1 -3
  8. data/lib/castle/api/track.rb +1 -3
  9. data/lib/castle/client.rb +1 -5
  10. data/lib/castle/commands/log.rb +1 -5
  11. data/lib/castle/commands/risk.rb +1 -5
  12. data/lib/castle/configuration.rb +2 -5
  13. data/lib/castle/core/process_response.rb +4 -3
  14. data/lib/castle/core/send_request.rb +1 -3
  15. data/lib/castle/errors.rb +4 -0
  16. data/lib/castle/headers/extract.rb +1 -3
  17. data/lib/castle/headers/filter.rb +2 -3
  18. data/lib/castle/payload/prepare.rb +1 -2
  19. data/lib/castle/session.rb +1 -1
  20. data/lib/castle/version.rb +1 -1
  21. data/lib/castle.rb +1 -3
  22. data/spec/integration/rails/rails_spec.rb +9 -3
  23. data/spec/integration/rails/support/application.rb +2 -2
  24. data/spec/integration/rails/support/home_controller.rb +4 -30
  25. data/spec/lib/castle/api/approve_device_spec.rb +2 -6
  26. data/spec/lib/castle/api/authenticate_spec.rb +22 -25
  27. data/spec/lib/castle/api/end_impersonation_spec.rb +8 -14
  28. data/spec/lib/castle/api/get_device_spec.rb +1 -3
  29. data/spec/lib/castle/api/get_devices_for_user_spec.rb +1 -3
  30. data/spec/lib/castle/api/report_device_spec.rb +2 -6
  31. data/spec/lib/castle/api/start_impersonation_spec.rb +8 -14
  32. data/spec/lib/castle/api/track_spec.rb +9 -16
  33. data/spec/lib/castle/client_id/extract_spec.rb +2 -9
  34. data/spec/lib/castle/client_spec.rb +32 -78
  35. data/spec/lib/castle/command_spec.rb +3 -3
  36. data/spec/lib/castle/commands/approve_device_spec.rb +2 -2
  37. data/spec/lib/castle/commands/authenticate_spec.rb +17 -24
  38. data/spec/lib/castle/commands/end_impersonation_spec.rb +14 -21
  39. data/spec/lib/castle/commands/filter_spec.rb +15 -15
  40. data/spec/lib/castle/commands/get_device_spec.rb +2 -2
  41. data/spec/lib/castle/commands/get_devices_for_user_spec.rb +2 -2
  42. data/spec/lib/castle/commands/log_spec.rb +15 -15
  43. data/spec/lib/castle/commands/report_device_spec.rb +2 -2
  44. data/spec/lib/castle/commands/risk_spec.rb +15 -15
  45. data/spec/lib/castle/commands/start_impersonation_spec.rb +14 -21
  46. data/spec/lib/castle/commands/track_spec.rb +19 -24
  47. data/spec/lib/castle/configuration_spec.rb +1 -1
  48. data/spec/lib/castle/context/get_default_spec.rb +9 -8
  49. data/spec/lib/castle/context/prepare_spec.rb +3 -4
  50. data/spec/lib/castle/core/process_response_spec.rb +3 -6
  51. data/spec/lib/castle/core/process_webhook_spec.rb +12 -6
  52. data/spec/lib/castle/core/send_request_spec.rb +7 -11
  53. data/spec/lib/castle/failover/strategy_spec.rb +5 -5
  54. data/spec/lib/castle/headers/extract_spec.rb +1 -1
  55. data/spec/lib/castle/headers/filter_spec.rb +6 -3
  56. data/spec/lib/castle/headers/format_spec.rb +5 -5
  57. data/spec/lib/castle/ips/extract_spec.rb +2 -6
  58. data/spec/lib/castle/logger_spec.rb +2 -1
  59. data/spec/lib/castle/payload/prepare_spec.rb +4 -7
  60. data/spec/lib/castle/secure_mode_spec.rb +1 -3
  61. data/spec/lib/castle/session_spec.rb +1 -5
  62. data/spec/lib/castle/singleton_configuration_spec.rb +1 -1
  63. data/spec/lib/castle/utils/clone_spec.rb +1 -1
  64. data/spec/lib/castle/utils/merge_spec.rb +2 -4
  65. data/spec/lib/castle/validators/not_supported_spec.rb +1 -6
  66. data/spec/lib/castle/validators/present_spec.rb +2 -9
  67. data/spec/lib/castle/verdict_spec.rb +3 -3
  68. data/spec/lib/castle/webhooks/verify_spec.rb +12 -6
  69. data/spec/lib/castle_spec.rb +5 -7
  70. data/spec/support/shared_examples/action_request.rb +16 -34
  71. data/spec/support/shared_examples/configuration.rb +14 -16
  72. metadata +48 -48
@@ -19,13 +19,19 @@ describe Castle::Webhooks::Verify do
19
19
  device_token: 'token',
20
20
  user_id: user_id,
21
21
  trigger: '$login.succeeded',
22
- context: {},
23
- location: {},
24
- user_agent: {}
22
+ context: {
23
+ },
24
+ location: {
25
+ },
26
+ user_agent: {
27
+ }
25
28
  },
26
- user_traits: {},
27
- properties: {},
28
- policy: {}
29
+ user_traits: {
30
+ },
31
+ properties: {
32
+ },
33
+ policy: {
34
+ }
29
35
  }.to_json
30
36
  end
31
37
 
@@ -4,7 +4,7 @@ describe Castle do
4
4
  subject(:castle) { described_class }
5
5
 
6
6
  describe 'config' do
7
- it { expect(castle.config).to be_kind_of(Castle::Configuration) }
7
+ it { expect(castle.config).to be_a(Castle::Configuration) }
8
8
  end
9
9
 
10
10
  describe 'api_secret setter' do
@@ -12,7 +12,7 @@ describe Castle do
12
12
 
13
13
  before { castle.api_secret = value }
14
14
 
15
- it { expect(castle.config.api_secret).to be_eql(value) }
15
+ it { expect(castle.config.api_secret).to eql(value) }
16
16
  end
17
17
 
18
18
  describe 'configure' do
@@ -20,8 +20,8 @@ describe Castle do
20
20
  let(:timeout) { 60 }
21
21
 
22
22
  shared_examples 'config_setup' do
23
- it { expect(castle.config.api_secret).to be_eql(value) }
24
- it { expect(castle.config.request_timeout).to be_eql(timeout) }
23
+ it { expect(castle.config.api_secret).to eql(value) }
24
+ it { expect(castle.config.request_timeout).to eql(timeout) }
25
25
  end
26
26
 
27
27
  context 'with block' do
@@ -52,9 +52,7 @@ describe Castle do
52
52
  let(:value) { 'new_secret' }
53
53
 
54
54
  it do
55
- expect { castle.configure { |config| config.wrong_config = value } }.to raise_error(
56
- Castle::ConfigurationError
57
- )
55
+ expect { castle.configure { |config| config.wrong_config = value } }.to raise_error(Castle::ConfigurationError)
58
56
  end
59
57
  end
60
58
  end
@@ -4,14 +4,7 @@ RSpec.shared_examples_for 'action request' do |action|
4
4
  subject(:request_response) { client.send(action.to_sym, options) }
5
5
 
6
6
  let(:options) do
7
- {
8
- request_token: request_token,
9
- event: event,
10
- status: status,
11
- user: user,
12
- context: context,
13
- properties: properties
14
- }
7
+ { request_token: request_token, event: event, status: status, user: user, context: context, properties: properties }
15
8
  end
16
9
  let(:request_token) { '7e51335b-f4bc-4bc7-875d-b713fb61eb23-bf021a3022a1a302' }
17
10
  let(:event) { '$login' }
@@ -104,19 +97,15 @@ RSpec.shared_examples_for 'action request' do |action|
104
97
  end
105
98
 
106
99
  it { assert_not_requested :post, "https://api.castle.io/v1/#{action}" }
107
- it { expect(request_response[:policy][:action]).to be_eql(Castle::Verdict::ALLOW) }
108
- it { expect(request_response[:action]).to be_eql(Castle::Verdict::ALLOW) }
109
- it { expect(request_response[:user_id]).to be_eql('1234') }
100
+ it { expect(request_response[:policy][:action]).to eql(Castle::Verdict::ALLOW) }
101
+ it { expect(request_response[:action]).to eql(Castle::Verdict::ALLOW) }
102
+ it { expect(request_response[:user_id]).to eql('1234') }
110
103
  it { expect(request_response[:failover]).to be true }
111
- it { expect(request_response[:failover_reason]).to be_eql('Castle is set to do not track.') }
104
+ it { expect(request_response[:failover_reason]).to eql('Castle is set to do not track.') }
112
105
  end
113
106
 
114
107
  context 'when request with fail' do
115
- before do
116
- allow(Castle::API).to receive(:send_request).and_raise(
117
- Castle::RequestError.new(Timeout::Error)
118
- )
119
- end
108
+ before { allow(Castle::API).to receive(:send_request).and_raise(Castle::RequestError.new(Timeout::Error)) }
120
109
 
121
110
  context 'with request error and throw strategy' do
122
111
  before { allow(Castle.config).to receive(:failover_strategy).and_return(:throw) }
@@ -126,11 +115,11 @@ RSpec.shared_examples_for 'action request' do |action|
126
115
 
127
116
  context 'with request error and not throw on eg deny strategy' do
128
117
  it { assert_not_requested :post, "https:/:secret@api.castle.io/v1/#{action}" }
129
- it { expect(request_response[:policy][:action]).to be_eql('allow') }
130
- it { expect(request_response[:action]).to be_eql('allow') }
131
- it { expect(request_response[:user_id]).to be_eql('1234') }
118
+ it { expect(request_response[:policy][:action]).to eql('allow') }
119
+ it { expect(request_response[:action]).to eql('allow') }
120
+ it { expect(request_response[:user_id]).to eql('1234') }
132
121
  it { expect(request_response[:failover]).to be true }
133
- it { expect(request_response[:failover_reason]).to be_eql('Castle::RequestError') }
122
+ it { expect(request_response[:failover_reason]).to eql('Castle::RequestError') }
134
123
  end
135
124
  end
136
125
 
@@ -145,11 +134,11 @@ RSpec.shared_examples_for 'action request' do |action|
145
134
 
146
135
  describe 'not throw on eg deny strategy' do
147
136
  it { assert_not_requested :post, "https:/:secret@api.castle.io/v1/#{action}" }
148
- it { expect(request_response[:policy][:action]).to be_eql('allow') }
149
- it { expect(request_response[:action]).to be_eql('allow') }
150
- it { expect(request_response[:user_id]).to be_eql('1234') }
137
+ it { expect(request_response[:policy][:action]).to eql('allow') }
138
+ it { expect(request_response[:action]).to eql('allow') }
139
+ it { expect(request_response[:user_id]).to eql('1234') }
151
140
  it { expect(request_response[:failover]).to be true }
152
- it { expect(request_response[:failover_reason]).to be_eql('Castle::InternalServerError') }
141
+ it { expect(request_response[:failover_reason]).to eql('Castle::InternalServerError') }
153
142
  end
154
143
  end
155
144
 
@@ -158,9 +147,7 @@ RSpec.shared_examples_for 'action request' do |action|
158
147
  let(:response_body) { { type: 'bad_request', message: 'wrong params' }.to_json }
159
148
  let(:response_code) { 422 }
160
149
 
161
- it do
162
- expect { request_response }.to raise_error(Castle::InvalidParametersError, 'wrong params')
163
- end
150
+ it { expect { request_response }.to raise_error(Castle::InvalidParametersError, 'wrong params') }
164
151
  end
165
152
 
166
153
  describe 'throw InvalidParametersError for legacy endpoints' do
@@ -174,12 +161,7 @@ RSpec.shared_examples_for 'action request' do |action|
174
161
  let(:response_body) { { type: 'invalid_request_token', message: 'invalid token' }.to_json }
175
162
  let(:response_code) { 422 }
176
163
 
177
- it do
178
- expect { request_response }.to raise_error(
179
- Castle::InvalidRequestTokenError,
180
- 'invalid token'
181
- )
182
- end
164
+ it { expect { request_response }.to raise_error(Castle::InvalidRequestTokenError, 'invalid token') }
183
165
  end
184
166
  end
185
167
  end
@@ -3,69 +3,67 @@
3
3
  shared_examples 'configuration_host' do
4
4
  describe 'host' do
5
5
  context 'with default' do
6
- it { expect(config.base_url.host).to be_eql('api.castle.io') }
6
+ it { expect(config.base_url.host).to eql('api.castle.io') }
7
7
  end
8
8
 
9
9
  context 'with setter' do
10
10
  before { config.base_url = 'http://api.castle.dev/v2' }
11
11
 
12
- it { expect(config.base_url.host).to be_eql('api.castle.dev') }
12
+ it { expect(config.base_url.host).to eql('api.castle.dev') }
13
13
  end
14
14
  end
15
15
  end
16
16
 
17
17
  shared_examples 'configuration_request_timeout' do
18
18
  describe 'request_timeout' do
19
- it { expect(config.request_timeout).to be_eql(1000) }
19
+ it { expect(config.request_timeout).to be(1000) }
20
20
 
21
21
  context 'with setter' do
22
22
  let(:value) { 50.0 }
23
23
 
24
24
  before { config.request_timeout = value }
25
25
 
26
- it { expect(config.request_timeout).to be_eql(value) }
26
+ it { expect(config.request_timeout).to eql(value) }
27
27
  end
28
28
  end
29
29
  end
30
30
 
31
31
  shared_examples 'configuration_allowlisted' do
32
32
  describe 'allowlisted' do
33
- it { expect(config.allowlisted.size).to be_eql(0) }
33
+ it { expect(config.allowlisted.size).to be(0) }
34
34
 
35
35
  context 'with setter' do
36
36
  before { config.allowlisted = ['header'] }
37
37
 
38
- it { expect(config.allowlisted).to be_eql(['Header']) }
38
+ it { expect(config.allowlisted).to eql(['Header']) }
39
39
  end
40
40
  end
41
41
  end
42
42
 
43
43
  shared_examples 'configuration_denylisted' do
44
44
  describe 'denylisted' do
45
- it { expect(config.denylisted.size).to be_eql(0) }
45
+ it { expect(config.denylisted.size).to be(0) }
46
46
 
47
47
  context 'with setter' do
48
48
  before { config.denylisted = ['header'] }
49
49
 
50
- it { expect(config.denylisted).to be_eql(['Header']) }
50
+ it { expect(config.denylisted).to eql(['Header']) }
51
51
  end
52
52
  end
53
53
  end
54
54
 
55
55
  shared_examples 'configuration_failover_strategy' do
56
56
  describe 'failover_strategy' do
57
- it { expect(config.failover_strategy).to be_eql(Castle::Failover::Strategy::ALLOW) }
57
+ it { expect(config.failover_strategy).to eql(Castle::Failover::Strategy::ALLOW) }
58
58
 
59
59
  context 'with setter' do
60
60
  before { config.failover_strategy = Castle::Failover::Strategy::DENY }
61
61
 
62
- it { expect(config.failover_strategy).to be_eql(Castle::Failover::Strategy::DENY) }
62
+ it { expect(config.failover_strategy).to eql(Castle::Failover::Strategy::DENY) }
63
63
  end
64
64
 
65
65
  context 'when broken' do
66
- it do
67
- expect { config.failover_strategy = :unicorn }.to raise_error(Castle::ConfigurationError)
68
- end
66
+ it { expect { config.failover_strategy = :unicorn }.to raise_error(Castle::ConfigurationError) }
69
67
  end
70
68
  end
71
69
  end
@@ -81,12 +79,12 @@ shared_examples 'configuration_api_secret' do
81
79
  config.reset
82
80
  end
83
81
 
84
- it { expect(config.api_secret).to be_eql(secret_key_env) }
82
+ it { expect(config.api_secret).to eql(secret_key_env) }
85
83
 
86
84
  context 'when key is overwritten' do
87
85
  before { config.api_secret = secret_key }
88
86
 
89
- it { expect(config.api_secret).to be_eql(secret_key) }
87
+ it { expect(config.api_secret).to eql(secret_key) }
90
88
  end
91
89
  end
92
90
 
@@ -95,7 +93,7 @@ shared_examples 'configuration_api_secret' do
95
93
 
96
94
  before { config.api_secret = value }
97
95
 
98
- it { expect(config.api_secret).to be_eql(value) }
96
+ it { expect(config.api_secret).to eql(value) }
99
97
  end
100
98
  end
101
99
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: castle-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.2.0
4
+ version: 8.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johan Brissmyr
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-14 00:00:00.000000000 Z
11
+ date: 2024-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: appraisal
@@ -170,78 +170,78 @@ required_ruby_version: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - ">="
172
172
  - !ruby/object:Gem::Version
173
- version: '2.4'
173
+ version: '2.7'
174
174
  required_rubygems_version: !ruby/object:Gem::Requirement
175
175
  requirements:
176
176
  - - ">="
177
177
  - !ruby/object:Gem::Version
178
178
  version: '0'
179
179
  requirements: []
180
- rubygems_version: 3.2.27
180
+ rubygems_version: 3.5.17
181
181
  signing_key:
182
182
  specification_version: 4
183
183
  summary: Castle
184
184
  test_files:
185
- - spec/spec_helper.rb
186
- - spec/integration/rails/support/application.rb
185
+ - spec/integration/rails/rails_spec.rb
187
186
  - spec/integration/rails/support/all.rb
187
+ - spec/integration/rails/support/application.rb
188
188
  - spec/integration/rails/support/home_controller.rb
189
- - spec/integration/rails/rails_spec.rb
190
- - spec/support/shared_examples/action_request.rb
191
- - spec/support/shared_examples/configuration.rb
192
- - spec/lib/castle_spec.rb
193
- - spec/lib/castle/session_spec.rb
194
- - spec/lib/castle/verdict_spec.rb
189
+ - spec/lib/castle/api/approve_device_spec.rb
190
+ - spec/lib/castle/api/authenticate_spec.rb
191
+ - spec/lib/castle/api/end_impersonation_spec.rb
192
+ - spec/lib/castle/api/filter_spec.rb
193
+ - spec/lib/castle/api/get_device_spec.rb
194
+ - spec/lib/castle/api/get_devices_for_user_spec.rb
195
+ - spec/lib/castle/api/log_spec.rb
196
+ - spec/lib/castle/api/report_device_spec.rb
197
+ - spec/lib/castle/api/risk_spec.rb
198
+ - spec/lib/castle/api/start_impersonation_spec.rb
199
+ - spec/lib/castle/api/track_spec.rb
200
+ - spec/lib/castle/api_spec.rb
201
+ - spec/lib/castle/client_id/extract_spec.rb
195
202
  - spec/lib/castle/client_spec.rb
203
+ - spec/lib/castle/command_spec.rb
204
+ - spec/lib/castle/commands/approve_device_spec.rb
205
+ - spec/lib/castle/commands/authenticate_spec.rb
206
+ - spec/lib/castle/commands/end_impersonation_spec.rb
207
+ - spec/lib/castle/commands/filter_spec.rb
208
+ - spec/lib/castle/commands/get_device_spec.rb
209
+ - spec/lib/castle/commands/get_devices_for_user_spec.rb
210
+ - spec/lib/castle/commands/log_spec.rb
211
+ - spec/lib/castle/commands/report_device_spec.rb
212
+ - spec/lib/castle/commands/risk_spec.rb
213
+ - spec/lib/castle/commands/start_impersonation_spec.rb
214
+ - spec/lib/castle/commands/track_spec.rb
215
+ - spec/lib/castle/configuration_spec.rb
196
216
  - spec/lib/castle/context/get_default_spec.rb
217
+ - spec/lib/castle/context/merge_spec.rb
197
218
  - spec/lib/castle/context/prepare_spec.rb
198
219
  - spec/lib/castle/context/sanitize_spec.rb
199
- - spec/lib/castle/context/merge_spec.rb
200
220
  - spec/lib/castle/core/get_connection_spec.rb
221
+ - spec/lib/castle/core/process_response_spec.rb
201
222
  - spec/lib/castle/core/process_webhook_spec.rb
202
223
  - spec/lib/castle/core/send_request_spec.rb
203
- - spec/lib/castle/core/process_response_spec.rb
224
+ - spec/lib/castle/failover/strategy_spec.rb
225
+ - spec/lib/castle/headers/extract_spec.rb
226
+ - spec/lib/castle/headers/filter_spec.rb
227
+ - spec/lib/castle/headers/format_spec.rb
204
228
  - spec/lib/castle/ips/extract_spec.rb
205
- - spec/lib/castle/api_spec.rb
206
229
  - spec/lib/castle/logger_spec.rb
207
- - spec/lib/castle/client_id/extract_spec.rb
208
- - spec/lib/castle/configuration_spec.rb
209
- - spec/lib/castle/version_spec.rb
210
230
  - spec/lib/castle/payload/prepare_spec.rb
231
+ - spec/lib/castle/secure_mode_spec.rb
232
+ - spec/lib/castle/session_spec.rb
233
+ - spec/lib/castle/singleton_configuration_spec.rb
211
234
  - spec/lib/castle/utils/clean_invalid_chars_spec.rb
235
+ - spec/lib/castle/utils/clone_spec.rb
212
236
  - spec/lib/castle/utils/deep_symbolize_keys_spec.rb
213
237
  - spec/lib/castle/utils/get_timestamp_spec.rb
214
- - spec/lib/castle/utils/clone_spec.rb
215
238
  - spec/lib/castle/utils/merge_spec.rb
216
- - spec/lib/castle/command_spec.rb
217
- - spec/lib/castle/headers/format_spec.rb
218
- - spec/lib/castle/headers/extract_spec.rb
219
- - spec/lib/castle/headers/filter_spec.rb
220
- - spec/lib/castle/api/report_device_spec.rb
221
- - spec/lib/castle/api/authenticate_spec.rb
222
- - spec/lib/castle/api/track_spec.rb
223
- - spec/lib/castle/api/get_device_spec.rb
224
- - spec/lib/castle/api/risk_spec.rb
225
- - spec/lib/castle/api/start_impersonation_spec.rb
226
- - spec/lib/castle/api/log_spec.rb
227
- - spec/lib/castle/api/approve_device_spec.rb
228
- - spec/lib/castle/api/get_devices_for_user_spec.rb
229
- - spec/lib/castle/api/end_impersonation_spec.rb
230
- - spec/lib/castle/api/filter_spec.rb
231
- - spec/lib/castle/commands/report_device_spec.rb
232
- - spec/lib/castle/commands/authenticate_spec.rb
233
- - spec/lib/castle/commands/track_spec.rb
234
- - spec/lib/castle/commands/get_device_spec.rb
235
- - spec/lib/castle/commands/risk_spec.rb
236
- - spec/lib/castle/commands/start_impersonation_spec.rb
237
- - spec/lib/castle/commands/log_spec.rb
238
- - spec/lib/castle/commands/approve_device_spec.rb
239
- - spec/lib/castle/commands/get_devices_for_user_spec.rb
240
- - spec/lib/castle/commands/end_impersonation_spec.rb
241
- - spec/lib/castle/commands/filter_spec.rb
242
239
  - spec/lib/castle/validators/not_supported_spec.rb
243
240
  - spec/lib/castle/validators/present_spec.rb
241
+ - spec/lib/castle/verdict_spec.rb
242
+ - spec/lib/castle/version_spec.rb
244
243
  - spec/lib/castle/webhooks/verify_spec.rb
245
- - spec/lib/castle/failover/strategy_spec.rb
246
- - spec/lib/castle/secure_mode_spec.rb
247
- - spec/lib/castle/singleton_configuration_spec.rb
244
+ - spec/lib/castle_spec.rb
245
+ - spec/spec_helper.rb
246
+ - spec/support/shared_examples/action_request.rb
247
+ - spec/support/shared_examples/configuration.rb