Sha256: bb5d0960721ca25478a6c25c3a419161c6a5a6bdee0ee140767a8b505aa66f38

Contents?: true

Size: 1.99 KB

Versions: 20

Compression:

Stored size: 1.99 KB

Contents

module Honeybadger
  module Util
    class Sanitizer
      OBJECT_WHITELIST = [Hash, Array, String, Integer, Float, TrueClass, FalseClass, NilClass]

      def initialize(opts = {})
        @max_depth = opts[:max_depth] || 20
        @filters = Array(opts[:filters])
      end

      # Removes non-serializable data and truncates to max depth.
      def sanitize(data, depth = 0, stack = [])
        return '[possible infinite recursion halted]' if stack.any?{|item| item == data.object_id }

        if data.respond_to?(:to_hash)
          return '[max depth reached]' if depth >= max_depth
          data.to_hash.reduce({}) do |result, (key, value)|
            result.merge(key => sanitize(value, depth+1, stack + [data.object_id]))
          end
        elsif data.respond_to?(:to_ary)
          return '[max depth reached]' if depth >= max_depth
          data.to_ary.collect do |value|
            sanitize(value, depth+1, stack + [data.object_id])
          end
        elsif OBJECT_WHITELIST.any? {|c| data.kind_of?(c) }
          data
        else
          data.to_s
        end
      end

      def filter(hash)
        {}.tap do |filtered_hash|
          hash.each_pair do |key, value|
            if value.respond_to?(:to_hash)
              filtered_hash[key] = filter(hash[key])
            else
              filtered_hash[key] = filter_key?(key) ? '[FILTERED]' : hash[key]
            end
          end
        end
      end

      def filter_url(url)
        filtered_url = url.to_s.dup
        filtered_url.scan(/(?:^|&|\?)([^=?&]+)=([^&]+)/).each do |m|
          next unless filter_key?(m[0])
          filtered_url.gsub!(/#{m[1]}/, '[FILTERED]')
        end

        filtered_url
      end

      private

      attr_reader :max_depth, :filters

      def filter_key?(key)
        return false unless filters

        filters.any? do |filter|
          if filter.is_a?(Regexp)
            key.to_s =~ filter
          else
            key.to_s.eql?(filter.to_s)
          end
        end
      end
    end
  end
end

Version data entries

20 entries across 20 versions & 1 rubygems

Version Path
honeybadger-2.0.6 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.5 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.4 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.3 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.2 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.1 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.13 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.12 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.11 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.10 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.9 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.8 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.7 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.6 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.5 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.4 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.3 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.2 lib/honeybadger/util/sanitizer.rb
honeybadger-2.0.0.beta.1 lib/honeybadger/util/sanitizer.rb