added logout

This commit is contained in:
TheUnrealDragon 2025-12-28 18:11:32 +05:30
commit 74ac3f86f1
3 changed files with 58 additions and 15 deletions

46
main.py
View file

@ -9,7 +9,8 @@ from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
import ipaddress import ipaddress
import psycopg2 import psycopg2
from dateutil.parser import parse
from datetime import datetime
from fastapi.exceptions import RequestValidationError from fastapi.exceptions import RequestValidationError
from starlette.exceptions import HTTPException as StarletteHTTPException from starlette.exceptions import HTTPException as StarletteHTTPException
from fastapi.exceptions import RequestValidationError from fastapi.exceptions import RequestValidationError
@ -33,14 +34,11 @@ templates = Jinja2Templates(directory="templates")
@app.get("/server", response_class=HTMLResponse) @app.get("/server", response_class=HTMLResponse)
async def get_server(request: Request): async def get_server(request: Request):
ip = request.headers['X-Real-IP'] 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)
c = request.cookies.get("failed_reason", None) if c is None:
if c is None: return templates.TemplateResponse(request=request, name='index.html',context={"status":""})
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}"})
else: 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) @app.get("/server/user", response_class=HTMLResponse)
@ -52,12 +50,12 @@ async def get_user_server(request: Request):
return RedirectResponse("/server", status_code=303) return RedirectResponse("/server", status_code=303)
if session_key is None or len(session_key) == 0: if session_key is None or len(session_key) == 0:
return RedirectResponse("/server", status_code=303) return RedirectResponse("/server", status_code=303)
if not validate_session_key(username, session_key):
if ipaddress.ip_address(ip) in ipaddress.ip_network('192.168.0.0/16'): r = RedirectResponse("/server", status_code=303)
active_users = get_active_users() r.set_cookie("failed_reason", "Could not validate user session")
return templates.TemplateResponse(request=request, name='user.html',context={"username":username, "active_users": active_users}) return r
else: active_users = get_active_users()
return templates.TemplateResponse(request=request, name='unknown_user.html',context={"IP":ip}) return templates.TemplateResponse(request=request, name='user.html',context={"username":username, "active_users": active_users})
def get_active_users() -> list[list]: def get_active_users() -> list[list]:
@ -73,6 +71,26 @@ def get_active_users() -> list[list]:
return active_users 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) # @app.post("/api/users/create", response_class=RedirectResponse)
# async def root(username: Annotated[str, Form()], password: Annotated[str, Form()], # async def root(username: Annotated[str, Form()], password: Annotated[str, Form()],
# new_user: Annotated[str, Form()], new_password: Annotated[str, Form()]): # new_user: Annotated[str, Form()], new_password: Annotated[str, Form()]):

View file

@ -2,3 +2,4 @@ fastapi[standard]
jinja2 jinja2
argon2-cffi argon2-cffi
psycopg2-binary psycopg2-binary
python-dateutil

View file

@ -10,8 +10,32 @@
<script src="{{ url_for('static', path='/jquery.js') }}"> <script src="{{ url_for('static', path='/jquery.js') }}">
</script> </script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
<script>
function logout() {
fetch("/api/users/logout", {
method: "POST",
body: JSON.stringify({
username: getCookie("username"),
session_key: getCookie("session_key"),
redirect: "/server",
password: ""
}),
headers: {
"Content-type": "application/json; charset=UTF-8"
},
redirect: "follow"
})
}
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
}
</script>
<div align="center"> <div align="center">
<h3>Server Manager, Welcome {{ username }} </h3> <h3>Server Manager, Welcome {{ username }} </h3>
<a href="/api/users/logout" onclick="location.href=this.href+'?username='+getCookie('username')+'&session_key='+getCookie('session_key')+'&redirect=/server';return false;">Logout</a>
</div> </div>
<br> <br>
<br> <br>