Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Please unblock package network-manager-applet - it enablex xz compression (nm-applet is part of the GNOME stack, so it's relevant for the CD1 issue). - fixes the GNOME Shell integration wrt authentication dialogs, which also needs another patch to reliably detect the GNOME Shell version. - Adds basic support for gnome-bluetooth 3.4. Without that patch, DUN via bluetooth is completely broken. All patches are cherry-picked from upstream Git. debdiff is attached. Cheers, Michael unblock network-manager-applet/0.9.4.1-2 -- System Information: Debian Release: wheezy/sid APT prefers unstable APT policy: (500, 'unstable'), (200, 'experimental') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 3.5-trunk-amd64 (SMP w/4 CPU cores) Locale: LANG=de_DE.utf8, LC_CTYPE=de_DE.utf8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash
diff --git a/debian/changelog b/debian/changelog index 16e8572..dded885 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,21 @@ +network-manager-applet (0.9.4.1-2) unstable; urgency=low + + * debian/rules: Use xz compression for binary packages. + * debian/control: Add network-manager-openconnect-gnome to Suggests. + (Closes: #670724) + * debian/patches/02-fix-shell-version-detecting-code.patch, + debian/patches/03-dont-handle-VPN-secrets-with-GNOME-Shell-3.4.patch: Fix + race condition on session startup when detecting the GNOME Shell version + and only handle VPN authentication requests with GNOME Shell < 3.4 + otherwise nm-applet and the Shell fight over who gets to handle secrets. + Patches cherry-picked from upstream Git. (Closes: #680963) + * debian/patches/04-gnome-bluetooth-3.4-support.patch: Add support for + gnome-bluetooth 3.4 which uses GDBusProxy instead of DBusGProxy. This + fixes the timeouts when creating DUN connections. Patch cherry-picked from + upstream Git. (Closes: #680866) + + -- Michael Biebl <bi...@debian.org> Tue, 11 Sep 2012 21:51:03 +0200 + network-manager-applet (0.9.4.1-1) unstable; urgency=low * New upstream release. diff --git a/debian/control b/debian/control index cb7af9b..f82a5a9 100644 --- a/debian/control +++ b/debian/control @@ -45,6 +45,7 @@ Recommends: gnome-bluetooth, iso-codes Suggests: + network-manager-openconnect-gnome, network-manager-openvpn-gnome, network-manager-vpnc-gnome, network-manager-pptp-gnome diff --git a/debian/patches/02-fix-shell-version-detecting-code.patch b/debian/patches/02-fix-shell-version-detecting-code.patch new file mode 100644 index 0000000..04cb431 --- /dev/null +++ b/debian/patches/02-fix-shell-version-detecting-code.patch @@ -0,0 +1,501 @@ +commit 0c997a95d5b82ea6733e001478db1e2490b49575 +Author: Dan Winship <d...@gnome.org> +Date: Fri Mar 30 11:13:04 2012 -0400 + + applet: fix up the shell-version-detecting code + + GNOME Shell claims its name on D-Bus without actually setting up its + interfaces first, so if you try to query its properties right away, it + fails. And GDBusProxy assumes (reasonably) that an object that doesn't + implement the Properties interface when it first appears isn't going + to start implementing it later, so the proxy will always think there + are no properties there. + + So, to fix this, we have to destroy the proxy if we hit this bug, and + then recreate it after a delay. Since this is getting complicated now, + abstract all the shell-version-checking into a separate object. + + Also, don't do floating-point comparisons on version numbers, since + floating point is inexact. + +Index: network-manager-applet/src/Makefile.am +=================================================================== +--- network-manager-applet.orig/src/Makefile.am 2012-07-10 15:25:50.692290285 +0200 ++++ network-manager-applet/src/Makefile.am 2012-07-10 15:40:38.603094778 +0200 +@@ -59,7 +59,9 @@ + applet-device-bt.c \ + applet-device-wimax.h \ + applet-device-wimax.c \ +- fallback-icon.h ++ fallback-icon.h \ ++ shell-watcher.h \ ++ shell-watcher.c + + nm_applet_LDADD = \ + -lm \ +Index: network-manager-applet/src/applet.c +=================================================================== +--- network-manager-applet.orig/src/applet.c 2012-07-10 15:25:50.692290285 +0200 ++++ network-manager-applet/src/applet.c 2012-07-10 15:40:38.607094809 +0200 +@@ -79,6 +79,7 @@ + #include "applet-vpn-request.h" + #include "utils.h" + #include "gconf-helpers.h" ++#include "shell-watcher.h" + + #define NOTIFY_CAPS_ACTIONS_KEY "actions" + +@@ -2955,7 +2956,7 @@ + NMApplet *applet = NM_APPLET (user_data); + + /* If the shell is running and the agent just got registered, unregister it */ +- if ( (applet->shell_version >= 3.4) ++ if ( (nm_shell_watcher_version_at_least (applet->shell_watcher, 3, 4)) + && nm_secret_agent_get_registered (NM_SECRET_AGENT (agent))) { + g_message ("Stopping registered applet secret agent because GNOME Shell is running"); + nm_secret_agent_unregister (NM_SECRET_AGENT (agent)); +@@ -3249,55 +3250,16 @@ + return FALSE; + } + +-static gboolean +-get_shell_version (GDBusProxy *proxy, gdouble *out_version) +-{ +- GVariant *v; +- char *version, *p; +- gboolean success = FALSE; +- gdouble converted; +- +- /* Ask for the shell's version */ +- v = g_dbus_proxy_get_cached_property (proxy, "ShellVersion"); +- if (v) { +- g_warn_if_fail (g_variant_is_of_type (v, G_VARIANT_TYPE_STRING)); +- version = g_variant_dup_string (v, NULL); +- if (version) { +- /* Terminate at the second dot if there is one */ +- p = strchr (version, '.'); +- if (p && (p = strchr (p + 1, '.'))) +- *p = '\0'; +- +- converted = strtod (version, NULL); +- g_warn_if_fail (converted > 0); +- g_warn_if_fail (converted < 1000); +- if (converted > 0 && converted < 1000) { +- *out_version = converted; +- success = TRUE; +- } +- g_free (version); +- } +- g_variant_unref (v); +- } +- return success; +-} +- + static void +-name_owner_changed_cb (GDBusProxy *proxy, GParamSpec *pspec, gpointer user_data) ++shell_version_changed_cb (NMShellWatcher *watcher, GParamSpec *pspec, gpointer user_data) + { + NMApplet *applet = user_data; +- char *owner; + +- owner = g_dbus_proxy_get_name_owner (proxy); +- if (owner) { +- applet->shell_version = 0; ++ if (nm_shell_watcher_version_at_least (watcher, 3, 4)) { + if (applet->agent_start_id) + g_source_remove (applet->agent_start_id); + +- if ( get_shell_version (proxy, &applet->shell_version) +- && applet->shell_version >= 3.4 +- && applet->agent +- && nm_secret_agent_get_registered (NM_SECRET_AGENT (applet->agent))) { ++ if (applet->agent && nm_secret_agent_get_registered (NM_SECRET_AGENT (applet->agent))) { + g_message ("Stopping applet secret agent because GNOME Shell appeared"); + nm_secret_agent_unregister (NM_SECRET_AGENT (applet->agent)); + } +@@ -3305,14 +3267,12 @@ + /* If the shell quit and our agent wasn't already registered, do it + * now on a delay (just in case the shell is restarting. + */ +- applet->shell_version = 0; + if (applet->agent_start_id) + g_source_remove (applet->agent_start_id); + + if (nm_secret_agent_get_registered (NM_SECRET_AGENT (applet->agent)) == FALSE) + applet->agent_start_id = g_timeout_add_seconds (4, delayed_start_agent, applet); + } +- g_free (owner); + } + #endif + +@@ -3469,19 +3429,11 @@ + + #if GLIB_CHECK_VERSION(2,26,0) + /* Watch GNOME Shell so we can unregister our applet agent if it appears */ +- applet->shell_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, +- G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, +- NULL, +- "org.gnome.Shell", +- "/org/gnome/Shell", +- "org.gnome.Shell", +- NULL, +- NULL); +- g_signal_connect (applet->shell_proxy, +- "notify::g-name-owner", +- G_CALLBACK (name_owner_changed_cb), ++ applet->shell_watcher = nm_shell_watcher_new (); ++ g_signal_connect (applet->shell_watcher, ++ "notify::shell-version", ++ G_CALLBACK (shell_version_changed_cb), + applet); +- name_owner_changed_cb (applet->shell_proxy, NULL, applet); + #endif + + return G_OBJECT (applet); +@@ -3551,8 +3503,8 @@ + dbus_g_connection_unref (applet->session_bus); + + #if GLIB_CHECK_VERSION(2,26,0) +- if (applet->shell_proxy) +- g_object_unref (applet->shell_proxy); ++ if (applet->shell_watcher) ++ g_object_unref (applet->shell_watcher); + #endif + if (applet->agent_start_id) + g_source_remove (applet->agent_start_id); +Index: network-manager-applet/src/applet.h +=================================================================== +--- network-manager-applet.orig/src/applet.h 2012-07-10 15:25:50.692290285 +0200 ++++ network-manager-applet/src/applet.h 2012-07-10 15:40:38.607094809 +0200 +@@ -46,6 +46,7 @@ + #include <nm-active-connection.h> + #include <nm-remote-settings.h> + #include "applet-agent.h" ++#include "shell-watcher.h" + + #define NM_TYPE_APPLET (nma_get_type()) + #define NM_APPLET(object) (G_TYPE_CHECK_INSTANCE_CAST((object), NM_TYPE_APPLET, NMApplet)) +@@ -85,10 +86,9 @@ + DBusGConnection *session_bus; + + #if GLIB_CHECK_VERSION(2,26,0) +- GDBusProxy *shell_proxy; ++ NMShellWatcher *shell_watcher; + #endif + guint agent_start_id; +- gdouble shell_version; + + NMClient *nm_client; + NMRemoteSettings *settings; +Index: network-manager-applet/src/shell-watcher.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ network-manager-applet/src/shell-watcher.c 2012-07-10 15:40:38.611094840 +0200 +@@ -0,0 +1,242 @@ ++/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ ++/* NetworkManager Wireless Applet -- Display wireless access points and allow user control ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Copyright (C) 2012 Red Hat, Inc. ++ */ ++ ++#ifdef HAVE_CONFIG_H ++#include <config.h> ++#endif ++ ++#include <stdlib.h> ++ ++#include "shell-watcher.h" ++ ++#if GLIB_CHECK_VERSION(2,26,0) ++ ++G_DEFINE_TYPE (NMShellWatcher, nm_shell_watcher, G_TYPE_OBJECT) ++ ++struct NMShellWatcherPrivate { ++ GDBusProxy *shell_proxy; ++ guint signal_id; ++ ++ guint retry_timeout; ++ guint retries; ++ ++ guint shell_version; ++}; ++ ++enum { ++ PROP_0, ++ PROP_SHELL_VERSION, ++ LAST_PROP ++}; ++ ++static void create_gnome_shell_proxy (NMShellWatcher *watcher); ++ ++static gboolean ++retry_create_shell_proxy (gpointer user_data) ++{ ++ NMShellWatcher *watcher = user_data; ++ NMShellWatcherPrivate *priv = watcher->priv; ++ ++ priv->retry_timeout = 0; ++ create_gnome_shell_proxy (watcher); ++ return FALSE; ++} ++ ++static void ++try_update_version (NMShellWatcher *watcher) ++{ ++ NMShellWatcherPrivate *priv = watcher->priv; ++ GVariant *v; ++ char *version, *p; ++ ++ v = g_dbus_proxy_get_cached_property (priv->shell_proxy, "ShellVersion"); ++ if (!v) { ++ /* The shell has claimed the name, but not yet registered its interfaces... ++ * (https://bugzilla.gnome.org/show_bug.cgi?id=673182). There's no way ++ * to make GDBusProxy re-read the properties at this point, so we ++ * have to destroy this proxy and try again. ++ */ ++ if (priv->signal_id) { ++ g_signal_handler_disconnect (priv->shell_proxy, priv->signal_id); ++ priv->signal_id = 0; ++ } ++ g_object_unref (priv->shell_proxy); ++ priv->shell_proxy = NULL; ++ ++ priv->retry_timeout = g_timeout_add_seconds (2, retry_create_shell_proxy, watcher); ++ return; ++ } ++ ++ g_warn_if_fail (g_variant_is_of_type (v, G_VARIANT_TYPE_STRING)); ++ version = g_variant_dup_string (v, NULL); ++ if (version) { ++ guint major, minor; ++ ++ major = strtoul (version, &p, 10); ++ if (*p == '.') ++ minor = strtoul (p + 1, NULL, 10); ++ else ++ minor = 0; ++ ++ g_warn_if_fail (major < 256); ++ g_warn_if_fail (minor < 256); ++ ++ priv->shell_version = (major << 8) | minor; ++ g_object_notify (G_OBJECT (watcher), "shell-version"); ++ } ++ ++ g_variant_unref (v); ++} ++ ++static void ++name_owner_changed_cb (GDBusProxy *proxy, GParamSpec *pspec, gpointer user_data) ++{ ++ NMShellWatcher *watcher = user_data; ++ NMShellWatcherPrivate *priv = watcher->priv; ++ char *owner; ++ ++ owner = g_dbus_proxy_get_name_owner (proxy); ++ if (owner) { ++ try_update_version (watcher); ++ g_free (owner); ++ } else if (priv->shell_version) { ++ priv->shell_version = 0; ++ g_object_notify (G_OBJECT (watcher), "shell-version"); ++ } ++} ++ ++static void ++got_shell_proxy (GObject *source, GAsyncResult *result, gpointer user_data) ++{ ++ NMShellWatcher *watcher = user_data; ++ NMShellWatcherPrivate *priv = watcher->priv; ++ GError *error = NULL; ++ ++ priv->shell_proxy = g_dbus_proxy_new_for_bus_finish (result, &error); ++ if (!priv->shell_proxy) { ++ g_warning ("Could not create GDBusProxy for org.gnome.Shell: %s", error->message); ++ g_error_free (error); ++ return; ++ } ++ ++ priv->signal_id = g_signal_connect (priv->shell_proxy, ++ "notify::g-name-owner", ++ G_CALLBACK (name_owner_changed_cb), ++ watcher); ++ ++ name_owner_changed_cb (priv->shell_proxy, NULL, watcher); ++ g_object_unref (watcher); ++} ++ ++static void ++create_gnome_shell_proxy (NMShellWatcher *watcher) ++{ ++ NMShellWatcherPrivate *priv = watcher->priv; ++ ++ if (priv->retries++ == 5) { ++ g_warning ("Could not find ShellVersion property on org.gnome.Shell after 5 tries"); ++ return; ++ } ++ ++ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, ++ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, ++ NULL, ++ "org.gnome.Shell", ++ "/org/gnome/Shell", ++ "org.gnome.Shell", ++ NULL, ++ got_shell_proxy, ++ g_object_ref (watcher)); ++} ++ ++static void ++nm_shell_watcher_init (NMShellWatcher *watcher) ++{ ++ watcher->priv = G_TYPE_INSTANCE_GET_PRIVATE (watcher, NM_TYPE_SHELL_WATCHER, ++ NMShellWatcherPrivate); ++ create_gnome_shell_proxy (watcher); ++} ++ ++static void ++get_property (GObject *object, guint prop_id, ++ GValue *value, GParamSpec *pspec) ++{ ++ NMShellWatcher *watcher = NM_SHELL_WATCHER (object); ++ ++ switch (prop_id) { ++ case PROP_SHELL_VERSION: ++ g_value_set_uint (value, watcher->priv->shell_version); ++ break; ++ default: ++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); ++ break; ++ } ++} ++ ++static void ++finalize (GObject *object) ++{ ++ NMShellWatcher *watcher = NM_SHELL_WATCHER (object); ++ NMShellWatcherPrivate *priv = watcher->priv; ++ ++ if (priv->retry_timeout) ++ g_source_remove (priv->retry_timeout); ++ if (priv->signal_id) ++ g_signal_handler_disconnect (priv->shell_proxy, priv->signal_id); ++ if (priv->shell_proxy) ++ g_object_unref (priv->shell_proxy); ++ ++ G_OBJECT_CLASS (nm_shell_watcher_parent_class)->finalize (object); ++} ++ ++static void ++nm_shell_watcher_class_init (NMShellWatcherClass *klass) ++{ ++ GObjectClass *oclass = G_OBJECT_CLASS (klass); ++ ++ g_type_class_add_private (klass, sizeof (NMShellWatcherPrivate)); ++ ++ oclass->get_property = get_property; ++ oclass->finalize = finalize; ++ ++ g_object_class_install_property (oclass, PROP_SHELL_VERSION, ++ g_param_spec_uint ("shell-version", ++ "Shell version", ++ "Running GNOME Shell version, eg, 0x0304", ++ 0, 0xFFFF, 0, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_STRINGS)); ++} ++ ++NMShellWatcher * ++nm_shell_watcher_new (void) ++{ ++ return g_object_new (NM_TYPE_SHELL_WATCHER, NULL); ++} ++ ++gboolean ++nm_shell_watcher_version_at_least (NMShellWatcher *watcher, guint major, guint minor) ++{ ++ guint version = (major << 8) | minor; ++ ++ return watcher->priv->shell_version >= version; ++} ++ ++#endif /* GLIB_CHECK_VERSION(2,26,0) */ +Index: network-manager-applet/src/shell-watcher.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ network-manager-applet/src/shell-watcher.h 2012-07-10 15:40:38.611094840 +0200 +@@ -0,0 +1,60 @@ ++/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ ++/* NetworkManager Wireless Applet -- Display wireless access points and allow user control ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Copyright (C) 2012 Red Hat, Inc. ++ */ ++ ++#ifndef SHELL_WATCHER_H ++#define SHELL_WATCHER_H ++ ++#ifdef HAVE_CONFIG_H ++#include <config.h> ++#endif ++ ++#include <gio/gio.h> ++ ++#if GLIB_CHECK_VERSION(2,26,0) ++ ++#define NM_TYPE_SHELL_WATCHER (nm_shell_watcher_get_type()) ++#define NM_SHELL_WATCHER(object) (G_TYPE_CHECK_INSTANCE_CAST((object), NM_TYPE_SHELL_WATCHER, NMShellWatcher)) ++#define NM_SHELL_WATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_SHELL_WATCHER, NMShellWatcherClass)) ++#define NM_IS_SHELL_WATCHER(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), NM_TYPE_SHELL_WATCHER)) ++#define NM_IS_SHELL_WATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_SHELL_WATCHER)) ++#define NM_SHELL_WATCHER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), NM_TYPE_SHELL_WATCHER, NMShellWatcherClass)) ++ ++typedef struct NMShellWatcherPrivate NMShellWatcherPrivate; ++ ++typedef struct { ++ GObject parent_instance; ++ ++ NMShellWatcherPrivate *priv; ++} NMShellWatcher; ++ ++typedef struct { ++ GObjectClass parent_class; ++} NMShellWatcherClass; ++ ++GType nm_shell_watcher_get_type (void); ++ ++NMShellWatcher *nm_shell_watcher_new (void); ++ ++gboolean nm_shell_watcher_version_at_least (NMShellWatcher *watcher, ++ guint major, guint minor); ++ ++#endif /* GLIB_CHECK_VERSION(2,26,0) */ ++ ++#endif diff --git a/debian/patches/03-dont-handle-VPN-secrets-with-GNOME-Shell-3.4.patch b/debian/patches/03-dont-handle-VPN-secrets-with-GNOME-Shell-3.4.patch new file mode 100644 index 0000000..259278b --- /dev/null +++ b/debian/patches/03-dont-handle-VPN-secrets-with-GNOME-Shell-3.4.patch @@ -0,0 +1,114 @@ +commit 43c61d4d04398244fb76bf020727919f78e4101f +Author: Dan Williams <d...@redhat.com> +Date: Thu Aug 2 21:19:05 2012 -0500 + + applet: only handle VPN secrets with GNOME Shell < 3.4 + + GNOME Shell 3.2 and lower don't handle VPN secrets, so the applet + still needs to do that. But they do handle other secrets, so instead + of having the applet and the Shell fight over who gets to handle + secrets, defer non-VPN secrets to the Shell. + +diff --git a/src/applet-agent.c b/src/applet-agent.c +index 7957f26..8952683 100644 +--- a/src/applet-agent.c ++++ b/src/applet-agent.c +@@ -45,6 +45,7 @@ G_DEFINE_TYPE (AppletAgent, applet_agent, NM_TYPE_SECRET_AGENT); + + typedef struct { + GHashTable *requests; ++ gboolean vpn_only; + + gboolean disposed; + } AppletAgentPrivate; +@@ -487,6 +488,16 @@ get_secrets (NMSecretAgent *agent, + return; + } + ++ /* Only handle non-VPN secrets if we're supposed to */ ++ if (priv->vpn_only == TRUE) { ++ error = g_error_new_literal (NM_SECRET_AGENT_ERROR, ++ NM_SECRET_AGENT_ERROR_NO_SECRETS, ++ "Only handling VPN secrets at this time."); ++ callback (agent, connection, NULL, error, callback_data); ++ g_error_free (error); ++ return; ++ } ++ + /* For everything else we scrape the keyring for secrets first, and ask + * later if required. + */ +@@ -782,6 +793,15 @@ delete_secrets (NMSecretAgent *agent, + r->keyring_calls = g_slist_append (r->keyring_calls, call); + } + ++void ++applet_agent_handle_vpn_only (AppletAgent *agent, gboolean vpn_only) ++{ ++ g_return_if_fail (agent != NULL); ++ g_return_if_fail (APPLET_IS_AGENT (agent)); ++ ++ APPLET_AGENT_GET_PRIVATE (agent)->vpn_only = vpn_only; ++} ++ + /*******************************************************/ + + AppletAgent * +diff --git a/src/applet-agent.h b/src/applet-agent.h +index 6e8af97..2e1be3e 100644 +--- a/src/applet-agent.h ++++ b/src/applet-agent.h +@@ -64,5 +64,7 @@ GType applet_agent_get_type (void) G_GNUC_CONST; + + AppletAgent *applet_agent_new (void); + ++void applet_agent_handle_vpn_only (AppletAgent *agent, gboolean vpn_only); ++ + #endif /* _APPLET_AGENT_H_ */ + +diff --git a/src/applet.c b/src/applet.c +index 50c80bc..dc4cbad 100644 +--- a/src/applet.c ++++ b/src/applet.c +@@ -3255,23 +3255,32 @@ shell_version_changed_cb (NMShellWatcher *watcher, GParamSpec *pspec, gpointer u + { + NMApplet *applet = user_data; + +- if (nm_shell_watcher_version_at_least (watcher, 3, 4)) { +- if (applet->agent_start_id) +- g_source_remove (applet->agent_start_id); ++ if (applet->agent_start_id) { ++ g_source_remove (applet->agent_start_id); ++ applet->agent_start_id = 0; ++ } + +- if (applet->agent && nm_secret_agent_get_registered (NM_SECRET_AGENT (applet->agent))) { ++ if (!applet->agent) ++ return; ++ ++ if (nm_shell_watcher_version_at_least (watcher, 3, 4)) { ++ /* GNOME Shell handles all secrets requests */ ++ if (nm_secret_agent_get_registered (NM_SECRET_AGENT (applet->agent))) { + g_message ("Stopping applet secret agent because GNOME Shell appeared"); + nm_secret_agent_unregister (NM_SECRET_AGENT (applet->agent)); + } ++ } else if (nm_shell_watcher_version_at_least (watcher, 3, 2)) { ++ /* GNOME Shell handles everything except VPN secrets requests */ ++ if (nm_secret_agent_get_registered (NM_SECRET_AGENT (applet->agent))) ++ g_message ("Applet secret agent handling only VPN secrets because GNOME Shell appeared"); ++ applet_agent_handle_vpn_only (applet->agent, TRUE); + } else { + /* If the shell quit and our agent wasn't already registered, do it +- * now on a delay (just in case the shell is restarting. ++ * now on a delay (just in case the shell is restarting). + */ +- if (applet->agent_start_id) +- g_source_remove (applet->agent_start_id); +- +- if (nm_secret_agent_get_registered (NM_SECRET_AGENT (applet->agent)) == FALSE) ++ if (!nm_secret_agent_get_registered (NM_SECRET_AGENT (applet->agent))) + applet->agent_start_id = g_timeout_add_seconds (4, delayed_start_agent, applet); ++ applet_agent_handle_vpn_only (applet->agent, FALSE); + } + } + #endif diff --git a/debian/patches/04-gnome-bluetooth-3.4-support.patch b/debian/patches/04-gnome-bluetooth-3.4-support.patch new file mode 100644 index 0000000..2d93944 --- /dev/null +++ b/debian/patches/04-gnome-bluetooth-3.4-support.patch @@ -0,0 +1,113 @@ +commit dac307f98ff7c6ac9eb1f934b6b362066df9368d +Author: Jürg Billeter <j...@bitron.ch> +Date: Tue Aug 7 15:18:18 2012 -0500 + + bluetooth: fix GNOME Bluetooth plugin for 3.3 and later (bgo #678018) + + gnome-bluetooth 3.4 uses GDBusProxy instead of DBusGProxy. This patch + adds support for gnome-bluetooth 3.4 and keeps support for older + versions. + + (cleanups by dcbw) + (thanks for transparently breaking ABI, gnome-bluetooth!) + +diff --git a/src/gnome-bluetooth/bt-widget.c b/src/gnome-bluetooth/bt-widget.c +index bf55695..4de3f84 100644 +--- a/src/gnome-bluetooth/bt-widget.c ++++ b/src/gnome-bluetooth/bt-widget.c +@@ -807,38 +807,56 @@ dun_start (PluginInfo *info) + NULL); + + /* Get the device we're looking for */ +- info->dun_proxy = NULL; +- if (get_device_iter (info->btmodel, info->bdaddr, &iter)) +- gtk_tree_model_get (info->btmodel, &iter, BLUETOOTH_COLUMN_PROXY, &info->dun_proxy, -1); ++ if (!info->dun_proxy) { ++ if (get_device_iter (info->btmodel, info->bdaddr, &iter)) { ++ gpointer proxy = NULL; ++ ++ gtk_tree_model_get (info->btmodel, &iter, BLUETOOTH_COLUMN_PROXY, &proxy, -1); ++ ++ /* At some point gnome-bluetooth switched to gdbus, so we don't know ++ * if the proxy will be a DBusGProxy (dbus-glib) or a GDBusProxy (gdbus). ++ */ ++ if (G_IS_DBUS_PROXY (proxy)) { ++ info->dun_proxy = dbus_g_proxy_new_for_name (info->bus, ++ BLUEZ_SERVICE, ++ g_dbus_proxy_get_object_path (G_DBUS_PROXY (proxy)), ++ BLUEZ_SERIAL_INTERFACE); ++ g_object_unref (proxy); ++ } else if (DBUS_IS_G_PROXY (proxy)) { ++ info->dun_proxy = proxy; ++ dbus_g_proxy_set_interface (info->dun_proxy, BLUEZ_SERIAL_INTERFACE); ++ } else { ++ dun_error (info, __func__, error, _("failed to find Bluetooth device (unknown gnome-bluetooth proxy object type).")); ++ goto out; ++ } ++ } ++ } ++ g_assert (info->dun_proxy); + +- if (info->dun_proxy) { +- info->dun_timeout_id = g_timeout_add_seconds (45, dun_timeout_cb, info); +- +- dbus_g_proxy_set_interface (info->dun_proxy, BLUEZ_SERIAL_INTERFACE); +- +- g_message ("%s: calling Connect...", __func__); +- +- /* Watch for BT device property changes */ +- dbus_g_object_register_marshaller (_nma_marshal_VOID__STRING_BOXED, +- G_TYPE_NONE, +- G_TYPE_STRING, G_TYPE_VALUE, +- G_TYPE_INVALID); +- dbus_g_proxy_add_signal (info->dun_proxy, "PropertyChanged", +- G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID); +- dbus_g_proxy_connect_signal (info->dun_proxy, "PropertyChanged", +- G_CALLBACK (dun_property_changed), info, NULL); +- +- /* Request a connection to the device and get the port */ +- dbus_g_proxy_begin_call_with_timeout (info->dun_proxy, "Connect", +- dun_connect_cb, +- info, +- NULL, +- 20000, +- G_TYPE_STRING, "dun", +- G_TYPE_INVALID); +- } else +- dun_error (info, __func__, error, _("could not find the Bluetooth device.")); ++ info->dun_timeout_id = g_timeout_add_seconds (45, dun_timeout_cb, info); + ++ g_message ("%s: calling Connect...", __func__); ++ ++ /* Watch for BT device property changes */ ++ dbus_g_object_register_marshaller (_nma_marshal_VOID__STRING_BOXED, ++ G_TYPE_NONE, ++ G_TYPE_STRING, G_TYPE_VALUE, ++ G_TYPE_INVALID); ++ dbus_g_proxy_add_signal (info->dun_proxy, "PropertyChanged", ++ G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID); ++ dbus_g_proxy_connect_signal (info->dun_proxy, "PropertyChanged", ++ G_CALLBACK (dun_property_changed), info, NULL); ++ ++ /* Request a connection to the device and get the port */ ++ dbus_g_proxy_begin_call_with_timeout (info->dun_proxy, "Connect", ++ dun_connect_cb, ++ info, ++ NULL, ++ 20000, ++ G_TYPE_STRING, "dun", ++ G_TYPE_INVALID); ++ ++out: + g_message ("%s: finished", __func__); + } + +@@ -934,6 +952,8 @@ plugin_info_destroy (gpointer data) + { + PluginInfo *info = data; + ++ g_message ("%s: NM Bluetooth widget info being destroyed", __func__); ++ + g_free (info->bdaddr); + g_free (info->rfcomm_iface); + if (info->pan_connection) diff --git a/debian/patches/series b/debian/patches/series index f66cb64..735c473 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,2 +1,5 @@ # Debian patches for network-manager-applet 01-format-security.patch +02-fix-shell-version-detecting-code.patch +03-dont-handle-VPN-secrets-with-GNOME-Shell-3.4.patch +04-gnome-bluetooth-3.4-support.patch diff --git a/debian/rules b/debian/rules index 5fc8119..df09841 100755 --- a/debian/rules +++ b/debian/rules @@ -26,4 +26,7 @@ override_dh_install: dh_install find debian/network-manager-gnome/ -name \*.la -o -name \*.a | xargs rm -f +override_dh_builddeb: + dh_builddeb -- -Zxz + override_dh_auto_test: