56 lines
1.6 KiB
Python
56 lines
1.6 KiB
Python
#!/usr/bin/env python3.12
|
|
|
|
import logging
|
|
from typing import Optional
|
|
from fastapi import FastAPI, Response, HTTPException
|
|
from fastapi.responses import RedirectResponse
|
|
|
|
|
|
class Utilities:
|
|
"""
|
|
API Utilities
|
|
"""
|
|
def __init__(self, app: FastAPI, constants):
|
|
self.constants = constants
|
|
self.blocked_redirect_uri = "https://codey.lol"
|
|
self.app = app
|
|
|
|
def get_blocked_response(self, path: Optional[str] = None):
|
|
"""
|
|
Get Blocked HTTP Response
|
|
"""
|
|
logging.error("Rejected request: Blocked")
|
|
return RedirectResponse(url=self.blocked_redirect_uri)
|
|
|
|
def get_no_endpoint_found(self, path: Optional[str] = None):
|
|
"""
|
|
Get 404 Response
|
|
"""
|
|
logging.error("Rejected request: No such endpoint")
|
|
raise HTTPException(detail="Unknown endpoint", status_code=404)
|
|
|
|
def check_key(self, path: str, key: str,
|
|
req_type: int = 0) -> bool:
|
|
"""
|
|
Accepts path as an argument to allow fine tuning access for each API key, not currently in use.
|
|
"""
|
|
|
|
if not key or not key.startswith("Bearer "):
|
|
return False
|
|
|
|
_key: str = key.split("Bearer ", maxsplit=1)[1].strip()
|
|
|
|
if not _key in self.constants.API_KEYS:
|
|
return False
|
|
|
|
if req_type == 2:
|
|
return _key.startswith("PRV-")
|
|
elif req_type == 4:
|
|
return _key.startswith("RAD-")
|
|
|
|
if path.lower().startswith("/xc/")\
|
|
and not key.startswith("XC-"):
|
|
return False
|
|
return True
|
|
|
|
|