[arch-commits] Commit in polkit/trunk (4 files)

Tom Gundersen tomegun at archlinux.org
Tue Aug 7 22:06:21 UTC 2012


    Date: Tuesday, August 7, 2012 @ 18:06:21
  Author: tomegun
Revision: 164988

update to 107

Also have another go at a systmed patch. This will fall back to ConsoleKit if the system
was not booted with systemd. Thi should be similar to heftig's first patch, but I forgot
all about that and wrote one from scratch. Maybe this magically works better, who knows.

Feel free to revert all of this, I'm just commiting it as we don't have a better way of
sharing this stuff.

Added:
  polkit/trunk/autogen.sh
  polkit/trunk/logind+ConsoleKit.patch
  polkit/trunk/polkit.install
Modified:
  polkit/trunk/PKGBUILD

-------------------------+
 PKGBUILD                |   27 +
 autogen.sh              |  123 ++++++++
 logind+ConsoleKit.patch |  638 ++++++++++++++++++++++++++++++++++++++++++++++
 polkit.install          |   18 +
 4 files changed, 799 insertions(+), 7 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2012-08-07 20:14:43 UTC (rev 164987)
+++ PKGBUILD	2012-08-07 22:06:21 UTC (rev 164988)
@@ -2,25 +2,31 @@
 # Maintainer: Jan de Groot <jgc at archlinux.org>
 
 pkgname=polkit
-pkgver=0.105
+pkgver=0.107
 pkgrel=1
 pkgdesc="Application development toolkit for controlling system-wide privileges"
 arch=(i686 x86_64)
 license=('LGPL')
 url="http://www.freedesktop.org/wiki/Software/PolicyKit"
-depends=('glib2' 'pam' 'expat')
+depends=('glib2' 'pam' 'expat' 'libsystemd' 'js')
 makedepends=('intltool' 'gtk-doc' 'gobject-introspection')
 replaces=('policykit')
 options=('!libtool')
-source=(http://www.freedesktop.org/software/polkit/releases/$pkgname-$pkgver.tar.gz
-        polkit.pam)
-md5sums=('9c29e1b6c214f0bd6f1d4ee303dfaed9'
-         '6564f95878297b954f0572bc1610dd15')
+install=polkit.install
+source=("http://www.freedesktop.org/software/polkit/releases/$pkgname-$pkgver.tar.gz"
+        'polkit.pam'
+	'logind+ConsoleKit.patch'
+	'autogen.sh')
 
 build() {
   cd $pkgname-$pkgver
-  ./configure --prefix=/usr --sysconfdir=/etc \
+
+  patch -p1 <../logind+ConsoleKit.patch
+
+  cp ../autogen.sh .
+  ./autogen.sh --prefix=/usr --sysconfdir=/etc \
       --localstatedir=/var --libexecdir=/usr/lib/polkit-1 \
+      --with-systemdsystemunitdir=/usr/lib/systemd/system \
       --disable-static --enable-gtk-doc
   make
 }
@@ -29,5 +35,12 @@
   cd $pkgname-$pkgver
   make DESTDIR="$pkgdir" install
 
+  chown 102 "$pkgdir/etc/polkit-1/rules.d"
+  chown 102 "$pkgdir/usr/share/polkit-1/rules.d"
+
   install -m644 "$srcdir/polkit.pam" "$pkgdir/etc/pam.d/polkit-1"
 }
+md5sums=('0e4f9c53f43fd1b25ac3f0d2e09b2ae1'
+         '6564f95878297b954f0572bc1610dd15'
+         'fb71d43442dbf24f8760198a9a79c5e7'
+         '38fe3119284e842e66b330b0f2ba230d')

Added: autogen.sh
===================================================================
--- autogen.sh	                        (rev 0)
+++ autogen.sh	2012-08-07 22:06:21 UTC (rev 164988)
@@ -0,0 +1,123 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+DIE=0
+
+(test -f $srcdir/configure.ac) || {
+    echo -n "**Error**: Directory $srcdir does not look like the"
+    echo " top-level package directory"
+    exit 1
+}
+
+olddir=`pwd`
+cd "$srcdir"
+
+touch ChangeLog
+
+(autoconf --version) < /dev/null > /dev/null 2>&1 || {
+  echo
+  echo "**Error**: You must have autoconf installed."
+  echo "Download the appropriate package for your distribution,"
+  echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+  DIE=1
+}
+
+(grep "^AM_PROG_LIBTOOL" configure.ac >/dev/null) && {
+  (libtoolize --version) < /dev/null > /dev/null 2>&1 || {
+    echo
+    echo "**Error**: You must have libtool installed."
+    echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/"
+    DIE=1
+  }
+}
+
+(gtkdocize --flavour no-tmpl) < /dev/null > /dev/null 2>&1 || {
+	echo
+	echo "You must have gtk-doc installed to compile $PROJECT."
+	echo "Install the appropriate package for your distribution,"
+	echo "or get the source tarball at http://ftp.gnome.org/pub/GNOME/sources/gtk-doc/"
+	DIE=1
+}
+
+(automake --version) < /dev/null > /dev/null 2>&1 || {
+  echo
+  echo "**Error**: You must have automake installed."
+  echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/"
+  DIE=1
+  NO_AUTOMAKE=yes
+}
+
+
+# if no automake, don't bother testing for aclocal
+test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || {
+  echo
+  echo "**Error**: Missing aclocal.  The version of automake"
+  echo "installed doesn't appear recent enough."
+  echo "You can get automake from ftp://ftp.gnu.org/pub/gnu/"
+  DIE=1
+}
+
+
+# if no automake, don't bother testing for autoreconf
+test -n "$NO_AUTOMAKE" || (autoreconf --version) < /dev/null > /dev/null 2>&1 || {
+  echo
+  echo "**Error**: You must have autoreconf installed."
+  echo "You can get autoreconf from ..."
+  DIE=1
+}
+
+
+if test "$DIE" -eq 1; then
+  exit 1
+fi
+
+if test -z "$*"; then
+  echo "**Warning**: I am going to run configure with no arguments."
+  echo "If you wish to pass any to it, please specify them on the"
+  echo $0 " command line."
+  echo
+fi
+
+case $CC in
+xlc )
+  am_opt=--include-deps;;
+esac
+
+      aclocalinclude="$ACLOCAL_FLAGS"
+
+      echo "Running autoreconf on test/mocklibc ..."
+      (cd "test/mocklibc"; autoreconf --install)
+
+      if grep "^AM_PROG_LIBTOOL" configure.ac >/dev/null; then
+	if test -z "$NO_LIBTOOLIZE" ; then 
+	  echo "Running libtoolize..."
+	  libtoolize --force --copy
+	fi
+      fi
+      echo "Running aclocal $aclocalinclude ..."
+      aclocal $aclocalinclude
+      if grep "^AM_CONFIG_HEADER" configure.ac >/dev/null; then
+	echo "Running autoheader..."
+	autoheader
+      fi
+      echo "Running automake --gnu -Wno-portability $am_opt ..."
+      automake --add-missing --gnu -Wno-portability $am_opt
+      echo "Running autoconf ..."
+      autoconf
+
+intltoolize --copy --force --automake                  || exit 1
+
+cd "$olddir"
+
+conf_flags="--enable-maintainer-mode --enable-gtk-doc"
+
+if test x$NOCONFIGURE = x; then
+  echo "Running $srcdir/configure $conf_flags $@ ..."
+  $srcdir/configure $conf_flags "$@" \
+  && echo "Now type make to compile." || exit 1
+else
+  echo "Skipping configure process."
+fi


Property changes on: polkit/trunk/autogen.sh
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: logind+ConsoleKit.patch
===================================================================
--- logind+ConsoleKit.patch	                        (rev 0)
+++ logind+ConsoleKit.patch	2012-08-07 22:06:21 UTC (rev 164988)
@@ -0,0 +1,638 @@
+From ba143769e17e4bbc1f2b0c88e735f993dfb3c873 Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg at jklm.no>
+Date: Tue, 7 Aug 2012 21:06:18 +0200
+Subject: [PATCH] session tracking: always require consolekit
+
+Only systemd is now optional at compile-time, and if enabled we fallback to consolekit
+at runtime, if not booted with systemd.
+
+Bits-stolen-from: Jan Alexander Steffens <jan.steffens at gmail.com>
+Signed-off-by: Tom Gundersen <teg at jklm.no>
+---
+ configure.ac                                       |   6 +-
+ src/polkit/polkitunixsession-systemd.c             |  96 ++++++-
+ src/polkitbackend/polkitbackendjsauthority.c       |  10 +-
+ .../polkitbackendsessionmonitor-systemd.c          | 313 +++++++++++++++++++--
+ 4 files changed, 380 insertions(+), 45 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 7a0d938..1d1e4ba 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -163,15 +163,15 @@ AC_ARG_ENABLE([libsystemd-login],
+               [enable_libsystemd_login=auto])
+ if test "$enable_libsystemd_login" != "no"; then
+   PKG_CHECK_MODULES(LIBSYSTEMD_LOGIN,
+-                    [libsystemd-login],
++                    [libsystemd-login libsystemd-daemon],
+                     have_libsystemd_login=yes,
+                     have_libsystemd_login=no)
+   if test "$have_libsystemd_login" = "yes"; then
+-    SESSION_TRACKING=libsystemd-login
++    SESSION_TRACKING="libsystemd-login (with ConsoleKit runtime fallback)"
+     AC_DEFINE([HAVE_LIBSYSTEMD_LOGIN], 1, [Define to 1 if libsystemd-login is available])
+   else
+     if test "$enable_libsystemd_login" = "yes"; then
+-      AC_MSG_ERROR([libsystemd-login support requested but libsystemd-login library not found])
++      AC_MSG_ERROR([libsystemd-login support requested but systemd libraries not found])
+     fi
+   fi
+ fi
+diff --git a/src/polkit/polkitunixsession-systemd.c b/src/polkit/polkitunixsession-systemd.c
+index 8a8bf65..bb89044 100644
+--- a/src/polkit/polkitunixsession-systemd.c
++++ b/src/polkit/polkitunixsession-systemd.c
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2011 Red Hat, Inc.
++ * Copyright (C) 2008, 2011 Red Hat, Inc.
+  *
+  * This library is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+@@ -17,6 +17,7 @@
+  * Boston, MA 02111-1307, USA.
+  *
+  * Author: Matthias Clasen
++ * Author: David Zeuthen <davidz at redhat.com>
+  */
+ 
+ #ifdef HAVE_CONFIG_H
+@@ -31,6 +32,7 @@
+ #include "polkitprivate.h"
+ 
+ #include <systemd/sd-login.h>
++#include <systemd/sd-daemon.h>
+ 
+ /**
+  * SECTION:polkitunixsession
+@@ -367,9 +369,41 @@ polkit_unix_session_exists_sync (PolkitSubject   *subject,
+   PolkitUnixSession *session = POLKIT_UNIX_SESSION (subject);
+   gboolean ret = FALSE;
+   uid_t uid;
++  GDBusConnection *connection; /* consolekit */
++  GVariant *result; /* consolekit */
+ 
+-  if (sd_session_get_uid (session->session_id, &uid) == 0)
+-    ret = TRUE;
++  if (sd_booted())
++    {
++      if (sd_session_get_uid (session->session_id, &uid) == 0)
++      ret = TRUE;
++    }
++  else /* consolekit */
++    {
++      connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, cancellable, error);
++      if (connection == NULL)
++        goto out;
++
++      result = g_dbus_connection_call_sync (connection,
++                                            "org.freedesktop.ConsoleKit",           /* name */
++                                            session->session_id,                    /* object path */
++                                            "org.freedesktop.ConsoleKit.Session",   /* interface name */
++                                            "GetUser",                              /* method */
++                                            NULL, /* parameters */
++                                            G_VARIANT_TYPE ("(u)"),
++                                            G_DBUS_CALL_FLAGS_NONE,
++                                            -1,
++                                            cancellable,
++                                            error);
++      if (result == NULL)
++        goto out;
++
++      ret = TRUE;
++      g_variant_unref (result);
++
++     out:
++      if (connection != NULL)
++        g_object_unref (connection);
++    }
+ 
+   return ret;
+ }
+@@ -451,29 +485,61 @@ polkit_unix_session_initable_init (GInitable     *initable,
+   PolkitUnixSession *session = POLKIT_UNIX_SESSION (initable);
+   gboolean ret = FALSE;
+   char *s;
++  GDBusConnection *connection; /* consolekit */
++  GVariant *result; /* consolekit */
++  connection = NULL; /* consolekit */
+ 
+   if (session->session_id != NULL)
+     {
+       /* already set, nothing to do */
+-      ret = TRUE;
+-      goto out;
++      return TRUE;
+     }
+ 
+-  if (sd_pid_get_session (session->pid, &s) == 0)
++  if (sd_booted())
++    {
++      if (sd_pid_get_session (session->pid, &s) == 0)
++        {
++          session->session_id = g_strdup (s);
++          free (s);
++          return TRUE;
++        }
++
++      g_set_error (error,
++                   POLKIT_ERROR,
++                   POLKIT_ERROR_FAILED,
++                   "No session for pid %d",
++                  (gint) session->pid);
++    }
++  else /* consolekit */
+     {
+-      session->session_id = g_strdup (s);
+-      free (s);
++      connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, cancellable, error);
++      if (connection == NULL)
++        goto out;
++
++      result = g_dbus_connection_call_sync (connection,
++                                            "org.freedesktop.ConsoleKit",           /* name */
++                                            "/org/freedesktop/ConsoleKit/Manager",  /* object path */
++                                            "org.freedesktop.ConsoleKit.Manager",   /* interface name */
++                                            "GetSessionForUnixProcess",             /* method */
++                                            g_variant_new ("(u)", session->pid),    /* parameters */
++                                            G_VARIANT_TYPE ("(o)"),
++                                            G_DBUS_CALL_FLAGS_NONE,
++                                            -1,
++                                            cancellable,
++                                            error);
++      if (result == NULL)
++        goto out;
++
++      g_variant_get (result, "(o)", &session->session_id);
++      g_variant_unref (result);
++
+       ret = TRUE;
+-      goto out;
+     }
+ 
+-  g_set_error (error,
+-               POLKIT_ERROR,
+-               POLKIT_ERROR_FAILED,
+-               "No session for pid %d",
+-               (gint) session->pid);
++ out:
++  if (connection != NULL) /* consolekit */
++    g_object_unref (connection);
+ 
+-out:
+   return ret;
+ }
+ 
+diff --git a/src/polkitbackend/polkitbackendjsauthority.c b/src/polkitbackend/polkitbackendjsauthority.c
+index bdfaa73..ee38739 100644
+--- a/src/polkitbackend/polkitbackendjsauthority.c
++++ b/src/polkitbackend/polkitbackendjsauthority.c
+@@ -36,6 +36,7 @@
+ 
+ #ifdef HAVE_LIBSYSTEMD_LOGIN
+ #include <systemd/sd-login.h>
++#include <systemd/sd-daemon.h>
+ #endif /* HAVE_LIBSYSTEMD_LOGIN */
+ 
+ #include <jsapi.h>
+@@ -731,11 +732,14 @@ subject_to_jsval (PolkitBackendJsAuthority  *authority,
+     }
+ 
+ #ifdef HAVE_LIBSYSTEMD_LOGIN
+-  if (sd_pid_get_session (pid, &session_str) == 0)
++  if (sd_booted())
+     {
+-      if (sd_session_get_seat (session_str, &seat_str) == 0)
++      if (sd_pid_get_session (pid, &session_str) == 0)
+         {
+-          /* do nothing */
++          if (sd_session_get_seat (session_str, &seat_str) == 0)
++            {
++              /* do nothing */
++            }
+         }
+     }
+ #endif /* HAVE_LIBSYSTEMD_LOGIN */
+diff --git a/src/polkitbackend/polkitbackendsessionmonitor-systemd.c b/src/polkitbackend/polkitbackendsessionmonitor-systemd.c
+index 58593c3..5114dfa 100644
+--- a/src/polkitbackend/polkitbackendsessionmonitor-systemd.c
++++ b/src/polkitbackend/polkitbackendsessionmonitor-systemd.c
+@@ -26,11 +26,15 @@
+ #include <string.h>
+ #include <glib/gstdio.h>
+ #include <systemd/sd-login.h>
++#include <systemd/sd-daemon.h>
+ #include <stdlib.h>
+ 
+ #include <polkit/polkit.h>
+ #include "polkitbackendsessionmonitor.h"
+ 
++/* consolekit */
++#define CKDB_PATH "/var/run/ConsoleKit/database"
++
+ /* <internal>
+  * SECTION:polkitbackendsessionmonitor
+  * @title: PolkitBackendSessionMonitor
+@@ -126,6 +130,11 @@ struct _PolkitBackendSessionMonitor
+   GDBusConnection *system_bus;
+ 
+   GSource *sd_source;
++
++  /* consolekit */
++  GKeyFile *database;
++  GFileMonitor *database_monitor;
++  time_t database_mtime;
+ };
+ 
+ struct _PolkitBackendSessionMonitorClass
+@@ -148,6 +157,101 @@ G_DEFINE_TYPE (PolkitBackendSessionMonitor, polkit_backend_session_monitor, G_TY
+ 
+ /* ---------------------------------------------------------------------------------------------------- */
+ 
++/* consolekit */
++static gboolean
++reload_database (PolkitBackendSessionMonitor  *monitor,
++                 GError                      **error)
++{
++  gboolean ret;
++  struct stat statbuf;
++
++  ret = FALSE;
++
++  if (monitor->database != NULL)
++    {
++      g_key_file_free (monitor->database);
++      monitor->database = NULL;
++    }
++
++  if (stat (CKDB_PATH, &statbuf) != 0)
++    {
++      g_set_error (error,
++                   G_IO_ERROR,
++                   g_io_error_from_errno (errno),
++                   "Error statting file " CKDB_PATH ": %s",
++                   strerror (errno));
++      goto out;
++    }
++
++  monitor->database_mtime = statbuf.st_mtime;
++
++  monitor->database = g_key_file_new ();
++  if (!g_key_file_load_from_file (monitor->database,
++                                  CKDB_PATH,
++                                  G_KEY_FILE_NONE,
++                                  error))
++    {
++      goto out;
++    }
++
++  ret = TRUE;
++
++ out:
++  return ret;
++}
++
++static gboolean
++ensure_database (PolkitBackendSessionMonitor  *monitor,
++		                 GError                      **error)
++{
++  gboolean ret = FALSE;
++
++  if (monitor->database != NULL)
++    {
++      struct stat statbuf;
++
++      if (stat (CKDB_PATH, &statbuf) != 0)
++        {
++          g_set_error (error,
++                       G_IO_ERROR,
++                       g_io_error_from_errno (errno),
++                       "Error statting file " CKDB_PATH " to check timestamp: %s",
++                       strerror (errno));
++          goto out;
++        }
++      if (statbuf.st_mtime == monitor->database_mtime)
++        {
++          ret = TRUE;
++          goto out;
++        }
++    }
++
++  ret = reload_database (monitor, error);
++
++ out:
++  return ret;
++}
++
++static void
++on_file_monitor_changed (GFileMonitor     *file_monitor,
++                         GFile            *file,
++                         GFile            *other_file,
++                         GFileMonitorEvent event_type,
++                         gpointer          user_data)
++{
++  PolkitBackendSessionMonitor *monitor = POLKIT_BACKEND_SESSION_MONITOR (user_data);
++
++  /* throw away cache */
++  if (monitor->database != NULL)
++    {
++      g_key_file_free (monitor->database);
++      monitor->database = NULL;
++    }
++  g_signal_emit (monitor, signals[CHANGED_SIGNAL], 0);
++}
++
++/* consolekit - end */
++
+ static gboolean
+ sessions_changed (gpointer user_data)
+ {
+@@ -163,6 +267,7 @@ static void
+ polkit_backend_session_monitor_init (PolkitBackendSessionMonitor *monitor)
+ {
+   GError *error;
++  GFile *file; /* consolekit */
+ 
+   error = NULL;
+   monitor->system_bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+@@ -172,9 +277,41 @@ polkit_backend_session_monitor_init (PolkitBackendSessionMonitor *monitor)
+       g_error_free (error);
+     }
+ 
+-  monitor->sd_source = sd_source_new ();
+-  g_source_set_callback (monitor->sd_source, sessions_changed, monitor, NULL);
+-  g_source_attach (monitor->sd_source, NULL);
++  if (sd_booted())
++    {
++      monitor->sd_source = sd_source_new ();
++      g_source_set_callback (monitor->sd_source, sessions_changed, monitor, NULL);
++      g_source_attach (monitor->sd_source, NULL);
++    }
++  else /* consolekit */
++    {
++      error = NULL;
++      if (!ensure_database (monitor, &error))
++        {
++          g_printerr ("Error loading " CKDB_PATH ": %s", error->message);
++          g_error_free (error);
++        }
++
++      error = NULL;
++      file = g_file_new_for_path (CKDB_PATH);
++      monitor->database_monitor = g_file_monitor_file (file,
++                                                       G_FILE_MONITOR_NONE,
++                                                       NULL,
++                                                       &error);
++      g_object_unref (file);
++      if (monitor->database_monitor == NULL)
++        {
++          g_printerr ("Error monitoring " CKDB_PATH ": %s", error->message);
++          g_error_free (error);
++        }
++      else
++        {
++          g_signal_connect (monitor->database_monitor,
++                            "changed",
++                            G_CALLBACK (on_file_monitor_changed),
++                            monitor);
++        }
++    }
+ }
+ 
+ static void
+@@ -191,6 +328,14 @@ polkit_backend_session_monitor_finalize (GObject *object)
+       g_source_unref (monitor->sd_source);
+     }
+ 
++  /* consolekit */
++  if (monitor->database_monitor != NULL)
++    g_object_unref (monitor->database_monitor);
++
++  if (monitor->database != NULL)
++    g_key_file_free (monitor->database);
++  /* consolekit - end */
++
+   if (G_OBJECT_CLASS (polkit_backend_session_monitor_parent_class)->finalize != NULL)
+     G_OBJECT_CLASS (polkit_backend_session_monitor_parent_class)->finalize (object);
+ }
+@@ -258,6 +403,8 @@ polkit_backend_session_monitor_get_user_for_subject (PolkitBackendSessionMonitor
+                                                      GError                      **error)
+ {
+   PolkitIdentity *ret;
++  GError *local_error; /* consolekit */
++  gchar *group; /* consolekit */
+   guint32 uid;
+ 
+   ret = NULL;
+@@ -300,16 +447,38 @@ polkit_backend_session_monitor_get_user_for_subject (PolkitBackendSessionMonitor
+   else if (POLKIT_IS_UNIX_SESSION (subject))
+     {
+ 
+-      if (sd_session_get_uid (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (subject)), &uid) < 0)
++      if (sd_booted())
+         {
+-          g_set_error (error,
+-                       POLKIT_ERROR,
+-                       POLKIT_ERROR_FAILED,
+-                       "Error getting uid for session");
+-          goto out;
++          if (sd_session_get_uid (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (subject)), &uid) < 0)
++            {
++              g_set_error (error,
++                           POLKIT_ERROR,
++                           POLKIT_ERROR_FAILED,
++                           "Error getting uid for session");
++              goto out;
++            }
++
++          ret = polkit_unix_user_new (uid);
++        }
++      else /* consolekit */
++        {
++          if (!ensure_database (monitor, error))
++            {
++              g_prefix_error (error, "Error getting user for session: Error ensuring CK database at " CKDB_PATH ": ");
++              goto out;
++            }
++
++         group = g_strdup_printf ("Session %s", polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (subject)));
++         local_error = NULL;
++         uid = g_key_file_get_integer (monitor->database, group, "uid", &local_error);
++         if (local_error != NULL)
++           {
++             g_propagate_prefixed_error (error, local_error, "Error getting uid using " CKDB_PATH ": ");
++             g_free (group);
++             goto out;
++           }
++         g_free (group);
+         }
+-
+-      ret = polkit_unix_user_new (uid);
+     }
+ 
+  out:
+@@ -337,20 +506,43 @@ polkit_backend_session_monitor_get_session_for_subject (PolkitBackendSessionMoni
+ 
+   if (POLKIT_IS_UNIX_PROCESS (subject))
+     {
+-      gchar *session_id;
+-      pid_t pid;
++      if (sd_booted())
++        {
++          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;
++          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);
++          session = polkit_unix_session_new (session_id);
++          free (session_id);
++	}
++      else /* consolekit */
++        {
++          const gchar *session_id;
++          GVariant *result;
++          result = g_dbus_connection_call_sync (monitor->system_bus,
++                                                "org.freedesktop.ConsoleKit",
++                                                "/org/freedesktop/ConsoleKit/Manager",
++                                                "org.freedesktop.ConsoleKit.Manager",
++                                                "GetSessionForUnixProcess",
++                                                g_variant_new ("(u)", polkit_unix_process_get_pid (POLKIT_UNIX_PROCESS (subject))),
++                                                G_VARIANT_TYPE ("(o)"),
++                                                G_DBUS_CALL_FLAGS_NONE,
++                                                -1, /* timeout_msec */
++                                                NULL, /* GCancellable */
++                                                error);
++          if (result == NULL)
++            goto out;
++          g_variant_get (result, "(&o)", &session_id);
++          session = polkit_unix_session_new (session_id);
++          g_variant_unref (result);
++        }
+     }
+   else if (POLKIT_IS_SYSTEM_BUS_NAME (subject))
+     {
+       guint32 pid;
+-      gchar *session_id;
+       GVariant *result;
+ 
+       result = g_dbus_connection_call_sync (monitor->system_bus,
+@@ -369,11 +561,35 @@ polkit_backend_session_monitor_get_session_for_subject (PolkitBackendSessionMoni
+       g_variant_get (result, "(u)", &pid);
+       g_variant_unref (result);
+ 
+-      if (sd_pid_get_session (pid, &session_id) < 0)
+-        goto out;
++      if (sd_booted())
++        {
++          gchar *session_id;
++          if (sd_pid_get_session (pid, &session_id) < 0)
++            goto out;
+ 
+-      session = polkit_unix_session_new (session_id);
+-      free (session_id);
++          session = polkit_unix_session_new (session_id);
++          free (session_id);
++        }
++      else /* consolekit */
++        {
++          const gchar *session_id;
++          result = g_dbus_connection_call_sync (monitor->system_bus,
++                                                "org.freedesktop.ConsoleKit",
++                                                "/org/freedesktop/ConsoleKit/Manager",
++                                                "org.freedesktop.ConsoleKit.Manager",
++                                                "GetSessionForUnixProcess",
++                                                g_variant_new ("(u)", pid),
++                                                G_VARIANT_TYPE ("(o)"),
++                                                G_DBUS_CALL_FLAGS_NONE,
++                                               -1, /* timeout_msec */
++                                               NULL, /* GCancellable */
++                                               error);
++          if (result == NULL)
++            goto out;
++          g_variant_get (result, "(&o)", &session_id);
++          session = polkit_unix_session_new (session_id);
++          g_variant_unref (result);
++        }
+     }
+   else
+     {
+@@ -389,12 +605,58 @@ polkit_backend_session_monitor_get_session_for_subject (PolkitBackendSessionMoni
+   return session;
+ }
+ 
++static gboolean
++get_boolean (PolkitBackendSessionMonitor *monitor,
++             PolkitSubject               *session,
++             const gchar                 *key_name)
++{
++  gboolean ret;
++  gchar *group;
++  GError *error;
++
++  ret = FALSE;
++
++  group = g_strdup_printf ("Session %s", polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (session)));
++
++  error = NULL;
++  if (!ensure_database (monitor, &error))
++    {
++      g_printerr ("Error getting boolean `%s' in group `%s': Error ensuring CK database at " CKDB_PATH ": %s",
++                  key_name,
++                  group,
++                  error->message);
++      g_error_free (error);
++      goto out;
++    }
++
++  error = NULL;
++  ret = g_key_file_get_boolean (monitor->database, group, key_name, &error);
++  if (error != NULL)
++    {
++      g_printerr ("Error looking %s using " CKDB_PATH " for %s: %s\n",
++                  key_name,
++                  group,
++                  error->message);
++      g_error_free (error);
++      goto out;
++    }
++
++ out:
++  g_free (group);
++  return ret;
++}
++
+ gboolean
+ polkit_backend_session_monitor_is_session_local (PolkitBackendSessionMonitor *monitor,
+                                                  PolkitSubject               *session)
+ {
+   char *seat;
+ 
++  if (!sd_booted()) /* consolekit */
++    {
++      return get_boolean (monitor, session, "is_local");
++    }
++
+   if (!sd_session_get_seat (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (session)), &seat))
+     {
+       free (seat);
+@@ -409,6 +671,9 @@ gboolean
+ polkit_backend_session_monitor_is_session_active (PolkitBackendSessionMonitor *monitor,
+                                                   PolkitSubject               *session)
+ {
+-  return sd_session_is_active (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (session)));
++  if (sd_booted())
++    return sd_session_is_active (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (session)));
++  else /* consolekit */
++    return get_boolean (monitor, session, "is_active");
+ }
+ 
+-- 
+1.7.11.4
+

Added: polkit.install
===================================================================
--- polkit.install	                        (rev 0)
+++ polkit.install	2012-08-07 22:06:21 UTC (rev 164988)
@@ -0,0 +1,18 @@
+post_install() {
+       getent group polkitd >/dev/null || groupadd -g 102 polkitd
+       getent passwd polkitd >/dev/null || useradd -c 'Policy Kit Daemon' -u 102 -g polkitd -d '/' -s /bin/false polkitd
+       passwd -l polkitd &>/dev/null
+}
+
+post_upgrade() {
+       post_install
+}
+
+post_remove() {
+       if getent passwd polkitd >/dev/null; then
+               userdel polkitd
+       fi
+       if getent group polkitd >/dev/null; then
+               groupdel polkitd
+       fi
+}




More information about the arch-commits mailing list