From 7bb6b0b8c777d10a34fc016d1b41f47e2acc455c Mon Sep 17 00:00:00 2001 From: Kushal Dotel Date: Sat, 11 Jan 2025 20:18:01 +0545 Subject: [PATCH] feat: add logout --- backend/blueprints/profile/__init__.py | 73 +------------------------ backend/blueprints/session/__init__.py | 30 +++++++++- backend/config.py | 2 +- backend/uploads/meme.jpg | Bin 0 -> 28316 bytes 4 files changed, 32 insertions(+), 73 deletions(-) create mode 100644 backend/uploads/meme.jpg diff --git a/backend/blueprints/profile/__init__.py b/backend/blueprints/profile/__init__.py index 3f1a9a9..5507f0d 100644 --- a/backend/blueprints/profile/__init__.py +++ b/backend/blueprints/profile/__init__.py @@ -85,7 +85,8 @@ def register(): quizzes=[], quiz_attempts=[], chats=[], - notifications=[] + notifications=[], + publications=[] ) # Save the user to the database @@ -101,76 +102,6 @@ def register(): db.session.rollback() return jsonify({"error": "Registration failed, please try again later."}), 500 - -@profile.route('/login', methods=['POST']) -def login(): - """ - Handle user login. - """ - data = request.form # Expecting JSON body - - # Extract credentials from request - # username = data.get('username') - email = data.get('email') - password = data.get('password') - user_agent = request.headers.get('User-Agent', 'Unknown') - - # Validate required fields - if not email or not password: - return jsonify({"error": "email and password are required"}), 400 - - # Find the user by username - # user = User.query.filter_by(username=username).first() - user = User.query.filter_by(email=email).first() - - if not user: - return jsonify({"error": "Invalid email or password"}), 401 - - # Verify the password - if not check_password_hash(user.hash_password, password): - return jsonify({"error": "Invalid email or password"}), 401 - - # Create a new session - session_key = str(uuid.uuid4()) # Generate a unique session key - new_session = Session( - userID=user.id, - user=user, # Pass the user object here - key=session_key, - ua=user_agent, - creationDate=datetime.utcnow(), - lastUsed=datetime.utcnow(), - isValid=True - ) - - - try: - db.session.add(new_session) - db.session.commit() - return jsonify({ - "message": "Login successful", - "session_key": session_key, - "user_id": str(user.id) - }), 200 - except Exception as e: - db.session.rollback() - return jsonify({"error": "Login failed, please try again later."}), 500 - -#Implement laters -# @profile.route('/update', methhods=['UPDATE', 'DELETE']) -# def update(): -# if request.method == 'DELETE': -# pass -# if request.method == 'UPDATE': -# pass - -# @profile.route('/me') -# def my_profile(): -# pass - -# @profile.route('/info/') -# def profile_info(user_uuid): -# return user_uuid - #make a get request to get json on hello word @profile.route('/hello') @auth_required() diff --git a/backend/blueprints/session/__init__.py b/backend/blueprints/session/__init__.py index 068f65b..6462e2b 100644 --- a/backend/blueprints/session/__init__.py +++ b/backend/blueprints/session/__init__.py @@ -12,6 +12,7 @@ import os from config import * from utils.utils import password_check_sanity,is_valid_email,InsecurePasswordException from sqlalchemy.exc import IntegrityError +from sqlalchemy import select, and_ session = Blueprint('session', __name__) @@ -66,4 +67,31 @@ def login(): }), 200 except Exception as e: db.session.rollback() - return jsonify({"error": "Login failed, please try again later."}), 500 \ No newline at end of file + return jsonify({"error": "Login failed, please try again later."}), 500 + + +@session.route('/destroy', methods=['POST']) +@auth_required() +def logout(): + """ + Handle user logout by invalidating the session. + """ + try: + + data = request.json # Expecting JSON body + except: + data = {} + target_session_key = data.get('session_key',None) + target_session = g.current_session + + if target_session_key is not None: + target_session = db.session.execute( + select(Session).where(and_( + Session.key == target_session_key, Session.isValid == True, Session.userID == g.current_user.id + )) + ).scalar() + if target_session is None: + return jsonify({'message': 'The session key is invalid or does not belong to current user.'}), 401 + target_session.isValid = False + db.session.commit() + return jsonify({'message': 'Session invalidated'}), 200 diff --git a/backend/config.py b/backend/config.py index ce259ae..1ab2f0c 100644 --- a/backend/config.py +++ b/backend/config.py @@ -18,7 +18,7 @@ DEFAULT_BADGE_ICON: str = "defaultBadgeIcon.png" DISABLE_PASSWORD_SANITY_CHECKS: bool = False PROJECT_ROOT: os.path = os.path.dirname(os.path.abspath(__file__)) -USER_UPLOADS_DIR: str = os.path.join(PROJECT_ROOT, "uploads") +USER_UPLOADS_DIR: str = os.path.abspath(os.path.join(PROJECT_ROOT, "uploads")) DB_URI: str = f"{DB_ENGINE}://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}" ACTIVATE_ACCOUNTS_ON_SIGNUP: bool = True diff --git a/backend/uploads/meme.jpg b/backend/uploads/meme.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1862f74fe21fb54b73952aba36aafcaf60ed9fbc GIT binary patch literal 28316 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