Files
haos_config/custom_components/openid/http_helper.py
2026-01-30 23:31:00 -06:00

85 lines
3.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Patch the built-in /auth/authorize and /auth/login_flow pages to load our JS helper."""
from http import HTTPStatus
import json
import logging
from aiohttp.web import Request, Response
from homeassistant.core import HomeAssistant
from .const import CONF_BLOCK_LOGIN, CONF_OPENID_TEXT, DOMAIN
_LOGGER = logging.getLogger(__name__)
def override_authorize_login_flow(hass: HomeAssistant) -> None:
"""Patch the build-in /auth/login_flow page to not return any actual login data."""
_original_post_function = None
async def post(request: Request) -> Response:
if not hass.data[DOMAIN].get(CONF_BLOCK_LOGIN, False):
content = json.loads((await _original_post_function(request)).text)
else:
content = {
"type": "form",
"flow_id": None,
"handler": [None],
"data_schema": [],
"errors": {},
"description_placeholders": None,
"last_step": None,
"preview": None,
"step_id": "init",
}
content[CONF_BLOCK_LOGIN] = hass.data[DOMAIN].get(CONF_BLOCK_LOGIN, False)
content[CONF_OPENID_TEXT] = hass.data[DOMAIN].get(
CONF_OPENID_TEXT, "OpenID / OAuth2 Authentication"
)
return Response(
status=HTTPStatus.OK,
body=json.dumps(content),
content_type="application/json",
)
# Swap out the existing GET handler on /auth/authorize
for resource in hass.http.app.router._resources: # noqa: SLF001
if getattr(resource, "canonical", None) == "/auth/login_flow":
post_handler = resource._routes.get("POST") # noqa: SLF001
# Replace the underlying coroutine fn.
_original_post_function = post_handler._handler # noqa: SLF001
post_handler._handler = post # noqa: SLF001
# Reset the routes map to ensure only our GET exists.
resource._routes = {"POST": post_handler} # noqa: SLF001
_LOGGER.debug("Overrode /auth/login_flow route")
break
def override_authorize_route(hass: HomeAssistant) -> None:
"""Patch the built-in /auth/authorize page to load our JS helper."""
async def get(request: Request) -> Response:
content = hass.data[DOMAIN]["authorize_template"]
# Inject script before </head>
content = content.replace(
"</head>",
'<script src="/openid/authorize.js"></script></head>',
)
return Response(status=HTTPStatus.OK, body=content, content_type="text/html")
# Swap out the existing GET handler on /auth/authorize
for resource in hass.http.app.router._resources: # noqa: SLF001
if getattr(resource, "canonical", None) == "/auth/authorize":
get_handler = resource._routes.get("GET") # noqa: SLF001
# Replace the underlying coroutine fn.
get_handler._handler = get # noqa: SLF001
# Reset the routes map to ensure only our GET exists.
resource._routes = {"GET": get_handler} # noqa: SLF001
_LOGGER.debug("Overrode /auth/authorize route custom JS injected")
break