Sha256: c5b460ad01fc2f74928f1369e57f38d9aaec34979745e2ffd6a8916f215a776f
Contents?: true
Size: 851 Bytes
Versions: 26
Compression:
Stored size: 851 Bytes
Contents
# frozen_string_literal: true class MiniDefender::Rules::Iban < MiniDefender::Rule LENGTH_MATRIX = { 'SA' => 24 } 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..]}#{letter_code(iban[0])}#{letter_code(iban[1])}#{iban[2..3]}".to_i iban % 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 private def letter_code(letter) # letter is assumed to be an upcase ASCII alphabet letter (A-Z) letter.ord - 55 end end
Version data entries
26 entries across 26 versions & 1 rubygems