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