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 */ 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}`) } /** 浏览器获取gt参数 */ 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 } }