feat: update raise error

pull/8904/head
Joe 2 years ago
parent 9e4ee2beb1
commit b249f2b9f9

@ -49,3 +49,9 @@ class EmailPasswordLoginLimitError(BaseHTTPException):
"Too many incorrect password attempts. Please verify your identity with the email code to complete login." "Too many incorrect password attempts. Please verify your identity with the email code to complete login."
) )
code = 429 code = 429
class EmailCodeLoginRateLimitExceededError(BaseHTTPException):
error_code = "email_code_login_rate_limit_exceeded"
description = "Too many login emails have been sent. Please try again in 5 minutes."
code = 429

@ -43,14 +43,10 @@ class ForgotPasswordSendEmailApi(Resource):
) )
else: else:
raise NotAllowedRegister() raise NotAllowedRegister()
elif account: else:
try: token = AccountService.send_reset_password_email(
token = AccountService.send_reset_password_email( account=account, email=args["email"], language=args["language"] or "en-US"
account=account, email=args["email"], language=args["language"] or "en-US" )
)
except RateLimitExceededError:
logging.warning(f"Rate limit exceeded for email: {args['email']}")
raise PasswordResetRateLimitExceededError()
return {"result": "success", "data": token} return {"result": "success", "data": token}

@ -12,7 +12,6 @@ from werkzeug.exceptions import Unauthorized
from configs import dify_config from configs import dify_config
from constants.languages import language_timezone_mapping, languages from constants.languages import language_timezone_mapping, languages
from controllers.console.auth.error import EmailPasswordLoginLimitError
from events.tenant_event import tenant_was_created from events.tenant_event import tenant_was_created
from extensions.ext_redis import redis_client from extensions.ext_redis import redis_client
from libs.helper import RateLimiter, TokenManager from libs.helper import RateLimiter, TokenManager
@ -34,7 +33,6 @@ from services.errors.account import (
LinkAccountIntegrateError, LinkAccountIntegrateError,
MemberNotInTenantError, MemberNotInTenantError,
NoPermissionError, NoPermissionError,
RateLimitExceededError,
RoleAlreadyAssignedError, RoleAlreadyAssignedError,
TenantNotFoundError, TenantNotFoundError,
) )
@ -45,7 +43,7 @@ from tasks.mail_reset_password_task import send_reset_password_mail_task
class AccountService: class AccountService:
reset_password_rate_limiter = RateLimiter(prefix="reset_password_rate_limit", max_attempts=5, time_window=60 * 60) reset_password_rate_limiter = RateLimiter(prefix="reset_password_rate_limit", max_attempts=1, time_window=60 * 1)
email_code_login_rate_limiter = RateLimiter( email_code_login_rate_limiter = RateLimiter(
prefix="email_code_login_rate_limit", max_attempts=1, time_window=60 * 1 prefix="email_code_login_rate_limit", max_attempts=1, time_window=60 * 1
) )
@ -263,7 +261,9 @@ class AccountService:
account_language = account.interface_language if account else language account_language = account.interface_language if account else language
if cls.reset_password_rate_limiter.is_rate_limited(account_email): if cls.reset_password_rate_limiter.is_rate_limited(account_email):
raise RateLimitExceededError(f"Rate limit exceeded for email: {account_email}. Please try again later.") from controllers.console.auth.error import PasswordResetRateLimitExceededError
raise PasswordResetRateLimitExceededError()
code = "".join([str(random.randint(0, 9)) for _ in range(6)]) code = "".join([str(random.randint(0, 9)) for _ in range(6)])
token = TokenManager.generate_token( token = TokenManager.generate_token(
@ -290,7 +290,9 @@ class AccountService:
cls, account: Optional[Account] = None, email: Optional[str] = None, language: Optional[str] = "en-US" cls, account: Optional[Account] = None, email: Optional[str] = None, language: Optional[str] = "en-US"
): ):
if cls.email_code_login_rate_limiter.is_rate_limited(email): if cls.email_code_login_rate_limiter.is_rate_limited(email):
raise EmailPasswordLoginLimitError() from controllers.console.auth.error import EmailCodeLoginRateLimitExceededError
raise EmailCodeLoginRateLimitExceededError()
code = "".join([str(random.randint(0, 9)) for _ in range(6)]) code = "".join([str(random.randint(0, 9)) for _ in range(6)])
token = TokenManager.generate_token( token = TokenManager.generate_token(

Loading…
Cancel
Save