diff --git a/properties/advanced-dialog.c b/properties/advanced-dialog.c index 6457d0f..b624945 100644 --- a/properties/advanced-dialog.c +++ b/properties/advanced-dialog.c @@ -61,6 +61,7 @@ static const char *advanced_keys[] = { NM_SSH_KEY_SOCKS_BIND_ADDRESS, NM_SSH_KEY_LOCAL_BIND_ADDRESS, NM_SSH_KEY_REMOTE_BIND_ADDRESS, + NM_SSH_KEY_SSHPASS_PROMPT, NULL }; @@ -177,6 +178,16 @@ remote_bind_address_toggled_cb (GtkWidget *check, gpointer user_data) gtk_widget_set_sensitive (widget, gtk_check_button_get_active (GTK_CHECK_BUTTON (check))); } +static void +sshpass_prompt_toggled_cb (GtkWidget *check, gpointer user_data) +{ + GtkBuilder *builder = (GtkBuilder *) user_data; + GtkWidget *widget; + + widget = GTK_WIDGET (gtk_builder_get_object (builder, "sshpass_prompt_entry")); + gtk_widget_set_sensitive (widget, gtk_check_button_get_active (GTK_CHECK_BUTTON (check))); +} + GtkWidget * advanced_dialog_new (GHashTable *hash) { @@ -393,6 +404,25 @@ advanced_dialog_new (GHashTable *hash) gtk_widget_set_sensitive (widget, FALSE); } + widget = GTK_WIDGET (gtk_builder_get_object (builder, "sshpass_prompt_checkbutton")); + g_assert (widget); + g_signal_connect (G_OBJECT (widget), "toggled", G_CALLBACK (sshpass_prompt_toggled_cb), builder); + + value = g_hash_table_lookup (hash, NM_SSH_KEY_SSHPASS_PROMPT); + if (value && strlen (value)) { + gtk_check_button_set_active (GTK_CHECK_BUTTON (widget), TRUE); + + widget = GTK_WIDGET (gtk_builder_get_object (builder, "sshpass_prompt_entry")); + gtk_editable_set_text (GTK_EDITABLE (widget), value); + gtk_widget_set_sensitive (widget, TRUE); + } else { + gtk_check_button_set_active (GTK_CHECK_BUTTON (widget), FALSE); + + widget = GTK_WIDGET (gtk_builder_get_object (builder, "sshpass_prompt_entry")); + gtk_editable_set_text (GTK_EDITABLE (widget), ""); + gtk_widget_set_sensitive (widget, FALSE); + } + out: return dialog; } @@ -497,5 +527,14 @@ advanced_dialog_new_hash_from_dialog (GtkWidget *dialog, GError **error) g_hash_table_insert (hash, g_strdup (NM_SSH_KEY_REMOTE_BIND_ADDRESS), g_strdup(remote_bind_address)); } + widget = GTK_WIDGET (gtk_builder_get_object (builder, "sshpass_prompt_checkbutton")); + if (gtk_check_button_get_active (GTK_CHECK_BUTTON (widget))) { + const gchar *sshpass_prompt; + + widget = GTK_WIDGET (gtk_builder_get_object (builder, "sshpass_prompt_entry")); + sshpass_prompt = gtk_editable_get_text (GTK_EDITABLE (widget)); + g_hash_table_insert (hash, g_strdup (NM_SSH_KEY_SSHPASS_PROMPT), g_strdup(sshpass_prompt)); + } + return hash; } diff --git a/properties/nm-ssh-dialog.ui b/properties/nm-ssh-dialog.ui index d7a465c..bcd0d10 100644 --- a/properties/nm-ssh-dialog.ui +++ b/properties/nm-ssh-dialog.ui @@ -540,6 +540,42 @@ ip tuntap add name TUN_DEVICE mode tun user USER 10 + + + True + 6 + + + sshpass prompt match (-P flag): + True + False + True + True + + + False + True + 0 + + + + + True + + + + True + True + 1 + + + + + False + True + 11 + + diff --git a/shared/nm-service-defines.h b/shared/nm-service-defines.h index 12b56e1..7e2896c 100644 --- a/shared/nm-service-defines.h +++ b/shared/nm-service-defines.h @@ -53,6 +53,7 @@ #define NM_SSH_KEY_AUTH_TYPE "auth-type" #define NM_SSH_KEY_KEY_FILE "key-file" #define NM_SSH_KEY_PASSWORD "password" +#define NM_SSH_KEY_SSHPASS_PROMPT "sshpass-prompt" #define NM_SSH_DEFAULT_PORT 22 #define NM_SSH_DEFAULT_MTU 1500 diff --git a/src/nm-ssh-service.c b/src/nm-ssh-service.c index 61f0b9d..42a65e0 100644 --- a/src/nm-ssh-service.c +++ b/src/nm-ssh-service.c @@ -1020,6 +1020,13 @@ nm_ssh_start_ssh_binary (NMSshPlugin *plugin, /* Use sshpass binary */ add_ssh_arg (args, sshpass_binary); + /* Custom password prompt match (-P flag) */ + tmp = nm_setting_vpn_get_data_item (s_vpn, NM_SSH_KEY_SSHPASS_PROMPT); + if (tmp && strlen(tmp)) { + add_ssh_arg (args, "-P"); + add_ssh_arg (args, tmp); + } + /* Get password */ password = nm_setting_vpn_get_secret (s_vpn, NM_SSH_KEY_PASSWORD); if (password && strlen(password)) {