59 lines
1.6 KiB
Plaintext
59 lines
1.6 KiB
Plaintext
from PDAPI import *
|
|
|
|
TOTP_CONFIG = {
|
|
"digits": 6,
|
|
"interval": 30,
|
|
}
|
|
|
|
|
|
__metadata__ = {
|
|
"methods": ["GET"],
|
|
"blueprint": "GERP",
|
|
"permission": 1.0,
|
|
"attributes": [],
|
|
"limit": "1 per second",
|
|
}
|
|
|
|
def HandleRequest(_CleanedData):
|
|
current_user = UGM.GetELTUser()
|
|
if not current_user:
|
|
return {"code": 401, "msg": "未登录"}, 401
|
|
|
|
existing = GERPUser2FA.query.filter(GERPUser2FA.UserUUID == current_user.UserUUID).first()
|
|
|
|
if existing and existing.IsEnabled == 1:
|
|
return {"code": 1, "msg": "2FA已启用,请先禁用后再重新设置"}, 200
|
|
|
|
Secret = pyotp.random_base32()
|
|
Totp = pyotp.TOTP(Secret, digits=TOTP_CONFIG["digits"], interval=TOTP_CONFIG["interval"])
|
|
QrUrl = Totp.provisioning_uri(
|
|
f"{current_user.UserName} / {current_user.UserEmail}",
|
|
issuer_name=f"GVSDS - {current_user.UserName}",
|
|
image="https://www.gvsds.com/assets/hlogos/nobg.png"
|
|
)
|
|
QrImg = qrcode.make(QrUrl)
|
|
ImgBuffer = BytesIO()
|
|
QrImg.save(ImgBuffer, format='PNG')
|
|
ImgBuffer.seek(0)
|
|
|
|
if existing:
|
|
existing.SecretKey = Secret
|
|
existing.Verified = 0
|
|
existing.IsEnabled = 0
|
|
else:
|
|
new_2fa = GERPUser2FA()
|
|
new_2fa.User2FAUUID = NewBUUID()
|
|
new_2fa.UserUUID = current_user.UserUUID
|
|
new_2fa.SecretKey = Secret
|
|
new_2fa.Verified = 0
|
|
new_2fa.IsEnabled = 0
|
|
db.session.add(new_2fa)
|
|
|
|
try:
|
|
db.session.commit()
|
|
except:
|
|
db.session.rollback()
|
|
return {"code": 1, "msg": "SQL 提交失败"}, 200
|
|
|
|
return flask.Response(ImgBuffer.getvalue(), mimetype='image/png')
|