| import lodash from 'lodash' |
|
|
| let tmp = {} |
|
|
| 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 { key } = this.params |
| if (!key || !tmp[key]) return this.error('验证信息不存在或已失效。') |
| this.render('GTest/main', { key, copyright: this.cfg.Copyright }) |
| } |
|
|
| register () { |
| if (this.cfg.Key && this.query.key !== this.cfg.Key) return this._send(null, 'please enter the correct key') |
| let { gt, challenge } = this.body || {} |
| if (!gt || !challenge) return this.error() |
| let key = this.randomKey(6, tmp, { register: this.params }) |
| setTimeout(() => delete tmp[key], 150000) |
| this._send({ |
| link: `${this.address}/${key}`, |
| result: `${this.address}/validate/${key}` |
| }) |
| } |
|
|
| async result () { |
| let { key } = this.params |
| if (!key) return this.error() |
|
|
| let data = null |
| if (tmp[key]) { |
| for (let i = 0; i < 240; i++) { |
| let result = tmp[key]?.result |
| if (result) { |
| data = result |
| break |
| } |
| await this.sleep(500) |
| } |
| if (!data) data = {} |
| delete tmp[key] |
| } |
| this._send(data) |
| } |
|
|
| |
| validate () { |
| let { key } = this.params |
| if (!key || !tmp[key]) return this.error() |
| tmp[key].result = this.body |
| setTimeout(() => delete tmp[key], 30000) |
| this._send({}) |
| logger.info(`[GTest] 验证成功, KEY: ${key}`) |
| } |
|
|
| |
| get_register () { |
| let { key } = this.params |
| if (!key || !tmp[key]) return this.error() |
| let info = tmp[key].register |
| if (!info) return this._send(null, '该验证信息已被使用,若非本人操作请重新获取') |
| this.send(info) |
| delete tmp[key].register |
| } |
|
|
| _send (data, message = 'OK') { |
| return this.send({ |
| status: Number(!data), |
| message, |
| data |
| }) |
| } |
|
|
| get cfg () { |
| return Server.cfg.getConfig('GTest') |
| } |
|
|
| get address () { |
| let { Host, Key } = this.cfg |
| let protocol = Server.cfg.http.HTTPS ? 'https' : 'http' |
| let port = Server.cfg.http_listen[0] |
| if (![80, 443].includes(port)) Host += `:${port}` |
| return `${protocol}://${Host}${this.route}` |
| } |
|
|
| 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 |
| } |
| } |