castle-rb 5.0.0 → 7.1.1
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 +113 -39
- data/lib/castle.rb +49 -29
- data/lib/castle/api.rb +20 -16
- 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 +74 -68
- 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 +22 -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 +22 -0
- data/lib/castle/commands/report_device.rb +17 -0
- data/lib/castle/commands/risk.rb +22 -0
- data/lib/castle/commands/start_impersonation.rb +25 -0
- data/lib/castle/commands/track.rb +12 -13
- data/lib/castle/configuration.rb +31 -23
- 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 +28 -0
- data/lib/castle/failover/strategy.rb +23 -0
- data/lib/castle/{extractors/headers.rb → headers/extract.rb} +8 -6
- 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} +11 -7
- 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 +110 -92
- 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 +72 -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 +73 -0
- data/spec/lib/castle/commands/report_device_spec.rb +24 -0
- data/spec/lib/castle/commands/risk_spec.rb +73 -0
- data/spec/lib/castle/commands/{impersonate_spec.rb → start_impersonation_spec.rb} +13 -41
- 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/{api/request_spec.rb → core/send_request_spec.rb} +16 -37
- data/spec/lib/castle/failover/strategy_spec.rb +12 -0
- data/spec/lib/castle/{extractors/headers_spec.rb → headers/extract_spec.rb} +7 -9
- 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} +5 -14
- 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 +155 -0
- data/spec/support/shared_examples/configuration.rb +101 -0
- metadata +144 -67
- data/lib/castle/api/connection.rb +0 -24
- data/lib/castle/api/request.rb +0 -42
- data/lib/castle/api/session.rb +0 -20
- 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/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/connection_spec.rb +0 -59
- data/spec/lib/castle/api/session_spec.rb +0 -86
- data/spec/lib/castle/commands/identify_spec.rb +0 -88
- data/spec/lib/castle/events_spec.rb +0 -5
- data/spec/lib/castle/headers_filter_spec.rb +0 -38
- 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,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,87 +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
29
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
.merge(failover: false, failover_reason: nil)
|
50
|
-
rescue Castle::RequestError, Castle::InternalServerError => e
|
51
|
-
self.class.failover_response_or_raise(
|
52
|
-
FailoverAuthResponse.new(options[:user_id], reason: e.to_s), e
|
53
|
-
)
|
54
|
-
end
|
30
|
+
new_context = Castle::Context::Merge.call(@context, options[:context])
|
31
|
+
|
32
|
+
Castle::API::Authenticate.call(options.merge(context: new_context, no_symbolize: true))
|
55
33
|
end
|
56
34
|
|
57
|
-
|
58
|
-
|
35
|
+
# @param options [Hash]
|
36
|
+
def track(options = {})
|
37
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
59
38
|
|
60
39
|
return unless tracked?
|
61
40
|
|
62
41
|
add_timestamp_if_necessary(options)
|
63
42
|
|
64
|
-
Castle::
|
43
|
+
new_context = Castle::Context::Merge.call(@context, options[:context])
|
44
|
+
|
45
|
+
Castle::API::Track.call(options.merge(context: new_context, no_symbolize: true))
|
65
46
|
end
|
66
47
|
|
67
|
-
|
68
|
-
|
48
|
+
# @param options [Hash]
|
49
|
+
def filter(options = {})
|
50
|
+
options = Castle::Utils::DeepSymbolizeKeys.call(options || {})
|
69
51
|
|
70
|
-
return unless tracked?
|
52
|
+
return generate_do_not_track_response(options[:user][:id]) unless tracked?
|
71
53
|
|
72
54
|
add_timestamp_if_necessary(options)
|
73
55
|
|
74
|
-
Castle::
|
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?
|
79
66
|
|
80
67
|
add_timestamp_if_necessary(options)
|
81
68
|
|
82
|
-
Castle::
|
83
|
-
|
84
|
-
|
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))
|
85
107
|
end
|
86
108
|
|
87
109
|
def disable_tracking
|
@@ -92,39 +114,23 @@ module Castle
|
|
92
114
|
@do_not_track = false
|
93
115
|
end
|
94
116
|
|
117
|
+
# @return [Boolean]
|
95
118
|
def tracked?
|
96
119
|
!@do_not_track
|
97
120
|
end
|
98
121
|
|
99
122
|
private
|
100
123
|
|
124
|
+
# @param user_id [String, Boolean]
|
101
125
|
def generate_do_not_track_response(user_id)
|
102
|
-
|
126
|
+
Castle::Failover::PrepareResponse.new(
|
103
127
|
user_id,
|
104
|
-
strategy: :allow,
|
105
|
-
|
128
|
+
strategy: :allow,
|
129
|
+
reason: 'Castle is set to do not track.'
|
130
|
+
).call
|
106
131
|
end
|
107
132
|
|
108
133
|
# @param options [Hash]
|
109
|
-
def authenticate_command(options)
|
110
|
-
Castle::Commands::Authenticate.new(@context).build(options)
|
111
|
-
end
|
112
|
-
|
113
|
-
# @param options [Hash]
|
114
|
-
def identify_command(options)
|
115
|
-
Castle::Commands::Identify.new(@context).build(options)
|
116
|
-
end
|
117
|
-
|
118
|
-
# @param options [Hash]
|
119
|
-
def impersonate_command(options)
|
120
|
-
Castle::Commands::Impersonate.new(@context).build(options)
|
121
|
-
end
|
122
|
-
|
123
|
-
# @param options [Hash]
|
124
|
-
def track_command(options)
|
125
|
-
Castle::Commands::Track.new(@context).build(options)
|
126
|
-
end
|
127
|
-
|
128
134
|
def add_timestamp_if_necessary(options)
|
129
135
|
options[:timestamp] ||= @timestamp if @timestamp
|
130
136
|
end
|