File size: 3,140 Bytes
ba2906a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import lodash from 'lodash'

export class GTest extends plugin {
  constructor () {
    super({
      name: 'GTest',
      dsc: '手动过码',
      route: '/GTest',
      rule: [
        {
          method: 'get',
          path: '/:key',
          fnc: 'index'
        },
        {
          method: 'get',
          path: '/validate/:key',
          fnc: 'result'
        },
        {
          method: 'get',
          path: '/register/:key',
          fnc: 'get_register'
        },
        {
          method: 'post',
          path: '/register',
          fnc: 'register'
        },
        {
          method: 'post',
          path: '/validate/:key',
          fnc: 'validate'
        }
      ]
    })
  }

  index () {
    let copyright = GTest.cfg.Copyright
    let { key } = this.params
    if (!key || !GTest.users[key]) return this.error('验证信息不存在或已失效。')
    this.render('GTest', { key, copyright })
  }

  register () {
    let { gt, challenge, key } = this.params
    if (GTest.cfg.REGISTER_KEY && key !== GTest.cfg.REGISTER_KEY) return this._send(null, 'please enter the correct key')
    if (!(gt && challenge)) return this.error()
    key = GTest.randomKey(6, GTest.users, { register: this.params })
    setTimeout(() => delete GTest.users[key], 150000)
    this._send({
      link: `${Server.cfg.http.PUBLIC_ADDRESS}${this.route}/${key}`,
      result: `${Server.cfg.http.PUBLIC_ADDRESS}${this.route}/validate/${key}`
    })
  }

  async result () {
    let { key } = this.params
    if (!key) return this.error()
    let data = null
    if (GTest.users[key]) {
      for (let i = 0; i < 240; i++) {
        let result = GTest.users[key]?.result
        if (result) {
          data = result
          break
        }
        await this.sleep(500)
      }
      if (!data) data = {}
      delete GTest.users[key]
    }
    this._send(data)
  }

  /** 浏览器返回Validate */
  validate () {
    let { key } = this.params
    if (!key || !GTest.users[key]) return this.error()
    GTest.users[key].result = this.body
    setTimeout(() => delete GTest.users[key], 30000)
    this._send({})
    logger.info(`[GTest] 验证成功, KEY: ${key}`)
  }

  /** 浏览器获取gt参数 */
  get_register () {
    let { key } = this.params
    if (!key || !GTest.users[key]) return this.error()
    let info = GTest.users[key].register
    if (!info) return this._send(null, '该验证信息已被使用,若非本人操作请重新获取')
    this.send(info)
    delete GTest.users[key].register
  }

  _send (data, message = 'OK') {
    return this.send({
      status: Number(!data),
      message,
      data
    })
  }

  static get cfg () {
    if (!this.users) this.users = {}
    if (!this.clients) this.clients = {}
    return Server.cfg.getConfig('page/GTest', false)
  }

  static randomKey (length, checkObj, data) {
    let letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    let key = lodash.sampleSize(letters, length).join('')
    while (checkObj[key]) {
      key = lodash.sampleSize(letters, length).join('')
    }
    checkObj[key] = data || {}
    return key
  }
}