summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2015-06-30 09:48:53 -0500
committerDan Williams <dcbw@redhat.com>2015-07-10 12:31:49 -0500
commitb477a65bdd5393f572aabc7030e226617728ca9e (patch)
tree8c7ee3a0e74929d8cd58672ded2e570d9119d3d9
parentaa3a6b234496761baaee465e9877cb60055688cd (diff)
downloadNetworkManager-dcbw/vpn-secrets-retry.tar.gz
libnm/libnm-glib: don't quit in the middle of asking for secretsdcbw/vpn-secrets-retry
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.
-rw-r--r--libnm-glib/nm-vpn-plugin.c20
-rw-r--r--libnm/nm-vpn-plugin-old.c20
2 files changed, 34 insertions, 6 deletions
diff --git a/libnm-glib/nm-vpn-plugin.c b/libnm-glib/nm-vpn-plugin.c
index 2fad7068f3..f40ea800f2 100644
--- a/libnm-glib/nm-vpn-plugin.c
+++ b/libnm-glib/nm-vpn-plugin.c
@@ -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. */
diff --git a/libnm/nm-vpn-plugin-old.c b/libnm/nm-vpn-plugin-old.c
index 00809d642d..f7d83af0c3 100644
--- a/libnm/nm-vpn-plugin-old.c
+++ b/libnm/nm-vpn-plugin-old.c
@@ -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. */