diff --git a/main.py b/main.py index 90acbe2..41a2aab 100644 --- a/main.py +++ b/main.py @@ -9,7 +9,8 @@ from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates import ipaddress import psycopg2 - +from dateutil.parser import parse +from datetime import datetime from fastapi.exceptions import RequestValidationError from starlette.exceptions import HTTPException as StarletteHTTPException from fastapi.exceptions import RequestValidationError @@ -33,14 +34,11 @@ templates = Jinja2Templates(directory="templates") @app.get("/server", response_class=HTMLResponse) async def get_server(request: Request): ip = request.headers['X-Real-IP'] - if ipaddress.ip_address(ip) in ipaddress.ip_network('192.168.0.0/16'): - c = request.cookies.get("failed_reason", None) - if c is None: - return templates.TemplateResponse(request=request, name='index.html',context={"status":""}) - else: - return templates.TemplateResponse(request=request, name='index.html',context={"status":f"Failed to login: {c}"}) + c = request.cookies.get("failed_reason", None) + if c is None: + return templates.TemplateResponse(request=request, name='index.html',context={"status":""}) else: - return templates.TemplateResponse(request=request, name='unknown_user.html',context={"IP":ip}) + return templates.TemplateResponse(request=request, name='index.html',context={"status":f"Failed to login: {c}"}) @app.get("/server/user", response_class=HTMLResponse) @@ -52,12 +50,12 @@ async def get_user_server(request: Request): return RedirectResponse("/server", status_code=303) if session_key is None or len(session_key) == 0: return RedirectResponse("/server", status_code=303) - - if ipaddress.ip_address(ip) in ipaddress.ip_network('192.168.0.0/16'): - active_users = get_active_users() - return templates.TemplateResponse(request=request, name='user.html',context={"username":username, "active_users": active_users}) - else: - return templates.TemplateResponse(request=request, name='unknown_user.html',context={"IP":ip}) + if not validate_session_key(username, session_key): + r = RedirectResponse("/server", status_code=303) + r.set_cookie("failed_reason", "Could not validate user session") + return r + active_users = get_active_users() + return templates.TemplateResponse(request=request, name='user.html',context={"username":username, "active_users": active_users}) def get_active_users() -> list[list]: @@ -73,6 +71,26 @@ def get_active_users() -> list[list]: return active_users +def validate_session_key(username, session_key) -> bool: + cur = con.cursor() + cur.execute(f"Select username, session_key, session_status, expiry_time from API_USERS where session_status='ACTIVE' and username='{username}'") + results = cur.fetchall() + if len(results) <= 0: + return False + (q_username, q_session_key, q_session_status, q_expiry_time) = results[0] + print("Len ->", len(results)) + if q_username == username and q_session_key == session_key: + now_time = datetime.now() + q_expiry_time = q_expiry_time + print("Expiry time", q_expiry_time, now_time) + if q_expiry_time < now_time: + return False + return True + else: + return False + + + # @app.post("/api/users/create", response_class=RedirectResponse) # async def root(username: Annotated[str, Form()], password: Annotated[str, Form()], # new_user: Annotated[str, Form()], new_password: Annotated[str, Form()]): diff --git a/requirements.txt b/requirements.txt index fa1d09a..9ab8c61 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ fastapi[standard] jinja2 argon2-cffi -psycopg2-binary \ No newline at end of file +psycopg2-binary +python-dateutil diff --git a/templates/user.html b/templates/user.html index 9774333..99b8681 100644 --- a/templates/user.html +++ b/templates/user.html @@ -10,8 +10,32 @@ +