Sha256: e0ed082b047209ba75a202834a7997bb87665c097175d60f5742342d3cf98f3a

Contents?: true

Size: 1.33 KB

Versions: 3

Compression:

Stored size: 1.33 KB

Contents

# frozen_string_literal: false

require "json"

##
# Module responsible for sanitizing log data
module LogDataFilter
  DEFAULT_MAX_LENGTH = 512
  DEFAULT_SENSITIVE_FIELDS = [].freeze

  def self.config
    @config ||= begin
      file_path = "application.json"
      config = {
        max_length: DEFAULT_MAX_LENGTH,
        sensitive_fields: DEFAULT_SENSITIVE_FIELDS
      }

      if File.exist?(file_path)
        json = JSON.parse(File.read(file_path))

        if json["macaw"] && json["macaw"]["log"]
          log_config = json["macaw"]["log"]
          config[:max_length] = log_config["max_length"] if log_config["max_length"]
          config[:sensitive_fields] = log_config["sensitive_fields"] if log_config["sensitive_fields"]
        end
      end

      config
    end
  end

  def self.sanitize_for_logging(data, sensitive_fields: config[:sensitive_fields])
    return "" if data.nil?

    data = data.to_s.force_encoding("UTF-8")
    data = data.gsub(/[\x00-\x1F\x7F]/, "")
    data = data.gsub(/\s+/, " ")
    data = data.slice(0, config[:max_length])

    sensitive_fields.each do |field|
      next unless data.include?(field.to_s)

      data = data.gsub(/(#{Regexp.escape(field.to_s)}\s*[:=]\s*)([^\s]+)/) do |_match|
        "#{::Regexp.last_match(1)}#{Digest::SHA256.hexdigest(::Regexp.last_match(2))}"
      end
    end

    data
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
macaw_framework-1.0.5 lib/macaw_framework/data_filters/log_data_filter.rb
macaw_framework-1.0.4 lib/macaw_framework/data_filters/log_data_filter.rb
macaw_framework-1.0.3 lib/macaw_framework/data_filters/log_data_filter.rb