banner.py file-level

at main · View file ↗ · Intel ↗

History
1 files
1 commits
0 hotspots
0 🧊 dead
0 💥 blast risk
sha256:6 fix(ISR): default require_independent_second_reviewer to require Opera… · aaronrene · Sep 2, 2026
1 """Parse ``ok app`` startup banner lines for the desktop launcher."""
2
3 from __future__ import annotations
4
5 import re
6 from dataclasses import dataclass
7
8 from tools.desktop.constants import (
9 CSRF_PREFIX,
10 LISTENING_BANNER,
11 SESSION_PREFIX,
12 URL_PREFIX,
13 )
14
15 _URL_RE = re.compile(r"^url:\s*(\S+)\s*$")
16 _SESSION_RE = re.compile(r"^session_credential:\s*(\S+)\s*$")
17 _CSRF_RE = re.compile(r"^csrf_token:\s*(\S+)\s*$")
18
19
20 @dataclass(frozen=True)
21 class StartupBanner:
22 """Credentials and URL emitted once on ``ok app`` stderr."""
23
24 url: str
25 session_credential: str
26 csrf_token: str
27
28 @property
29 def origin(self) -> str:
30 """Return the loopback origin for CORS checks in packaging tests."""
31 from urllib.parse import urlparse
32
33 parsed = urlparse(self.url)
34 return f"{parsed.scheme}://{parsed.hostname}:{parsed.port}"
35
36
37 def parse_startup_banner_line(line: str) -> tuple[str, str] | None:
38 """Parse a single stderr line; return ``(field, value)`` or ``None``."""
39 text = line.rstrip("\n")
40 if text == LISTENING_BANNER:
41 return ("listening", text)
42 for pattern, field in (
43 (_URL_RE, "url"),
44 (_SESSION_RE, "session_credential"),
45 (_CSRF_RE, "csrf_token"),
46 ):
47 match = pattern.match(text)
48 if match:
49 return (field, match.group(1))
50 return None
51
52
53 def parse_startup_stderr(lines: list[str]) -> StartupBanner | None:
54 """Collect banner fields from stderr lines; return ``None`` when incomplete."""
55 url: str | None = None
56 session: str | None = None
57 csrf: str | None = None
58 for line in lines:
59 parsed = parse_startup_banner_line(line)
60 if parsed is None:
61 continue
62 field, value = parsed
63 if field == "url":
64 url = value
65 elif field == "session_credential":
66 session = value
67 elif field == "csrf_token":
68 csrf = value
69 if url and session and csrf:
70 return StartupBanner(url=url, session_credential=session, csrf_token=csrf)
71 return None