brakeman-lib 5.0.2 → 5.0.4
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.
- checksums.yaml +4 -4
- data/CHANGES.md +6 -0
- data/lib/brakeman.rb +0 -4
- data/lib/brakeman/checks/check_detailed_exceptions.rb +1 -1
- data/lib/brakeman/checks/check_evaluation.rb +1 -1
- data/lib/brakeman/checks/check_sql.rb +2 -15
- data/lib/brakeman/checks/check_verb_confusion.rb +1 -1
- data/lib/brakeman/file_parser.rb +14 -36
- data/lib/brakeman/options.rb +1 -1
- data/lib/brakeman/processors/alias_processor.rb +7 -52
- data/lib/brakeman/processors/controller_alias_processor.rb +43 -6
- data/lib/brakeman/processors/lib/call_conversion_helper.rb +0 -10
- data/lib/brakeman/processors/library_processor.rb +0 -9
- data/lib/brakeman/report.rb +1 -4
- data/lib/brakeman/report/ignore/interactive.rb +1 -1
- data/lib/brakeman/scanner.rb +0 -3
- data/lib/brakeman/tracker.rb +4 -33
- data/lib/brakeman/tracker/collection.rb +5 -27
- data/lib/brakeman/util.rb +0 -8
- data/lib/brakeman/version.rb +1 -1
- metadata +2 -18
- data/lib/brakeman/report/report_github.rb +0 -31
- data/lib/brakeman/tracker/method_info.rb +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bc22b69b0b137fe9f223c2469fe6e3857054b0b98621645b52ed94af7fa4886
|
4
|
+
data.tar.gz: 183f206e691c8251adef49319ca76939a4bf079cf5b14ead1f3f7923754ff9ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b902bcfbc2be499f0a892534bf443d88ce92f5a0b47edd31b7ac01a964e9ec13230f03f5ba8bb246dcdee27a7e6bd72b873d2826ce2f6b2486f64999f45b52e8
|
7
|
+
data.tar.gz: 62f878559fd4aa1f2d96c35742d0c490c0d57c53e07d9a3619675f6519c0fafbaace29e0b616c217ea796132e7810b51b3f06cf1ff60a3a28a34ae9482069f32
|
data/CHANGES.md
CHANGED
data/lib/brakeman.rb
CHANGED
@@ -250,8 +250,6 @@ module Brakeman
|
|
250
250
|
[:to_sarif]
|
251
251
|
when :sonar, :to_sonar
|
252
252
|
[:to_sonar]
|
253
|
-
when :github, :to_github
|
254
|
-
[:to_github]
|
255
253
|
else
|
256
254
|
[:to_text]
|
257
255
|
end
|
@@ -285,8 +283,6 @@ module Brakeman
|
|
285
283
|
:to_sarif
|
286
284
|
when /\.sonar$/i
|
287
285
|
:to_sonar
|
288
|
-
when /\.github$/i
|
289
|
-
:to_github
|
290
286
|
else
|
291
287
|
:to_text
|
292
288
|
end
|
@@ -26,7 +26,7 @@ class Brakeman::CheckDetailedExceptions < Brakeman::BaseCheck
|
|
26
26
|
def check_detailed_exceptions
|
27
27
|
tracker.controllers.each do |_name, controller|
|
28
28
|
controller.methods_public.each do |method_name, definition|
|
29
|
-
src = definition
|
29
|
+
src = definition[:src]
|
30
30
|
body = src.body.last
|
31
31
|
next unless body
|
32
32
|
|
@@ -10,7 +10,7 @@ class Brakeman::CheckEvaluation < Brakeman::BaseCheck
|
|
10
10
|
#Process calls
|
11
11
|
def run_check
|
12
12
|
Brakeman.debug "Finding eval-like calls"
|
13
|
-
calls = tracker.find_call
|
13
|
+
calls = tracker.find_call :method => [:eval, :instance_eval, :class_eval, :module_eval]
|
14
14
|
|
15
15
|
Brakeman.debug "Processing eval-like calls"
|
16
16
|
calls.each do |call|
|
@@ -572,7 +572,7 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
|
|
572
572
|
end
|
573
573
|
|
574
574
|
IGNORE_METHODS_IN_SQL = Set[:id, :merge_conditions, :table_name, :quoted_table_name,
|
575
|
-
:quoted_primary_key, :to_i, :to_f, :sanitize_sql, :sanitize_sql_array,
|
575
|
+
:quoted_primary_key, :to_i, :to_f, :sanitize_sql, :sanitize_sql_array,
|
576
576
|
:sanitize_sql_for_assignment, :sanitize_sql_for_conditions, :sanitize_sql_hash,
|
577
577
|
:sanitize_sql_hash_for_assignment, :sanitize_sql_hash_for_conditions,
|
578
578
|
:to_sql, :sanitize, :primary_key, :table_name_prefix, :table_name_suffix,
|
@@ -592,8 +592,7 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
|
|
592
592
|
IGNORE_METHODS_IN_SQL.include? exp.method or
|
593
593
|
quote_call? exp or
|
594
594
|
arel? exp or
|
595
|
-
exp.method.to_s.end_with? "_id"
|
596
|
-
number_target? exp
|
595
|
+
exp.method.to_s.end_with? "_id"
|
597
596
|
end
|
598
597
|
when :if
|
599
598
|
safe_value? exp.then_clause and safe_value? exp.else_clause
|
@@ -696,16 +695,4 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
|
|
696
695
|
active_record_models.include? klass
|
697
696
|
end
|
698
697
|
end
|
699
|
-
|
700
|
-
def number_target? exp
|
701
|
-
return unless call? exp
|
702
|
-
|
703
|
-
if number? exp.target
|
704
|
-
true
|
705
|
-
elsif call? exp.target
|
706
|
-
number_target? exp.target
|
707
|
-
else
|
708
|
-
false
|
709
|
-
end
|
710
|
-
end
|
711
698
|
end
|
data/lib/brakeman/file_parser.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'parallel'
|
2
|
-
|
3
1
|
module Brakeman
|
4
2
|
ASTFile = Struct.new(:path, :ast)
|
5
3
|
|
@@ -15,46 +13,21 @@ module Brakeman
|
|
15
13
|
end
|
16
14
|
|
17
15
|
def parse_files list
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
# then partition them into ASTFiles and Exceptions
|
22
|
-
# and add the Exceptions to @errors
|
23
|
-
#
|
24
|
-
# Basically just a funky way to deal with two possible
|
25
|
-
# return types that are returned from isolated processes.
|
26
|
-
#
|
27
|
-
# Note this method no longer uses read_files
|
28
|
-
@file_list, new_errors = Parallel.map(list) do |file_name|
|
29
|
-
file_path = @app_tree.file_path(file_name)
|
30
|
-
contents = file_path.read
|
31
|
-
|
32
|
-
begin
|
33
|
-
if ast = parse_ruby(contents, file_path.relative)
|
34
|
-
ASTFile.new(file_name, ast)
|
35
|
-
end
|
36
|
-
rescue Exception => e
|
37
|
-
e
|
16
|
+
read_files list do |path, contents|
|
17
|
+
if ast = parse_ruby(contents, path.relative)
|
18
|
+
ASTFile.new(path, ast)
|
38
19
|
end
|
39
|
-
end.compact.partition do |result|
|
40
|
-
result.is_a? ASTFile
|
41
20
|
end
|
42
|
-
|
43
|
-
errors.concat new_errors
|
44
21
|
end
|
45
22
|
|
46
23
|
def read_files list
|
47
24
|
list.each do |path|
|
48
25
|
file = @app_tree.file_path(path)
|
49
26
|
|
50
|
-
|
51
|
-
result = yield file, file.read
|
27
|
+
result = yield file, file.read
|
52
28
|
|
53
|
-
|
54
|
-
|
55
|
-
end
|
56
|
-
rescue Exception => e
|
57
|
-
@errors << e
|
29
|
+
if result
|
30
|
+
@file_list << result
|
58
31
|
end
|
59
32
|
end
|
60
33
|
end
|
@@ -69,12 +42,17 @@ module Brakeman
|
|
69
42
|
Brakeman.debug "Parsing #{path}"
|
70
43
|
RubyParser.new.parse input, path, @timeout
|
71
44
|
rescue Racc::ParseError => e
|
72
|
-
|
45
|
+
error e.exception(e.message + "\nCould not parse #{path}")
|
73
46
|
rescue Timeout::Error => e
|
74
|
-
|
47
|
+
error Exception.new("Parsing #{path} took too long (> #{@timeout} seconds). Try increasing the limit with --parser-timeout")
|
75
48
|
rescue => e
|
76
|
-
|
49
|
+
error e.exception(e.message + "\nWhile processing #{path}")
|
77
50
|
end
|
78
51
|
end
|
52
|
+
|
53
|
+
def error exception
|
54
|
+
@errors << exception
|
55
|
+
nil
|
56
|
+
end
|
79
57
|
end
|
80
58
|
end
|
data/lib/brakeman/options.rb
CHANGED
@@ -233,7 +233,7 @@ module Brakeman::Options
|
|
233
233
|
|
234
234
|
opts.on "-f",
|
235
235
|
"--format TYPE",
|
236
|
-
[:pdf, :text, :html, :csv, :tabs, :json, :markdown, :codeclimate, :cc, :plain, :table, :junit, :sarif, :sonar
|
236
|
+
[:pdf, :text, :html, :csv, :tabs, :json, :markdown, :codeclimate, :cc, :plain, :table, :junit, :sarif, :sonar],
|
237
237
|
"Specify output formats. Default is text" do |type|
|
238
238
|
|
239
239
|
type = "s" if type == :text
|
@@ -220,28 +220,13 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
|
|
220
220
|
exp = math_op(:+, target, first_arg, exp)
|
221
221
|
end
|
222
222
|
when :-, :*, :/
|
223
|
-
|
224
|
-
if string? first_arg
|
225
|
-
exp = process_array_join(target, first_arg)
|
226
|
-
end
|
227
|
-
else
|
228
|
-
exp = math_op(method, target, first_arg, exp)
|
229
|
-
end
|
223
|
+
exp = math_op(method, target, first_arg, exp)
|
230
224
|
when :[]
|
231
225
|
if array? target
|
232
226
|
exp = process_array_access(target, exp.args, exp)
|
233
227
|
elsif hash? target
|
234
228
|
exp = process_hash_access(target, first_arg, exp)
|
235
229
|
end
|
236
|
-
when :fetch
|
237
|
-
if array? target
|
238
|
-
# Not dealing with default value
|
239
|
-
# so just pass in first argument, but process_array_access expects
|
240
|
-
# an array of arguments.
|
241
|
-
exp = process_array_access(target, [first_arg], exp)
|
242
|
-
elsif hash? target
|
243
|
-
exp = process_hash_access(target, first_arg, exp)
|
244
|
-
end
|
245
230
|
when :merge!, :update
|
246
231
|
if hash? target and hash? first_arg
|
247
232
|
target = process_hash_merge! target, first_arg
|
@@ -281,12 +266,6 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
|
|
281
266
|
target = find_push_target(target_var)
|
282
267
|
env[target] = exp unless target.nil? # Happens in TemplateAliasProcessor
|
283
268
|
end
|
284
|
-
when :push
|
285
|
-
if array? target
|
286
|
-
target << first_arg
|
287
|
-
env[target_var] = target
|
288
|
-
return target
|
289
|
-
end
|
290
269
|
when :first
|
291
270
|
if array? target and first_arg.nil? and sexp? target[1]
|
292
271
|
exp = target[1]
|
@@ -300,7 +279,7 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
|
|
300
279
|
exp = target
|
301
280
|
end
|
302
281
|
when :join
|
303
|
-
if array? target and (string? first_arg or first_arg.nil?)
|
282
|
+
if array? target and target.length > 2 and (string? first_arg or first_arg.nil?)
|
304
283
|
exp = process_array_join(target, first_arg)
|
305
284
|
end
|
306
285
|
when :!
|
@@ -308,15 +287,6 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
|
|
308
287
|
if call? target and target.method == :!
|
309
288
|
exp = s(:or, s(:true).line(exp.line), s(:false).line(exp.line)).line(exp.line)
|
310
289
|
end
|
311
|
-
when :values
|
312
|
-
# Hash literal
|
313
|
-
if node_type? target, :hash
|
314
|
-
exp = hash_values(target)
|
315
|
-
end
|
316
|
-
when :values_at
|
317
|
-
if hash? target
|
318
|
-
exp = hash_values_at target, exp.args
|
319
|
-
end
|
320
290
|
end
|
321
291
|
|
322
292
|
exp
|
@@ -324,11 +294,6 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
|
|
324
294
|
|
325
295
|
# Painful conversion of Array#join into string interpolation
|
326
296
|
def process_array_join array, join_str
|
327
|
-
# Empty array
|
328
|
-
if array.length == 1
|
329
|
-
return s(:str, '').line(array.line)
|
330
|
-
end
|
331
|
-
|
332
297
|
result = s().line(array.line)
|
333
298
|
|
334
299
|
join_value = if string? join_str
|
@@ -337,10 +302,8 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
|
|
337
302
|
nil
|
338
303
|
end
|
339
304
|
|
340
|
-
|
341
|
-
|
342
|
-
result << join_item(e, join_value)
|
343
|
-
end
|
305
|
+
array[1..-2].each do |e|
|
306
|
+
result << join_item(e, join_value)
|
344
307
|
end
|
345
308
|
|
346
309
|
result << join_item(array.last, nil)
|
@@ -369,7 +332,7 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
|
|
369
332
|
result.unshift combined_first
|
370
333
|
|
371
334
|
# Have to fix up strings that follow interpolation
|
372
|
-
|
335
|
+
result.reduce(s(:dstr).line(array.line)) do |memo, e|
|
373
336
|
if string? e and node_type? memo.last, :evstr
|
374
337
|
e.value = "#{join_value}#{e.value}"
|
375
338
|
elsif join_value and node_type? memo.last, :evstr and node_type? e, :evstr
|
@@ -378,14 +341,6 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
|
|
378
341
|
|
379
342
|
memo << e
|
380
343
|
end
|
381
|
-
|
382
|
-
# Convert (:dstr, "hello world")
|
383
|
-
# to (:str, "hello world")
|
384
|
-
if string.length == 2 and string.last.is_a? String
|
385
|
-
string[0] = :str
|
386
|
-
end
|
387
|
-
|
388
|
-
string
|
389
344
|
end
|
390
345
|
|
391
346
|
def join_item item, join_value
|
@@ -1058,8 +1013,8 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
|
|
1058
1013
|
method_name = call.method
|
1059
1014
|
|
1060
1015
|
#Look for helper methods and see if we can get a return value
|
1061
|
-
if found_method =
|
1062
|
-
helper = found_method
|
1016
|
+
if found_method = find_method(method_name, @current_class)
|
1017
|
+
helper = found_method[:method]
|
1063
1018
|
|
1064
1019
|
if sexp? helper
|
1065
1020
|
value = process_helper_method helper, call.args
|
@@ -51,7 +51,7 @@ class Brakeman::ControllerAliasProcessor < Brakeman::AliasProcessor
|
|
51
51
|
#Need to process the method like it was in a controller in order
|
52
52
|
#to get the renders set
|
53
53
|
processor = Brakeman::ControllerProcessor.new(@tracker, mixin.file)
|
54
|
-
method = mixin.get_method(name)
|
54
|
+
method = mixin.get_method(name)[:src].deep_clone
|
55
55
|
|
56
56
|
if node_type? method, :defn
|
57
57
|
method = processor.process_defn method
|
@@ -143,16 +143,16 @@ class Brakeman::ControllerAliasProcessor < Brakeman::AliasProcessor
|
|
143
143
|
#Basically, adds any instance variable assignments to the environment.
|
144
144
|
#TODO: method arguments?
|
145
145
|
def process_before_filter name
|
146
|
-
filter =
|
146
|
+
filter = find_method name, @current_class
|
147
147
|
|
148
148
|
if filter.nil?
|
149
149
|
Brakeman.debug "[Notice] Could not find filter #{name}"
|
150
150
|
return
|
151
151
|
end
|
152
152
|
|
153
|
-
method = filter
|
153
|
+
method = filter[:method]
|
154
154
|
|
155
|
-
if ivars = @tracker.filter_cache[[filter
|
155
|
+
if ivars = @tracker.filter_cache[[filter[:controller], name]]
|
156
156
|
ivars.each do |variable, value|
|
157
157
|
env[variable] = value
|
158
158
|
end
|
@@ -162,7 +162,7 @@ class Brakeman::ControllerAliasProcessor < Brakeman::AliasProcessor
|
|
162
162
|
|
163
163
|
ivars = processor.only_ivars(:include_request_vars).all
|
164
164
|
|
165
|
-
@tracker.filter_cache[[filter
|
165
|
+
@tracker.filter_cache[[filter[:controller], name]] = ivars
|
166
166
|
|
167
167
|
ivars.each do |variable, value|
|
168
168
|
env[variable] = value
|
@@ -182,7 +182,7 @@ class Brakeman::ControllerAliasProcessor < Brakeman::AliasProcessor
|
|
182
182
|
# method as the line number
|
183
183
|
if line.nil? and controller = @tracker.controllers[@current_class]
|
184
184
|
if meth = controller.get_method(@current_method)
|
185
|
-
if line = meth
|
185
|
+
if line = meth[:src] && meth[:src].last && meth[:src].last.line
|
186
186
|
line += 1
|
187
187
|
else
|
188
188
|
line = 1
|
@@ -241,4 +241,41 @@ class Brakeman::ControllerAliasProcessor < Brakeman::AliasProcessor
|
|
241
241
|
[]
|
242
242
|
end
|
243
243
|
end
|
244
|
+
|
245
|
+
#Finds a method in the given class or a parent class
|
246
|
+
#
|
247
|
+
#Returns nil if the method could not be found.
|
248
|
+
#
|
249
|
+
#If found, returns hash table with controller name and method sexp.
|
250
|
+
def find_method method_name, klass
|
251
|
+
return nil if sexp? method_name
|
252
|
+
method_name = method_name.to_sym
|
253
|
+
|
254
|
+
if method = @method_cache[method_name]
|
255
|
+
return method
|
256
|
+
end
|
257
|
+
|
258
|
+
controller = @tracker.controllers[klass]
|
259
|
+
controller ||= @tracker.libs[klass]
|
260
|
+
|
261
|
+
if klass and controller
|
262
|
+
method = controller.get_method method_name
|
263
|
+
|
264
|
+
if method.nil?
|
265
|
+
controller.includes.each do |included|
|
266
|
+
method = find_method method_name, included
|
267
|
+
if method
|
268
|
+
@method_cache[method_name] = method
|
269
|
+
return method
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
@method_cache[method_name] = find_method method_name, controller.parent
|
274
|
+
else
|
275
|
+
@method_cache[method_name] = { :controller => controller.name, :method => method[:src] }
|
276
|
+
end
|
277
|
+
else
|
278
|
+
nil
|
279
|
+
end
|
280
|
+
end
|
244
281
|
end
|
@@ -76,8 +76,6 @@ module Brakeman
|
|
76
76
|
|
77
77
|
#Have to do this because first element is :array and we have to skip it
|
78
78
|
array[1..-1][index] or original_exp
|
79
|
-
elsif all_literals? array
|
80
|
-
safe_literal(array.line)
|
81
79
|
else
|
82
80
|
original_exp
|
83
81
|
end
|
@@ -94,13 +92,5 @@ module Brakeman
|
|
94
92
|
original_exp
|
95
93
|
end
|
96
94
|
end
|
97
|
-
|
98
|
-
def hash_values_at hash, keys
|
99
|
-
values = keys.map do |key|
|
100
|
-
process_hash_access hash, key
|
101
|
-
end
|
102
|
-
|
103
|
-
Sexp.new(:array).concat(values).line(hash.line)
|
104
|
-
end
|
105
95
|
end
|
106
96
|
end
|
@@ -54,15 +54,6 @@ class Brakeman::LibraryProcessor < Brakeman::BaseProcessor
|
|
54
54
|
|
55
55
|
def process_call exp
|
56
56
|
if process_call_defn? exp
|
57
|
-
exp
|
58
|
-
elsif @current_method.nil? and exp.target.nil? and (@current_class or @current_module)
|
59
|
-
# Methods called inside class / module
|
60
|
-
case exp.method
|
61
|
-
when :include
|
62
|
-
module_name = class_name(exp.first_arg)
|
63
|
-
(@current_class || @current_module).add_include module_name
|
64
|
-
end
|
65
|
-
|
66
57
|
exp
|
67
58
|
else
|
68
59
|
process_default exp
|
data/lib/brakeman/report.rb
CHANGED
@@ -6,7 +6,7 @@ require 'brakeman/report/report_base'
|
|
6
6
|
class Brakeman::Report
|
7
7
|
attr_reader :tracker
|
8
8
|
|
9
|
-
VALID_FORMATS = [:to_html, :to_pdf, :to_csv, :to_json, :to_tabs, :to_hash, :to_s, :to_markdown, :to_codeclimate, :to_plain, :to_text, :to_junit
|
9
|
+
VALID_FORMATS = [:to_html, :to_pdf, :to_csv, :to_json, :to_tabs, :to_hash, :to_s, :to_markdown, :to_codeclimate, :to_plain, :to_text, :to_junit]
|
10
10
|
|
11
11
|
def initialize tracker
|
12
12
|
@app_tree = tracker.app_tree
|
@@ -48,9 +48,6 @@ class Brakeman::Report
|
|
48
48
|
when :to_sonar
|
49
49
|
require_report 'sonar'
|
50
50
|
Brakeman::Report::Sonar
|
51
|
-
when :to_github
|
52
|
-
require_report 'github'
|
53
|
-
Brakeman::Report::Github
|
54
51
|
else
|
55
52
|
raise "Invalid format: #{format}. Should be one of #{VALID_FORMATS.inspect}"
|
56
53
|
end
|
data/lib/brakeman/scanner.rb
CHANGED
data/lib/brakeman/tracker.rb
CHANGED
@@ -35,7 +35,6 @@ class Brakeman::Tracker
|
|
35
35
|
#class they are.
|
36
36
|
@models = {}
|
37
37
|
@models[UNKNOWN_MODEL] = Brakeman::Model.new(UNKNOWN_MODEL, nil, @app_tree.file_path("NOT_REAL.rb"), nil, self)
|
38
|
-
@method_cache = {}
|
39
38
|
@routes = {}
|
40
39
|
@initializers = {}
|
41
40
|
@errors = []
|
@@ -100,8 +99,8 @@ class Brakeman::Tracker
|
|
100
99
|
classes.each do |set|
|
101
100
|
set.each do |set_name, collection|
|
102
101
|
collection.each_method do |method_name, definition|
|
103
|
-
src = definition
|
104
|
-
yield src, set_name, method_name, definition
|
102
|
+
src = definition[:src]
|
103
|
+
yield src, set_name, method_name, definition[:file]
|
105
104
|
end
|
106
105
|
end
|
107
106
|
end
|
@@ -221,34 +220,6 @@ class Brakeman::Tracker
|
|
221
220
|
nil
|
222
221
|
end
|
223
222
|
|
224
|
-
def find_method method_name, class_name, method_type = :instance
|
225
|
-
return nil unless method_name.is_a? Symbol
|
226
|
-
|
227
|
-
klass = find_class(class_name)
|
228
|
-
return nil unless klass
|
229
|
-
|
230
|
-
cache_key = [klass, method_name, method_type]
|
231
|
-
|
232
|
-
if method = @method_cache[cache_key]
|
233
|
-
return method
|
234
|
-
end
|
235
|
-
|
236
|
-
if method = klass.get_method(method_name, method_type)
|
237
|
-
return method
|
238
|
-
else
|
239
|
-
# Check modules included for method definition
|
240
|
-
# TODO: only for instance methods, otherwise check extends!
|
241
|
-
klass.includes.each do |included_name|
|
242
|
-
if method = find_method(method_name, included_name, method_type)
|
243
|
-
return (@method_cache[cache_key] = method)
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
# Not in any included modules, check the parent
|
248
|
-
@method_cache[cache_key] = find_method(method_name, klass.parent)
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
223
|
def index_call_sites
|
253
224
|
finder = Brakeman::FindAllCalls.new self
|
254
225
|
|
@@ -314,8 +285,8 @@ class Brakeman::Tracker
|
|
314
285
|
method_sets.each do |set|
|
315
286
|
set.each do |set_name, info|
|
316
287
|
info.each_method do |method_name, definition|
|
317
|
-
src = definition
|
318
|
-
finder.process_source src, :class => set_name, :method => method_name, :file => definition
|
288
|
+
src = definition[:src]
|
289
|
+
finder.process_source src, :class => set_name, :method => method_name, :file => definition[:file]
|
319
290
|
end
|
320
291
|
end
|
321
292
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'brakeman/util'
|
2
|
-
require 'brakeman/tracker/method_info'
|
3
2
|
|
4
3
|
module Brakeman
|
5
4
|
class Collection
|
@@ -14,7 +13,6 @@ module Brakeman
|
|
14
13
|
@src = {}
|
15
14
|
@includes = []
|
16
15
|
@methods = { :public => {}, :private => {}, :protected => {} }
|
17
|
-
@class_methods = {}
|
18
16
|
@options = {}
|
19
17
|
@tracker = tracker
|
20
18
|
|
@@ -48,16 +46,11 @@ module Brakeman
|
|
48
46
|
end
|
49
47
|
|
50
48
|
def add_method visibility, name, src, file_name
|
51
|
-
meth_info = Brakeman::MethodInfo.new(name, src, self, file_name)
|
52
|
-
|
53
49
|
if src.node_type == :defs
|
54
|
-
@class_methods[name] = meth_info
|
55
|
-
|
56
|
-
# TODO fix this weirdness
|
57
50
|
name = :"#{src[1]}.#{name}"
|
58
51
|
end
|
59
52
|
|
60
|
-
@methods[visibility][name] =
|
53
|
+
@methods[visibility][name] = { :src => src, :file => file_name }
|
61
54
|
end
|
62
55
|
|
63
56
|
def each_method
|
@@ -68,31 +61,16 @@ module Brakeman
|
|
68
61
|
end
|
69
62
|
end
|
70
63
|
|
71
|
-
def get_method name
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
when :instance
|
76
|
-
get_instance_method name
|
77
|
-
else
|
78
|
-
raise "Unexpected method type: #{type.inspect}"
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def get_instance_method name
|
83
|
-
@methods.each do |_vis, meths|
|
84
|
-
if meths[name]
|
85
|
-
return meths[name]
|
64
|
+
def get_method name
|
65
|
+
each_method do |n, info|
|
66
|
+
if n == name
|
67
|
+
return info
|
86
68
|
end
|
87
69
|
end
|
88
70
|
|
89
71
|
nil
|
90
72
|
end
|
91
73
|
|
92
|
-
def get_class_method name
|
93
|
-
@class_methods[name]
|
94
|
-
end
|
95
|
-
|
96
74
|
def file
|
97
75
|
@files.first
|
98
76
|
end
|
data/lib/brakeman/util.rb
CHANGED
@@ -142,14 +142,6 @@ module Brakeman::Util
|
|
142
142
|
nil
|
143
143
|
end
|
144
144
|
|
145
|
-
def hash_values hash
|
146
|
-
values = hash.each_sexp.each_slice(2).map do |_, value|
|
147
|
-
value
|
148
|
-
end
|
149
|
-
|
150
|
-
Sexp.new(:array).concat(values).line(hash.line)
|
151
|
-
end
|
152
|
-
|
153
145
|
#These are never modified
|
154
146
|
PARAMS_SEXP = Sexp.new(:params)
|
155
147
|
SESSION_SEXP = Sexp.new(:session)
|
data/lib/brakeman/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brakeman-lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Collins
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-06-
|
11
|
+
date: 2021-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -66,20 +66,6 @@ dependencies:
|
|
66
66
|
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 0.10.2
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: parallel
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '1.20'
|
76
|
-
type: :runtime
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '1.20'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: ruby_parser
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -394,7 +380,6 @@ files:
|
|
394
380
|
- lib/brakeman/report/report_base.rb
|
395
381
|
- lib/brakeman/report/report_codeclimate.rb
|
396
382
|
- lib/brakeman/report/report_csv.rb
|
397
|
-
- lib/brakeman/report/report_github.rb
|
398
383
|
- lib/brakeman/report/report_hash.rb
|
399
384
|
- lib/brakeman/report/report_html.rb
|
400
385
|
- lib/brakeman/report/report_json.rb
|
@@ -424,7 +409,6 @@ files:
|
|
424
409
|
- lib/brakeman/tracker/constants.rb
|
425
410
|
- lib/brakeman/tracker/controller.rb
|
426
411
|
- lib/brakeman/tracker/library.rb
|
427
|
-
- lib/brakeman/tracker/method_info.rb
|
428
412
|
- lib/brakeman/tracker/model.rb
|
429
413
|
- lib/brakeman/tracker/template.rb
|
430
414
|
- lib/brakeman/util.rb
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# Github Actions Formatter
|
2
|
-
# Formats warnings as workflow commands to create annotations in GitHub UI
|
3
|
-
class Brakeman::Report::Github < Brakeman::Report::Base
|
4
|
-
def generate_report
|
5
|
-
# @see https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-a-warning-message
|
6
|
-
errors.concat(warnings).join("\n")
|
7
|
-
end
|
8
|
-
|
9
|
-
def warnings
|
10
|
-
all_warnings
|
11
|
-
.map { |warning| "::warning file=#{warning_file(warning)},line=#{warning.line}::#{warning.message}" }
|
12
|
-
end
|
13
|
-
|
14
|
-
def errors
|
15
|
-
tracker.errors.map do |error|
|
16
|
-
if error[:exception].is_a?(Racc::ParseError)
|
17
|
-
# app/services/balance.rb:4 :: parse error on value "..." (tDOT3)
|
18
|
-
file, line = error[:exception].message.split(':').map(&:strip)[0,2]
|
19
|
-
"::error file=#{file},line=#{line}::#{clean_message(error[:error])}"
|
20
|
-
else
|
21
|
-
"::error ::#{clean_message(error[:error])}"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def clean_message(msg)
|
29
|
-
msg.gsub('::','').squeeze(' ')
|
30
|
-
end
|
31
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'brakeman/util'
|
2
|
-
|
3
|
-
module Brakeman
|
4
|
-
class MethodInfo
|
5
|
-
include Brakeman::Util
|
6
|
-
|
7
|
-
attr_reader :name, :src, :owner, :file, :type
|
8
|
-
|
9
|
-
def initialize name, src, owner, file
|
10
|
-
@name = name
|
11
|
-
@src = src
|
12
|
-
@owner = owner
|
13
|
-
@file = file
|
14
|
-
@type = case src.node_type
|
15
|
-
when :defn
|
16
|
-
:instance
|
17
|
-
when :defs
|
18
|
-
:class
|
19
|
-
else
|
20
|
-
raise "Expected sexp type: #{src.node_type}"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# To support legacy code that expected a Hash
|
25
|
-
def [] attr
|
26
|
-
self.send(attr)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|