controlpanel/server/server/__init__.py

67 lines
1.8 KiB
Python

import json
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
from starlette.config import Config
from starlette.middleware.sessions import SessionMiddleware
from starlette.responses import HTMLResponse, RedirectResponse
from authlib.integrations.starlette_client import OAuth, OAuthError
from .settings import settings
config = Config("secret.env") # TODO unify this with settings
oauth = OAuth(config)
oauth.register(
name="gitea",
server_metadata_url="https://git.leafbla.de/.well-known/openid-configuration",
)
app = FastAPI()
app.add_middleware(SessionMiddleware, secret_key=config.get("SESSION_SECRET_KEY"))
templates = Jinja2Templates(directory="templates")
manifest = dict()
if not settings.dev_mode:
from fastapi.staticfiles import StaticFiles
with open(f"{settings.frontend_path}/manifest.json", "r") as f:
manifest = json.load(f)
@app.get("/")
async def index(request: Request):
return templates.TemplateResponse(
"index.html",
{"request": request, "dev_mode": settings.dev_mode, "manifest": manifest},
)
@app.get("/login")
async def login(request: Request):
redirect_uri = request.url_for("auth")
return await oauth.gitea.authorize_redirect(request, redirect_uri)
@app.get("/auth")
async def auth(request: Request):
try:
token = await oauth.gitea.authorize_access_token(request)
except OAuthError as e:
return HTMLResponse(f"<h1>{e.error}</h1>")
user = await oauth.gitea.userinfo(token=token)
if user:
request.session["user"] = dict(user)
return RedirectResponse(url="/")
@app.get("/logout")
async def logout(request: Request):
request.session.pop("user", None)
return RedirectResponse(url="/")
if not settings.dev_mode:
app.mount("/", StaticFiles(directory=settings.frontend_path))