From 5ee64d03d071cd68768471f80d4b542c878f3eb9 Mon Sep 17 00:00:00 2001 From: ajacoutot Date: Thu, 23 May 2013 14:32:59 +0000 Subject: [PATCH] Fix the session IsActive check in the Consolekit case by properly creating a proxy to the session bus. --- x11/gnome/session/Makefile | 3 +- .../patch-gnome-session_gsm-consolekit_c | 153 ++++++++++++++++++ 2 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 x11/gnome/session/patches/patch-gnome-session_gsm-consolekit_c diff --git a/x11/gnome/session/Makefile b/x11/gnome/session/Makefile index ea1cbc8a1b2..04929037dcc 100644 --- a/x11/gnome/session/Makefile +++ b/x11/gnome/session/Makefile @@ -1,9 +1,10 @@ -# $OpenBSD: Makefile,v 1.227 2013/05/15 12:58:34 ajacoutot Exp $ +# $OpenBSD: Makefile,v 1.228 2013/05/23 14:32:59 ajacoutot Exp $ COMMENT= GNOME session GNOME_PROJECT= gnome-session GNOME_VERSION= 3.8.2.1 +REVISION= 0 CATEGORIES= x11 diff --git a/x11/gnome/session/patches/patch-gnome-session_gsm-consolekit_c b/x11/gnome/session/patches/patch-gnome-session_gsm-consolekit_c new file mode 100644 index 00000000000..c33e85e75cd --- /dev/null +++ b/x11/gnome/session/patches/patch-gnome-session_gsm-consolekit_c @@ -0,0 +1,153 @@ +$OpenBSD: patch-gnome-session_gsm-consolekit_c,v 1.10 2013/05/23 14:32:59 ajacoutot Exp $ + +https://bugzilla.gnome.org/show_bug.cgi?id=700727 + +--- gnome-session/gsm-consolekit.c.orig Thu Mar 14 02:41:03 2013 ++++ gnome-session/gsm-consolekit.c Thu May 23 16:13:48 2013 +@@ -39,7 +39,6 @@ + + #define CK_NAME "org.freedesktop.ConsoleKit" + #define CK_PATH "/org/freedesktop/ConsoleKit" +-#define CK_INTERFACE "org.freedesktop.ConsoleKit" + + #define CK_MANAGER_PATH "/org/freedesktop/ConsoleKit/Manager" + #define CK_MANAGER_INTERFACE "org.freedesktop.ConsoleKit.Manager" +@@ -56,10 +55,13 @@ struct _GsmConsolekitPrivate + DBusGConnection *dbus_connection; + DBusGProxy *bus_proxy; + DBusGProxy *ck_proxy; ++ DBusGProxy *session_proxy; + UpClient *up_client; + + gboolean is_active; + gboolean restarting; ++ ++ gchar *session_id; + }; + + enum { +@@ -172,7 +174,7 @@ is_active_cb (DBusGProxy *proxy, + if (!dbus_g_proxy_end_call (proxy, call, &local_error, + G_TYPE_BOOLEAN, &is_active, + G_TYPE_INVALID)) { +- g_warning ("Failed isActive call to ConsoleKit: %s", ++ g_warning ("Failed IsActive call to ConsoleKit: %s", + local_error->message); + g_clear_error (&local_error); + return; +@@ -201,8 +203,12 @@ gsm_consolekit_ensure_ck_connection (GsmConsolekit *m + { + GError *connection_error; + gboolean is_connected; ++ gboolean ret; ++ guint32 pid; + + connection_error = NULL; ++ manager->priv->session_id = NULL; ++ is_connected = FALSE; + + if (manager->priv->dbus_connection == NULL) { + DBusConnection *connection; +@@ -253,9 +259,9 @@ gsm_consolekit_ensure_ck_connection (GsmConsolekit *m + if (manager->priv->ck_proxy == NULL) { + manager->priv->ck_proxy = + dbus_g_proxy_new_for_name_owner (manager->priv->dbus_connection, +- "org.freedesktop.ConsoleKit", +- "/org/freedesktop/ConsoleKit/Manager", +- "org.freedesktop.ConsoleKit.Manager", ++ CK_NAME, ++ CK_MANAGER_PATH, ++ CK_MANAGER_INTERFACE, + &connection_error); + + if (manager->priv->ck_proxy == NULL) { +@@ -263,14 +269,40 @@ gsm_consolekit_ensure_ck_connection (GsmConsolekit *m + is_connected = FALSE; + goto out; + } +- +- dbus_g_proxy_begin_call (manager->priv->ck_proxy, ++ } ++ ++ pid = getpid (); ++ ret = dbus_g_proxy_call (manager->priv->ck_proxy, "GetSessionForUnixProcess", &connection_error, ++ G_TYPE_UINT, pid, ++ G_TYPE_INVALID, ++ DBUS_TYPE_G_OBJECT_PATH, &manager->priv->session_id, ++ G_TYPE_INVALID); ++ if (!ret) { ++ g_propagate_error (error, connection_error); ++ goto out; ++ } ++ ++ if (manager->priv->session_proxy == NULL) { ++ manager->priv->session_proxy = ++ dbus_g_proxy_new_for_name_owner (manager->priv->dbus_connection, ++ CK_NAME, ++ manager->priv->session_id, ++ CK_SESSION_INTERFACE, ++ &connection_error); ++ ++ if (manager->priv->session_proxy == NULL) { ++ g_propagate_error (error, connection_error); ++ is_connected = FALSE; ++ goto out; ++ } ++ ++ dbus_g_proxy_begin_call (manager->priv->session_proxy, + "IsActive", + is_active_cb, g_object_ref (manager), + (GDestroyNotify)g_object_unref, + G_TYPE_INVALID); +- dbus_g_proxy_add_signal (manager->priv->ck_proxy, "ActiveChanged", G_TYPE_BOOLEAN, G_TYPE_INVALID); +- dbus_g_proxy_connect_signal (manager->priv->ck_proxy, "ActiveChanged", ++ dbus_g_proxy_add_signal (manager->priv->session_proxy, "ActiveChanged", G_TYPE_BOOLEAN, G_TYPE_INVALID); ++ dbus_g_proxy_connect_signal (manager->priv->session_proxy, "ActiveChanged", + G_CALLBACK (on_active_changed), manager, NULL); + } + +@@ -291,11 +323,27 @@ gsm_consolekit_ensure_ck_connection (GsmConsolekit *m + g_object_unref (manager->priv->ck_proxy); + manager->priv->ck_proxy = NULL; + } ++ ++ if (manager->priv->session_proxy != NULL) { ++ g_clear_object (&manager->priv->session_proxy); ++ } ++ ++ if (manager->priv->session_id != NULL) { ++ g_clear_object (&manager->priv->session_id); ++ } + } else if (manager->priv->bus_proxy == NULL) { + if (manager->priv->ck_proxy != NULL) { + g_object_unref (manager->priv->ck_proxy); + manager->priv->ck_proxy = NULL; + } ++ ++ if (manager->priv->session_proxy != NULL) { ++ g_clear_object (&manager->priv->session_proxy); ++ } ++ ++ if (manager->priv->session_id != NULL) { ++ g_clear_object (&manager->priv->session_id); ++ } + } + } + +@@ -314,6 +362,7 @@ gsm_consolekit_on_name_owner_changed (DBusGProxy *b + } + + g_clear_object (&manager->priv->ck_proxy); ++ g_clear_object (&manager->priv->session_proxy); + + gsm_consolekit_ensure_ck_connection (manager, NULL); + +@@ -340,6 +389,8 @@ gsm_consolekit_free_dbus (GsmConsolekit *manager) + { + g_clear_object (&manager->priv->bus_proxy); + g_clear_object (&manager->priv->ck_proxy); ++ g_clear_object (&manager->priv->session_proxy); ++ g_clear_object (&manager->priv->session_id); + g_clear_object (&manager->priv->up_client); + + if (manager->priv->dbus_connection != NULL) {