Class: PiiScrubber::Detectors::CanadianSin

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

Constant Summary collapse

SIN_REGEX =

Matches 9-digit Canadian Social Insurance Numbers (e.g. 046-454-286, 046 454 286, 046454286)

/\b[0-9]{3}[ -]?[0-9]{3}[ -]?[0-9]{3}\b/

Instance Attribute Summary

Attributes inherited from Base

#name

Instance Method Summary collapse

Constructor Details

#initializeCanadianSin

Returns a new instance of CanadianSin.



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

def initialize
  super(name: :canadian_sin)
end

Instance Method Details

#patternsObject



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

def patterns
  [SIN_REGEX]
end

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



29
30
31
32
33
34
35
36
37
# File 'lib/pii_scrubber/detectors/canadian_sin.rb', line 29

def replace(match, strategy: :placeholder, mask_char: "*", hmac_salt: nil)
  return super unless strategy == :mask

  digits = match.scan(/\d/)
  return super if digits.size != 9

  last_three = digits.last(3).join
  "#{mask_char * 3}-#{mask_char * 3}-#{last_three}"
end

#valid?(match) ⇒ Boolean

Returns:

  • (Boolean)


19
20
21
22
23
24
25
26
27
# File 'lib/pii_scrubber/detectors/canadian_sin.rb', line 19

def valid?(match)
  digits = match.scan(/\d/).map(&:to_i)
  return false unless digits.size == 9

  # First digit cannot be 0 or 8 in valid Canadian SINs
  return false if [0, 8].include?(digits.first)

  luhn_valid?(digits)
end