summaryrefslogtreecommitdiff
path: root/testing/polkit/logind+ConsoleKit.patch
diff options
context:
space:
mode:
Diffstat (limited to 'testing/polkit/logind+ConsoleKit.patch')
-rw-r--r--testing/polkit/logind+ConsoleKit.patch638
1 files changed, 638 insertions, 0 deletions
diff --git a/testing/polkit/logind+ConsoleKit.patch b/testing/polkit/logind+ConsoleKit.patch
new file mode 100644
index 000000000..042d1043a
--- /dev/null
+++ b/testing/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
+