Class: PiiScrubber::Detectors::DatabaseUrl

Inherits:
Base
  • Object
show all
Defined in:
lib/pii_scrubber/detectors/database_url.rb

Constant Summary collapse

DATABASE_URL_REGEX =

Matches connection strings with embedded user/password credentials

/\b(?:postgres(?:ql)?|mysql2?|mongodb(?:\+srv)?|rediss?|amqps?|mssql|sqlserver):\/\/(?:[^:\s\/]+:)?(?:[^@\s\/]+)@[^\s\/:]+(?::\d+)?(?:\/[^\s"']*)?/i

Instance Attribute Summary

Attributes inherited from Base

#name

Instance Method Summary collapse

Constructor Details

#initializeDatabaseUrl

Returns a new instance of DatabaseUrl.



11
12
13
# File 'lib/pii_scrubber/detectors/database_url.rb', line 11

def initialize
  super(name: :database_url)
end

Instance Method Details

#patternsObject



15
16
17
# File 'lib/pii_scrubber/detectors/database_url.rb', line 15

def patterns
  [DATABASE_URL_REGEX]
end

#replace(match, strategy: :placeholder, mask_char: "*", hmac_salt: nil) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/pii_scrubber/detectors/database_url.rb', line 24

def replace(match, strategy: :placeholder, mask_char: "*", hmac_salt: nil)
  case strategy
  when :mask
    # Mask password while preserving scheme, username, host and database
    match.sub(%r{://(?:([^:@\s/]+):)?([^@\s/]+)@}) do
      user_part = $1 ? "#{$1}:" : ""
      "://#{user_part}#{mask_char * 8}@"
    end
  when :placeholder
    "[REDACTED:DATABASE_URL]"
  else
    super
  end
end

#valid?(match) ⇒ Boolean

Returns:

  • (Boolean)


19
20
21
22
# File 'lib/pii_scrubber/detectors/database_url.rb', line 19

def valid?(match)
  # Ensure it contains @ separating credentials from host
  match.include?("@") && match.include?("://")
end