tcell_agent 0.4.0 → 1.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.
Files changed (199) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +9 -22
  3. data/bin/tcell_agent +127 -132
  4. data/lib/tcell_agent/agent/event_processor.rb +23 -22
  5. data/lib/tcell_agent/agent/fork_pipe_manager.rb +7 -7
  6. data/lib/tcell_agent/agent/policy_manager.rb +20 -15
  7. data/lib/tcell_agent/agent/policy_types.rb +5 -11
  8. data/lib/tcell_agent/agent/static_agent.rb +5 -1
  9. data/lib/tcell_agent/agent.rb +6 -4
  10. data/lib/tcell_agent/api.rb +7 -9
  11. data/lib/tcell_agent/appsensor/meta_data.rb +11 -4
  12. data/lib/tcell_agent/authlogic.rb +3 -3
  13. data/lib/tcell_agent/cmdi.rb +6 -4
  14. data/lib/tcell_agent/config/unknown_options.rb +3 -1
  15. data/lib/tcell_agent/configuration.rb +47 -49
  16. data/lib/tcell_agent/devise.rb +2 -2
  17. data/lib/tcell_agent/hooks/login_fraud.rb +58 -29
  18. data/lib/tcell_agent/instrumentation.rb +11 -10
  19. data/lib/tcell_agent/logger.rb +2 -2
  20. data/lib/tcell_agent/patches/meta_data.rb +9 -13
  21. data/lib/tcell_agent/patches.rb +7 -10
  22. data/lib/tcell_agent/policies/clickjacking_policy.rb +4 -5
  23. data/lib/tcell_agent/policies/content_security_policy.rb +6 -12
  24. data/lib/tcell_agent/policies/dataloss_policy.rb +2 -2
  25. data/lib/tcell_agent/policies/http_redirect_policy.rb +2 -2
  26. data/lib/tcell_agent/policies/policy.rb +0 -2
  27. data/lib/tcell_agent/policies/rust_policies.rb +90 -0
  28. data/lib/tcell_agent/policies/secure_headers_policy.rb +2 -2
  29. data/lib/tcell_agent/rails/auth/authlogic.rb +42 -24
  30. data/lib/tcell_agent/rails/auth/devise.rb +44 -23
  31. data/lib/tcell_agent/rails/auth/doorkeeper.rb +33 -15
  32. data/lib/tcell_agent/rails/better_ip.rb +1 -1
  33. data/lib/tcell_agent/rails/csrf_exception.rb +2 -2
  34. data/lib/tcell_agent/rails/dlp/process_request.rb +1 -1
  35. data/lib/tcell_agent/rails/dlp.rb +6 -6
  36. data/lib/tcell_agent/rails/dlp_handler.rb +1 -1
  37. data/lib/tcell_agent/rails/js_agent_insert.rb +1 -1
  38. data/lib/tcell_agent/rails/middleware/body_filter_middleware.rb +1 -1
  39. data/lib/tcell_agent/rails/middleware/context_middleware.rb +3 -2
  40. data/lib/tcell_agent/rails/middleware/headers_middleware.rb +10 -9
  41. data/lib/tcell_agent/rails/routes/grape.rb +6 -6
  42. data/lib/tcell_agent/rails/routes.rb +8 -11
  43. data/lib/tcell_agent/rust/libtcellagent-0.11.1.dylib +0 -0
  44. data/lib/tcell_agent/rust/{libtcellagent-0.6.1.so → libtcellagent-0.11.1.so} +0 -0
  45. data/lib/tcell_agent/rust/models.rb +16 -0
  46. data/lib/tcell_agent/rust/tcellagent-0.11.1.dll +0 -0
  47. data/lib/tcell_agent/rust/whisperer.rb +119 -48
  48. data/lib/tcell_agent/sensor_events/appsensor_meta_event.rb +17 -20
  49. data/lib/tcell_agent/sensor_events/command_injection.rb +50 -5
  50. data/lib/tcell_agent/sensor_events/login_fraud.rb +34 -18
  51. data/lib/tcell_agent/sensor_events/patches.rb +21 -0
  52. data/lib/tcell_agent/sensor_events/server_agent.rb +3 -3
  53. data/lib/tcell_agent/sensor_events/util/utils.rb +4 -3
  54. data/lib/tcell_agent/servers/puma.rb +2 -2
  55. data/lib/tcell_agent/servers/unicorn.rb +1 -1
  56. data/lib/tcell_agent/utils/passwords.rb +28 -0
  57. data/lib/tcell_agent/version.rb +1 -1
  58. data/lib/tcell_agent.rb +1 -5
  59. data/spec/apps/rails-3.2/config/tcell_agent.config +15 -0
  60. data/spec/apps/rails-3.2/log/development.log +0 -0
  61. data/spec/apps/rails-3.2/log/test.log +12 -0
  62. data/spec/apps/rails-4.1/log/test.log +0 -0
  63. data/spec/lib/tcell_agent/agent/fork_pipe_manager_spec.rb +46 -45
  64. data/spec/lib/tcell_agent/agent/policy_manager_spec.rb +276 -164
  65. data/spec/lib/tcell_agent/agent/static_agent_spec.rb +44 -47
  66. data/spec/lib/tcell_agent/api/api_spec.rb +16 -16
  67. data/spec/lib/tcell_agent/appsensor/injections_reporter_spec.rb +131 -116
  68. data/spec/lib/tcell_agent/appsensor/meta_data_spec.rb +55 -51
  69. data/spec/lib/tcell_agent/cmdi_spec.rb +413 -436
  70. data/spec/lib/tcell_agent/config/unknown_options_spec.rb +145 -128
  71. data/spec/lib/tcell_agent/configuration_spec.rb +165 -169
  72. data/spec/lib/tcell_agent/hooks/login_fraud_spec.rb +144 -153
  73. data/spec/lib/tcell_agent/instrumentation_spec.rb +84 -85
  74. data/spec/lib/tcell_agent/patches_spec.rb +70 -111
  75. data/spec/lib/tcell_agent/policies/appsensor_policy_spec.rb +313 -244
  76. data/spec/lib/tcell_agent/policies/clickjacking_policy_spec.rb +28 -28
  77. data/spec/lib/tcell_agent/policies/command_injection_policy_spec.rb +643 -513
  78. data/spec/lib/tcell_agent/policies/content_security_policy_spec.rb +55 -102
  79. data/spec/lib/tcell_agent/policies/dataloss_policy_spec.rb +111 -134
  80. data/spec/lib/tcell_agent/policies/http_redirect_policy_spec.rb +141 -146
  81. data/spec/lib/tcell_agent/policies/http_tx_policy_spec.rb +8 -8
  82. data/spec/lib/tcell_agent/policies/login_policy_spec.rb +15 -17
  83. data/spec/lib/tcell_agent/policies/patches_policy_spec.rb +231 -559
  84. data/spec/lib/tcell_agent/policies/secure_headers_policy_spec.rb +27 -27
  85. data/spec/lib/tcell_agent/rails/better_ip_spec.rb +30 -34
  86. data/spec/lib/tcell_agent/rails/logger_spec.rb +50 -49
  87. data/spec/lib/tcell_agent/rails/middleware/appsensor_middleware_spec.rb +182 -199
  88. data/spec/lib/tcell_agent/rails/middleware/dlp_middleware_spec.rb +110 -84
  89. data/spec/lib/tcell_agent/rails/middleware/global_middleware_spec.rb +107 -85
  90. data/spec/lib/tcell_agent/rails/middleware/redirect_middleware_spec.rb +68 -40
  91. data/spec/lib/tcell_agent/rails/middleware/tcell_body_proxy_spec.rb +81 -67
  92. data/spec/lib/tcell_agent/rails/responses_spec.rb +33 -37
  93. data/spec/lib/tcell_agent/rails/routes/grape_spec.rb +116 -121
  94. data/spec/lib/tcell_agent/rails/routes/route_id_spec.rb +25 -28
  95. data/spec/lib/tcell_agent/rails/routes/routes_spec.rb +87 -85
  96. data/spec/lib/tcell_agent/rails_spec.rb +1 -6
  97. data/spec/lib/tcell_agent/rust/models_spec.rb +112 -0
  98. data/spec/lib/tcell_agent/rust/whisperer_spec.rb +502 -179
  99. data/spec/lib/tcell_agent/sensor_events/appsensor_meta_event_spec.rb +44 -33
  100. data/spec/lib/tcell_agent/sensor_events/dlp_spec.rb +4 -4
  101. data/spec/lib/tcell_agent/sensor_events/sessions_metric_spec.rb +183 -169
  102. data/spec/lib/tcell_agent/sensor_events/util/sanitizer_utilities_spec.rb +25 -25
  103. data/spec/lib/tcell_agent/utils/bounded_queue_spec.rb +17 -20
  104. data/spec/lib/tcell_agent/utils/params_spec.rb +28 -28
  105. data/spec/lib/tcell_agent/utils/passwords_spec.rb +143 -0
  106. data/spec/lib/tcell_agent/utils/strings_spec.rb +35 -35
  107. data/spec/lib/tcell_agent_spec.rb +8 -8
  108. data/spec/spec_helper.rb +4 -4
  109. data/spec/support/middleware_helper.rb +10 -10
  110. data/spec/support/static_agent_overrides.rb +16 -12
  111. data/tcell_agent.gemspec +17 -33
  112. metadata +43 -198
  113. data/LICENSE_libinjection +0 -32
  114. data/Readme.txt +0 -7
  115. data/ext/libinjection/extconf.rb +0 -3
  116. data/ext/libinjection/libinjection.h +0 -65
  117. data/ext/libinjection/libinjection_html5.c +0 -847
  118. data/ext/libinjection/libinjection_html5.h +0 -54
  119. data/ext/libinjection/libinjection_sqli.c +0 -2317
  120. data/ext/libinjection/libinjection_sqli.h +0 -295
  121. data/ext/libinjection/libinjection_sqli_data.h +0 -9004
  122. data/ext/libinjection/libinjection_wrap.c +0 -3525
  123. data/ext/libinjection/libinjection_xss.c +0 -531
  124. data/ext/libinjection/libinjection_xss.h +0 -21
  125. data/lib/tcell_agent/appsensor/injections_matcher.rb +0 -155
  126. data/lib/tcell_agent/appsensor/rules/appsensor_rule_manager.rb +0 -49
  127. data/lib/tcell_agent/appsensor/rules/appsensor_rule_set.rb +0 -67
  128. data/lib/tcell_agent/appsensor/rules/baserules.json +0 -467
  129. data/lib/tcell_agent/patches/block_rule.rb +0 -93
  130. data/lib/tcell_agent/patches/sensors_matcher.rb +0 -31
  131. data/lib/tcell_agent/policies/appsensor/cmdi_sensor.rb +0 -23
  132. data/lib/tcell_agent/policies/appsensor/fpt_sensor.rb +0 -23
  133. data/lib/tcell_agent/policies/appsensor/injection_sensor.rb +0 -117
  134. data/lib/tcell_agent/policies/appsensor/nullbyte_sensor.rb +0 -26
  135. data/lib/tcell_agent/policies/appsensor/retr_sensor.rb +0 -22
  136. data/lib/tcell_agent/policies/appsensor/sqli_sensor.rb +0 -34
  137. data/lib/tcell_agent/policies/appsensor/xss_sensor.rb +0 -34
  138. data/lib/tcell_agent/policies/appsensor_policy.rb +0 -49
  139. data/lib/tcell_agent/policies/command_injection_policy.rb +0 -196
  140. data/lib/tcell_agent/policies/honeytokens_policy.rb +0 -69
  141. data/lib/tcell_agent/policies/patches_policy.rb +0 -84
  142. data/lib/tcell_agent/rust/libtcellagent-0.6.1.dylib +0 -0
  143. data/lib/tcell_agent/rust/tcellagent-0.6.1.dll +0 -0
  144. data/spec/apps/rails-3.2/Gemfile +0 -25
  145. data/spec/apps/rails-3.2/Gemfile.lock +0 -126
  146. data/spec/apps/rails-3.2/Rakefile +0 -7
  147. data/spec/apps/rails-3.2/app/assets/images/rails.png +0 -0
  148. data/spec/apps/rails-3.2/app/assets/javascripts/application.js +0 -15
  149. data/spec/apps/rails-3.2/app/assets/stylesheets/application.css +0 -13
  150. data/spec/apps/rails-3.2/app/controllers/application_controller.rb +0 -3
  151. data/spec/apps/rails-3.2/app/controllers/t_cell_app_controller.rb +0 -5
  152. data/spec/apps/rails-3.2/app/helpers/application_helper.rb +0 -2
  153. data/spec/apps/rails-3.2/app/views/layouts/application.html.erb +0 -14
  154. data/spec/apps/rails-3.2/app/views/t_cell_app/index.html.erb +0 -1
  155. data/spec/apps/rails-3.2/config/application.rb +0 -63
  156. data/spec/apps/rails-3.2/config/boot.rb +0 -6
  157. data/spec/apps/rails-3.2/config/environment.rb +0 -5
  158. data/spec/apps/rails-3.2/config/environments/test.rb +0 -37
  159. data/spec/apps/rails-3.2/config/routes.rb +0 -11
  160. data/spec/apps/rails-3.2/config.ru +0 -4
  161. data/spec/apps/rails-4.1/Gemfile +0 -7
  162. data/spec/apps/rails-4.1/Gemfile.lock +0 -114
  163. data/spec/apps/rails-4.1/Rakefile +0 -6
  164. data/spec/apps/rails-4.1/app/assets/javascripts/application.js +0 -16
  165. data/spec/apps/rails-4.1/app/assets/stylesheets/application.css +0 -15
  166. data/spec/apps/rails-4.1/app/controllers/application_controller.rb +0 -5
  167. data/spec/apps/rails-4.1/app/controllers/t_cell_app_controller.rb +0 -5
  168. data/spec/apps/rails-4.1/app/helpers/application_helper.rb +0 -2
  169. data/spec/apps/rails-4.1/app/views/layouts/application.html.erb +0 -14
  170. data/spec/apps/rails-4.1/app/views/t_cell_app/index.html.erb +0 -1
  171. data/spec/apps/rails-4.1/config/application.rb +0 -24
  172. data/spec/apps/rails-4.1/config/boot.rb +0 -4
  173. data/spec/apps/rails-4.1/config/environment.rb +0 -5
  174. data/spec/apps/rails-4.1/config/environments/test.rb +0 -41
  175. data/spec/apps/rails-4.1/config/initializers/assets.rb +0 -8
  176. data/spec/apps/rails-4.1/config/initializers/backtrace_silencers.rb +0 -7
  177. data/spec/apps/rails-4.1/config/initializers/cookies_serializer.rb +0 -3
  178. data/spec/apps/rails-4.1/config/initializers/filter_parameter_logging.rb +0 -4
  179. data/spec/apps/rails-4.1/config/initializers/inflections.rb +0 -16
  180. data/spec/apps/rails-4.1/config/initializers/mime_types.rb +0 -4
  181. data/spec/apps/rails-4.1/config/initializers/session_store.rb +0 -3
  182. data/spec/apps/rails-4.1/config/initializers/wrap_parameters.rb +0 -14
  183. data/spec/apps/rails-4.1/config/locales/en.yml +0 -23
  184. data/spec/apps/rails-4.1/config/routes.rb +0 -12
  185. data/spec/apps/rails-4.1/config/secrets.yml +0 -22
  186. data/spec/apps/rails-4.1/config.ru +0 -4
  187. data/spec/controllers/application_controller.rb +0 -12
  188. data/spec/lib/tcell_agent/appsensor/injections_matcher_spec.rb +0 -522
  189. data/spec/lib/tcell_agent/appsensor/rules/appsensor_rule_manager_spec.rb +0 -23
  190. data/spec/lib/tcell_agent/appsensor/rules/appsensor_rule_set_spec.rb +0 -159
  191. data/spec/lib/tcell_agent/patches/block_rule_spec.rb +0 -458
  192. data/spec/lib/tcell_agent/patches/sensors_matcher_spec.rb +0 -35
  193. data/spec/lib/tcell_agent/policies/appsensor/cmdi_sensor_spec.rb +0 -139
  194. data/spec/lib/tcell_agent/policies/appsensor/fpt_sensor_spec.rb +0 -139
  195. data/spec/lib/tcell_agent/policies/appsensor/nullbyte_sensor_spec.rb +0 -167
  196. data/spec/lib/tcell_agent/policies/appsensor/retr_sensor_spec.rb +0 -139
  197. data/spec/lib/tcell_agent/policies/appsensor/sqli_sensor_spec.rb +0 -246
  198. data/spec/lib/tcell_agent/policies/appsensor/xss_sensor_spec.rb +0 -882
  199. data/spec/lib/tcell_agent/policies/honeytokens_policy_spec.rb +0 -22
@@ -2,14 +2,13 @@ require 'spec_helper'
2
2
 
3
3
  module TCellAgent
4
4
  module Policies
5
-
6
5
  describe ContentSecurityPolicy do
7
- context "test empty agent" do
8
- it "enabled is false" do
6
+ context 'test empty agent' do
7
+ it 'enabled is false' do
9
8
  policy_json_empty = {
10
- "policy_id"=>"01a1",
11
- "data"=>{
12
- "options"=>{
9
+ 'policy_id' => '01a1',
10
+ 'data' => {
11
+ 'options' => {
13
12
 
14
13
  }
15
14
  }
@@ -17,58 +16,58 @@ module TCellAgent
17
16
 
18
17
  empty_policy = ContentSecurityPolicy.from_json(policy_json_empty)
19
18
 
20
- expect(empty_policy.policy_id).to eq("01a1")
19
+ expect(empty_policy.policy_id).to eq('01a1')
21
20
  expect(empty_policy.js_agent_api_key).to eq(nil)
22
21
  end
23
22
  end
24
23
 
25
- context "tests xss is true and enabled true" do
26
- it "returns true" do
24
+ context 'tests xss is true and enabled true' do
25
+ it 'returns true' do
27
26
  policy_json_one = {
28
- "policy_id"=>"01a1",
29
- "data"=>{
30
- "options"=>{
31
- "js_agent_api_key"=>"000-000-1"
27
+ 'policy_id' => '01a1',
28
+ 'data' => {
29
+ 'options' => {
30
+ 'js_agent_api_key' => '000-000-1'
32
31
  }
33
32
  }
34
33
  }
35
34
 
36
35
  from_json = ContentSecurityPolicy.from_json(policy_json_one)
37
36
 
38
- expect(from_json.policy_id).to eq("01a1")
39
- expect(from_json.js_agent_api_key).to eq("000-000-1")
37
+ expect(from_json.policy_id).to eq('01a1')
38
+ expect(from_json.js_agent_api_key).to eq('000-000-1')
40
39
  end
41
40
  end
42
41
 
43
- context "initialized with 3 items" do
44
- it "returns true" do
42
+ context 'initialized with 3 items' do
43
+ it 'returns true' do
45
44
  content_security_policy_json = {
46
- "policy_id"=>"00a1",
47
- "headers"=>[
48
- {"name"=>"csp", "value"=>"csp header value"}
45
+ 'policy_id' => '00a1',
46
+ 'headers' => [
47
+ { 'name' => 'csp', 'value' => 'csp header value' }
49
48
  ]
50
49
  }
51
50
 
52
51
  csp_from_json = ContentSecurityPolicy.from_json(content_security_policy_json)
53
52
 
54
- expect(csp_from_json.policy_id).to eq("00a1")
55
- expect(csp_from_json.headers[0].type).to eq("csp")
56
- expect(csp_from_json.headers[0].value).to eq("csp header value")
53
+ expect(csp_from_json.policy_id).to eq('00a1')
54
+ expect(csp_from_json.headers[0].type).to eq('csp')
55
+ expect(csp_from_json.headers[0].value).to eq('csp header value')
57
56
  end
58
57
  end
59
58
 
60
- context "headers match up appropriately" do
61
- it "returns content-security-policy headers" do
62
- expect(ContentSecurityPolicy.cspHeadersForType("csp")).to match_array(["Content-Security-Policy"])
59
+ context 'headers match up appropriately' do
60
+ it 'returns content-security-policy headers' do
61
+ expect(ContentSecurityPolicy.cspHeadersForType('csp')).to match_array(['Content-Security-Policy'])
63
62
  end
64
63
  end
65
64
 
66
- context "csp header example, invalid header" do
67
- it "returns false" do
65
+ context 'csp header example, invalid header' do
66
+ it 'returns false' do
68
67
  content_security_policy_json = {
69
- "policy_id"=>"01a1",
70
- "headers"=>[
71
- {"name"=>"csp-header-is-bad", "value"=>"csp header value"}
68
+ 'policy_id' => '01a1',
69
+ 'headers' => [
70
+ { 'name' => 'csp-header-is-bad', 'value' => 'csp header value' }
72
71
  ]
73
72
  }
74
73
 
@@ -78,12 +77,12 @@ module TCellAgent
78
77
  end
79
78
  end
80
79
 
81
- context "secure header, value is bad" do
82
- it "returns false" do
80
+ context 'secure header, value is bad' do
81
+ it 'returns false' do
83
82
  content_security_policy_json = {
84
- "policy_id"=>"01a1",
85
- "headers"=>[
86
- {"name"=>"csp", "value"=>"value123\\nabc"}
83
+ 'policy_id' => '01a1',
84
+ 'headers' => [
85
+ { 'name' => 'csp', 'value' => 'value123\\nabc' }
87
86
  ]
88
87
  }
89
88
  csp_policy = ContentSecurityPolicy.from_json(content_security_policy_json)
@@ -91,85 +90,39 @@ module TCellAgent
91
90
  end
92
91
  end
93
92
 
94
- context "secure header, report-uri seperate" do
95
- it "returns false" do
93
+ context 'secure header, report-uri seperate' do
94
+ it 'returns false' do
96
95
  content_security_policy_json = {
97
- "policy_id"=>"01a1",
98
- "headers"=>[
99
- {"name"=>"csp", "value"=>"value normal", "report-uri"=>"https://example.com/abcdde"}
96
+ 'policy_id' => '01a1',
97
+ 'headers' => [
98
+ { 'name' => 'csp', 'value' => 'value normal', 'report-uri' => 'https://example.com/abcdde' }
100
99
  ]
101
100
  }
102
101
 
103
102
  csp_policy = ContentSecurityPolicy.from_json(content_security_policy_json)
104
103
 
105
104
  expect(csp_policy.headers.length).to eq(1)
106
- expect(csp_policy.headers[0].value).to eq("value normal; report-uri https://example.com/abcdde?c=-815891691")
107
- expect(csp_policy.headers[0].value("1","2","3")).to eq("value normal; report-uri https://example.com/abcdde?tid=1&sid=3&rid=2&c=1777384531")
105
+ expect(csp_policy.headers[0].value).to eq('value normal; report-uri https://example.com/abcdde?c=-815891691')
106
+ expect(csp_policy.headers[0].value('1', '2', '3')).to eq('value normal; report-uri https://example.com/abcdde?tid=1&sid=3&rid=2&c=1777384531')
108
107
  end
109
108
  end
110
109
 
111
- context "modifying js_agent_url" do
112
-
113
- context "csp header value does not include new js agent url" do
114
- it "should have the configuration set to the default js_agent_url value" do
115
- expect(TCellAgent.configuration.js_agent_url).to eq("https://api.tcell.io/tcellagent.min.js")
116
-
117
- content_security_policy_json = {
118
- "policy_id"=>"01a1",
119
- "headers"=>[
120
- {"name"=>"csp", "value"=>"script-src 'unsafe-inline' 'unsafe-eval' 'self' https://api.tcell.io/"}
121
- ]
122
- }
123
-
124
- csp_policy = ContentSecurityPolicy.from_json(content_security_policy_json)
125
-
126
- expect(csp_policy.headers.length).to eq(1)
127
- expect(csp_policy.headers[0].value).to eq("script-src 'unsafe-inline' 'unsafe-eval' 'self' https://api.tcell.io/")
128
- expect(TCellAgent.configuration.js_agent_url).to eq("https://api.tcell.io/tcellagent.min.js")
129
- end
130
- end
131
-
132
- context "csp header value includes new js agent url" do
133
- it "should have the configuration set to the default js_agent_url value" do
134
- expect(TCellAgent.configuration.js_agent_url).to eq("https://api.tcell.io/tcellagent.min.js")
135
-
136
- content_security_policy_json = {
137
- "policy_id"=>"01a1",
138
- "headers"=>[
139
- {"name"=>"csp", "value"=>"script-src 'unsafe-inline' 'unsafe-eval' 'self' https://api.tcell.io/ https://jsagent.tcell.io/"}
140
- ]
141
- }
142
-
143
- csp_policy = ContentSecurityPolicy.from_json(content_security_policy_json)
144
-
145
- expect(csp_policy.headers.length).to eq(1)
146
- expect(csp_policy.headers[0].value).to eq("script-src 'unsafe-inline' 'unsafe-eval' 'self' https://api.tcell.io/ https://jsagent.tcell.io/")
147
- expect(TCellAgent.configuration.js_agent_url).to eq("https://jsagent.tcell.io/tcellagent.min.js")
148
- end
149
-
150
- context "but js_agent_url was not default" do
151
- it "should not modify js_agent_url" do
152
- TCellAgent.configuration.startup_js_agent_url = "https://www.customer-website.com/tcellagent.min.js"
153
- TCellAgent.configuration.js_agent_url = "https://www.customer-website.com/tcellagent.min.js"
154
- expect(TCellAgent.configuration.js_agent_url).to eq("https://www.customer-website.com/tcellagent.min.js")
155
-
156
- content_security_policy_json = {
157
- "policy_id"=>"01a1",
158
- "headers"=>[
159
- {"name"=>"csp", "value"=>"script-src 'unsafe-inline' 'unsafe-eval' 'self' https://api.tcell.io/ https://jsagent.tcell.io/"}
160
- ]
161
- }
110
+ context 'default js_agent_url' do
111
+ it 'should have the configuration set to the default js_agent_url value' do
112
+ expect(TCellAgent.configuration.js_agent_url).to eq('https://jsagent.tcell.io/tcellagent.min.js')
162
113
 
163
- csp_policy = ContentSecurityPolicy.from_json(content_security_policy_json)
114
+ content_security_policy_json = {
115
+ 'policy_id' => '01a1',
116
+ 'headers' => [
117
+ { 'name' => 'csp', 'value' => "script-src 'unsafe-inline' 'unsafe-eval' 'self' https://api.tcell.io/" }
118
+ ]
119
+ }
164
120
 
165
- expect(csp_policy.headers.length).to eq(1)
166
- expect(csp_policy.headers[0].value).to eq("script-src 'unsafe-inline' 'unsafe-eval' 'self' https://api.tcell.io/ https://jsagent.tcell.io/")
167
- expect(TCellAgent.configuration.js_agent_url).to eq("https://www.customer-website.com/tcellagent.min.js")
121
+ csp_policy = ContentSecurityPolicy.from_json(content_security_policy_json)
168
122
 
169
- TCellAgent.configuration.startup_js_agent_url = "https://api.tcell.io/tcellagent.min.js"
170
- TCellAgent.configuration.js_agent_url = "https://api.tcell.io/tcellagent.min.js"
171
- end
172
- end
123
+ expect(csp_policy.headers.length).to eq(1)
124
+ expect(csp_policy.headers[0].value).to eq("script-src 'unsafe-inline' 'unsafe-eval' 'self' https://api.tcell.io/")
125
+ expect(TCellAgent.configuration.js_agent_url).to eq('https://jsagent.tcell.io/tcellagent.min.js')
173
126
  end
174
127
  end
175
128
  end
@@ -4,242 +4,219 @@ require 'set'
4
4
  module TCellAgent
5
5
  module Policies
6
6
  describe DataLossPolicy do
7
- policy_json = {
8
- "policy_id"=>"x1a1",
9
- "data"=>{
10
- "protections"=>[
11
- {"table"=>"user",
12
- "field"=>"ssn",
13
- "actions"=>{
14
- "body"=>["event","redact"],
15
- "logs"=>["redact"]
16
- }
17
- }
18
- ]
19
- }
20
- }
21
- policy = DataLossPolicy.from_json(policy_json)
22
- # context "initialized with 3 items" do
23
- # it "returns true" do
24
- # expect(policy.get_actions_for("user","ssn")).to eq(["body_redact"].to_set)
25
- # end
26
- # end
27
7
  policy_json_two = {
28
- "policy_id"=>"x1a1",
29
- "data"=>{
30
- "session_id_protections"=>{"body"=>["redact"], "log"=>["event"]}
8
+ 'policy_id' => 'x1a1',
9
+ 'data' => {
10
+ 'session_id_protections' => { 'body' => ['redact'], 'log' => ['event'] }
31
11
  }
32
12
  }
33
13
  policy_two = DataLossPolicy.from_json(policy_json_two)
34
- context "check session_id_protections" do
35
- it "gives the right actions" do
14
+ context 'check session_id_protections' do
15
+ it 'gives the right actions' do
36
16
  expect(policy_two.get_actions_for_session_id.body_redact).to eq(true)
37
17
  expect(policy_two.get_actions_for_session_id.log_redact).to eq(nil)
38
18
  expect(policy_two.get_actions_for_session_id.log_event).to eq(true)
39
19
  end
40
20
  end
41
- context "Database Options" do
42
- it "Ignores bad table" do
21
+ context 'Database Options' do
22
+ it 'Ignores bad table' do
43
23
  policy_json_requests = {
44
- "policy_id"=>"x1a1",
45
- "data"=>{
46
- "db_protections"=>[
24
+ 'policy_id' => 'x1a1',
25
+ 'data' => {
26
+ 'db_protections' => [
47
27
  {
48
- "databases"=>["dave"],
49
- "schemas"=>["sam"],
50
- "tables"=>["trevor"],
51
- "fields"=>["fred"],
52
- "actions"=>{
53
- "log"=>["redact"],
54
- "body"=>["event"]
28
+ 'databases' => ['dave'],
29
+ 'schemas' => ['sam'],
30
+ 'tables' => ['trevor'],
31
+ 'fields' => ['fred'],
32
+ 'actions' => {
33
+ 'log' => ['redact'],
34
+ 'body' => ['event']
55
35
  }
56
36
  }
57
37
  ]
58
38
  }
59
39
  }
60
40
  db_one_policy = DataLossPolicy.from_json(policy_json_requests)
61
- expect(db_one_policy.get_actions_for_table("dave","sam","tommy","fred")).to eq(nil)
41
+ expect(db_one_policy.get_actions_for_table('dave', 'sam', 'tommy', 'fred')).to eq(nil)
62
42
  end
63
- it "Partial Policy" do
43
+ it 'Partial Policy' do
64
44
  # Assume if databases, schemas that are missing are "*"
65
45
  policy_json_requests = {
66
- "policy_id"=>"x1a1",
67
- "data"=>{
68
- "db_protections"=>[
46
+ 'policy_id' => 'x1a1',
47
+ 'data' => {
48
+ 'db_protections' => [
69
49
  {
70
- "fields"=>["fred"],
71
- "actions"=>{
72
- "log"=>["redact"],
73
- "body"=>["event"]
50
+ 'fields' => ['fred'],
51
+ 'actions' => {
52
+ 'log' => ['redact'],
53
+ 'body' => ['event']
74
54
  }
75
55
  }
76
56
  ]
77
57
  }
78
58
  }
79
59
  db_one_policy = DataLossPolicy.from_json(policy_json_requests)
80
- expect((db_one_policy.get_actions_for_table("dave","sam","tommy","fred").to_a)[0].log_redact).to eq(true)
81
- expect((db_one_policy.get_actions_for_table("dave","sam","tommy","fred","abcd").to_a)[0].log_redact).to eq(true)
60
+ expect(db_one_policy.get_actions_for_table('dave', 'sam', 'tommy', 'fred').to_a[0].log_redact).to eq(true)
61
+ expect(db_one_policy.get_actions_for_table('dave', 'sam', 'tommy', 'fred', 'abcd').to_a[0].log_redact).to eq(true)
82
62
  end
83
- it "Scopes by reoute_id" do
63
+ it 'Scopes by reoute_id' do
84
64
  policy_json_request_ids = {
85
- "policy_id"=>"x1a1",
86
- "data"=>{
87
- "db_protections"=>[
65
+ 'policy_id' => 'x1a1',
66
+ 'data' => {
67
+ 'db_protections' => [
88
68
  {
89
- "scope"=>"route",
90
- "route_ids"=>["abcd"],
91
- "databases"=>["dave"],
92
- "schemas"=>["sam"],
93
- "tables"=>["tommy"],
94
- "fields"=>["fred"],
95
- "actions"=>{
96
- "log"=>["redact"],
97
- "body"=>["event"]
69
+ 'scope' => 'route',
70
+ 'route_ids' => ['abcd'],
71
+ 'databases' => ['dave'],
72
+ 'schemas' => ['sam'],
73
+ 'tables' => ['tommy'],
74
+ 'fields' => ['fred'],
75
+ 'actions' => {
76
+ 'log' => ['redact'],
77
+ 'body' => ['event']
98
78
  }
99
79
  }
100
80
  ]
101
81
  }
102
82
  }
103
83
  db_two_policy = DataLossPolicy.from_json(policy_json_request_ids)
104
- expect((db_two_policy.get_actions_for_table("dave","sam","tommy","fred").to_a).size).to eq(0)
105
- expect((db_two_policy.get_actions_for_table("dave","sam","tommy","fred","other_route").to_a).size).to eq(0)
106
- expect((db_two_policy.get_actions_for_table("dave","sam","tommy","fred","abcd").to_a).size).to eq(1)
107
-
108
-
109
- expect((db_two_policy.get_actions_for_table("dave","sam","tommy","fred","abcd").to_a)[0].log_redact).to eq(true)
110
- expect((db_two_policy.get_actions_for_table("dave","sam","tommy","fred","abcd").to_a)[0].body_redact).to eq(nil)
111
- expect((db_two_policy.get_actions_for_table("dave","sam","tommy","fred","abcd").to_a)[0].body_event).to eq(true)
84
+ expect(db_two_policy.get_actions_for_table('dave', 'sam', 'tommy', 'fred').to_a.size).to eq(0)
85
+ expect(db_two_policy.get_actions_for_table('dave', 'sam', 'tommy', 'fred', 'other_route').to_a.size).to eq(0)
86
+ expect(db_two_policy.get_actions_for_table('dave', 'sam', 'tommy', 'fred', 'abcd').to_a.size).to eq(1)
112
87
 
88
+ expect(db_two_policy.get_actions_for_table('dave', 'sam', 'tommy', 'fred', 'abcd').to_a[0].log_redact).to eq(true)
89
+ expect(db_two_policy.get_actions_for_table('dave', 'sam', 'tommy', 'fred', 'abcd').to_a[0].body_redact).to eq(nil)
90
+ expect(db_two_policy.get_actions_for_table('dave', 'sam', 'tommy', 'fred', 'abcd').to_a[0].body_event).to eq(true)
113
91
  end
114
92
  end
115
- context "Request Options" do
116
- it "Ignores non-global scoped policy" do
93
+ context 'Request Options' do
94
+ it 'Ignores non-global scoped policy' do
117
95
  policy_json_requests = {
118
- "policy_id"=>"x1a1",
119
- "data"=>{
120
- "request_protections"=>[
96
+ 'policy_id' => 'x1a1',
97
+ 'data' => {
98
+ 'request_protections' => [
121
99
  {
122
- "variable_context"=>"form",
123
- "variables"=>["test123"],
124
- "actions"=>{
125
- "log"=>["redact"],
126
- "body"=>["event"]
100
+ 'variable_context' => 'form',
101
+ 'variables' => ['test123'],
102
+ 'actions' => {
103
+ 'log' => ['redact'],
104
+ 'body' => ['event']
127
105
  }
128
106
  }
129
107
  ]
130
108
  }
131
109
  }
132
110
  policy_three = DataLossPolicy.from_json(policy_json_requests)
133
- expect(policy_three.get_actions_for_request("form","test123").to_a[0].body_event).to eq(true)
134
- expect(policy_three.get_actions_for_request("form","test123").to_a[0].log_event).to eq(nil)
111
+ expect(policy_three.get_actions_for_request('form', 'test123').to_a[0].body_event).to eq(true)
112
+ expect(policy_three.get_actions_for_request('form', 'test123').to_a[0].log_event).to eq(nil)
135
113
  end
136
- it "Reads in the policy" do
114
+ it 'Reads in the policy' do
137
115
  policy_json_requests = {
138
- "policy_id"=>"x1a1",
139
- "data"=>{
140
- "request_protections"=>[
116
+ 'policy_id' => 'x1a1',
117
+ 'data' => {
118
+ 'request_protections' => [
141
119
  {
142
- "variable_context"=>"form",
143
- "scope"=>"route",
144
- "route_ids"=>["routex"],
145
- "variables"=>["test123"],
146
- "actions"=>{
147
- "log"=>["redact"],
148
- "body"=>["event"]
120
+ 'variable_context' => 'form',
121
+ 'scope' => 'route',
122
+ 'route_ids' => ['routex'],
123
+ 'variables' => ['test123'],
124
+ 'actions' => {
125
+ 'log' => ['redact'],
126
+ 'body' => ['event']
149
127
  }
150
128
  }
151
129
  ]
152
130
  }
153
131
  }
154
132
  policy_three = DataLossPolicy.from_json(policy_json_requests)
155
- entry_wildcard_route = policy_three.get_actions_for_request("form","TeSt123")
156
- entry_given_route = policy_three.get_actions_for_request("form","TeSt123","routex")
133
+ entry_wildcard_route = policy_three.get_actions_for_request('form', 'TeSt123')
134
+ entry_given_route = policy_three.get_actions_for_request('form', 'TeSt123', 'routex')
157
135
  expect(entry_wildcard_route).to eq(nil)
158
136
  expect(entry_given_route.size).to eq(1)
159
137
  expect(entry_given_route.to_a[0].body_redact).to eq(nil)
160
138
  expect(entry_given_route.to_a[0].log_redact).to eq(true)
161
139
  end
162
140
 
163
- it "Reads in the policy with cookie (redact/event)" do
141
+ it 'Reads in the policy with cookie (redact/event)' do
164
142
  policy_json_requests = {
165
- "policy_id"=>"x1a1",
166
- "data"=>{
167
- "request_protections"=>[
143
+ 'policy_id' => 'x1a1',
144
+ 'data' => {
145
+ 'request_protections' => [
168
146
  {
169
- "variable_context"=>"cookie",
170
- "scope"=>"route",
171
- "route_ids"=>["routex"],
172
- "variables"=>["test123"],
173
- "actions"=>{
174
- "log"=>["redact"],
175
- "body"=>["event"]
147
+ 'variable_context' => 'cookie',
148
+ 'scope' => 'route',
149
+ 'route_ids' => ['routex'],
150
+ 'variables' => ['test123'],
151
+ 'actions' => {
152
+ 'log' => ['redact'],
153
+ 'body' => ['event']
176
154
  }
177
155
  }
178
156
  ]
179
157
  }
180
158
  }
181
159
  policy_three = DataLossPolicy.from_json(policy_json_requests)
182
- entry_wildcard_route = policy_three.get_actions_for_request("cookie","test123")
183
- entry_given_route = policy_three.get_actions_for_request("cookie","test123","routex")
160
+ entry_wildcard_route = policy_three.get_actions_for_request('cookie', 'test123')
161
+ entry_given_route = policy_three.get_actions_for_request('cookie', 'test123', 'routex')
184
162
  expect(entry_wildcard_route).to eq(nil)
185
163
  expect(entry_given_route.size).to eq(1)
186
164
  expect(entry_given_route.to_a[0].body_redact).to eq(nil)
187
165
  expect(entry_given_route.to_a[0].log_redact).to eq(true)
188
166
  end
189
167
 
190
- it "Reads in the policy with mixed-case cookie (redact/event)" do
168
+ it 'Reads in the policy with mixed-case cookie (redact/event)' do
191
169
  policy_json_requests = {
192
- "policy_id"=>"x1a1",
193
- "data"=>{
194
- "request_protections"=>[
170
+ 'policy_id' => 'x1a1',
171
+ 'data' => {
172
+ 'request_protections' => [
195
173
  {
196
- "variable_context"=>"cookie",
197
- "scope"=>"route",
198
- "route_ids"=>["routex"],
199
- "variables"=>["teST123"],
200
- "actions"=>{
201
- "log"=>["redact"],
202
- "body"=>["event"]
174
+ 'variable_context' => 'cookie',
175
+ 'scope' => 'route',
176
+ 'route_ids' => ['routex'],
177
+ 'variables' => ['teST123'],
178
+ 'actions' => {
179
+ 'log' => ['redact'],
180
+ 'body' => ['event']
203
181
  }
204
182
  }
205
183
  ]
206
184
  }
207
185
  }
208
186
  policy_three = DataLossPolicy.from_json(policy_json_requests)
209
- entry_wildcard_route = policy_three.get_actions_for_request("cookie","test123")
210
- entry_given_route = policy_three.get_actions_for_request("cookie","test123","routex")
187
+ entry_wildcard_route = policy_three.get_actions_for_request('cookie', 'test123')
188
+ entry_given_route = policy_three.get_actions_for_request('cookie', 'test123', 'routex')
211
189
  expect(entry_wildcard_route).to eq(nil)
212
190
  expect(entry_given_route).to eq(nil)
213
191
  end
214
192
 
215
- it "Reads in the policy with header (redact/event)" do
193
+ it 'Reads in the policy with header (redact/event)' do
216
194
  policy_json_requests = {
217
- "policy_id"=>"x1a1",
218
- "data"=>{
219
- "request_protections"=>[
195
+ 'policy_id' => 'x1a1',
196
+ 'data' => {
197
+ 'request_protections' => [
220
198
  {
221
- "variable_context"=>"header",
222
- "scope"=>"route",
223
- "route_ids"=>["routex"],
224
- "variables"=>["test123"],
225
- "actions"=>{
226
- "log"=>["redact"],
227
- "body"=>["event"]
199
+ 'variable_context' => 'header',
200
+ 'scope' => 'route',
201
+ 'route_ids' => ['routex'],
202
+ 'variables' => ['test123'],
203
+ 'actions' => {
204
+ 'log' => ['redact'],
205
+ 'body' => ['event']
228
206
  }
229
207
  }
230
208
  ]
231
209
  }
232
210
  }
233
211
  policy_three = DataLossPolicy.from_json(policy_json_requests)
234
- entry_wildcard_route = policy_three.get_actions_for_request("header","TeSt123")
235
- entry_given_route = policy_three.get_actions_for_request("header","TeSt123","routex")
212
+ entry_wildcard_route = policy_three.get_actions_for_request('header', 'TeSt123')
213
+ entry_given_route = policy_three.get_actions_for_request('header', 'TeSt123', 'routex')
236
214
  expect(entry_wildcard_route).to eq(nil)
237
215
  expect(entry_given_route.size).to eq(1)
238
216
  expect(entry_given_route.to_a[0].body_redact).to eq(nil)
239
217
  expect(entry_given_route.to_a[0].log_redact).to eq(true)
240
218
  end
241
219
  end
242
-
243
220
  end
244
221
  end
245
222
  end