fix(desktop): use sudo callback without interactive env

This commit is contained in:
helix4u 2026-06-10 12:44:37 -06:00 committed by Teknium
parent a8f404b29f
commit 1e7316ced2
2 changed files with 31 additions and 2 deletions

View file

@ -90,6 +90,30 @@ def test_cached_sudo_password_is_used_when_env_is_unset(monkeypatch):
assert sudo_stdin == "cached-pass\n"
def test_registered_sudo_callback_is_used_without_interactive_env(monkeypatch):
monkeypatch.delenv("SUDO_PASSWORD", raising=False)
monkeypatch.delenv("HERMES_INTERACTIVE", raising=False)
monkeypatch.setattr(terminal_tool, "_sudo_nopasswd_works", lambda: False)
calls = []
def sudo_callback():
calls.append("called")
return "callback-pass"
terminal_tool.set_sudo_password_callback(sudo_callback)
try:
transformed, sudo_stdin = terminal_tool._transform_sudo_command(
"echo ok | sudo tee /tmp/hermes-test"
)
finally:
terminal_tool.set_sudo_password_callback(None)
assert calls == ["called"]
assert transformed == "echo ok | sudo -S -p '' tee /tmp/hermes-test"
assert sudo_stdin == "callback-pass\n"
def test_cached_sudo_password_isolated_by_session_key(monkeypatch):
monkeypatch.delenv("SUDO_PASSWORD", raising=False)
monkeypatch.delenv("HERMES_INTERACTIVE", raising=False)

View file

@ -777,7 +777,8 @@ def _transform_sudo_command(command: str | None) -> tuple[str | None, str | None
the password in the command string themselves; see their execute()
methods for how they handle the non-None sudo_stdin case.
If SUDO_PASSWORD is not set and in interactive mode (HERMES_INTERACTIVE=1):
If SUDO_PASSWORD is not set and an interactive UI is available
(HERMES_INTERACTIVE=1 or a registered sudo password callback):
Prompts user for password with 45s timeout, caches for session.
If SUDO_PASSWORD is not set and NOT interactive:
@ -805,7 +806,11 @@ def _transform_sudo_command(command: str | None) -> tuple[str | None, str | None
if not has_configured_password and not sudo_password and _sudo_nopasswd_works():
return command, None
if not has_configured_password and not sudo_password and env_var_enabled("HERMES_INTERACTIVE"):
has_sudo_prompt_callback = _get_sudo_password_callback() is not None
should_prompt_for_sudo = (
env_var_enabled("HERMES_INTERACTIVE") or has_sudo_prompt_callback
)
if not has_configured_password and not sudo_password and should_prompt_for_sudo:
sudo_password = _prompt_for_sudo_password(timeout_seconds=45)
if sudo_password:
_set_cached_sudo_password(sudo_password)