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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 219b4b4f7674fefcea2b9d1fc485cf5dfd983e42
4
- data.tar.gz: 99080cf9c671959042ab6c7b9eba25d183d79de0
3
+ metadata.gz: e32f1544c510923cea8b7246837c64df210c6807
4
+ data.tar.gz: 78547689fc699e5bbe6db36cb312296d54ea763f
5
5
  SHA512:
6
- metadata.gz: 24c7389520d4517d7f88a4ddd0e48548f7babb7c44d71030f4ef9f0e04c6e08a9ff37f79b9cf300efd087f8b58ae5dcd9e6096be6662816b17d6ed98006bb2cb
7
- data.tar.gz: a6c2d78e065e99eddabae2e0b9234b08c54274ab7d8b670463b2764ed5e5369c0074bc9792e8d882f9cbc77258a36bba04584803c30ce72f165ec858dc83eca4
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
- # account_id : Integer(<=9) --user account_id in acx
25
- # currency : String --currency name
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(account_id, currency)
30
+ Codecal.bank_customer_code_generate(number, currency)
31
31
 
32
32
  # Generate simple code for account
33
33
  # Parameters:
34
- # account_id : Integer(<=9) --user account_id in acx
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(account_id.length + 1) string when success == true
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(account_id)
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)
@@ -1,3 +1,3 @@
1
1
  module Codecal
2
- VERSION = "0.3.4"
2
+ VERSION = "0.3.5"
3
3
  end
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 += "parameter 1 type should be Integer. " unless account_id.to_i > 0
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
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-14 00:00:00.000000000 Z
11
+ date: 2017-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler