Fixing 404 due to construction of URL from Unifi

This commit is contained in:
Roger Joys
2026-03-15 16:30:13 -07:00
parent 9be2d02ef8
commit 58c3cd8818

View File

@@ -1,17 +1,15 @@
import logging import logging
import secrets import secrets
from urllib.parse import urlencode
from fastapi import FastAPI, Request, HTTPException from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
from app.auth import get_authorization_url, exchange_code_for_token, get_userinfo, get_guest_duration from app.auth import get_authorization_url, exchange_code_for_token, get_userinfo, get_guest_duration
from app.config import load_config from app.config import load_config
from app.unifi import authorize_guest from app.unifi import authorize_guest
from fastapi.staticfiles import StaticFiles
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -33,7 +31,7 @@ async def index(request: Request):
}) })
@app.get("/portal", response_class=HTMLResponse) @app.get("/portal")
async def portal(request: Request, site: str, mac: str, ap: str = "", url: str = ""): async def portal(request: Request, site: str, mac: str, ap: str = "", url: str = ""):
""" """
Entry point from UniFi captive portal redirect. Entry point from UniFi captive portal redirect.
@@ -50,17 +48,24 @@ async def portal(request: Request, site: str, mac: str, ap: str = "", url: str =
"url": url, "url": url,
} }
auth_url = get_authorization_url(config, state)
return RedirectResponse(auth_url)
@app.get("/guest/s/{site_id}/") @app.get("/guest/s/{site_id}/")
async def unifi_portal(request: Request, site_id: str, ap: str = "", id: str = "", t: str = "", url: str = "", ssid: str = ""): async def unifi_portal(request: Request, site_id: str, ap: str = "", id: str = "", t: str = "", url: str = "", ssid: str = ""):
"""Handle UniFi's default captive portal redirect format.""" """Handle UniFi's default captive portal redirect format."""
# Map ssid to site
site = next((s for s in config.sites.values() if s.ssid == ssid), None) site = next((s for s in config.sites.values() if s.ssid == ssid), None)
if site is None: if site is None:
# Fall back to first site
site = next(iter(config.sites.values())) site = next(iter(config.sites.values()))
mac = id # UniFi sends MAC as 'id' parameter state = secrets.token_urlsafe(32)
return await portal(request, site=site.id, mac=mac, ap=ap, url=url) state_store[state] = {
"site": site.id,
"mac": id,
"ap": ap,
"url": url,
}
auth_url = get_authorization_url(config, state) auth_url = get_authorization_url(config, state)
return RedirectResponse(auth_url) return RedirectResponse(auth_url)