Improved formatting of origin configuration in startup box.
This commit is contained in:
@@ -6,11 +6,13 @@ import os
|
|||||||
import re
|
import re
|
||||||
from sys import stderr
|
from sys import stderr
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from fastapi_vue.hostutil import parse_endpoints
|
from fastapi_vue.hostutil import parse_endpoints
|
||||||
|
|
||||||
from paskia._version import __version__
|
from paskia._version import __version__
|
||||||
from paskia.domains import auth_host_url, origin_url, partition_origins
|
from paskia.domains import auth_host_url, origin_url, partition_origins
|
||||||
|
from paskia.util import hostutil
|
||||||
from paskia.util.constants import DEFAULT_PORT, DEVMODE
|
from paskia.util.constants import DEFAULT_PORT, DEVMODE
|
||||||
from paskia.util.hostutil import format_endpoint, wildcard_base
|
from paskia.util.hostutil import format_endpoint, wildcard_base
|
||||||
|
|
||||||
@@ -85,9 +87,47 @@ def _origin_phrase(key: str, rp_id: str) -> str:
|
|||||||
return _compact_url(origin_url(key))
|
return _compact_url(origin_url(key))
|
||||||
|
|
||||||
|
|
||||||
|
def _covered_by_wildcard(key: str, pattern: str) -> bool:
|
||||||
|
"""Whether an origins-table key is redundant given a wildcard key.
|
||||||
|
|
||||||
|
Mirrors DomainConfig matching (sansio._allowlisted): a wildcard covers
|
||||||
|
hostnames under its base over https (any port), except under localhost
|
||||||
|
where any scheme and any port match. Plain http entries outside
|
||||||
|
localhost are therefore never covered and stay listed.
|
||||||
|
"""
|
||||||
|
base = wildcard_base(pattern)
|
||||||
|
if base is None:
|
||||||
|
return False
|
||||||
|
# Keys are bare hosts (https:// and '/' stripped by origin_key, port
|
||||||
|
# kept) or full origins; urlparse needs a scheme or '//' prefix.
|
||||||
|
hostname = urlparse(key if "://" in key else f"//{key}").hostname
|
||||||
|
if not hostname:
|
||||||
|
return False
|
||||||
|
if pattern.startswith("**."):
|
||||||
|
matched = hostutil.is_subdomain(hostname, base)
|
||||||
|
else:
|
||||||
|
# '*.base' covers exactly one subdomain level
|
||||||
|
matched = hostname.endswith(f".{base}") and "." not in hostname[
|
||||||
|
: -len(base) - 1
|
||||||
|
]
|
||||||
|
if not matched:
|
||||||
|
return False
|
||||||
|
if hostutil.is_subdomain(base, "localhost"):
|
||||||
|
return True # localhost: any scheme, any port
|
||||||
|
return "://" not in key or key.startswith("https://")
|
||||||
|
|
||||||
|
|
||||||
def _signin_summary(in_domain: list[str], rp_id: str) -> str:
|
def _signin_summary(in_domain: list[str], rp_id: str) -> str:
|
||||||
"""Compact summary of a domain's in-domain sign-in sites."""
|
"""Compact summary of a domain's in-domain sign-in sites."""
|
||||||
phrases = [_origin_phrase(key, rp_id) for key in sorted(in_domain)]
|
# Prune entries already covered by a reported wildcard (e.g. the auth
|
||||||
|
# host under '**.{rp-id}'); http origins outside localhost survive.
|
||||||
|
wildcards = [k for k in in_domain if wildcard_base(k)]
|
||||||
|
keys = [
|
||||||
|
k
|
||||||
|
for k in in_domain
|
||||||
|
if wildcard_base(k) or not any(_covered_by_wildcard(k, w) for w in wildcards)
|
||||||
|
]
|
||||||
|
phrases = [_origin_phrase(key, rp_id) for key in sorted(keys)]
|
||||||
if len(phrases) > 2:
|
if len(phrases) > 2:
|
||||||
n = len(phrases) - 1
|
n = len(phrases) - 1
|
||||||
return f"{phrases[0]}, +{n} site{'s' if n > 1 else ''}"
|
return f"{phrases[0]}, +{n} site{'s' if n > 1 else ''}"
|
||||||
|
|||||||
Reference in New Issue
Block a user