feat: prove and decode K1 realtime MQTT streams
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import platform
|
||||
import shutil
|
||||
import subprocess
|
||||
|
||||
|
||||
class CredentialDialogError(RuntimeError):
|
||||
"""Raised when the local macOS credential dialog cannot return a value."""
|
||||
|
||||
|
||||
def _dialog_text(prompt: str, hidden: bool) -> str:
|
||||
if platform.system() != "Darwin":
|
||||
raise CredentialDialogError("Secure credential dialogs are supported only on macOS")
|
||||
osascript = shutil.which("osascript")
|
||||
if osascript is None:
|
||||
raise CredentialDialogError("osascript is unavailable")
|
||||
|
||||
hidden_clause = " with hidden answer" if hidden else ""
|
||||
script = (
|
||||
f'text returned of (display dialog "{prompt}" default answer ""'
|
||||
f'{hidden_clause} buttons {{"Отмена", "Продолжить"}} '
|
||||
'default button "Продолжить" cancel button "Отмена")'
|
||||
)
|
||||
try:
|
||||
result = subprocess.run(
|
||||
[osascript, "-e", script],
|
||||
check=False,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=300,
|
||||
)
|
||||
except (OSError, subprocess.SubprocessError) as exc:
|
||||
raise CredentialDialogError("macOS credential dialog failed") from exc
|
||||
|
||||
if result.returncode != 0:
|
||||
raise CredentialDialogError("Credential entry was cancelled")
|
||||
value = result.stdout.rstrip("\r\n")
|
||||
if not value:
|
||||
raise CredentialDialogError("Credential value must not be empty")
|
||||
return value
|
||||
|
||||
|
||||
def prompt_wifi_credentials() -> tuple[str, str]:
|
||||
"""Collect Wi-Fi credentials locally without placing them in command arguments."""
|
||||
ssid = _dialog_text("Имя Wi-Fi сети, к которой подключён Mac", hidden=False)
|
||||
password = _dialog_text("Пароль этой Wi-Fi сети", hidden=True)
|
||||
return ssid, password
|
||||
Reference in New Issue
Block a user