95 lines
4.3 KiB
Plaintext
95 lines
4.3 KiB
Plaintext
async def get_password_tenant_orgid(sor, ns):
|
||
domain_name = ns.get('domain_name')
|
||
if (not domain_name) and ns.get('url_link'):
|
||
domain_name = ns.get('url_link').split("//")[1].split("/")[0]
|
||
if domain_name:
|
||
domain_name = domain_name.strip().replace('https://', '').replace('http://', '').replace('/', '')
|
||
if 'localhost' in domain_name:
|
||
domain_name = 'dev.opencomputing.cn'
|
||
reseller = await sor.R('reseller', {'domain_name': domain_name, 'del_flg': '0'})
|
||
if len(reseller) >= 1:
|
||
return reseller[0]['orgid']
|
||
org = await sor.R('organization', {'org_type': '0', 'del_flg': '0'})
|
||
if len(org) >= 1:
|
||
return org[0]['id']
|
||
return None
|
||
|
||
async def forgotPassword(ns):
|
||
"""
|
||
忘记密码:校验短信验证码后重置密码。
|
||
|
||
参数:
|
||
id (str) 用户ID(找回验证码接口返回的 userid)
|
||
password (str) 新密码
|
||
codeid (str) 验证码ID
|
||
vcode (str) 验证码
|
||
|
||
也可传 mobile 或 username 定位用户(未传 id 时)。
|
||
"""
|
||
import re
|
||
import traceback
|
||
|
||
if not ns.get('password'):
|
||
return {'status': False, 'msg': '新密码不能为空'}
|
||
if len(ns.get('password')) < 8 or not re.search(r'[a-zA-Z]', ns.get('password')) or not re.search(r'[0-9]', ns.get('password')):
|
||
return {'status': False, 'msg': '密码至少8位,包含大小写字母、特殊字符、数字'}
|
||
if not ns.get('codeid'):
|
||
return {'status': False, 'msg': '验证码ID不能为空'}
|
||
if not ns.get('vcode'):
|
||
return {'status': False, 'msg': '验证码不能为空'}
|
||
|
||
db = DBPools()
|
||
async with db.sqlorContext('kboss') as sor:
|
||
try:
|
||
tenant_orgid = await get_password_tenant_orgid(sor, ns)
|
||
if not tenant_orgid:
|
||
return {'status': False, 'msg': '未找到当前域名所属租户'}
|
||
|
||
code = await sor.R('validatecode', {'id': ns.get('codeid'), 'vcode': ns.get('vcode')})
|
||
if code:
|
||
create_at = code[0]['create_at']
|
||
now = datetime.datetime.now()
|
||
create_at_dt = datetime.datetime.strptime(create_at, "%Y-%m-%d %H:%M:%S")
|
||
if (now - create_at_dt).seconds > 500:
|
||
return {'status': False, 'msg': '验证码过期'}
|
||
else:
|
||
return {'status': False, 'msg': '验证码不正确'}
|
||
|
||
user = None
|
||
if ns.get('id'):
|
||
user_sql = """select * from users where id = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('id'), tenant_orgid)
|
||
users = await sor.sqlExe(user_sql, {})
|
||
if users:
|
||
user = users[0]
|
||
elif ns.get('mobile'):
|
||
user_sql = """select * from users where mobile = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('mobile'), tenant_orgid)
|
||
users = await sor.sqlExe(user_sql, {})
|
||
if users:
|
||
user = users[0]
|
||
elif ns.get('username'):
|
||
user_sql = """select * from users where username = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('username'), tenant_orgid)
|
||
users = await sor.sqlExe(user_sql, {})
|
||
if not users:
|
||
user_sql = """select * from users where mobile = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('username'), tenant_orgid)
|
||
users = await sor.sqlExe(user_sql, {})
|
||
if users:
|
||
user = users[0]
|
||
else:
|
||
return {'status': False, 'msg': '用户标识不能为空'}
|
||
|
||
if not user:
|
||
return {'status': False, 'msg': '用户不存在'}
|
||
|
||
new_password = password_encode(ns['password'])
|
||
update_sql = """UPDATE users SET password = '%s' WHERE id = '%s';""" % (new_password, user['id'])
|
||
await sor.sqlExe(update_sql, {})
|
||
return {'status': True, 'msg': '密码重置成功'}
|
||
except Exception as error:
|
||
debug(f"forgotPassword 错误: {error}")
|
||
debug(f"forgotPassword 错误堆栈: {traceback.format_exc()}")
|
||
return {'status': False, 'msg': '密码重置失败, %s' % str(error)}
|
||
|
||
|
||
ret = await forgotPassword(params_kw)
|
||
return ret
|