def register(): """注册:第一步:输入学号""" if request.method == 'GET': return render_template('user/register.html') else: if not request.form.get("xh", None): # 表单为空 flash(MSG_EMPTY_USERNAME) return redirect(url_for("user.register")) _session_save_student_to_register_(request.form.get("xh", None)) # 如果输入的学号已经注册,跳转到登录页面 if User.exist(session[SESSION_STUDENT_TO_REGISTER].sid_orig): flash(MSG_ALREADY_REGISTERED) return redirect(url_for('user.login')) return redirect(url_for('user.register_choice'))
def register_by_email(): """注册:第三步:使用邮箱验证注册""" if not session.get(SESSION_STUDENT_TO_REGISTER, None): # 步骤异常,跳回第一步 return redirect(url_for('user.register')) sid_orig = session[SESSION_STUDENT_TO_REGISTER].sid_orig if User.exist(sid_orig): return render_template("common/error.html", message=MSG_ALREADY_REGISTERED) request_id = IdentityVerification.new_register_request(sid_orig, "email", ID_STATUS_SENT) with elasticapm.capture_span('send_email'): try: rpc_result = Auth.register_by_email(request_id, sid_orig) except Exception as e: return handle_exception_with_error_page(e) if rpc_result['acknowledged']: return render_template('user/emailSent.html', request_id=request_id) else: return render_template('common/error.html', message=MSG_INTERNAL_ERROR)
def email_verification(): """注册:邮箱验证""" if request.method == 'POST': # 设置密码表单提交 if not session.get(SESSION_EMAIL_VER_REQ_ID, None): return render_template("common/error.html", message=MSG_400) req = IdentityVerification.get_request_by_id( session[SESSION_EMAIL_VER_REQ_ID]) if not req: return render_template("common/error.html", message=MSG_TOKEN_INVALID) # 此处不是一定需要验证状态,但是为了保险还是判断一下 if req["status"] != ID_STATUS_TKN_PASSED: return render_template("common/error.html", message=MSG_TOKEN_INVALID) if any( map(lambda x: not request.form.get(x, None), ("password", "password2"))): # check if empty password flash(MSG_EMPTY_PASSWORD) return redirect(url_for("user.email_verification")) if request.form["password"] != request.form["password2"]: flash(MSG_PWD_DIFFERENT) return redirect(url_for("user.email_verification")) sid_orig = req['sid_orig'] # 密码强度检查 pwd_strength_report = zxcvbn(password=request.form["password"]) if pwd_strength_report['score'] < 2: SimplePassword.new(password=request.form["password"], sid_orig=sid_orig) flash(MSG_WEAK_PASSWORD) return redirect(url_for("user.email_verification")) try: User.add_user(sid_orig=sid_orig, password=request.form['password']) except ValueError: flash(MSG_ALREADY_REGISTERED) logger.info( f"User {sid_orig} try to register again by email token. Filtered when posting." ) return redirect(url_for("user.email_verification")) del session[SESSION_EMAIL_VER_REQ_ID] IdentityVerification.set_request_status(str(req["request_id"]), ID_STATUS_PASSWORD_SET) flash(MSG_REGISTER_SUCCESS) # 查询 api-server 获得学生基本信息 try: student = Entity.get_student(sid_orig) except Exception as e: return handle_exception_with_error_page(e) # 登录态写入 session session[SESSION_CURRENT_USER] = StudentSession( sid_orig=student.student_id, sid=student.student_id_encoded, name=student.name) return redirect(url_for("user.main")) else: # 设置密码页面 if not session.get(SESSION_EMAIL_VER_REQ_ID, None): if not request.args.get("token", None): return render_template("common/error.html", message=MSG_400) with tracer.trace('verify_email_token'): try: rpc_result = Auth.verify_email_token( token=request.args.get("token", None)) except Exception as e: return handle_exception_with_error_page(e) if rpc_result.success: session[SESSION_EMAIL_VER_REQ_ID] = rpc_result.request_id IdentityVerification.set_request_status( rpc_result.request_id, ID_STATUS_TKN_PASSED) req = IdentityVerification.get_request_by_id( rpc_result.request_id) student_id = req["sid_orig"] if User.exist(student_id): flash(MSG_ALREADY_REGISTERED) logger.info( f"User {student_id} try to register again by email token. Request filtered." ) return redirect(url_for("main.main")) return render_template('user/emailVerificationProceed.html') else: return render_template("common/error.html", message=MSG_TOKEN_INVALID) else: # have session return render_template('user/emailVerificationProceed.html')