verified 0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|