"""Test greeter failure/retry/launch against a fake greetd server. Usage: QML2_IMPORT_PATH=/lib/qt-6/qml python3 scripts/greeter-check.py Requires qs on PATH. No real authentication or desktop launch occurs. """ import json, os, socket, struct, subprocess as sp, tempfile, time, shutil, sys from pathlib import Path qs = shutil.which("qs") assert qs, "qs must be on PATH" root = Path(tempfile.mkdtemp(prefix="fred-greetd-check.")) root.chmod(0o700) shutil.copytree(str(Path(sys.argv[1]) / "greeter"), root / "config") p = root / "config/shell.qml" p.chmod(0o600) s = ( p.read_text() .replace("import Quickshell\n", "import Quickshell\nimport Quickshell.Io\n") .replace(" AuthView {", " AuthView {\n id: auth") ) s = ( s.rstrip()[:-1] + """ IpcHandler { target: "test" function submit(password: string): void { auth.submitted(password); } function closeCheck(): bool { root.close(); return root.visible && (root.flags & Qt.FramelessWindowHint) !== 0; } } } """ ) p.write_text(s) server = socket.socket(socket.AF_UNIX) server.bind(str(root / "greetd.sock")) server.listen() server.settimeout(10) env = { **os.environ, "HOME": str(root), "XDG_RUNTIME_DIR": str(root), "GREETD_SOCK": str(root / "greetd.sock"), "FRED_GREETER": "1", "QT_QPA_PLATFORM": "offscreen", "QT_QUICK_BACKEND": "software", "FRED_SESSION_COMMAND": "/fixture/authenticated-session", } log = open(root / "log", "w") proc = sp.Popen([qs, "-p", str(root / "config")], env=env, stdout=log, stderr=log) try: conn, _ = server.accept() conn.settimeout(5) def recv(): data = b"" while len(data) < 4: data += conn.recv(4 - len(data)) size = struct.unpack("