codecal 0.3.4 → 0.3.5
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 +4 -4
- data/README.md +24 -6
- data/lib/codecal/version.rb +1 -1
- data/lib/codecal.rb +52 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e32f1544c510923cea8b7246837c64df210c6807
|
4
|
+
data.tar.gz: 78547689fc699e5bbe6db36cb312296d54ea763f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb6d8219dbe9f58e283e3e56283d24b96df31bf1ca21e7e5baad32dd26fbbccc19c690bf2ea37617605a02b63081c3211354e2ed03217d215ff87dcc4cf11702
|
7
|
+
data.tar.gz: 93548ea3c0816d99ca6fd234e3c9179e3270b9d7ee2044c5f1f6eed4a5ac23c5e06870cd3d52c07dcf8e2f7df12ff3c375872a1056ee2760411340339df2bdf8
|
data/README.md
CHANGED
@@ -21,22 +21,32 @@ require 'codecal'
|
|
21
21
|
|
22
22
|
# Generate customer code for user account
|
23
23
|
# Parameters:
|
24
|
-
#
|
25
|
-
# currency : String
|
24
|
+
# number : Integer(<=9) -- code to be calculated and masked
|
25
|
+
# currency : String --currency name
|
26
26
|
# Return: Hash
|
27
27
|
# success : boolean -- generate customer code success
|
28
28
|
# customer code : String -- 16 numbers string when success == true
|
29
29
|
# error : String -- error message of parameters when success == false
|
30
|
-
Codecal.bank_customer_code_generate(
|
30
|
+
Codecal.bank_customer_code_generate(number, currency)
|
31
31
|
|
32
32
|
# Generate simple code for account
|
33
33
|
# Parameters:
|
34
|
-
#
|
34
|
+
# number : Integer(<=9) -- code to be calculated and masked
|
35
35
|
# Return: Hash
|
36
36
|
# success : boolean -- generate customer code success
|
37
|
-
# customer code : String -- numbers(
|
37
|
+
# customer code : String -- numbers(number.length + 1) string when success == true
|
38
38
|
# error : String -- error message of parameters when success == false
|
39
|
-
Codecal.simple_code_generate(
|
39
|
+
Codecal.simple_code_generate(number)
|
40
|
+
|
41
|
+
# Generate masked code for account
|
42
|
+
# Parameters:
|
43
|
+
# mask : String(>=6) -- mask of letter or number
|
44
|
+
# number : Integer(<=9) -- code to be calculated and masked
|
45
|
+
# Return: Hash
|
46
|
+
# success : boolean -- generate customer code success
|
47
|
+
# customer code : String -- combination of letter and number(number.length + 1) string when success == true
|
48
|
+
# error : String -- error message of parameters when success == false
|
49
|
+
Codecal.code_generate_with_mask(mask, number)
|
40
50
|
|
41
51
|
# Validate customer code
|
42
52
|
# Parameters:
|
@@ -52,6 +62,14 @@ Codecal.validate_bank_customer_code(String)
|
|
52
62
|
# valid : boolean
|
53
63
|
Codecal.validate_simple_code(String)
|
54
64
|
|
65
|
+
# Validate masked code
|
66
|
+
# Parameters:
|
67
|
+
# mask : String(>=6) -- mask of letter or number
|
68
|
+
# masked_code : String(>=6)
|
69
|
+
# Return:
|
70
|
+
# valid : boolean
|
71
|
+
Codecal.validate_masked_code(String)
|
72
|
+
|
55
73
|
# Get currency name
|
56
74
|
# Parameters:
|
57
75
|
# currency_code : String(4)
|
data/lib/codecal/version.rb
CHANGED
data/lib/codecal.rb
CHANGED
@@ -2,6 +2,7 @@ require "codecal/version"
|
|
2
2
|
require_relative "./code"
|
3
3
|
|
4
4
|
module Codecal
|
5
|
+
@@BASE_ALPHABET = ['o','a','3','p','9','h','b','2','q','i','1','c','4','r','7','j','s','5','d','t','8','k','u','e','v','l','w','f','x','6','m','y','0','g','z','n']
|
5
6
|
@@generate_seed = [2,7,5,3,8,9,5,9,1,6,7,3,5]
|
6
7
|
@@simple_seed = [5,4,6,2,3,1,5,4,6,2,3,1]
|
7
8
|
class<<self
|
@@ -29,7 +30,7 @@ module Codecal
|
|
29
30
|
errormsg += "parameter is nil. "
|
30
31
|
return {success:false, error: errormsg}
|
31
32
|
end
|
32
|
-
errormsg += "
|
33
|
+
errormsg += "the type of the code to be encrypted should be Integer. " unless account_id.to_i > 0
|
33
34
|
if errormsg.size == 0
|
34
35
|
cal_array = (account_id.to_i.to_s).split("").map! {|i| i.to_i}
|
35
36
|
{success:true,customer_code: simple_code_calculate(cal_array, @@simple_seed) }
|
@@ -38,6 +39,15 @@ module Codecal
|
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
42
|
+
def code_generate_with_mask(mask, account_id)
|
43
|
+
errormsg = "mark should be string of letter or number and length should >= 5" if !mask.is_a?(String) || mask.size < 6 || !all_letters_or_digits(mask)
|
44
|
+
return {success:false, error: errormsg} if errormsg
|
45
|
+
result = simple_code_generate(account_id)
|
46
|
+
return result unless result[:success]
|
47
|
+
offset = get_mask_offset(mask)
|
48
|
+
{success:true, customer_code: mask_code(offset, result[:customer_code])}
|
49
|
+
end
|
50
|
+
|
41
51
|
def validate_bank_customer_code(customer_code)
|
42
52
|
return false unless customer_code && customer_code.is_a?(String) && customer_code.size == 16
|
43
53
|
calcode = code_calculate(customer_code[0..12].split("").map! {|i| i.to_i}, @@generate_seed)
|
@@ -50,6 +60,15 @@ module Codecal
|
|
50
60
|
return simple_code == calcode
|
51
61
|
end
|
52
62
|
|
63
|
+
def validate_masked_code(mask, masked_code)
|
64
|
+
return false unless masked_code.is_a?(String) && masked_code.size > 5
|
65
|
+
return false if !mask.is_a?(String) || mask.size < 6 || !all_letters_or_digits(mask)
|
66
|
+
offset = get_mask_offset(mask)
|
67
|
+
result = simple_code_generate(unmask_code(offset, masked_code))
|
68
|
+
return false unless result[:success]
|
69
|
+
return masked_code == mask_code(offset, result[:customer_code])
|
70
|
+
end
|
71
|
+
|
53
72
|
def get_currency_name(currency_code)
|
54
73
|
return nil if !currency_code || currency_code.size !=4 || !currency_code.is_a?(String)
|
55
74
|
return Code.new.get_name(currency_code)
|
@@ -65,5 +84,37 @@ module Codecal
|
|
65
84
|
code = array.reverse.each_with_index.inject(0){|count, (i, index)| count += i*( index < 11 ? seed.reverse[index + 1] : (index+1).times.inject(1) {|c| c *= 3} % 7 ) }
|
66
85
|
return (array.join + ( code % 7 ).to_s).to_i.to_s
|
67
86
|
end
|
87
|
+
|
88
|
+
def mask_code(offset, code)
|
89
|
+
code_arr = code.size > 5 ? code.split("") : ("%06d" % code).split("")
|
90
|
+
start_code = code_arr.pop
|
91
|
+
masked_code = code_arr.each_with_index.inject([]) do |code, (c, i)|
|
92
|
+
code.push(@@BASE_ALPHABET[(@@BASE_ALPHABET.find_index(c) + offset[ i % offset.size ]) % @@BASE_ALPHABET.size])
|
93
|
+
end
|
94
|
+
masked_code.unshift(start_code).join
|
95
|
+
end
|
96
|
+
|
97
|
+
def unmask_code(offset, masked_code)
|
98
|
+
code = masked_code[1..-1].split("").each_with_index.inject([]) do |code, (c, i)|
|
99
|
+
code.push(@@BASE_ALPHABET[(@@BASE_ALPHABET.find_index(c) - offset[ i % offset.size ]) % @@BASE_ALPHABET.size])
|
100
|
+
end
|
101
|
+
code.join.to_i
|
102
|
+
end
|
103
|
+
|
104
|
+
def get_mask_offset(mask)
|
105
|
+
mask.split("").inject([]) do |offset,c|
|
106
|
+
[[*'a'..'z', *'0'..'9'], [*'A'..'Z', *'0'..'9']].each do |m|
|
107
|
+
if m.include?(c)
|
108
|
+
offset.push(m.find_index(c))
|
109
|
+
break
|
110
|
+
end
|
111
|
+
end
|
112
|
+
offset
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def all_letters_or_digits(str)
|
117
|
+
str[/[a-zA-Z0-9]+/] == str
|
118
|
+
end
|
68
119
|
end
|
69
120
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: codecal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roger Fang
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|