Class: GtRubySdk::LocalServer

Inherits:
Object
  • Object
show all
Defined in:
lib/gt_ruby_sdk/local_server.rb

Constant Summary collapse

TOLERANCE =
4

Class Method Summary collapse

Class Method Details

.decode(challenge, code_fragment) ⇒ Object

解码随机参数



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/gt_ruby_sdk/local_server.rb', line 50

def decode(challenge, code_fragment)
  return 0 if code_fragment.length > 100

  hash = {}
  duplicated_array = []
  numbers = [1, 2, 5, 10, 50]
  count = 0

  challenge.chars.each do |item|
    next if duplicated_array.include?(item)

    value = numbers[count % 5]
    duplicated_array.push(item)
    count += 1

    hash[item] = value
  end

  offset = decode_offset(challenge[32..33])
  code_fragment.chars.inject(0) { |_acc, elem| +hash[elem] } - offset
end

.decode_offset(number) ⇒ Object

输入的两位的随机数字,解码出偏移量



73
74
75
76
77
78
79
80
81
# File 'lib/gt_ruby_sdk/local_server.rb', line 73

def decode_offset(number)
  number = number[0..1]

  array = number.codepoints.to_a.map do |codepoint|
    codepoint > 57 ? (codepoint - 87) : (codepoint - 48)
  end

  array[0] * 36 + array[1]
end

.registerObject



8
9
10
11
12
13
14
15
16
# File 'lib/gt_ruby_sdk/local_server.rb', line 8

def register
  rnd1 = Digest::MD5.hexdigest(Random.rand(100).to_s)
  rnd2 = Digest::MD5.hexdigest(Random.rand(100).to_s)

  [
    rnd1,
    rnd2.to_s[0..1]
  ].join
end

.validate(challenge, pin_code, _seccode) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/gt_ruby_sdk/local_server.rb', line 18

def validate(challenge, pin_code, _seccode)
  return false if pin_code.blank?

  code_fragments = pin_code.split('_')

  ans = decode(challenge, code_fragments[0])
  bg_image_index = decode(challenge, code_fragments[1])
  image_grp_index = decode(challenge, code_fragments[2])

  validate_image(ans, bg_image_index, image_grp_index)
end

.validate_image(ans, bg_image_index, image_grp_index) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/gt_ruby_sdk/local_server.rb', line 30

def validate_image(ans, bg_image_index, image_grp_index)
  full_bg_name = Digest::MD5.hexdigest(bg_image_index.to_s)[0..8]
  bg_name = Digest::MD5.hexdigest(image_grp_index.to_s)[10..18]

  array = 9.times.inject([]) do |collector, i|
    collector.push(
      i.odd? ? bg_name[i] : full_bg_name[i]
    )
  end

  x_decode = array[4..-1].join
  x_int = x_decode.to_i(16)

  result = x_int % 200
  result = result < 40 ? 40 : result

  (ans - result).abs < 4
end