diff --git a/core/scripts/webpanel/app.py b/core/scripts/webpanel/app.py index 0a08093..841dfc8 100644 --- a/core/scripts/webpanel/app.py +++ b/core/scripts/webpanel/app.py @@ -29,7 +29,11 @@ def create_app() -> FastAPI: title='Hysteria Webpanel', description='Webpanel for Hysteria', version='0.1.0', + contact={ + 'github': 'https://github.com/ReturnFI/Hysteria2' + }, debug=CONFIGS.DEBUG, + root_path=f'/{CONFIGS.ROOT_PATH}', ) # Set up static files @@ -44,10 +48,10 @@ def create_app() -> FastAPI: app.add_middleware(AfterRequestMiddleware) # Set up Routers - app.include_router(routers.basic.router, prefix='', tags=['basic']) # Add basic router - app.include_router(routers.login.router, prefix='', tags=['authentication']) # Add authentication router - app.include_router(routers.user.router, prefix='/users', tags=['users']) # Add user router - app.include_router(routers.api.v1.api_v1_router, prefix='/api/v1', tags=['v1']) # Add API version 1 router + app.include_router(routers.basic.router, prefix='', tags=['Basic Routes[Web]']) # Add basic router + app.include_router(routers.login.router, prefix='', tags=['Authentication[Web]']) # Add authentication router + app.include_router(routers.user.router, prefix='/users', tags=['User Management[Web]']) # Add user router + app.include_router(routers.api.v1.api_v1_router, prefix='/api/v1', tags=['API Version 1']) # Add API version 1 router return app diff --git a/core/scripts/webpanel/dependency/__init__.py b/core/scripts/webpanel/dependency/__init__.py index 103eef4..c4881d5 100644 --- a/core/scripts/webpanel/dependency/__init__.py +++ b/core/scripts/webpanel/dependency/__init__.py @@ -1 +1 @@ -from .dependency import get_templates, get_session_manager, url_for +from .dependency import get_templates, get_session_manager diff --git a/core/scripts/webpanel/dependency/dependency.py b/core/scripts/webpanel/dependency/dependency.py index b2feac3..8a9f603 100644 --- a/core/scripts/webpanel/dependency/dependency.py +++ b/core/scripts/webpanel/dependency/dependency.py @@ -1,28 +1,24 @@ -from fastapi import Request from fastapi.templating import Jinja2Templates -from jinja2 import pass_context -from typing import Any -from starlette.datastructures import URL from session import SessionStorage, SessionManager from config import CONFIGS __TEMPLATES = Jinja2Templates(directory='templates') +# This was a custom url_for function for Jinja2 to add a prefix to the generated URL but we fix the url generation by setting the root path +# @pass_context +# def url_for(context: dict[str, Any], name: str = '', **path_params: dict[str, Any]) -> URL: +# ''' +# Custom url_for function for Jinja2 to add a prefix to the generated URL. +# ''' +# request: Request = context["request"] +# url = request.url_for(name, **path_params) +# prefixed_path = f"{CONFIGS.ROOT_PATH.rstrip('/')}/{url.path.lstrip('/')}" -@pass_context -def url_for(context: dict[str, Any], name: str = '', **path_params: dict[str, Any]) -> URL: - ''' - Custom url_for function for Jinja2 to add a prefix to the generated URL. - ''' - request: Request = context["request"] - url = request.url_for(name, **path_params) - prefixed_path = f"{CONFIGS.ROOT_PATH.rstrip('/')}/{url.path.lstrip('/')}" - - return url.replace(path=prefixed_path) +# return url.replace(path=prefixed_path) -__TEMPLATES.env.globals['url_for'] = url_for # type: ignore +# __TEMPLATES.env.globals['url_for'] = url_for # type: ignore def get_templates() -> Jinja2Templates: diff --git a/core/scripts/webpanel/middleware/auth.py b/core/scripts/webpanel/middleware/auth.py index 78ab81f..789d05e 100644 --- a/core/scripts/webpanel/middleware/auth.py +++ b/core/scripts/webpanel/middleware/auth.py @@ -5,7 +5,6 @@ from starlette.types import ASGIApp from typing import Awaitable, Callable from datetime import datetime, timezone -from dependency import url_for from session import SessionManager @@ -16,7 +15,6 @@ class AuthMiddleware(BaseHTTPMiddleware): super().__init__(app) self.__session_manager = session_manager self.__api_token = api_token - self.__url_for = url_for async def dispatch(self, request: Request, call_next: Callable[[Request], Awaitable[Response]]): '''Handles session authentication.''' @@ -43,7 +41,7 @@ class AuthMiddleware(BaseHTTPMiddleware): if not session_id: if is_api_request: raise HTTPException(status_code=401, detail="Unauthorized") - return RedirectResponse(url=self.__url_for(context={'request': request}, name='login'), status_code=302) + return RedirectResponse(url=request.url_for('login'), status_code=302) session_data = self.__session_manager.get_session(session_id) @@ -51,12 +49,12 @@ class AuthMiddleware(BaseHTTPMiddleware): if is_api_request: raise HTTPException(status_code=401, detail="The session is invalid.") - return RedirectResponse(url=self.__url_for(context={'request': request}, name='login'), status_code=302) + return RedirectResponse(url=request.url_for('login'), status_code=302) if session_data.expires_at < datetime.now(timezone.utc): if is_api_request: raise HTTPException(status_code=401, detail="The session has expired.") - return RedirectResponse(url=self.__url_for(context={'request': request}, name='login'), status_code=302) + return RedirectResponse(url=request.url_for('login'), status_code=302) return await call_next(request) diff --git a/core/scripts/webpanel/routers/login/login.py b/core/scripts/webpanel/routers/login/login.py index 5edd7b0..c9f98ef 100644 --- a/core/scripts/webpanel/routers/login/login.py +++ b/core/scripts/webpanel/routers/login/login.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, Depends, Form, Request from fastapi.responses import RedirectResponse from fastapi.templating import Jinja2Templates -from dependency import get_templates, get_session_manager, url_for +from dependency import get_templates, get_session_manager from session import SessionManager from config import CONFIGS @@ -28,7 +28,7 @@ async def login_post( session_id = session_manager.set_session(username) - res = RedirectResponse(url=url_for(context={'request': request}, name='index'), status_code=302) + res = RedirectResponse(url=request.url_for('index'), status_code=302) res.set_cookie(key='session_id', value=session_id) return res @@ -40,6 +40,6 @@ async def logout(request: Request, session_manager: SessionManager = Depends(get if session_id: session_manager.revoke_session(session_id) - res = RedirectResponse(url=url_for(context={'request': request}, name='index'), status_code=302) + res = RedirectResponse(url=request.url_for('index'), status_code=302) res.delete_cookie('session_id') return res