From 3ca5cc73f066d2f5c4b5ef3f4b59fc7a7cbf4b1c Mon Sep 17 00:00:00 2001 From: KittenTM Date: Fri, 6 Feb 2026 01:29:26 +0100 Subject: [PATCH] make into multiple different scripts to prevent breaking changes --- .gitignore | 1 + main.py | 9 ++++++ routes/sso.py | 36 ++++++++++++++++++++++++ services/auth.py | 24 ++++++++++++++++ spfn-main.py | 73 ------------------------------------------------ 5 files changed, 70 insertions(+), 73 deletions(-) create mode 100644 .gitignore create mode 100644 main.py create mode 100644 routes/sso.py create mode 100644 services/auth.py delete mode 100644 spfn-main.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed8ebf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..f5844c3 --- /dev/null +++ b/main.py @@ -0,0 +1,9 @@ +from fastapi import FastAPI +from routes import sso +import uvicorn + +app = FastAPI() +app.include_router(sso.router, prefix="/api/v2/sso") + +if __name__ == '__main__': + uvicorn.run(app, host="0.0.0.0", port=5000) \ No newline at end of file diff --git a/routes/sso.py b/routes/sso.py new file mode 100644 index 0000000..e0a02b0 --- /dev/null +++ b/routes/sso.py @@ -0,0 +1,36 @@ +from fastapi import APIRouter, Request, Form, Response +from fastapi.responses import RedirectResponse +from typing import Optional +from services import auth + +router = APIRouter() + +@router.post('/spfn/generate_token') +async def login( + request: Request, + username: Optional[str] = Form(None), + password: Optional[str] = Form(None), + frontend_origin: Optional[str] = Form(None) +): + host = (frontend_origin or request.headers.get("referer") or "/").rstrip('/') + sep = "&" if "?" in host else "?" + + if not username or not password: + return RedirectResponse(f"{host}/users/auth/splatfestival/{sep}error=auth&username={username or ''}", 303) + + try: + token = auth.get_token(username, password) + if not token: + return RedirectResponse(f"{host}/users/auth/splatfestival/{sep}error=auth&username={username}", 303) + + # Logging profile for debugging + profile = auth.get_profile(token) + if profile: + print(f"=== PROFILE ===\n{profile}\n===============") + + redirect_arg = request.query_params.get('redirect') + target = redirect_arg if redirect_arg else f"{host}/friend_list/" + return RedirectResponse(url=target, status_code=303) + + except Exception as e: + return Response(content=f"Proxy Error: {str(e)}", status_code=500) \ No newline at end of file diff --git a/services/auth.py b/services/auth.py new file mode 100644 index 0000000..f904387 --- /dev/null +++ b/services/auth.py @@ -0,0 +1,24 @@ +import requests +import base64 + +API_URL = "https://account.spfn.net/api/v2" + +def get_token(username, password): + creds = f"{username} {password}" + encoded = base64.b64encode(creds.encode()).decode() + + headers = { + "Authorization": f"Basic {encoded}", + "User-Agent": "saturday & allison should lwk kiss..." + } + + response = requests.get(f"{API_URL}/oauth2/generate_token", headers=headers, timeout=10) + return response.json().get("token") if response.ok else None + +def get_profile(token): + headers = { + "Authorization": f"Bearer {token}", + "User-Agent": "every update im going to change this user agent because im bored!!" + } + response = requests.get(f"{API_URL}/users/@me/profile", headers=headers, timeout=10) + return response.text if response.ok else None \ No newline at end of file diff --git a/spfn-main.py b/spfn-main.py deleted file mode 100644 index aa923be..0000000 --- a/spfn-main.py +++ /dev/null @@ -1,73 +0,0 @@ -from fastapi import FastAPI, Request, Form -from fastapi.responses import RedirectResponse, Response -import requests -import base64 -from typing import Optional - -app = FastAPI() - -SPFN_API_URL = "https://account.spfn.net/api/v2/oauth2/generate_token" - -def generate_spfn_token(encoded_creds): - headers = { - "Authorization": f"Basic {encoded_creds}", - "User-Agent": "saturday & allison should lwk kiss..." - } - response = requests.get(SPFN_API_URL, headers=headers, timeout=10) - return response.json().get("token") if response.ok else None - -@app.post('/api/v2/sso/spfn/generate_token') -async def handle_login( - request: Request, - username: Optional[str] = Form(None), - password: Optional[str] = Form(None), - # added optional so everything doesnt crash and burn if it doesnt exist... it probably still will though. - frontend_origin: Optional[str] = Form(None) -): - login_host = frontend_origin or request.headers.get("referer") or "/" - - if login_host.endswith('/'): - login_host = login_host[:-1] - - if not username or not password: - sep = "&" if "?" in login_host else "?" - error_url = f"{login_host}/users/auth/splatfestival/{sep}error=auth&username={username or ''}" - return RedirectResponse(url=error_url, status_code=303) - - creds = f"{username} {password}" - encoded_creds = base64.b64encode(creds.encode()).decode() - - try: - token = generate_spfn_token(encoded_creds) - - #if onika eats burgers then does oomi appear? - if token: - print("=== TOKEN ===", token, "===========", sep="\n") - - profile_headers = { - "Authorization": f"Bearer {token}", - "User-Agent": "every update im going to change this user agent because im bored!!" - } - - profile_response = requests.get( - "https://account.spfn.net/api/v2/users/@me/profile", - headers=profile_headers, - timeout=10 - ) - - if profile_response.ok: - print("=== PROFILE ===", profile_response.text, "===============", sep="\n") - redirect_arg = request.query_params.get('redirect') - redirect_to = redirect_arg if redirect_arg else f"{login_host}/friend_list/" - return RedirectResponse(url=redirect_to, status_code=303) - else: - sep = "&" if "?" in login_host else "?" - error_url = f"{login_host}/users/auth/splatfestival/{sep}error=auth&username={username}" - return RedirectResponse(url=error_url, status_code=303) - - except Exception as e: - return Response(content=f"Proxy Error: {str(e)}", status_code=500) - -if __name__ == '__main__': - import uvicorn - uvicorn.run(app, host="0.0.0.0", port=5000) \ No newline at end of file