castle-rb 7.2.0 → 8.0.0
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/lib/castle/api/authenticate.rb +3 -12
- data/lib/castle/api/end_impersonation.rb +1 -3
- data/lib/castle/api/filter.rb +2 -10
- data/lib/castle/api/log.rb +2 -10
- data/lib/castle/api/risk.rb +2 -10
- data/lib/castle/api/start_impersonation.rb +1 -3
- data/lib/castle/api/track.rb +1 -3
- data/lib/castle/client.rb +1 -5
- data/lib/castle/commands/log.rb +1 -5
- data/lib/castle/commands/risk.rb +1 -5
- data/lib/castle/configuration.rb +2 -5
- data/lib/castle/core/process_response.rb +4 -3
- data/lib/castle/core/send_request.rb +1 -3
- data/lib/castle/errors.rb +4 -0
- data/lib/castle/headers/extract.rb +1 -3
- data/lib/castle/headers/filter.rb +2 -3
- data/lib/castle/payload/prepare.rb +1 -2
- data/lib/castle/session.rb +1 -1
- data/lib/castle/version.rb +1 -1
- data/lib/castle.rb +1 -3
- data/spec/integration/rails/rails_spec.rb +9 -3
- data/spec/integration/rails/support/application.rb +2 -2
- data/spec/integration/rails/support/home_controller.rb +4 -30
- data/spec/lib/castle/api/approve_device_spec.rb +2 -6
- data/spec/lib/castle/api/authenticate_spec.rb +22 -25
- data/spec/lib/castle/api/end_impersonation_spec.rb +8 -14
- data/spec/lib/castle/api/get_device_spec.rb +1 -3
- data/spec/lib/castle/api/get_devices_for_user_spec.rb +1 -3
- data/spec/lib/castle/api/report_device_spec.rb +2 -6
- data/spec/lib/castle/api/start_impersonation_spec.rb +8 -14
- data/spec/lib/castle/api/track_spec.rb +9 -16
- data/spec/lib/castle/client_id/extract_spec.rb +2 -9
- data/spec/lib/castle/client_spec.rb +32 -78
- data/spec/lib/castle/command_spec.rb +3 -3
- data/spec/lib/castle/commands/approve_device_spec.rb +2 -2
- data/spec/lib/castle/commands/authenticate_spec.rb +17 -24
- data/spec/lib/castle/commands/end_impersonation_spec.rb +14 -21
- data/spec/lib/castle/commands/filter_spec.rb +15 -15
- data/spec/lib/castle/commands/get_device_spec.rb +2 -2
- data/spec/lib/castle/commands/get_devices_for_user_spec.rb +2 -2
- data/spec/lib/castle/commands/log_spec.rb +15 -15
- data/spec/lib/castle/commands/report_device_spec.rb +2 -2
- data/spec/lib/castle/commands/risk_spec.rb +15 -15
- data/spec/lib/castle/commands/start_impersonation_spec.rb +14 -21
- data/spec/lib/castle/commands/track_spec.rb +19 -24
- data/spec/lib/castle/configuration_spec.rb +1 -1
- data/spec/lib/castle/context/get_default_spec.rb +9 -8
- data/spec/lib/castle/context/prepare_spec.rb +3 -4
- data/spec/lib/castle/core/process_response_spec.rb +3 -6
- data/spec/lib/castle/core/process_webhook_spec.rb +12 -6
- data/spec/lib/castle/core/send_request_spec.rb +7 -11
- data/spec/lib/castle/failover/strategy_spec.rb +5 -5
- data/spec/lib/castle/headers/extract_spec.rb +1 -1
- data/spec/lib/castle/headers/filter_spec.rb +6 -3
- data/spec/lib/castle/headers/format_spec.rb +5 -5
- data/spec/lib/castle/ips/extract_spec.rb +2 -6
- data/spec/lib/castle/logger_spec.rb +2 -1
- data/spec/lib/castle/payload/prepare_spec.rb +4 -7
- data/spec/lib/castle/secure_mode_spec.rb +1 -3
- data/spec/lib/castle/session_spec.rb +1 -5
- data/spec/lib/castle/singleton_configuration_spec.rb +1 -1
- data/spec/lib/castle/utils/clone_spec.rb +1 -1
- data/spec/lib/castle/utils/merge_spec.rb +2 -4
- data/spec/lib/castle/validators/not_supported_spec.rb +1 -6
- data/spec/lib/castle/validators/present_spec.rb +2 -9
- data/spec/lib/castle/verdict_spec.rb +3 -3
- data/spec/lib/castle/webhooks/verify_spec.rb +12 -6
- data/spec/lib/castle_spec.rb +5 -7
- data/spec/support/shared_examples/action_request.rb +16 -34
- data/spec/support/shared_examples/configuration.rb +14 -16
- metadata +48 -48
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9dc06eac5803e36c8576d9938442ba1c1f6bb852420c7a736044127deea50b8
|
4
|
+
data.tar.gz: 5d89738c670359a0345d51b41d0137d614622002711f20665238a4c289f28bab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 118236690b20da223208e043cb4aafea5c1d9870e0d2e44d87106a45122652ca894f8bfbc79bf465e474923a026b9b2253a6c7a1ab2c2f5157b0b21d51459d6c
|
7
|
+
data.tar.gz: 223933e1de62111635ba5d22fed064541a1d54aee9c9374fc8524a808b27b623245ee0d5240a42d0eff4ac72e214cc4f61ce44bb72f15591d3944790d8bc3e0d
|
@@ -7,26 +7,17 @@ module Castle
|
|
7
7
|
# @param options [Hash]
|
8
8
|
# return [Hash]
|
9
9
|
def call(options = {})
|
10
|
-
unless options[:no_symbolize]
|
11
|
-
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
12
|
-
end
|
10
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {}) unless options[:no_symbolize]
|
13
11
|
options.delete(:no_symbolize)
|
14
12
|
http = options.delete(:http)
|
15
13
|
config = options.delete(:config) || Castle.config
|
16
14
|
|
17
|
-
response =
|
18
|
-
Castle::API.call(Castle::Commands::Authenticate.build(options), {}, http, config)
|
15
|
+
response = Castle::API.call(Castle::Commands::Authenticate.build(options), {}, http, config)
|
19
16
|
response.merge(failover: false, failover_reason: nil)
|
20
17
|
rescue Castle::RequestError, Castle::InternalServerError => e
|
21
18
|
unless config.failover_strategy == :throw
|
22
19
|
strategy = (config || Castle.config).failover_strategy
|
23
|
-
return(
|
24
|
-
Castle::Failover::PrepareResponse.new(
|
25
|
-
options[:user_id],
|
26
|
-
reason: e.to_s,
|
27
|
-
strategy: strategy
|
28
|
-
).call
|
29
|
-
)
|
20
|
+
return(Castle::Failover::PrepareResponse.new(options[:user_id], reason: e.to_s, strategy: strategy).call)
|
30
21
|
end
|
31
22
|
|
32
23
|
raise e
|
@@ -7,9 +7,7 @@ module Castle
|
|
7
7
|
class << self
|
8
8
|
# @param options [Hash]
|
9
9
|
def call(options = {})
|
10
|
-
unless options[:no_symbolize]
|
11
|
-
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
12
|
-
end
|
10
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {}) unless options[:no_symbolize]
|
13
11
|
options.delete(:no_symbolize)
|
14
12
|
http = options.delete(:http)
|
15
13
|
config = options.delete(:config) || Castle.config
|
data/lib/castle/api/filter.rb
CHANGED
@@ -8,9 +8,7 @@ module Castle
|
|
8
8
|
# @param options [Hash]
|
9
9
|
# return [Hash]
|
10
10
|
def call(options = {})
|
11
|
-
unless options[:no_symbolize]
|
12
|
-
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
13
|
-
end
|
11
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {}) unless options[:no_symbolize]
|
14
12
|
options.delete(:no_symbolize)
|
15
13
|
http = options.delete(:http)
|
16
14
|
config = options.delete(:config) || Castle.config
|
@@ -20,13 +18,7 @@ module Castle
|
|
20
18
|
rescue Castle::RequestError, Castle::InternalServerError => e
|
21
19
|
unless config.failover_strategy == :throw
|
22
20
|
strategy = (config || Castle.config).failover_strategy
|
23
|
-
return(
|
24
|
-
Castle::Failover::PrepareResponse.new(
|
25
|
-
options[:user][:id],
|
26
|
-
reason: e.to_s,
|
27
|
-
strategy: strategy
|
28
|
-
).call
|
29
|
-
)
|
21
|
+
return(Castle::Failover::PrepareResponse.new(options[:user][:id], reason: e.to_s, strategy: strategy).call)
|
30
22
|
end
|
31
23
|
|
32
24
|
raise e
|
data/lib/castle/api/log.rb
CHANGED
@@ -8,9 +8,7 @@ module Castle
|
|
8
8
|
# @param options [Hash]
|
9
9
|
# return [Hash]
|
10
10
|
def call(options = {})
|
11
|
-
unless options[:no_symbolize]
|
12
|
-
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
13
|
-
end
|
11
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {}) unless options[:no_symbolize]
|
14
12
|
options.delete(:no_symbolize)
|
15
13
|
http = options.delete(:http)
|
16
14
|
config = options.delete(:config) || Castle.config
|
@@ -20,13 +18,7 @@ module Castle
|
|
20
18
|
rescue Castle::RequestError, Castle::InternalServerError => e
|
21
19
|
unless config.failover_strategy == :throw
|
22
20
|
strategy = (config || Castle.config).failover_strategy
|
23
|
-
return(
|
24
|
-
Castle::Failover::PrepareResponse.new(
|
25
|
-
options[:user][:id],
|
26
|
-
reason: e.to_s,
|
27
|
-
strategy: strategy
|
28
|
-
).call
|
29
|
-
)
|
21
|
+
return(Castle::Failover::PrepareResponse.new(options[:user][:id], reason: e.to_s, strategy: strategy).call)
|
30
22
|
end
|
31
23
|
|
32
24
|
raise e
|
data/lib/castle/api/risk.rb
CHANGED
@@ -8,9 +8,7 @@ module Castle
|
|
8
8
|
# @param options [Hash]
|
9
9
|
# return [Hash]
|
10
10
|
def call(options = {})
|
11
|
-
unless options[:no_symbolize]
|
12
|
-
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
13
|
-
end
|
11
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {}) unless options[:no_symbolize]
|
14
12
|
options.delete(:no_symbolize)
|
15
13
|
http = options.delete(:http)
|
16
14
|
config = options.delete(:config) || Castle.config
|
@@ -20,13 +18,7 @@ module Castle
|
|
20
18
|
rescue Castle::RequestError, Castle::InternalServerError => e
|
21
19
|
unless config.failover_strategy == :throw
|
22
20
|
strategy = (config || Castle.config).failover_strategy
|
23
|
-
return(
|
24
|
-
Castle::Failover::PrepareResponse.new(
|
25
|
-
options[:user][:id],
|
26
|
-
reason: e.to_s,
|
27
|
-
strategy: strategy
|
28
|
-
).call
|
29
|
-
)
|
21
|
+
return(Castle::Failover::PrepareResponse.new(options[:user][:id], reason: e.to_s, strategy: strategy).call)
|
30
22
|
end
|
31
23
|
|
32
24
|
raise e
|
@@ -7,9 +7,7 @@ module Castle
|
|
7
7
|
class << self
|
8
8
|
# @param options [Hash]
|
9
9
|
def call(options = {})
|
10
|
-
unless options[:no_symbolize]
|
11
|
-
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
12
|
-
end
|
10
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {}) unless options[:no_symbolize]
|
13
11
|
options.delete(:no_symbolize)
|
14
12
|
http = options.delete(:http)
|
15
13
|
config = options.delete(:config) || Castle.config
|
data/lib/castle/api/track.rb
CHANGED
@@ -6,9 +6,7 @@ module Castle
|
|
6
6
|
class << self
|
7
7
|
# @param options [Hash]
|
8
8
|
def call(options = {})
|
9
|
-
unless options[:no_symbolize]
|
10
|
-
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
11
|
-
end
|
9
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {}) unless options[:no_symbolize]
|
12
10
|
options.delete(:no_symbolize)
|
13
11
|
http = options.delete(:http)
|
14
12
|
config = options.delete(:config) || Castle.config
|
data/lib/castle/client.rb
CHANGED
@@ -123,11 +123,7 @@ module Castle
|
|
123
123
|
|
124
124
|
# @param user_id [String, Boolean]
|
125
125
|
def generate_do_not_track_response(user_id)
|
126
|
-
Castle::Failover::PrepareResponse.new(
|
127
|
-
user_id,
|
128
|
-
strategy: :allow,
|
129
|
-
reason: 'Castle is set to do not track.'
|
130
|
-
).call
|
126
|
+
Castle::Failover::PrepareResponse.new(user_id, strategy: :allow, reason: 'Castle is set to do not track.').call
|
131
127
|
end
|
132
128
|
|
133
129
|
# @param options [Hash]
|
data/lib/castle/commands/log.rb
CHANGED
@@ -10,11 +10,7 @@ module Castle
|
|
10
10
|
def build(options = {})
|
11
11
|
context = Castle::Context::Sanitize.call(options[:context])
|
12
12
|
|
13
|
-
Castle::Command.new(
|
14
|
-
'log',
|
15
|
-
options.merge(context: context, sent_at: Castle::Utils::GetTimestamp.call),
|
16
|
-
:post
|
17
|
-
)
|
13
|
+
Castle::Command.new('log', options.merge(context: context, sent_at: Castle::Utils::GetTimestamp.call), :post)
|
18
14
|
end
|
19
15
|
end
|
20
16
|
end
|
data/lib/castle/commands/risk.rb
CHANGED
@@ -10,11 +10,7 @@ module Castle
|
|
10
10
|
def build(options = {})
|
11
11
|
context = Castle::Context::Sanitize.call(options[:context])
|
12
12
|
|
13
|
-
Castle::Command.new(
|
14
|
-
'risk',
|
15
|
-
options.merge(context: context, sent_at: Castle::Utils::GetTimestamp.call),
|
16
|
-
:post
|
17
|
-
)
|
13
|
+
Castle::Command.new('risk', options.merge(context: context, sent_at: Castle::Utils::GetTimestamp.call), :post)
|
18
14
|
end
|
19
15
|
end
|
20
16
|
end
|
data/lib/castle/configuration.rb
CHANGED
@@ -104,9 +104,7 @@ module Castle
|
|
104
104
|
# sets trusted proxies
|
105
105
|
# @param value [Array<String,Regexp>]
|
106
106
|
def trusted_proxies=(value)
|
107
|
-
unless value.is_a?(Array)
|
108
|
-
raise Castle::ConfigurationError, 'trusted proxies must be an Array'
|
109
|
-
end
|
107
|
+
raise Castle::ConfigurationError, 'trusted proxies must be an Array' unless value.is_a?(Array)
|
110
108
|
|
111
109
|
@trusted_proxies = value
|
112
110
|
end
|
@@ -121,8 +119,7 @@ module Castle
|
|
121
119
|
end
|
122
120
|
|
123
121
|
def failover_strategy=(value)
|
124
|
-
@failover_strategy =
|
125
|
-
Castle::Failover::STRATEGIES.detect { |strategy| strategy == value.to_sym }
|
122
|
+
@failover_strategy = Castle::Failover::STRATEGIES.detect { |strategy| strategy == value.to_sym }
|
126
123
|
raise Castle::ConfigurationError, 'unrecognized failover strategy' if @failover_strategy.nil?
|
127
124
|
end
|
128
125
|
|
@@ -9,7 +9,8 @@ module Castle
|
|
9
9
|
401 => Castle::UnauthorizedError,
|
10
10
|
403 => Castle::ForbiddenError,
|
11
11
|
404 => Castle::NotFoundError,
|
12
|
-
419 => Castle::UserUnauthorizedError
|
12
|
+
419 => Castle::UserUnauthorizedError,
|
13
|
+
429 => Castle::RateLimitError
|
13
14
|
}.freeze
|
14
15
|
|
15
16
|
INVALID_REQUEST_TOKEN = 'invalid_request_token'
|
@@ -51,9 +52,9 @@ module Castle
|
|
51
52
|
if parsed_body.is_a?(Hash) && parsed_body.key?(:type)
|
52
53
|
if parsed_body[:type] == INVALID_REQUEST_TOKEN
|
53
54
|
raise Castle::InvalidRequestTokenError, parsed_body[:message]
|
54
|
-
else
|
55
|
-
raise Castle::InvalidParametersError, parsed_body[:message]
|
56
55
|
end
|
56
|
+
|
57
|
+
raise Castle::InvalidParametersError, parsed_body[:message]
|
57
58
|
end
|
58
59
|
rescue JSON::ParserError
|
59
60
|
end
|
@@ -15,9 +15,7 @@ module Castle
|
|
15
15
|
# @param http [Net::HTTP]
|
16
16
|
# @param config [Castle::Configuration, Castle::SingletonConfiguration, nil]
|
17
17
|
def call(command, headers, http = nil, config = nil)
|
18
|
-
(http || Castle::Core::GetConnection.call).request(
|
19
|
-
build(command, headers.merge(DEFAULT_HEADERS), config)
|
20
|
-
)
|
18
|
+
(http || Castle::Core::GetConnection.call).request(build(command, headers.merge(DEFAULT_HEADERS), config))
|
21
19
|
end
|
22
20
|
|
23
21
|
# @param command [String]
|
data/lib/castle/errors.rb
CHANGED
@@ -23,9 +23,7 @@ module Castle
|
|
23
23
|
# Serialize HTTP headers
|
24
24
|
# @return [Hash]
|
25
25
|
def call
|
26
|
-
@headers.each_with_object({})
|
27
|
-
acc[name] = header_value(name, value)
|
28
|
-
end
|
26
|
+
@headers.each_with_object({}) { |(name, value), acc| acc[name] = header_value(name, value) }
|
29
27
|
end
|
30
28
|
|
31
29
|
private
|
@@ -12,8 +12,7 @@ module Castle
|
|
12
12
|
HTTP(?:_|-).*|
|
13
13
|
CONTENT(?:_|-)LENGTH|
|
14
14
|
REMOTE(?:_|-)ADDR
|
15
|
-
$/xi
|
16
|
-
.freeze
|
15
|
+
$/xi.freeze
|
17
16
|
|
18
17
|
private_constant :VALUABLE_HEADERS
|
19
18
|
|
@@ -32,7 +31,7 @@ module Castle
|
|
32
31
|
next unless header_name.match(VALUABLE_HEADERS)
|
33
32
|
|
34
33
|
formatted_name = @header_format.call(header_name)
|
35
|
-
acc[formatted_name] = @request_env[header_name]
|
34
|
+
acc[formatted_name] = @request_env[header_name].to_s
|
36
35
|
end
|
37
36
|
end
|
38
37
|
end
|
@@ -12,8 +12,7 @@ module Castle
|
|
12
12
|
def call(payload_options, request, options = {})
|
13
13
|
context = Castle::Context::Prepare.call(request, payload_options.merge(options))
|
14
14
|
|
15
|
-
payload =
|
16
|
-
Castle::Utils::DeepSymbolizeKeys.call(payload_options || {}).merge(context: context)
|
15
|
+
payload = Castle::Utils::DeepSymbolizeKeys.call(payload_options || {}).merge(context: context)
|
17
16
|
payload[:timestamp] ||= Castle::Utils::GetTimestamp.call
|
18
17
|
|
19
18
|
warn '[DEPRECATION] use user_traits instead of traits key' if payload.key?(:traits)
|
data/lib/castle/session.rb
CHANGED
data/lib/castle/version.rb
CHANGED
data/lib/castle.rb
CHANGED
@@ -67,9 +67,7 @@
|
|
67
67
|
module Castle
|
68
68
|
class << self
|
69
69
|
def configure(config_hash = nil)
|
70
|
-
(config_hash || {}).each
|
71
|
-
config.send("#{config_name}=", config_value)
|
72
|
-
end
|
70
|
+
(config_hash || {}).each { |config_name, config_value| config.send(:"#{config_name}=", config_value) }
|
73
71
|
|
74
72
|
yield(config) if block_given?
|
75
73
|
end
|
@@ -24,11 +24,12 @@ RSpec.describe HomeController, type: :request do
|
|
24
24
|
'Accept' =>
|
25
25
|
'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
|
26
26
|
'Authorization' => true,
|
27
|
-
'Content-Length' => '0',
|
28
27
|
'Cookie' => true,
|
28
|
+
'Content-Length' => '0',
|
29
29
|
'Host' => 'www.example.com',
|
30
30
|
'X-Forwarded-For' => '5.5.5.5, 1.2.3.4',
|
31
|
-
'Remote-Addr' => '127.0.0.1'
|
31
|
+
'Remote-Addr' => '127.0.0.1',
|
32
|
+
'Version' => 'HTTP/1.0'
|
32
33
|
},
|
33
34
|
'ip' => '1.2.3.4',
|
34
35
|
'library' => {
|
@@ -40,7 +41,12 @@ RSpec.describe HomeController, type: :request do
|
|
40
41
|
end
|
41
42
|
let(:now) { Time.now }
|
42
43
|
let(:headers) do
|
43
|
-
{
|
44
|
+
{
|
45
|
+
'HTTP_AUTHORIZATION' => 'Basic 123',
|
46
|
+
'HTTP_X_FORWARDED_FOR' => '5.5.5.5, 1.2.3.4',
|
47
|
+
'HTTP_VERSION' => 'HTTP/1.0',
|
48
|
+
'HTTP_CONTENT_LENGTH' => '0'
|
49
|
+
}
|
44
50
|
end
|
45
51
|
|
46
52
|
before do
|
@@ -3,8 +3,8 @@
|
|
3
3
|
require 'action_controller/railtie'
|
4
4
|
|
5
5
|
class TestApp < Rails::Application
|
6
|
-
|
7
|
-
|
6
|
+
credentials.secret_token = 'secret_token'
|
7
|
+
credentials.secret_key_base = 'secret_key_base'
|
8
8
|
|
9
9
|
config.logger = Logger.new($stdout)
|
10
10
|
Rails.logger = config.logger
|
@@ -4,16 +4,7 @@ class HomeController < ActionController::Base
|
|
4
4
|
# prepare context and calling track with client example
|
5
5
|
def index1
|
6
6
|
request_context = ::Castle::Context::Prepare.call(request)
|
7
|
-
payload = {
|
8
|
-
event: '$login.succeeded',
|
9
|
-
user_id: '123',
|
10
|
-
properties: {
|
11
|
-
key: 'value'
|
12
|
-
},
|
13
|
-
user_traits: {
|
14
|
-
key: 'value'
|
15
|
-
}
|
16
|
-
}
|
7
|
+
payload = { event: '$login.succeeded', user_id: '123', properties: { key: 'value' }, user_traits: { key: 'value' } }
|
17
8
|
client = ::Castle::Client.new(context: request_context)
|
18
9
|
client.track(payload)
|
19
10
|
|
@@ -24,16 +15,7 @@ class HomeController < ActionController::Base
|
|
24
15
|
def index2
|
25
16
|
payload =
|
26
17
|
::Castle::Payload::Prepare.call(
|
27
|
-
{
|
28
|
-
event: '$login.succeeded',
|
29
|
-
user_id: '123',
|
30
|
-
properties: {
|
31
|
-
key: 'value'
|
32
|
-
},
|
33
|
-
user_traits: {
|
34
|
-
key: 'value'
|
35
|
-
}
|
36
|
-
},
|
18
|
+
{ event: '$login.succeeded', user_id: '123', properties: { key: 'value' }, user_traits: { key: 'value' } },
|
37
19
|
request
|
38
20
|
)
|
39
21
|
client = ::Castle::Client.new
|
@@ -46,18 +28,10 @@ class HomeController < ActionController::Base
|
|
46
28
|
def index3
|
47
29
|
payload =
|
48
30
|
::Castle::Payload::Prepare.call(
|
49
|
-
{
|
50
|
-
event: '$login.succeeded',
|
51
|
-
user_id: '123',
|
52
|
-
properties: {
|
53
|
-
key: 'value'
|
54
|
-
},
|
55
|
-
user_traits: {
|
56
|
-
key: 'value'
|
57
|
-
}
|
58
|
-
},
|
31
|
+
{ event: '$login.succeeded', user_id: '123', properties: { key: 'value' }, user_traits: { key: 'value' } },
|
59
32
|
request
|
60
33
|
)
|
34
|
+
|
61
35
|
Castle::API::Track.call(payload)
|
62
36
|
|
63
37
|
render inline: 'hello'
|
@@ -2,9 +2,7 @@
|
|
2
2
|
|
3
3
|
describe Castle::API::ApproveDevice do
|
4
4
|
before do
|
5
|
-
stub_request(:any, /api.castle.io/)
|
6
|
-
.with(basic_auth: ['', 'secret'])
|
7
|
-
.to_return(status: 200, body: '{}', headers: {})
|
5
|
+
stub_request(:any, /api.castle.io/).with(basic_auth: ['', 'secret']).to_return(status: 200, body: '{}', headers: {})
|
8
6
|
end
|
9
7
|
|
10
8
|
describe '.call' do
|
@@ -14,8 +12,6 @@ describe Castle::API::ApproveDevice do
|
|
14
12
|
|
15
13
|
before { retrieve }
|
16
14
|
|
17
|
-
it
|
18
|
-
assert_requested :put, "https://api.castle.io/v1/devices/#{device_token}/approve", times: 1
|
19
|
-
end
|
15
|
+
it { assert_requested :put, "https://api.castle.io/v1/devices/#{device_token}/approve", times: 1 }
|
20
16
|
end
|
21
17
|
end
|
@@ -29,15 +29,16 @@ describe Castle::API::Authenticate do
|
|
29
29
|
after { Timecop.return }
|
30
30
|
|
31
31
|
describe '.call' do
|
32
|
-
let(:request_body)
|
33
|
-
{ event: '$login.succeeded', context: context, user_id: '1234', sent_at: time_auto }
|
34
|
-
end
|
32
|
+
let(:request_body) { { event: '$login.succeeded', context: context, user_id: '1234', sent_at: time_auto } }
|
35
33
|
|
36
34
|
context 'when used with symbol keys' do
|
37
35
|
before do
|
38
|
-
stub_request(:any, /api.castle.io/)
|
39
|
-
|
40
|
-
|
36
|
+
stub_request(:any, /api.castle.io/).with(basic_auth: ['', 'secret']).to_return(
|
37
|
+
status: 200,
|
38
|
+
body: response_body,
|
39
|
+
headers: {
|
40
|
+
}
|
41
|
+
)
|
41
42
|
call_subject
|
42
43
|
end
|
43
44
|
|
@@ -50,17 +51,9 @@ describe Castle::API::Authenticate do
|
|
50
51
|
end
|
51
52
|
|
52
53
|
context 'when passed timestamp in options and no defined timestamp' do
|
53
|
-
let(:options)
|
54
|
-
{ event: '$login.succeeded', user_id: '1234', timestamp: time_user, context: context }
|
55
|
-
end
|
54
|
+
let(:options) { { event: '$login.succeeded', user_id: '1234', timestamp: time_user, context: context } }
|
56
55
|
let(:request_body) do
|
57
|
-
{
|
58
|
-
event: '$login.succeeded',
|
59
|
-
user_id: '1234',
|
60
|
-
context: context,
|
61
|
-
timestamp: time_user,
|
62
|
-
sent_at: time_auto
|
63
|
-
}
|
56
|
+
{ event: '$login.succeeded', user_id: '1234', context: context, timestamp: time_user, sent_at: time_auto }
|
64
57
|
end
|
65
58
|
|
66
59
|
it do
|
@@ -78,15 +71,16 @@ describe Castle::API::Authenticate do
|
|
78
71
|
|
79
72
|
context 'when denied without any risk policy' do
|
80
73
|
let(:response_body) { deny_response_without_rp.to_json }
|
81
|
-
let(:deny_response_without_rp)
|
82
|
-
{ action: 'deny', user_id: '12345', device_token: 'abcdefg1234' }
|
83
|
-
end
|
74
|
+
let(:deny_response_without_rp) { { action: 'deny', user_id: '12345', device_token: 'abcdefg1234' } }
|
84
75
|
let(:deny_without_rp_failover_result) { deny_response_without_rp.merge(failover_appendix) }
|
85
76
|
|
86
77
|
before do
|
87
|
-
stub_request(:any, /api.castle.io/)
|
88
|
-
|
89
|
-
|
78
|
+
stub_request(:any, /api.castle.io/).with(basic_auth: ['', 'secret']).to_return(
|
79
|
+
status: 200,
|
80
|
+
body: deny_response_without_rp.to_json,
|
81
|
+
headers: {
|
82
|
+
}
|
83
|
+
)
|
90
84
|
call_subject
|
91
85
|
end
|
92
86
|
|
@@ -117,9 +111,12 @@ describe Castle::API::Authenticate do
|
|
117
111
|
let(:deny_with_rp_failover_result) { deny_response_with_rp.merge(failover_appendix) }
|
118
112
|
|
119
113
|
before do
|
120
|
-
stub_request(:any, /api.castle.io/)
|
121
|
-
|
122
|
-
|
114
|
+
stub_request(:any, /api.castle.io/).with(basic_auth: ['', 'secret']).to_return(
|
115
|
+
status: 200,
|
116
|
+
body: deny_response_with_rp.to_json,
|
117
|
+
headers: {
|
118
|
+
}
|
119
|
+
)
|
123
120
|
call_subject
|
124
121
|
end
|
125
122
|
|
@@ -22,9 +22,12 @@ describe Castle::API::EndImpersonation do
|
|
22
22
|
before do
|
23
23
|
Timecop.freeze(time_now)
|
24
24
|
stub_const('Castle::VERSION', '2.2.0')
|
25
|
-
stub_request(:any, /api.castle.io/)
|
26
|
-
|
27
|
-
|
25
|
+
stub_request(:any, /api.castle.io/).with(basic_auth: ['', 'secret']).to_return(
|
26
|
+
status: 200,
|
27
|
+
body: response_body,
|
28
|
+
headers: {
|
29
|
+
}
|
30
|
+
)
|
28
31
|
end
|
29
32
|
|
30
33
|
after { Timecop.return }
|
@@ -32,19 +35,10 @@ describe Castle::API::EndImpersonation do
|
|
32
35
|
describe 'call' do
|
33
36
|
let(:impersonator) { 'test@castle.io' }
|
34
37
|
let(:request_body) do
|
35
|
-
{
|
36
|
-
user_id: '1234',
|
37
|
-
sent_at: time_auto,
|
38
|
-
properties: {
|
39
|
-
impersonator: impersonator
|
40
|
-
},
|
41
|
-
context: context
|
42
|
-
}
|
38
|
+
{ user_id: '1234', sent_at: time_auto, properties: { impersonator: impersonator }, context: context }
|
43
39
|
end
|
44
40
|
let(:response_body) { { success: true }.to_json }
|
45
|
-
let(:options)
|
46
|
-
{ user_id: '1234', properties: { impersonator: impersonator }, context: context }
|
47
|
-
end
|
41
|
+
let(:options) { { user_id: '1234', properties: { impersonator: impersonator }, context: context } }
|
48
42
|
|
49
43
|
context 'when used with symbol keys' do
|
50
44
|
before { call }
|
@@ -2,9 +2,7 @@
|
|
2
2
|
|
3
3
|
describe Castle::API::GetDevice do
|
4
4
|
before do
|
5
|
-
stub_request(:any, /api.castle.io/)
|
6
|
-
.with(basic_auth: ['', 'secret'])
|
7
|
-
.to_return(status: 200, body: '{}', headers: {})
|
5
|
+
stub_request(:any, /api.castle.io/).with(basic_auth: ['', 'secret']).to_return(status: 200, body: '{}', headers: {})
|
8
6
|
end
|
9
7
|
|
10
8
|
describe '.call' do
|
@@ -2,9 +2,7 @@
|
|
2
2
|
|
3
3
|
describe Castle::API::GetDevicesForUser do
|
4
4
|
before do
|
5
|
-
stub_request(:any, /api.castle.io/)
|
6
|
-
.with(basic_auth: ['', 'secret'])
|
7
|
-
.to_return(status: 200, body: '{}', headers: {})
|
5
|
+
stub_request(:any, /api.castle.io/).with(basic_auth: ['', 'secret']).to_return(status: 200, body: '{}', headers: {})
|
8
6
|
end
|
9
7
|
|
10
8
|
describe '.call' do
|
@@ -2,9 +2,7 @@
|
|
2
2
|
|
3
3
|
describe Castle::API::ReportDevice do
|
4
4
|
before do
|
5
|
-
stub_request(:any, /api.castle.io/)
|
6
|
-
.with(basic_auth: ['', 'secret'])
|
7
|
-
.to_return(status: 200, body: '{}', headers: {})
|
5
|
+
stub_request(:any, /api.castle.io/).with(basic_auth: ['', 'secret']).to_return(status: 200, body: '{}', headers: {})
|
8
6
|
end
|
9
7
|
|
10
8
|
describe '.call' do
|
@@ -14,8 +12,6 @@ describe Castle::API::ReportDevice do
|
|
14
12
|
|
15
13
|
before { retrieve }
|
16
14
|
|
17
|
-
it
|
18
|
-
assert_requested :put, "https://api.castle.io/v1/devices/#{device_token}/report", times: 1
|
19
|
-
end
|
15
|
+
it { assert_requested :put, "https://api.castle.io/v1/devices/#{device_token}/report", times: 1 }
|
20
16
|
end
|
21
17
|
end
|