castle-rb 5.0.0 → 7.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +113 -39
  3. data/lib/castle.rb +49 -29
  4. data/lib/castle/api.rb +20 -16
  5. data/lib/castle/api/approve_device.rb +20 -0
  6. data/lib/castle/api/authenticate.rb +37 -0
  7. data/lib/castle/api/end_impersonation.rb +24 -0
  8. data/lib/castle/api/filter.rb +37 -0
  9. data/lib/castle/api/get_device.rb +20 -0
  10. data/lib/castle/api/get_devices_for_user.rb +20 -0
  11. data/lib/castle/api/log.rb +37 -0
  12. data/lib/castle/api/report_device.rb +20 -0
  13. data/lib/castle/api/risk.rb +37 -0
  14. data/lib/castle/api/start_impersonation.rb +24 -0
  15. data/lib/castle/api/track.rb +21 -0
  16. data/lib/castle/client.rb +74 -68
  17. data/lib/castle/{extractors/client_id.rb → client_id/extract.rb} +2 -2
  18. data/lib/castle/commands/approve_device.rb +17 -0
  19. data/lib/castle/commands/authenticate.rb +13 -13
  20. data/lib/castle/commands/end_impersonation.rb +25 -0
  21. data/lib/castle/commands/filter.rb +22 -0
  22. data/lib/castle/commands/get_device.rb +17 -0
  23. data/lib/castle/commands/get_devices_for_user.rb +17 -0
  24. data/lib/castle/commands/log.rb +22 -0
  25. data/lib/castle/commands/report_device.rb +17 -0
  26. data/lib/castle/commands/risk.rb +22 -0
  27. data/lib/castle/commands/start_impersonation.rb +25 -0
  28. data/lib/castle/commands/track.rb +12 -13
  29. data/lib/castle/configuration.rb +31 -23
  30. data/lib/castle/context/{default.rb → get_default.rb} +5 -6
  31. data/lib/castle/context/{merger.rb → merge.rb} +3 -3
  32. data/lib/castle/context/prepare.rb +18 -0
  33. data/lib/castle/context/{sanitizer.rb → sanitize.rb} +1 -1
  34. data/lib/castle/core/get_connection.rb +27 -0
  35. data/lib/castle/{api/response.rb → core/process_response.rb} +8 -3
  36. data/lib/castle/core/process_webhook.rb +25 -0
  37. data/lib/castle/core/send_request.rb +42 -0
  38. data/lib/castle/errors.rb +38 -12
  39. data/lib/castle/failover/prepare_response.rb +28 -0
  40. data/lib/castle/failover/strategy.rb +23 -0
  41. data/lib/castle/{extractors/headers.rb → headers/extract.rb} +8 -6
  42. data/lib/castle/headers/filter.rb +40 -0
  43. data/lib/castle/headers/format.rb +24 -0
  44. data/lib/castle/{extractors/ip.rb → ips/extract.rb} +11 -7
  45. data/lib/castle/logger.rb +19 -0
  46. data/lib/castle/payload/prepare.rb +26 -0
  47. data/lib/castle/secure_mode.rb +7 -2
  48. data/lib/castle/session.rb +18 -0
  49. data/lib/castle/singleton_configuration.rb +9 -0
  50. data/lib/castle/support/hanami.rb +2 -6
  51. data/lib/castle/support/rails.rb +1 -3
  52. data/lib/castle/utils/clean_invalid_chars.rb +22 -0
  53. data/lib/castle/utils/clone.rb +15 -0
  54. data/lib/castle/utils/deep_symbolize_keys.rb +45 -0
  55. data/lib/castle/utils/get_timestamp.rb +15 -0
  56. data/lib/castle/utils/{merger.rb → merge.rb} +3 -3
  57. data/lib/castle/utils/secure_compare.rb +22 -0
  58. data/lib/castle/validators/not_supported.rb +1 -0
  59. data/lib/castle/validators/present.rb +1 -0
  60. data/lib/castle/verdict.rb +15 -0
  61. data/lib/castle/version.rb +1 -1
  62. data/lib/castle/webhooks/verify.rb +45 -0
  63. data/spec/integration/rails/rails_spec.rb +42 -14
  64. data/spec/integration/rails/support/application.rb +3 -1
  65. data/spec/integration/rails/support/home_controller.rb +50 -6
  66. data/spec/lib/castle/api/approve_device_spec.rb +21 -0
  67. data/spec/lib/castle/api/authenticate_spec.rb +136 -0
  68. data/spec/lib/castle/api/end_impersonation_spec.rb +65 -0
  69. data/spec/lib/castle/api/filter_spec.rb +5 -0
  70. data/spec/lib/castle/api/get_device_spec.rb +19 -0
  71. data/spec/lib/castle/api/get_devices_for_user_spec.rb +19 -0
  72. data/spec/lib/castle/api/log_spec.rb +5 -0
  73. data/spec/lib/castle/api/report_device_spec.rb +21 -0
  74. data/spec/lib/castle/api/risk_spec.rb +5 -0
  75. data/spec/lib/castle/api/start_impersonation_spec.rb +65 -0
  76. data/spec/lib/castle/api/track_spec.rb +72 -0
  77. data/spec/lib/castle/api_spec.rb +14 -15
  78. data/spec/lib/castle/{extractors/client_id_spec.rb → client_id/extract_spec.rb} +6 -15
  79. data/spec/lib/castle/client_spec.rb +110 -92
  80. data/spec/lib/castle/commands/approve_device_spec.rb +24 -0
  81. data/spec/lib/castle/commands/authenticate_spec.rb +15 -31
  82. data/spec/lib/castle/commands/end_impersonation_spec.rb +79 -0
  83. data/spec/lib/castle/commands/filter_spec.rb +72 -0
  84. data/spec/lib/castle/commands/get_device_spec.rb +24 -0
  85. data/spec/lib/castle/commands/{review_spec.rb → get_devices_for_user_spec.rb} +7 -7
  86. data/spec/lib/castle/commands/log_spec.rb +73 -0
  87. data/spec/lib/castle/commands/report_device_spec.rb +24 -0
  88. data/spec/lib/castle/commands/risk_spec.rb +73 -0
  89. data/spec/lib/castle/commands/{impersonate_spec.rb → start_impersonation_spec.rb} +13 -41
  90. data/spec/lib/castle/commands/track_spec.rb +14 -34
  91. data/spec/lib/castle/configuration_spec.rb +8 -141
  92. data/spec/lib/castle/context/{default_spec.rb → get_default_spec.rb} +9 -10
  93. data/spec/lib/castle/context/{merger_spec.rb → merge_spec.rb} +1 -1
  94. data/spec/lib/castle/context/prepare_spec.rb +43 -0
  95. data/spec/lib/castle/context/{sanitizer_spec.rb → sanitize_spec.rb} +1 -1
  96. data/spec/lib/castle/core/get_connection_spec.rb +43 -0
  97. data/spec/lib/castle/{api/response_spec.rb → core/process_response_spec.rb} +49 -1
  98. data/spec/lib/castle/core/process_webhook_spec.rb +46 -0
  99. data/spec/lib/castle/{api/request_spec.rb → core/send_request_spec.rb} +16 -37
  100. data/spec/lib/castle/failover/strategy_spec.rb +12 -0
  101. data/spec/lib/castle/{extractors/headers_spec.rb → headers/extract_spec.rb} +7 -9
  102. data/spec/lib/castle/headers/filter_spec.rb +39 -0
  103. data/spec/lib/castle/headers/format_spec.rb +25 -0
  104. data/spec/lib/castle/{extractors/ip_spec.rb → ips/extract_spec.rb} +5 -14
  105. data/spec/lib/castle/logger_spec.rb +38 -0
  106. data/spec/lib/castle/payload/prepare_spec.rb +55 -0
  107. data/spec/lib/castle/session_spec.rb +65 -0
  108. data/spec/lib/castle/singleton_configuration_spec.rb +14 -0
  109. data/spec/lib/castle/utils/clean_invalid_chars_spec.rb +69 -0
  110. data/spec/lib/castle/utils/{cloner_spec.rb → clone_spec.rb} +3 -3
  111. data/spec/lib/castle/utils/deep_symbolize_keys_spec.rb +50 -0
  112. data/spec/lib/castle/utils/{timestamp_spec.rb → get_timestamp_spec.rb} +1 -1
  113. data/spec/lib/castle/utils/merge_spec.rb +15 -0
  114. data/spec/lib/castle/validators/present_spec.rb +5 -6
  115. data/spec/lib/castle/verdict_spec.rb +9 -0
  116. data/spec/lib/castle/webhooks/verify_spec.rb +53 -0
  117. data/spec/lib/castle_spec.rb +4 -10
  118. data/spec/spec_helper.rb +3 -3
  119. data/spec/support/shared_examples/action_request.rb +155 -0
  120. data/spec/support/shared_examples/configuration.rb +101 -0
  121. metadata +144 -67
  122. data/lib/castle/api/connection.rb +0 -24
  123. data/lib/castle/api/request.rb +0 -42
  124. data/lib/castle/api/session.rb +0 -20
  125. data/lib/castle/commands/identify.rb +0 -23
  126. data/lib/castle/commands/impersonate.rb +0 -26
  127. data/lib/castle/commands/review.rb +0 -14
  128. data/lib/castle/events.rb +0 -49
  129. data/lib/castle/failover_auth_response.rb +0 -21
  130. data/lib/castle/headers_filter.rb +0 -35
  131. data/lib/castle/headers_formatter.rb +0 -22
  132. data/lib/castle/review.rb +0 -11
  133. data/lib/castle/utils.rb +0 -55
  134. data/lib/castle/utils/cloner.rb +0 -11
  135. data/lib/castle/utils/timestamp.rb +0 -12
  136. data/spec/lib/castle/api/connection_spec.rb +0 -59
  137. data/spec/lib/castle/api/session_spec.rb +0 -86
  138. data/spec/lib/castle/commands/identify_spec.rb +0 -88
  139. data/spec/lib/castle/events_spec.rb +0 -5
  140. data/spec/lib/castle/headers_filter_spec.rb +0 -38
  141. data/spec/lib/castle/headers_formatter_spec.rb +0 -25
  142. data/spec/lib/castle/review_spec.rb +0 -19
  143. data/spec/lib/castle/utils/merger_spec.rb +0 -13
  144. 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
- def initialize(context, options = {})
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[:timestamp]
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.deep_symbolize_keys(options || {})
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
- begin
47
- Castle::API
48
- .call(authenticate_command(options), {}, options[:http])
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
- def identify(options = {})
58
- options = Castle::Utils.deep_symbolize_keys(options || {})
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::API.call(identify_command(options), {}, options[:http])
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
- def track(options = {})
68
- options = Castle::Utils.deep_symbolize_keys(options || {})
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::API.call(track_command(options), {}, options[:http])
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
- def impersonate(options = {})
78
- options = Castle::Utils.deep_symbolize_keys(options || {})
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::API.call(impersonate_command(options), {}, options[:http]).tap do |response|
83
- raise Castle::ImpersonationFailed unless response[:success]
84
- end
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
- FailoverAuthResponse.new(
126
+ Castle::Failover::PrepareResponse.new(
103
127
  user_id,
104
- strategy: :allow, reason: 'Castle is set to do not track.'
105
- ).generate
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