castle-rb 4.2.1 → 7.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/README.md +160 -45
- data/lib/castle.rb +49 -28
- data/lib/castle/api.rb +21 -14
- data/lib/castle/api/approve_device.rb +20 -0
- data/lib/castle/api/authenticate.rb +37 -0
- data/lib/castle/api/end_impersonation.rb +24 -0
- data/lib/castle/api/filter.rb +37 -0
- data/lib/castle/api/get_device.rb +20 -0
- data/lib/castle/api/get_devices_for_user.rb +20 -0
- data/lib/castle/api/log.rb +37 -0
- data/lib/castle/api/report_device.rb +20 -0
- data/lib/castle/api/risk.rb +37 -0
- data/lib/castle/api/start_impersonation.rb +24 -0
- data/lib/castle/api/track.rb +21 -0
- data/lib/castle/client.rb +78 -51
- data/lib/castle/{extractors/client_id.rb → client_id/extract.rb} +2 -2
- data/lib/castle/commands/approve_device.rb +17 -0
- data/lib/castle/commands/authenticate.rb +13 -13
- data/lib/castle/commands/end_impersonation.rb +25 -0
- data/lib/castle/commands/filter.rb +23 -0
- data/lib/castle/commands/get_device.rb +17 -0
- data/lib/castle/commands/get_devices_for_user.rb +17 -0
- data/lib/castle/commands/log.rb +23 -0
- data/lib/castle/commands/report_device.rb +17 -0
- data/lib/castle/commands/risk.rb +23 -0
- data/lib/castle/commands/start_impersonation.rb +25 -0
- data/lib/castle/commands/track.rb +12 -13
- data/lib/castle/configuration.rb +57 -32
- data/lib/castle/context/{default.rb → get_default.rb} +5 -6
- data/lib/castle/context/{merger.rb → merge.rb} +3 -3
- data/lib/castle/context/prepare.rb +18 -0
- data/lib/castle/context/{sanitizer.rb → sanitize.rb} +1 -1
- data/lib/castle/core/get_connection.rb +27 -0
- data/lib/castle/{api/response.rb → core/process_response.rb} +8 -3
- data/lib/castle/core/process_webhook.rb +25 -0
- data/lib/castle/core/send_request.rb +42 -0
- data/lib/castle/errors.rb +38 -12
- data/lib/castle/failover/prepare_response.rb +18 -0
- data/lib/castle/failover/strategy.rb +23 -0
- data/lib/castle/headers/extract.rb +47 -0
- data/lib/castle/headers/filter.rb +40 -0
- data/lib/castle/headers/format.rb +24 -0
- data/lib/castle/{extractors/ip.rb → ips/extract.rb} +31 -9
- data/lib/castle/logger.rb +19 -0
- data/lib/castle/payload/prepare.rb +26 -0
- data/lib/castle/secure_mode.rb +7 -2
- data/lib/castle/session.rb +18 -0
- data/lib/castle/singleton_configuration.rb +9 -0
- data/lib/castle/support/hanami.rb +2 -6
- data/lib/castle/support/rails.rb +1 -3
- data/lib/castle/utils/clean_invalid_chars.rb +22 -0
- data/lib/castle/utils/clone.rb +15 -0
- data/lib/castle/utils/deep_symbolize_keys.rb +45 -0
- data/lib/castle/utils/get_timestamp.rb +15 -0
- data/lib/castle/utils/{merger.rb → merge.rb} +3 -3
- data/lib/castle/utils/secure_compare.rb +22 -0
- data/lib/castle/validators/not_supported.rb +1 -0
- data/lib/castle/validators/present.rb +1 -0
- data/lib/castle/verdict.rb +15 -0
- data/lib/castle/version.rb +1 -1
- data/lib/castle/webhooks/verify.rb +45 -0
- data/spec/integration/rails/rails_spec.rb +42 -14
- data/spec/integration/rails/support/application.rb +3 -1
- data/spec/integration/rails/support/home_controller.rb +50 -6
- data/spec/lib/castle/api/approve_device_spec.rb +21 -0
- data/spec/lib/castle/api/authenticate_spec.rb +136 -0
- data/spec/lib/castle/api/end_impersonation_spec.rb +65 -0
- data/spec/lib/castle/api/filter_spec.rb +5 -0
- data/spec/lib/castle/api/get_device_spec.rb +19 -0
- data/spec/lib/castle/api/get_devices_for_user_spec.rb +19 -0
- data/spec/lib/castle/api/log_spec.rb +5 -0
- data/spec/lib/castle/api/report_device_spec.rb +21 -0
- data/spec/lib/castle/api/risk_spec.rb +5 -0
- data/spec/lib/castle/api/start_impersonation_spec.rb +65 -0
- data/spec/lib/castle/api/track_spec.rb +72 -0
- data/spec/lib/castle/api_spec.rb +14 -15
- data/spec/lib/castle/{extractors/client_id_spec.rb → client_id/extract_spec.rb} +6 -15
- data/spec/lib/castle/client_spec.rb +108 -93
- data/spec/lib/castle/commands/approve_device_spec.rb +24 -0
- data/spec/lib/castle/commands/authenticate_spec.rb +15 -31
- data/spec/lib/castle/commands/end_impersonation_spec.rb +79 -0
- data/spec/lib/castle/commands/filter_spec.rb +99 -0
- data/spec/lib/castle/commands/get_device_spec.rb +24 -0
- data/spec/lib/castle/commands/{review_spec.rb → get_devices_for_user_spec.rb} +7 -7
- data/spec/lib/castle/commands/log_spec.rb +100 -0
- data/spec/lib/castle/commands/report_device_spec.rb +24 -0
- data/spec/lib/castle/commands/risk_spec.rb +100 -0
- data/spec/lib/castle/commands/start_impersonation_spec.rb +79 -0
- data/spec/lib/castle/commands/track_spec.rb +14 -34
- data/spec/lib/castle/configuration_spec.rb +8 -141
- data/spec/lib/castle/context/{default_spec.rb → get_default_spec.rb} +9 -10
- data/spec/lib/castle/context/{merger_spec.rb → merge_spec.rb} +1 -1
- data/spec/lib/castle/context/prepare_spec.rb +43 -0
- data/spec/lib/castle/context/{sanitizer_spec.rb → sanitize_spec.rb} +1 -1
- data/spec/lib/castle/core/get_connection_spec.rb +43 -0
- data/spec/lib/castle/{api/response_spec.rb → core/process_response_spec.rb} +49 -1
- data/spec/lib/castle/core/process_webhook_spec.rb +46 -0
- data/spec/lib/castle/core/send_request_spec.rb +77 -0
- data/spec/lib/castle/failover/strategy_spec.rb +12 -0
- data/spec/lib/castle/{extractors/headers_spec.rb → headers/extract_spec.rb} +18 -20
- data/spec/lib/castle/headers/filter_spec.rb +39 -0
- data/spec/lib/castle/headers/format_spec.rb +25 -0
- data/spec/lib/castle/{extractors/ip_spec.rb → ips/extract_spec.rb} +27 -8
- data/spec/lib/castle/logger_spec.rb +38 -0
- data/spec/lib/castle/payload/prepare_spec.rb +55 -0
- data/spec/lib/castle/session_spec.rb +65 -0
- data/spec/lib/castle/singleton_configuration_spec.rb +14 -0
- data/spec/lib/castle/utils/clean_invalid_chars_spec.rb +69 -0
- data/spec/lib/castle/utils/{cloner_spec.rb → clone_spec.rb} +3 -3
- data/spec/lib/castle/utils/deep_symbolize_keys_spec.rb +50 -0
- data/spec/lib/castle/utils/{timestamp_spec.rb → get_timestamp_spec.rb} +1 -1
- data/spec/lib/castle/utils/merge_spec.rb +15 -0
- data/spec/lib/castle/validators/present_spec.rb +5 -6
- data/spec/lib/castle/verdict_spec.rb +9 -0
- data/spec/lib/castle/webhooks/verify_spec.rb +53 -0
- data/spec/lib/castle_spec.rb +4 -10
- data/spec/spec_helper.rb +3 -3
- data/spec/support/shared_examples/action_request.rb +152 -0
- data/spec/support/shared_examples/configuration.rb +101 -0
- metadata +146 -64
- data/lib/castle/api/request.rb +0 -42
- data/lib/castle/api/session.rb +0 -39
- data/lib/castle/commands/identify.rb +0 -23
- data/lib/castle/commands/impersonate.rb +0 -26
- data/lib/castle/commands/review.rb +0 -14
- data/lib/castle/events.rb +0 -49
- data/lib/castle/extractors/headers.rb +0 -45
- data/lib/castle/failover_auth_response.rb +0 -21
- data/lib/castle/headers_filter.rb +0 -35
- data/lib/castle/headers_formatter.rb +0 -22
- data/lib/castle/review.rb +0 -11
- data/lib/castle/utils.rb +0 -55
- data/lib/castle/utils/cloner.rb +0 -11
- data/lib/castle/utils/timestamp.rb +0 -12
- data/spec/lib/castle/api/request_spec.rb +0 -72
- data/spec/lib/castle/commands/identify_spec.rb +0 -88
- data/spec/lib/castle/commands/impersonate_spec.rb +0 -107
- data/spec/lib/castle/events_spec.rb +0 -5
- data/spec/lib/castle/headers_filter_spec.rb +0 -37
- data/spec/lib/castle/headers_formatter_spec.rb +0 -25
- data/spec/lib/castle/review_spec.rb +0 -19
- data/spec/lib/castle/utils/merger_spec.rb +0 -13
- data/spec/lib/castle/utils_spec.rb +0 -156
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Castle
|
4
|
+
module API
|
5
|
+
module Authenticate
|
6
|
+
class << self
|
7
|
+
# @param options [Hash]
|
8
|
+
# return [Hash]
|
9
|
+
def call(options = {})
|
10
|
+
unless options[:no_symbolize]
|
11
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
12
|
+
end
|
13
|
+
options.delete(:no_symbolize)
|
14
|
+
http = options.delete(:http)
|
15
|
+
config = options.delete(:config) || Castle.config
|
16
|
+
|
17
|
+
response =
|
18
|
+
Castle::API.call(Castle::Commands::Authenticate.build(options), {}, http, config)
|
19
|
+
response.merge(failover: false, failover_reason: nil)
|
20
|
+
rescue Castle::RequestError, Castle::InternalServerError => e
|
21
|
+
unless config.failover_strategy == :throw
|
22
|
+
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
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
raise e
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Castle
|
4
|
+
module API
|
5
|
+
# Sends DELETE impersonate request
|
6
|
+
module EndImpersonation
|
7
|
+
class << self
|
8
|
+
# @param options [Hash]
|
9
|
+
def call(options = {})
|
10
|
+
unless options[:no_symbolize]
|
11
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
12
|
+
end
|
13
|
+
options.delete(:no_symbolize)
|
14
|
+
http = options.delete(:http)
|
15
|
+
config = options.delete(:config) || Castle.config
|
16
|
+
|
17
|
+
Castle::API
|
18
|
+
.call(Castle::Commands::EndImpersonation.build(options), {}, http, config)
|
19
|
+
.tap { |response| raise Castle::ImpersonationFailed unless response[:success] }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Castle
|
4
|
+
module API
|
5
|
+
# Module for filter endpoint
|
6
|
+
module Filter
|
7
|
+
class << self
|
8
|
+
# @param options [Hash]
|
9
|
+
# return [Hash]
|
10
|
+
def call(options = {})
|
11
|
+
unless options[:no_symbolize]
|
12
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
13
|
+
end
|
14
|
+
options.delete(:no_symbolize)
|
15
|
+
http = options.delete(:http)
|
16
|
+
config = options.delete(:config) || Castle.config
|
17
|
+
|
18
|
+
response = Castle::API.call(Castle::Commands::Filter.build(options), {}, http, config)
|
19
|
+
response.merge(failover: false, failover_reason: nil)
|
20
|
+
rescue Castle::RequestError, Castle::InternalServerError => e
|
21
|
+
unless config.failover_strategy == :throw
|
22
|
+
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
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
raise e
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Castle
|
4
|
+
module API
|
5
|
+
# Sends GET devices/#{device_token} request
|
6
|
+
module GetDevice
|
7
|
+
class << self
|
8
|
+
# @param options [Hash]
|
9
|
+
# return [Hash]
|
10
|
+
def call(options = {})
|
11
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
12
|
+
http = options.delete(:http)
|
13
|
+
config = options.delete(:config) || Castle.config
|
14
|
+
|
15
|
+
Castle::API.call(Castle::Commands::GetDevice.build(options), {}, http, config)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Castle
|
4
|
+
module API
|
5
|
+
# Sends GET users/#{user_id}/devices request
|
6
|
+
module GetDevicesForUser
|
7
|
+
class << self
|
8
|
+
# @param options [Hash]
|
9
|
+
# return [Hash]
|
10
|
+
def call(options = {})
|
11
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
12
|
+
http = options.delete(:http)
|
13
|
+
config = options.delete(:config) || Castle.config
|
14
|
+
|
15
|
+
Castle::API.call(Castle::Commands::GetDevicesForUser.build(options), {}, http, config)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Castle
|
4
|
+
module API
|
5
|
+
# Module for log endpoint
|
6
|
+
module Log
|
7
|
+
class << self
|
8
|
+
# @param options [Hash]
|
9
|
+
# return [Hash]
|
10
|
+
def call(options = {})
|
11
|
+
unless options[:no_symbolize]
|
12
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
13
|
+
end
|
14
|
+
options.delete(:no_symbolize)
|
15
|
+
http = options.delete(:http)
|
16
|
+
config = options.delete(:config) || Castle.config
|
17
|
+
|
18
|
+
response = Castle::API.call(Castle::Commands::Log.build(options), {}, http, config)
|
19
|
+
response.merge(failover: false, failover_reason: nil)
|
20
|
+
rescue Castle::RequestError, Castle::InternalServerError => e
|
21
|
+
unless config.failover_strategy == :throw
|
22
|
+
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
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
raise e
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Castle
|
4
|
+
module API
|
5
|
+
# Sends PUT devices/#{device_token}/report request
|
6
|
+
module ReportDevice
|
7
|
+
class << self
|
8
|
+
# @param options [Hash]
|
9
|
+
# return [Hash]
|
10
|
+
def call(options = {})
|
11
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
12
|
+
http = options.delete(:http)
|
13
|
+
config = options.delete(:config) || Castle.config
|
14
|
+
|
15
|
+
Castle::API.call(Castle::Commands::ReportDevice.build(options), {}, http, config)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Castle
|
4
|
+
module API
|
5
|
+
# Module for risk endpoint
|
6
|
+
module Risk
|
7
|
+
class << self
|
8
|
+
# @param options [Hash]
|
9
|
+
# return [Hash]
|
10
|
+
def call(options = {})
|
11
|
+
unless options[:no_symbolize]
|
12
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
13
|
+
end
|
14
|
+
options.delete(:no_symbolize)
|
15
|
+
http = options.delete(:http)
|
16
|
+
config = options.delete(:config) || Castle.config
|
17
|
+
|
18
|
+
response = Castle::API.call(Castle::Commands::Risk.build(options), {}, http, config)
|
19
|
+
response.merge(failover: false, failover_reason: nil)
|
20
|
+
rescue Castle::RequestError, Castle::InternalServerError => e
|
21
|
+
unless config.failover_strategy == :throw
|
22
|
+
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
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
raise e
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Castle
|
4
|
+
module API
|
5
|
+
# Sends POST impersonate request
|
6
|
+
module StartImpersonation
|
7
|
+
class << self
|
8
|
+
# @param options [Hash]
|
9
|
+
def call(options = {})
|
10
|
+
unless options[:no_symbolize]
|
11
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
12
|
+
end
|
13
|
+
options.delete(:no_symbolize)
|
14
|
+
http = options.delete(:http)
|
15
|
+
config = options.delete(:config) || Castle.config
|
16
|
+
|
17
|
+
Castle::API
|
18
|
+
.call(Castle::Commands::StartImpersonation.build(options), {}, http, config)
|
19
|
+
.tap { |response| raise Castle::ImpersonationFailed unless response[:success] }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Castle
|
4
|
+
module API
|
5
|
+
module Track
|
6
|
+
class << self
|
7
|
+
# @param options [Hash]
|
8
|
+
def call(options = {})
|
9
|
+
unless options[:no_symbolize]
|
10
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
11
|
+
end
|
12
|
+
options.delete(:no_symbolize)
|
13
|
+
http = options.delete(:http)
|
14
|
+
config = options.delete(:config) || Castle.config
|
15
|
+
|
16
|
+
Castle::API.call(Castle::Commands::Track.build(options), {}, http, config)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/castle/client.rb
CHANGED
@@ -1,86 +1,109 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Castle
|
4
|
+
# Castle's client.
|
4
5
|
class Client
|
5
6
|
class << self
|
6
7
|
def from_request(request, options = {})
|
7
|
-
new(
|
8
|
-
to_context(request, options),
|
9
|
-
to_options(options)
|
10
|
-
)
|
11
|
-
end
|
12
|
-
|
13
|
-
def to_context(request, options = {})
|
14
|
-
default_context = Castle::Context::Default.new(request, options[:cookies]).call
|
15
|
-
Castle::Context::Merger.call(default_context, options[:context])
|
16
|
-
end
|
17
|
-
|
18
|
-
def to_options(options = {})
|
19
|
-
options[:timestamp] ||= Castle::Utils::Timestamp.call
|
20
|
-
warn '[DEPRECATION] use user_traits instead of traits key' if options.key?(:traits)
|
21
|
-
options
|
22
|
-
end
|
23
|
-
|
24
|
-
def failover_response_or_raise(failover_response, error)
|
25
|
-
return failover_response.generate unless Castle.config.failover_strategy == :throw
|
26
|
-
|
27
|
-
raise error
|
8
|
+
new(options.merge(context: Castle::Context::Prepare.call(request, options)))
|
28
9
|
end
|
29
10
|
end
|
30
11
|
|
31
12
|
attr_accessor :context
|
32
13
|
|
33
|
-
|
14
|
+
# @param options [Hash]
|
15
|
+
def initialize(options = {})
|
16
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
34
17
|
@do_not_track = options.fetch(:do_not_track, false)
|
35
|
-
@timestamp = options
|
36
|
-
@context = context
|
18
|
+
@timestamp = options.fetch(:timestamp) { Castle::Utils::GetTimestamp.call }
|
19
|
+
@context = options.fetch(:context) { {} }
|
37
20
|
end
|
38
21
|
|
22
|
+
# @param options [Hash]
|
39
23
|
def authenticate(options = {})
|
40
|
-
options = Castle::Utils.
|
24
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
41
25
|
|
42
26
|
return generate_do_not_track_response(options[:user_id]) unless tracked?
|
43
27
|
|
44
28
|
add_timestamp_if_necessary(options)
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
self.class.failover_response_or_raise(
|
50
|
-
FailoverAuthResponse.new(options[:user_id], reason: e.to_s), e
|
51
|
-
)
|
52
|
-
end
|
29
|
+
|
30
|
+
new_context = Castle::Context::Merge.call(@context, options[:context])
|
31
|
+
|
32
|
+
Castle::API::Authenticate.call(options.merge(context: new_context, no_symbolize: true))
|
53
33
|
end
|
54
34
|
|
55
|
-
|
56
|
-
|
35
|
+
# @param options [Hash]
|
36
|
+
def track(options = {})
|
37
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
57
38
|
|
58
39
|
return unless tracked?
|
59
40
|
|
60
41
|
add_timestamp_if_necessary(options)
|
61
42
|
|
62
|
-
|
63
|
-
|
43
|
+
new_context = Castle::Context::Merge.call(@context, options[:context])
|
44
|
+
|
45
|
+
Castle::API::Track.call(options.merge(context: new_context, no_symbolize: true))
|
64
46
|
end
|
65
47
|
|
66
|
-
|
67
|
-
|
48
|
+
# @param options [Hash]
|
49
|
+
def filter(options = {})
|
50
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
68
51
|
|
69
|
-
return unless tracked?
|
52
|
+
return generate_do_not_track_response(options[:user][:id]) unless tracked?
|
70
53
|
|
71
54
|
add_timestamp_if_necessary(options)
|
72
55
|
|
73
|
-
|
74
|
-
|
56
|
+
new_context = Castle::Context::Merge.call(@context, options[:context])
|
57
|
+
|
58
|
+
Castle::API::Filter.call(options.merge(context: new_context, no_symbolize: true))
|
75
59
|
end
|
76
60
|
|
77
|
-
|
78
|
-
|
61
|
+
# @param options [Hash]
|
62
|
+
def risk(options = {})
|
63
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
64
|
+
|
65
|
+
return generate_do_not_track_response(options[:user][:id]) unless tracked?
|
66
|
+
|
79
67
|
add_timestamp_if_necessary(options)
|
80
|
-
|
81
|
-
Castle::
|
82
|
-
|
83
|
-
|
68
|
+
|
69
|
+
new_context = Castle::Context::Merge.call(@context, options[:context])
|
70
|
+
|
71
|
+
Castle::API::Risk.call(options.merge(context: new_context, no_symbolize: true))
|
72
|
+
end
|
73
|
+
|
74
|
+
# @param options [Hash]
|
75
|
+
def log(options = {})
|
76
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
77
|
+
|
78
|
+
return generate_do_not_track_response(options[:user][:id]) unless tracked?
|
79
|
+
|
80
|
+
add_timestamp_if_necessary(options)
|
81
|
+
|
82
|
+
new_context = Castle::Context::Merge.call(@context, options[:context])
|
83
|
+
|
84
|
+
Castle::API::Log.call(options.merge(context: new_context, no_symbolize: true))
|
85
|
+
end
|
86
|
+
|
87
|
+
# @param options [Hash]
|
88
|
+
def start_impersonation(options = {})
|
89
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
90
|
+
|
91
|
+
add_timestamp_if_necessary(options)
|
92
|
+
|
93
|
+
new_context = Castle::Context::Merge.call(@context, options[:context])
|
94
|
+
|
95
|
+
Castle::API::StartImpersonation.call(options.merge(context: new_context, no_symbolize: true))
|
96
|
+
end
|
97
|
+
|
98
|
+
# @param options [Hash]
|
99
|
+
def end_impersonation(options = {})
|
100
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
101
|
+
|
102
|
+
add_timestamp_if_necessary(options)
|
103
|
+
|
104
|
+
new_context = Castle::Context::Merge.call(@context, options[:context])
|
105
|
+
|
106
|
+
Castle::API::EndImpersonation.call(options.merge(context: new_context, no_symbolize: true))
|
84
107
|
end
|
85
108
|
|
86
109
|
def disable_tracking
|
@@ -91,19 +114,23 @@ module Castle
|
|
91
114
|
@do_not_track = false
|
92
115
|
end
|
93
116
|
|
117
|
+
# @return [Boolean]
|
94
118
|
def tracked?
|
95
119
|
!@do_not_track
|
96
120
|
end
|
97
121
|
|
98
122
|
private
|
99
123
|
|
124
|
+
# @param user_id [String, Boolean]
|
100
125
|
def generate_do_not_track_response(user_id)
|
101
|
-
|
126
|
+
Castle::Failover::PrepareResponse.new(
|
102
127
|
user_id,
|
103
|
-
strategy: :allow,
|
104
|
-
|
128
|
+
strategy: :allow,
|
129
|
+
reason: 'Castle is set to do not track.'
|
130
|
+
).call
|
105
131
|
end
|
106
132
|
|
133
|
+
# @param options [Hash]
|
107
134
|
def add_timestamp_if_necessary(options)
|
108
135
|
options[:timestamp] ||= @timestamp if @timestamp
|
109
136
|
end
|