From c9a3823f13414e7c82a24a7f955aa542097a0fd0 Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Thu, 2 Apr 2026 13:33:51 +0200 Subject: [PATCH] fix: restore TTY access for eval_password commands Replace g_spawn_command_line_sync with g_spawn_sync with the G_SPAWN_CHILD_INHERITS_STDIN flag. This is actually needed to so that interactive commands can access the terminal. Otherwise they cannot ask the user for the passphrase. Ref: f5787fb31f9b287458c8f90e0fb8745026da7342 Fixes: https://github.com/profanity-im/profanity/issues/2143 Signed-off-by: Michael Vetter --- src/command/cmd_funcs.c | 1 + src/config/account.c | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 4d7a821b..ca58fc15 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -385,6 +385,7 @@ cmd_connect(ProfWin* window, const char* const command, gchar** args) // use eval_password if set } else if (account->eval_password) { gboolean res = account_eval_password(account); + ui_resize(); if (res) { conn_status = cl_ev_connect_account(account); free(account->password); diff --git a/src/config/account.c b/src/config/account.c index cf9650f6..76f96bfb 100644 --- a/src/config/account.c +++ b/src/config/account.c @@ -138,13 +138,23 @@ account_eval_password(ProfAccount* account) gchar* stdout_buf = NULL; GError* error = NULL; gint exit_status = 0; + gchar** argv = NULL; - if (!g_spawn_command_line_sync(account->eval_password, &stdout_buf, NULL, &exit_status, &error)) { - log_error("Failed to execute `eval_password` command: %s", error->message); + if (!g_shell_parse_argv(account->eval_password, NULL, &argv, &error)) { + log_error("Failed to parse `eval_password` command: %s", error->message); g_error_free(error); return FALSE; } + if (!g_spawn_sync(NULL, argv, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_CHILD_INHERITS_STDIN, NULL, NULL, &stdout_buf, NULL, &exit_status, &error)) { + log_error("Failed to execute `eval_password` command: %s", error->message); + g_strfreev(argv); + g_error_free(error); + return FALSE; + } + + g_strfreev(argv); + if (WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == 0) { account->password = stdout_buf; g_strstrip(account->password);