-
+
diff --git a/frontend/src/app.scss b/frontend/src/app.scss
index 58f765d..052ec15 100644
--- a/frontend/src/app.scss
+++ b/frontend/src/app.scss
@@ -9,3 +9,10 @@
@import "bulma/sass/grid/_all";
@import "bulma/sass/helpers/_all";
@import "bulma/sass/layout/_all";
+
+$fa-font-path: "@fortawesome/fontawesome-free/webfonts";
+@import "@fortawesome/fontawesome-free/scss/fontawesome.scss";
+@import "@fortawesome/fontawesome-free/scss/regular.scss";
+@import "@fortawesome/fontawesome-free/scss/solid.scss";
+@import "@fortawesome/fontawesome-free/scss/brands.scss";
+@import "@fortawesome/fontawesome-free/scss/v4-shims.scss";
diff --git a/frontend/src/stores.ts b/frontend/src/stores.ts
new file mode 100644
index 0000000..1181e3f
--- /dev/null
+++ b/frontend/src/stores.ts
@@ -0,0 +1,9 @@
+import { writable, type Writable } from "svelte/store";
+
+type User = {
+ name: string,
+ email: string,
+ picture: string,
+}
+
+export const user: Writable
= writable(null);
\ No newline at end of file
diff --git a/server/server/__init__.py b/server/server/__init__.py
index c25ff89..ba2b375 100644
--- a/server/server/__init__.py
+++ b/server/server/__init__.py
@@ -7,18 +7,11 @@ 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",
-)
+from .user import user_auth
app = FastAPI()
-app.add_middleware(SessionMiddleware, secret_key=config.get("SESSION_SECRET_KEY"))
+app.mount("/user/", user_auth)
templates = Jinja2Templates(directory="templates")
@@ -38,29 +31,5 @@ async def index(request: Request):
)
-@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"{e.error}
")
- 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))
diff --git a/server/server/user.py b/server/server/user.py
new file mode 100644
index 0000000..0ed0596
--- /dev/null
+++ b/server/server/user.py
@@ -0,0 +1,78 @@
+from fastapi import FastAPI, Request
+from pydantic import BaseModel, HttpUrl
+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
+
+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",
+)
+
+user_auth = FastAPI()
+user_auth.add_middleware(SessionMiddleware, secret_key=config.get("SESSION_SECRET_KEY"))
+
+
+@user_auth.get("/login")
+async def login(request: Request):
+ redirect_uri = request.url_for("auth")
+ return await oauth.gitea.authorize_redirect(request, redirect_uri)
+
+
+@user_auth.get("/auth")
+async def auth(request: Request):
+ try:
+ token = await oauth.gitea.authorize_access_token(request)
+ except OAuthError as e:
+ return HTMLResponse(f"{e.error}
")
+ user = await oauth.gitea.userinfo(token=token)
+ if user:
+ request.session["user"] = dict(user)
+ return RedirectResponse(url="/")
+
+
+@user_auth.get("/logout")
+async def logout(request: Request):
+ request.session.pop("user", None)
+ return RedirectResponse(url="/")
+
+
+"""
+user={
+ 'sub': '1',
+ 'name': 'Kai Vogelgesang',
+ 'preferred_username': 'kai',
+ 'email': 'kai@leafbla.de',
+ 'picture': 'https://git.leafbla.de/avatars/279a0c06517e4dd112b291cf78c0c659',
+ 'groups': [
+ 'gitolite-legacy',
+ 'gitolite-legacy:owners',
+ 'infrastructure',
+ 'infrastructure:owners',
+ 'next-website',
+ 'next-website:owners',
+ 'turtles',
+ 'turtles:owners'
+ ]
+} """
+
+
+class MeResponse(BaseModel):
+ name: str
+ email: str
+ picture: HttpUrl
+
+
+@user_auth.get("/me", response_model=MeResponse | None)
+async def display_current_user(request: Request):
+ user = request.session.get("user")
+ if user is None:
+ return None
+ print(f"[/me] {user=}")
+ return MeResponse(
+ name=user["preferred_username"], email=user["email"], picture=user["picture"]
+ )