libnm/libnm-glib: don't quit in the middle of asking for secrets (bgo #752237)
authorDan Williams <dcbw@redhat.com>
Tue, 30 Jun 2015 14:48:53 +0000 (09:48 -0500)
committerDan Williams <dcbw@redhat.com>
Thu, 16 Jul 2015 21:50:10 +0000 (16:50 -0500)
If the VPN plugin terminated and the user started it again, then the
quit timer will still be running and it sometimes happens that the
VPN plugin will quit while the UI is asking the user for secrets.
That's not very nice, so don't do that.

Reproducer: while connect to the VPN, suspend your laptop.  Then
resume it, and immediately re-start the VPN connection.  Watch the
secrets dialog disappear within a very short time.

https://bugzilla.gnome.org/show_bug.cgi?id=752237

libnm-glib/nm-vpn-plugin.c
libnm/nm-vpn-plugin-old.c

index 2fad706..f40ea80 100644 (file)
@@ -279,6 +279,17 @@ quit_timer_expired (gpointer data)
        return G_SOURCE_REMOVE;
 }
 
+static void
+schedule_quit_timer (NMVPNPlugin *self)
+{
+       NMVPNPluginPrivate *priv = NM_VPN_PLUGIN_GET_PRIVATE (self);
+
+       nm_clear_g_source (&priv->quit_timer);
+       priv->quit_timer = g_timeout_add_seconds (NM_VPN_PLUGIN_QUIT_TIMER,
+                                                 quit_timer_expired,
+                                                 self);
+}
+
 static gboolean
 fail_stop (gpointer data)
 {
@@ -539,6 +550,11 @@ impl_vpn_plugin_need_secrets (NMVPNPlugin *plugin,
 
        ret = TRUE;
        if (needed) {
+               /* Push back the quit timer so the VPN plugin doesn't quit in the
+                * middle of asking the user for secrets.
+                */
+               schedule_quit_timer (plugin);
+
                g_assert (sn);
                *setting_name = g_strdup (sn);
        } else {
@@ -889,9 +905,7 @@ state_changed (NMVPNPlugin *plugin, NMVPNServiceState state)
                nm_clear_g_source (&priv->fail_stop_id);
                break;
        case NM_VPN_SERVICE_STATE_STOPPED:
-               priv->quit_timer = g_timeout_add_seconds (NM_VPN_PLUGIN_QUIT_TIMER,
-                                                         quit_timer_expired,
-                                                         plugin);
+               schedule_quit_timer (plugin);
                break;
        default:
                /* Clean up all timers we might have set up. */
index 72bf4d0..3f3c7c7 100644 (file)
@@ -252,6 +252,17 @@ quit_timer_expired (gpointer data)
        return G_SOURCE_REMOVE;
 }
 
+static void
+schedule_quit_timer (NMVpnPluginOld *self)
+{
+       NMVpnPluginOldPrivate *priv = NM_VPN_PLUGIN_OLD_GET_PRIVATE (self);
+
+       nm_clear_g_source (&priv->quit_timer);
+       priv->quit_timer = g_timeout_add_seconds (NM_VPN_PLUGIN_OLD_QUIT_TIMER,
+                                                 quit_timer_expired,
+                                                 self);
+}
+
 static gboolean
 fail_stop (gpointer data)
 {
@@ -501,6 +512,11 @@ impl_vpn_plugin_old_need_secrets (NMVpnPluginOld *plugin,
        }
 
        if (needed) {
+               /* Push back the quit timer so the VPN plugin doesn't quit in the
+                * middle of asking the user for secrets.
+                */
+               schedule_quit_timer (plugin);
+
                g_assert (setting_name);
                g_dbus_method_invocation_return_value (context,
                                                       g_variant_new ("(s)", setting_name));
@@ -1030,9 +1046,7 @@ state_changed (NMVpnPluginOld *plugin, NMVpnServiceState state)
                nm_clear_g_source (&priv->fail_stop_id);
                break;
        case NM_VPN_SERVICE_STATE_STOPPED:
-               priv->quit_timer = g_timeout_add_seconds (NM_VPN_PLUGIN_OLD_QUIT_TIMER,
-                                                         quit_timer_expired,
-                                                         plugin);
+               schedule_quit_timer (plugin);
                break;
        default:
                /* Clean up all timers we might have set up. */