lib/brakeman/processors/controller_alias_processor.rb in brakeman-lib-5.0.2 vs lib/brakeman/processors/controller_alias_processor.rb in brakeman-lib-5.0.4

- old
+ new

@@ -49,11 +49,11 @@ methods.each do |name| #Need to process the method like it was in a controller in order #to get the renders set processor = Brakeman::ControllerProcessor.new(@tracker, mixin.file) - method = mixin.get_method(name).src.deep_clone + method = mixin.get_method(name)[:src].deep_clone if node_type? method, :defn method = processor.process_defn method else #Should be a defn, but this will catch other cases @@ -141,30 +141,30 @@ #Processes a call to a before filter. #Basically, adds any instance variable assignments to the environment. #TODO: method arguments? def process_before_filter name - filter = tracker.find_method name, @current_class + filter = find_method name, @current_class if filter.nil? Brakeman.debug "[Notice] Could not find filter #{name}" return end - method = filter.src + method = filter[:method] - if ivars = @tracker.filter_cache[[filter.owner, name]] + if ivars = @tracker.filter_cache[[filter[:controller], name]] ivars.each do |variable, value| env[variable] = value end else processor = Brakeman::AliasProcessor.new @tracker processor.process_safely(method.body_list, only_ivars(:include_request_vars)) ivars = processor.only_ivars(:include_request_vars).all - @tracker.filter_cache[[filter.owner, name]] = ivars + @tracker.filter_cache[[filter[:controller], name]] = ivars ivars.each do |variable, value| env[variable] = value end end @@ -180,11 +180,11 @@ def process_template name, args, _, line # If line is null, assume implicit render and set the end of the action # method as the line number if line.nil? and controller = @tracker.controllers[@current_class] if meth = controller.get_method(@current_method) - if line = meth.src && meth.src.last && meth.src.last.line + if line = meth[:src] && meth[:src].last && meth[:src].last.line line += 1 else line = 1 end end @@ -237,8 +237,45 @@ if controller controller.before_filter_list self, method else [] + end + end + + #Finds a method in the given class or a parent class + # + #Returns nil if the method could not be found. + # + #If found, returns hash table with controller name and method sexp. + def find_method method_name, klass + return nil if sexp? method_name + method_name = method_name.to_sym + + if method = @method_cache[method_name] + return method + end + + controller = @tracker.controllers[klass] + controller ||= @tracker.libs[klass] + + if klass and controller + method = controller.get_method method_name + + if method.nil? + controller.includes.each do |included| + method = find_method method_name, included + if method + @method_cache[method_name] = method + return method + end + end + + @method_cache[method_name] = find_method method_name, controller.parent + else + @method_cache[method_name] = { :controller => controller.name, :method => method[:src] } + end + else + nil end end end