tcell_agent 0.2.29.rc2 → 0.2.29

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/bin/tcell_agent +16 -4
  3. data/lib/tcell_agent/agent/event_processor.rb +2 -8
  4. data/lib/tcell_agent/agent/fork_pipe_manager.rb +0 -2
  5. data/lib/tcell_agent/agent/policy_manager.rb +12 -18
  6. data/lib/tcell_agent/api.rb +50 -27
  7. data/lib/tcell_agent/appsensor/injections_reporter.rb +7 -5
  8. data/lib/tcell_agent/appsensor/sensor.rb +8 -4
  9. data/lib/tcell_agent/config/unknown_options.rb +116 -0
  10. data/lib/tcell_agent/configuration.rb +17 -20
  11. data/lib/tcell_agent/instrumentation.rb +0 -1
  12. data/lib/tcell_agent/logger.rb +17 -21
  13. data/lib/tcell_agent/patches/block_rule.rb +43 -8
  14. data/lib/tcell_agent/patches/meta_data.rb +2 -1
  15. data/lib/tcell_agent/patches/sensors_matcher.rb +2 -1
  16. data/lib/tcell_agent/policies/appsensor/database_sensor.rb +5 -2
  17. data/lib/tcell_agent/policies/appsensor/misc_sensor.rb +10 -3
  18. data/lib/tcell_agent/policies/appsensor/payloads_policy.rb +8 -3
  19. data/lib/tcell_agent/policies/appsensor/request_size_sensor.rb +1 -1
  20. data/lib/tcell_agent/policies/appsensor/response_codes_sensor.rb +7 -2
  21. data/lib/tcell_agent/policies/appsensor/size_sensor.rb +7 -3
  22. data/lib/tcell_agent/policies/appsensor/sqli_sensor.rb +3 -5
  23. data/lib/tcell_agent/policies/appsensor/user_agent_sensor.rb +6 -2
  24. data/lib/tcell_agent/policies/appsensor/xss_sensor.rb +3 -5
  25. data/lib/tcell_agent/policies/appsensor_policy.rb +11 -6
  26. data/lib/tcell_agent/policies/content_security_policy.rb +19 -14
  27. data/lib/tcell_agent/rails/dlp.rb +1 -1
  28. data/lib/tcell_agent/rails/middleware/headers_middleware.rb +10 -7
  29. data/lib/tcell_agent/rails/on_start.rb +0 -1
  30. data/lib/tcell_agent/sensor_events/appsensor_event.rb +7 -5
  31. data/lib/tcell_agent/sinatra.rb +3 -6
  32. data/lib/tcell_agent/start_background_thread.rb +0 -7
  33. data/lib/tcell_agent/utils/strings.rb +18 -0
  34. data/lib/tcell_agent/version.rb +1 -1
  35. data/spec/lib/tcell_agent/api/api_spec.rb +1 -1
  36. data/spec/lib/tcell_agent/appsensor/injections_reporter_spec.rb +1 -1
  37. data/spec/lib/tcell_agent/config/unknown_options_spec.rb +188 -0
  38. data/spec/lib/tcell_agent/configuration_spec.rb +56 -0
  39. data/spec/lib/tcell_agent/patches/block_rule_spec.rb +110 -16
  40. data/spec/lib/tcell_agent/policies/appsensor/payloads_policy_log_spec.rb +226 -293
  41. data/spec/lib/tcell_agent/policies/appsensor/response_codes_sensor_spec.rb +32 -4
  42. data/spec/lib/tcell_agent/policies/appsensor_policy_spec.rb +11 -0
  43. data/spec/lib/tcell_agent/utils/strings_spec.rb +50 -0
  44. data/spec/support/static_agent_overrides.rb +1 -1
  45. data/tcell_agent.gemspec +1 -3
  46. metadata +9 -37
  47. data/lib/tcell_agent/rails/tracing.rb +0 -22
  48. data/spec/integration/puma.rb +0 -195
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 72bdaa2198617a42be424cb88f1944cfa867ee7b
4
- data.tar.gz: 876dccbc46bcfcb9d927369744db83741bb03e3e
3
+ metadata.gz: ef449abceb02a45432746a68e50989438292c9c0
4
+ data.tar.gz: 1b8ce68123c46d3a12cbc2262e4125948973ecf5
5
5
  SHA512:
6
- metadata.gz: 1940cc2ca2ca9d3d2cafec1b3addc5f1d2b04140391d53923ae7f1230594baf5291adf9ccc596306f3a68397a0a783d174a4e125b2a9e185d65a0555499a4a83
7
- data.tar.gz: 9163fd10bae3bc0c05de4ff1af96040dea0068851598612caad8ee8d55ca5720d79d7cad9e570dc8329c4a5c844155655a80c5d2402ec6c69aa3b12c691ea3f6
6
+ metadata.gz: ac50286364897b7743cfd3dcfa9ed539f425142311b2eb675167a3362a84ba23c581ddb72342923723c35eeb3fbef7f4d0bc3b10ef4ff4ad0490b44fcd68a2f9
7
+ data.tar.gz: a0b0b0e374279de26805a4710f13217c7682f58901621dd8b430f64d6a322aef4b6aa15f4441c2c26043249dca75b1b5cb4f41525faeac84c22264438c719475
data/bin/tcell_agent CHANGED
@@ -54,7 +54,7 @@ global = OptionParser.new do |opts|
54
54
  opts.separator subtext
55
55
  end
56
56
 
57
- subcommands = {
57
+ subcommands = {
58
58
  'setup' => OptionParser.new do |opts|
59
59
  opts.banner = "Usage: setup"
60
60
  end,
@@ -150,7 +150,7 @@ elsif (command == 'loglevel')
150
150
  end
151
151
  loglevel = loglevel.upcase
152
152
  if ["ERROR","WARN","INFO","DEBUG"].include?(loglevel)
153
- logging_options["enabled"] = true
153
+ logging_options["enabled"] = true
154
154
  logging_options["level"] = loglevel
155
155
  else
156
156
  puts subcommands[command]
@@ -239,6 +239,18 @@ elsif (command == 'test')
239
239
  end
240
240
  puts "passed"
241
241
 
242
+ printf "%-50s", "Check for unknown settings... "
243
+ require "tcell_agent/config/unknown_options"
244
+ messages = TCellAgent::Config::Validate.get_unknown_options(config_hash)
245
+ if messages.size > 0
246
+ puts "failed"
247
+ messages.each do |message|
248
+ puts message
249
+ end
250
+ Kernel.exit(1)
251
+ end
252
+ puts "passed"
253
+
242
254
  printf "%-50s", "Requiring configuration library... "
243
255
  require 'tcell_agent/configuration'
244
256
  require 'tcell_agent/api'
@@ -246,11 +258,11 @@ elsif (command == 'test')
246
258
 
247
259
  printf "%-50s", "Make test API call for policies... "
248
260
  api = TCellAgent::TCellApi.new
249
- api.pollAPI
261
+ api.poll_api()
250
262
  puts "passed"
251
263
 
252
264
  printf "%-50s", "Sending a Test event... "
253
- send_succeeded = api.sendEventSet([])
265
+ send_succeeded = api.send_event_set([])
254
266
  if !send_succeeded
255
267
  puts "failed"
256
268
  Kernel.exit(1)
@@ -80,7 +80,7 @@ module TCellAgent
80
80
  end
81
81
  events_to_send.push( sessions_to_send )
82
82
  end
83
- success = tapi.sendEventSet(events_to_send)
83
+ success = tapi.send_event_set(events_to_send)
84
84
  if ( success == false )
85
85
  ensured_events = events_to_send.find_all{|item| item.ensure == true }
86
86
  @event_dispatch_monitor.synchronize {
@@ -129,16 +129,13 @@ module TCellAgent
129
129
  self.send_dispatch_events(tapi)
130
130
  end
131
131
  end
132
- rescue ThreadError => thread_error
133
- TCellAgent.logger.error("Thread error while processing events: #{thread_error.message}")
134
- TCellAgent.logger.debug(thread_error.backtrace)
132
+ rescue ThreadError
135
133
  last_run_time = Time.now
136
134
  @event_dispatch_monitor.synchronize {
137
135
  @dispatchEvents = []
138
136
  }
139
137
  end
140
138
  rescue TCellAgent::ConfigurationException
141
- TCellAgent.logger.error("Exiting event processor. App is not configured properly.")
142
139
  Thread.exit
143
140
  rescue Exception => e
144
141
  last_run_time = Time.now
@@ -199,7 +196,6 @@ module TCellAgent
199
196
  def queue_forked_event(event)
200
197
  begin
201
198
  self.ensure_fork_event_thread_running
202
- TCellAgent.logger.debug("fork_event_queue length: #{@fork_event_queue.length}")
203
199
  if (@fork_event_queue.length() > 100)
204
200
  TCellAgent.logger.debug("Dropping (forked) event because queue full")
205
201
  return
@@ -256,7 +252,6 @@ module TCellAgent
256
252
  return if TCellAgent.configuration.should_consume_event? == false
257
253
  begin
258
254
  self.ensure_metrics_event_thread_running
259
- TCellAgent.logger.debug("metrics_event_queue length: #{@metrics_event_queue.length}")
260
255
  if (@metrics_event_queue.length() > 100)
261
256
  TCellAgent.logger.debug("Dropping (forked) metric because queue full")
262
257
  return
@@ -277,7 +272,6 @@ module TCellAgent
277
272
 
278
273
  begin
279
274
  self.ensure_event_processor_running
280
- TCellAgent.logger.debug("eventQueue length: #{@eventQueue.size}")
281
275
  @event_queue_monitor.synchronize {
282
276
  @eventQueue.push(event, 10)
283
277
  }
@@ -108,11 +108,9 @@ module TCellAgent
108
108
  @@event_pipe_manager.is_parent?
109
109
  end
110
110
  def self.send_to_metrics_pipe(hash_value)
111
- TCellAgent.logger.debug("Send metric to parent")
112
111
  @@metrics_pipe_manager.send_to_parent(hash_value)
113
112
  end
114
113
  def self.send_to_event_pipe(event)
115
- TCellAgent.logger.debug("Send event to parent")
116
114
  @@event_pipe_manager.send_to_parent(event)
117
115
  end
118
116
 
@@ -73,14 +73,16 @@ module TCellAgent
73
73
  loop do
74
74
  failure_sleep_time, last_poll_time = policy_polling_iteration(failure_sleep_time, last_poll_time)
75
75
 
76
- if (Time.now - last_run) < 5
77
- random = Random.new
78
- sleeptime = sleep(random.rand(5..20))
79
- TCellAgent.logger.debug("Rate limiting: sleeping #{sleeptime} seconds")
80
- sleep(sleeptime)
81
- end
76
+ unless TCellAgent.configuration.demomode
77
+ if (Time.now - last_run) < 2
78
+ random = Random.new
79
+ sleeptime = sleep(random.rand(5..20))
80
+ TCellAgent.logger.debug("Rate limiting: sleeping #{sleeptime} seconds")
81
+ sleep(sleeptime)
82
+ end
82
83
 
83
- last_run = Time.now
84
+ last_run = Time.now
85
+ end
84
86
  end
85
87
  end
86
88
  end
@@ -88,7 +90,7 @@ module TCellAgent
88
90
 
89
91
  def policy_polling_iteration(failure_sleep_time, last_poll_time)
90
92
  begin
91
- policy_jsons = @@policy_tapi.pollAPI(last_poll_time)
93
+ policy_jsons = @@policy_tapi.poll_api(last_poll_time)
92
94
 
93
95
  if policy_jsons == nil
94
96
  TCellAgent.logger.error("Policy was nil. Sleeping for #{failure_sleep_time}")
@@ -115,16 +117,8 @@ module TCellAgent
115
117
 
116
118
  processPolicyJson(policy_jsons)
117
119
 
118
- rescue RestClient::Exception => rce
119
- TCellAgent.logger.error("Received error response while contacting api [#{rce.http_code}]: #{rce.message}")
120
- TCellAgent.logger.debug(rce.backtrace)
121
- TCellAgent.logger.debug("Sleeping #{failure_sleep_time} seconds because the request failed...")
122
- sleep(failure_sleep_time)
123
-
124
- if failure_sleep_time < 480
125
- failure_sleep_time *= 2
126
- end
127
-
120
+ rescue TCellAgent::ConfigurationException
121
+ Thread.exit
128
122
  rescue Exception => e
129
123
  TCellAgent.logger.error("exception while handling connection: #{e.message}")
130
124
  TCellAgent.logger.debug(e.backtrace)
@@ -1,72 +1,95 @@
1
1
  # encoding: utf-8
2
2
  # See the file "LICENSE" for the full license governing this code.
3
3
  require 'json'
4
- require 'rest-client'
5
4
  require 'tcell_agent/logger'
6
5
  require 'tcell_agent/configuration'
7
6
  require 'tcell_agent/version'
8
7
  require 'date'
9
8
 
9
+ require 'net/http'
10
+
10
11
  module TCellAgent
11
12
  class TCellApi
12
13
 
13
14
  def initialize
14
15
  end
15
16
 
16
- def pollAPI(last_timestamp=nil)
17
+ def poll_api(last_timestamp=nil)
18
+ if !TCellAgent.configuration || !TCellAgent.configuration.tcell_api_url || !TCellAgent.configuration.app_id
19
+ raise TCellAgent::ConfigurationException.new("Config Information Not Found, can't poll for policy updates")
20
+ end
21
+
17
22
  full_url = TCellAgent.configuration.tcell_api_url + "/app/" + TCellAgent.configuration.app_id + "/update"
18
23
  if (last_timestamp && last_timestamp != "")
19
24
  full_url = full_url + "?last_timestamp=" + last_timestamp.to_s
20
25
  end
21
26
 
22
27
  TCellAgent.logger.debug "tCell.io API Request: " + full_url
23
- request_headers = {
24
- :Authorization => 'Bearer ' + TCellAgent.configuration.api_key
25
- }
26
28
 
29
+ uri = URI(full_url)
30
+ req = Net::HTTP::Get.new(uri.request_uri)
31
+ req['Authorization'] = 'Bearer ' + TCellAgent.configuration.api_key
27
32
  begin
28
- request_headers[:TCellAgent] = "RubyAgent " + TCellAgent::VERSION
33
+ req['TCellAgent'] = "RubyAgent " + TCellAgent::VERSION
29
34
  rescue Exception => e
30
35
  TCellAgent.logger.debug("tCell.io Could not add agent string: " + e.message)
31
36
  end
32
37
 
33
- response = RestClient.get full_url,request_headers
34
- TCellAgent.logger.debug "tCell.io API Response: " + response
35
- response_json = JSON.parse(response)
36
- if (response_json && response_json.has_key?("result"))
37
- return response_json["result"]
38
+ res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') { |http| http.request(req) }
39
+
40
+ if res.is_a?(Net::HTTPSuccess)
41
+ TCellAgent.logger.debug("tCell.io API Response: #{res.body}")
42
+ response_json = JSON.parse(res.body)
43
+ if (response_json && response_json.has_key?("result"))
44
+ return response_json["result"]
45
+ end
46
+
47
+ return nil
48
+
49
+ else
50
+ TCellAgent.logger.error("Received error response while contacting api: #{res.inspect}")
51
+ return nil
38
52
  end
39
- # else result was null and no new information exists...
40
- return nil
41
53
  end
42
54
 
43
- def sendEventSet(events)
55
+ def send_event_set(events)
44
56
  if !TCellAgent.configuration || !TCellAgent.configuration.tcell_input_url || !TCellAgent.configuration.app_id
45
57
  raise TCellAgent::ConfigurationException.new("Config Information Not Found, can't send events")
46
58
  end
59
+
47
60
  if (events == nil)
48
61
  return false
49
62
  end
50
- eventset = { "uuid"=>TCellAgent.configuration.uuid,
51
- "hostname"=>TCellAgent.configuration.host_identifier,
52
- "events"=>events }
63
+
64
+ eventset = {"uuid" => TCellAgent.configuration.uuid,
65
+ "hostname" => TCellAgent.configuration.host_identifier,
66
+ "events" => events }
53
67
  TCellAgent.logger.debug("Sending #{JSON.dump(eventset)}")
54
- full_url = TCellAgent.configuration.tcell_input_url + "/app/" + TCellAgent.configuration.app_id + "/server_agent"
68
+ full_url = TCellAgent.configuration.tcell_input_url +
69
+ "/app/" +
70
+ TCellAgent.configuration.app_id +
71
+ "/server_agent"
55
72
 
56
73
  TCellAgent.logger.debug("tCell.io SendEvents API Request: " + full_url)
57
- request_headers = {
58
- :Authorization => 'Bearer ' + TCellAgent.configuration.api_key,
59
- :content_type => "application/json",
60
- :accept => "application/json",
61
- }
74
+
75
+ uri = URI(full_url)
76
+ req = Net::HTTP::Post.new(uri.request_uri, 'Content-Type' => 'application/json')
77
+ req.body = JSON.dump(eventset)
78
+ req['Authorization'] = 'Bearer ' + TCellAgent.configuration.api_key
79
+ req['Content-Type'] = 'application/json'
80
+ req['Accept'] = 'application/json'
81
+
62
82
  begin
63
- request_headers[:TCellAgent] = "RubyAgent " + TCellAgent::VERSION
83
+ req['TCellAgent'] = "RubyAgent " + TCellAgent::VERSION
64
84
  rescue Exception => e
65
85
  TCellAgent.logger.debug("tCell.io Could not add agent string: " + e.message)
66
86
  end
67
- response = RestClient.post full_url, JSON.dump(eventset), request_headers
68
- TCellAgent.logger.debug("tCell.io SendEvents API Response: " + response.code.to_s)
69
- return response.code == 200
87
+
88
+ res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') { |http| http.request(req) }
89
+
90
+ TCellAgent.logger.debug("tCell.io SendEvents API Response: #{res.code}")
91
+
92
+ return res.is_a?(Net::HTTPSuccess)
70
93
  end
71
94
 
72
95
  def valid_header?(str)
@@ -20,11 +20,12 @@ module TCellAgent
20
20
  COOKIE_PARAM => 'cookie'
21
21
  }
22
22
 
23
- attr_accessor :injections_matcher, :payloads_policy
23
+ attr_accessor :injections_matcher, :payloads_policy, :collect_full_uri
24
24
 
25
- def initialize(injections_matcher, payloads_policy)
25
+ def initialize(injections_matcher, payloads_policy, collect_full_uri)
26
26
  @injections_matcher = injections_matcher
27
27
  @payloads_policy = payloads_policy
28
+ @collect_full_uri = collect_full_uri
28
29
  end
29
30
 
30
31
  def check(appsensor_meta)
@@ -51,14 +52,15 @@ module TCellAgent
51
52
  vuln_param,
52
53
  meta,
53
54
  payload,
54
- pattern)
55
+ pattern,
56
+ @collect_full_uri)
55
57
  end
56
58
  end
57
59
 
58
- def self.from_json(version, data_json, payloads_policy)
60
+ def self.from_json(version, data_json, payloads_policy, collect_full_uri=false)
59
61
  injections_matcher = InjectionsMatcher.from_json(version, data_json)
60
62
 
61
- InjectionsReporter.new(injections_matcher, payloads_policy)
63
+ InjectionsReporter.new(injections_matcher, payloads_policy, collect_full_uri)
62
64
  end
63
65
 
64
66
  end
@@ -5,7 +5,8 @@ module TCellAgent
5
5
 
6
6
  class Sensor
7
7
  class << self
8
- def send_event(appsensor_meta, detection_point, parameter, meta, payload, pattern)
8
+ def send_event(appsensor_meta, detection_point, parameter, meta,
9
+ payload, pattern, collect_full_uri)
9
10
  event = TCellAgent::SensorEvents::TCellAppSensorEvent.new(
10
11
  appsensor_meta.location,
11
12
  detection_point,
@@ -17,13 +18,15 @@ module TCellAgent
17
18
  appsensor_meta.session_id,
18
19
  appsensor_meta.user_id,
19
20
  payload,
20
- pattern
21
+ pattern,
22
+ collect_full_uri
21
23
  )
22
24
 
23
25
  TCellAgent.send_event(event)
24
26
  end
25
27
 
26
- def send_event_from_tcell_data(tcell_data, detection_point, parameter, meta)
28
+ def send_event_from_tcell_data(tcell_data, detection_point, parameter,
29
+ meta, collect_full_uri)
27
30
  payload = pattern = nil
28
31
  event = TCellAgent::SensorEvents::TCellAppSensorEvent.new(
29
32
  tcell_data.uri,
@@ -36,7 +39,8 @@ module TCellAgent
36
39
  tcell_data.session_id,
37
40
  tcell_data.user_id,
38
41
  payload,
39
- pattern
42
+ pattern,
43
+ collect_full_uri
40
44
  )
41
45
 
42
46
  TCellAgent.send_event(event)
@@ -0,0 +1,116 @@
1
+ require 'set'
2
+
3
+ module TCellAgent
4
+ module Config
5
+ module Validate
6
+
7
+ def self.get_unknown_options(config_json)
8
+ messages = []
9
+
10
+ known_tcell_env_vars = Set.new([
11
+ "TCELL_AGENT_SERVER", # this is only meant for specs
12
+ "TCELL_AGENT_APP_ID",
13
+ "TCELL_AGENT_API_KEY",
14
+ "TCELL_HMAC_KEY",
15
+ "TCELL_AGENT_HOST_IDENTIFIER",
16
+ "TCELL_API_URL",
17
+ "TCELL_INPUT_URL",
18
+ "TCELL_DEMOMODE",
19
+ "TCELL_AGENT_HOME",
20
+ "TCELL_AGENT_LOG_DIR",
21
+ "TCELL_AGENT_CONFIG",
22
+ "TCELL_AGENT_ALLOW_UNENCRYPTED_APPSENSOR_PAYLOADS",
23
+ "TCELL_AGENT_ALLOW_UNENCRYPTED_APPFIREWALL_PAYLOADS",
24
+ "TCELL_AGENT_HOME_OWNER"])
25
+
26
+ ENV.keys.each do |environment_key|
27
+ if environment_key =~ /^TCELL_/ && !known_tcell_env_vars.include?(environment_key)
28
+ messages << "Unrecognized environment parameter (TCELL_*) found: #{environment_key}"
29
+ end
30
+ end
31
+
32
+ begin
33
+ key_differences = []
34
+
35
+ if config_json
36
+ first_level_keys = ["version", "applications"]
37
+
38
+ key_differences = config_json.keys - first_level_keys
39
+
40
+ applications = config_json.fetch("applications", nil)
41
+ if applications
42
+
43
+ if applications.size > 1
44
+ messages << "Multiple applications detected in config file"
45
+
46
+ elsif applications.size == 1
47
+ application = applications[0]
48
+
49
+ second_level_keys = [
50
+ "name",
51
+ "app_id",
52
+ "api_key",
53
+ "fetch_policies_from_tcell",
54
+ "preload_policy_filename",
55
+ "log_dir",
56
+ "tcell_api_url",
57
+ "tcell_input_url",
58
+ "host_identifier",
59
+ "hipaaSafeMode",
60
+ "hmac_key",
61
+ "js_agent_api_base_url",
62
+ "js_agent_url",
63
+ "max_csp_header_bytes",
64
+ "event_batch_size_limit",
65
+ "allow_unencrypted_appsensor_payloads",
66
+ "allow_unencrypted_appfirewall_payloads",
67
+ "reverse_proxy",
68
+ "reverse_proxy_ip_address_header",
69
+ "demomode",
70
+ "logging_options",
71
+ "data_exposure",
72
+ "disable_all",
73
+ "enabled",
74
+ "enable_event_manager",
75
+ "enable_event_consumer",
76
+ "enable_policy_polling",
77
+ "enable_instrumentation",
78
+ "enable_intercept_requests",
79
+ "instrument_for_events",
80
+ "agent_home_owner",
81
+ "enabled_instrumentations"]
82
+
83
+ key_differences = key_differences + (application.keys - second_level_keys)
84
+
85
+ if application.fetch("logging_options", nil)
86
+ logging_options = application["logging_options"]
87
+ key_differences = key_differences + (logging_options.keys - ["enabled", "level", "filename"])
88
+ end
89
+
90
+ if application.fetch("data_exposure", nil)
91
+ data_exposure = application["data_exposure"]
92
+ key_differences = key_differences + (data_exposure.keys - ["max_data_ex_db_records_per_request"])
93
+ end
94
+
95
+ if application.fetch("enabled_instrumentations", nil)
96
+ enabled_instrumentations = application["enabled_instrumentations"]
97
+ key_differences = key_differences + (enabled_instrumentations.keys - ["doorkeeper", "devise", "authlogic"])
98
+ end
99
+ end
100
+ end
101
+
102
+ key_differences.each do |key|
103
+ messages << "Unrecognized config setting key: #{key}"
104
+ end
105
+
106
+ end
107
+ rescue Exception => exception
108
+ messages << "Something went wrong verifying config file: #{exception}"
109
+ end
110
+
111
+ messages
112
+ end
113
+
114
+ end
115
+ end
116
+ end