class Instana::Secrets

Public Class Methods

new(logger: ::Instana.logger) click to toggle source
# File lib/instana/secrets.rb, line 9
def initialize(logger: ::Instana.logger)
  @logger = logger
end

Public Instance Methods

remove_from_query(str, secret_values = Instana.agent.secret_values) click to toggle source
# File lib/instana/secrets.rb, line 13
def remove_from_query(str, secret_values = Instana.agent.secret_values)
  return str unless secret_values && str

  begin
    url = URI(str)
    params = url.scheme ? CGI.parse(url.query || '') : CGI.parse(url.to_s)

    redacted = redact(params, secret_values)

    url.query = URI.encode_www_form(redacted)
    url.scheme ? CGI.unescape(url.to_s) : CGI.unescape(url.query)
  rescue URI::InvalidURIError => _e
    params = CGI.parse(str || '')
    redacted = redact(params, secret_values)
    CGI.unescape(URI.encode_www_form(redacted))
  end
end

Private Instance Methods

matcher(name) click to toggle source
# File lib/instana/secrets.rb, line 41
def matcher(name)
  case name
  when 'equals-ignore-case'
    ->(expected, actual) { expected.casecmp(actual) == 0 }
  when 'equals'
    ->(expected, actual) { (expected <=> actual) == 0 }
  when 'contains-ignore-case'
    ->(expected, actual) { actual.downcase.include?(expected) }
  when 'contains'
    ->(expected, actual) { actual.include?(expected) }
  when 'regex'
    ->(expected, actual) { !Regexp.new(expected).match(actual).nil? }
  else
    @logger.warn("Matcher #{name} is not supported.")
    ->(_e, _a) { false }
  end
end
redact(params, secret_values) click to toggle source
# File lib/instana/secrets.rb, line 33
def redact(params, secret_values)
  params.map do |k, v|
    needs_redaction = secret_values['list']
      .any? { |t| matcher(secret_values['matcher']).(t,k) }
    [k, needs_redaction ? '<redacted>' : v]
  end
end