summaryrefslogtreecommitdiff
path: root/gnome-unstable/polkit
diff options
context:
space:
mode:
authorNicolás Reynolds <fauno@kiwwwi.com.ar>2012-09-10 15:50:09 -0300
committerNicolás Reynolds <fauno@kiwwwi.com.ar>2012-09-10 15:50:09 -0300
commit678a7a4fb762d6669c9c2105b78d107aeebe163e (patch)
treeff00f3107491221d314e82982159160e1fa15778 /gnome-unstable/polkit
parentf5cfd603b3511e75e414558f6cc9c10f8af0b750 (diff)
parent2a4c41bf2946fad65b14cf1b4ea284ebce0f11f3 (diff)
Merge branch 'master' of ssh://vparabola/home/parabola/abslibre-pre-mips64el
Conflicts: community-staging/haskell-stm/PKGBUILD community-staging/haskell-syb/PKGBUILD community/cantata/PKGBUILD community/linux-tools/PKGBUILD community/python-pymongo/PKGBUILD core/less/PKGBUILD extra/alsa-plugins/PKGBUILD extra/avfs/PKGBUILD extra/cups/PKGBUILD extra/icedtea-web/PKGBUILD extra/kdeadmin/PKGBUILD extra/kdemultimedia-mplayerthumbs/PKGBUILD extra/kdepim/PKGBUILD extra/libreoffice/PKGBUILD extra/mysql/PKGBUILD extra/ocaml/PKGBUILD extra/sqlite/PKGBUILD extra/vim/PKGBUILD gnome-unstable/at-spi2-atk/PKGBUILD gnome-unstable/at-spi2-core/PKGBUILD gnome-unstable/atk/PKGBUILD gnome-unstable/glib2/PKGBUILD gnome-unstable/gobject-introspection/PKGBUILD multilib/lib32-alsa-lib/PKGBUILD multilib/lib32-alsa-plugins/PKGBUILD multilib/lib32-fontconfig/PKGBUILD staging/ghc/PKGBUILD staging/ghc/build.mk staging/haskell-http/PKGBUILD staging/haskell-mtl/PKGBUILD staging/haskell-network/PKGBUILD staging/haskell-parsec/PKGBUILD staging/haskell-random/PKGBUILD staging/haskell-text/PKGBUILD staging/haskell-transformers/PKGBUILD staging/haskell-zlib/PKGBUILD testing/coreutils/PKGBUILD testing/coreutils/coreutils.install testing/dhcpcd/PKGBUILD testing/kactivities/PKGBUILD testing/kdeaccessibility-jovie/PKGBUILD testing/kdeaccessibility-kaccessible/PKGBUILD testing/kdeaccessibility-kmag/PKGBUILD testing/kdeaccessibility-kmousetool/PKGBUILD testing/kdeaccessibility-kmouth/PKGBUILD testing/kdeadmin/PKGBUILD testing/kdeartwork/PKGBUILD testing/kdebase-konsole/PKGBUILD testing/kdebase-workspace/PKGBUILD testing/kdebase/PKGBUILD testing/kdebindings-kimono/PKGBUILD testing/kdebindings-korundum/PKGBUILD testing/kdebindings-kross/PKGBUILD testing/kdebindings-perlkde/PKGBUILD testing/kdebindings-perlqt/PKGBUILD testing/kdebindings-python/PKGBUILD testing/kdebindings-qtruby/PKGBUILD testing/kdebindings-qyoto/PKGBUILD testing/kdebindings-smokegen/PKGBUILD testing/kdebindings-smokekde/PKGBUILD testing/kdebindings-smokeqt/PKGBUILD testing/kdeedu-analitza/PKGBUILD testing/kdeedu-blinken/PKGBUILD testing/kdeedu-cantor/PKGBUILD testing/kdeedu-kalgebra/PKGBUILD testing/kdeedu-kalzium/PKGBUILD testing/kdeedu-kanagram/PKGBUILD testing/kdeedu-kbruch/PKGBUILD testing/kdeedu-kgeography/PKGBUILD testing/kdeedu-khangman/PKGBUILD testing/kdeedu-kig/PKGBUILD testing/kdeedu-kiten/PKGBUILD testing/kdeedu-klettres/PKGBUILD testing/kdeedu-kmplot/PKGBUILD testing/kdeedu-kstars/PKGBUILD testing/kdeedu-ktouch/PKGBUILD testing/kdeedu-kturtle/PKGBUILD testing/kdeedu-kwordquiz/PKGBUILD testing/kdeedu-marble/PKGBUILD testing/kdeedu-pairs/PKGBUILD testing/kdeedu-parley/PKGBUILD testing/kdeedu-rocs/PKGBUILD testing/kdeedu-step/PKGBUILD testing/kdegames/PKGBUILD testing/kdegraphics-gwenview/PKGBUILD testing/kdegraphics-kamera/PKGBUILD testing/kdegraphics-kcolorchooser/PKGBUILD testing/kdegraphics-kgamma/PKGBUILD testing/kdegraphics-kolourpaint/PKGBUILD testing/kdegraphics-kruler/PKGBUILD testing/kdegraphics-ksaneplugin/PKGBUILD testing/kdegraphics-ksnapshot/PKGBUILD testing/kdegraphics-mobipocket/PKGBUILD testing/kdegraphics-okular/PKGBUILD testing/kdegraphics-strigi-analyzer/PKGBUILD testing/kdegraphics-svgpart/PKGBUILD testing/kdegraphics-thumbnailers/PKGBUILD testing/kdemultimedia-audiocd-kio/PKGBUILD testing/kdemultimedia-dragonplayer/PKGBUILD testing/kdemultimedia-ffmpegthumbs/PKGBUILD testing/kdemultimedia-juk/PKGBUILD testing/kdemultimedia-kmix/PKGBUILD testing/kdemultimedia-kscd/PKGBUILD testing/kdemultimedia-mplayerthumbs/PKGBUILD testing/kdenetwork/PKGBUILD testing/kdepim-runtime/PKGBUILD testing/kdepim/PKGBUILD testing/kdepimlibs/PKGBUILD testing/kdeplasma-addons/PKGBUILD testing/kdesdk-kate/PKGBUILD testing/kdesdk/PKGBUILD testing/kdetoys/PKGBUILD testing/kdeutils-filelight/PKGBUILD testing/kdeutils-kcalc/PKGBUILD testing/kdeutils-kcharselect/PKGBUILD testing/kdeutils-kdf/PKGBUILD testing/kdeutils-kfloppy/PKGBUILD testing/kdeutils-kgpg/PKGBUILD testing/kdeutils-kremotecontrol/PKGBUILD testing/kdeutils-ktimer/PKGBUILD testing/kdeutils-kwallet/PKGBUILD testing/kdeutils-superkaramba/PKGBUILD testing/kdeutils-sweeper/PKGBUILD testing/kdewebdev/PKGBUILD testing/kmod/PKGBUILD testing/libkcddb/PKGBUILD testing/libkcompactdisc/PKGBUILD testing/libkdcraw/PKGBUILD testing/libkdeedu/PKGBUILD testing/libkexiv2/PKGBUILD testing/libkipi/PKGBUILD testing/libksane/PKGBUILD testing/libmpc/PKGBUILD testing/nepomuk-core/PKGBUILD testing/procps-ng/PKGBUILD testing/sudo/PKGBUILD testing/sysvinit/PKGBUILD testing/util-linux/PKGBUILD testing/util-linux/util-linux.install
Diffstat (limited to 'gnome-unstable/polkit')
-rw-r--r--gnome-unstable/polkit/PKGBUILD39
-rwxr-xr-xgnome-unstable/polkit/autogen.sh123
-rw-r--r--gnome-unstable/polkit/logind+ConsoleKit.patch638
-rw-r--r--gnome-unstable/polkit/polkit.install18
-rw-r--r--gnome-unstable/polkit/polkit.pam7
5 files changed, 825 insertions, 0 deletions
diff --git a/gnome-unstable/polkit/PKGBUILD b/gnome-unstable/polkit/PKGBUILD
new file mode 100644
index 000000000..fc3d4d3ba
--- /dev/null
+++ b/gnome-unstable/polkit/PKGBUILD
@@ -0,0 +1,39 @@
+# $Id: PKGBUILD 166359 2012-09-06 21:43:48Z jgc $
+# Maintainer: Jan de Groot <jgc@archlinux.org>
+
+pkgname=polkit
+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' 'libsystemd' 'js')
+makedepends=('intltool' 'gtk-doc' 'gobject-introspection')
+replaces=('policykit')
+options=('!libtool')
+install=polkit.install
+source=(http://www.freedesktop.org/software/polkit/releases/$pkgname-$pkgver.tar.gz
+ polkit.pam)
+md5sums=('0e4f9c53f43fd1b25ac3f0d2e09b2ae1'
+ '6564f95878297b954f0572bc1610dd15')
+
+build() {
+ cd $pkgname-$pkgver
+
+ ./configure --prefix=/usr --sysconfdir=/etc \
+ --localstatedir=/var --libexecdir=/usr/lib/polkit-1 \
+ --with-systemdsystemunitdir=/usr/lib/systemd/system \
+ --disable-static --enable-gtk-doc
+ make
+}
+
+package() {
+ 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"
+}
diff --git a/gnome-unstable/polkit/autogen.sh b/gnome-unstable/polkit/autogen.sh
new file mode 100755
index 000000000..d08b00a49
--- /dev/null
+++ b/gnome-unstable/polkit/autogen.sh
@@ -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
diff --git a/gnome-unstable/polkit/logind+ConsoleKit.patch b/gnome-unstable/polkit/logind+ConsoleKit.patch
new file mode 100644
index 000000000..042d1043a
--- /dev/null
+++ b/gnome-unstable/polkit/logind+ConsoleKit.patch
@@ -0,0 +1,638 @@
+From ba143769e17e4bbc1f2b0c88e735f993dfb3c873 Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg@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@gmail.com>
+Signed-off-by: Tom Gundersen <teg@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@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
+
diff --git a/gnome-unstable/polkit/polkit.install b/gnome-unstable/polkit/polkit.install
new file mode 100644
index 000000000..fbb98919e
--- /dev/null
+++ b/gnome-unstable/polkit/polkit.install
@@ -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
+}
diff --git a/gnome-unstable/polkit/polkit.pam b/gnome-unstable/polkit/polkit.pam
new file mode 100644
index 000000000..04f53e0db
--- /dev/null
+++ b/gnome-unstable/polkit/polkit.pam
@@ -0,0 +1,7 @@
+auth requisite pam_nologin.so
+auth required pam_env.so
+auth required pam_unix.so
+account required pam_unix.so
+session required pam_limits.so
+session required pam_unix.so
+password required pam_unix.so