diff --git a/app/admin.py b/app/admin.py index 30aed79..f1befee 100644 --- a/app/admin.py +++ b/app/admin.py @@ -93,11 +93,36 @@ class EnvCredentialProvider(Provider): app.post("/password")(self.password) app.add_middleware(BaseHTTPMiddleware, dispatch=self.authenticate) + def _template_response( + self, + request: Request, + name: str, + context: Dict[str, Any], + status_code: int = 200, + ): + """Build a template response compatible with old/new Starlette signatures.""" + payload = {"request": request, **context} + try: + # Starlette >= 1.0 + return templates.TemplateResponse( + request=request, + name=name, + context=payload, + status_code=status_code, + ) + except TypeError: + # Starlette < 1.0 + return templates.TemplateResponse( + name, + context=payload, + status_code=status_code, + ) + async def login_view(self, request: Request): - return templates.TemplateResponse( - self.template, + return self._template_response( + request=request, + name=self.template, context={ - "request": request, "login_logo_url": self.login_logo_url, "login_title": self.login_title, }, @@ -114,11 +139,11 @@ class EnvCredentialProvider(Provider): secrets.compare_digest(username, self._username) and secrets.compare_digest(password, self._password) ): - return templates.TemplateResponse( - self.template, + return self._template_response( + request=request, + name=self.template, status_code=HTTP_401_UNAUTHORIZED, context={ - "request": request, "error": "Invalid username or password", "login_logo_url": self.login_logo_url, "login_title": self.login_title, @@ -174,9 +199,10 @@ class EnvCredentialProvider(Provider): return response async def password_view(self, request: Request, resources=Depends(get_resources)): - return templates.TemplateResponse( - "providers/login/password.html", - context={"request": request, "resources": resources}, + return self._template_response( + request=request, + name="providers/login/password.html", + context={"resources": resources}, ) async def password( @@ -190,19 +216,19 @@ class EnvCredentialProvider(Provider): ): _ = admin if not secrets.compare_digest(old_password, self._password): - return templates.TemplateResponse( - "providers/login/password.html", + return self._template_response( + request=request, + name="providers/login/password.html", context={ - "request": request, "resources": resources, "error": "Old password is incorrect", }, ) if new_password != re_new_password: - return templates.TemplateResponse( - "providers/login/password.html", + return self._template_response( + request=request, + name="providers/login/password.html", context={ - "request": request, "resources": resources, "error": "New passwords do not match", },