credit_card_sanitizer 0.2.9 → 0.2.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/credit_card_sanitizer.rb +25 -8
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 574fcfaf9b82cc2617ae1750082fffe1efdf1246
4
- data.tar.gz: b08607f178dfb6b92f8912c3c901378bdb4813c5
3
+ metadata.gz: 9dc65743cee097af71731792951b75869f841751
4
+ data.tar.gz: 48b148cfc9d284e39b8aee68bb5e66806395983d
5
5
  SHA512:
6
- metadata.gz: 17b1ffd1c3fc8eebd4b8866a8e076f4cf0f31d1fbf7848a1dc841a0a06373d560c2780a25be8d8dd1002e7a641d52413b9da4b63acc1df426604f76578552944
7
- data.tar.gz: 2769dc096fcda750ed50bfabb761242b8fd535b2728a7ca2e6f6dfa0223e2ee11f626d9333b435bf897a6adde9a23fc73137f54f7fc17d1b353f973bbdc93e8d
6
+ metadata.gz: 2eeb65e7811c1e45ba55c173eb5eca6ffc92c9cd935048e063ab195f33be0e29315a75f103844978640be680153ccf340b7128d8d3ca57e3ff4f649a44832d79
7
+ data.tar.gz: 7c2a97ff0c1bfe2a2cffe1a708461659e714491e68baa8920efc7f4a4392959f831823e49e46dcba2938b9803ac6ee8204a0d2e40b4aab2d51b36b22250d030d
@@ -4,9 +4,26 @@ require 'luhn_checksum'
4
4
 
5
5
  class CreditCardSanitizer
6
6
 
7
- LINE_NOISE = /[^\w_\n,()\/:]{0,8}/x
7
+ LINE_NOISE = /[^\w_\n,()\/:]{0,8}/
8
8
  # 12-19 digits explanation: https://en.wikipedia.org/wiki/Primary_Account_Number#Issuer_identification_number_.28IIN.29
9
- NUMBERS_WITH_LINE_NOISE = /\d(?:#{LINE_NOISE}\d#{LINE_NOISE}){10,17}\d/x
9
+ NUMBERS_WITH_LINE_NOISE = /\d(?:#{LINE_NOISE}\d#{LINE_NOISE}){10,17}\d/
10
+
11
+ # Taken from https://github.com/Shopify/active_merchant/blob/master/lib/active_merchant/billing/credit_card_methods.rb#L7-L20
12
+ CARD_COMPANIES = {
13
+ 'visa' => /^4\d{12}(\d{3})?$/,
14
+ 'master' => /^(5[1-5]\d{4}|677189)\d{10}$/,
15
+ 'discover' => /^(6011|65\d{2}|64[4-9]\d)\d{12}|(62\d{14})$/,
16
+ 'american_express' => /^3[47]\d{13}$/,
17
+ 'diners_club' => /^3(0[0-5]|[68]\d)\d{11}$/,
18
+ 'jcb' => /^35(28|29|[3-8]\d)\d{12}$/,
19
+ 'switch' => /^6759\d{12}(\d{2,3})?$/,
20
+ 'solo' => /^6767\d{12}(\d{2,3})?$/,
21
+ 'dankort' => /^5019\d{12}$/,
22
+ 'maestro' => /^(5[06-8]|6\d)\d{10,17}$/,
23
+ 'forbrugsforeningen' => /^600722\d{10}$/,
24
+ 'laser' => /^(6304|6706|6709|6771(?!89))\d{8}(\d{4}|\d{6,7})?$/
25
+ }
26
+ VALID_COMPANY_PREFIXES = Regexp.union(*CARD_COMPANIES.values)
10
27
 
11
28
  def self.parameter_filter
12
29
  Proc.new { |_, value| new.sanitize!(value) if value.is_a?(String) }
@@ -24,7 +41,7 @@ class CreditCardSanitizer
24
41
  text.gsub!(NUMBERS_WITH_LINE_NOISE) do |match|
25
42
  numbers = match.gsub(/\D/, '')
26
43
 
27
- if LuhnChecksum.valid?(numbers)
44
+ if LuhnChecksum.valid?(numbers) && valid_prefix?(numbers)
28
45
  replaced = true
29
46
  replace_numbers!(match, numbers.size - @replace_last)
30
47
  end
@@ -35,6 +52,10 @@ class CreditCardSanitizer
35
52
  replaced && text
36
53
  end
37
54
 
55
+ def valid_prefix?(numbers)
56
+ !!(numbers =~ VALID_COMPANY_PREFIXES)
57
+ end
58
+
38
59
  private
39
60
 
40
61
  def replace_numbers!(text, replacement_limit)
@@ -56,7 +77,7 @@ class CreditCardSanitizer
56
77
  str.force_encoding(Encoding::UTF_8)
57
78
  str.scrub! unless str.valid_encoding?
58
79
  end
59
- elsif ''.respond_to?(:encoding)
80
+ else
60
81
  def to_utf8!(str)
61
82
  str.force_encoding(Encoding::UTF_8)
62
83
  unless str.valid_encoding?
@@ -64,9 +85,5 @@ class CreditCardSanitizer
64
85
  str.encode!(Encoding::UTF_8, Encoding::UTF_16)
65
86
  end
66
87
  end
67
- else
68
- def to_utf8!(str)
69
- # No-op for Ruby 1.8
70
- end
71
88
  end
72
89
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: credit_card_sanitizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.9
4
+ version: 0.2.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Chapweske
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-09-30 00:00:00.000000000 Z
13
+ date: 2014-10-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: appraisal