From 69a997e6de3ecca9516a2048ef07b44fe39ee3e0 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Thu, 7 Apr 2022 20:50:25 +0200 Subject: [PATCH] :passport_control: Added change-password in backend --- classquiz/cache.py | 6 ++++++ classquiz/db/models.py | 5 +++++ classquiz/routers/users.py | 16 ++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/classquiz/cache.py b/classquiz/cache.py index c105f85..20bca1e 100644 --- a/classquiz/cache.py +++ b/classquiz/cache.py @@ -39,6 +39,12 @@ async def cache_account(criteria: str, content: str) -> Union[User, None]: return None +async def clear_cache_for_account(user: User): + await redis.delete(user.email) + await redis.delete(user.username) + await redis.delete(str(user.id)) + + async def get_from_redis(key: str) -> Union[None, User]: user = await redis.get(key) if user is None: diff --git a/classquiz/db/models.py b/classquiz/db/models.py index 4606127..a9d730e 100644 --- a/classquiz/db/models.py +++ b/classquiz/db/models.py @@ -127,3 +127,8 @@ class GameSession(BaseModel): game_id: str players: list[GamePlayer | None] answers: list[GameAnser1 | None] + + +class UpdatePassword(BaseModel): + old_password: str + new_password: str diff --git a/classquiz/routers/users.py b/classquiz/routers/users.py index 54edfbb..f98a4c2 100644 --- a/classquiz/routers/users.py +++ b/classquiz/routers/users.py @@ -8,6 +8,7 @@ from fastapi.security import OAuth2PasswordRequestForm from classquiz.auth import * from classquiz.config import redis +from classquiz.cache import clear_cache_for_account from classquiz.db.models import * from classquiz.emails import send_register_email @@ -115,3 +116,18 @@ async def verify_user(verify_key: str): user.verify_key = None await user.update() return RedirectResponse(url="/account/login?verified=true") + + +@router.put("/password/update") +async def change_password(password_data: UpdatePassword, response: Response, user: User = Depends(get_current_user)): + if not verify_password(password_data.old_password, user.password): + raise HTTPException(status_code=400, detail="Incorrect password") + user.password = get_password_hash(password_data.new_password) + await user.update() + await clear_cache_for_account(user) + await UserSession.objects.filter(user=user).delete() + response.delete_cookie("access_token") + response.delete_cookie("expiry") + response.delete_cookie("rememberme") + response.delete_cookie("rememberme_token") + return {"message": "Password updated successfully"}