From c85b504e8916411d424cd3fc654ff879237d529e Mon Sep 17 00:00:00 2001 From: root Date: Sat, 8 Sep 2012 00:04:17 +0000 Subject: Sat Sep 8 00:04:17 UTC 2012 --- gnome-unstable/polkit/PKGBUILD | 39 ++ gnome-unstable/polkit/autogen.sh | 123 +++++ gnome-unstable/polkit/logind+ConsoleKit.patch | 638 ++++++++++++++++++++++++++ gnome-unstable/polkit/polkit.install | 18 + gnome-unstable/polkit/polkit.pam | 7 + 5 files changed, 825 insertions(+) create mode 100644 gnome-unstable/polkit/PKGBUILD create mode 100755 gnome-unstable/polkit/autogen.sh create mode 100644 gnome-unstable/polkit/logind+ConsoleKit.patch create mode 100644 gnome-unstable/polkit/polkit.install create mode 100644 gnome-unstable/polkit/polkit.pam (limited to 'gnome-unstable/polkit') 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 + +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 +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 +Signed-off-by: Tom Gundersen +--- + 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 + */ + + #ifdef HAVE_CONFIG_H +@@ -31,6 +32,7 @@ + #include "polkitprivate.h" + + #include ++#include + + /** + * 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 ++#include + #endif /* HAVE_LIBSYSTEMD_LOGIN */ + + #include +@@ -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 + #include + #include ++#include + #include + + #include + #include "polkitbackendsessionmonitor.h" + ++/* consolekit */ ++#define CKDB_PATH "/var/run/ConsoleKit/database" ++ + /* + * 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 -- cgit v1.2.3-54-g00ecf