34 lines
999 B
Python
34 lines
999 B
Python
"""Shared FastAPI dependencies for accessing and protecting UVM services."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import hmac
|
|
from typing import cast
|
|
|
|
from fastapi import Header, HTTPException, Request, status
|
|
|
|
from ..app import Application
|
|
|
|
|
|
def get_application(request: Request) -> Application:
|
|
return cast(Application, request.app.state.uvm_application)
|
|
|
|
|
|
def get_authorized_application(
|
|
request: Request,
|
|
x_uvm_token: str | None = Header(default=None),
|
|
) -> Application:
|
|
application = get_application(request)
|
|
expected_token = application.settings.api_token
|
|
if not expected_token:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
detail="UVM_API_TOKEN is not configured",
|
|
)
|
|
if not hmac.compare_digest(x_uvm_token or "", expected_token):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="missing or invalid X-UVM-Token",
|
|
)
|
|
return application
|