def add_fake_filter exp
unless @current_class
Brakeman.debug "Skipping before_filter outside controller: #{exp}"
return exp
end
filter_name = ("fake_filter" + rand.to_s[/\d+$/]).to_sym
args = exp.block_call.arglist
args.insert(1, Sexp.new(:lit, filter_name))
before_filter_call = make_call(nil, :before_filter, args)
if exp.block_args.length > 1
block_variable = exp.block_args[1]
else
block_variable = :temp
end
if node_type? exp.block, :block
block_inner = exp.block[1..-1]
else
block_inner = [exp.block]
end
body = Sexp.new(:lasgn,
block_variable,
Sexp.new(:call, Sexp.new(:const, @current_class.name), :new))
filter_method = Sexp.new(:defn, filter_name, Sexp.new(:args), body).concat(block_inner).line(exp.line)
vis = @visibility
@visibility = :private
process_defn filter_method
@visibility = vis
process before_filter_call
exp
end