verified 0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/lib/verified/check.rb +57 -58
- data/lib/verified.rb +18 -4
- metadata +4 -5
- data/lib/verified/checkdigit.rb +0 -18
checksums.yaml
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
!binary "U0hBMQ==":
|
|
3
3
|
metadata.gz: !binary |-
|
|
4
|
-
|
|
4
|
+
NTBlOTVlZGYzZDllNjI0NjU3OTI0OWFkZDY3YzNiYTNjODQyMWVlMg==
|
|
5
5
|
data.tar.gz: !binary |-
|
|
6
|
-
|
|
6
|
+
ODdjMGUyOWEzZTIzNzdlMTQ1MDY3ZWRmYWY3MjE1YzVjMDlhMjhiYQ==
|
|
7
7
|
SHA512:
|
|
8
8
|
metadata.gz: !binary |-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
ZGZlN2JlNWQ4NTk5ODBjZWM5ZDYwMzRmZDc0M2M3MTQ3NGE2ZDk2YzEyNWM0
|
|
10
|
+
N2I2OWY4Njg0N2Y5MzIyN2M4YzZkOWI0MjcxMmFiMThjMGE3YmJjZjQxZTAx
|
|
11
|
+
NGVkMmE0Nzk2YjhhNWY2ZmRiY2I3NDY5NjZmYmUwMGI0NmQyOGU=
|
|
12
12
|
data.tar.gz: !binary |-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
MjIyOWU4ZDdkNzJjMjA3Yjk4MmVlNDYzNGMwYWI4ZDE2N2M3ODZiOGQ0ODRm
|
|
14
|
+
Yzg0OGMwNDg2ODY3YThlZDViNDk0ODM2NDdiM2I4MWU2ZDIwYzk0ZThjMDFj
|
|
15
|
+
MTViMTAyYzIzM2E1MjhiMGI3ODI0ZTM2NzAyYTU4ZmI4NWIxNTg=
|
data/lib/verified/check.rb
CHANGED
|
@@ -1,67 +1,66 @@
|
|
|
1
1
|
class Check
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
2
|
+
def check(mrz_line_1, mrz_line_2)
|
|
3
|
+
#make a new digit checker
|
|
4
|
+
@@digit_checker = CheckDigit.new
|
|
5
|
+
#string manipulation to simply reading the first line
|
|
6
|
+
split = mrz_line_1.gsub(/<+/, '<').split('<')
|
|
7
|
+
#get data unformatted from passport
|
|
8
|
+
doc_data = Hash.new(9)
|
|
9
|
+
#first line of MRZ
|
|
10
|
+
doc_data["IssuingState"] = mrz_line_1[2...5]
|
|
11
|
+
doc_data["LastName"] = split[1][3..-1]
|
|
12
|
+
doc_data["FirstNames"] = split[2..-1]
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
#second line of MRZ
|
|
15
|
+
doc_data["Number"] = mrz_line_2[0...9]
|
|
16
|
+
doc_data["Nationality"] = mrz_line_2[10...13]
|
|
17
|
+
doc_data["DateOfBirth"] = mrz_line_2[13...19]
|
|
18
|
+
doc_data["Gender"] = mrz_line_2[20]
|
|
19
|
+
doc_data["ExpiryDate"] = mrz_line_2[21...27]
|
|
20
|
+
doc_data["PersonalNumber"] = mrz_line_2[28...42]
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
#mrz given check digits
|
|
23
|
+
doc_check = Array.new
|
|
24
|
+
doc_check[0] = mrz_line_2[9].to_s
|
|
25
|
+
doc_check[1] = mrz_line_2[19].to_s
|
|
26
|
+
doc_check[2] = mrz_line_2[27].to_s
|
|
27
|
+
doc_check[3] = mrz_line_2[42].to_s
|
|
28
|
+
doc_check[4] = mrz_line_2[43].to_s
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
#calculate our own check digits
|
|
31
|
+
our_check = Array.new
|
|
32
|
+
our_check[0] = @@digit_checker.check_calc(mrz_line_2[0...9])
|
|
33
|
+
our_check[1] = @@digit_checker.check_calc(mrz_line_2[13...19])
|
|
34
|
+
our_check[2] = @@digit_checker.check_calc(mrz_line_2[21...27])
|
|
35
|
+
our_check[3] = @@digit_checker.check_calc(mrz_line_2[28...42])
|
|
36
|
+
our_check[4] = @@digit_checker.check_calc(mrz_line_2[0...10]+mrz_line_2[13...20]+mrz_line_2[21...43])
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
end
|
|
38
|
+
#the 4th check digit can be either > or 0, we always return 0 from our CheckDigit calc.
|
|
39
|
+
#this basically changes our check to > so the true return can pass
|
|
40
|
+
if our_check[3] == "0" && doc_check[3] == "<"
|
|
41
|
+
our_check[3] = "<"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
return doc_data if doc_check.uniq.sort == our_check.uniq.sort
|
|
45
|
+
return false
|
|
46
|
+
end
|
|
48
47
|
end
|
|
49
48
|
|
|
50
49
|
class Check::CheckDigit
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
50
|
+
def check_calc(str)
|
|
51
|
+
str = str.strip.upcase
|
|
52
|
+
values = str.chars.map do |char|
|
|
53
|
+
case char
|
|
54
|
+
when '<'
|
|
55
|
+
0
|
|
56
|
+
when 'A'..'Z'
|
|
57
|
+
char.ord - 65 + 10
|
|
58
|
+
when '0'..'9'
|
|
59
|
+
char.ord - 48
|
|
60
|
+
else
|
|
61
|
+
raise "Unexpected character '#{char}'"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
return (values.zip([7,3,1].cycle).map{|(v,w)| v * w}.reduce(:+) % 10).to_s
|
|
65
|
+
end
|
|
67
66
|
end
|
data/lib/verified.rb
CHANGED
|
@@ -1,7 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
Verified = Class.new
|
|
2
|
+
class Verified::Passport
|
|
3
|
+
def initialize(mrz_line_1, mrz_line_2)
|
|
4
|
+
checker = Check.new
|
|
5
|
+
@data = checker.check(mrz_line_1, mrz_line_2)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def verified?
|
|
9
|
+
return false if @data == false
|
|
10
|
+
return true
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def method_missing(name, *args, &blk)
|
|
14
|
+
if args.empty? && blk.nil? && @data.has_key?(name.to_s)
|
|
15
|
+
@data[name.to_s]
|
|
16
|
+
else
|
|
17
|
+
super
|
|
18
|
+
end
|
|
5
19
|
end
|
|
6
20
|
end
|
|
7
21
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: verified
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ruby
|
|
@@ -10,8 +10,8 @@ bindir: bin
|
|
|
10
10
|
cert_chain: []
|
|
11
11
|
date: 2014-08-26 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
|
-
description: A simple gem to verify MRZ codes on passports. Useful if you
|
|
14
|
-
comply with KYC or Money Laundering ID checks.
|
|
13
|
+
description: A simple gem to verify and parse MRZ codes on passports. Useful if you
|
|
14
|
+
need to comply with KYC or Money Laundering ID checks.
|
|
15
15
|
email: ruby@mewmew.io
|
|
16
16
|
executables: []
|
|
17
17
|
extensions: []
|
|
@@ -19,7 +19,6 @@ extra_rdoc_files: []
|
|
|
19
19
|
files:
|
|
20
20
|
- lib/verified.rb
|
|
21
21
|
- lib/verified/check.rb
|
|
22
|
-
- lib/verified/checkdigit.rb
|
|
23
22
|
homepage: http://github.com/rubyisilluminati/verified
|
|
24
23
|
licenses:
|
|
25
24
|
- MIT
|
|
@@ -43,5 +42,5 @@ rubyforge_project:
|
|
|
43
42
|
rubygems_version: 2.4.1
|
|
44
43
|
signing_key:
|
|
45
44
|
specification_version: 4
|
|
46
|
-
summary: Really simple passport verification.
|
|
45
|
+
summary: Really simple passport parsing and verification.
|
|
47
46
|
test_files: []
|
data/lib/verified/checkdigit.rb
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
class CheckDigit
|
|
2
|
-
def check(str)
|
|
3
|
-
str = str.strip.upcase
|
|
4
|
-
values = str.chars.map do |char|
|
|
5
|
-
case char
|
|
6
|
-
when '<'
|
|
7
|
-
0
|
|
8
|
-
when 'A'..'Z'
|
|
9
|
-
char.ord - 65 + 10
|
|
10
|
-
when '0'..'9'
|
|
11
|
-
char.ord - 48
|
|
12
|
-
else
|
|
13
|
-
raise "Unexpected character '#{char}'"
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
return (values.zip([7,3,1].cycle).map{|(v,w)| v * w}.reduce(:+) % 10).to_s
|
|
17
|
-
end
|
|
18
|
-
end
|