Sha256: 150bd828bd9c43717277869da2ed007250fc8743159e5aefacee4629725dfab1

Contents?: true

Size: 1.11 KB

Versions: 10

Compression:

Stored size: 1.11 KB

Contents

# frozen_string_literal: true

class MiniDefender::Rules::Iban < MiniDefender::Rule
  LENGTH_MATRIX = {
    'SA' => 24
  }

  REPLACEMENTS = {
    'A' => '10', 'B' => '11', 'C' => '12', 'D' => '13', 'E' => '14', 'F' => '15',
    'G' => '16', 'H' => '17', 'I' => '18', 'J' => '19', 'K' => '20', 'L' => '21',
    'M' => '22', 'N' => '23', 'O' => '24', 'P' => '25', 'Q' => '26', 'R' => '27',
    'S' => '28', 'T' => '29', 'U' => '30', 'V' => '31', 'W' => '32', 'X' => '33',
    'Y' => '34', 'Z' => '35'
  }

  def self.signature
    'iban'
  end

  def coerce(value)
    value.to_s.upcase.gsub(/\s/, '')
  end

  def passes?(attribute, value, validator)
    value = coerce(value)
    value.match?(/[A-Z]{2}\d+/i) && valid_length?(value) && valid_checksum?(value)
  end

  def valid_checksum?(iban)
    iban = "#{iban[4..]}#{iban[0..1]}#{iban[2..3]}"
    iban = iban.gsub(Regexp.union(REPLACEMENTS.keys), REPLACEMENTS)
    iban.to_i % 97 === 1
  end

  def valid_length?(iban)
    iban.length == (LENGTH_MATRIX[iban[0..1]] || iban.length)
  end

  def message(attribute, value, validator)
    "The value should be a valid IBAN."
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
mini_defender-0.6.8 lib/mini_defender/rules/iban.rb
mini_defender-0.6.7 lib/mini_defender/rules/iban.rb
mini_defender-0.6.5 lib/mini_defender/rules/iban.rb
mini_defender-0.6.4 lib/mini_defender/rules/iban.rb
mini_defender-0.6.3 lib/mini_defender/rules/iban.rb
mini_defender-0.6.2 lib/mini_defender/rules/iban.rb
mini_defender-0.6.1 lib/mini_defender/rules/iban.rb
mini_defender-0.6.0 lib/mini_defender/rules/iban.rb
mini_defender-0.5.8 lib/mini_defender/rules/iban.rb
mini_defender-0.5.7 lib/mini_defender/rules/iban.rb