tcell_agent 0.2.13 → 0.2.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e5ccc67c1c1611e9a2824184b1b89693dc6d0c95
4
- data.tar.gz: 7722062a8bd1a12cda449ce20645ec11fbf024cf
3
+ metadata.gz: 91eb80e7d8e32d4eb83b3db2724492c1bcfa6151
4
+ data.tar.gz: e89d78bc66aa69410ca00dfac6217982a9e36ebf
5
5
  SHA512:
6
- metadata.gz: 11be4d4e2e569c6edbcf737944410aa9c9c7f90e12e585e90026ca539330f3debe7667bcd5db02ee4f402528d92166089f225579d5dd075320118b6f481b15c5
7
- data.tar.gz: ed0b1023516c6122b585774908acf5dbb13243619b3c1822ff55e4701616716f1d33acae60a2d5eee7dbdc416f21eb11792caa3ba59214f6d533ac1dc2038ac7
6
+ metadata.gz: d1ef60b09773240dec59b976c283867ae5a7d5789ac3e109016916b23a9bb208de9e2c220dafd81a805da5be86e70ac4bc77683b55cd3316da909a3229eee9f4
7
+ data.tar.gz: 019839aec44771e5b8702024c9acbf2a33ab668200681315161105e7d66340bab25d187e1ce12eef45b67bd257064c81b7ed76dc75117c26be37bbd131b15036
data/lib/tcell_agent.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # See the file "LICENSE" for the full license governing this code.
2
2
 
3
+ require "tcell_agent/utils/strings"
4
+ require "tcell_agent/utils/io"
3
5
  require 'tcell_agent/logger'
4
6
  require 'tcell_agent/configuration'
5
7
 
@@ -121,8 +121,8 @@ module TCellAgent
121
121
  end
122
122
 
123
123
  def start
124
- if (TCellAgent.configuration.api_key == nil ||
125
- TCellAgent.configuration.app_id == nil)
124
+ if (TCellAgent::Utils::Strings.blank?(TCellAgent.configuration.api_key) ||
125
+ TCellAgent::Utils::Strings.blank?(TCellAgent.configuration.app_id))
126
126
  puts " ********* ********* ********* *********"
127
127
  puts "* tCell.io *"
128
128
  puts "* Configuration info is missing, you may *"
@@ -34,7 +34,7 @@ module TCellAgent
34
34
  return if TCellAgent.configuration.should_start_policy_poll? == false
35
35
  @policy_polling_worker_mutex.synchronize do
36
36
  return if policy_polling_running?
37
- start_policy_polling
37
+ start_policy_polling_loop
38
38
  end
39
39
  end
40
40
 
@@ -49,55 +49,98 @@ module TCellAgent
49
49
  end
50
50
  end
51
51
 
52
- def start_policy_polling
53
- if TCellAgent.configuration.should_start_policy_poll? == true
52
+ def start_policy_polling_loop
53
+ if TCellAgent.configuration.should_start_policy_poll?
54
+
55
+ if TCellAgent::Utils::Strings.blank?(TCellAgent.configuration.tcell_api_url)
56
+ TCellAgent.logger.error("tCell.io tcell_api_url is missing. Disabling policy polling.")
57
+ return
58
+ end
59
+
60
+ if TCellAgent::Utils::Strings.blank?(TCellAgent.configuration.app_id)
61
+ TCellAgent.logger.error("tCell.io app_id is missing. Disabling policy polling.")
62
+ return
63
+ end
64
+
54
65
  TCellAgent.logger.debug("Starting policy polling thread")
66
+
55
67
  @policy_polling_thread = Thread.new do
68
+ failure_sleep_time = 30
56
69
  last_poll_time = 0
57
70
  last_run = Time.now
71
+
58
72
  loop do
59
- begin
60
- policy_jsons = @@policy_tapi.pollAPI(last_poll_time)
61
- if policy_jsons == nil
62
- TCellAgent.logger.error("Policy was nil")
63
- sleep(10.0)
64
- next
65
- elsif policy_jsons.key?("last_timestamp")
66
- if policy_jsons["last_timestamp"] != 0
67
- last_poll_time = policy_jsons["last_timestamp"]
68
- end
69
- elsif policy_jsons.key?("last_id")
70
- if policy_jsons["last_id"] != 0
71
- last_poll_time = policy_jsons["last_id"]
72
- end
73
- end
74
- processPolicyJson(policy_jsons)
75
- rescue Exception => e
76
- TCellAgent.logger.error("exception while handling connection: #{e.message}")
77
- TCellAgent.logger.debug(e.backtrace)
78
- TCellAgent.logger.debug("Sleeping 30 seconds because the tCell.io request failed...")
79
- sleep(30) #wait a minute before trying again
80
- end
81
- if (Time.now - last_run) < 1
82
- TCellAgent.logger.debug("Rate limiting: sleeping 10 seconds")
83
- sleep(10)
73
+ failure_sleep_time, last_poll_time = policy_polling_iteration(failure_sleep_time, last_poll_time)
74
+
75
+ if (Time.now - last_run) < 5
76
+ random = Random.new
77
+ sleeptime = sleep(random.rand(5..20))
78
+ TCellAgent.logger.debug("Rate limiting: sleeping #{sleeptime} seconds")
79
+ sleep(sleeptime)
84
80
  end
81
+
85
82
  last_run = Time.now
86
83
  end
87
84
  end
88
- end
85
+ end
89
86
  end
90
87
 
91
- def processPolicyJson(policy_jsons, cache_the_policy=true)
88
+ def policy_polling_iteration(failure_sleep_time, last_poll_time)
89
+ begin
90
+ policy_jsons = @@policy_tapi.pollAPI(last_poll_time)
92
91
 
93
- if policy_jsons == nil
94
- return
95
- end
92
+ if policy_jsons == nil
93
+ TCellAgent.logger.error("Policy was nil. Sleeping for #{failure_sleep_time}")
94
+
95
+ sleep(failure_sleep_time)
96
+
97
+ if failure_sleep_time < 480
98
+ failure_sleep_time *= 2
99
+ end
100
+
101
+ return
102
+
103
+ elsif policy_jsons.key?("last_timestamp")
104
+ if policy_jsons["last_timestamp"] != 0
105
+ last_poll_time = policy_jsons["last_timestamp"]
106
+ end
107
+ elsif policy_jsons.key?("last_id")
108
+ if policy_jsons["last_id"] != 0
109
+ last_poll_time = policy_jsons["last_id"]
110
+ end
111
+ end
112
+
113
+ failure_sleep_time = 30
114
+
115
+ processPolicyJson(policy_jsons)
116
+
117
+ rescue RestClient::Exception => rce
118
+ TCellAgent.logger.error("Received error response while contacting api [#{rce.http_code}]: #{rce.message}")
119
+ TCellAgent.logger.debug(rce.backtrace)
120
+ TCellAgent.logger.debug("Sleeping #{failure_sleep_time} seconds because the request failed...")
121
+ sleep(failure_sleep_time)
122
+
123
+ if failure_sleep_time < 480
124
+ failure_sleep_time *= 2
125
+ end
126
+
127
+ rescue Exception => e
128
+ TCellAgent.logger.error("exception while handling connection: #{e.message}")
129
+ TCellAgent.logger.debug(e.backtrace)
130
+ TCellAgent.logger.debug("Sleeping 30 seconds because the tCell.io request failed...")
131
+ sleep(failure_sleep_time)
96
132
 
97
- if policy_jsons.key?("data")
98
- policy_data = policy_jsons["data"]
133
+ if failure_sleep_time < 480
134
+ failure_sleep_time *= 2
135
+ end
99
136
  end
100
137
 
138
+ [failure_sleep_time, last_poll_time]
139
+ end
140
+
141
+ def processPolicyJson(policy_jsons, cache_the_policy=true)
142
+ return if policy_jsons.nil?
143
+
101
144
  TCellAgent::PolicyTypes::ClassMap.each do | policy_type, policy_class |
102
145
  if (policy_jsons.key?(policy_type))
103
146
  new_policy = policy_class.from_json(policy_jsons[policy_type])
@@ -111,15 +154,18 @@ module TCellAgent
111
154
  end
112
155
  end
113
156
  end
114
-
115
- end # end of processPolicyJson
157
+ end
116
158
 
117
159
  def cache(policy_name, policy)
118
160
  cache_filename = TCellAgent.configuration.cache_filename_with_app_id
119
161
 
120
162
  begin
121
163
 
122
- FileUtils.mkdir_p(File.dirname(cache_filename))
164
+ TCellAgent::Utils::IO.create_directory(
165
+ File.dirname(cache_filename),
166
+ TCellAgent.configuration.agent_home_owner
167
+ )
168
+
123
169
  f1 = open(cache_filename, File::RDWR|File::CREAT)
124
170
 
125
171
  Timeout::timeout(0.100) { f1.flock(File::LOCK_EX) }
@@ -151,6 +197,11 @@ module TCellAgent
151
197
  f1.write( JSON.dump(policy_cache) )
152
198
  f1.flush
153
199
  f1.truncate(f1.pos)
200
+
201
+ TCellAgent::Utils::IO.set_owner(
202
+ cache_filename,
203
+ TCellAgent.configuration.agent_home_owner
204
+ )
154
205
  rescue Exception => e
155
206
  TCellAgent.logger.warn(e.message)
156
207
 
@@ -162,11 +213,8 @@ module TCellAgent
162
213
 
163
214
  def policies_from_cachefile
164
215
  cache_filename = TCellAgent.configuration.cache_filename_with_app_id
165
- cache_exists = File.exist?(cache_filename)
166
216
 
167
- if !cache_exists
168
- return nil
169
- end
217
+ return nil unless File.exist?(cache_filename)
170
218
 
171
219
  begin
172
220
  f1 = File.open(cache_filename, File::RDONLY)
@@ -13,43 +13,23 @@ module TCellAgent
13
13
  end
14
14
 
15
15
  def pollAPI(last_timestamp=nil)
16
- if !TCellAgent.configuration || !TCellAgent.configuration.tcell_api_url || !TCellAgent.configuration.app_id
17
- raise "Config Information Not Found, can't poll tCell service"
18
- end
19
16
  full_url = TCellAgent.configuration.tcell_api_url + "/app/" + TCellAgent.configuration.app_id + "/update"
20
17
  if (last_timestamp && last_timestamp != "")
21
18
  full_url = full_url + "?last_timestamp=" + last_timestamp.to_s
22
19
  end
20
+
23
21
  TCellAgent.logger.debug "tCell.io API Request: " + full_url
24
22
  request_headers = {
25
23
  :Authorization => 'Bearer ' + TCellAgent.configuration.api_key
26
24
  }
25
+
27
26
  begin
28
27
  request_headers[:TCellAgent] = "RubyAgent " + TCellAgent::VERSION
29
28
  rescue Exception => e
30
29
  TCellAgent.logger.debug("tCell.io Could not add agent string: " + e.message)
31
30
  end
32
- response = RestClient.get full_url,request_headers
33
- TCellAgent.logger.debug "tCell.io API Response: " + response
34
- response_json = JSON.parse(response)
35
- if (response_json && response_json.has_key?("result"))
36
- return response_json["result"]
37
- end
38
- # else result was null and no new information exists...
39
- return nil
40
- end
41
31
 
42
- def pollOldAPI(last_timestamp=nil)
43
- if !TCellAgent.configuration || !TCellAgent.configuration.tcell_api_url || !TCellAgent.configuration.app_id
44
- raise "Config Information Not Found, can't poll tCell service"
45
- end
46
- full_url = TCellAgent.configuration.tcell_api_url + "/api/" + TCellAgent.configuration.app_id + "/csp/poll"
47
- TCellAgent.logger.debug "tCell.io API Request: " + full_url
48
- full_url = full_url + "/" + TCellAgent.configuration.api_key
49
- if (last_timestamp && last_timestamp != "")
50
- full_url = full_url + "?last_timestamp=" + last_timestamp.to_s
51
- end
52
- response = RestClient.get full_url
32
+ response = RestClient.get full_url,request_headers
53
33
  TCellAgent.logger.debug "tCell.io API Response: " + response
54
34
  response_json = JSON.parse(response)
55
35
  if (response_json && response_json.has_key?("result"))
@@ -99,4 +79,4 @@ module TCellAgent
99
79
  return false
100
80
  end
101
81
  end
102
- end
82
+ end
@@ -26,21 +26,21 @@ module TCellAgent
26
26
  :uuid,
27
27
  :company,
28
28
  :event_batch_size_limit, :event_time_limit_seconds,
29
- :log_filename,
30
29
  :base_dir,
31
30
  :cache_filename,
32
31
  :js_agent_api_base_url,
33
32
  :js_agent_url,
34
33
  :raise_exceptions,
35
- :allow_unencrypted_appsensor_payloads,
34
+ :allow_unencrypted_appfirewall_payloads,
36
35
  :blacklisted_params,
37
36
  :whitelisted_params,
38
37
  :whitelist_present,
39
38
  :config_filename,
40
39
  :agent_log_dir,
41
40
  :max_data_ex_db_records_per_request,
42
- :log_appfirewall_events,
43
- :appfirewall_payloads_log_filename
41
+ :allow_unencrypted_appfirewall_payloads_logging,
42
+ :agent_home_dir,
43
+ :agent_home_owner
44
44
 
45
45
  attr_accessor :disable_all,
46
46
  :enabled,
@@ -73,6 +73,11 @@ module TCellAgent
73
73
  end
74
74
 
75
75
  def initialize(filename="config/tcell_agent.config", useapp=nil)
76
+ # These will be set when the agent starts up, to give rails initializers
77
+ # a chance to run
78
+ @cache_filename = nil
79
+ @agent_log_dir = nil
80
+
76
81
  @version = 0
77
82
  @exp_config_settings = true
78
83
  @demomode = false
@@ -90,9 +95,9 @@ module TCellAgent
90
95
 
91
96
 
92
97
  @agent_home_dir = File.join(Dir.getwd, "tcell")
93
- @agent_log_dir = File.join(@agent_home_dir, "logs")
94
98
  @config_filename = File.join(Dir.getwd, filename)
95
99
 
100
+
96
101
  @event_batch_size_limit = 50
97
102
  @event_time_limit_seconds = 15
98
103
 
@@ -103,21 +108,16 @@ module TCellAgent
103
108
  read_config_using_env
104
109
  read_config_from_file(@config_filename)
105
110
 
106
- @cache_filename = File.join(@agent_home_dir, "cache", "tcell_agent.cache")
107
- @log_filename = File.join(@agent_log_dir, "tcell_agent.log")
108
-
109
-
110
111
  # Because ENV can override this one
111
112
  env_unencrypted_firewall =
112
113
  if (ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS"] != nil)
113
- @allow_unencrypted_appsensor_payloads = [true, "true", "yes", "1"].include?(ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS"])
114
+ @allow_unencrypted_appfirewall_payloads = [true, "true", "yes", "1"].include?(ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS"])
114
115
  end
115
116
  if (ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS"] != nil)
116
- @allow_unencrypted_appsensor_payloads = [true, "true", "yes", "1"].include?(ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS"])
117
+ @allow_unencrypted_appfirewall_payloads = [true, "true", "yes", "1"].include?(ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS"])
117
118
  end
118
119
 
119
- @log_appfirewall_events = [true, "true", "yes", "1"].include?(ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS_LOGGING"])
120
- @appfirewall_payloads_log_filename = File.join(@agent_log_dir, "tcell_agent_payloads.log")
120
+ @allow_unencrypted_appfirewall_payloads_logging = [true, "true", "yes", "1"].include?(ENV["TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS_LOGGING"])
121
121
 
122
122
  @tcell_api_url ||= "https://api.tcell.io/api/v1"
123
123
  @tcell_input_url ||= "https://input.tcell.io/api/v1"
@@ -134,17 +134,12 @@ module TCellAgent
134
134
 
135
135
  @uuid = SecureRandom.uuid
136
136
 
137
- FileUtils::mkdir_p File.dirname(@cache_filename)
138
- if @logging_options && @logging_options["filename"]
139
- FileUtils::mkdir_p File.dirname(@logging_options["filename"])
140
- else
141
- FileUtils::mkdir_p File.dirname(@log_filename)
142
- end
143
-
144
137
  load_app_sensor_restrictions
145
138
  end
146
139
 
147
140
  def cache_filename_with_app_id
141
+ @cache_filename ||= File.join(@agent_home_dir, "cache", "tcell_agent.cache")
142
+
148
143
  if @app_id
149
144
  "#{@cache_filename}.#{@app_id}"
150
145
  else
@@ -162,7 +157,8 @@ module TCellAgent
162
157
  @demomode = ENV["TCELL_DEMOMODE"] || @demomode
163
158
 
164
159
  @agent_home_dir = ENV["TCELL_AGENT_HOME"] || @agent_home_dir
165
- @agent_log_dir = ENV["TCELL_AGENT_LOG_DIR"] || File.join(@agent_home_dir, "logs")
160
+ @agent_home_owner = ENV["TCELL_AGENT_HOME_OWNER"]
161
+ @agent_log_dir = ENV["TCELL_AGENT_LOG_DIR"]
166
162
  @config_filename = ENV["TCELL_AGENT_CONFIG"] || @config_filename
167
163
 
168
164
  if @demomode
@@ -212,16 +208,15 @@ module TCellAgent
212
208
 
213
209
  @use_websockets = app_data["use_websockets"]
214
210
 
215
- @allow_unencrypted_appsensor_payloads = app_data.fetch('allow_unencrypted_appsensor_payloads', @allow_unencrypted_appsensor_payloads)
216
- @allow_unencrypted_appsensor_payloads = app_data.fetch('allow_unencrypted_appfirewall_payloads', @allow_unencrypted_appsensor_payloads)
211
+ @allow_unencrypted_appfirewall_payloads =
212
+ app_data.fetch('allow_unencrypted_appsensor_payloads', @allow_unencrypted_appfirewall_payloads)
213
+ @allow_unencrypted_appfirewall_payloads =
214
+ app_data.fetch('allow_unencrypted_appfirewall_payloads', @allow_unencrypted_appfirewall_payloads)
217
215
 
218
216
  data_exposure = app_data.fetch('data_exposure', {})
219
217
  @max_data_ex_db_records_per_request = data_exposure.fetch('max_data_ex_db_records_per_request', @max_data_ex_db_records_per_request)
220
218
 
221
219
  @host_identifier = @host_identifier || app_data.fetch("host_identifier", @host_identifier)
222
- if (@host_identifier == nil)
223
- @host_identifier = (Socket.gethostname() || "localhost")
224
- end
225
220
  @hmac_key ||= app_data["hmac_key"] # if not already set
226
221
  @session_cookie_names = app_data["session_cookie_names"]
227
222
  @uuid = SecureRandom.uuid
@@ -294,7 +289,7 @@ module TCellAgent
294
289
  end
295
290
 
296
291
  rescue Exception => e
297
- @allow_unencrypted_appsensor_payloads = false
292
+ @allow_unencrypted_appfirewall_payloads = false
298
293
 
299
294
  puts " ********* ********* ********* **********"
300
295
  puts "* tCell.io *"
@@ -305,6 +300,15 @@ module TCellAgent
305
300
  end
306
301
  end
307
302
 
303
+ def log_filename
304
+ @agent_log_dir ||= File.join(@agent_home_dir, "logs")
305
+ File.join(@agent_log_dir, "tcell_agent.log")
306
+ end
307
+
308
+ def appfirewall_payloads_log_filename
309
+ @agent_log_dir ||= File.join(@agent_home_dir, "logs")
310
+ File.join(@agent_log_dir, "tcell_agent_payloads.log")
311
+ end
308
312
  end # class
309
313
 
310
314
  TCellAgent.configuration ||= TCellAgent::Configuration.new
@@ -5,6 +5,16 @@ require 'tcell_agent/configuration'
5
5
 
6
6
  module TCellAgent
7
7
 
8
+ class TCellLogDevice < Logger::LogDevice
9
+ def create_logfile(filename)
10
+ logdev = super
11
+
12
+ TCellAgent::Utils::IO.set_owner(filename, TCellAgent.configuration.agent_home_owner)
13
+
14
+ logdev
15
+ end
16
+ end
17
+
8
18
  @@logger_pid = Process.pid
9
19
 
10
20
  def self.loggingLevelFromString(levelString)
@@ -28,9 +38,17 @@ module TCellAgent
28
38
  return @payloads_logger
29
39
  end
30
40
 
31
- if TCellAgent.configuration.log_appfirewall_events
32
- FileUtils.mkdir_p TCellAgent.configuration.agent_log_dir
33
- @payloads_logger = Logger.new(TCellAgent.configuration.appfirewall_payloads_log_filename, 9, 5242880)
41
+ TCellAgent::Utils::IO.create_directory(
42
+ File.dirname(TCellAgent.configuration.appfirewall_payloads_log_filename),
43
+ TCellAgent.configuration.agent_home_owner
44
+ )
45
+
46
+ log_device = TCellLogDevice.new(
47
+ TCellAgent.configuration.appfirewall_payloads_log_filename,
48
+ shift_age: 9, shift_size: 5242880
49
+ )
50
+ if TCellAgent.configuration.allow_unencrypted_appfirewall_payloads_logging
51
+ @payloads_logger = Logger.new(log_device)
34
52
  @payloads_logger.level = Logger::INFO
35
53
  @payloads_logger.formatter = proc do |severity, datetime, progname, msg|
36
54
  date_format = datetime.strftime("%Y-%m-%dT%H:%M:%S.%L%:z")
@@ -40,7 +58,7 @@ module TCellAgent
40
58
  return @payloads_logger
41
59
  end
42
60
 
43
- logger = Logger.new(TCellAgent.configuration.appfirewall_payloads_log_filename)
61
+ logger = Logger.new(log_device)
44
62
  logger.level = Logger::ERROR
45
63
  return logger
46
64
  end
@@ -53,12 +71,15 @@ module TCellAgent
53
71
  @logger_pid = Process.pid
54
72
  logging_options = TCellAgent.configuration.logging_options
55
73
 
74
+ logging_file = TCellAgent.configuration.log_filename
75
+ logging_directory = File.dirname(logging_file)
76
+ TCellAgent::Utils::IO.create_directory(logging_directory, TCellAgent.configuration.agent_home_owner)
77
+
78
+ log_device = TCellLogDevice.new(logging_file, shift_age: 9, shift_size: 5242880)
56
79
  if logging_options && logging_options["enabled"]
57
- FileUtils.mkdir_p TCellAgent.configuration.agent_log_dir
58
80
  level = loggingLevelFromString(logging_options["level"])
59
- logging_file = logging_options["filename"] || TCellAgent.configuration.log_filename
60
81
  # limit the total log file to about 9 * 5 = 45 mb
61
- @logger = Logger.new(logging_file, shift_age=9, shift_size=5242880)
82
+ @logger = Logger.new(log_device)
62
83
  @logger.level = level
63
84
  @logger.formatter = proc do |severity, datetime, progname, msg|
64
85
  # ISO 8601 format
@@ -69,7 +90,7 @@ module TCellAgent
69
90
  return @logger
70
91
  end
71
92
 
72
- logger = Logger.new(TCellAgent.configuration.log_filename)
93
+ logger = Logger.new(log_device)
73
94
  logger.level = Logger::ERROR
74
95
  return logger
75
96
  end
@@ -71,7 +71,7 @@ module TCellAgent
71
71
  vuln_param = vuln_results["param"]
72
72
  payload = nil
73
73
 
74
- if TCellAgent.configuration.allow_unencrypted_appsensor_payloads
74
+ if TCellAgent.configuration.allow_unencrypted_appfirewall_payloads
75
75
  payload = vuln_results["value"]
76
76
  end
77
77
 
@@ -105,7 +105,7 @@ module TCellAgent
105
105
  end
106
106
 
107
107
  def log_appsensor_events(type_of_param, appsensor_meta, vuln_param, vuln_value)
108
- if TCellAgent.configuration.log_appfirewall_events
108
+ if TCellAgent.configuration.allow_unencrypted_appfirewall_payloads_logging
109
109
  event = TCellAgent::SensorEvents::TCellAppSensorEvent.new(
110
110
  appsensor_meta.location,
111
111
  @detection_point,
@@ -1,8 +1,6 @@
1
1
  module TCellAgent
2
2
  if defined?(Devise)
3
3
 
4
- TCellAgent.logger.debug("Instrumenting Devise")
5
-
6
4
  require 'tcell_agent/agent'
7
5
  require 'tcell_agent/sensor_events/login_fraud'
8
6
  require 'tcell_agent/policies/appsensor_policy'
@@ -4,8 +4,8 @@
4
4
 
5
5
  Rails::Server.class_eval do
6
6
 
7
- alias_method :tcell_start, :start
8
- def start(&blk)
7
+ alias_method :tcell_build_app, :build_app
8
+ def build_app(app)
9
9
  require("tcell_agent/servers/unicorn") if defined?(Unicorn::HttpServer)
10
10
  require("tcell_agent/servers/webrick") if defined?(Rack::Handler::WEBrick)
11
11
  require("tcell_agent/servers/thin") if defined?(Thin::Server)
@@ -23,7 +23,7 @@ Rails::Server.class_eval do
23
23
  end
24
24
  end
25
25
 
26
- tcell_start(&blk)
26
+ tcell_build_app(app)
27
27
  end
28
28
 
29
29
  end
@@ -1,10 +1,9 @@
1
1
  Unicorn::HttpServer.class_eval do
2
2
 
3
- # This will be true when preload_app is false (when preload app is true, the master won't have any
4
- # listeners at this point). This means the initial app load is for each worker. This check
5
- # also ensures that a server is running as opposed to a different command such
3
+ # - This will be false when preload_app is false (even when unicorn is sent USR2 SIGNAL)
4
+ # - This check also ensures that a server is running as opposed to a different command such
6
5
  # as `bundle exec rails runner User.count`.
7
- if Unicorn::HttpServer::LISTENERS != nil && Unicorn::HttpServer::LISTENERS.length > 0
6
+ unless Unicorn::HttpServer::START_CTX && Unicorn::HttpServer::START_CTX[0]
8
7
  TCellAgent.run_instrumentation("Unicorn")
9
8
  end
10
9
 
@@ -13,11 +13,9 @@ if (TCellAgent.configuration.disable_all == false)
13
13
 
14
14
  require 'tcell_agent/rails/on_start' if defined?(Rails)
15
15
 
16
- begin
16
+ TCellAgent::Instrumentation.safe_block("Starting thread agent") do
17
17
  TCellAgent.logger.debug("Instrumenting: #{server_name}")
18
18
  TCellAgent.thread_agent.start
19
- rescue Exception => e
20
- TCellAgent.logger.error("Could not start thread agent. #{e.message}")
21
19
  end
22
20
 
23
21
  if TCellAgent.configuration.should_instrument?
@@ -0,0 +1,27 @@
1
+ module TCellAgent
2
+ module Utils
3
+ module IO
4
+
5
+ def self.create_directory(dir, owner=nil)
6
+ unless File.directory?(dir)
7
+ FileUtils.mkdir_p(dir)
8
+
9
+ if TCellAgent::Utils::Strings.present?(owner)
10
+ TCellAgent::Instrumentation.safe_block("Ignoring agent_home_owner value, insufficient privileges") do
11
+ FileUtils.chown( owner, nil, dir )
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ def self.set_owner(filename, owner=nil)
18
+ TCellAgent::Instrumentation.safe_block("Ignoring agent_home_owner value, insufficient privileges") do
19
+ if TCellAgent::Utils::Strings.present?(owner) && File.exists?(filename)
20
+ FileUtils.chown( owner, nil, filename )
21
+ end
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ module TCellAgent
2
+ module Utils
3
+ module Strings
4
+ BLANK_RE = /\A[[:space:]]*\z/
5
+
6
+ def self.blank?(str)
7
+ str.nil? || str.empty? || BLANK_RE === str
8
+ end
9
+
10
+ def self.present?(str)
11
+ !self.blank?(str)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,5 @@
1
1
  # See the file "LICENSE" for the full license governing this code.
2
2
 
3
3
  module TCellAgent
4
- VERSION = "0.2.13"
4
+ VERSION = "0.2.14"
5
5
  end
@@ -5,6 +5,194 @@ module TCellAgent
5
5
 
6
6
  describe Agent do
7
7
 
8
+ describe "#start_policy_polling_loop" do
9
+ context "should_start_policy_poll disabled" do
10
+ it "should not start the policy polling loop" do
11
+ configuration = double(
12
+ "configuration",
13
+ {
14
+ should_start_policy_poll?: false,
15
+ event_time_limit_seconds: nil,
16
+ event_batch_size_limit: nil,
17
+ preload_policy_filename: nil,
18
+ cache_filename_with_app_id: "cache-file.app_id"
19
+ }
20
+ )
21
+
22
+ expect(TCellAgent).to receive(:configuration).and_return(configuration).at_least(:once)
23
+ agent = TCellAgent::Agent.new
24
+
25
+ expect(Thread).to_not receive(:new)
26
+ agent.start_policy_polling_loop
27
+ end
28
+ end
29
+
30
+ context "should_start_policy_poll enabled" do
31
+ context "tcell_api_url" do
32
+ context "is nil " do
33
+ it "should not start the policy polling loop" do
34
+ configuration = double(
35
+ "configuration",
36
+ {
37
+ tcell_api_url: nil,
38
+ should_start_policy_poll?: true,
39
+ event_time_limit_seconds: nil,
40
+ event_batch_size_limit: nil,
41
+ preload_policy_filename: nil,
42
+ cache_filename_with_app_id: "cache-file.app_id"
43
+ }
44
+ )
45
+
46
+ expect(TCellAgent).to receive(:configuration).and_return(configuration).at_least(:once)
47
+ agent = TCellAgent::Agent.new
48
+
49
+ logger = double("logger")
50
+
51
+ expect(TCellAgent).to receive(:logger).and_return(logger)
52
+ expect(logger).to receive(:error).with("tCell.io tcell_api_url is missing. Disabling policy polling.")
53
+ expect(Thread).to_not receive(:new)
54
+ agent.start_policy_polling_loop
55
+ end
56
+ end
57
+
58
+ context "is empty" do
59
+ it "should not start the policy polling loop" do
60
+ configuration = double(
61
+ "configuration",
62
+ {
63
+ tcell_api_url: "",
64
+ should_start_policy_poll?: true,
65
+ event_time_limit_seconds: nil,
66
+ event_batch_size_limit: nil,
67
+ preload_policy_filename: nil,
68
+ cache_filename_with_app_id: "cache-file.app_id"
69
+ }
70
+ )
71
+
72
+ expect(TCellAgent).to receive(:configuration).and_return(configuration).at_least(:once)
73
+ agent = TCellAgent::Agent.new
74
+
75
+ logger = double("logger")
76
+
77
+ expect(TCellAgent).to receive(:logger).and_return(logger)
78
+ expect(logger).to receive(:error).with("tCell.io tcell_api_url is missing. Disabling policy polling.")
79
+ expect(Thread).to_not receive(:new)
80
+ agent.start_policy_polling_loop
81
+ end
82
+ end
83
+
84
+ context "is blank space" do
85
+ it "should not start the policy polling loop" do
86
+ configuration = double(
87
+ "configuration",
88
+ {
89
+ tcell_api_url: " ",
90
+ should_start_policy_poll?: true,
91
+ event_time_limit_seconds: nil,
92
+ event_batch_size_limit: nil,
93
+ preload_policy_filename: nil,
94
+ cache_filename_with_app_id: "cache-file.app_id"
95
+ }
96
+ )
97
+
98
+ expect(TCellAgent).to receive(:configuration).and_return(configuration).at_least(:once)
99
+ agent = TCellAgent::Agent.new
100
+
101
+ logger = double("logger")
102
+
103
+ expect(TCellAgent).to receive(:logger).and_return(logger)
104
+ expect(logger).to receive(:error).with("tCell.io tcell_api_url is missing. Disabling policy polling.")
105
+ expect(Thread).to_not receive(:new)
106
+ agent.start_policy_polling_loop
107
+ end
108
+ end
109
+ end
110
+
111
+ context "app_id" do
112
+ context "is nil " do
113
+ it "should not start the policy polling loop" do
114
+ configuration = double(
115
+ "configuration",
116
+ {
117
+ tcell_api_url: "present",
118
+ app_id: nil,
119
+ should_start_policy_poll?: true,
120
+ event_time_limit_seconds: nil,
121
+ event_batch_size_limit: nil,
122
+ preload_policy_filename: nil,
123
+ cache_filename_with_app_id: "cache-file.app_id"
124
+ }
125
+ )
126
+
127
+ expect(TCellAgent).to receive(:configuration).and_return(configuration).at_least(:once)
128
+ agent = TCellAgent::Agent.new
129
+
130
+ logger = double("logger")
131
+
132
+ expect(TCellAgent).to receive(:logger).and_return(logger)
133
+ expect(logger).to receive(:error).with("tCell.io app_id is missing. Disabling policy polling.")
134
+ expect(Thread).to_not receive(:new)
135
+ agent.start_policy_polling_loop
136
+ end
137
+ end
138
+
139
+ context "is empty" do
140
+ it "should not start the policy polling loop" do
141
+ configuration = double(
142
+ "configuration",
143
+ {
144
+ tcell_api_url: "present",
145
+ app_id: "",
146
+ should_start_policy_poll?: true,
147
+ event_time_limit_seconds: nil,
148
+ event_batch_size_limit: nil,
149
+ preload_policy_filename: nil,
150
+ cache_filename_with_app_id: "cache-file.app_id"
151
+ }
152
+ )
153
+
154
+ expect(TCellAgent).to receive(:configuration).and_return(configuration).at_least(:once)
155
+ agent = TCellAgent::Agent.new
156
+
157
+ logger = double("logger")
158
+
159
+ expect(TCellAgent).to receive(:logger).and_return(logger)
160
+ expect(logger).to receive(:error).with("tCell.io app_id is missing. Disabling policy polling.")
161
+ expect(Thread).to_not receive(:new)
162
+ agent.start_policy_polling_loop
163
+ end
164
+ end
165
+
166
+ context "is blank space" do
167
+ it "should not start the policy polling loop" do
168
+ configuration = double(
169
+ "configuration",
170
+ {
171
+ tcell_api_url: "present",
172
+ app_id: " ",
173
+ should_start_policy_poll?: true,
174
+ event_time_limit_seconds: nil,
175
+ event_batch_size_limit: nil,
176
+ preload_policy_filename: nil,
177
+ cache_filename_with_app_id: "cache-file.app_id"
178
+ }
179
+ )
180
+
181
+ expect(TCellAgent).to receive(:configuration).and_return(configuration).at_least(:once)
182
+ agent = TCellAgent::Agent.new
183
+
184
+ logger = double("logger")
185
+
186
+ expect(TCellAgent).to receive(:logger).and_return(logger)
187
+ expect(logger).to receive(:error).with("tCell.io app_id is missing. Disabling policy polling.")
188
+ expect(Thread).to_not receive(:new)
189
+ agent.start_policy_polling_loop
190
+ end
191
+ end
192
+ end
193
+ end
194
+ end
195
+
8
196
  describe "#cache" do
9
197
  context "with an existing cached file" do
10
198
 
@@ -29,7 +29,7 @@ module TCellAgent
29
29
  expect(File).to_not receive(:open)
30
30
  configuration = TCellAgent::Configuration.new
31
31
 
32
- expect(configuration.allow_unencrypted_appsensor_payloads).to eq(true)
32
+ expect(configuration.allow_unencrypted_appfirewall_payloads).to eq(true)
33
33
  expect(configuration.blacklisted_params).to eq({
34
34
  "token" => true,
35
35
  "client_secret" => true,
@@ -58,7 +58,7 @@ module TCellAgent
58
58
  expect(File).to receive(:open).with("config/tcell_agent_payloads.config").and_return(payloads_file)
59
59
  configuration = TCellAgent::Configuration.new
60
60
 
61
- expect(configuration.allow_unencrypted_appsensor_payloads).to eq(false)
61
+ expect(configuration.allow_unencrypted_appfirewall_payloads).to eq(false)
62
62
  expect(configuration.blacklisted_params).to eq({
63
63
  "token" => true,
64
64
  "client_secret" => true,
@@ -87,7 +87,7 @@ module TCellAgent
87
87
  expect(File).to receive(:open).with("config/tcell_agent_payloads.config").and_return(payloads_file)
88
88
  configuration = TCellAgent::Configuration.new
89
89
 
90
- expect(configuration.allow_unencrypted_appsensor_payloads).to eq(true)
90
+ expect(configuration.allow_unencrypted_appfirewall_payloads).to eq(true)
91
91
  expect(configuration.blacklisted_params).to eq({
92
92
  "token" => true,
93
93
  "client_secret" => true,
@@ -115,7 +115,7 @@ module TCellAgent
115
115
  expect(File).to receive(:open).with("config/tcell_agent_payloads.config").and_return(payloads_file)
116
116
  configuration = TCellAgent::Configuration.new
117
117
 
118
- expect(configuration.allow_unencrypted_appsensor_payloads).to eq(true)
118
+ expect(configuration.allow_unencrypted_appfirewall_payloads).to eq(true)
119
119
  expect(configuration.blacklisted_params).to eq({"passwd" => true})
120
120
  expect(configuration.whitelisted_params).to eq({})
121
121
  expect(configuration.whitelist_present).to eq(false)
@@ -135,7 +135,7 @@ module TCellAgent
135
135
  expect(File).to receive(:open).with("config/tcell_agent_payloads.config").and_return(payloads_file)
136
136
  configuration = TCellAgent::Configuration.new
137
137
 
138
- expect(configuration.allow_unencrypted_appsensor_payloads).to eq(true)
138
+ expect(configuration.allow_unencrypted_appfirewall_payloads).to eq(true)
139
139
  expect(configuration.blacklisted_params).to eq({
140
140
  "token" => true,
141
141
  "client_secret" => true,
@@ -163,7 +163,7 @@ module TCellAgent
163
163
  expect(File).to receive(:open).with("config/tcell_agent_payloads.config").and_return(payloads_file)
164
164
  configuration = TCellAgent::Configuration.new
165
165
 
166
- expect(configuration.allow_unencrypted_appsensor_payloads).to eq(true)
166
+ expect(configuration.allow_unencrypted_appfirewall_payloads).to eq(true)
167
167
  expect(configuration.blacklisted_params).to eq({"ssn" => true})
168
168
  expect(configuration.whitelisted_params).to eq({"passwd" => true})
169
169
  expect(configuration.whitelist_present).to eq(true)
@@ -179,8 +179,8 @@ module TCellAgent
179
179
  it "should set cache file, config, and log file to defaults" do
180
180
  configuration = Configuration.new
181
181
 
182
- expect(configuration.cache_filename).to eq(
183
- File.join(Dir.getwd, "tcell/cache/tcell_agent.cache")
182
+ expect(configuration.cache_filename_with_app_id).to match(
183
+ /tcell\/cache\/tcell_agent.cache/
184
184
  )
185
185
  expect(configuration.log_filename).to eq(
186
186
  File.join(Dir.getwd, "tcell/logs/tcell_agent.log")
@@ -197,13 +197,10 @@ module TCellAgent
197
197
 
198
198
  ENV["TCELL_AGENT_HOME"] = "spec_tcell_home"
199
199
 
200
- expect(FileUtils).to receive(:mkdir_p).with("spec_tcell_home/cache")
201
- expect(FileUtils).to receive(:mkdir_p).with("spec_tcell_home/logs")
202
-
203
200
  configuration = Configuration.new
204
201
 
205
- expect(configuration.cache_filename).to eq(
206
- "spec_tcell_home/cache/tcell_agent.cache"
202
+ expect(configuration.cache_filename_with_app_id).to match(
203
+ /spec_tcell_home\/cache\/tcell_agent.cache/
207
204
  )
208
205
  expect(configuration.log_filename).to eq(
209
206
  "spec_tcell_home/logs/tcell_agent.log"
@@ -224,13 +221,10 @@ module TCellAgent
224
221
  ENV["TCELL_AGENT_HOME"] = "spec_tcell_home"
225
222
  ENV["TCELL_AGENT_LOG_DIR"] = "spec_tcell_log_dir"
226
223
 
227
- expect(FileUtils).to receive(:mkdir_p).with("spec_tcell_home/cache")
228
- expect(FileUtils).to receive(:mkdir_p).with("spec_tcell_log_dir")
229
-
230
224
  configuration = Configuration.new
231
225
 
232
- expect(configuration.cache_filename).to eq(
233
- "spec_tcell_home/cache/tcell_agent.cache"
226
+ expect(configuration.cache_filename_with_app_id).to match(
227
+ /spec_tcell_home\/cache\/tcell_agent.cache/
234
228
  )
235
229
  expect(configuration.log_filename).to eq(
236
230
  "spec_tcell_log_dir/tcell_agent.log"
@@ -254,13 +248,10 @@ module TCellAgent
254
248
  ENV["TCELL_AGENT_LOG_DIR"] = "spec_tcell_log_dir"
255
249
  ENV["TCELL_AGENT_CONFIG"] = "spec_config/tcell_agent.config"
256
250
 
257
- expect(FileUtils).to receive(:mkdir_p).with("spec_tcell_log_dir")
258
- expect(FileUtils).to receive(:mkdir_p).with("spec_tcell_home/cache")
259
-
260
251
  configuration = Configuration.new
261
252
 
262
- expect(configuration.cache_filename).to eq(
263
- "spec_tcell_home/cache/tcell_agent.cache"
253
+ expect(configuration.cache_filename_with_app_id).to match(
254
+ /spec_tcell_home\/cache\/tcell_agent.cache/
264
255
  )
265
256
  expect(configuration.log_filename).to eq(
266
257
  "spec_tcell_log_dir/tcell_agent.log"
@@ -243,8 +243,8 @@ module TCellAgent
243
243
  @sensor.exclude_cookies = true
244
244
  configuration = double(
245
245
  "configuration",
246
- log_appfirewall_events: false,
247
- allow_unencrypted_appsensor_payloads: true,
246
+ allow_unencrypted_appfirewall_payloads_logging: false,
247
+ allow_unencrypted_appfirewall_payloads: true,
248
248
  blacklisted_params: {},
249
249
  whitelist_present: false
250
250
  )
@@ -267,7 +267,7 @@ module TCellAgent
267
267
  expect(result).to eq(true)
268
268
  end
269
269
 
270
- context "allow_unencrypted_appsensor_payloads is false" do
270
+ context "allow_unencrypted_appfirewall_payloads is false" do
271
271
  context "param is blacklisted" do
272
272
  it "should return true" do
273
273
  @sensor.exclude_forms = false
@@ -275,8 +275,8 @@ module TCellAgent
275
275
 
276
276
  configuration = double(
277
277
  "configuration",
278
- log_appfirewall_events: false,
279
- allow_unencrypted_appsensor_payloads: false,
278
+ allow_unencrypted_appfirewall_payloads_logging: false,
279
+ allow_unencrypted_appfirewall_payloads: false,
280
280
  blacklisted_params: {"vuln_param" => true},
281
281
  whitelist_present: false
282
282
  )
@@ -307,8 +307,8 @@ module TCellAgent
307
307
 
308
308
  configuration = double(
309
309
  "configuration",
310
- log_appfirewall_events: false,
311
- allow_unencrypted_appsensor_payloads: false,
310
+ allow_unencrypted_appfirewall_payloads_logging: false,
311
+ allow_unencrypted_appfirewall_payloads: false,
312
312
  blacklisted_params: {},
313
313
  whitelist_present: true,
314
314
  whitelisted_params: {"vuln_param" => true}
@@ -340,8 +340,8 @@ module TCellAgent
340
340
 
341
341
  configuration = double(
342
342
  "configuration",
343
- log_appfirewall_events: false,
344
- allow_unencrypted_appsensor_payloads: false,
343
+ allow_unencrypted_appfirewall_payloads_logging: false,
344
+ allow_unencrypted_appfirewall_payloads: false,
345
345
  blacklisted_params: {},
346
346
  whitelist_present: false
347
347
  )
@@ -366,7 +366,7 @@ module TCellAgent
366
366
  end
367
367
  end
368
368
 
369
- context "allow_unencrypted_appsensor_payloads is true" do
369
+ context "allow_unencrypted_appfirewall_payloads is true" do
370
370
  context "params is blacklisted" do
371
371
  it "should return true" do
372
372
  @sensor.exclude_forms = false
@@ -374,8 +374,8 @@ module TCellAgent
374
374
 
375
375
  configuration = double(
376
376
  "configuration",
377
- log_appfirewall_events: false,
378
- allow_unencrypted_appsensor_payloads: true,
377
+ allow_unencrypted_appfirewall_payloads_logging: false,
378
+ allow_unencrypted_appfirewall_payloads: true,
379
379
  blacklisted_params: {"vuln_param" => true},
380
380
  whitelist_present: false
381
381
  )
@@ -406,8 +406,8 @@ module TCellAgent
406
406
 
407
407
  configuration = double(
408
408
  "configuration",
409
- log_appfirewall_events: false,
410
- allow_unencrypted_appsensor_payloads: true,
409
+ allow_unencrypted_appfirewall_payloads_logging: false,
410
+ allow_unencrypted_appfirewall_payloads: true,
411
411
  blacklisted_params: {},
412
412
  whitelist_present: true,
413
413
  whitelisted_params: {"vuln_param" => true}
@@ -439,8 +439,8 @@ module TCellAgent
439
439
 
440
440
  configuration = double(
441
441
  "configuration",
442
- log_appfirewall_events: false,
443
- allow_unencrypted_appsensor_payloads: true,
442
+ allow_unencrypted_appfirewall_payloads_logging: false,
443
+ allow_unencrypted_appfirewall_payloads: true,
444
444
  blacklisted_params: {"vuln_param" => true},
445
445
  whitelist_present: true,
446
446
  whitelisted_params: {"vuln_param" => true}
@@ -472,8 +472,8 @@ module TCellAgent
472
472
 
473
473
  configuration = double(
474
474
  "configuration",
475
- log_appfirewall_events: false,
476
- allow_unencrypted_appsensor_payloads: true,
475
+ allow_unencrypted_appfirewall_payloads_logging: false,
476
+ allow_unencrypted_appfirewall_payloads: true,
477
477
  blacklisted_params: {},
478
478
  whitelist_present: false
479
479
  )
@@ -522,8 +522,8 @@ module TCellAgent
522
522
  @sensor.exclude_cookies = true
523
523
  configuration = double(
524
524
  "configuration",
525
- log_appfirewall_events: false,
526
- allow_unencrypted_appsensor_payloads: true,
525
+ allow_unencrypted_appfirewall_payloads_logging: false,
526
+ allow_unencrypted_appfirewall_payloads: true,
527
527
  blacklisted_params: {},
528
528
  whitelist_present: false
529
529
  )
@@ -570,8 +570,8 @@ module TCellAgent
570
570
  @sensor.exclude_cookies = true
571
571
  configuration = double(
572
572
  "configuration",
573
- log_appfirewall_events: false,
574
- allow_unencrypted_appsensor_payloads: true,
573
+ allow_unencrypted_appfirewall_payloads_logging: false,
574
+ allow_unencrypted_appfirewall_payloads: true,
575
575
  blacklisted_params: {},
576
576
  whitelist_present: false
577
577
  )
@@ -603,8 +603,8 @@ module TCellAgent
603
603
  @sensor.exclude_cookies = false
604
604
  configuration = double(
605
605
  "configuration",
606
- log_appfirewall_events: false,
607
- allow_unencrypted_appsensor_payloads: true,
606
+ allow_unencrypted_appfirewall_payloads_logging: false,
607
+ allow_unencrypted_appfirewall_payloads: true,
608
608
  blacklisted_params: {},
609
609
  whitelist_present: false
610
610
  )
@@ -103,8 +103,8 @@ module TCellAgent
103
103
  expect(TCellAgent.event_queue).to include(expected_as)
104
104
  end
105
105
  it "checks that payload is sent in xss with route_id" do
106
- old_uap = TCellAgent.configuration.allow_unencrypted_appsensor_payloads
107
- TCellAgent.configuration.allow_unencrypted_appsensor_payloads = true
106
+ old_uap = TCellAgent.configuration.allow_unencrypted_appfirewall_payloads
107
+ TCellAgent.configuration.allow_unencrypted_appfirewall_payloads = true
108
108
  response = request2.get("/foo?xyz=%3Cscript%3Ealert(1)%3C%2Fscript%3E")
109
109
  expected_as = {
110
110
  "event_type"=>"as",
@@ -117,7 +117,7 @@ module TCellAgent
117
117
  "loc"=>"http://example.org/foo?xyz=",
118
118
  "tid"=>"a-b-c-d-e-f",
119
119
  "payload"=>"<script>alert(1)</script>"}
120
- TCellAgent.configuration.allow_unencrypted_appsensor_payloads = old_uap
120
+ TCellAgent.configuration.allow_unencrypted_appfirewall_payloads= old_uap
121
121
  expect(TCellAgent.event_queue).to include(expected_as)
122
122
  end
123
123
 
@@ -179,8 +179,8 @@ module TCellAgent
179
179
  expect(TCellAgent.event_queue).to include(expected_as)
180
180
  end
181
181
  it "checks that payload is sent" do
182
- old_uap = TCellAgent.configuration.allow_unencrypted_appsensor_payloads
183
- TCellAgent.configuration.allow_unencrypted_appsensor_payloads = true
182
+ old_uap = TCellAgent.configuration.allow_unencrypted_appfirewall_payloads
183
+ TCellAgent.configuration.allow_unencrypted_appfirewall_payloads = true
184
184
  response = request.get("/foo?xyz=/etc/passwd", 'REMOTE_ADDR' => '1.3.3.4,3.4.5.6')
185
185
  expected_as = {
186
186
  "event_type"=>"as",
@@ -192,7 +192,7 @@ module TCellAgent
192
192
  "loc"=>"http://example.org/foo?xyz=",
193
193
  "tid"=>"a-b-c-d-e-f",
194
194
  "payload"=>"/etc/passwd"}
195
- TCellAgent.configuration.allow_unencrypted_appsensor_payloads = old_uap
195
+ TCellAgent.configuration.allow_unencrypted_appfirewall_payloads = old_uap
196
196
  expect(TCellAgent.event_queue).to include(expected_as)
197
197
  end
198
198
  end #/conext
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ module TCellAgent
4
+ module Utils
5
+ describe ".blank?" do
6
+ context "with nil" do
7
+ it "should return true" do
8
+ expect(Strings.blank?(nil)).to be(true)
9
+ end
10
+ end
11
+
12
+ context "with empty string" do
13
+ it "should return true" do
14
+ expect(Strings.blank?("")).to be(true)
15
+ end
16
+ end
17
+
18
+ context "with white space string" do
19
+ it "should return true" do
20
+ expect(Strings.blank?("\t \r\n \s\s")).to be(true)
21
+ end
22
+ end
23
+
24
+ context "with a string containing non whitespace chars" do
25
+ it "should return false" do
26
+ expect(Strings.blank?("A\t \r\n \s\s")).to be(false)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tcell_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.13
4
+ version: 0.2.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Garrett
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-04 00:00:00.000000000 Z
11
+ date: 2016-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -190,8 +190,10 @@ files:
190
190
  - lib/tcell_agent/start_background_thread.rb
191
191
  - lib/tcell_agent/system_info.rb
192
192
  - lib/tcell_agent/userinfo.rb
193
+ - lib/tcell_agent/utils/io.rb
193
194
  - lib/tcell_agent/utils/params.rb
194
195
  - lib/tcell_agent/utils/queue_with_timeout.rb
196
+ - lib/tcell_agent/utils/strings.rb
195
197
  - lib/tcell_agent/version.rb
196
198
  - lib/tcell_agent.rb
197
199
  - spec/apps/rails-3.2/app/assets/images/rails.png
@@ -279,6 +281,7 @@ files:
279
281
  - spec/lib/tcell_agent/sensor_events/util/sanitizer_utilities_spec.rb
280
282
  - spec/lib/tcell_agent/utils/bounded_queue_spec.rb
281
283
  - spec/lib/tcell_agent/utils/params_spec.rb
284
+ - spec/lib/tcell_agent/utils/strings_spec.rb
282
285
  - spec/lib/tcell_agent_spec.rb
283
286
  - spec/spec_helper.rb
284
287
  - spec/support/middleware_helper.rb
@@ -401,6 +404,7 @@ test_files:
401
404
  - spec/lib/tcell_agent/sensor_events/util/sanitizer_utilities_spec.rb
402
405
  - spec/lib/tcell_agent/utils/bounded_queue_spec.rb
403
406
  - spec/lib/tcell_agent/utils/params_spec.rb
407
+ - spec/lib/tcell_agent/utils/strings_spec.rb
404
408
  - spec/lib/tcell_agent_spec.rb
405
409
  - spec/spec_helper.rb
406
410
  - spec/support/middleware_helper.rb