[polkit] Backport upstream D-Bus "user bus" changes

Colin Walters walters at fedoraproject.org
Thu Jun 5 15:38:31 UTC 2014


commit 56a2b8b4c5eac65bfaf57877b4753f2adb6cb60f
Author: Kay Sievers <kay at vrfy.org>
Date:   Thu Jun 5 17:17:06 2014 +0200

    Backport upstream D-Bus "user bus" changes

 polkit-0.112-systemd-Deduplicate-code-paths.patch  |  107 ++++++++++++++++++++
 ...-0.112-systemd-prepare-for-D-Bus-user-bus.patch |   87 ++++++++++++++++
 polkit.spec                                        |   15 ++-
 3 files changed, 206 insertions(+), 3 deletions(-)
---
diff --git a/polkit-0.112-systemd-Deduplicate-code-paths.patch b/polkit-0.112-systemd-Deduplicate-code-paths.patch
new file mode 100644
index 0000000..1cc0fbc
--- /dev/null
+++ b/polkit-0.112-systemd-Deduplicate-code-paths.patch
@@ -0,0 +1,107 @@
+From 26d0c0578211fb96fc8fe75572aa11ad6ecbf9b8 Mon Sep 17 00:00:00 2001
+From: Colin Walters <walters at verbum.org>
+Date: Thu, 7 Nov 2013 15:57:50 -0500
+Subject: [PATCH] sessionmonitor-systemd: Deduplicate code paths
+
+We had the code to go from pid -> session duplicated.  If we have a
+PolkitSystemBusName, convert it to a PolkitUnixProcess.
+Then we can do PolkitUnixProcess -> pid -> session in one place.
+
+This is just a code cleanup.
+
+https://bugs.freedesktop.org/show_bug.cgi?id=69538
+---
+ .../polkitbackendsessionmonitor-systemd.c          | 63 ++++++++--------------
+ 1 file changed, 22 insertions(+), 41 deletions(-)
+
+diff --git a/src/polkitbackend/polkitbackendsessionmonitor-systemd.c b/src/polkitbackend/polkitbackendsessionmonitor-systemd.c
+index 0185310..756b728 100644
+--- a/src/polkitbackend/polkitbackendsessionmonitor-systemd.c
++++ b/src/polkitbackend/polkitbackendsessionmonitor-systemd.c
+@@ -313,61 +313,42 @@ polkit_backend_session_monitor_get_session_for_subject (PolkitBackendSessionMoni
+                                                         PolkitSubject               *subject,
+                                                         GError                     **error)
+ {
+-  PolkitSubject *session;
+-
+-  session = NULL;
++  PolkitUnixProcess *tmp_process = NULL;
++  PolkitUnixProcess *process = NULL;
++  PolkitSubject *session = NULL;
++  char *session_id = NULL;
++  pid_t pid;
+ 
+   if (POLKIT_IS_UNIX_PROCESS (subject))
+-    {
+-      gchar *session_id;
+-      pid_t pid;
+-
+-      pid = polkit_unix_process_get_pid (POLKIT_UNIX_PROCESS (subject));
+-      if (sd_pid_get_session (pid, &session_id) < 0)
+-        goto out;
+-
+-      session = polkit_unix_session_new (session_id);
+-      free (session_id);
+-    }
++    process = POLKIT_UNIX_PROCESS (subject); /* We already have a process */
+   else if (POLKIT_IS_SYSTEM_BUS_NAME (subject))
+     {
+-      guint32 pid;
+-      gchar *session_id;
+-      GVariant *result;
+-
+-      result = g_dbus_connection_call_sync (monitor->system_bus,
+-                                            "org.freedesktop.DBus",
+-                                            "/org/freedesktop/DBus",
+-                                            "org.freedesktop.DBus",
+-                                            "GetConnectionUnixProcessID",
+-                                            g_variant_new ("(s)", polkit_system_bus_name_get_name (POLKIT_SYSTEM_BUS_NAME (subject))),
+-                                            G_VARIANT_TYPE ("(u)"),
+-                                            G_DBUS_CALL_FLAGS_NONE,
+-                                            -1, /* timeout_msec */
+-                                            NULL, /* GCancellable */
+-                                            error);
+-      if (result == NULL)
+-        goto out;
+-      g_variant_get (result, "(u)", &pid);
+-      g_variant_unref (result);
+-
+-      if (sd_pid_get_session (pid, &session_id) < 0)
+-        goto out;
+-
+-      session = polkit_unix_session_new (session_id);
+-      free (session_id);
++      /* Convert bus name to process */
++      tmp_process = (PolkitUnixProcess*)polkit_system_bus_name_get_process_sync (POLKIT_SYSTEM_BUS_NAME (subject), NULL, error);
++      if (!tmp_process)
++	goto out;
++      process = tmp_process;
+     }
+   else
+     {
+       g_set_error (error,
+                    POLKIT_ERROR,
+                    POLKIT_ERROR_NOT_SUPPORTED,
+-                   "Cannot get user for subject of type %s",
++                   "Cannot get session for subject of type %s",
+                    g_type_name (G_TYPE_FROM_INSTANCE (subject)));
+     }
+ 
+- out:
++  /* Now do process -> pid -> session */
++  g_assert (process != NULL);
++  pid = polkit_unix_process_get_pid (process);
+ 
++  if (sd_pid_get_session (pid, &session_id) < 0)
++    goto out;
++  
++  session = polkit_unix_session_new (session_id);
++  free (session_id);
++ out:
++  if (tmp_process) g_object_unref (tmp_process);
+   return session;
+ }
+ 
+-- 
+2.0.0
+
diff --git a/polkit-0.112-systemd-prepare-for-D-Bus-user-bus.patch b/polkit-0.112-systemd-prepare-for-D-Bus-user-bus.patch
new file mode 100644
index 0000000..0d0cf9e
--- /dev/null
+++ b/polkit-0.112-systemd-prepare-for-D-Bus-user-bus.patch
@@ -0,0 +1,87 @@
+From a68f5dfd7662767b7b9822090b70bc5bd145c50c Mon Sep 17 00:00:00 2001
+From: Kay Sievers <kay at vrfy.org>
+Date: Mon, 19 May 2014 10:19:49 +0900
+Subject: [PATCH] sessionmonitor-systemd: prepare for D-Bus "user bus" model
+
+In the D-Bus "user bus" model, all sessions of a user share the same
+D-Bus instance, a polkit requesting process might live outside the
+login session which registered the user's polkit agent.
+
+In case a polkit requesting process is not part of the user's login
+session, we ask systemd-logind for the the user's "display" session
+instead.
+
+https://bugs.freedesktop.org/show_bug.cgi?id=78905
+---
+ configure.ac                                       |  4 ++++
+ .../polkitbackendsessionmonitor-systemd.c          | 27 ++++++++++++++++++----
+ 2 files changed, 26 insertions(+), 5 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index a7b0148..e783ea5 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -202,6 +202,10 @@ if test "$enable_libsystemd_login" != "no"; then
+   if test "$have_libsystemd_login" = "yes"; then
+     SESSION_TRACKING=libsystemd-login
+     AC_DEFINE([HAVE_LIBSYSTEMD_LOGIN], 1, [Define to 1 if libsystemd-login is available])
++    save_LIBS=$LIBS
++    LIBS=$LIBSYSTEMD_LOGIN_LIBS
++    AC_CHECK_FUNCS(sd_uid_get_display)
++    LIBS=$save_LIBS
+   else
+     if test "$enable_libsystemd_login" = "yes"; then
+       AC_MSG_ERROR([libsystemd-login support requested but libsystemd-login library not found])
+diff --git a/src/polkitbackend/polkitbackendsessionmonitor-systemd.c b/src/polkitbackend/polkitbackendsessionmonitor-systemd.c
+index 756b728..9995f87 100644
+--- a/src/polkitbackend/polkitbackendsessionmonitor-systemd.c
++++ b/src/polkitbackend/polkitbackendsessionmonitor-systemd.c
+@@ -318,6 +318,9 @@ polkit_backend_session_monitor_get_session_for_subject (PolkitBackendSessionMoni
+   PolkitSubject *session = NULL;
+   char *session_id = NULL;
+   pid_t pid;
++#if HAVE_SD_UID_GET_DISPLAY
++  uid_t uid;
++#endif
+ 
+   if (POLKIT_IS_UNIX_PROCESS (subject))
+     process = POLKIT_UNIX_PROCESS (subject); /* We already have a process */
+@@ -338,16 +341,30 @@ polkit_backend_session_monitor_get_session_for_subject (PolkitBackendSessionMoni
+                    g_type_name (G_TYPE_FROM_INSTANCE (subject)));
+     }
+ 
+-  /* Now do process -> pid -> session */
++  /* Now do process -> pid -> same session */
+   g_assert (process != NULL);
+   pid = polkit_unix_process_get_pid (process);
+ 
+-  if (sd_pid_get_session (pid, &session_id) < 0)
++  if (sd_pid_get_session (pid, &session_id) >= 0)
++    {
++      session = polkit_unix_session_new (session_id);
++      goto out;
++    }
++
++#if HAVE_SD_UID_GET_DISPLAY
++  /* Now do process -> uid -> graphical session (systemd version 213)*/
++  if (sd_pid_get_owner_uid (pid, &uid) < 0)
+     goto out;
+-  
+-  session = polkit_unix_session_new (session_id);
+-  free (session_id);
++
++  if (sd_uid_get_display (uid, &session_id) >= 0)
++    {
++      session = polkit_unix_session_new (session_id);
++      goto out;
++    }
++#endif
++
+  out:
++  free (session_id);
+   if (tmp_process) g_object_unref (tmp_process);
+   return session;
+ }
+-- 
+2.0.0
+
diff --git a/polkit.spec b/polkit.spec
index a1c9570..377d685 100644
--- a/polkit.spec
+++ b/polkit.spec
@@ -1,12 +1,12 @@
 # Only enable if using patches that touches configure.ac,
 # Makefile.am or other build system related files
 #
-%define enable_autoreconf 0
+%define enable_autoreconf 1
 
 Summary: An authorization framework
 Name: polkit
 Version: 0.112
-Release: 3%{?dist}
+Release: 4%{?dist}
 License: LGPLv2+
 URL: http://www.freedesktop.org/wiki/Software/polkit
 Source0: http://www.freedesktop.org/software/polkit/releases/%{name}-%{version}.tar.gz
@@ -15,6 +15,10 @@ Source1: http://www.freedesktop.org/software/polkit/releases/%{name}-%{version}.
 Patch0: polkit-0.112-XDG_RUNTIME_DIR.patch
 # https://bugs.freedesktop.org/show_bug.cgi?id=60847
 Patch1: polkit-0.112-PolkitAgentSession-race.patch
+# http://cgit.freedesktop.org/polkit/commit/?id=26d0c0578211fb96fc8fe75572aa11ad6ecbf9b8
+Patch2: polkit-0.112-systemd-Deduplicate-code-paths.patch
+# http://cgit.freedesktop.org/polkit/commit/?id=a68f5dfd7662767b7b9822090b70bc5bd145c50c
+Patch3: polkit-0.112-systemd-prepare-for-D-Bus-user-bus.patch
 Group: System Environment/Libraries
 BuildRequires: glib2-devel >= 2.30.0
 BuildRequires: expat-devel
@@ -83,10 +87,12 @@ Development documentation for polkit.
 %setup -q
 %patch0 -p1 -b .XDG_RUNTIME_DIR
 %patch1 -p1 -b .PolkitAgentSession-race
+%patch2 -p1 -b .dbus-user-bus
+%patch3 -p1 -b .session-dedup-code
 
 %build
 %if 0%{?enable_autoreconf}
-autoreconf
+autoreconf -i
 %endif
 # we can't use _hardened_build here, see
 # https://bugzilla.redhat.com/show_bug.cgi?id=962005
@@ -169,6 +175,9 @@ exit 0
 %{_datadir}/gtk-doc
 
 %changelog
+* Thu Jun  5 2014 Kay Sievers <kay at redhat.com> - 0.112-4
+- backport upstream D-Bus "user bus" changes
+
 * Mon Feb 10 2014 Miloslav Trmač <mitr at redhat.com> - 0.112-3
 - Fix a PolkitAgentSession race condition
   Resolves: #1063193


More information about the scm-commits mailing list