diff options
author | Giovanni Panozzo <giovanni@panozzo.it> | 2020-01-16 09:33:27 +0300 |
---|---|---|
committer | Giovanni Panozzo <giovanni@panozzo.it> | 2020-01-17 00:55:48 +0300 |
commit | d122b153d793b9cbe38a739abbe245efb252fa06 (patch) | |
tree | 9a3f1f67683b2d39b419b59f800b49078a70c3b0 | |
parent | 76bd27b0a58b3a1111fcca949d95618df7b1cfd6 (diff) |
Separate ssh tunnel params from ssh connection params
-rw-r--r-- | plugins/rdp/rdp_plugin.c | 19 | ||||
-rw-r--r-- | plugins/vnc/vnc_plugin.c | 2 | ||||
-rw-r--r-- | plugins/xdmcp/xdmcp_plugin.c | 6 | ||||
-rw-r--r-- | src/remmina_applet_menu_item.c | 4 | ||||
-rw-r--r-- | src/remmina_applet_menu_item.h | 2 | ||||
-rw-r--r-- | src/remmina_file.c | 122 | ||||
-rw-r--r-- | src/remmina_file.h | 1 | ||||
-rw-r--r-- | src/remmina_file_editor.c | 293 | ||||
-rw-r--r-- | src/remmina_protocol_widget.c | 68 | ||||
-rw-r--r-- | src/remmina_sftp_client.c | 4 | ||||
-rw-r--r-- | src/remmina_sftp_plugin.c | 53 | ||||
-rw-r--r-- | src/remmina_ssh.c | 119 | ||||
-rw-r--r-- | src/remmina_ssh.h | 7 | ||||
-rw-r--r-- | src/remmina_ssh_plugin.c | 54 |
14 files changed, 376 insertions, 378 deletions
diff --git a/plugins/rdp/rdp_plugin.c b/plugins/rdp/rdp_plugin.c index 941f36e17..4c643bb90 100644 --- a/plugins/rdp/rdp_plugin.c +++ b/plugins/rdp/rdp_plugin.c @@ -184,25 +184,18 @@ static gboolean remmina_rdp_tunnel_init(RemminaProtocolWidget *gp) const gchar *cert_hostport; rfContext *rfi = GET_PLUGIN_DATA(gp); - RemminaFile *remminafile; - - remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); - + g_debug("[RDP] %s\n", __func__); hostport = remmina_plugin_service->protocol_plugin_start_direct_tunnel(gp, 3389, FALSE); if (hostport == NULL) return FALSE; remmina_plugin_service->get_server_port(hostport, 3389, &host, &port); + g_debug("[RDP] protocol_plugin_start_direct_tunnel() returned %s\n", hostport); + cert_host = host; cert_port = port; - if (remmina_plugin_service->file_get_int(remminafile, "ssh_enabled", FALSE)) { - cert_hostport = remmina_plugin_service->file_get_string(remminafile, "server"); - if (cert_hostport) - remmina_plugin_service->get_server_port(cert_hostport, 3389, &cert_host, &cert_port); - } - if (!rfi->is_reconnecting) { /* settings->CertificateName and settings->ServerHostname is created * only on 1st connect, not on reconnections */ @@ -218,12 +211,16 @@ static gboolean remmina_rdp_tunnel_init(RemminaProtocolWidget *gp) } } + g_debug("[RDP] tunnel has been optionally initialized. Now connecting to %s:%d\n", host, port); + if (cert_host != host) g_free(cert_host); g_free(host); g_free(hostport); rfi->settings->ServerPort = port; + + return TRUE; } @@ -1007,7 +1004,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp) rfi->settings->AutoReconnectionEnabled = (remmina_plugin_service->file_get_int(remminafile, "disableautoreconnect", FALSE) ? FALSE : TRUE); /* Disable RDP auto reconnection when SSH tunnel is enabled */ - if (remmina_plugin_service->file_get_int(remminafile, "ssh_enabled", FALSE)) + if (remmina_plugin_service->file_get_int(remminafile, "ssh_tunnel_enabled", FALSE)) rfi->settings->AutoReconnectionEnabled = FALSE; rfi->settings->ColorDepth = remmina_plugin_service->file_get_int(remminafile, "colordepth", 66); diff --git a/plugins/vnc/vnc_plugin.c b/plugins/vnc/vnc_plugin.c index 970bc4bee..8a0964fda 100644 --- a/plugins/vnc/vnc_plugin.c +++ b/plugins/vnc/vnc_plugin.c @@ -1163,7 +1163,7 @@ static gboolean remmina_plugin_vnc_main(RemminaProtocolWidget *gp) if (host[0] == '\0') { cl->serverHost = g_strdup(host); cl->listenSpecified = TRUE; - if (remmina_plugin_service->file_get_int(remminafile, "ssh_enabled", FALSE)) + if (remmina_plugin_service->file_get_int(remminafile, "ssh_tunnel_enabled", FALSE)) /* When we use reverse tunnel, the local port does not really matter. * Hardcode a default port just in case the remote port is customized * to a privilege port then we will have problem listening. */ diff --git a/plugins/xdmcp/xdmcp_plugin.c b/plugins/xdmcp/xdmcp_plugin.c index 9e0592d4c..d5e8c668d 100644 --- a/plugins/xdmcp/xdmcp_plugin.c +++ b/plugins/xdmcp/xdmcp_plugin.c @@ -135,7 +135,7 @@ static gboolean remmina_plugin_xdmcp_start_xephyr(RemminaProtocolWidget *gp) argv[argc++] = g_strdup("tcp"); } - if (!remmina_plugin_service->file_get_int(remminafile, "ssh_enabled", FALSE)) { + if (!remmina_plugin_service->file_get_int(remminafile, "ssh_tunnel_enabled", FALSE)) { remmina_plugin_service->get_server_port(remmina_plugin_service->file_get_string(remminafile, "server"), 0, &host, &i); @@ -204,7 +204,7 @@ static gboolean remmina_plugin_xdmcp_main(RemminaProtocolWidget *gp) remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); - if (remmina_plugin_service->file_get_int(remminafile, "ssh_enabled", FALSE)) { + if (remmina_plugin_service->file_get_int(remminafile, "ssh_tunnel_enabled", FALSE)) { if (!remmina_plugin_service->protocol_plugin_start_xport_tunnel(gp, remmina_plugin_xdmcp_tunnel_init_callback)) { gpdata->thread = 0; return FALSE; @@ -276,7 +276,7 @@ static gboolean remmina_plugin_xdmcp_open_connection(RemminaProtocolWidget *gp) gpdata->socket_id = gtk_socket_get_id(GTK_SOCKET(gpdata->socket)); - if (remmina_plugin_service->file_get_int(remminafile, "ssh_enabled", FALSE)) { + if (remmina_plugin_service->file_get_int(remminafile, "ssh_tunnel_enabled", FALSE)) { if (pthread_create(&gpdata->thread, NULL, remmina_plugin_xdmcp_main_thread, gp)) { remmina_plugin_service->protocol_plugin_set_error(gp, "Failed to initialize pthread. Falling back to non-thread mode…"); diff --git a/src/remmina_applet_menu_item.c b/src/remmina_applet_menu_item.c index 85477c533..546f12b16 100644 --- a/src/remmina_applet_menu_item.c +++ b/src/remmina_applet_menu_item.c @@ -69,7 +69,7 @@ static void remmina_applet_menu_item_init(RemminaAppletMenuItem* item) item->group = NULL; item->protocol = NULL; item->server = NULL; - item->ssh_enabled = FALSE; + item->ssh_tunnel_enabled = FALSE; g_signal_connect(G_OBJECT(item), "destroy", G_CALLBACK(remmina_applet_menu_item_destroy), NULL); } @@ -104,7 +104,7 @@ GtkWidget* remmina_applet_menu_item_new(RemminaAppletMenuItemType item_type, ... item->group = g_key_file_get_string(gkeyfile, "remmina", "group", NULL); item->protocol = g_key_file_get_string(gkeyfile, "remmina", "protocol", NULL); item->server = g_key_file_get_string(gkeyfile, "remmina", "server", NULL); - item->ssh_enabled = g_key_file_get_boolean(gkeyfile, "remmina", "ssh_enabled", NULL); + item->ssh_tunnel_enabled = g_key_file_get_boolean(gkeyfile, "remmina", "ssh_tunnel_enabled", NULL); g_key_file_free(gkeyfile); diff --git a/src/remmina_applet_menu_item.h b/src/remmina_applet_menu_item.h index 1a1a1fbfe..09424a077 100644 --- a/src/remmina_applet_menu_item.h +++ b/src/remmina_applet_menu_item.h @@ -57,7 +57,7 @@ typedef struct _RemminaAppletMenuItem { gchar * group; gchar * protocol; gchar * server; - gboolean ssh_enabled; + gboolean ssh_tunnel_enabled; } RemminaAppletMenuItem; typedef struct _RemminaAppletMenuItemClass { diff --git a/src/remmina_file.c b/src/remmina_file.c index 2f602b2a5..a37f445e6 100644 --- a/src/remmina_file.c +++ b/src/remmina_file.c @@ -66,6 +66,8 @@ #define MIN_WINDOW_WIDTH 10 #define MIN_WINDOW_HEIGHT 10 +#define KEYFILE_GROUP_REMMINA "remmina" + static struct timespec times[2]; static RemminaFile * @@ -233,6 +235,87 @@ const RemminaProtocolSetting *find_protocol_setting(const gchar *name, RemminaPr return NULL; } + +static void upgrade_sshkeys_202001_mig_common_setting(RemminaFile *remminafile, gboolean protocol_is_ssh, gboolean ssh_enabled, gchar *suffix) +{ + gchar *src_key; + gchar *dst_key; + const gchar *val; + + src_key = g_strdup_printf("ssh_%s", suffix); + dst_key = g_strdup_printf("ssh_tunnel_%s", suffix); + + val = remmina_file_get_string(remminafile, src_key); + if (!val) { + g_free(dst_key); + g_free(src_key); + return; + } + + if (ssh_enabled && val && val[0] != 0) + remmina_file_set_string(remminafile, dst_key, val); + + if (!protocol_is_ssh) + remmina_file_remove_key(remminafile, src_key); + + g_free(dst_key); + g_free(src_key); +} + +static void upgrade_sshkeys_202001(RemminaFile *remminafile) +{ + TRACE_CALL(__func__); + + gboolean protocol_is_ssh; + gboolean ssh_enabled; + const gchar *val; + + if (remmina_file_get_string(remminafile, "ssh_enabled")) { + + /* Upgrade ssh params from remmina pre 1.4 */ + + ssh_enabled = remmina_file_get_int(remminafile, "ssh_enabled", 0); + val = remmina_file_get_string(remminafile, "protocol"); + protocol_is_ssh = (strcmp(val, "SSH") == 0); + + upgrade_sshkeys_202001_mig_common_setting(remminafile, protocol_is_ssh, ssh_enabled, "stricthostkeycheck"); + upgrade_sshkeys_202001_mig_common_setting(remminafile, protocol_is_ssh, ssh_enabled, "kex_algorithms"); + upgrade_sshkeys_202001_mig_common_setting(remminafile, protocol_is_ssh, ssh_enabled, "hostkeytypes"); + upgrade_sshkeys_202001_mig_common_setting(remminafile, protocol_is_ssh, ssh_enabled, "ciphers"); + upgrade_sshkeys_202001_mig_common_setting(remminafile, protocol_is_ssh, ssh_enabled, "proxycommand"); + upgrade_sshkeys_202001_mig_common_setting(remminafile, protocol_is_ssh, ssh_enabled, "passphrase"); + upgrade_sshkeys_202001_mig_common_setting(remminafile, protocol_is_ssh, ssh_enabled, "auth"); + upgrade_sshkeys_202001_mig_common_setting(remminafile, protocol_is_ssh, ssh_enabled, "privatekey"); + + val = remmina_file_get_string(remminafile, "ssh_loopback"); + remmina_file_set_string(remminafile, "ssh_tunnel_loopback", val); + remmina_file_remove_key(remminafile, "ssh_loopback"); + + val = remmina_file_get_string(remminafile, "ssh_username"); + remmina_file_set_string(remminafile, "ssh_tunnel_username", val); + remmina_file_set_string(remminafile, "username", val); + remmina_file_remove_key(remminafile, "ssh_username"); + + val = remmina_file_get_string(remminafile, "ssh_password"); + remmina_file_set_string(remminafile, "ssh_tunnel_password", val); + remmina_file_set_string(remminafile, "password", val); + remmina_file_remove_key(remminafile, "ssh_password"); + + val = remmina_file_get_string(remminafile, "ssh_server"); + remmina_file_set_string(remminafile, "ssh_tunnel_server", val); + // g_key_file_set_string(gkeyfile, KEYFILE_GROUP_REMMINA, "server", val); + remmina_file_remove_key(remminafile, "ssh_server"); + + remmina_file_remove_key(remminafile, "ssh_enabled"); + remmina_file_remove_key(remminafile, "save_ssh_server"); + remmina_file_remove_key(remminafile, "save_ssh_username"); + + remmina_file_set_int(remminafile, "ssh_tunnel_enabled", ssh_enabled); + + } + +} + RemminaFile * remmina_file_load(const gchar *filename) { @@ -260,13 +343,14 @@ remmina_file_load(const gchar *filename) } } - if (g_key_file_has_key(gkeyfile, "remmina", "name", NULL)) { + if (g_key_file_has_key(gkeyfile, KEYFILE_GROUP_REMMINA, "name", NULL)) { + remminafile = remmina_file_new_empty(); protocol_plugin = NULL; /* Identify the protocol plugin and get pointers to its RemminaProtocolSetting structs */ - proto = g_key_file_get_string(gkeyfile, "remmina", "protocol", NULL); + proto = g_key_file_get_string(gkeyfile, KEYFILE_GROUP_REMMINA, "protocol", NULL); if (proto) { protocol_plugin = (RemminaProtocolPlugin *)remmina_plugin_manager_get_plugin(REMMINA_PLUGIN_TYPE_PROTOCOL, proto); g_free(proto); @@ -276,12 +360,13 @@ remmina_file_load(const gchar *filename) secret_service_available = secret_plugin && secret_plugin->is_service_available(); remminafile->filename = g_strdup(filename); - keys = g_key_file_get_keys(gkeyfile, "remmina", NULL, NULL); + keys = g_key_file_get_keys(gkeyfile, KEYFILE_GROUP_REMMINA, NULL, NULL); if (keys) { + for (i = 0; keys[i]; i++) { key = keys[i]; if (protocol_plugin && remmina_plugin_manager_is_encrypted_setting(protocol_plugin, key)) { - s = g_key_file_get_string(gkeyfile, "remmina", key, NULL); + s = g_key_file_get_string(gkeyfile, KEYFILE_GROUP_REMMINA, key, NULL); if (g_strcmp0(s, ".") == 0) { if (secret_service_available) { sec = secret_plugin->get_password(remminafile, key); @@ -299,7 +384,7 @@ remmina_file_load(const gchar *filename) } else { /* If we find "resolution", then we split it in two */ if (strcmp(key, "resolution") == 0) { - resolution_str = g_key_file_get_string(gkeyfile, "remmina", key, NULL); + resolution_str = g_key_file_get_string(gkeyfile, KEYFILE_GROUP_REMMINA, key, NULL); if (remmina_public_split_resolution_string(resolution_str, &w, &h)) { remmina_file_set_string_ref(remminafile, "resolution_width", g_strdup_printf("%i", w)); remmina_file_set_string_ref(remminafile, "resolution_height", g_strdup_printf("%i", h)); @@ -310,11 +395,13 @@ remmina_file_load(const gchar *filename) g_free(resolution_str); } else { remmina_file_set_string_ref(remminafile, key, - g_key_file_get_string(gkeyfile, "remmina", key, NULL)); + g_key_file_get_string(gkeyfile, KEYFILE_GROUP_REMMINA, key, NULL)); } } } - g_strfreev(keys); + + upgrade_sshkeys_202001(remminafile); + } } else { g_debug("Unable to load remmina profile file %s: cannot find key name= in section remmina.\n", filename); @@ -351,6 +438,11 @@ void remmina_file_set_string_ref(RemminaFile *remminafile, const gchar *setting, } } +gboolean remmina_file_remove_key(RemminaFile *remminafile, const gchar *setting) +{ + return g_hash_table_remove(remminafile->settings, setting); +} + const gchar * remmina_file_get_string(RemminaFile *remminafile, const gchar *setting) { @@ -484,19 +576,19 @@ void remmina_file_save(RemminaFile *remminafile) if (value && value[0]) { if (g_strcmp0(value, ".") != 0) secret_plugin->store_password(remminafile, key, value); - g_key_file_set_string(gkeyfile, "remmina", key, "."); + g_key_file_set_string(gkeyfile, KEYFILE_GROUP_REMMINA, key, "."); } else { - g_key_file_set_string(gkeyfile, "remmina", key, ""); + g_key_file_set_string(gkeyfile, KEYFILE_GROUP_REMMINA, key, ""); secret_plugin->delete_password(remminafile, key); } } else { g_debug ("We have a password and disablepasswordstoring=0"); if (value && value[0] && nopasswdsave == 0) { s = remmina_crypt_encrypt(value); - g_key_file_set_string(gkeyfile, "remmina", key, s); + g_key_file_set_string(gkeyfile, KEYFILE_GROUP_REMMINA, key, s); g_free(s); } else { - g_key_file_set_string(gkeyfile, "remmina", key, ""); + g_key_file_set_string(gkeyfile, KEYFILE_GROUP_REMMINA, key, ""); } } if (secret_service_available && nopasswdsave == 1) { @@ -504,18 +596,18 @@ void remmina_file_save(RemminaFile *remminafile) if (g_strcmp0(value, ".") != 0) { g_debug ("Deleting the secret in the keyring as disablepasswordstoring=1"); secret_plugin->delete_password(remminafile, key); - g_key_file_set_string(gkeyfile, "remmina", key, "."); + g_key_file_set_string(gkeyfile, KEYFILE_GROUP_REMMINA, key, "."); } } } } } else { - g_key_file_set_string(gkeyfile, "remmina", key, value); + g_key_file_set_string(gkeyfile, KEYFILE_GROUP_REMMINA, key, value); } } /* Avoid storing redundant and deprecated "resolution" field */ - g_key_file_remove_key(gkeyfile, "remmina", "resolution", NULL); + g_key_file_remove_key(gkeyfile, KEYFILE_GROUP_REMMINA, "resolution", NULL); /* Store gkeyfile to disk (password are already sent to keyring) */ content = g_key_file_to_data(gkeyfile, &length, NULL); @@ -580,7 +672,7 @@ remmina_file_get_icon_name(RemminaFile *remminafile) if (!plugin) return g_strconcat (REMMINA_APP_ID, "-symbolic", NULL); - return remmina_file_get_int(remminafile, "ssh_enabled", FALSE) ? plugin->icon_name_ssh : plugin->icon_name; + return remmina_file_get_int(remminafile, "ssh_tunnel_enabled", FALSE) ? plugin->icon_name_ssh : plugin->icon_name; } RemminaFile * diff --git a/src/remmina_file.h b/src/remmina_file.h index e8a92d057..8d03a9232 100644 --- a/src/remmina_file.h +++ b/src/remmina_file.h @@ -71,6 +71,7 @@ gchar *remmina_file_get_secret(RemminaFile *remminafile, const gchar *setting); void remmina_file_set_int(RemminaFile *remminafile, const gchar *setting, gint value); gint remmina_file_get_int(RemminaFile *remminafile, const gchar *setting, gint default_value); void remmina_file_store_secret_plugin_password(RemminaFile *remminafile, const gchar *key, const gchar *value); +gboolean remmina_file_remove_key(RemminaFile *remminafile, const gchar *setting); /* Create or overwrite the .remmina file */ void remmina_file_save(RemminaFile *remminafile); /* Free the RemminaFile object */ diff --git a/src/remmina_file_editor.c b/src/remmina_file_editor.c index d4955bbf1..8b11fa1e9 100644 --- a/src/remmina_file_editor.c +++ b/src/remmina_file_editor.c @@ -125,19 +125,18 @@ struct _RemminaFileEditorPriv { GtkWidget * resolution_custom_combo; GtkWidget * keymap_combo; - GtkWidget * ssh_enabled_check; - GtkWidget * ssh_loopback_check; - GtkWidget * ssh_server_default_radio; - GtkWidget * ssh_server_custom_radio; - GtkWidget * ssh_server_entry; - GtkWidget * ssh_auth_agent_radio; - GtkWidget * ssh_auth_password_radio; - GtkWidget * ssh_auth_password; - GtkWidget * ssh_auth_publickey_radio; - GtkWidget * ssh_auth_auto_publickey_radio; - GtkWidget * ssh_username_entry; - GtkWidget * ssh_privatekey_chooser; - GtkWidget * ssh_charset_combo; + GtkWidget * ssh_tunnel_enabled_check; + GtkWidget * ssh_tunnel_loopback_check; + GtkWidget * ssh_tunnel_server_default_radio; + GtkWidget * ssh_tunnel_server_custom_radio; + GtkWidget * ssh_tunnel_server_entry; + GtkWidget * ssh_tunnel_auth_agent_radio; + GtkWidget * ssh_tunnel_auth_password_radio; + GtkWidget * ssh_tunnel_auth_password; + GtkWidget * ssh_tunnel_auth_publickey_radio; + GtkWidget * ssh_tunnel_auth_auto_publickey_radio; + GtkWidget * ssh_tunnel_username_entry; + GtkWidget * ssh_tunnel_privatekey_chooser; GHashTable * setting_widgets; }; @@ -272,32 +271,32 @@ static GtkWidget *remmina_file_editor_create_notebook_tab(RemminaFileEditor *gfe #ifdef HAVE_LIBSSH -static void remmina_file_editor_ssh_server_custom_radio_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe) +static void remmina_file_editor_ssh_tunnel_server_custom_radio_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe) { TRACE_CALL(__func__); - gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_server_entry), - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_enabled_check)) && - (gfe->priv->ssh_server_custom_radio == NULL || - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_server_custom_radio))) + gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_tunnel_server_entry), + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_tunnel_enabled_check)) && + (gfe->priv->ssh_tunnel_server_custom_radio == NULL || + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_tunnel_server_custom_radio))) ); } -static void remmina_file_editor_ssh_auth_publickey_radio_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe) +static void remmina_file_editor_ssh_tunnel_auth_publickey_radio_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe) { TRACE_CALL(__func__); gboolean b; const gchar *s; - b = ((!gfe->priv->ssh_enabled_check || - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_enabled_check))) && - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_auth_publickey_radio))); - gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_privatekey_chooser), b); + b = ((!gfe->priv->ssh_tunnel_enabled_check || + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_tunnel_enabled_check))) && + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_tunnel_auth_publickey_radio))); + gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_tunnel_privatekey_chooser), b); - if (b && (s = remmina_file_get_string(gfe->priv->remmina_file, "ssh_privatekey"))) - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(gfe->priv->ssh_privatekey_chooser), s); + if (b && (s = remmina_file_get_string(gfe->priv->remmina_file, "ssh_tunnel_privatekey"))) + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(gfe->priv->ssh_tunnel_privatekey_chooser), s); } -static void remmina_file_editor_ssh_enabled_check_on_toggled(GtkToggleButton *togglebutton, +static void remmina_file_editor_ssh_tunnel_enabled_check_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe, RemminaProtocolSSHSetting ssh_setting) { TRACE_CALL(__func__); @@ -306,39 +305,38 @@ static void remmina_file_editor_ssh_enabled_check_on_toggled(GtkToggleButton *to gchar *p; const gchar *cp; - if (gfe->priv->ssh_enabled_check) { - enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_enabled_check)); - if (gfe->priv->ssh_loopback_check) - gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_loopback_check), enabled); - if (gfe->priv->ssh_server_default_radio) - gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_server_default_radio), enabled); - if (gfe->priv->ssh_server_custom_radio) - gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_server_custom_radio), enabled); - remmina_file_editor_ssh_server_custom_radio_on_toggled(NULL, gfe); + if (gfe->priv->ssh_tunnel_enabled_check) { + enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_tunnel_enabled_check)); + if (gfe->priv->ssh_tunnel_loopback_check) + gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_tunnel_loopback_check), enabled); + if (gfe->priv->ssh_tunnel_server_default_radio) + gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_tunnel_server_default_radio), enabled); + if (gfe->priv->ssh_tunnel_server_custom_radio) + gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_tunnel_server_custom_radio), enabled); + remmina_file_editor_ssh_tunnel_server_custom_radio_on_toggled(NULL, gfe); p = remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->protocol_combo)); //if (!(g_strcmp0(p, "SFTP") == 0 || g_strcmp0(p, "SSH") == 0)) { - gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_charset_combo), enabled); - gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_username_entry), enabled); - gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_auth_agent_radio), enabled); - gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_auth_password_radio), enabled); - gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_auth_password), enabled); - gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_auth_publickey_radio), enabled); - gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_auth_auto_publickey_radio), enabled); + gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_tunnel_username_entry), enabled); + gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_tunnel_auth_agent_radio), enabled); + gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_tunnel_auth_password_radio), enabled); + gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_tunnel_auth_password), enabled); + gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_tunnel_auth_publickey_radio), enabled); + gtk_widget_set_sensitive(GTK_WIDGET(gfe->priv->ssh_tunnel_auth_auto_publickey_radio), enabled); //} g_free(p); } - remmina_file_editor_ssh_auth_publickey_radio_on_toggled(NULL, gfe); + remmina_file_editor_ssh_tunnel_auth_publickey_radio_on_toggled(NULL, gfe); - if (gfe->priv->ssh_username_entry) - if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->priv->ssh_username_entry)) [0] == '\0') { - cp = remmina_file_get_string(priv->remmina_file, "ssh_username"); - gtk_entry_set_text(GTK_ENTRY(gfe->priv->ssh_username_entry), cp ? cp : ""); + if (gfe->priv->ssh_tunnel_username_entry) + if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->priv->ssh_tunnel_username_entry)) [0] == '\0') { + cp = remmina_file_get_string(priv->remmina_file, "ssh_tunnel_username"); + gtk_entry_set_text(GTK_ENTRY(gfe->priv->ssh_tunnel_username_entry), cp ? cp : ""); } - if (gfe->priv->ssh_auth_password) { - if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->priv->ssh_auth_password)) [0] == '\0') { - cp = remmina_file_get_string(priv->remmina_file, "ssh_password"); - gtk_entry_set_text(GTK_ENTRY(gfe->priv->ssh_auth_password), cp ? cp : ""); + if (gfe->priv->ssh_tunnel_auth_password) { + if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->priv->ssh_tunnel_auth_password)) [0] == '\0') { + cp = remmina_file_get_string(priv->remmina_file, "ssh_tunnel_password"); + gtk_entry_set_text(GTK_ENTRY(gfe->priv->ssh_tunnel_auth_password), cp ? cp : ""); } } } @@ -353,10 +351,10 @@ static void remmina_file_editor_create_ssh_privatekey(RemminaFileEditor *gfe, Gt RemminaFileEditorPriv *priv = gfe->priv; widget = gtk_radio_button_new_with_label_from_widget( - GTK_RADIO_BUTTON(priv->ssh_auth_password_radio), _("Identity file")); + GTK_RADIO_BUTTON(priv->ssh_tunnel_auth_password_radio), _("Identity file")); g_signal_connect(G_OBJECT(widget), "toggled", - G_CALLBACK(remmina_file_editor_ssh_auth_publickey_radio_on_toggled), gfe); - priv->ssh_auth_publickey_radio = widget; + G_CALLBACK(remmina_file_editor_ssh_tunnel_auth_publickey_radio_on_toggled), gfe); + priv->ssh_tunnel_auth_publickey_radio = widget; gtk_widget_show(widget); gtk_grid_attach(GTK_GRID(grid), widget, 0, row + 22, 1, 1); @@ -376,15 +374,15 @@ static void remmina_file_editor_create_ssh_privatekey(RemminaFileEditor *gfe, Gt g_free(s); gtk_widget_show(widget); gtk_grid_attach(GTK_GRID(grid), widget, column + 1, row + 22, 1, 1); - priv->ssh_privatekey_chooser = widget; + priv->ssh_tunnel_privatekey_chooser = widget; - ssh_privatekey = remmina_file_get_string(priv->remmina_file, "ssh_privatekey"); + ssh_privatekey = remmina_file_get_string(priv->remmina_file, "ssh_tunnel_privatekey"); if (ssh_privatekey && g_file_test(ssh_privatekey, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_EXISTS)) - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(priv->ssh_privatekey_chooser), + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(priv->ssh_tunnel_privatekey_chooser), ssh_privatekey); else - remmina_file_set_string(priv->remmina_file, "ssh_privatekey", NULL); + remmina_file_set_string(priv->remmina_file, "ssh_tunnel_privatekey", NULL); } #endif @@ -814,7 +812,7 @@ static void remmina_file_editor_create_settings(RemminaFileEditor *gfe, GtkWidge } } -static void remmina_file_editor_create_ssh_tab(RemminaFileEditor *gfe, RemminaProtocolSSHSetting ssh_setting) +static void remmina_file_editor_create_ssh_tunnel_tab(RemminaFileEditor *gfe, RemminaProtocolSSHSetting ssh_setting) { TRACE_CALL(__func__); #ifdef HAVE_LIBSSH @@ -835,12 +833,12 @@ static void remmina_file_editor_create_ssh_tab(RemminaFileEditor *gfe, RemminaPr gtk_widget_set_halign(widget, GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(grid), widget, 0, 0, 1, 1); g_signal_connect(G_OBJECT(widget), "toggled", - G_CALLBACK(remmina_file_editor_ssh_enabled_check_on_toggled), gfe); - priv->ssh_enabled_check = widget; + G_CALLBACK(remmina_file_editor_ssh_tunnel_enabled_check_on_toggled), gfe); + priv->ssh_tunnel_enabled_check = widget; widget = gtk_check_button_new_with_label(_("Tunnel via loopback address")); gtk_grid_attach(GTK_GRID(grid), widget, 1, 0, 2, 1); - priv->ssh_loopback_check = widget; + priv->ssh_tunnel_loopback_check = widget; row++; /* SSH Server group */ @@ -851,38 +849,38 @@ static void remmina_file_editor_create_ssh_tab(RemminaFileEditor *gfe, RemminaPr widget = gtk_radio_button_new_with_label(NULL, s); g_free(s); gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 3, 1); - priv->ssh_server_default_radio = widget; + priv->ssh_tunnel_server_default_radio = widget; row++; widget = gtk_radio_button_new_with_label_from_widget( - GTK_RADIO_BUTTON(priv->ssh_server_default_radio), _("Custom")); + GTK_RADIO_BUTTON(priv->ssh_tunnel_server_default_radio), _("Custom")); gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1); g_signal_connect(G_OBJECT(widget), "toggled", - G_CALLBACK(remmina_file_editor_ssh_server_custom_radio_on_toggled), gfe); - priv->ssh_server_custom_radio = widget; + G_CALLBACK(remmina_file_editor_ssh_tunnel_server_custom_radio_on_toggled), gfe); + priv->ssh_tunnel_server_custom_radio = widget; widget = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(widget), 100); gtk_widget_set_tooltip_markup(widget, _(server_tips2)); gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 2, 1); - priv->ssh_server_entry = widget; + priv->ssh_tunnel_server_entry = widget; row++; break; case REMMINA_PROTOCOL_SSH_SETTING_REVERSE_TUNNEL: - priv->ssh_server_default_radio = NULL; - priv->ssh_server_custom_radio = NULL; + priv->ssh_tunnel_server_default_radio = NULL; + priv->ssh_tunnel_server_custom_radio = NULL; - priv->ssh_server_entry = remmina_file_editor_create_text(gfe, grid, 1, 0, + priv->ssh_tunnel_server_entry = remmina_file_editor_create_text(gfe, grid, 1, 0, _("Server"), NULL); - gtk_widget_set_tooltip_markup(priv->ssh_server_entry, _(server_tips)); + gtk_widget_set_tooltip_markup(priv->ssh_tunnel_server_entry, _(server_tips)); row++; break; case REMMINA_PROTOCOL_SSH_SETTING_SSH: case REMMINA_PROTOCOL_SSH_SETTING_SFTP: - priv->ssh_server_default_radio = NULL; - priv->ssh_server_custom_radio = NULL; - priv->ssh_server_entry = NULL; + priv->ssh_tunnel_server_default_radio = NULL; + priv->ssh_tunnel_server_custom_radio = NULL; + priv->ssh_tunnel_server_entry = NULL; break; @@ -891,13 +889,6 @@ static void remmina_file_editor_create_ssh_tab(RemminaFileEditor *gfe, RemminaPr } p = remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->protocol_combo)); - /* The charset in VTE is deprecated so we remove it completely - * if (!(g_strcmp0(p, "SFTP") == 0 || g_strcmp0(p, "SSH") == 0)) { - * priv->ssh_charset_combo = remmina_file_editor_create_combo(gfe, grid, row + 3, 0, - * _("Character set"), charset_list, remmina_file_get_string(priv->remmina_file, "ssh_charset")); - * row++; - * } - */ if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SFTP) { widget = remmina_file_editor_create_text(gfe, grid, row + 8, 1, _("Startup path"), NULL); @@ -914,33 +905,33 @@ static void remmina_file_editor_create_ssh_tab(RemminaFileEditor *gfe, RemminaPr if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_TUNNEL || ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_REVERSE_TUNNEL) { - priv->ssh_username_entry = + priv->ssh_tunnel_username_entry = remmina_file_editor_create_text(gfe, grid, row + 10, 0, _("Username"), NULL); row++; } widget = gtk_radio_button_new_with_label(NULL, _("SSH agent (automatic)")); gtk_grid_attach(GTK_GRID(grid), widget, 0, row + 19, 1, 1); - priv->ssh_auth_agent_radio = widget; + priv->ssh_tunnel_auth_agent_radio = widget; row++; widget = gtk_radio_button_new_with_label_from_widget( - GTK_RADIO_BUTTON(priv->ssh_auth_agent_radio), _("Password")); + GTK_RADIO_BUTTON(priv->ssh_tunnel_auth_agent_radio), _("Password")); gtk_grid_attach(GTK_GRID(grid), widget, 0, row + 21, 1, 1); - priv->ssh_auth_password_radio = widget; + priv->ssh_tunnel_auth_password_radio = widget; widget = gtk_entry_new(); gtk_grid_attach(GTK_GRID(grid), widget, 1, row + 21, 2, 1); gtk_entry_set_max_length(GTK_ENTRY(widget), 300); gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE); gtk_widget_set_hexpand(widget, TRUE); - priv->ssh_auth_password = widget; + priv->ssh_tunnel_auth_password = widget; row++; widget = gtk_radio_button_new_with_label_from_widget( - GTK_RADIO_BUTTON(priv->ssh_auth_password_radio), _("Public key (automatic)")); + GTK_RADIO_BUTTON(priv->ssh_tunnel_auth_password_radio), _("Public key (automatic)")); gtk_grid_attach(GTK_GRID(grid), widget, 0, row + 22, 1, 1); - priv->ssh_auth_auto_publickey_radio = widget; + priv->ssh_tunnel_auth_auto_publickey_radio = widget; row++; remmina_file_editor_create_ssh_privatekey(gfe, grid, row + 1, 0); @@ -948,37 +939,37 @@ static void remmina_file_editor_create_ssh_tab(RemminaFileEditor *gfe, RemminaPr row++; /* Set the values */ - cs = remmina_file_get_string(priv->remmina_file, "ssh_server"); + cs = remmina_file_get_string(priv->remmina_file, "ssh_tunnel_server"); if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_TUNNEL) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_enabled_check), - remmina_file_get_int(priv->remmina_file, "ssh_enabled", FALSE)); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_loopback_check), - remmina_file_get_int(priv->remmina_file, "ssh_loopback", FALSE)); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check), + remmina_file_get_int(priv->remmina_file, "ssh_tunnel_enabled", FALSE)); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check), + remmina_file_get_int(priv->remmina_file, "ssh_tunnel_loopback", FALSE)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cs ? - priv->ssh_server_custom_radio : priv->ssh_server_default_radio), TRUE); - gtk_entry_set_text(GTK_ENTRY(priv->ssh_server_entry), + priv->ssh_tunnel_server_custom_radio : priv->ssh_tunnel_server_default_radio), TRUE); + gtk_entry_set_text(GTK_ENTRY(priv->ssh_tunnel_server_entry), cs ? cs : ""); } else if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_REVERSE_TUNNEL) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_enabled_check), - remmina_file_get_int(priv->remmina_file, "ssh_enabled", FALSE)); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_loopback_check), - remmina_file_get_int(priv->remmina_file, "ssh_loopback", FALSE)); - gtk_entry_set_text(GTK_ENTRY(priv->ssh_server_entry), + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check), + remmina_file_get_int(priv->remmina_file, "ssh_tunnel_enabled", FALSE)); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check), + remmina_file_get_int(priv->remmina_file, "ssh_tunnel_loopback", FALSE)); + gtk_entry_set_text(GTK_ENTRY(priv->ssh_tunnel_server_entry), cs ? cs : ""); } //if (!(g_strcmp0(p, "SFTP") == 0 || g_strcmp0(p, "SSH") == 0)) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( remmina_file_get_int(priv->remmina_file, "ssh_auth", 0) == SSH_AUTH_PUBLICKEY ? - priv->ssh_auth_publickey_radio : + priv->ssh_tunnel_auth_publickey_radio : remmina_file_get_int(priv->remmina_file, "ssh_auth", 0) == SSH_AUTH_AUTO_PUBLICKEY ? - priv->ssh_auth_auto_publickey_radio : + priv->ssh_tunnel_auth_auto_publickey_radio : remmina_file_get_int(priv->remmina_file, "ssh_auth", 0) == SSH_AUTH_AGENT ? - priv->ssh_auth_agent_radio : - priv->ssh_auth_password_radio), TRUE); + priv->ssh_tunnel_auth_agent_radio : + priv->ssh_tunnel_auth_password_radio), TRUE); - remmina_file_editor_ssh_enabled_check_on_toggled(NULL, gfe, ssh_setting); + remmina_file_editor_ssh_tunnel_enabled_check_on_toggled(NULL, gfe, ssh_setting); //} gtk_widget_show_all(grid); g_free(p); @@ -1016,7 +1007,7 @@ static void remmina_file_editor_create_all_settings(RemminaFileEditor *gfe) remmina_file_editor_create_settings(gfe, grid, autostart_settings); /* The SSH tab */ - remmina_file_editor_create_ssh_tab(gfe, priv->plugin->ssh_setting); + remmina_file_editor_create_ssh_tunnel_tab(gfe, priv->plugin->ssh_setting); } @@ -1042,18 +1033,17 @@ static void remmina_file_editor_protocol_combo_on_changed(GtkComboBox *combo, Re priv->resolution_custom_combo = NULL; priv->keymap_combo = NULL; - priv->ssh_enabled_check = NULL; - priv->ssh_loopback_check = NULL; - priv->ssh_server_default_radio = NULL; - priv->ssh_server_custom_radio = NULL; - priv->ssh_server_entry = NULL; - priv->ssh_username_entry = NULL; - priv->ssh_auth_agent_radio = NULL; - priv->ssh_auth_password_radio = NULL; - priv->ssh_auth_publickey_radio = NULL; - priv->ssh_auth_auto_publickey_radio = NULL; - priv->ssh_privatekey_chooser = NULL; - priv->ssh_charset_combo = NULL; + priv->ssh_tunnel_enabled_check = NULL; + priv->ssh_tunnel_loopback_check = NULL; + priv->ssh_tunnel_server_default_radio = NULL; + priv->ssh_tunnel_server_custom_radio = NULL; + priv->ssh_tunnel_server_entry = NULL; + priv->ssh_tunnel_username_entry = NULL; + priv->ssh_tunnel_auth_agent_radio = NULL; + priv->ssh_tunnel_auth_password_radio = NULL; + priv->ssh_tunnel_auth_publickey_radio = NULL; + priv->ssh_tunnel_auth_auto_publickey_radio = NULL; + priv->ssh_tunnel_privatekey_chooser = NULL; g_hash_table_remove_all(priv->setting_widgets); @@ -1066,64 +1056,60 @@ static void remmina_file_editor_protocol_combo_on_changed(GtkComboBox *combo, Re } } -static void remmina_file_editor_update_ssh(RemminaFileEditor *gfe) +static void remmina_file_editor_save_ssh_tunnel_tab(RemminaFileEditor *gfe) { TRACE_CALL(__func__); RemminaFileEditorPriv *priv = gfe->priv; - gboolean ssh_enabled; - int ssh_auth; + gboolean ssh_tunnel_enabled; + int ssh_tunnel_auth; - if (priv->ssh_charset_combo) - remmina_file_set_string_ref(priv->remmina_file, "ssh_charset", - remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->ssh_charset_combo))); - - ssh_enabled = (priv->ssh_enabled_check ? - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_enabled_check)) : FALSE); + ssh_tunnel_enabled = (priv->ssh_tunnel_enabled_check ? + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check)) : FALSE); remmina_file_set_int(priv->remmina_file, - "ssh_loopback", - (priv->ssh_loopback_check ? - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_loopback_check)) : + "ssh_tunnel_loopback", + (priv->ssh_tunnel_loopback_check ? + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check)) : FALSE)); - remmina_file_set_int(priv->remmina_file, "ssh_enabled", ssh_enabled); - remmina_file_set_string(priv->remmina_file, "ssh_username", - (ssh_enabled ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_username_entry)) : NULL)); + remmina_file_set_int(priv->remmina_file, "ssh_tunnel_enabled", ssh_tunnel_enabled); + remmina_file_set_string(priv->remmina_file, "ssh_tunnel_username", + (ssh_tunnel_enabled ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_username_entry)) : NULL)); remmina_file_set_string( priv->remmina_file, - "ssh_server", - (ssh_enabled && priv->ssh_server_entry - && (priv->ssh_server_custom_radio == NULL + "ssh_tunnel_server", + (ssh_tunnel_enabled && priv->ssh_tunnel_server_entry + && (priv->ssh_tunnel_server_custom_radio == NULL || gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(priv->ssh_server_custom_radio))) ? - gtk_entry_get_text(GTK_ENTRY(priv->ssh_server_entry)) : NULL)); + GTK_TOGGLE_BUTTON(priv->ssh_tunnel_server_custom_radio))) ? + gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_server_entry)) : NULL)); - ssh_auth = (priv->ssh_auth_publickey_radio + ssh_tunnel_auth = (priv->ssh_tunnel_auth_publickey_radio && gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(priv->ssh_auth_publickey_radio)) ? + GTK_TOGGLE_BUTTON(priv->ssh_tunnel_auth_publickey_radio)) ? SSH_AUTH_PUBLICKEY : - priv->ssh_auth_auto_publickey_radio + priv->ssh_tunnel_auth_auto_publickey_radio && gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(priv->ssh_auth_auto_publickey_radio)) ? + GTK_TOGGLE_BUTTON(priv->ssh_tunnel_auth_auto_publickey_radio)) ? SSH_AUTH_AUTO_PUBLICKEY : - priv->ssh_auth_agent_radio + priv->ssh_tunnel_auth_agent_radio && gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(priv->ssh_auth_agent_radio)) ? + GTK_TOGGLE_BUTTON(priv->ssh_tunnel_auth_agent_radio)) ? SSH_AUTH_AGENT : SSH_AUTH_PASSWORD); remmina_file_set_int( priv->remmina_file, - "ssh_auth", - ssh_auth + "ssh_tunnel_auth", + ssh_tunnel_auth ); remmina_file_set_string( priv->remmina_file, - "ssh_privatekey", - (priv->ssh_privatekey_chooser ? - gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(priv->ssh_privatekey_chooser)) : NULL)); + "ssh_tunnel_privatekey", + (priv->ssh_tunnel_privatekey_chooser ? + gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(priv->ssh_tunnel_privatekey_chooser)) : NULL)); remmina_file_set_string( priv->remmina_file, - "ssh_password", - (ssh_enabled && (ssh_auth == SSH_AUTH_PASSWORD)) ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_auth_password)) : NULL); + "ssh_tunnel_password", + (ssh_tunnel_enabled && (ssh_tunnel_auth == SSH_AUTH_PASSWORD)) ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_auth_password)) : NULL); } static void remmina_file_editor_update_settings(RemminaFileEditor *gfe) @@ -1204,7 +1190,7 @@ static void remmina_file_editor_update(RemminaFileEditor *gfe) remmina_file_set_string_ref(priv->remmina_file, "keymap", remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->keymap_combo))); - remmina_file_editor_update_ssh(gfe); + remmina_file_editor_save_ssh_tunnel_tab(gfe); remmina_file_editor_update_settings(gfe); } @@ -1227,6 +1213,9 @@ static void remmina_file_editor_on_default(GtkWidget *button, RemminaFileEditor remmina_file_set_string(gf, "precommand", NULL); remmina_file_set_string(gf, "postcommand", NULL); + remmina_file_set_string(gf, "ssh_tunnel_server", NULL); + remmina_file_set_string(gf, "ssh_tunnel_password", NULL); + remmina_file_save(gf); remmina_file_free(gf); diff --git a/src/remmina_protocol_widget.c b/src/remmina_protocol_widget.c index 343fb79ba..53c36b727 100644 --- a/src/remmina_protocol_widget.c +++ b/src/remmina_protocol_widget.c @@ -228,7 +228,7 @@ void remmina_protocol_widget_open_connection_real(gpointer data) num_ssh = 0; #ifdef HAVE_LIBSSH - if (remmina_file_get_int(gp->priv->remmina_file, "ssh_enabled", FALSE)) + if (remmina_file_get_int(gp->priv->remmina_file, "ssh_tunnel_enabled", FALSE)) num_ssh += 2; #endif @@ -569,7 +569,7 @@ gboolean remmina_protocol_widget_query_feature_by_type(RemminaProtocolWidget *gp #ifdef HAVE_LIBSSH if (type == REMMINA_PROTOCOL_FEATURE_TYPE_TOOL && - remmina_file_get_int(gp->priv->remmina_file, "ssh_enabled", FALSE)) + remmina_file_get_int(gp->priv->remmina_file, "ssh_tunnel_enabled", FALSE)) return TRUE; #endif @@ -719,7 +719,7 @@ static gboolean remmina_protocol_widget_init_tunnel(RemminaProtocolWidget *gp) mp = remmina_protocol_widget_mpprogress(gp->cnnobj, msg, cancel_init_tunnel_cb, NULL); g_free(msg); - if (!remmina_ssh_init_session(REMMINA_SSH(tunnel))) { + if (!remmina_ssh_init_session(REMMINA_SSH(tunnel), TRUE)) { g_debug ("[SSH] Cannot init SSH session with tunnel struct"); remmina_protocol_widget_set_error(gp, REMMINA_SSH(tunnel)->error); remmina_ssh_tunnel_free(tunnel); @@ -761,32 +761,36 @@ gchar *remmina_protocol_widget_start_direct_tunnel(RemminaProtocolWidget *gp, gi { TRACE_CALL(__func__); const gchar *server; + const gchar *ssh_tunnel_server; //const gchar *proto; - gchar *host, *dest; - gint port; + gchar *ssh_tunnel_host, *srv_host, *dest; + gint srv_port, ssh_tunnel_port; gchar *msg; g_debug ("SSH tunnel initialization…"); //proto = remmina_file_get_string(gp->priv->remmina_file, "protocol"); server = remmina_file_get_string(gp->priv->remmina_file, "server"); + ssh_tunnel_server = remmina_file_get_string(gp->priv->remmina_file, "ssh_tunnel_server"); if (!server) return g_strdup(""); - remmina_public_get_server_port(server, default_port, &host, &port); - g_debug ("server: %s, port: %d", host, port); + remmina_public_get_server_port(server, default_port, &srv_host, &srv_port); + remmina_public_get_server_port(ssh_tunnel_server, 22, &ssh_tunnel_host, &ssh_tunnel_port); + g_debug ("server: %s, port: %d", srv_host, srv_port); - if (port_plus && port < 100) + if (port_plus && srv_port < 100) /* Protocols like VNC supports using instance number :0, :1, etc. as port number. */ - port += default_port; + srv_port += default_port; #ifdef HAVE_LIBSSH RemminaMessagePanel *mp; - if (!remmina_file_get_int(gp->priv->remmina_file, "ssh_enabled", FALSE)) { - dest = g_strdup_printf("[%s]:%i", host, port); - g_free(host); + if (!remmina_file_get_int(gp->priv->remmina_file, "ssh_tunnel_enabled", FALSE)) { + dest = g_strdup_printf("[%s]:%i", srv_host, srv_port); + g_free(srv_host); + g_free(ssh_tunnel_host); return dest; } @@ -797,7 +801,8 @@ gchar *remmina_protocol_widget_start_direct_tunnel(RemminaProtocolWidget *gp, gi } if (!remmina_protocol_widget_init_tunnel(gp)) { - g_free(host); + g_free(srv_host); + g_free(ssh_tunnel_host); g_debug ("[SSH] Setting up the tunnel failed, returning NULL"); return NULL; } @@ -806,17 +811,21 @@ gchar *remmina_protocol_widget_start_direct_tunnel(RemminaProtocolWidget *gp, gi mp = remmina_protocol_widget_mpprogress(gp->cnnobj, msg, cancel_start_direct_tunnel_cb, NULL); g_free(msg); - if (remmina_file_get_int(gp->priv->remmina_file, "ssh_loopback", FALSE)) { - g_free(host); - host = g_strdup("127.0.0.1"); + if (remmina_file_get_int(gp->priv->remmina_file, "ssh_tunnel_loopback", FALSE)) { + g_free(srv_host); + g_free(ssh_tunnel_host); + srv_host = g_strdup("127.0.0.1"); } - if (!remmina_ssh_tunnel_open(gp->priv->ssh_tunnel, host, port, remmina_pref.sshtunnel_port)) { - g_free(host); + g_debug ("%s: starting tunnel to: %s, port: %d", __func__, ssh_tunnel_host, ssh_tunnel_port); + if (!remmina_ssh_tunnel_open(gp->priv->ssh_tunnel, srv_host, srv_port, remmina_pref.sshtunnel_port)) { + g_free(srv_host); + g_free(ssh_tunnel_host); remmina_protocol_widget_set_error(gp, REMMINA_SSH(gp->priv->ssh_tunnel)->error); return NULL; } - g_free(host); + g_free(srv_host); + g_free(ssh_tunnel_host); remmina_protocol_widget_mpdestroy(gp->cnnobj, mp); @@ -825,7 +834,8 @@ gchar *remmina_protocol_widget_start_direct_tunnel(RemminaProtocolWidget *gp, gi #else dest = g_strdup_printf("[%s]:%i", host, port); - g_free(host); + g_free(srv_host); + g_free(ssh_tunnel_host); return dest; #endif @@ -846,7 +856,7 @@ gboolean remmina_protocol_widget_start_reverse_tunnel(RemminaProtocolWidget *gp, gchar *msg; RemminaMessagePanel *mp; - if (!remmina_file_get_int(gp->priv->remmina_file, "ssh_enabled", FALSE)) + if (!remmina_file_get_int(gp->priv->remmina_file, "ssh_tunnel_enabled", FALSE)) return TRUE; if (!remmina_protocol_widget_init_tunnel(gp)) @@ -925,7 +935,7 @@ gboolean remmina_protocol_widget_ssh_exec(RemminaProtocolWidget *gp, gboolean wa } #ifdef HAVE_LIBSSH -static gboolean remmina_protocol_widget_tunnel_init_callback(RemminaSSHTunnel *tunnel, gpointer data) +static gboolean remmina_protocol_widget_xport_tunnel_init_callback(RemminaSSHTunnel *tunnel, gpointer data) { TRACE_CALL(__func__); RemminaProtocolWidget *gp = REMMINA_PROTOCOL_WIDGET(data); @@ -941,13 +951,13 @@ static gboolean remmina_protocol_widget_tunnel_init_callback(RemminaSSHTunnel *t return ret; } -static gboolean remmina_protocol_widget_tunnel_connect_callback(RemminaSSHTunnel *tunnel, gpointer data) +static gboolean remmina_protocol_widget_xport_tunnel_connect_callback(RemminaSSHTunnel *tunnel, gpointer data) { TRACE_CALL(__func__); return TRUE; } -static gboolean remmina_protocol_widget_tunnel_disconnect_callback(RemminaSSHTunnel *tunnel, gpointer data) +static gboolean remmina_protocol_widget_xport_tunnel_disconnect_callback(RemminaSSHTunnel *tunnel, gpointer data) { TRACE_CALL(__func__); RemminaProtocolWidget *gp = REMMINA_PROTOCOL_WIDGET(data); @@ -981,9 +991,9 @@ gboolean remmina_protocol_widget_start_xport_tunnel(RemminaProtocolWidget *gp, R g_free(msg); gp->priv->init_func = init_func; - gp->priv->ssh_tunnel->init_func = remmina_protocol_widget_tunnel_init_callback; - gp->priv->ssh_tunnel->connect_func = remmina_protocol_widget_tunnel_connect_callback; - gp->priv->ssh_tunnel->disconnect_func = remmina_protocol_widget_tunnel_disconnect_callback; + gp->priv->ssh_tunnel->init_func = remmina_protocol_widget_xport_tunnel_init_callback; + gp->priv->ssh_tunnel->connect_func = remmina_protocol_widget_xport_tunnel_connect_callback; + gp->priv->ssh_tunnel->disconnect_func = remmina_protocol_widget_xport_tunnel_disconnect_callback; gp->priv->ssh_tunnel->callback_data = gp; remmina_public_get_server_port(remmina_file_get_string(gp->priv->remmina_file, "server"), 0, &server, NULL); @@ -1351,8 +1361,8 @@ gint remmina_protocol_widget_panel_authuserpwd_ssh_tunnel(RemminaProtocolWidget !remminafile->prevent_saving && allow_password_saving) pflags |= REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD; - username = remmina_file_get_string(remminafile, "ssh_username"); - password = remmina_file_get_string(remminafile, "ssh_password"); + username = remmina_file_get_string(remminafile, "ssh_tunnel_username"); + password = remmina_file_get_string(remminafile, "ssh_tunnel_password"); return remmina_protocol_widget_dialog(RPWDT_AUTH, gp, pflags, _("Type in username and password for SSH."), username, password, NULL, _("Password")); diff --git a/src/remmina_sftp_client.c b/src/remmina_sftp_client.c index 75f51ed0f..f899a9413 100644 --- a/src/remmina_sftp_client.c +++ b/src/remmina_sftp_client.c @@ -509,7 +509,7 @@ remmina_sftp_client_thread_main(gpointer data) size = 0; if (!sftp) { sftp = remmina_sftp_new_from_ssh(REMMINA_SSH(client->sftp)); - if (!remmina_ssh_init_session(REMMINA_SSH(sftp)) || + if (!remmina_ssh_init_session(REMMINA_SSH(sftp), FALSE) || remmina_ssh_auth(REMMINA_SSH(sftp), NULL, NULL, NULL) <= 0 || !remmina_sftp_open(sftp)) { remmina_sftp_client_thread_set_error(client, task, (REMMINA_SSH(sftp))->error); @@ -977,7 +977,7 @@ remmina_sftp_client_new_init(RemminaSFTP *sftp) SET_CURSOR(gdk_cursor_new_for_display(display, GDK_WATCH)); gdk_display_flush(display); - if (!remmina_ssh_init_session(REMMINA_SSH(sftp)) || + if (!remmina_ssh_init_session(REMMINA_SSH(sftp), FALSE) || remmina_ssh_auth(REMMINA_SSH(sftp), NULL, NULL, NULL) <= 0 || !remmina_sftp_open(sftp)) { dialog = gtk_message_dialog_new(GTK_WINDOW(gtk_widget_get_toplevel(client)), diff --git a/src/remmina_sftp_plugin.c b/src/remmina_sftp_plugin.c index be833fed7..e1042774c 100644 --- a/src/remmina_sftp_plugin.c +++ b/src/remmina_sftp_plugin.c @@ -75,12 +75,7 @@ remmina_plugin_sftp_main_thread(gpointer data) gboolean cont = FALSE; gint ret; const gchar *cs; - const gchar *saveserver; - const gchar *saveusername; gchar *hostport; - gchar tunneluser[33]; /* On linux a username can have a 32 char lenght */ - gchar tunnelserver[256]; /* On linux a servername can have a 255 char lenght */ - gchar tunnelport[6]; /* A TCP port can have a maximum value of 65535 */ gchar *host; gint port; @@ -96,59 +91,27 @@ remmina_plugin_sftp_main_thread(gpointer data) * * */ remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); - /* We save the SSH server name, so that we can restore it at the end of the connection */ - saveserver = remmina_plugin_service->file_get_string(remminafile, "ssh_server"); - remmina_plugin_service->file_set_string(remminafile, "save_ssh_server", g_strdup(saveserver)); - /* We save the SSH username, so that we can restore it at the end of the connection */ - saveusername = remmina_plugin_service->file_get_string(remminafile, "ssh_username"); - remmina_plugin_service->file_set_string(remminafile, "save_ssh_username", g_strdup(saveusername)); - - if (saveserver) { - /* if the server string contains the character @ we extract the user - * and the server string (host:port) - * */ - if (strchr(saveserver, '@')) { - sscanf(saveserver, "%[_a-zA-Z0-9.]@%[_a-zA-Z0-9.]:%[0-9]", - tunneluser, tunnelserver, tunnelport); - g_print("Username: %s, tunneluser: %s\n", - remmina_plugin_service->file_get_string(remminafile, "ssh_username"), tunneluser); - if (saveusername != NULL && tunneluser[0] != '\0') - remmina_plugin_service->file_set_string(remminafile, "ssh_username", NULL); - remmina_plugin_service->file_set_string(remminafile, "ssh_username", - g_strdup(tunneluser)); - remmina_plugin_service->file_set_string(remminafile, "ssh_server", - g_strconcat(tunnelserver, ":", tunnelport, NULL)); - } - } hostport = remmina_plugin_service->protocol_plugin_start_direct_tunnel(gp, 22, FALSE); - /* We restore the SSH username as the tunnel is set */ - remmina_plugin_service->file_set_string(remminafile, "ssh_username", g_strdup(saveusername)); if (hostport == NULL) return FALSE; + remmina_plugin_service->get_server_port(hostport, 22, &host, &port); ssh = g_object_get_data(G_OBJECT(gp), "user-data"); if (ssh) { /* Create SFTP connection based on existing SSH session */ sftp = remmina_sftp_new_from_ssh(ssh); - if (remmina_ssh_init_session(REMMINA_SSH(sftp)) && + if (remmina_ssh_init_session(REMMINA_SSH(sftp), FALSE) && remmina_ssh_auth(REMMINA_SSH(sftp), NULL, gp, remminafile) > 0 && remmina_sftp_open(sftp)) cont = TRUE; } else { /* New SFTP connection */ - if (remmina_plugin_service->file_get_int(remminafile, "ssh_enabled", FALSE)) - remmina_plugin_service->file_set_string(remminafile, "ssh_server", g_strdup(hostport)); - else - remmina_plugin_service->file_set_string(remminafile, "ssh_server", - remmina_plugin_service->file_get_string(remminafile, "server")); - g_free(hostport); - g_free(host); sftp = remmina_sftp_new_from_file(remminafile); while (1) { - if (!remmina_ssh_init_session(REMMINA_SSH(sftp))) { + if (!remmina_ssh_init_session(REMMINA_SSH(sftp), FALSE)) { remmina_plugin_service->protocol_plugin_set_error(gp, "%s", REMMINA_SSH(sftp)->error); break; } @@ -170,10 +133,6 @@ remmina_plugin_sftp_main_thread(gpointer data) cont = TRUE; break; } - - /* We restore the ssh_server name */ - remmina_plugin_service->file_set_string(remminafile, "ssh_server", - remmina_plugin_service->file_get_string(remminafile, "save_ssh_server")); } if (!cont) { if (sftp) remmina_sftp_free(sftp); @@ -345,9 +304,9 @@ static const RemminaProtocolFeature remmina_plugin_sftp_features[] = */ static const RemminaProtocolSetting remmina_sftp_basic_settings[] = { - { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, "ssh_server", NULL, FALSE, "_sftp-ssh._tcp", NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "ssh_username", N_("Username"), FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, "ssh_password", N_("Password"), FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, "server", NULL, FALSE, "_sftp-ssh._tcp", NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "username", N_("Username"), FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, "password", N_("Password"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "ssh_auth", N_("Authentication type"), FALSE, ssh_auth, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_FILE, "ssh_privatekey", N_("Identity file"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, "ssh_passphrase", N_("Password to unlock private key"), FALSE, NULL, NULL }, diff --git a/src/remmina_ssh.c b/src/remmina_ssh.c index beb2ec24a..2eb51432c 100644 --- a/src/remmina_ssh.c +++ b/src/remmina_ssh.c @@ -277,16 +277,16 @@ remmina_ssh_auth_auto_pubkey(RemminaSSH *ssh, RemminaProtocolWidget *gp, Remmina ret = remmina_protocol_widget_panel_auth(gp, (disablepasswordstoring ? 0 : REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD), _("SSH credentials"), NULL, - remmina_file_get_string(remminafile, "ssh_passphrase"), + remmina_file_get_string(remminafile, ssh->is_tunnel ? "ssh_tunnel_passphrase" : "ssh_passphrase"), NULL, _("SSH private key passphrase")); if (ret == GTK_RESPONSE_OK) { pwd = remmina_protocol_widget_get_password(gp); save_password = remmina_protocol_widget_get_savepassword(gp); if (save_password) - remmina_file_set_string(remminafile, "ssh_passphrase", pwd); + remmina_file_set_string(remminafile, ssh->is_tunnel ? "ssh_tunnel_passphrase" : "ssh_passphrase", pwd); else - remmina_file_set_string(remminafile, "ssh_passphrase", NULL); + remmina_file_set_string(remminafile, ssh->is_tunnel ? "ssh_tunnel_passphrase" : "ssh_passphrase", NULL); } else { return -1; } @@ -445,7 +445,7 @@ remmina_ssh_auth_gui(RemminaSSH *ssh, RemminaProtocolWidget *gp, RemminaFile *re { TRACE_CALL(__func__); gchar *keyname; - gchar *pwdtype; + gchar *pwdfkey; gchar *message; gint ret; size_t len; @@ -552,26 +552,31 @@ remmina_ssh_auth_gui(RemminaSSH *ssh, RemminaProtocolWidget *gp, RemminaFile *re return 0; } + enum { REMMINA_SSH_AUTH_PASSWORD, REMMINA_SSH_AUTH_PKPASSPHRASE, REMMINA_SSH_AUTH_KRBTOKEN } remmina_ssh_auth_type; + switch (ssh->auth) { case SSH_AUTH_PASSWORD: keyname = _("SSH password"); - pwdtype = "ssh_password"; + pwdfkey = ssh->is_tunnel ? "ssh_tunnel_password" : "password"; + remmina_ssh_auth_type = REMMINA_SSH_AUTH_PASSWORD; break; case SSH_AUTH_PUBLICKEY: case SSH_AUTH_AGENT: case SSH_AUTH_AUTO_PUBLICKEY: keyname = _("SSH private key passphrase"); - pwdtype = "ssh_passphrase"; + pwdfkey = ssh->is_tunnel ? "ssh_tunnel_passphrase" : "ssh_passphrase"; + remmina_ssh_auth_type = REMMINA_SSH_AUTH_PKPASSPHRASE; break; case SSH_AUTH_GSSAPI: keyname = _("SSH Kerberos/GSSAPI"); - pwdtype = "kerberos_token"; + pwdfkey = ssh->is_tunnel ? "ssh_tunnel_kerberos_token" : "ssh_kerberos_token"; + remmina_ssh_auth_type = REMMINA_SSH_AUTH_KRBTOKEN; break; default: return FALSE; } /* Try empty password or existing password/passphrase first */ - ret = remmina_ssh_auth(ssh, remmina_file_get_string(remminafile, pwdtype), gp, remminafile); + ret = remmina_ssh_auth(ssh, remmina_file_get_string(remminafile, pwdfkey), gp, remminafile); if (ret > 0) return 1; /* Requested for a non-empty password */ @@ -580,75 +585,55 @@ remmina_ssh_auth_gui(RemminaSSH *ssh, RemminaProtocolWidget *gp, RemminaFile *re disablepasswordstoring = remmina_file_get_int(remminafile, "disablepasswordstoring", FALSE); - if (g_strcmp0(pwdtype, "ssh_passphrase") == 0) { + if (remmina_ssh_auth_type == REMMINA_SSH_AUTH_PKPASSPHRASE) { ret = remmina_protocol_widget_panel_auth(gp, (disablepasswordstoring ? 0 : REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD), - _("SSH credentials"), NULL, - remmina_file_get_string(remminafile, "ssh_passphrase"), + ssh->is_tunnel ? _("SSH tunnel credentials") : _("SSH credentials"), NULL, + remmina_file_get_string(remminafile, pwdfkey), NULL, _("SSH private key passphrase")); if (ret == GTK_RESPONSE_OK) { pwd = remmina_protocol_widget_get_password(gp); save_password = remmina_protocol_widget_get_savepassword(gp); if (save_password) - remmina_file_set_string(remminafile, "ssh_passphrase", pwd); + remmina_file_set_string(remminafile, pwdfkey, pwd); else - remmina_file_set_string(remminafile, "ssh_passphrase", NULL); + remmina_file_set_string(remminafile, pwdfkey, NULL); g_free(pwd); } else { return -1; } - } else if (g_strcmp0(pwdtype, "ssh_password") == 0) { + } else if (remmina_ssh_auth_type == REMMINA_SSH_AUTH_PASSWORD) { ret = remmina_protocol_widget_panel_auth(gp, (disablepasswordstoring ? 0 : REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD) | REMMINA_MESSAGE_PANEL_FLAG_USERNAME, - _("SSH credentials"), - remmina_file_get_string(remminafile, "ssh_username"), - remmina_file_get_string(remminafile, "ssh_password"), + ssh->is_tunnel ? _("SSH tunnel credentials") : _("SSH credentials"), + remmina_file_get_string(remminafile, ssh->is_tunnel ? "ssh_tunnel_username" : "username"), + remmina_file_get_string(remminafile, pwdfkey), NULL, NULL); if (ret == GTK_RESPONSE_OK) { pwd = remmina_protocol_widget_get_username(gp); - remmina_file_set_string(remminafile, "ssh_username", pwd); + remmina_file_set_string(remminafile, ssh->is_tunnel ? "ssh_tunnel_username" : "username", pwd); g_free(pwd); pwd = remmina_protocol_widget_get_password(gp); save_password = remmina_protocol_widget_get_savepassword(gp); if (save_password) - remmina_file_set_string(remminafile, "ssh_password", pwd); + remmina_file_set_string(remminafile, pwdfkey, pwd); else - remmina_file_set_string(remminafile, "ssh_password", NULL); + remmina_file_set_string(remminafile, pwdfkey, NULL); g_free(pwd); } else { return -1; } } else { - /* ??? */ - ret = remmina_protocol_widget_panel_auth(gp, (disablepasswordstoring ? 0 : REMMINA_MESSAGE_PANEL_FLAG_SAVEPASSWORD) | REMMINA_MESSAGE_PANEL_FLAG_USERNAME, - _("SSH authentication"), - remmina_file_get_string(remminafile, "Username"), - remmina_file_get_string(remminafile, "Password"), - NULL, - NULL); - if (ret == GTK_RESPONSE_OK) { - pwd = remmina_protocol_widget_get_username(gp); - remmina_file_set_string(remminafile, "Username", pwd); - g_free(pwd); - pwd = remmina_protocol_widget_get_password(gp); - save_password = remmina_protocol_widget_get_savepassword(gp); - if (save_password) - remmina_file_set_string(remminafile, "Password", pwd); - else - remmina_file_set_string(remminafile, "Password", NULL); - g_free(pwd); - } else { - return -1; - } + g_print("Unimplemented."); + return -1; } - pwd = remmina_protocol_widget_get_password(gp); - ret = remmina_ssh_auth(ssh, pwd, gp, remminafile); - g_free(pwd); + ret = remmina_ssh_auth(ssh, remmina_file_get_string(remminafile, pwdfkey), gp, remminafile); + } if (ret <= 0) { @@ -667,7 +652,7 @@ remmina_ssh_log_callback(ssh_session session, int priority, const char *message, } gboolean -remmina_ssh_init_session(RemminaSSH *ssh) +remmina_ssh_init_session(RemminaSSH *ssh, gboolean is_tunnel) { TRACE_CALL(__func__); gint verbosity; @@ -801,12 +786,11 @@ remmina_ssh_init_session(RemminaSSH *ssh) } gboolean -remmina_ssh_init_from_file(RemminaSSH *ssh, RemminaFile *remminafile) +remmina_ssh_init_from_file(RemminaSSH *ssh, RemminaFile *remminafile, gboolean is_tunnel) { TRACE_CALL(__func__); - const gchar *ssh_server; - const gchar *ssh_username; - const gchar *ssh_privatekey; + const gchar *username; + const gchar *privatekey; const gchar *server; gchar *s; @@ -815,15 +799,15 @@ remmina_ssh_init_from_file(RemminaSSH *ssh, RemminaFile *remminafile) ssh->authenticated = FALSE; ssh->error = NULL; ssh->passphrase = NULL; + ssh->is_tunnel = is_tunnel; pthread_mutex_init(&ssh->ssh_mutex, NULL); /* Parse the address and port */ - ssh_server = remmina_file_get_string(remminafile, "ssh_server"); - ssh_username = remmina_file_get_string(remminafile, "ssh_username"); - ssh_privatekey = remmina_file_get_string(remminafile, "ssh_privatekey"); - server = remmina_file_get_string(remminafile, "server"); - if (ssh_server) { - remmina_public_get_server_port(ssh_server, 22, &ssh->server, &ssh->port); + server = remmina_file_get_string(remminafile, is_tunnel ? "ssh_tunnel_server" : "server"); + username = remmina_file_get_string(remminafile, is_tunnel ? "ssh_tunnel_username" : "username"); + privatekey = remmina_file_get_string(remminafile, is_tunnel ? "ssh_tunnel_privatekey" : "ssh_privatekey"); + if (server) { + remmina_public_get_server_port(server, 22, &ssh->server, &ssh->port); if (ssh->server[0] == '\0') { g_free(ssh->server); remmina_public_get_server_port(server, 0, &ssh->server, NULL); @@ -836,20 +820,20 @@ remmina_ssh_init_from_file(RemminaSSH *ssh, RemminaFile *remminafile) ssh->port = 22; } - ssh->user = g_strdup(ssh_username ? ssh_username : g_get_user_name()); + ssh->user = g_strdup(username ? username : g_get_user_name()); ssh->password = NULL; - ssh->auth = remmina_file_get_int(remminafile, "ssh_auth", 0); + ssh->auth = remmina_file_get_int(remminafile, is_tunnel ? "ssh_tunnel_auth" : "ssh_auth", 0); ssh->charset = g_strdup(remmina_file_get_string(remminafile, "ssh_charset")); - ssh->kex_algorithms = g_strdup(remmina_file_get_string(remminafile, "ssh_kex_algorithms")); - ssh->ciphers = g_strdup(remmina_file_get_string(remminafile, "ssh_ciphers")); - ssh->hostkeytypes = g_strdup(remmina_file_get_string(remminafile, "ssh_hostkeytypes")); - ssh->proxycommand = g_strdup(remmina_file_get_string(remminafile, "ssh_proxycommand")); - ssh->stricthostkeycheck = remmina_file_get_int(remminafile, "ssh_stricthostkeycheck", 0); - gint c = remmina_file_get_int(remminafile, "ssh_compression", 0); + ssh->kex_algorithms = g_strdup(remmina_file_get_string(remminafile, is_tunnel ? "ssh_tunnel_kex_algorithms" : "ssh_kex_algorithms")); + ssh->ciphers = g_strdup(remmina_file_get_string(remminafile, is_tunnel ? "ssh_tunnel_ciphers" : "ssh_ciphers")); + ssh->hostkeytypes = g_strdup(remmina_file_get_string(remminafile, is_tunnel ? "ssh_tunnel_hostkeytypes" : "ssh_hostkeytypes")); + ssh->proxycommand = g_strdup(remmina_file_get_string(remminafile, is_tunnel ? "ssh_tunnel_proxycommand" : "ssh_proxycommand")); + ssh->stricthostkeycheck = remmina_file_get_int(remminafile, is_tunnel ? "ssh_tunnel_stricthostkeycheck" : "ssh_stricthostkeycheck", 0); + gint c = remmina_file_get_int(remminafile, is_tunnel ? "ssh_tunnel_compression" : "ssh_compression", 0); ssh->compression = (c == 1) ? "yes" : "no"; /* Public/Private keys */ - s = (ssh_privatekey ? g_strdup(ssh_privatekey) : remmina_ssh_find_identity()); + s = (privatekey ? g_strdup(privatekey) : remmina_ssh_find_identity()); if (s) { ssh->privkeyfile = remmina_ssh_identity_path(s); g_free(s); @@ -869,6 +853,7 @@ remmina_ssh_init_from_ssh(RemminaSSH *ssh, const RemminaSSH *ssh_src) ssh->error = NULL; pthread_mutex_init(&ssh->ssh_mutex, NULL); + ssh->is_tunnel = ssh_src->is_tunnel; ssh->server = g_strdup(ssh_src->server); ssh->port = ssh_src->port; ssh->user = g_strdup(ssh_src->user); @@ -969,7 +954,7 @@ remmina_ssh_tunnel_new_from_file(RemminaFile *remminafile) tunnel = g_new(RemminaSSHTunnel, 1); - remmina_ssh_init_from_file(REMMINA_SSH(tunnel), remminafile); + remmina_ssh_init_from_file(REMMINA_SSH(tunnel), remminafile, TRUE); tunnel->tunnel_type = -1; tunnel->channels = NULL; @@ -1659,7 +1644,7 @@ remmina_sftp_new_from_file(RemminaFile *remminafile) sftp = g_new(RemminaSFTP, 1); - remmina_ssh_init_from_file(REMMINA_SSH(sftp), remminafile); + remmina_ssh_init_from_file(REMMINA_SSH(sftp), remminafile, FALSE); sftp->sftp_sess = NULL; @@ -1721,7 +1706,7 @@ remmina_ssh_shell_new_from_file(RemminaFile *remminafile) shell = g_new0(RemminaSSHShell, 1); - remmina_ssh_init_from_file(REMMINA_SSH(shell), remminafile); + remmina_ssh_init_from_file(REMMINA_SSH(shell), remminafile, FALSE); shell->master = -1; shell->slave = -1; diff --git a/src/remmina_ssh.h b/src/remmina_ssh.h index d0a947f62..8967db0d5 100644 --- a/src/remmina_ssh.h +++ b/src/remmina_ssh.h @@ -81,6 +81,9 @@ typedef struct _RemminaSSH { pthread_mutex_t ssh_mutex; gchar * passphrase; + + gboolean is_tunnel; + } RemminaSSH; gchar *remmina_ssh_identity_path(const gchar *id); @@ -89,10 +92,10 @@ gchar *remmina_ssh_identity_path(const gchar *id); gchar *remmina_ssh_find_identity(void); /* Initialize the ssh object */ -gboolean remmina_ssh_init_from_file(RemminaSSH *ssh, RemminaFile *remminafile); +gboolean remmina_ssh_init_from_file(RemminaSSH *ssh, RemminaFile *remminafile, gboolean is_tunnel); /* Initialize the SSH session */ -gboolean remmina_ssh_init_session(RemminaSSH *ssh); +gboolean remmina_ssh_init_session(RemminaSSH *ssh, gboolean is_tunnel); /* Authenticate SSH session */ /* -1: Require password; 0: Failed; 1: Succeeded */ diff --git a/src/remmina_ssh_plugin.c b/src/remmina_ssh_plugin.c index 16b157942..5608d3631 100644 --- a/src/remmina_ssh_plugin.c +++ b/src/remmina_ssh_plugin.c @@ -227,19 +227,14 @@ remmina_plugin_ssh_main_thread(gpointer data) RemminaSSHShell *shell = NULL; gboolean cont = FALSE; gint ret; - const gchar *saveserver; - const gchar *saveusername; gchar *hostport; - gchar tunneluser[33]; /**< On Linux a username can have a 32 char length */ - gchar tunnelserver[256]; /**< On Linux a servername can have a 255 char length */ - gchar tunnelport[6]; /**< A TCP port can have a maximum value of 65535 */ gchar *host; gint port; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); CANCEL_ASYNC - gpdata = GET_PLUGIN_DATA(gp); + gpdata = GET_PLUGIN_DATA(gp); /** * remmina_plugin_service->protocol_plugin_start_direct_tunnel start the @@ -249,62 +244,32 @@ remmina_plugin_ssh_main_thread(gpointer data) * **/ remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); - /* We save the SSH server name, so that we can restore it at the end of the connection */ - saveserver = remmina_plugin_service->file_get_string(remminafile, "ssh_server"); - remmina_plugin_service->file_set_string(remminafile, "save_ssh_server", g_strdup(saveserver)); - /* We save the SSH username, so that we can restore it at the end of the connection */ - saveusername = remmina_plugin_service->file_get_string(remminafile, "ssh_username"); - remmina_plugin_service->file_set_string(remminafile, "save_ssh_username", g_strdup(saveusername)); - - if (saveserver) { - /** if the server string contains the character @ we extract the user - * and the server string (host:port) - **/ - if (strchr(saveserver, '@')) { - sscanf(saveserver, "%[_a-zA-Z0-9.]@%[_a-zA-Z0-9.]:%[0-9]", - tunneluser, tunnelserver, tunnelport); - g_debug("Username: %s, tunneluser: %s\n", - remmina_plugin_service->file_get_string(remminafile, "ssh_username"), tunneluser); - if (saveusername != NULL && tunneluser[0] != '\0') - remmina_plugin_service->file_set_string(remminafile, "ssh_username", NULL); - remmina_plugin_service->file_set_string(remminafile, "ssh_username", - g_strdup(tunneluser)); - remmina_plugin_service->file_set_string(remminafile, "ssh_server", - g_strconcat(tunnelserver, ":", tunnelport, NULL)); - } - } - g_debug ("Trying to initiate SSH tunnel…"); + + // Optionally start the SSH tunnel hostport = remmina_plugin_service->protocol_plugin_start_direct_tunnel(gp, 22, FALSE); - g_debug ("Tunnel started on %s", hostport); - /* We restore the SSH username as the tunnel is set */ - remmina_plugin_service->file_set_string(remminafile, "ssh_username", g_strdup(saveusername)); - remmina_plugin_service->file_set_string(remminafile, "ssh_server", g_strdup(saveserver)); if (hostport == NULL) return FALSE; + + g_debug ("Tunnel started on %s", hostport); remmina_plugin_service->get_server_port(hostport, 22, &host, &port); ssh = g_object_get_data(G_OBJECT(gp), "user-data"); if (ssh) { /* Create SSH shell connection based on existing SSH session */ shell = remmina_ssh_shell_new_from_ssh(ssh); - if (remmina_ssh_init_session(REMMINA_SSH(shell)) && + if (remmina_ssh_init_session(REMMINA_SSH(shell), FALSE) && remmina_ssh_auth(REMMINA_SSH(shell), NULL, gp, remminafile) > 0 && remmina_ssh_shell_open(shell, (RemminaSSHExitFunc) remmina_plugin_service->protocol_plugin_signal_connection_closed, gp)) cont = TRUE; } else { /* New SSH Shell connection */ - if (remmina_plugin_service->file_get_int(remminafile, "ssh_enabled", FALSE)) - remmina_plugin_service->file_set_string(remminafile, "ssh_server", g_strdup(hostport)); - else - remmina_plugin_service->file_set_string(remminafile, "ssh_server", - remmina_plugin_service->file_get_string(remminafile, "save_ssh_server")); g_free(hostport); g_free(host); shell = remmina_ssh_shell_new_from_file(remminafile); while (1) { - if (!remmina_ssh_init_session(REMMINA_SSH(shell))) { + if (!remmina_ssh_init_session(REMMINA_SSH(shell), FALSE)) { remmina_plugin_service->protocol_plugin_set_error(gp, "%s", REMMINA_SSH(shell)->error); break; } @@ -324,9 +289,6 @@ remmina_plugin_ssh_main_thread(gpointer data) break; } - /* We restore the ssh_server name */ - remmina_plugin_service->file_set_string(remminafile, "ssh_server", - remmina_plugin_service->file_get_string(remminafile, "save_ssh_server")); } if (!cont) { if (shell) remmina_ssh_shell_free(shell); @@ -1053,7 +1015,7 @@ static RemminaProtocolFeature remmina_plugin_ssh_features[] = */ static const RemminaProtocolSetting remmina_ssh_basic_settings[] = { - { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, "ssh_server", NULL, FALSE, "_ssh._tcp", NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, "server", NULL, FALSE, "_ssh._tcp", NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "username", N_("Username"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, "password", N_("User password"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "ssh_auth", N_("Authentication type"), FALSE, ssh_auth, NULL }, |