33 lines
1.4 KiB
Python
33 lines
1.4 KiB
Python
"""Origin validation shared by first-install setup and container startup."""
|
|
|
|
import os
|
|
from urllib.parse import urlsplit
|
|
|
|
|
|
def managed_runtime() -> bool:
|
|
# Set by the entrypoint, never by an HTTP header or a database setting.
|
|
return os.environ.get("MAGENT_RUNTIME_MANAGED") == "1"
|
|
|
|
|
|
def normalize_application_origin(value: str) -> str:
|
|
if not isinstance(value, str) or not value or any(
|
|
c.isspace() or ord(c) < 33 or ord(c) == 127 or c in '<>"\\*?#' for c in value
|
|
):
|
|
raise ValueError("Enter an exact http(s) site address without a path, credentials, query or fragment.")
|
|
try:
|
|
parsed = urlsplit(value)
|
|
if (parsed.scheme not in {"http", "https"} or not parsed.hostname
|
|
or parsed.username is not None or parsed.password is not None
|
|
or parsed.path not in {"", "/"} or parsed.netloc.endswith(":")):
|
|
raise ValueError
|
|
port = parsed.port
|
|
if port is not None and not 1 <= port <= 65535:
|
|
raise ValueError
|
|
host = parsed.hostname.encode("idna").decode("ascii").lower()
|
|
if ":" in host:
|
|
host = f"[{host}]"
|
|
suffix = f":{port}" if port is not None and port != (443 if parsed.scheme == "https" else 80) else ""
|
|
return f"{parsed.scheme}://{host}{suffix}"
|
|
except (ValueError, UnicodeError):
|
|
raise ValueError("Enter an exact http(s) site address without a path, credentials, query or fragment.") from None
|