added logout
This commit is contained in:
parent
5c3f97e02d
commit
74ac3f86f1
3 changed files with 58 additions and 15 deletions
46
main.py
46
main.py
|
|
@ -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()]):
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,4 @@ fastapi[standard]
|
||||||
jinja2
|
jinja2
|
||||||
argon2-cffi
|
argon2-cffi
|
||||||
psycopg2-binary
|
psycopg2-binary
|
||||||
|
python-dateutil
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue