40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
from fastapi import APIRouter, Form, Request
|
|
from fastapi.responses import HTMLResponse, RedirectResponse
|
|
from fastapi.templating import Jinja2Templates
|
|
|
|
from app.auth.admin import password_matches, require_admin
|
|
from app.auth.csrf import ensure_csrf_token, validate_csrf
|
|
|
|
router = APIRouter()
|
|
templates = Jinja2Templates(directory="app/web/templates")
|
|
|
|
|
|
@router.get("/login", response_class=HTMLResponse)
|
|
def login_page(request: Request):
|
|
return templates.TemplateResponse(request, "login.html", {"csrf_token": ensure_csrf_token(request)})
|
|
|
|
|
|
@router.post("/login")
|
|
def login(
|
|
request: Request,
|
|
password: str = Form(...),
|
|
csrf_token: str = Form(...),
|
|
):
|
|
validate_csrf(request, csrf_token)
|
|
settings = request.app.state.settings
|
|
if not password_matches(password, settings.admin_password):
|
|
return templates.TemplateResponse(
|
|
request,
|
|
"login.html",
|
|
{"csrf_token": ensure_csrf_token(request), "error": "Invalid password"},
|
|
status_code=401,
|
|
)
|
|
request.session["admin_authenticated"] = True
|
|
return RedirectResponse("/", status_code=303)
|
|
|
|
|
|
@router.get("/", response_class=HTMLResponse)
|
|
def dashboard(request: Request):
|
|
require_admin(request)
|
|
return templates.TemplateResponse(request, "dashboard.html", {"csrf_token": ensure_csrf_token(request), "users": []})
|