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
+
+
+
+ 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)) {