tcell_agent 0.2.29 → 0.4.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.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/Readme.txt +7 -0
  3. data/bin/tcell_agent +9 -0
  4. data/lib/tcell_agent/agent/policy_manager.rb +3 -0
  5. data/lib/tcell_agent/agent/policy_types.rb +4 -1
  6. data/lib/tcell_agent/appsensor/injections_matcher.rb +20 -0
  7. data/lib/tcell_agent/appsensor/injections_reporter.rb +15 -56
  8. data/lib/tcell_agent/appsensor/meta_data.rb +56 -2
  9. data/lib/tcell_agent/appsensor/rules/baserules.json +371 -138
  10. data/lib/tcell_agent/cmdi.rb +113 -0
  11. data/lib/tcell_agent/config/unknown_options.rb +2 -0
  12. data/lib/tcell_agent/configuration.rb +30 -16
  13. data/lib/tcell_agent/hooks/login_fraud.rb +79 -0
  14. data/lib/tcell_agent/instrumentation.rb +6 -11
  15. data/lib/tcell_agent/patches/meta_data.rb +14 -11
  16. data/lib/tcell_agent/policies/appsensor/injection_sensor.rb +5 -9
  17. data/lib/tcell_agent/policies/appsensor_policy.rb +22 -206
  18. data/lib/tcell_agent/policies/clickjacking_policy.rb +4 -2
  19. data/lib/tcell_agent/policies/command_injection_policy.rb +196 -0
  20. data/lib/tcell_agent/policies/content_security_policy.rb +3 -2
  21. data/lib/tcell_agent/policies/dataloss_policy.rb +3 -1
  22. data/lib/tcell_agent/policies/honeytokens_policy.rb +3 -1
  23. data/lib/tcell_agent/policies/http_redirect_policy.rb +51 -37
  24. data/lib/tcell_agent/policies/http_tx_policy.rb +5 -1
  25. data/lib/tcell_agent/policies/login_fraud_policy.rb +6 -1
  26. data/lib/tcell_agent/policies/patches_policy.rb +3 -1
  27. data/lib/tcell_agent/policies/policy.rb +10 -0
  28. data/lib/tcell_agent/policies/secure_headers_policy.rb +5 -2
  29. data/lib/tcell_agent/rails/auth/devise.rb +12 -23
  30. data/lib/tcell_agent/rails/csrf_exception.rb +1 -1
  31. data/lib/tcell_agent/rails/dlp.rb +50 -54
  32. data/lib/tcell_agent/rails/middleware/body_filter_middleware.rb +0 -1
  33. data/lib/tcell_agent/rails/middleware/context_middleware.rb +0 -1
  34. data/lib/tcell_agent/rails/middleware/global_middleware.rb +0 -1
  35. data/lib/tcell_agent/rails/middleware/headers_middleware.rb +7 -10
  36. data/lib/tcell_agent/rails/on_start.rb +0 -1
  37. data/lib/tcell_agent/rails/tcell_body_proxy.rb +4 -4
  38. data/lib/tcell_agent/rails.rb +0 -2
  39. data/lib/tcell_agent/rust/libtcellagent-0.6.1.dylib +0 -0
  40. data/lib/tcell_agent/rust/libtcellagent-0.6.1.so +0 -0
  41. data/lib/tcell_agent/rust/models.rb +61 -0
  42. data/lib/tcell_agent/rust/tcellagent-0.6.1.dll +0 -0
  43. data/lib/tcell_agent/rust/whisperer.rb +112 -0
  44. data/lib/tcell_agent/sensor_events/appsensor_event.rb +25 -21
  45. data/lib/tcell_agent/sensor_events/appsensor_meta_event.rb +31 -24
  46. data/lib/tcell_agent/sensor_events/command_injection.rb +58 -0
  47. data/lib/tcell_agent/sensor_events/discovery.rb +1 -1
  48. data/lib/tcell_agent/sensor_events/login_fraud.rb +3 -13
  49. data/lib/tcell_agent/sensor_events/sensor.rb +81 -77
  50. data/lib/tcell_agent/sensor_events/util/sanitizer_utilities.rb +8 -0
  51. data/lib/tcell_agent/start_background_thread.rb +12 -3
  52. data/lib/tcell_agent/utils/io.rb +4 -1
  53. data/lib/tcell_agent/utils/params.rb +1 -0
  54. data/lib/tcell_agent/version.rb +1 -1
  55. data/lib/tcell_agent.rb +0 -1
  56. data/spec/lib/tcell_agent/appsensor/injections_matcher_spec.rb +27 -9
  57. data/spec/lib/tcell_agent/appsensor/injections_reporter_spec.rb +143 -193
  58. data/spec/lib/tcell_agent/appsensor/meta_data_spec.rb +67 -0
  59. data/spec/lib/tcell_agent/appsensor/rules/appsensor_rule_manager_spec.rb +0 -10
  60. data/spec/lib/tcell_agent/cmdi_spec.rb +748 -0
  61. data/spec/lib/tcell_agent/config/unknown_options_spec.rb +8 -0
  62. data/spec/lib/tcell_agent/configuration_spec.rb +138 -6
  63. data/spec/lib/tcell_agent/hooks/login_fraud_spec.rb +357 -0
  64. data/spec/lib/tcell_agent/patches/block_rule_spec.rb +70 -87
  65. data/spec/lib/tcell_agent/patches_spec.rb +9 -4
  66. data/spec/lib/tcell_agent/policies/appsensor/xss_sensor_spec.rb +186 -9
  67. data/spec/lib/tcell_agent/policies/appsensor_policy_spec.rb +309 -484
  68. data/spec/lib/tcell_agent/policies/command_injection_policy_spec.rb +736 -0
  69. data/spec/lib/tcell_agent/policies/http_redirect_policy_spec.rb +222 -41
  70. data/spec/lib/tcell_agent/policies/patches_policy_spec.rb +56 -32
  71. data/spec/lib/tcell_agent/rails/middleware/appsensor_middleware_spec.rb +161 -85
  72. data/spec/lib/tcell_agent/rails/middleware/tcell_body_proxy_spec.rb +40 -72
  73. data/spec/lib/tcell_agent/rust/whisperer_spec.rb +267 -0
  74. data/spec/lib/tcell_agent/sensor_events/appsensor_meta_event_spec.rb +20 -15
  75. data/spec/spec_helper.rb +0 -9
  76. data/tcell_agent.gemspec +8 -3
  77. metadata +40 -39
  78. data/lib/tcell_agent/appsensor/sensor.rb +0 -52
  79. data/lib/tcell_agent/policies/appsensor/database_sensor.rb +0 -56
  80. data/lib/tcell_agent/policies/appsensor/misc_sensor.rb +0 -59
  81. data/lib/tcell_agent/policies/appsensor/payloads_policy.rb +0 -150
  82. data/lib/tcell_agent/policies/appsensor/request_size_sensor.rb +0 -25
  83. data/lib/tcell_agent/policies/appsensor/response_codes_sensor.rb +0 -73
  84. data/lib/tcell_agent/policies/appsensor/response_size_sensor.rb +0 -25
  85. data/lib/tcell_agent/policies/appsensor/size_sensor.rb +0 -71
  86. data/lib/tcell_agent/policies/appsensor/user_agent_sensor.rb +0 -47
  87. data/lib/tcell_agent/rails/auth/hooks.rb +0 -79
  88. data/lib/tcell_agent/sensor_events/util/redirect_utils.rb +0 -22
  89. data/spec/lib/tcell_agent/policies/appsensor/database_sensor_spec.rb +0 -165
  90. data/spec/lib/tcell_agent/policies/appsensor/misc_sensor_spec.rb +0 -429
  91. data/spec/lib/tcell_agent/policies/appsensor/payloads_policy_apply_spec.rb +0 -466
  92. data/spec/lib/tcell_agent/policies/appsensor/payloads_policy_from_json_spec.rb +0 -890
  93. data/spec/lib/tcell_agent/policies/appsensor/payloads_policy_log_spec.rb +0 -417
  94. data/spec/lib/tcell_agent/policies/appsensor/request_size_sensor_spec.rb +0 -236
  95. data/spec/lib/tcell_agent/policies/appsensor/response_codes_sensor_spec.rb +0 -297
  96. data/spec/lib/tcell_agent/policies/appsensor/response_size_sensor_spec.rb +0 -241
  97. data/spec/lib/tcell_agent/policies/appsensor/user_agent_sensor_spec.rb +0 -172
  98. data/spec/lib/tcell_agent/rails/auth/hooks_spec.rb +0 -246
  99. data/spec/lib/tcell_agent/sensor_events/util/redirect_utils_spec.rb +0 -25
  100. data/spec/support/resources/baserules.json +0 -155
@@ -10,6 +10,7 @@ module TCellAgent
10
10
 
11
11
  orig_allow_uap = ENV.fetch("TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS", nil)
12
12
  orig_allow_uafp = ENV.fetch("TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS", nil)
13
+ orig_allow_ap = ENV.fetch("TCELL_AGENT_ALLOW_PAYLOADS", nil)
13
14
  orig_demomode = ENV.fetch("TCELL_DEMOMODE", nil)
14
15
  orig_agent_home = ENV.fetch("TCELL_AGENT_HOME", nil)
15
16
  orig_agent_log_dir = ENV.fetch("TCELL_AGENT_LOG_DIR", nil)
@@ -24,6 +25,7 @@ module TCellAgent
24
25
  ENV["TCELL_HACK"] = "hack the system"
25
26
  ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS"] = "valid"
26
27
  ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS"] = "valid"
28
+ ENV["TCELL_AGENT_ALLOW_PAYLOADS"] = "valid"
27
29
  ENV["TCELL_DEMOMODE"] = "valid"
28
30
  ENV["TCELL_AGENT_HOME"] = "valid"
29
31
  ENV["TCELL_AGENT_LOG_DIR"] = "valid"
@@ -49,6 +51,11 @@ module TCellAgent
49
51
  else
50
52
  ENV.delete "TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS"
51
53
  end
54
+ if orig_allow_ap
55
+ ENV["TCELL_AGENT_ALLOW_PAYLOADS"] = orig_allow_ap
56
+ else
57
+ ENV.delete "TCELL_AGENT_ALLOW_PAYLOADS"
58
+ end
52
59
  if orig_demomode
53
60
  ENV["TCELL_DEMOMODE"] = orig_demomode
54
61
  else
@@ -135,6 +142,7 @@ module TCellAgent
135
142
  "event_batch_size_limit" => 50,
136
143
  "allow_unencrypted_appsensor_payloads" => true,
137
144
  "allow_unencrypted_appfirewall_payloads" => true,
145
+ "allow_payloads" => true,
138
146
  "data_exposure" => {
139
147
  "data_ex_level" => "boo",
140
148
  "max_data_ex_db_records_per_request" => 10000},
@@ -178,10 +178,10 @@ module TCellAgent
178
178
  end
179
179
  end
180
180
 
181
- describe "#allow_unencrypted_appfirewall_payloads" do
181
+ describe "#allow_payloads" do
182
182
  context "setting it via config" do
183
183
  context "using allow_unencrypted_appsensor_payloads" do
184
- it "should be true" do
184
+ it "should be false" do
185
185
  allow_unencrypted_appfirewall_payloads_enabled = double(
186
186
  "no_data_ex",
187
187
  read: {
@@ -189,7 +189,7 @@ module TCellAgent
189
189
  applications: [
190
190
  app_id: "app_id",
191
191
  api_key: "api_key",
192
- allow_unencrypted_appsensor_payloads: true
192
+ allow_unencrypted_appsensor_payloads: false
193
193
  ]
194
194
  }.to_json
195
195
  )
@@ -202,12 +202,102 @@ module TCellAgent
202
202
 
203
203
  configuration = Configuration.new
204
204
 
205
- expect(configuration.allow_unencrypted_appfirewall_payloads).to eq(true)
205
+ expect(configuration.allow_payloads).to eq(false)
206
206
  end
207
207
  end
208
208
 
209
209
  context "using allow_unencrypted_appfirewall_payloads" do
210
- it "should be true" do
210
+ it "should be false" do
211
+ allow_unencrypted_appfirewall_payloads_enabled = double(
212
+ "no_data_ex",
213
+ read: {
214
+ version: 1,
215
+ applications: [
216
+ app_id: "app_id",
217
+ api_key: "api_key",
218
+ allow_unencrypted_appfirewall_payloads: false
219
+ ]
220
+ }.to_json
221
+ )
222
+ expect(File).to receive(:file?).with(
223
+ File.join(Dir.getwd, "config/tcell_agent.config")
224
+ ).and_return(true)
225
+ expect(File).to receive(:open).with(
226
+ File.join(Dir.getwd, "config/tcell_agent.config")
227
+ ).and_return(allow_unencrypted_appfirewall_payloads_enabled)
228
+
229
+ configuration = Configuration.new
230
+
231
+ expect(configuration.allow_payloads).to eq(false)
232
+ end
233
+ end
234
+
235
+ context "using allow_payloads" do
236
+ it "should be false" do
237
+ allow_unencrypted_appfirewall_payloads_enabled = double(
238
+ "no_data_ex",
239
+ read: {
240
+ version: 1,
241
+ applications: [
242
+ app_id: "app_id",
243
+ api_key: "api_key",
244
+ allow_payloads: false
245
+ ]
246
+ }.to_json
247
+ )
248
+ expect(File).to receive(:file?).with(
249
+ File.join(Dir.getwd, "config/tcell_agent.config")
250
+ ).and_return(true)
251
+ expect(File).to receive(:open).with(
252
+ File.join(Dir.getwd, "config/tcell_agent.config")
253
+ ).and_return(allow_unencrypted_appfirewall_payloads_enabled)
254
+
255
+ configuration = Configuration.new
256
+
257
+ expect(configuration.allow_payloads).to eq(false)
258
+ end
259
+ end
260
+ end
261
+
262
+ context "setting it via env var" do
263
+ context "TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS overrides config file" do
264
+ it "should be false" do
265
+ old_allow_unencrypted_appsensor_payloads = ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS"]
266
+
267
+ ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS"] = "false"
268
+
269
+ allow_unencrypted_appfirewall_payloads_enabled = double(
270
+ "no_data_ex",
271
+ read: {
272
+ version: 1,
273
+ applications: [
274
+ app_id: "app_id",
275
+ api_key: "api_key",
276
+ allow_unencrypted_appsensor_payloads: true
277
+ ]
278
+ }.to_json
279
+ )
280
+ expect(File).to receive(:file?).with(
281
+ File.join(Dir.getwd, "config/tcell_agent.config")
282
+ ).and_return(true)
283
+ expect(File).to receive(:open).with(
284
+ File.join(Dir.getwd, "config/tcell_agent.config")
285
+ ).and_return(allow_unencrypted_appfirewall_payloads_enabled)
286
+
287
+ configuration = Configuration.new
288
+
289
+ ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS"] = old_allow_unencrypted_appsensor_payloads
290
+
291
+ expect(configuration.allow_payloads).to eq(false)
292
+ end
293
+ end
294
+
295
+ context "TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS overrides config file" do
296
+ it "should be false" do
297
+ old_allow_unencrypted_appfirewall_payloads = ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS"]
298
+
299
+ ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS"] = "false"
300
+
211
301
  allow_unencrypted_appfirewall_payloads_enabled = double(
212
302
  "no_data_ex",
213
303
  read: {
@@ -228,7 +318,49 @@ module TCellAgent
228
318
 
229
319
  configuration = Configuration.new
230
320
 
231
- expect(configuration.allow_unencrypted_appfirewall_payloads).to eq(true)
321
+ ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS"] = old_allow_unencrypted_appfirewall_payloads
322
+
323
+ expect(configuration.allow_payloads).to eq(false)
324
+ end
325
+ end
326
+
327
+ context "TCELL_AGENT_ALLOW_PAYLOADS overrides everything else" do
328
+ it "should be false" do
329
+ old_allow_unencrypted_appsensor_payloads = ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS"]
330
+ old_allow_unencrypted_appfirewall_payloads = ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS"]
331
+ old_tcell_agent_allow_payloads = ENV["TCELL_AGENT_ALLOW_PAYLOADS"]
332
+
333
+ ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS"] = "true"
334
+ ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS"] = "true"
335
+ ENV["TCELL_AGENT_ALLOW_PAYLOADS"] = "false"
336
+
337
+ allow_unencrypted_appfirewall_payloads_enabled = double(
338
+ "no_data_ex",
339
+ read: {
340
+ version: 1,
341
+ applications: [
342
+ app_id: "app_id",
343
+ api_key: "api_key",
344
+ allow_unencrypted_appsensor_payloads: true,
345
+ allow_unencrypted_appfirewall_payloads: true,
346
+ allow_payloads: true
347
+ ]
348
+ }.to_json
349
+ )
350
+ expect(File).to receive(:file?).with(
351
+ File.join(Dir.getwd, "config/tcell_agent.config")
352
+ ).and_return(true)
353
+ expect(File).to receive(:open).with(
354
+ File.join(Dir.getwd, "config/tcell_agent.config")
355
+ ).and_return(allow_unencrypted_appfirewall_payloads_enabled)
356
+
357
+ configuration = Configuration.new
358
+
359
+ ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS"] = old_allow_unencrypted_appsensor_payloads
360
+ ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS"] = old_allow_unencrypted_appfirewall_payloads
361
+ ENV["TCELL_AGENT_ALLOW_PAYLOADS"] = old_tcell_agent_allow_payloads
362
+
363
+ expect(configuration.allow_payloads).to eq(false)
232
364
  end
233
365
  end
234
366
  end
@@ -0,0 +1,357 @@
1
+ require 'spec_helper'
2
+
3
+ module TCellAgent
4
+
5
+ module Hooks
6
+ module V1
7
+ module Frameworks
8
+ module Rails
9
+ module Login
10
+ def self.register_login_event(status, rails_request, user_id, user_valid=nil)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ module Hooks
19
+ module V1
20
+ module Login
21
+ LOGIN_SUCCESS = "success"
22
+ LOGIN_FAILURE = "failure"
23
+ def self.register_login_event(status, session_id, user_agent, referrer, remote_addr, header_keys, user_id, document_uri, user_valid=nil)
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ describe "manually requiring auth hooks" do
30
+ before(:all) do
31
+ require 'tcell_agent/hooks/login_fraud'
32
+ end
33
+
34
+ describe "Using generic interface" do
35
+ context "with a login failure" do
36
+ context "with login_failed_enabled set to true" do
37
+ it "should report the login failure" do
38
+ login_fraud = double("login_fraud", enabled: true, login_failed_enabled: true)
39
+
40
+ expect(TCellAgent).to receive(:policy).with(TCellAgent::PolicyTypes::LoginFraud).and_return(
41
+ login_fraud
42
+ )
43
+ expect(TCellAgent).to receive(:send_event).with(
44
+ {
45
+ "event_type" => "login",
46
+ "header_keys" => ["USER_AGENT", "X_FORWARDED_FOR"],
47
+ "user_agent" => "user_agent",
48
+ "referrer" => "referrer",
49
+ "remote_addr" => "1.1.1.1",
50
+ "user_id" => "user_id",
51
+ "document_uri" => "http://tcell.tcell.io/login?param_name=",
52
+ "session" => "48c0ce7961d8d5d4bd57bd77976b3d38",
53
+ "event_name" => "login-failure"
54
+ }
55
+ )
56
+
57
+ status = Hooks::V1::Login::LOGIN_FAILURE
58
+ header_keys = ["HTTP_USER_AGENT", "HTTP_X_FORWARDED_FOR"]
59
+ document_uri = "http://tcell.tcell.io/login?param_name=param_value"
60
+
61
+ Hooks::V1::Login.register_login_event(
62
+ status, "session_id", "user_agent", "referrer", "1.1.1.1", header_keys, "user_id", document_uri
63
+ )
64
+ end
65
+ end
66
+
67
+ context "with login_failed_enabled set to false" do
68
+ it "should NOT report the login failure" do
69
+ login_fraud = double("login_fraud", enabled: true, login_failed_enabled: false)
70
+
71
+ expect(TCellAgent).to receive(:policy).with(TCellAgent::PolicyTypes::LoginFraud).and_return(
72
+ login_fraud
73
+ )
74
+ expect(TCellAgent).to_not receive(:send_event)
75
+
76
+ status = Hooks::V1::Login::LOGIN_FAILURE
77
+ header_keys = ["HTTP_USER_AGENT", "HTTP_X_FORWARDED_FOR"]
78
+ document_uri = "http://tcell.tcell.io/login?param_name=param_value"
79
+
80
+ Hooks::V1::Login.register_login_event(
81
+ status, "session_id", "user_agent", "referrer", "1.1.1.1", header_keys, "user_id", document_uri
82
+ )
83
+ end
84
+ end
85
+ end
86
+
87
+ context "with a login success" do
88
+ context "with login_success_enabled set to true" do
89
+ it "should report the login success" do
90
+ login_fraud = double("login_fraud", enabled: true, login_success_enabled: true)
91
+
92
+ expect(TCellAgent).to receive(:policy).with(TCellAgent::PolicyTypes::LoginFraud).and_return(
93
+ login_fraud
94
+ )
95
+ expect(TCellAgent).to receive(:send_event).with(
96
+ {
97
+ "event_type" => "login",
98
+ "header_keys" => ["USER_AGENT", "X_FORWARDED_FOR"],
99
+ "user_agent" => "user_agent",
100
+ "referrer" => "referrer",
101
+ "remote_addr" => "1.1.1.1",
102
+ "user_id" => "user_id",
103
+ "document_uri" => "http://tcell.tcell.io/login?param_name=",
104
+ "session" => "48c0ce7961d8d5d4bd57bd77976b3d38",
105
+ "event_name" => "login-success"
106
+ }
107
+ )
108
+
109
+ status = Hooks::V1::Login::LOGIN_SUCCESS
110
+ header_keys = ["HTTP_USER_AGENT", "HTTP_X_FORWARDED_FOR"]
111
+ document_uri = "http://tcell.tcell.io/login?param_name=param_value"
112
+
113
+ Hooks::V1::Login.register_login_event(
114
+ status, "session_id", "user_agent", "referrer", "1.1.1.1", header_keys, "user_id", document_uri
115
+ )
116
+ end
117
+ end
118
+
119
+ context "with login_success_enabled set to false" do
120
+ it "should NOT report the login success" do
121
+ login_fraud = double("login_fraud", enabled: true, login_success_enabled: false)
122
+
123
+ expect(TCellAgent).to receive(:policy).with(TCellAgent::PolicyTypes::LoginFraud).and_return(
124
+ login_fraud
125
+ )
126
+ expect(TCellAgent).to_not receive(:send_event)
127
+
128
+ status = Hooks::V1::Login::LOGIN_SUCCESS
129
+ header_keys = ["HTTP_USER_AGENT", "HTTP_X_FORWARDED_FOR"]
130
+ document_uri = "http://tcell.tcell.io/login?param_name=param_value"
131
+
132
+ Hooks::V1::Login.register_login_event(
133
+ status, "session_id", "user_agent", "referrer", "1.1.1.1", header_keys, "user_id", document_uri
134
+ )
135
+ end
136
+ end
137
+ end
138
+
139
+ context "with an unknown status" do
140
+ it "should log the error" do
141
+ login_fraud = double("login_fraud", enabled: true)
142
+ logger = double("logger")
143
+
144
+ expect(TCellAgent).to receive(:policy).with(TCellAgent::PolicyTypes::LoginFraud).and_return(
145
+ login_fraud
146
+ )
147
+ expect(TCellAgent).to_not receive(:send_event)
148
+ expect(TCellAgent).to receive(:logger).and_return(logger)
149
+ expect(logger).to receive(:error).with("Unkown login status: mumbo-jumbo")
150
+
151
+ status = "mumbo-jumbo"
152
+ header_keys = ["HTTP_USER_AGENT", "HTTP_X_FORWARDED_FOR"]
153
+ document_uri = "http://tcell.tcell.io/login?param_name=param_value"
154
+
155
+ Hooks::V1::Login.register_login_event(
156
+ status, "session_id", "user_agent", "referrer", "1.1.1.1", header_keys, "user_id", document_uri
157
+ )
158
+ end
159
+ end
160
+ end
161
+
162
+ describe "Using rails interface" do
163
+ context "with a login failure" do
164
+ context "with login_failed_enabled set to true" do
165
+ it "should report the login failure" do
166
+ login_fraud = double("login_fraud", enabled: true, login_failed_enabled: true)
167
+ rails_request = double("rails_request")
168
+ tcell_data = TCellAgent::Instrumentation::TCellData.new
169
+ tcell_data.user_agent = "user_agent"
170
+ tcell_data.referrer = "referrer"
171
+ tcell_data.ip_address = "1.1.1.1"
172
+ tcell_data.path = "http://tcell.tcell.io/login?param_name=param_value"
173
+ tcell_data.hmac_session_id = TCellAgent::SensorEvents::Util.hmac("session_id")
174
+ request_env = {
175
+ TCellAgent::Instrumentation::TCELL_ID => tcell_data,
176
+ "HTTP_USER_AGENT" => true,
177
+ "HTTP_X_FORWARDED_FOR" => true
178
+ }
179
+
180
+
181
+ expect(TCellAgent).to receive(:policy).with(TCellAgent::PolicyTypes::LoginFraud).and_return(
182
+ login_fraud
183
+ )
184
+ expect(rails_request).to receive(:env).and_return(request_env)
185
+ expect(rails_request).to receive(:env).and_return(request_env)
186
+ expect(TCellAgent).to receive(:send_event).with(
187
+ {
188
+ "event_type" => "login",
189
+ "header_keys" => ["USER_AGENT", "X_FORWARDED_FOR"],
190
+ "user_agent" => "user_agent",
191
+ "referrer" => "referrer",
192
+ "remote_addr" => "1.1.1.1",
193
+ "user_id" => "user_id",
194
+ "document_uri" => "http://tcell.tcell.io/login?param_name=",
195
+ "session" => "48c0ce7961d8d5d4bd57bd77976b3d38",
196
+ "event_name" => "login-failure"
197
+ }
198
+ )
199
+
200
+ status = Hooks::V1::Login::LOGIN_FAILURE
201
+
202
+ Hooks::V1::Frameworks::Rails::Login.register_login_event(
203
+ status, rails_request, "user_id"
204
+ )
205
+ end
206
+ end
207
+
208
+ context "with login_failed_enabled set to false" do
209
+ it "should NOT report the login failure" do
210
+ login_fraud = double("login_fraud", enabled: true, login_failed_enabled: false)
211
+ rails_request = double("rails_request")
212
+ tcell_data = TCellAgent::Instrumentation::TCellData.new
213
+ tcell_data.user_agent = "user_agent"
214
+ tcell_data.referrer = "referrer"
215
+ tcell_data.ip_address = "1.1.1.1"
216
+ tcell_data.path = "http://tcell.tcell.io/login?param_name=param_value"
217
+ tcell_data.hmac_session_id = TCellAgent::SensorEvents::Util.hmac("session_id")
218
+ request_env = {
219
+ TCellAgent::Instrumentation::TCELL_ID => tcell_data,
220
+ "HTTP_USER_AGENT" => true,
221
+ "HTTP_X_FORWARDED_FOR" => true
222
+ }
223
+
224
+
225
+ expect(TCellAgent).to receive(:policy).with(TCellAgent::PolicyTypes::LoginFraud).and_return(
226
+ login_fraud
227
+ )
228
+ expect(rails_request).to receive(:env).and_return(request_env)
229
+ expect(rails_request).to receive(:env).and_return(request_env)
230
+ expect(TCellAgent).to_not receive(:send_event)
231
+
232
+ status = Hooks::V1::Login::LOGIN_FAILURE
233
+
234
+ Hooks::V1::Frameworks::Rails::Login.register_login_event(
235
+ status, rails_request, "user_id"
236
+ )
237
+ end
238
+ end
239
+ end
240
+
241
+ context "with a login success" do
242
+ context "with login_success_enabled set to true" do
243
+ it "should report the login success" do
244
+ login_fraud = double("login_fraud", enabled: true, login_success_enabled: true)
245
+ rails_request = double("rails_request")
246
+ tcell_data = TCellAgent::Instrumentation::TCellData.new
247
+ tcell_data.user_agent = "user_agent"
248
+ tcell_data.referrer = "referrer"
249
+ tcell_data.ip_address = "1.1.1.1"
250
+ tcell_data.path = "http://tcell.tcell.io/login?param_name=param_value"
251
+ tcell_data.hmac_session_id = TCellAgent::SensorEvents::Util.hmac("session_id")
252
+ request_env = {
253
+ TCellAgent::Instrumentation::TCELL_ID => tcell_data,
254
+ "HTTP_USER_AGENT" => true,
255
+ "HTTP_X_FORWARDED_FOR" => true
256
+ }
257
+
258
+
259
+ expect(TCellAgent).to receive(:policy).with(TCellAgent::PolicyTypes::LoginFraud).and_return(
260
+ login_fraud
261
+ )
262
+ expect(rails_request).to receive(:env).and_return(request_env)
263
+ expect(rails_request).to receive(:env).and_return(request_env)
264
+ expect(TCellAgent).to receive(:send_event).with(
265
+ {
266
+ "event_type" => "login",
267
+ "header_keys" => ["USER_AGENT", "X_FORWARDED_FOR"],
268
+ "user_agent" => "user_agent",
269
+ "referrer" => "referrer",
270
+ "remote_addr" => "1.1.1.1",
271
+ "user_id" => "user_id",
272
+ "document_uri" => "http://tcell.tcell.io/login?param_name=",
273
+ "session" => "48c0ce7961d8d5d4bd57bd77976b3d38",
274
+ "event_name" => "login-success"
275
+ }
276
+ )
277
+
278
+ status = Hooks::V1::Login::LOGIN_SUCCESS
279
+
280
+ Hooks::V1::Frameworks::Rails::Login.register_login_event(
281
+ status, rails_request, "user_id"
282
+ )
283
+ end
284
+ end
285
+
286
+ context "with login_success_enabled set to false" do
287
+ it "should NOT report the login success" do
288
+ login_fraud = double("login_fraud", enabled: true, login_success_enabled: false)
289
+ rails_request = double("rails_request")
290
+ tcell_data = TCellAgent::Instrumentation::TCellData.new
291
+ tcell_data.user_agent = "user_agent"
292
+ tcell_data.referrer = "referrer"
293
+ tcell_data.ip_address = "1.1.1.1"
294
+ tcell_data.path = "http://tcell.tcell.io/login?param_name=param_value"
295
+ tcell_data.hmac_session_id = TCellAgent::SensorEvents::Util.hmac("session_id")
296
+ request_env = {
297
+ TCellAgent::Instrumentation::TCELL_ID => tcell_data,
298
+ "HTTP_USER_AGENT" => true,
299
+ "HTTP_X_FORWARDED_FOR" => true
300
+ }
301
+
302
+
303
+ expect(TCellAgent).to receive(:policy).with(TCellAgent::PolicyTypes::LoginFraud).and_return(
304
+ login_fraud
305
+ )
306
+ expect(rails_request).to receive(:env).and_return(request_env)
307
+ expect(rails_request).to receive(:env).and_return(request_env)
308
+ expect(TCellAgent).to_not receive(:send_event)
309
+
310
+ status = Hooks::V1::Login::LOGIN_SUCCESS
311
+
312
+ Hooks::V1::Frameworks::Rails::Login.register_login_event(
313
+ status, rails_request, "user_id"
314
+ )
315
+ end
316
+ end
317
+ end
318
+
319
+ context "with an unknown status" do
320
+ it "should log the error" do
321
+ login_fraud = double("login_fraud", enabled: true, login_failed_enabled: true)
322
+ logger = double("logger")
323
+ rails_request = double("rails_request")
324
+ tcell_data = TCellAgent::Instrumentation::TCellData.new
325
+ tcell_data.user_agent = "user_agent"
326
+ tcell_data.referrer = "referrer"
327
+ tcell_data.ip_address = "1.1.1.1"
328
+ tcell_data.path = "http://tcell.tcell.io/login?param_name=param_value"
329
+ tcell_data.hmac_session_id = TCellAgent::SensorEvents::Util.hmac("session_id")
330
+ request_env = {
331
+ TCellAgent::Instrumentation::TCELL_ID => tcell_data,
332
+ "HTTP_USER_AGENT" => true,
333
+ "HTTP_X_FORWARDED_FOR" => true
334
+ }
335
+
336
+
337
+ expect(TCellAgent).to receive(:policy).with(TCellAgent::PolicyTypes::LoginFraud).and_return(
338
+ login_fraud
339
+ )
340
+ expect(rails_request).to receive(:env).and_return(request_env)
341
+ expect(rails_request).to receive(:env).and_return(request_env)
342
+ expect(TCellAgent).to_not receive(:send_event)
343
+ expect(TCellAgent).to receive(:logger).and_return(logger)
344
+ expect(logger).to receive(:error).with("Unkown login status: mumbo-jumbo")
345
+
346
+ status = "mumbo-jumbo"
347
+
348
+ Hooks::V1::Frameworks::Rails::Login.register_login_event(
349
+ status, rails_request, "user_id"
350
+ )
351
+ end
352
+ end
353
+ end
354
+
355
+ end
356
+
357
+ end