From 2bdd8fa86313a48de11d95fc48f97ada24d7d8af Mon Sep 17 00:00:00 2001
From: Yehuda Katz <wycats@gmail.com>
Date: Mon, 26 Oct 2009 21:10:40 -0700
Subject: Clean up parameter logging some

---
 .../metal/filter_parameter_logging.rb              | 65 ++++++++--------------
 1 file changed, 23 insertions(+), 42 deletions(-)

(limited to 'actionpack/lib')

diff --git a/actionpack/lib/action_controller/metal/filter_parameter_logging.rb b/actionpack/lib/action_controller/metal/filter_parameter_logging.rb
index 4259d9de19..a53c052075 100644
--- a/actionpack/lib/action_controller/metal/filter_parameter_logging.rb
+++ b/actionpack/lib/action_controller/metal/filter_parameter_logging.rb
@@ -4,10 +4,6 @@ module ActionController
 
     include AbstractController::Logger
 
-    included do
-      include InstanceMethodsForNewBase
-    end
-
     module ClassMethods
       # Replace sensitive parameter data from the request log.
       # Filters parameters that have any of the arguments as a substring.
@@ -17,8 +13,6 @@ module ActionController
       # can be replaced using String#replace or similar method.
       #
       # Examples:
-      #   filter_parameter_logging
-      #   => Does nothing, just slows the logging process down
       #
       #   filter_parameter_logging :password
       #   => replaces the value to all keys matching /password/i with "[FILTERED]"
@@ -33,64 +27,51 @@ module ActionController
       #   => reverses the value to all keys matching /secret/i, and
       #      replaces the value to all keys matching /foo|bar/i with "[FILTERED]"
       def filter_parameter_logging(*filter_words, &block)
-        parameter_filter = Regexp.new(filter_words.collect{ |s| s.to_s }.join('|'), true) if filter_words.length > 0
+        raise "You must filter at least one word from logging" if filter_words.empty?
+
+        parameter_filter = Regexp.new(filter_words.join('|'), true)
 
-        define_method(:filter_parameters) do |unfiltered_parameters|
-          filtered_parameters = {}
+        define_method(:filter_parameters) do |original_params|
+          filtered_params = {}
 
-          unfiltered_parameters.each do |key, value|
+          original_params.each do |key, value|
             if key =~ parameter_filter
-              filtered_parameters[key] = '[FILTERED]'
+              value = '[FILTERED]'
             elsif value.is_a?(Hash)
-              filtered_parameters[key] = filter_parameters(value)
+              value = filter_parameters(value)
             elsif value.is_a?(Array)
-              filtered_parameters[key] = value.collect do |item|
-                filter_parameters(item)
-              end
+              value = value.map { |item| filter_parameters(item) }
             elsif block_given?
               key = key.dup
               value = value.dup if value.duplicable?
               yield key, value
-              filtered_parameters[key] = value
-            else
-              filtered_parameters[key] = value
             end
+
+            filtered_params[key] = value
           end
 
-          filtered_parameters
+          filtered_params
         end
         protected :filter_parameters
       end
     end
 
-    module InstanceMethodsForNewBase
-      # TODO : Fix the order of information inside such that it's exactly same as the old base
-      def process(*)
-        ret = super
-
-        if logger
-          parameters = respond_to?(:filter_parameters) ? filter_parameters(params) : params.dup
-          parameters = parameters.except!(:controller, :action, :format, :_method, :only_path)
+    INTERNAL_PARAMS = [:controller, :action, :format, :_method, :only_path]
 
-          unless parameters.empty?
-            # TODO : Move DelayedLog to AS
-            log = AbstractController::Logger::DelayedLog.new { "  Parameters: #{parameters.inspect}" }
-            logger.info(log)
-          end
-        end
-
-        ret
+    def process(*)
+      response = super
+      if logger
+        parameters = filter_parameters(params).except!(*INTERNAL_PARAMS)
+        logger.info { "  Parameters: #{parameters.inspect}" } unless parameters.empty?
       end
+      response
     end
 
-    private
+  protected
 
-    # TODO : This method is not needed for the new base
-    def log_processing_for_parameters
-      parameters = respond_to?(:filter_parameters) ? filter_parameters(params) : params.dup
-      parameters = parameters.except!(:controller, :action, :format, :_method)
-
-      logger.info "  Parameters: #{parameters.inspect}" unless parameters.empty?
+    def filter_parameters(params)
+      params.dup
     end
+
   end
 end
-- 
cgit v1.2.3