mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-07-09 03:04:54 -04:00
security: delay server response whenever username is non existing (#1338)
* Delay server response whenever username is non existing * utilize hasher to achieve constant timing Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
This commit is contained in:
parent
12f480eb75
commit
abb114c375
@ -79,15 +79,21 @@ def authenticate_user(session, email: str, password: str) -> PrivateUser | bool:
|
|||||||
settings = get_app_settings()
|
settings = get_app_settings()
|
||||||
|
|
||||||
db = get_repositories(session)
|
db = get_repositories(session)
|
||||||
user: PrivateUser = db.users.get(email, "email", any_case=True)
|
user = db.users.get_one(email, "email", any_case=True)
|
||||||
|
|
||||||
if not user:
|
if not user:
|
||||||
user = db.users.get(email, "username", any_case=True)
|
user = db.users.get_one(email, "username", any_case=True)
|
||||||
|
|
||||||
if settings.LDAP_AUTH_ENABLED and (not user or user.password == "LDAP"):
|
if settings.LDAP_AUTH_ENABLED and (not user or user.password == "LDAP"):
|
||||||
return user_from_ldap(db, session, email, password)
|
return user_from_ldap(db, session, email, password)
|
||||||
|
|
||||||
if not user or not verify_password(password, user.password):
|
if not user:
|
||||||
|
# To prevent user enumeration we perform the verify_password computation to ensure
|
||||||
|
# server side time is relatively constant and not vulnerable to timing attacks.
|
||||||
|
verify_password("abc123cba321", "$2b$12$JdHtJOlkPFwyxdjdygEzPOtYmdQF5/R5tHxw5Tq8pxjubyLqdIX5i")
|
||||||
|
return False
|
||||||
|
|
||||||
|
elif not verify_password(password, user.password):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return user
|
return user
|
||||||
|
@ -49,6 +49,7 @@ class MealieAuthToken(BaseModel):
|
|||||||
|
|
||||||
@public_router.post("/token")
|
@public_router.post("/token")
|
||||||
def get_token(data: CustomOAuth2Form = Depends(), session: Session = Depends(generate_session)):
|
def get_token(data: CustomOAuth2Form = Depends(), session: Session = Depends(generate_session)):
|
||||||
|
|
||||||
email = data.username
|
email = data.username
|
||||||
password = data.password
|
password = data.password
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user