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

34
main.py
View file

@ -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}"})
else:
return templates.TemplateResponse(request=request, name='unknown_user.html',context={"IP":ip})
@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'):
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})
else:
return templates.TemplateResponse(request=request, name='unknown_user.html',context={"IP":ip})
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()]):

View file

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

View file

@ -10,8 +10,32 @@
<script src="{{ url_for('static', path='/jquery.js') }}">
</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">
<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>
<br>
<br>