diff -Nru remmina-1.2.31.3+dfsg/CHANGELOG.md remmina-1.2.31.4+dfsg/CHANGELOG.md --- remmina-1.2.31.3+dfsg/CHANGELOG.md 2018-08-14 15:47:59.000000000 +0000 +++ remmina-1.2.31.4+dfsg/CHANGELOG.md 2018-08-24 13:40:04.000000000 +0000 @@ -1,5 +1,23 @@ # Changelog +## [v1.2.31.4](https://gitlab.com/Remmina/Remmina/tags/v1.2.31.4) (2018-08-24) + +This is a bug fixing release. + +**Fixed bugs:** + +- Fix KB grabbing when switching workspace. +- Fix some possible crashes when reading a remminafile. +- Fixes a crash deleting XDMCP profile. +- Fixing libssh deprecations. + +**Implemented enhancements:** + +- Improving file type hadling. +- flatpak: update libssh from 0.7.5 to 0.8.1 +- flatpak: update freerdp from 2.0.0-rc2 to 2.0.0-rc3 +- Snap: update to libssh 0.8.0. + ## [v1.2.31.3](https://gitlab.com/Remmina/Remmina/tags/v1.2.31.3) (2018-08-14) This is a bug fixing release. diff -Nru remmina-1.2.31.3+dfsg/CMakeLists.txt remmina-1.2.31.4+dfsg/CMakeLists.txt --- remmina-1.2.31.3+dfsg/CMakeLists.txt 2018-08-14 15:47:59.000000000 +0000 +++ remmina-1.2.31.4+dfsg/CMakeLists.txt 2018-08-24 13:40:04.000000000 +0000 @@ -99,7 +99,7 @@ set(REMMINA_VERSION_MAJOR "1") set(REMMINA_VERSION_MINOR "2") set(REMMINA_VERSION_REVISION "31") -set(REMMINA_VERSION_SUFFIX "3") +set(REMMINA_VERSION_SUFFIX "4") #set(REMMINA_VERSION "${REMMINA_VERSION_MAJOR}.${REMMINA_VERSION_MINOR}.${REMMINA_VERSION_REVISION}") set(REMMINA_VERSION "${REMMINA_VERSION_MAJOR}.${REMMINA_VERSION_MINOR}.${REMMINA_VERSION_REVISION}.${REMMINA_VERSION_SUFFIX}") diff -Nru remmina-1.2.31.3+dfsg/data/desktop/remmina-file.desktop.in remmina-1.2.31.4+dfsg/data/desktop/remmina-file.desktop.in --- remmina-1.2.31.3+dfsg/data/desktop/remmina-file.desktop.in 2018-08-14 15:47:59.000000000 +0000 +++ remmina-1.2.31.4+dfsg/data/desktop/remmina-file.desktop.in 2018-08-24 13:40:04.000000000 +0000 @@ -1,10 +1,18 @@ [Desktop Entry] -Name=Remmina Remote File +Version=1.0 +Type=Application +Name=Remmina Connect Comment=Access remote desktops with Remmina +TryExec=@REMMINA_BINARY_PATH@ Exec=@REMMINA_BINARY_PATH@ --connect %U Icon=@REMMINA_ICON@ +MimeType=application/x-remmina; +Actions=Edit; Terminal=false -Type=Application StartupNotify=true -MimeType=application/x-remmina; NoDisplay=true +X-Desktop-File-Install-Version=0.24 + +[Desktop Action Edit] +Name=Remmina Edit +Exec=@REMMINA_BINARY_PATH@ --edit %U diff -Nru remmina-1.2.31.3+dfsg/debian/changelog remmina-1.2.31.4+dfsg/debian/changelog --- remmina-1.2.31.3+dfsg/debian/changelog 2018-08-16 18:03:48.000000000 +0000 +++ remmina-1.2.31.4+dfsg/debian/changelog 2018-08-29 07:08:20.000000000 +0000 @@ -1,3 +1,17 @@ +remmina (1.2.31.4+dfsg-1ubuntu1) cosmic; urgency=low + + * Merge from Debian unstable. Remaining changes: + - Switch back appindicator, until the MIR in 1770146 is sorted + + -- Gianfranco Costamagna Wed, 29 Aug 2018 09:08:20 +0200 + +remmina (1.2.31.4+dfsg-1) unstable; urgency=medium + + * New upstream release + * debian/control: S-V bump 4.2.0 -> 4.2.1 (no changes needed) + + -- Matteo F. Vescovi Tue, 28 Aug 2018 23:25:02 +0200 + remmina (1.2.31.3+dfsg-1ubuntu1) cosmic; urgency=low * Merge from Debian unstable. Remaining changes: diff -Nru remmina-1.2.31.3+dfsg/debian/control remmina-1.2.31.4+dfsg/debian/control --- remmina-1.2.31.3+dfsg/debian/control 2018-08-16 11:28:29.000000000 +0000 +++ remmina-1.2.31.4+dfsg/debian/control 2018-08-29 04:46:39.000000000 +0000 @@ -25,7 +25,7 @@ libvncserver-dev, libvte-2.91-dev, libxkbfile-dev -Standards-Version: 4.2.0 +Standards-Version: 4.2.1 Homepage: http://www.remmina.org/ Vcs-Git: https://salsa.debian.org/debian-remote-team/remmina.git Vcs-Browser: https://salsa.debian.org/debian-remote-team/remmina diff -Nru remmina-1.2.31.3+dfsg/plugins/xdmcp/xdmcp_plugin.c remmina-1.2.31.4+dfsg/plugins/xdmcp/xdmcp_plugin.c --- remmina-1.2.31.3+dfsg/plugins/xdmcp/xdmcp_plugin.c 2018-08-14 15:47:59.000000000 +0000 +++ remmina-1.2.31.4+dfsg/plugins/xdmcp/xdmcp_plugin.c 2018-08-24 13:40:04.000000000 +0000 @@ -363,8 +363,8 @@ */ static const RemminaProtocolSetting remmina_plugin_xdmcp_basic_settings[] = { - { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, NULL, NULL, FALSE, NULL, NULL }, - { REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION, NULL, NULL, FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, "server", NULL, FALSE, NULL, NULL }, + { REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION, "resolution", NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "colordepth", N_("Color depth"), FALSE, colordepth_list, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "exec", N_("Startup program"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "showcursor", N_("Use local cursor"), FALSE, NULL, NULL }, diff -Nru remmina-1.2.31.3+dfsg/src/remmina_connection_window.c remmina-1.2.31.4+dfsg/src/remmina_connection_window.c --- remmina-1.2.31.3+dfsg/src/remmina_connection_window.c 2018-08-14 15:47:59.000000000 +0000 +++ remmina-1.2.31.4+dfsg/src/remmina_connection_window.c 2018-08-24 13:40:04.000000000 +0000 @@ -168,6 +168,7 @@ struct _RemminaConnectionHolder { RemminaConnectionWindow* cnnwin; gint fullscreen_view_mode; + gint grab_retry_eventsourceid; gboolean hostkey_activated; gboolean hostkey_used; @@ -203,6 +204,7 @@ static void remmina_connection_holder_grab_focus(GtkNotebook *notebook); static GtkWidget* remmina_connection_holder_create_toolbar(RemminaConnectionHolder* cnnhld, gint mode); static void remmina_connection_holder_place_toolbar(GtkToolbar *toolbar, GtkGrid *grid, GtkWidget *sibling, int toolbar_placement); +static void remmina_connection_holder_keyboard_grab(RemminaConnectionHolder* cnnhld); #if FLOATING_TOOLBAR_WIDGET static void remmina_connection_window_ftb_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer user_data); @@ -415,6 +417,11 @@ #endif GdkDevice *keyboard = NULL; + if (cnnhld->grab_retry_eventsourceid) { + g_source_remove(cnnhld->grab_retry_eventsourceid); + cnnhld->grab_retry_eventsourceid = 0; + } + display = gtk_widget_get_display(GTK_WIDGET(cnnhld->cnnwin)); #if GTK_CHECK_VERSION(3, 20, 0) seat = gdk_display_get_default_seat(display); @@ -424,7 +431,6 @@ keyboard = gdk_device_manager_get_client_pointer(manager); #endif - if (!cnnhld->cnnwin->priv->kbcaptured) { return; } @@ -437,16 +443,30 @@ printf("DEBUG_KB_GRABBING: --- ungrabbing\n"); #endif -#if GTK_CHECK_VERSION(3, 20, 0) +#if GTK_CHECK_VERSION(3, 24, 0) + /* We can use gtk_seat_grab()/_ungrab() only after GTK 3.24 */ gdk_seat_ungrab(seat); #else + G_GNUC_BEGIN_IGNORE_DEPRECATIONS gdk_device_ungrab(keyboard, GDK_CURRENT_TIME); + G_GNUC_END_IGNORE_DEPRECATIONS #endif cnnhld->cnnwin->priv->kbcaptured = FALSE; } } +static gboolean remmina_connection_holder_keyboard_grab_retry(gpointer user_data) +{ + TRACE_CALL(__func__); + RemminaConnectionHolder* cnnhld; + cnnhld = (RemminaConnectionHolder *)user_data; + + remmina_connection_holder_keyboard_grab(cnnhld); + cnnhld->grab_retry_eventsourceid = 0; + return G_SOURCE_REMOVE; +} + static void remmina_connection_holder_keyboard_grab(RemminaConnectionHolder* cnnhld) { TRACE_CALL(__func__); @@ -457,6 +477,7 @@ #else GdkDeviceManager *manager; #endif + GdkGrabStatus ggs; GdkDevice *keyboard = NULL; if (cnnhld->cnnwin->priv->kbcaptured || !cnnhld->cnnwin->priv->mouse_pointer_entered) { @@ -480,16 +501,43 @@ if (remmina_file_get_int(cnnobj->remmina_file, "keyboard_grab", FALSE)) { #if DEBUG_KB_GRABBING - printf("DEBUG_KB_GRABBING: +++ grabbing\n"); + printf("DEBUG_KB_GRABBING: profile asks for grabbing, let's try.\n"); #endif -#if GTK_CHECK_VERSION(3, 20, 0) - if (gdk_seat_grab(seat, gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin)), - GDK_SEAT_CAPABILITY_KEYBOARD, FALSE, NULL, NULL, NULL, NULL) == GDK_GRAB_SUCCESS) + /* Up to GTK version 3.20 we can grab the keyboard with gdk_device_grab(). + * in GTK 3.20 gdk_seat_grab() should be used instead of gdk_device_grab(). + * There is a bug in GTK up to 3.22: when gdk_device_grab() fails + * the widget is hidden: + * https://gitlab.gnome.org/GNOME/gtk/commit/726ad5a5ae7c4f167e8dd454cd7c250821c400ab + * The bug fix will be released with GTK 3.24. + * Also pease note that the newer gdk_seat_grab() is still calling gdk_device_grab(). + */ +#if GTK_CHECK_VERSION(3, 24, 0) + ggs = gdk_seat_grab(seat, gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin)), + GDK_SEAT_CAPABILITY_KEYBOARD, FALSE, NULL, NULL, NULL, NULL); #else - if (gdk_device_grab(keyboard, gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin)), GDK_OWNERSHIP_WINDOW, - TRUE, GDK_KEY_PRESS | GDK_KEY_RELEASE, NULL, GDK_CURRENT_TIME) == GDK_GRAB_SUCCESS) + G_GNUC_BEGIN_IGNORE_DEPRECATIONS + ggs = gdk_device_grab(keyboard, gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin)), GDK_OWNERSHIP_WINDOW, + TRUE, GDK_KEY_PRESS | GDK_KEY_RELEASE, NULL, GDK_CURRENT_TIME); + G_GNUC_END_IGNORE_DEPRECATIONS #endif + if ( ggs != GDK_GRAB_SUCCESS ) { + /* Failure to GRAB keyboard */ + #if DEBUG_KB_GRABBING + printf("GRAB FAILED. GdkGrabStatus: %d\n", (int)ggs); + #endif + /* Reschedule grabbing in half a second if not already done */ + if (cnnhld->grab_retry_eventsourceid == 0) { + cnnhld->grab_retry_eventsourceid = g_timeout_add(500, (GSourceFunc)remmina_connection_holder_keyboard_grab_retry, cnnhld); + } + } else { + #if DEBUG_KB_GRABBING + printf("GRAB SUCCESS\n"); + #endif + if (cnnhld->grab_retry_eventsourceid != 0) { + g_source_remove(cnnhld->grab_retry_eventsourceid); + cnnhld->grab_retry_eventsourceid = 0; + } cnnhld->cnnwin->priv->kbcaptured = TRUE; } }else { @@ -3758,7 +3806,7 @@ return TRUE; }else { dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, - _("File %s not found."), filename); + _("File %s is corrupted, unreadable or not found."), filename); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_widget_show(dialog); remmina_widget_pool_register(dialog); diff -Nru remmina-1.2.31.3+dfsg/src/remmina_external_tools.c remmina-1.2.31.4+dfsg/src/remmina_external_tools.c --- remmina-1.2.31.3+dfsg/src/remmina_external_tools.c 2018-08-14 15:47:59.000000000 +0000 +++ remmina-1.2.31.4+dfsg/src/remmina_external_tools.c 2018-08-24 13:40:04.000000000 +0000 @@ -110,6 +110,8 @@ g_snprintf(launcher, MAX_PATH_LEN, "%s/launcher.sh", REMMINA_RUNTIME_EXTERNAL_TOOLS_DIR); remminafile = remmina_file_load(filename); + if (!remminafile) + return FALSE; GHashTableIter iter; const gchar *key, *value; g_hash_table_iter_init(&iter, remminafile->settings); diff -Nru remmina-1.2.31.3+dfsg/src/remmina_file.c remmina-1.2.31.4+dfsg/src/remmina_file.c --- remmina-1.2.31.3+dfsg/src/remmina_file.c 2018-08-14 15:47:59.000000000 +0000 +++ remmina-1.2.31.4+dfsg/src/remmina_file.c 2018-08-24 13:40:04.000000000 +0000 @@ -141,7 +141,9 @@ RemminaFile *remminafile; remminafile = remmina_file_load(filename); - remmina_file_generate_filename(remminafile); + if (remminafile) { + remmina_file_generate_filename(remminafile); + } return remminafile; } @@ -197,6 +199,7 @@ if (!g_key_file_load_from_file(gkeyfile, filename, G_KEY_FILE_NONE, NULL)) { g_key_file_free(gkeyfile); + g_printf("WARNING: unable to load remmina profile file %s: g_key_file_load_from_file() returned NULL.\n", filename); return NULL; } @@ -257,6 +260,7 @@ g_strfreev(keys); } }else { + g_printf("WARNING: unable to load remmina profile file %s: cannot find key name= in section remmina.\n", filename); remminafile = NULL; } @@ -548,8 +552,12 @@ if (setting_iter) { while (setting_iter->type != REMMINA_PROTOCOL_SETTING_TYPE_END) { g_debug("setting name: %s", setting_iter->name); - if (remmina_plugin_manager_is_encrypted_setting(protocol_plugin, setting_iter->name)) { - remmina_file_set_string(remminafile, remmina_plugin_manager_get_canonical_setting_name(setting_iter), NULL); + if (setting_iter->name == NULL) { + g_warning("Internal error: a setting name in protocol plugin %s is null. Please fix RemminaProtocolSetting struct content.", proto); + }else { + if (remmina_plugin_manager_is_encrypted_setting(protocol_plugin, setting_iter->name)) { + remmina_file_set_string(remminafile, remmina_plugin_manager_get_canonical_setting_name(setting_iter), NULL); + } } setting_iter++; } diff -Nru remmina-1.2.31.3+dfsg/src/remmina_file_manager.c remmina-1.2.31.4+dfsg/src/remmina_file_manager.c --- remmina-1.2.31.3+dfsg/src/remmina_file_manager.c 2018-08-14 15:47:59.000000000 +0000 +++ remmina-1.2.31.4+dfsg/src/remmina_file_manager.c 2018-08-24 13:40:04.000000000 +0000 @@ -198,11 +198,13 @@ continue; g_snprintf(filename, MAX_PATH_LEN, "%s/%s", remmina_data_dir, name); remminafile = remmina_file_load(filename); - group = remmina_file_get_string(remminafile, "group"); - if (group && remmina_string_array_find(array, group) < 0) { - remmina_string_array_add(array, group); + if (remminafile) { + group = remmina_file_get_string(remminafile, "group"); + if (group && remmina_string_array_find(array, group) < 0) { + remmina_string_array_add(array, group); + } + remmina_file_free(remminafile); } - remmina_file_free(remminafile); } g_dir_close(dir); remmina_string_array_sort(array); @@ -290,9 +292,11 @@ continue; g_snprintf(filename, MAX_PATH_LEN, "%s/%s", remmina_file_get_datadir(), name); remminafile = remmina_file_load(filename); - group = remmina_file_get_string(remminafile, "group"); - remmina_file_manager_add_group(root, group); - remmina_file_free(remminafile); + if (remminafile) { + group = remmina_file_get_string(remminafile, "group"); + remmina_file_manager_add_group(root, group); + remmina_file_free(remminafile); + } } g_dir_close(dir); return root; diff -Nru remmina-1.2.31.3+dfsg/src/remmina_mpchange.c remmina-1.2.31.4+dfsg/src/remmina_mpchange.c --- remmina-1.2.31.3+dfsg/src/remmina_mpchange.c 2018-08-14 15:47:59.000000000 +0000 +++ remmina-1.2.31.4+dfsg/src/remmina_mpchange.c 2018-08-24 13:40:04.000000000 +0000 @@ -166,9 +166,11 @@ RemminaFile* remminafile; remminafile = remmina_file_load(fname); - remmina_file_store_secret_plugin_password(remminafile, "password", mpcp->password); - remmina_file_free(remminafile); - mpcp->changed_passwords_count++; + if (remminafile) { + remmina_file_store_secret_plugin_password(remminafile, "password", mpcp->password); + remmina_file_free(remminafile); + mpcp->changed_passwords_count++; + } } diff -Nru remmina-1.2.31.3+dfsg/src/remmina_ssh.c remmina-1.2.31.4+dfsg/src/remmina_ssh.c --- remmina-1.2.31.3+dfsg/src/remmina_ssh.c 2018-08-14 15:47:59.000000000 +0000 +++ remmina-1.2.31.4+dfsg/src/remmina_ssh.c 2018-08-24 13:40:04.000000000 +0000 @@ -1020,14 +1020,21 @@ case REMMINA_SSH_TUNNEL_XPORT: /* Detect the next available port starting from 6010 on the server */ for (i = 10; i <= MAX_X_DISPLAY_NUMBER; i++) { - G_GNUC_BEGIN_IGNORE_DEPRECATIONS +#if LIBSSH_VERSION_INT >= SSH_VERSION_INT (0, 7, 0) + if (ssh_channel_listen_forward(REMMINA_SSH(tunnel)->session, (tunnel->bindlocalhost ? "localhost" : NULL), 6000 + i, NULL)) { + continue; + }else { + tunnel->remotedisplay = i; + break; + } +#else if (ssh_forward_listen(REMMINA_SSH(tunnel)->session, (tunnel->bindlocalhost ? "localhost" : NULL), 6000 + i, NULL)) { continue; }else { tunnel->remotedisplay = i; break; } - G_GNUC_END_IGNORE_DEPRECATIONS +#endif } if (tunnel->remotedisplay < 1) { remmina_ssh_set_error(REMMINA_SSH(tunnel), _("Failed to request port forwarding : %s")); @@ -1050,7 +1057,16 @@ break; case REMMINA_SSH_TUNNEL_REVERSE: - G_GNUC_BEGIN_IGNORE_DEPRECATIONS +#if LIBSSH_VERSION_INT >= SSH_VERSION_INT (0, 7, 0) + if (ssh_channel_listen_forward(REMMINA_SSH(tunnel)->session, NULL, tunnel->port, NULL)) { + remmina_ssh_set_error(REMMINA_SSH (tunnel), _("Failed to request port forwarding : %s")); + if (tunnel->disconnect_func) { + (*tunnel->disconnect_func)(tunnel, tunnel->callback_data); + } + tunnel->thread = 0; + return NULL; + } +#else if (ssh_forward_listen(REMMINA_SSH(tunnel)->session, NULL, tunnel->port, NULL)) { remmina_ssh_set_error(REMMINA_SSH (tunnel), _("Failed to request port forwarding : %s")); if (tunnel->disconnect_func) { @@ -1059,7 +1075,7 @@ tunnel->thread = 0; return NULL; } - G_GNUC_END_IGNORE_DEPRECATIONS +#endif if (tunnel->init_func && !(*tunnel->init_func)(tunnel, tunnel->callback_data)) { @@ -1102,9 +1118,11 @@ } if (tunnel->tunnel_type == REMMINA_SSH_TUNNEL_REVERSE) { /* For reverse tunnel, we only need one connection. */ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS +#if LIBSSH_VERSION_INT >= SSH_VERSION_INT (0, 7, 0) + ssh_channel_cancel_forward(REMMINA_SSH (tunnel)->session, NULL, tunnel->port); +#else ssh_forward_cancel(REMMINA_SSH (tunnel)->session, NULL, tunnel->port); - G_GNUC_END_IGNORE_DEPRECATIONS +#endif } }else if (tunnel->tunnel_type != REMMINA_SSH_TUNNEL_REVERSE) { /* Poll once per some period of time if no incoming connections. @@ -1421,9 +1439,11 @@ } if (tunnel->tunnel_type == REMMINA_SSH_TUNNEL_XPORT && tunnel->remotedisplay > 0) { - G_GNUC_BEGIN_IGNORE_DEPRECATIONS +#if LIBSSH_VERSION_INT >= SSH_VERSION_INT (0, 7, 0) + ssh_channel_cancel_forward(REMMINA_SSH (tunnel)->session, NULL, 6000 + tunnel->remotedisplay); +#else ssh_forward_cancel(REMMINA_SSH (tunnel)->session, NULL, 6000 + tunnel->remotedisplay); - G_GNUC_END_IGNORE_DEPRECATIONS +#endif } if (tunnel->server_sock >= 0) { close(tunnel->server_sock);