1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 09:27:59 +00:00

Unix pageant: handle askpass dialog close button.

Treat as aborting passphrase input. (Previously it would just hang.)
This commit is contained in:
Jacob Nevins 2021-04-05 17:48:30 +01:00
parent d3249671a2
commit 42e43376fc

View File

@ -146,6 +146,23 @@ static void add_text_to_passphrase(struct askpass_ctx *ctx, gchar *str)
visually_acknowledge_keypress(ctx);
}
static void cancel_askpass(struct askpass_ctx *ctx, const char *msg)
{
smemclr(ctx->passphrase, ctx->passsize);
ctx->passphrase = NULL;
ctx->error_message = dupstr(msg);
gtk_main_quit();
}
static gboolean askpass_dialog_closed(GtkWidget *widget, GdkEvent *event,
gpointer data)
{
struct askpass_ctx *ctx = (struct askpass_ctx *)data;
cancel_askpass(ctx, "passphrase input cancelled");
/* Don't destroy dialog yet, so gtk_askpass_cleanup() can do its work */
return true;
}
static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
struct askpass_ctx *ctx = (struct askpass_ctx *)data;
@ -155,10 +172,7 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
gtk_main_quit();
} else if (event->keyval == GDK_KEY_Escape &&
event->type == GDK_KEY_PRESS) {
smemclr(ctx->passphrase, ctx->passsize);
ctx->passphrase = NULL;
ctx->error_message = dupstr("passphrase input cancelled");
gtk_main_quit();
cancel_askpass(ctx, "passphrase input cancelled");
} else {
#if GTK_CHECK_VERSION(2,0,0)
if (gtk_im_context_filter_keypress(ctx->imc, event))
@ -380,10 +394,7 @@ static gboolean try_grab_keyboard(gpointer vctx)
* to give the user time to release that key.
*/
if (++ctx->nattempts >= 4) {
smemclr(ctx->passphrase, ctx->passsize);
ctx->passphrase = NULL;
ctx->error_message = dupstr("unable to grab keyboard after 5 seconds");
gtk_main_quit();
cancel_askpass(ctx, "unable to grab keyboard after 5 seconds");
} else {
g_timeout_add(1000/8, try_grab_keyboard, ctx);
}
@ -426,6 +437,8 @@ static const char *gtk_askpass_setup(struct askpass_ctx *ctx,
ctx->dialog = our_dialog_new();
gtk_window_set_title(GTK_WINDOW(ctx->dialog), window_title);
gtk_window_set_position(GTK_WINDOW(ctx->dialog), GTK_WIN_POS_CENTER);
g_signal_connect(G_OBJECT(ctx->dialog), "delete-event",
G_CALLBACK(askpass_dialog_closed), ctx);
ctx->promptlabel = gtk_label_new(prompt_text);
align_label_left(GTK_LABEL(ctx->promptlabel));
gtk_widget_show(ctx->promptlabel);