49 lines
1.4 KiB
Plaintext
49 lines
1.4 KiB
Plaintext
from PDAPI import *
|
|
|
|
TOTP_CONFIG = {
|
|
"digits": 6,
|
|
"interval": 30,
|
|
}
|
|
|
|
|
|
__metadata__ = {
|
|
"methods": ["POST"],
|
|
"blueprint": "GERP",
|
|
"permission": 1.0,
|
|
"attributes": [],
|
|
"limit": "5 per minute",
|
|
"form": [
|
|
{"Name": "token", "Type": "str", "MaxLen": 6}
|
|
]
|
|
}
|
|
|
|
def HandleRequest(_CleanedData):
|
|
current_user = UGM.GetELTUser()
|
|
if not current_user:
|
|
return {"code": 401, "msg": "未登录"}, 401
|
|
|
|
Token = _CleanedData["form"].get("token", "").strip()
|
|
if not Token or len(Token) != 6:
|
|
return {"code": 1, "msg": "请输入6位验证码"}, 200
|
|
|
|
existing = GERPUser2FA.query.filter(GERPUser2FA.UserUUID == current_user.UserUUID).first()
|
|
if not existing:
|
|
return {"code": 1, "msg": "未找到2FA记录,请先获取二维码"}, 200
|
|
|
|
if existing.IsEnabled == 1:
|
|
return {"code": 1, "msg": "2FA已启用"}, 200
|
|
|
|
Totp = pyotp.TOTP(existing.SecretKey, digits=TOTP_CONFIG["digits"], interval=TOTP_CONFIG["interval"])
|
|
if Totp.verify(Token, valid_window=1):
|
|
existing.IsEnabled = 1
|
|
existing.Verified = 1
|
|
existing.LastUsedAt = datetime.datetime.now(Timezone_CN)
|
|
try:
|
|
db.session.commit()
|
|
return {"code": 0, "msg": "2FA设置成功"}, 200
|
|
except:
|
|
db.session.rollback()
|
|
return {"code": 1, "msg": "SQL 提交失败"}, 200
|
|
|
|
return {"code": 1, "msg": "验证码错误,请重试"}, 200
|