diff options
Diffstat (limited to 'abs')
-rw-r--r-- | abs/extra/polkit/PKGBUILD | 28 | ||||
-rw-r--r-- | abs/extra/polkit/__changelog | 1 | ||||
-rw-r--r-- | abs/extra/polkit/polkit.install | 18 | ||||
-rw-r--r-- | abs/extra/polkit/systemd-fallback.patch | 1571 |
4 files changed, 35 insertions, 1583 deletions
diff --git a/abs/extra/polkit/PKGBUILD b/abs/extra/polkit/PKGBUILD index e86dbbc..b120d65 100644 --- a/abs/extra/polkit/PKGBUILD +++ b/abs/extra/polkit/PKGBUILD @@ -1,27 +1,26 @@ -# $Id: PKGBUILD 158972 2012-05-13 21:06:37Z jgc $ +# $Id$ # Maintainer: Jan de Groot <jgc@archlinux.org> pkgname=polkit -pkgver=0.105 -pkgrel=1 +pkgver=0.112 +pkgrel=2 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') -makedepends=('intltool' 'gtk-doc' 'gobject-introspection') -replaces=('policykit') -options=('!libtool') +license=(LGPL) +url="http://www.freedesktop.org/wiki/Software/polkit" +depends=(glib2 pam expat systemd js17) +makedepends=(intltool gtk-doc gobject-introspection) +install=polkit.install source=(http://www.freedesktop.org/software/polkit/releases/$pkgname-$pkgver.tar.gz polkit.pam) -md5sums=('9c29e1b6c214f0bd6f1d4ee303dfaed9' - '6564f95878297b954f0572bc1610dd15') build() { cd $pkgname-$pkgver + ./configure --prefix=/usr --sysconfdir=/etc \ --localstatedir=/var --libexecdir=/usr/lib/polkit-1 \ - --disable-static --enable-gtk-doc + --enable-libsystemd-login=no --disable-static \ + --enable-gtk-doc make } @@ -29,5 +28,10 @@ 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" } +md5sums=('b0f2fa00a55f47c6a5d88e9b73f80127' + '6564f95878297b954f0572bc1610dd15') diff --git a/abs/extra/polkit/__changelog b/abs/extra/polkit/__changelog new file mode 100644 index 0000000..8a7d752 --- /dev/null +++ b/abs/extra/polkit/__changelog @@ -0,0 +1 @@ +PKGBUILD: change --enable-libsystemd-login=yes to --enable-libsystemd-login=no diff --git a/abs/extra/polkit/polkit.install b/abs/extra/polkit/polkit.install new file mode 100644 index 0000000..fbb9891 --- /dev/null +++ b/abs/extra/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/abs/extra/polkit/systemd-fallback.patch b/abs/extra/polkit/systemd-fallback.patch deleted file mode 100644 index f89ce10..0000000 --- a/abs/extra/polkit/systemd-fallback.patch +++ /dev/null @@ -1,1571 +0,0 @@ -diff -u -rN polkit-0.104/configure.ac polkit-0.104-systemd-fallback/configure.ac ---- polkit-0.104/configure.ac 2012-01-03 17:25:49.000000000 +0100 -+++ polkit-0.104-systemd-fallback/configure.ac 2012-03-06 15:45:55.275860194 +0100 -@@ -160,14 +160,14 @@ - [enable_systemd=auto]) - if test "$enable_systemd" != "no"; then - PKG_CHECK_MODULES(SYSTEMD, -- [libsystemd-login], -+ [libsystemd-login libsystemd-daemon], - have_systemd=yes, - have_systemd=no) - if test "$have_systemd" = "yes"; then - SESSION_TRACKING=systemd - else - if test "$enable_systemd" = "yes"; then -- AC_MSG_ERROR([systemd support requested but libsystemd-login1 library not found]) -+ AC_MSG_ERROR([systemd support requested but systemd libraries not found]) - fi - fi - fi -diff -u -rN polkit-0.104/src/polkit/Makefile.am polkit-0.104-systemd-fallback/src/polkit/Makefile.am ---- polkit-0.104/src/polkit/Makefile.am 2012-01-03 16:03:47.000000000 +0100 -+++ polkit-0.104-systemd-fallback/src/polkit/Makefile.am 2012-03-06 15:19:25.108853325 +0100 -@@ -79,15 +79,8 @@ - polkitimplicitauthorization.c polkitimplicitauthorization.h \ - polkittemporaryauthorization.c polkittemporaryauthorization.h \ - polkitpermission.c polkitpermission.h \ -- $(NULL) -- --if HAVE_SYSTEMD --libpolkit_gobject_1_la_SOURCES += \ -- polkitunixsession-systemd.c polkitunixsession.h --else --libpolkit_gobject_1_la_SOURCES += \ - polkitunixsession.c polkitunixsession.h --endif -+ $(NULL) - - libpolkit_gobject_1_la_CFLAGS = \ - -D_POLKIT_COMPILATION \ -diff -u -rN polkit-0.104/src/polkit/polkitunixsession.c polkit-0.104-systemd-fallback/src/polkit/polkitunixsession.c ---- polkit-0.104/src/polkit/polkitunixsession.c 2011-10-18 19:02:27.000000000 +0200 -+++ polkit-0.104-systemd-fallback/src/polkit/polkitunixsession.c 2012-03-06 15:17:29.829788021 +0100 -@@ -23,12 +23,18 @@ - # include "config.h" - #endif - -+#include <stdlib.h> - #include <string.h> - #include "polkitunixsession.h" - #include "polkitsubject.h" - #include "polkiterror.h" - #include "polkitprivate.h" - -+#ifdef HAVE_SYSTEMD -+# include <systemd/sd-daemon.h> -+# include <systemd/sd-login.h> -+#endif -+ - /** - * SECTION:polkitunixsession - * @title: PolkitUnixSession -@@ -364,34 +370,44 @@ - PolkitUnixSession *session = POLKIT_UNIX_SESSION (subject); - GDBusConnection *connection; - GVariant *result; -- gboolean ret; -- -- ret = FALSE; -+ gboolean ret = FALSE; - -- 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; -+#ifdef HAVE_SYSTEMD -+ uid_t uid; -+ -+ if (sd_booted () > 0) -+ { -+ if (sd_session_get_uid (session->session_id, &uid) == 0) -+ ret = TRUE; -+ } -+ else -+#endif -+ { -+ 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); -+ ret = TRUE; -+ g_variant_unref (result); - -- out: -- if (connection != NULL) -- g_object_unref (connection); -+ out: -+ if (connection != NULL) -+ g_object_unref (connection); -+ } - return ret; - } - -@@ -470,12 +486,9 @@ - GError **error) - { - PolkitUnixSession *session = POLKIT_UNIX_SESSION (initable); -- GDBusConnection *connection; -+ GDBusConnection *connection = NULL; - GVariant *result; -- gboolean ret; -- -- connection = NULL; -- ret = FALSE; -+ gboolean ret = FALSE; - - if (session->session_id != NULL) - { -@@ -484,33 +497,56 @@ - goto out; - } - -- connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, cancellable, error); -- if (connection == NULL) -- goto out; -+#ifdef HAVE_SYSTEMD -+ char *s; -+ -+ if (sd_booted () > 0) -+ { -+ if (sd_pid_get_session (session->pid, &s) == 0) -+ { -+ session->session_id = g_strdup (s); -+ free (s); -+ ret = TRUE; -+ goto out; -+ } -+ -+ g_set_error (error, -+ POLKIT_ERROR, -+ POLKIT_ERROR_FAILED, -+ "No session for pid %d", -+ (gint) session->pid); -+ } -+ else -+#endif -+ { -+ 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; - -- 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); - -- g_variant_get (result, "(o)", &session->session_id); -- g_variant_unref (result); -+ ret = TRUE; -+ } - -- ret = TRUE; - - out: - if (connection != NULL) - g_object_unref (connection); -- - return ret; - } - -diff -u -rN polkit-0.104/src/polkit/polkitunixsession-systemd.c polkit-0.104-systemd-fallback/src/polkit/polkitunixsession-systemd.c ---- polkit-0.104/src/polkit/polkitunixsession-systemd.c 2012-01-03 16:03:47.000000000 +0100 -+++ polkit-0.104-systemd-fallback/src/polkit/polkitunixsession-systemd.c 1970-01-01 01:00:00.000000000 +0100 -@@ -1,481 +0,0 @@ --/* -- * Copyright (C) 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 -- * License as published by the Free Software Foundation; either -- * version 2 of the License, or (at your option) any later version. -- * -- * This library is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- * Lesser General Public License for more details. -- * -- * You should have received a copy of the GNU Lesser General -- * Public License along with this library; if not, write to the -- * Free Software Foundation, Inc., 59 Temple Place, Suite 330, -- * Boston, MA 02111-1307, USA. -- * -- * Author: Matthias Clasen -- */ -- --#ifdef HAVE_CONFIG_H --# include "config.h" --#endif -- --#include <string.h> --#include "polkitunixsession.h" --#include "polkitsubject.h" --#include "polkiterror.h" --#include "polkitprivate.h" -- --#include <systemd/sd-login.h> -- --/** -- * SECTION:polkitunixsession -- * @title: PolkitUnixSession -- * @short_description: Unix sessions -- * -- * An object that represents an user session. -- * -- * The session id is an opaque string obtained from ConsoleKit. -- */ -- --/** -- * PolkitUnixSession: -- * -- * The #PolkitUnixSession struct should not be accessed directly. -- */ --struct _PolkitUnixSession --{ -- GObject parent_instance; -- -- gchar *session_id; -- -- gint pid; --}; -- --struct _PolkitUnixSessionClass --{ -- GObjectClass parent_class; --}; -- --enum --{ -- PROP_0, -- PROP_SESSION_ID, -- PROP_PID, --}; -- --static void subject_iface_init (PolkitSubjectIface *subject_iface); --static void initable_iface_init (GInitableIface *initable_iface); --static void async_initable_iface_init (GAsyncInitableIface *async_initable_iface); -- --G_DEFINE_TYPE_WITH_CODE (PolkitUnixSession, polkit_unix_session, G_TYPE_OBJECT, -- G_IMPLEMENT_INTERFACE (POLKIT_TYPE_SUBJECT, subject_iface_init) -- G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init) -- G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, async_initable_iface_init) -- ); -- --static void --polkit_unix_session_init (PolkitUnixSession *session) --{ --} -- --static void --polkit_unix_session_finalize (GObject *object) --{ -- PolkitUnixSession *session = POLKIT_UNIX_SESSION (object); -- -- g_free (session->session_id); -- -- if (G_OBJECT_CLASS (polkit_unix_session_parent_class)->finalize != NULL) -- G_OBJECT_CLASS (polkit_unix_session_parent_class)->finalize (object); --} -- --static void --polkit_unix_session_get_property (GObject *object, -- guint prop_id, -- GValue *value, -- GParamSpec *pspec) --{ -- PolkitUnixSession *session = POLKIT_UNIX_SESSION (object); -- -- switch (prop_id) -- { -- case PROP_SESSION_ID: -- g_value_set_string (value, session->session_id); -- break; -- -- default: -- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); -- break; -- } --} -- --static void --polkit_unix_session_set_property (GObject *object, -- guint prop_id, -- const GValue *value, -- GParamSpec *pspec) --{ -- PolkitUnixSession *session = POLKIT_UNIX_SESSION (object); -- -- switch (prop_id) -- { -- case PROP_SESSION_ID: -- polkit_unix_session_set_session_id (session, g_value_get_string (value)); -- break; -- -- case PROP_PID: -- session->pid = g_value_get_int (value); -- break; -- -- default: -- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); -- break; -- } --} -- --static void --polkit_unix_session_class_init (PolkitUnixSessionClass *klass) --{ -- GObjectClass *gobject_class = G_OBJECT_CLASS (klass); -- -- gobject_class->finalize = polkit_unix_session_finalize; -- gobject_class->get_property = polkit_unix_session_get_property; -- gobject_class->set_property = polkit_unix_session_set_property; -- -- /** -- * PolkitUnixSession:session-id: -- * -- * The UNIX session id. -- */ -- g_object_class_install_property (gobject_class, -- PROP_SESSION_ID, -- g_param_spec_string ("session-id", -- "Session ID", -- "The UNIX session ID", -- NULL, -- G_PARAM_CONSTRUCT | -- G_PARAM_READWRITE | -- G_PARAM_STATIC_NAME | -- G_PARAM_STATIC_BLURB | -- G_PARAM_STATIC_NICK)); -- -- -- /** -- * PolkitUnixSession:pid: -- * -- * The UNIX process id to look up the session. -- */ -- g_object_class_install_property (gobject_class, -- PROP_PID, -- g_param_spec_int ("pid", -- "Process ID", -- "Process ID to use for looking up the session", -- 0, -- G_MAXINT, -- 0, -- G_PARAM_CONSTRUCT_ONLY | -- G_PARAM_WRITABLE | -- G_PARAM_STATIC_NAME | -- G_PARAM_STATIC_BLURB | -- G_PARAM_STATIC_NICK)); -- --} -- --/** -- * polkit_unix_session_get_session_id: -- * @session: A #PolkitUnixSession. -- * -- * Gets the session id for @session. -- * -- * Returns: The session id for @session. Do not free this string, it -- * is owned by @session. -- **/ --const gchar * --polkit_unix_session_get_session_id (PolkitUnixSession *session) --{ -- g_return_val_if_fail (POLKIT_IS_UNIX_SESSION (session), NULL); -- return session->session_id; --} -- --/** -- * polkit_unix_session_set_session_id: -- * @session: A #PolkitUnixSession. -- * @session_id: The session id. -- * -- * Sets the session id for @session to @session_id. -- **/ --void --polkit_unix_session_set_session_id (PolkitUnixSession *session, -- const gchar *session_id) --{ -- g_return_if_fail (POLKIT_IS_UNIX_SESSION (session)); -- /*g_return_if_fail (session_id != NULL);*/ -- g_free (session->session_id); -- session->session_id = g_strdup (session_id); --} -- --/** -- * polkit_unix_session_new: -- * @session_id: The session id. -- * -- * Creates a new #PolkitUnixSession for @session_id. -- * -- * Returns: (transfer full): A #PolkitUnixSession. Free with g_object_unref(). -- **/ --PolkitSubject * --polkit_unix_session_new (const gchar *session_id) --{ -- return POLKIT_SUBJECT (g_object_new (POLKIT_TYPE_UNIX_SESSION, -- "session-id", session_id, -- NULL)); --} -- --/** -- * polkit_unix_session_new_for_process: -- * @pid: The process id of the process to get the session for. -- * @cancellable: (allow-none): A #GCancellable or %NULL. -- * @callback: A #GAsyncReadyCallback to call when the request is satisfied -- * @user_data: The data to pass to @callback. -- * -- * Asynchronously creates a new #PolkitUnixSession object for the -- * process with process id @pid. -- * -- * When the operation is finished, @callback will be invoked in the -- * <link linkend="g-main-context-push-thread-default">thread-default -- * main loop</link> of the thread you are calling this method -- * from. You can then call -- * polkit_unix_session_new_for_process_finish() to get the result of -- * the operation. -- * -- * This method constructs the object asynchronously, for the synchronous and blocking version -- * use polkit_unix_session_new_for_process_sync(). -- **/ --void --polkit_unix_session_new_for_process (gint pid, -- GCancellable *cancellable, -- GAsyncReadyCallback callback, -- gpointer user_data) --{ -- g_async_initable_new_async (POLKIT_TYPE_UNIX_SESSION, -- G_PRIORITY_DEFAULT, -- cancellable, -- callback, -- user_data, -- "pid", pid, -- NULL); --} -- --/** -- * polkit_unix_session_new_for_process_finish: -- * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to polkit_unix_session_new_for_process(). -- * @error: (allow-none): Return location for error. -- * -- * Finishes constructing a #PolkitSubject for a process id. -- * -- * Returns: (transfer full) (allow-none): A #PolkitUnixSession for the @pid passed to -- * polkit_unix_session_new_for_process() or %NULL if @error is -- * set. Free with g_object_unref(). -- **/ --PolkitSubject * --polkit_unix_session_new_for_process_finish (GAsyncResult *res, -- GError **error) --{ -- GObject *object; -- GObject *source_object; -- -- source_object = g_async_result_get_source_object (res); -- g_assert (source_object != NULL); -- -- object = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), -- res, -- error); -- g_object_unref (source_object); -- -- if (object != NULL) -- return POLKIT_SUBJECT (object); -- else -- return NULL; --} -- -- --/** -- * polkit_unix_session_new_for_process_sync: -- * @pid: The process id of the process to get the session for. -- * @cancellable: (allow-none): A #GCancellable or %NULL. -- * @error: (allow-none): Return location for error. -- * -- * Creates a new #PolkitUnixSession for the process with process id @pid. -- * -- * This is a synchronous call - the calling thread is blocked until a -- * reply is received. For the asynchronous version, see -- * polkit_unix_session_new_for_process(). -- * -- * Returns: (allow-none) (transfer full): A #PolkitUnixSession for -- * @pid or %NULL if @error is set. Free with g_object_unref(). -- **/ --PolkitSubject * --polkit_unix_session_new_for_process_sync (gint pid, -- GCancellable *cancellable, -- GError **error) --{ -- return POLKIT_SUBJECT (g_initable_new (POLKIT_TYPE_UNIX_SESSION, -- cancellable, -- error, -- "pid", pid, -- NULL)); --} -- --static guint --polkit_unix_session_hash (PolkitSubject *subject) --{ -- PolkitUnixSession *session = POLKIT_UNIX_SESSION (subject); -- -- return g_str_hash (session->session_id); --} -- --static gboolean --polkit_unix_session_equal (PolkitSubject *a, -- PolkitSubject *b) --{ -- PolkitUnixSession *session_a; -- PolkitUnixSession *session_b; -- -- session_a = POLKIT_UNIX_SESSION (a); -- session_b = POLKIT_UNIX_SESSION (b); -- -- return g_strcmp0 (session_a->session_id, session_b->session_id) == 0; --} -- --static gchar * --polkit_unix_session_to_string (PolkitSubject *subject) --{ -- PolkitUnixSession *session = POLKIT_UNIX_SESSION (subject); -- -- return g_strdup_printf ("unix-session:%s", session->session_id); --} -- --static gboolean --polkit_unix_session_exists_sync (PolkitSubject *subject, -- GCancellable *cancellable, -- GError **error) --{ -- PolkitUnixSession *session = POLKIT_UNIX_SESSION (subject); -- gboolean ret; -- uid_t uid; -- -- ret = FALSE; -- -- if (!sd_session_get_uid (session->session_id, &uid)) -- ret = FALSE; -- -- return ret; --} -- --static void --exists_in_thread_func (GSimpleAsyncResult *res, -- GObject *object, -- GCancellable *cancellable) --{ -- GError *error; -- error = NULL; -- if (!polkit_unix_session_exists_sync (POLKIT_SUBJECT (object), -- cancellable, -- &error)) -- { -- g_simple_async_result_set_from_error (res, error); -- g_error_free (error); -- } --} -- --static void --polkit_unix_session_exists (PolkitSubject *subject, -- GCancellable *cancellable, -- GAsyncReadyCallback callback, -- gpointer user_data) --{ -- GSimpleAsyncResult *simple; -- -- g_return_if_fail (POLKIT_IS_UNIX_SESSION (subject)); -- -- simple = g_simple_async_result_new (G_OBJECT (subject), -- callback, -- user_data, -- polkit_unix_session_exists); -- g_simple_async_result_run_in_thread (simple, -- exists_in_thread_func, -- G_PRIORITY_DEFAULT, -- cancellable); -- g_object_unref (simple); --} -- --static gboolean --polkit_unix_session_exists_finish (PolkitSubject *subject, -- GAsyncResult *res, -- GError **error) --{ -- GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); -- gboolean ret; -- -- g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == polkit_unix_session_exists); -- -- ret = FALSE; -- -- if (g_simple_async_result_propagate_error (simple, error)) -- goto out; -- -- ret = g_simple_async_result_get_op_res_gboolean (simple); -- -- out: -- return ret; --} -- --static void --subject_iface_init (PolkitSubjectIface *subject_iface) --{ -- subject_iface->hash = polkit_unix_session_hash; -- subject_iface->equal = polkit_unix_session_equal; -- subject_iface->to_string = polkit_unix_session_to_string; -- subject_iface->exists = polkit_unix_session_exists; -- subject_iface->exists_finish = polkit_unix_session_exists_finish; -- subject_iface->exists_sync = polkit_unix_session_exists_sync; --} -- --static gboolean --polkit_unix_session_initable_init (GInitable *initable, -- GCancellable *cancellable, -- GError **error) --{ -- PolkitUnixSession *session = POLKIT_UNIX_SESSION (initable); -- gboolean ret; -- -- ret = FALSE; -- -- if (session->session_id != NULL) -- { -- /* already set, nothing to do */ -- ret = TRUE; -- goto out; -- } -- -- if (!sd_pid_get_session (session->pid, &session->session_id)) -- ret = TRUE; -- --out: -- return ret; --} -- --static void --initable_iface_init (GInitableIface *initable_iface) --{ -- initable_iface->init = polkit_unix_session_initable_init; --} -- --static void --async_initable_iface_init (GAsyncInitableIface *async_initable_iface) --{ -- /* use default implementation to run GInitable code in a thread */ --} -diff -u -rN polkit-0.104/src/polkitbackend/Makefile.am polkit-0.104-systemd-fallback/src/polkitbackend/Makefile.am ---- polkit-0.104/src/polkitbackend/Makefile.am 2012-01-03 16:03:47.000000000 +0100 -+++ polkit-0.104-systemd-fallback/src/polkitbackend/Makefile.am 2012-03-06 15:44:15.380014886 +0100 -@@ -41,15 +41,8 @@ - polkitbackendconfigsource.h polkitbackendconfigsource.c \ - polkitbackendactionlookup.h polkitbackendactionlookup.c \ - polkitbackendlocalauthorizationstore.h polkitbackendlocalauthorizationstore.c \ -- $(NULL) -- --if HAVE_SYSTEMD --libpolkit_backend_1_la_SOURCES += \ -- polkitbackendsessionmonitor.h polkitbackendsessionmonitor-systemd.c --else --libpolkit_backend_1_la_SOURCES += \ - polkitbackendsessionmonitor.h polkitbackendsessionmonitor.c --endif -+ $(NULL) - - libpolkit_backend_1_la_CFLAGS = \ - -D_POLKIT_COMPILATION \ -diff -u -rN polkit-0.104/src/polkitbackend/polkitbackendsessionmonitor.c polkit-0.104-systemd-fallback/src/polkitbackend/polkitbackendsessionmonitor.c ---- polkit-0.104/src/polkitbackend/polkitbackendsessionmonitor.c 2011-10-18 19:02:27.000000000 +0200 -+++ polkit-0.104-systemd-fallback/src/polkitbackend/polkitbackendsessionmonitor.c 2012-03-06 15:43:49.353562242 +0100 -@@ -26,6 +26,12 @@ - #include <string.h> - #include <glib/gstdio.h> - -+#ifdef HAVE_SYSTEMD -+# include <systemd/sd-daemon.h> -+# include <systemd/sd-login.h> -+# include <stdlib.h> -+#endif -+ - #include <polkit/polkit.h> - #include "polkitbackendsessionmonitor.h" - -@@ -39,6 +45,88 @@ - * The #PolkitBackendSessionMonitor class is a utility class to track and monitor sessions. - */ - -+#ifdef HAVE_SYSTEMD -+typedef struct -+{ -+ GSource source; -+ GPollFD pollfd; -+ sd_login_monitor *monitor; -+} SdSource; -+ -+static gboolean -+sd_source_prepare (GSource *source, -+ gint *timeout) -+{ -+ *timeout = -1; -+ return FALSE; -+} -+ -+static gboolean -+sd_source_check (GSource *source) -+{ -+ SdSource *sd_source = (SdSource *)source; -+ -+ return sd_source->pollfd.revents != 0; -+} -+ -+static gboolean -+sd_source_dispatch (GSource *source, -+ GSourceFunc callback, -+ gpointer user_data) -+ -+{ -+ SdSource *sd_source = (SdSource *)source; -+ gboolean ret; -+ -+ g_warn_if_fail (callback != NULL); -+ -+ ret = (*callback) (user_data); -+ -+ sd_login_monitor_flush (sd_source->monitor); -+ -+ return ret; -+} -+ -+static void -+sd_source_finalize (GSource *source) -+{ -+ SdSource *sd_source = (SdSource*)source; -+ -+ sd_login_monitor_unref (sd_source->monitor); -+} -+ -+static GSourceFuncs sd_source_funcs = { -+ sd_source_prepare, -+ sd_source_check, -+ sd_source_dispatch, -+ sd_source_finalize -+}; -+ -+static GSource * -+sd_source_new (void) -+{ -+ GSource *source; -+ SdSource *sd_source; -+ int ret; -+ -+ source = g_source_new (&sd_source_funcs, sizeof (SdSource)); -+ sd_source = (SdSource *)source; -+ -+ if ((ret = sd_login_monitor_new (NULL, &sd_source->monitor)) < 0) -+ { -+ g_printerr ("Error getting login monitor: %d", ret); -+ } -+ else -+ { -+ sd_source->pollfd.fd = sd_login_monitor_get_fd (sd_source->monitor); -+ sd_source->pollfd.events = G_IO_IN; -+ g_source_add_poll (source, &sd_source->pollfd); -+ } -+ -+ return source; -+} -+#endif /* HAVE_SYSTEMD */ -+ - struct _PolkitBackendSessionMonitor - { - GObject parent_instance; -@@ -48,6 +136,10 @@ - GKeyFile *database; - GFileMonitor *database_monitor; - time_t database_mtime; -+ -+#ifdef HAVE_SYSTEMD -+ GSource *sd_source; -+#endif - }; - - struct _PolkitBackendSessionMonitorClass -@@ -162,6 +254,18 @@ - g_signal_emit (monitor, signals[CHANGED_SIGNAL], 0); - } - -+#ifdef HAVE_SYSTEMD -+static gboolean -+sessions_changed (gpointer user_data) -+{ -+ PolkitBackendSessionMonitor *monitor = POLKIT_BACKEND_SESSION_MONITOR (user_data); -+ -+ g_signal_emit (monitor, signals[CHANGED_SIGNAL], 0); -+ -+ return TRUE; -+} -+#endif -+ - static void - polkit_backend_session_monitor_init (PolkitBackendSessionMonitor *monitor) - { -@@ -176,31 +280,47 @@ - g_error_free (error); - } - -- error = NULL; -- if (!ensure_database (monitor, &error)) -- { -- g_printerr ("Error loading " CKDB_PATH ": %s", error->message); -- g_error_free (error); -- } -+#ifdef HAVE_SYSTEMD -+ monitor->sd_source = NULL; -+ -+ if (sd_booted () > 0) -+ { -+ monitor->sd_source = sd_source_new (); -+ g_source_set_callback (monitor->sd_source, sessions_changed, monitor, NULL); -+ g_source_attach (monitor->sd_source, NULL); - -- 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); -+ monitor->database = NULL; -+ monitor->database_monitor = NULL; - } - else -+#endif - { -- g_signal_connect (monitor->database_monitor, -- "changed", -- G_CALLBACK (on_file_monitor_changed), -- monitor); -+ 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); -+ } - } - } - -@@ -212,6 +332,14 @@ - if (monitor->system_bus != NULL) - g_object_unref (monitor->system_bus); - -+#ifdef HAVE_SYSTEMD -+ if (monitor->sd_source != NULL) -+ { -+ g_source_destroy (monitor->sd_source); -+ g_source_unref (monitor->sd_source); -+ } -+#endif -+ - if (monitor->database_monitor != NULL) - g_object_unref (monitor->database_monitor); - -@@ -328,22 +456,38 @@ - } - else if (POLKIT_IS_UNIX_SESSION (subject)) - { -- if (!ensure_database (monitor, error)) -+#ifdef HAVE_SYSTEMD -+ if (monitor->sd_source != NULL) - { -- g_prefix_error (error, "Error getting user for session: Error ensuring CK database at " CKDB_PATH ": "); -- 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; -+ } - } -- -- 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) -+ else -+#endif - { -- g_propagate_prefixed_error (error, local_error, "Error getting uid using " CKDB_PATH ": "); -+ 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); -- goto out; - } -- g_free (group); - - ret = polkit_unix_user_new (uid); - } -@@ -373,29 +517,46 @@ - - if (POLKIT_IS_UNIX_PROCESS (subject)) - { -- 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); -+#ifdef HAVE_SYSTEMD -+ if (monitor->sd_source != NULL) -+ { -+ 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); -+ } -+ else -+#endif -+ { -+ 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; -- const gchar *session_id; -+ gchar *session_id; - GVariant *result; - - result = g_dbus_connection_call_sync (monitor->system_bus, -@@ -414,22 +575,35 @@ - g_variant_get (result, "(u)", &pid); - g_variant_unref (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)", 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); -+#ifdef HAVE_SYSTEMD -+ if (monitor->sd_source != NULL) -+ { -+ if (sd_pid_get_session (pid, &session_id) < 0) -+ goto out; -+ -+ session = polkit_unix_session_new (session_id); -+ free (session_id); -+ } -+ else -+#endif -+ { -+ 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 - { -@@ -490,7 +664,22 @@ - polkit_backend_session_monitor_is_session_local (PolkitBackendSessionMonitor *monitor, - PolkitSubject *session) - { -- return get_boolean (monitor, session, "is_local"); -+#ifdef HAVE_SYSTEMD -+ if (monitor->sd_source != NULL) -+ { -+ char *seat; -+ -+ if (!sd_session_get_seat (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (session)), &seat)) -+ { -+ free (seat); -+ return TRUE; -+ } -+ -+ return FALSE; -+ } -+ else -+#endif -+ return get_boolean (monitor, session, "is_local"); - } - - -@@ -498,6 +687,11 @@ - polkit_backend_session_monitor_is_session_active (PolkitBackendSessionMonitor *monitor, - PolkitSubject *session) - { -- return get_boolean (monitor, session, "is_active"); -+#ifdef HAVE_SYSTEMD -+ if (monitor->sd_source != NULL) -+ return sd_session_is_active (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (session))); -+ else -+#endif -+ return get_boolean (monitor, session, "is_active"); - } - -diff -u -rN polkit-0.104/src/polkitbackend/polkitbackendsessionmonitor-systemd.c polkit-0.104-systemd-fallback/src/polkitbackend/polkitbackendsessionmonitor-systemd.c ---- polkit-0.104/src/polkitbackend/polkitbackendsessionmonitor-systemd.c 2012-01-03 16:03:47.000000000 +0100 -+++ polkit-0.104-systemd-fallback/src/polkitbackend/polkitbackendsessionmonitor-systemd.c 1970-01-01 01:00:00.000000000 +0100 -@@ -1,414 +0,0 @@ --/* -- * Copyright (C) 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 -- * License as published by the Free Software Foundation; either -- * version 2 of the License, or (at your option) any later version. -- * -- * This library is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- * Lesser General Public License for more details. -- * -- * You should have received a copy of the GNU Lesser General -- * Public License along with this library; if not, write to the -- * Free Software Foundation, Inc., 59 Temple Place, Suite 330, -- * Boston, MA 02111-1307, USA. -- * -- * Author: Matthias Clasen -- */ -- --#include "config.h" --#include <errno.h> --#include <pwd.h> --#include <grp.h> --#include <string.h> --#include <glib/gstdio.h> --#include <systemd/sd-login.h> --#include <stdlib.h> -- --#include <polkit/polkit.h> --#include "polkitbackendsessionmonitor.h" -- --/* <internal> -- * SECTION:polkitbackendsessionmonitor -- * @title: PolkitBackendSessionMonitor -- * @short_description: Monitor sessions -- * -- * The #PolkitBackendSessionMonitor class is a utility class to track and monitor sessions. -- */ -- --typedef struct --{ -- GSource source; -- GPollFD pollfd; -- sd_login_monitor *monitor; --} SdSource; -- --static gboolean --sd_source_prepare (GSource *source, -- gint *timeout) --{ -- *timeout = -1; -- return FALSE; --} -- --static gboolean --sd_source_check (GSource *source) --{ -- SdSource *sd_source = (SdSource *)source; -- -- return sd_source->pollfd.revents != 0; --} -- --static gboolean --sd_source_dispatch (GSource *source, -- GSourceFunc callback, -- gpointer user_data) -- --{ -- SdSource *sd_source = (SdSource *)source; -- gboolean ret; -- -- g_warn_if_fail (callback != NULL); -- -- ret = (*callback) (user_data); -- -- sd_login_monitor_flush (sd_source->monitor); -- -- return ret; --} -- --static void --sd_source_finalize (GSource *source) --{ -- SdSource *sd_source = (SdSource*)source; -- -- sd_login_monitor_unref (sd_source->monitor); --} -- --static GSourceFuncs sd_source_funcs = { -- sd_source_prepare, -- sd_source_check, -- sd_source_dispatch, -- sd_source_finalize --}; -- --static GSource * --sd_source_new (void) --{ -- GSource *source; -- SdSource *sd_source; -- int ret; -- -- source = g_source_new (&sd_source_funcs, sizeof (SdSource)); -- sd_source = (SdSource *)source; -- -- if ((ret = sd_login_monitor_new (NULL, &sd_source->monitor)) < 0) -- { -- g_printerr ("Error getting login monitor: %d", ret); -- } -- else -- { -- sd_source->pollfd.fd = sd_login_monitor_get_fd (sd_source->monitor); -- sd_source->pollfd.events = G_IO_IN; -- g_source_add_poll (source, &sd_source->pollfd); -- } -- -- return source; --} -- --struct _PolkitBackendSessionMonitor --{ -- GObject parent_instance; -- -- GDBusConnection *system_bus; -- -- GSource *sd_source; --}; -- --struct _PolkitBackendSessionMonitorClass --{ -- GObjectClass parent_class; -- -- void (*changed) (PolkitBackendSessionMonitor *monitor); --}; -- -- --enum --{ -- CHANGED_SIGNAL, -- LAST_SIGNAL, --}; -- --static guint signals[LAST_SIGNAL] = {0}; -- --G_DEFINE_TYPE (PolkitBackendSessionMonitor, polkit_backend_session_monitor, G_TYPE_OBJECT); -- --/* ---------------------------------------------------------------------------------------------------- */ -- --static gboolean --sessions_changed (gpointer user_data) --{ -- PolkitBackendSessionMonitor *monitor = POLKIT_BACKEND_SESSION_MONITOR (user_data); -- -- g_signal_emit (monitor, signals[CHANGED_SIGNAL], 0); -- -- return TRUE; --} -- -- --static void --polkit_backend_session_monitor_init (PolkitBackendSessionMonitor *monitor) --{ -- GError *error; -- -- error = NULL; -- monitor->system_bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); -- if (monitor->system_bus == NULL) -- { -- g_printerr ("Error getting system bus: %s", error->message); -- 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); --} -- --static void --polkit_backend_session_monitor_finalize (GObject *object) --{ -- PolkitBackendSessionMonitor *monitor = POLKIT_BACKEND_SESSION_MONITOR (object); -- -- if (monitor->system_bus != NULL) -- g_object_unref (monitor->system_bus); -- -- if (monitor->sd_source != NULL) -- { -- g_source_destroy (monitor->sd_source); -- g_source_unref (monitor->sd_source); -- } -- -- if (G_OBJECT_CLASS (polkit_backend_session_monitor_parent_class)->finalize != NULL) -- G_OBJECT_CLASS (polkit_backend_session_monitor_parent_class)->finalize (object); --} -- --static void --polkit_backend_session_monitor_class_init (PolkitBackendSessionMonitorClass *klass) --{ -- GObjectClass *gobject_class; -- -- gobject_class = G_OBJECT_CLASS (klass); -- -- gobject_class->finalize = polkit_backend_session_monitor_finalize; -- -- /** -- * PolkitBackendSessionMonitor::changed: -- * @monitor: A #PolkitBackendSessionMonitor -- * -- * Emitted when something changes. -- */ -- signals[CHANGED_SIGNAL] = g_signal_new ("changed", -- POLKIT_BACKEND_TYPE_SESSION_MONITOR, -- G_SIGNAL_RUN_LAST, -- G_STRUCT_OFFSET (PolkitBackendSessionMonitorClass, changed), -- NULL, /* accumulator */ -- NULL, /* accumulator data */ -- g_cclosure_marshal_VOID__VOID, -- G_TYPE_NONE, -- 0); --} -- --PolkitBackendSessionMonitor * --polkit_backend_session_monitor_new (void) --{ -- PolkitBackendSessionMonitor *monitor; -- -- monitor = POLKIT_BACKEND_SESSION_MONITOR (g_object_new (POLKIT_BACKEND_TYPE_SESSION_MONITOR, NULL)); -- -- return monitor; --} -- --/* ---------------------------------------------------------------------------------------------------- */ -- --GList * --polkit_backend_session_monitor_get_sessions (PolkitBackendSessionMonitor *monitor) --{ -- /* TODO */ -- return NULL; --} -- --/* ---------------------------------------------------------------------------------------------------- */ -- --/** -- * polkit_backend_session_monitor_get_user: -- * @monitor: A #PolkitBackendSessionMonitor. -- * @subject: A #PolkitSubject. -- * @error: Return location for error. -- * -- * Gets the user corresponding to @subject or %NULL if no user exists. -- * -- * Returns: %NULL if @error is set otherwise a #PolkitUnixUser that should be freed with g_object_unref(). -- */ --PolkitIdentity * --polkit_backend_session_monitor_get_user_for_subject (PolkitBackendSessionMonitor *monitor, -- PolkitSubject *subject, -- GError **error) --{ -- PolkitIdentity *ret; -- guint32 uid; -- -- ret = NULL; -- -- if (POLKIT_IS_UNIX_PROCESS (subject)) -- { -- uid = polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)); -- if ((gint) uid == -1) -- { -- g_set_error (error, -- POLKIT_ERROR, -- POLKIT_ERROR_FAILED, -- "Unix process subject does not have uid set"); -- goto out; -- } -- ret = polkit_unix_user_new (uid); -- } -- else if (POLKIT_IS_SYSTEM_BUS_NAME (subject)) -- { -- GVariant *result; -- -- result = g_dbus_connection_call_sync (monitor->system_bus, -- "org.freedesktop.DBus", -- "/org/freedesktop/DBus", -- "org.freedesktop.DBus", -- "GetConnectionUnixUser", -- 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)", &uid); -- g_variant_unref (result); -- -- ret = polkit_unix_user_new (uid); -- } -- else if (POLKIT_IS_UNIX_SESSION (subject)) -- { -- -- 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); -- } -- -- out: -- return ret; --} -- --/** -- * polkit_backend_session_monitor_get_session_for_subject: -- * @monitor: A #PolkitBackendSessionMonitor. -- * @subject: A #PolkitSubject. -- * @error: Return location for error. -- * -- * Gets the session corresponding to @subject or %NULL if no session exists. -- * -- * Returns: %NULL if @error is set otherwise a #PolkitUnixSession that should be freed with g_object_unref(). -- */ --PolkitSubject * --polkit_backend_session_monitor_get_session_for_subject (PolkitBackendSessionMonitor *monitor, -- PolkitSubject *subject, -- GError **error) --{ -- PolkitSubject *session; -- -- session = NULL; -- -- 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); -- } -- 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); -- } -- else -- { -- g_set_error (error, -- POLKIT_ERROR, -- POLKIT_ERROR_NOT_SUPPORTED, -- "Cannot get user for subject of type %s", -- g_type_name (G_TYPE_FROM_INSTANCE (subject))); -- } -- -- out: -- -- return session; --} -- --gboolean --polkit_backend_session_monitor_is_session_local (PolkitBackendSessionMonitor *monitor, -- PolkitSubject *session) --{ -- char *seat; -- -- if (!sd_session_get_seat (polkit_unix_session_get_session_id (POLKIT_UNIX_SESSION (session)), &seat)) -- { -- free (seat); -- return TRUE; -- } -- -- return FALSE; --} -- -- --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))); --} -- |