brakeman-min 3.7.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +15 -1
  3. data/FEATURES +1 -1
  4. data/lib/brakeman.rb +55 -17
  5. data/lib/brakeman/call_index.rb +2 -2
  6. data/lib/brakeman/checks/base_check.rb +4 -2
  7. data/lib/brakeman/checks/check_basic_auth.rb +3 -3
  8. data/lib/brakeman/checks/check_basic_auth_timing_attack.rb +1 -1
  9. data/lib/brakeman/checks/check_content_tag.rb +12 -12
  10. data/lib/brakeman/checks/check_create_with.rb +5 -5
  11. data/lib/brakeman/checks/check_cross_site_scripting.rb +8 -8
  12. data/lib/brakeman/checks/check_default_routes.rb +4 -4
  13. data/lib/brakeman/checks/check_deserialize.rb +2 -2
  14. data/lib/brakeman/checks/check_detailed_exceptions.rb +4 -4
  15. data/lib/brakeman/checks/check_digest_dos.rb +2 -2
  16. data/lib/brakeman/checks/check_dynamic_finders.rb +1 -1
  17. data/lib/brakeman/checks/check_escape_function.rb +2 -2
  18. data/lib/brakeman/checks/check_evaluation.rb +1 -1
  19. data/lib/brakeman/checks/check_execute.rb +5 -5
  20. data/lib/brakeman/checks/check_file_access.rb +4 -4
  21. data/lib/brakeman/checks/check_file_disclosure.rb +2 -2
  22. data/lib/brakeman/checks/check_filter_skipping.rb +2 -2
  23. data/lib/brakeman/checks/check_forgery_setting.rb +2 -2
  24. data/lib/brakeman/checks/check_header_dos.rb +1 -1
  25. data/lib/brakeman/checks/check_i18n_xss.rb +2 -2
  26. data/lib/brakeman/checks/check_jruby_xml.rb +2 -4
  27. data/lib/brakeman/checks/check_json_encoding.rb +4 -4
  28. data/lib/brakeman/checks/check_json_parsing.rb +6 -6
  29. data/lib/brakeman/checks/check_link_to.rb +5 -5
  30. data/lib/brakeman/checks/check_link_to_href.rb +37 -31
  31. data/lib/brakeman/checks/check_mail_to.rb +2 -2
  32. data/lib/brakeman/checks/check_mass_assignment.rb +6 -6
  33. data/lib/brakeman/checks/check_mime_type_dos.rb +1 -1
  34. data/lib/brakeman/checks/check_model_attr_accessible.rb +5 -5
  35. data/lib/brakeman/checks/check_model_attributes.rb +4 -4
  36. data/lib/brakeman/checks/check_model_serialize.rb +3 -3
  37. data/lib/brakeman/checks/check_nested_attributes.rb +2 -2
  38. data/lib/brakeman/checks/check_nested_attributes_bypass.rb +1 -1
  39. data/lib/brakeman/checks/check_number_to_currency.rb +5 -5
  40. data/lib/brakeman/checks/check_quote_table_name.rb +2 -2
  41. data/lib/brakeman/checks/check_redirect.rb +2 -2
  42. data/lib/brakeman/checks/check_regex_dos.rb +3 -3
  43. data/lib/brakeman/checks/check_render.rb +4 -4
  44. data/lib/brakeman/checks/check_render_dos.rb +1 -1
  45. data/lib/brakeman/checks/check_render_inline.rb +5 -5
  46. data/lib/brakeman/checks/check_response_splitting.rb +1 -1
  47. data/lib/brakeman/checks/check_route_dos.rb +1 -1
  48. data/lib/brakeman/checks/check_safe_buffer_manipulation.rb +2 -2
  49. data/lib/brakeman/checks/check_sanitize_methods.rb +7 -7
  50. data/lib/brakeman/checks/check_secrets.rb +1 -1
  51. data/lib/brakeman/checks/check_select_tag.rb +2 -2
  52. data/lib/brakeman/checks/check_select_vulnerability.rb +3 -3
  53. data/lib/brakeman/checks/check_send.rb +1 -1
  54. data/lib/brakeman/checks/check_session_manipulation.rb +2 -2
  55. data/lib/brakeman/checks/check_session_settings.rb +3 -3
  56. data/lib/brakeman/checks/check_simple_format.rb +4 -4
  57. data/lib/brakeman/checks/check_single_quotes.rb +3 -3
  58. data/lib/brakeman/checks/check_skip_before_filter.rb +3 -3
  59. data/lib/brakeman/checks/check_sql.rb +9 -9
  60. data/lib/brakeman/checks/check_sql_cves.rb +2 -2
  61. data/lib/brakeman/checks/check_ssl_verify.rb +1 -1
  62. data/lib/brakeman/checks/check_strip_tags.rb +7 -7
  63. data/lib/brakeman/checks/check_symbol_dos.rb +2 -2
  64. data/lib/brakeman/checks/check_symbol_dos_cve.rb +1 -1
  65. data/lib/brakeman/checks/check_translate_bug.rb +3 -3
  66. data/lib/brakeman/checks/check_unsafe_reflection.rb +2 -2
  67. data/lib/brakeman/checks/check_unscoped_find.rb +1 -1
  68. data/lib/brakeman/checks/check_validation_regex.rb +1 -1
  69. data/lib/brakeman/checks/check_weak_hash.rb +6 -6
  70. data/lib/brakeman/checks/check_without_protection.rb +2 -2
  71. data/lib/brakeman/checks/check_xml_dos.rb +1 -1
  72. data/lib/brakeman/checks/check_yaml_parsing.rb +2 -2
  73. data/lib/brakeman/commandline.rb +2 -2
  74. data/lib/brakeman/options.rb +9 -5
  75. data/lib/brakeman/processors/alias_processor.rb +3 -1
  76. data/lib/brakeman/processors/lib/rails2_route_processor.rb +8 -8
  77. data/lib/brakeman/processors/lib/render_helper.rb +3 -3
  78. data/lib/brakeman/report.rb +9 -6
  79. data/lib/brakeman/report/report_base.rb +2 -1
  80. data/lib/brakeman/report/report_text.rb +4 -6
  81. data/lib/brakeman/rescanner.rb +8 -8
  82. data/lib/brakeman/tracker.rb +3 -3
  83. data/lib/brakeman/tracker/collection.rb +1 -1
  84. data/lib/brakeman/util.rb +5 -1
  85. data/lib/brakeman/version.rb +1 -1
  86. data/lib/brakeman/warning.rb +49 -21
  87. metadata +2 -2
@@ -18,10 +18,10 @@ class Brakeman::CheckSimpleFormat < Brakeman::CheckCrossSiteScripting
18
18
  def generic_warning
19
19
  message = "Rails #{rails_version} has a vulnerability in simple_format (CVE-2013-6416). Upgrade to Rails version 4.0.2"
20
20
 
21
- warn :warning_type => "Cross Site Scripting",
21
+ warn :warning_type => "Cross-Site Scripting",
22
22
  :warning_code => :CVE_2013_6416,
23
23
  :message => message,
24
- :confidence => CONFIDENCE[:med],
24
+ :confidence => :medium,
25
25
  :gem_info => gemfile_or_environment,
26
26
  :link_path => "https://groups.google.com/d/msg/ruby-security-ann/5ZI1-H5OoIM/ZNq4FoR2GnIJ"
27
27
  end
@@ -48,10 +48,10 @@ class Brakeman::CheckSimpleFormat < Brakeman::CheckCrossSiteScripting
48
48
  @found_any = true
49
49
 
50
50
  warn :result => result,
51
- :warning_type => "Cross Site Scripting",
51
+ :warning_type => "Cross-Site Scripting",
52
52
  :warning_code => :CVE_2013_6416_call,
53
53
  :message => "Values passed to simple_format are not safe in Rails #{rails_version}",
54
- :confidence => CONFIDENCE[:high],
54
+ :confidence => :high,
55
55
  :link_path => "https://groups.google.com/d/msg/ruby-security-ann/5ZI1-H5OoIM/ZNq4FoR2GnIJ",
56
56
  :user_input => match
57
57
  end
@@ -29,10 +29,10 @@ class Brakeman::CheckSingleQuotes < Brakeman::BaseCheck
29
29
  return
30
30
  end
31
31
 
32
- warn :warning_type => "Cross Site Scripting",
32
+ warn :warning_type => "Cross-Site Scripting",
33
33
  :warning_code => :CVE_2012_3464,
34
34
  :message => message,
35
- :confidence => CONFIDENCE[:med],
35
+ :confidence => :medium,
36
36
  :gem_info => gemfile_or_environment,
37
37
  :link_path => "https://groups.google.com/d/topic/rubyonrails-security/kKGNeMrnmiY/discussion"
38
38
  end
@@ -40,7 +40,7 @@ class Brakeman::CheckSingleQuotes < Brakeman::BaseCheck
40
40
  #Process initializers to see if they use workaround
41
41
  #by replacing Erb::Util.html_escape
42
42
  def uses_rack_escape?
43
- @tracker.initializers.each do |name, src|
43
+ @tracker.initializers.each do |_name, src|
44
44
  process src
45
45
  end
46
46
 
@@ -13,7 +13,7 @@ class Brakeman::CheckSkipBeforeFilter < Brakeman::BaseCheck
13
13
  @description = "Warn when skipping CSRF or authentication checks by default"
14
14
 
15
15
  def run_check
16
- tracker.controllers.each do |name, controller|
16
+ tracker.controllers.each do |_name, controller|
17
17
  controller.skip_filters.each do |filter|
18
18
  process_skip_filter filter, controller
19
19
  end
@@ -28,7 +28,7 @@ class Brakeman::CheckSkipBeforeFilter < Brakeman::BaseCheck
28
28
  :warning_code => :csrf_blacklist,
29
29
  :message => "Use whitelist (:only => [..]) when skipping CSRF check",
30
30
  :code => filter,
31
- :confidence => CONFIDENCE[:med],
31
+ :confidence => :medium,
32
32
  :file => controller.file
33
33
 
34
34
  when :login_required, :authenticate_user!, :require_user
@@ -37,7 +37,7 @@ class Brakeman::CheckSkipBeforeFilter < Brakeman::BaseCheck
37
37
  :warning_type => "Authentication",
38
38
  :message => "Use whitelist (:only => [..]) when skipping authentication",
39
39
  :code => filter,
40
- :confidence => CONFIDENCE[:med],
40
+ :confidence => :medium,
41
41
  :link => "authentication_whitelist",
42
42
  :file => controller.file
43
43
  end
@@ -207,19 +207,19 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
207
207
 
208
208
  input = include_user_input? dangerous_value
209
209
  if input
210
- confidence = CONFIDENCE[:high]
210
+ confidence = :high
211
211
  user_input = input
212
212
  else
213
- confidence = CONFIDENCE[:med]
213
+ confidence = :medium
214
214
  user_input = dangerous_value
215
215
  end
216
216
 
217
217
  if result[:call].target and result[:chain] and not @expected_targets.include? result[:chain].first
218
218
  confidence = case confidence
219
- when CONFIDENCE[:high]
220
- CONFIDENCE[:med]
221
- when CONFIDENCE[:med]
222
- CONFIDENCE[:low]
219
+ when :high
220
+ :medium
221
+ when :medium
222
+ :weak
223
223
  else
224
224
  confidence
225
225
  end
@@ -235,9 +235,9 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
235
235
 
236
236
  if check_for_limit_or_offset_vulnerability call.last_arg
237
237
  if include_user_input? call.last_arg
238
- confidence = CONFIDENCE[:high]
238
+ confidence = :high
239
239
  else
240
- confidence = CONFIDENCE[:low]
240
+ confidence = :weak
241
241
  end
242
242
 
243
243
  warn :result => result,
@@ -364,7 +364,7 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
364
364
  #(Seems unlikely, but if a user can control the column names queried, that
365
365
  #could be bad)
366
366
  def check_hash_keys exp
367
- hash_iterate(exp) do |key, value|
367
+ hash_iterate(exp) do |key, _value|
368
368
  unless symbol?(key)
369
369
  unsafe_key = unsafe_sql? key
370
370
  return unsafe_key if unsafe_key
@@ -79,7 +79,7 @@ class Brakeman::CheckSQLCVEs < Brakeman::BaseCheck
79
79
  warn :warning_type => 'SQL Injection',
80
80
  :warning_code => code,
81
81
  :message => "Rails #{rails_version} contains a SQL injection vulnerability (#{cve}). Upgrade to #{upgrade_version}",
82
- :confidence => CONFIDENCE[:high],
82
+ :confidence => :high,
83
83
  :gem_info => gemfile_or_environment,
84
84
  :link_path => link
85
85
  end
@@ -99,7 +99,7 @@ class Brakeman::CheckSQLCVEs < Brakeman::BaseCheck
99
99
  warn :warning_type => 'SQL Injection',
100
100
  :warning_code => :CVE_2014_0080,
101
101
  :message => "Rails #{rails_version} contains a SQL injection vulnerability (CVE-2014-0080) with PostgreSQL. Upgrade to 4.0.3",
102
- :confidence => CONFIDENCE[:high],
102
+ :confidence => :high,
103
103
  :gem_info => gemfile_or_environment(:pg),
104
104
  :link_path => "https://groups.google.com/d/msg/rubyonrails-security/Wu96YkTUR6s/pPLBMZrlwvYJ"
105
105
  end
@@ -43,6 +43,6 @@ class Brakeman::CheckSSLVerify < Brakeman::BaseCheck
43
43
  :warning_type => "SSL Verification Bypass",
44
44
  :warning_code => :ssl_verification_bypass,
45
45
  :message => "SSL certificate verification was bypassed",
46
- :confidence => CONFIDENCE[:high]
46
+ :confidence => :high
47
47
  end
48
48
  end
@@ -30,11 +30,11 @@ class Brakeman::CheckStripTags < Brakeman::BaseCheck
30
30
  message = "Versions before 2.3.13 have a vulnerability in strip_tags (CVE-2011-2931)"
31
31
  end
32
32
 
33
- warn :warning_type => "Cross Site Scripting",
33
+ warn :warning_type => "Cross-Site Scripting",
34
34
  :warning_code => :CVE_2011_2931,
35
35
  :message => message,
36
36
  :gem_info => gemfile_or_environment,
37
- :confidence => CONFIDENCE[:high],
37
+ :confidence => :high,
38
38
  :link_path => "https://groups.google.com/d/topic/rubyonrails-security/K5EwdJt06hI/discussion"
39
39
  end
40
40
  end
@@ -53,10 +53,10 @@ class Brakeman::CheckStripTags < Brakeman::BaseCheck
53
53
  return
54
54
  end
55
55
 
56
- warn :warning_type => "Cross Site Scripting",
56
+ warn :warning_type => "Cross-Site Scripting",
57
57
  :warning_code => :CVE_2012_3465,
58
58
  :message => message,
59
- :confidence => CONFIDENCE[:high],
59
+ :confidence => :high,
60
60
  :gem_info => gemfile_or_environment,
61
61
  :link_path => "https://groups.google.com/d/topic/rubyonrails-security/FgVEtBajcTY/discussion"
62
62
  end
@@ -64,14 +64,14 @@ class Brakeman::CheckStripTags < Brakeman::BaseCheck
64
64
  def cve_2015_7579
65
65
  if tracker.config.gem_version(:'rails-html-sanitizer') == '1.0.2'
66
66
  if uses_strip_tags?
67
- confidence = CONFIDENCE[:high]
67
+ confidence = :high
68
68
  else
69
- confidence = CONFIDENCE[:med]
69
+ confidence = :medium
70
70
  end
71
71
 
72
72
  message = "rails-html-sanitizer 1.0.2 is vulnerable (CVE-2015-7579). Upgrade to 1.0.3"
73
73
 
74
- warn :warning_type => "Cross Site Scripting",
74
+ warn :warning_type => "Cross-Site Scripting",
75
75
  :warning_code => :CVE_2015_7579,
76
76
  :message => message,
77
77
  :confidence => confidence,
@@ -28,9 +28,9 @@ class Brakeman::CheckSymbolDoS < Brakeman::BaseCheck
28
28
  end
29
29
 
30
30
  if input = args.map{ |arg| has_immediate_user_input?(arg) }.compact.first
31
- confidence = CONFIDENCE[:high]
31
+ confidence = :high
32
32
  elsif input = args.map{ |arg| include_user_input?(arg) }.compact.first
33
- confidence = CONFIDENCE[:med]
33
+ confidence = :medium
34
34
  end
35
35
 
36
36
  if confidence
@@ -21,7 +21,7 @@ class Brakeman::CheckSymbolDoSCVE < Brakeman::BaseCheck
21
21
  warn :warning_type => "Denial of Service",
22
22
  :warning_code => :CVE_2013_1854,
23
23
  :message => "Rails #{rails_version} has a denial of service vulnerability in ActiveRecord: upgrade to #{fix_version} or patch",
24
- :confidence => CONFIDENCE[:med],
24
+ :confidence => :medium,
25
25
  :gem_info => gemfile_or_environment,
26
26
  :link => "https://groups.google.com/d/msg/rubyonrails-security/jgJ4cjjS8FE/BGbHRxnDRTIJ"
27
27
  end
@@ -13,9 +13,9 @@ class Brakeman::CheckTranslateBug < Brakeman::BaseCheck
13
13
  version_between?('3.1.0', '3.1.1')
14
14
 
15
15
  confidence = if uses_translate?
16
- CONFIDENCE[:high]
16
+ :high
17
17
  else
18
- CONFIDENCE[:med]
18
+ :medium
19
19
  end
20
20
 
21
21
  description = "have a vulnerability in the translate helper with keys ending in _html"
@@ -28,7 +28,7 @@ class Brakeman::CheckTranslateBug < Brakeman::BaseCheck
28
28
  "Rails 2.3.x using the rails_xss plugin #{description}."
29
29
  end
30
30
 
31
- warn :warning_type => "Cross Site Scripting",
31
+ warn :warning_type => "Cross-Site Scripting",
32
32
  :warning_code => :translate_vuln,
33
33
  :message => message,
34
34
  :confidence => confidence,
@@ -31,9 +31,9 @@ class Brakeman::CheckUnsafeReflection < Brakeman::BaseCheck
31
31
  end
32
32
 
33
33
  if input = has_immediate_user_input?(arg)
34
- confidence = CONFIDENCE[:high]
34
+ confidence = :high
35
35
  elsif input = include_user_input?(arg)
36
- confidence = CONFIDENCE[:med]
36
+ confidence = :medium
37
37
  end
38
38
 
39
39
  if confidence
@@ -35,7 +35,7 @@ class Brakeman::CheckUnscopedFind < Brakeman::BaseCheck
35
35
  :warning_code => :unscoped_find,
36
36
  :message => "Unscoped call to #{result[:target]}##{result[:method]}",
37
37
  :code => result[:call],
38
- :confidence => CONFIDENCE[:low],
38
+ :confidence => :weak,
39
39
  :user_input => input
40
40
  end
41
41
  end
@@ -91,7 +91,7 @@ class Brakeman::CheckValidationRegex < Brakeman::BaseCheck
91
91
  :warning_code => :validation_regex,
92
92
  :message => "Insufficient validation for '#{get_name validator}' using #{regex.inspect}. Use \\A and \\z as anchors",
93
93
  :line => value.line,
94
- :confidence => CONFIDENCE[:high]
94
+ :confidence => :high
95
95
  end
96
96
  end
97
97
 
@@ -29,14 +29,14 @@ class Brakeman::CheckWeakHash < Brakeman::BaseCheck
29
29
 
30
30
  if DIGEST_CALLS.include? call.method
31
31
  if input = user_input_as_arg?(call)
32
- confidence = CONFIDENCE[:high]
32
+ confidence = :high
33
33
  elsif input = hashing_password?(call)
34
- confidence = CONFIDENCE[:high]
34
+ confidence = :high
35
35
  else
36
- confidence = CONFIDENCE[:med]
36
+ confidence = :medium
37
37
  end
38
38
  else
39
- confidence = CONFIDENCE[:med]
39
+ confidence = :medium
40
40
  end
41
41
 
42
42
 
@@ -75,7 +75,7 @@ class Brakeman::CheckWeakHash < Brakeman::BaseCheck
75
75
  :warning_type => "Weak Hash",
76
76
  :warning_code => :weak_hash_hmac,
77
77
  :message => "Weak hashing algorithm (#{alg}) used in HMAC",
78
- :confidence => CONFIDENCE[:med]
78
+ :confidence => :medium
79
79
  end
80
80
 
81
81
  def process_openssl_result result
@@ -91,7 +91,7 @@ class Brakeman::CheckWeakHash < Brakeman::BaseCheck
91
91
  :warning_type => "Weak Hash",
92
92
  :warning_code => :weak_hash_digest,
93
93
  :message => "Weak hashing algorithm (#{alg}) used",
94
- :confidence => CONFIDENCE[:med]
94
+ :confidence => :medium
95
95
  end
96
96
  end
97
97
  end
@@ -42,11 +42,11 @@ class Brakeman::CheckWithoutProtection < Brakeman::BaseCheck
42
42
  add_result res
43
43
 
44
44
  if input = include_user_input?(call.arglist)
45
- confidence = CONFIDENCE[:high]
45
+ confidence = :high
46
46
  elsif all_literals? call
47
47
  return
48
48
  else
49
- confidence = CONFIDENCE[:med]
49
+ confidence = :medium
50
50
  end
51
51
 
52
52
  warn :result => res,
@@ -28,7 +28,7 @@ class Brakeman::CheckXMLDoS < Brakeman::BaseCheck
28
28
  warn :warning_type => "Denial of Service",
29
29
  :warning_code => :CVE_2015_3227,
30
30
  :message => message,
31
- :confidence => CONFIDENCE[:med],
31
+ :confidence => :medium,
32
32
  :gem_info => gemfile_or_environment,
33
33
  :link_path => "https://groups.google.com/d/msg/rubyonrails-security/bahr2JLnxvk/x4EocXnHPp8J"
34
34
  end
@@ -27,7 +27,7 @@ class Brakeman::CheckYAMLParsing < Brakeman::BaseCheck
27
27
  warn :warning_type => "Remote Code Execution",
28
28
  :warning_code => :CVE_2013_0156,
29
29
  :message => message,
30
- :confidence => CONFIDENCE[:high],
30
+ :confidence => :high,
31
31
  :gem_info => gemfile_or_environment,
32
32
  :link_path => "https://groups.google.com/d/topic/rubyonrails-security/61bkgvnSGTQ/discussion"
33
33
  end
@@ -39,7 +39,7 @@ class Brakeman::CheckYAMLParsing < Brakeman::BaseCheck
39
39
  warn :warning_type => "Remote Code Execution",
40
40
  :warning_code => :CVE_2013_0156,
41
41
  :message => message,
42
- :confidence => CONFIDENCE[:high],
42
+ :confidence => :high,
43
43
  :gem_info => gemfile_or_environment,
44
44
  :link_path => "https://groups.google.com/d/topic/rubyonrails-security/61bkgvnSGTQ/discussion"
45
45
  end
@@ -117,11 +117,11 @@ module Brakeman
117
117
  def regular_report options
118
118
  tracker = run_brakeman options
119
119
 
120
- if options[:exit_on_warn] and not tracker.filtered_warnings.empty?
120
+ if tracker.options[:exit_on_warn] and not tracker.filtered_warnings.empty?
121
121
  quit Brakeman::Warnings_Found_Exit_Code
122
122
  end
123
123
 
124
- if options[:exit_on_error] and tracker.errors.any?
124
+ if tracker.options[:exit_on_error] and tracker.errors.any?
125
125
  quit Brakeman::Errors_Found_Exit_Code
126
126
  end
127
127
  end
@@ -55,11 +55,11 @@ module Brakeman::Options
55
55
  options[:quiet] = quiet
56
56
  end
57
57
 
58
- opts.on( "-z", "--[no-]exit-on-warn", "Exit code is non-zero if warnings found") do |exit_on_warn|
58
+ opts.on( "-z", "--[no-]exit-on-warn", "Exit code is non-zero if warnings found (Default)") do |exit_on_warn|
59
59
  options[:exit_on_warn] = exit_on_warn
60
60
  end
61
61
 
62
- opts.on "--[no-]exit-on-error", "Exit code is non-zero if errors found" do |exit_on_error|
62
+ opts.on "--[no-]exit-on-error", "Exit code is non-zero if errors raised (Default)" do |exit_on_error|
63
63
  options[:exit_on_error] = exit_on_error
64
64
  end
65
65
 
@@ -89,7 +89,7 @@ module Brakeman::Options
89
89
  options[:run_all_checks] = true
90
90
  end
91
91
 
92
- opts.on "-a", "--[no-]assume-routes", "Assume all controller methods are actions (default)" do |assume|
92
+ opts.on "-a", "--[no-]assume-routes", "Assume all controller methods are actions (Default)" do |assume|
93
93
  options[:assume_all_routes] = assume
94
94
  end
95
95
 
@@ -111,7 +111,7 @@ module Brakeman::Options
111
111
  options[:ignore_attr_protected] = true
112
112
  end
113
113
 
114
- opts.on "--[no-]index-libs", "Add libraries to call index (default)" do |index|
114
+ opts.on "--[no-]index-libs", "Add libraries to call index (Default)" do |index|
115
115
  options[:index_libs] = index
116
116
  end
117
117
 
@@ -201,7 +201,7 @@ module Brakeman::Options
201
201
 
202
202
  opts.on "-f",
203
203
  "--format TYPE",
204
- [:pdf, :text, :html, :csv, :tabs, :json, :markdown, :codeclimate, :cc, :plain],
204
+ [:pdf, :text, :html, :csv, :tabs, :json, :markdown, :codeclimate, :cc, :plain, :table],
205
205
  "Specify output formats. Default is text" do |type|
206
206
 
207
207
  type = "s" if type == :text
@@ -240,6 +240,10 @@ module Brakeman::Options
240
240
  options[:message_limit] = limit.to_i
241
241
  end
242
242
 
243
+ opts.on "--[no-]pager", "Use pager for output to terminal (Default)" do |pager|
244
+ options[:pager] = pager
245
+ end
246
+
243
247
  opts.on "--table-width WIDTH", "Limit table width in text report" do |width|
244
248
  options[:table_width] = width.to_i
245
249
  end
@@ -706,9 +706,11 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
706
706
 
707
707
  def early_return? exp
708
708
  return true if node_type? exp, :return
709
+ return true if call? exp and [:fail, :raise].include? exp.method
709
710
 
710
711
  if node_type? exp, :block, :rlist
711
- node_type? exp.last, :return
712
+ node_type? exp.last, :return or
713
+ (call? exp and [:fail, :raise].include? exp.method)
712
714
  else
713
715
  false
714
716
  end
@@ -184,7 +184,7 @@ class Brakeman::Rails2RoutesProcessor < Brakeman::BasicProcessor
184
184
 
185
185
  controller = check_for_controller_name exp
186
186
  self.current_controller = controller if controller
187
-
187
+
188
188
  #Check for default route
189
189
  if string? exp.first
190
190
  if exp.first.value == ":controller/:action/:id"
@@ -202,7 +202,7 @@ class Brakeman::Rails2RoutesProcessor < Brakeman::BasicProcessor
202
202
  exp.last.each_with_index do |e,i|
203
203
  if symbol? e and e.value == :action
204
204
  action = exp.last[i + 1]
205
-
205
+
206
206
  if node_type? action, :lit
207
207
  @tracker.routes[@current_controller] << action.value.to_sym
208
208
  end
@@ -220,7 +220,7 @@ class Brakeman::Rails2RoutesProcessor < Brakeman::BasicProcessor
220
220
  @nested = Sexp.new(:lvar, exp.block_args.value)
221
221
 
222
222
  self.current_controller = check_for_controller_name exp.block_call.args
223
-
223
+
224
224
  #process block
225
225
  process exp.block
226
226
 
@@ -258,7 +258,7 @@ class Brakeman::Rails2RoutesProcessor < Brakeman::BasicProcessor
258
258
  return unless exp.node_type == :hash
259
259
  routes = @tracker.routes[@current_controller]
260
260
 
261
- hash_iterate(exp) do |action, type|
261
+ hash_iterate(exp) do |action, _type|
262
262
  routes << action.value
263
263
  end
264
264
  end
@@ -283,14 +283,14 @@ end
283
283
  #This is for a really specific case where a hash is used as arguments
284
284
  #to one of the map methods.
285
285
  class Brakeman::RouteAliasProcessor < Brakeman::AliasProcessor
286
-
286
+
287
287
  #This replaces
288
288
  # { :some => :hash }.keys
289
- #with
289
+ #with
290
290
  # [:some]
291
291
  def process_call exp
292
292
  process_default exp
293
-
293
+
294
294
  if hash? exp.target and exp.method == :keys
295
295
  keys = get_keys exp.target
296
296
  exp.clear
@@ -304,7 +304,7 @@ class Brakeman::RouteAliasProcessor < Brakeman::AliasProcessor
304
304
  #Returns an array Sexp containing the keys from the hash
305
305
  def get_keys hash
306
306
  keys = Sexp.new(:array)
307
- hash_iterate(hash) do |key, value|
307
+ hash_iterate(hash) do |key, _value|
308
308
  keys << key
309
309
  end
310
310