diff options
author | Eric Koegel <eric.koegel@gmail.com> | 2015-03-09 08:25:42 +0300 |
---|---|---|
committer | Eric Koegel <eric.koegel@gmail.com> | 2015-04-13 11:39:37 +0300 |
commit | f6a7ccad79f5fa55ed89b7ebdfe49b1888a9aa68 (patch) | |
tree | c5978e9827d262f2db2dab0ff5e5fce6563ee67b | |
parent | 759882633b07ac8f5191cf70361bb0a6f03f6678 (diff) | |
download | ConsoleKit2-f6a7ccad79f5fa55ed89b7ebdfe49b1888a9aa68.tar.gz |
CKSession: Port to GDBus
Port CKSession to GDBus using gdbus-codegen. The generated
ConsoleKitSession object properties are used where possible.
A test-session binary is generated to test some of the
CkSession properties/DBUS calls. CKSession expects to be
passed a GDBusConnection in ck_session_new but this doesn't
happen because CKManager hasn't been ported yet.
https://github.com/ConsoleKit2/ConsoleKit2/issues/8
-rw-r--r-- | .gitignore | 9 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/Makefile.am | 39 | ||||
-rw-r--r-- | src/ck-manager.c | 42 | ||||
-rw-r--r-- | src/ck-seat.c | 75 | ||||
-rw-r--r-- | src/ck-session.c | 849 | ||||
-rw-r--r-- | src/ck-session.h | 87 | ||||
-rw-r--r-- | src/test-session.c | 354 |
8 files changed, 728 insertions, 729 deletions
@@ -53,3 +53,12 @@ autotools/* cov-int/* data/consolekit.logrotate data/90-consolekit +src/ck-manager-generated.c +src/ck-manager-generated.h +src/ck-seat-generated.c +src/ck-seat-generated.h +src/ck-session-generated.c +src/ck-session-generated.h +src/test-session +tools/pam-foreground-compat.ck +tools/70-udev-acl.rules diff --git a/configure.ac b/configure.ac index 53ed5f4..c2bb93a 100644 --- a/configure.ac +++ b/configure.ac @@ -30,7 +30,6 @@ AM_PROG_CC_C_O AC_HEADER_STDC AC_DISABLE_STATIC LT_INIT -AC_CHECK_HEADER_STDBOOL AC_HEADER_STDC AC_FUNC_FORK AC_FUNC_MALLOC @@ -80,6 +79,7 @@ PKG_CHECK_MODULES(CONSOLE_KIT, dbus-glib-1 >= $DBUS_REQUIRED_VERSION gobject-2.0 >= $GLIB_REQUIRED_VERSION gthread-2.0 >= $GLIB_REQUIRED_VERSION + gio-unix-2.0 >= $GLIB_REQUIRED_VERSION ) PKG_CHECK_MODULES([XLIB], [x11]) diff --git a/src/Makefile.am b/src/Makefile.am index e4c5eb1..87b6df4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -87,7 +87,8 @@ sbin_PROGRAMS = \ BUILT_SOURCES = \ ck-manager-glue.h \ ck-seat-glue.h \ - ck-session-glue.h \ + ck-session-generated.h \ + ck-session-generated.c \ ck-marshal.c \ ck-marshal.h \ $(NULL) @@ -103,8 +104,13 @@ ck-manager-glue.h: org.freedesktop.ConsoleKit.Manager.xml Makefile.am dbus-binding-tool --prefix=ck_manager --mode=glib-server --output=ck-manager-glue.h org.freedesktop.ConsoleKit.Manager.xml ck-seat-glue.h: org.freedesktop.ConsoleKit.Seat.xml Makefile.am dbus-binding-tool --prefix=ck_seat --mode=glib-server --output=ck-seat-glue.h org.freedesktop.ConsoleKit.Seat.xml -ck-session-glue.h: org.freedesktop.ConsoleKit.Session.xml Makefile.am - dbus-binding-tool --prefix=ck_session --mode=glib-server --output=ck-session-glue.h org.freedesktop.ConsoleKit.Session.xml + +ck-session-generated.c ck-session-generated.h : org.freedesktop.ConsoleKit.Session.xml Makefile.am + gdbus-codegen \ + --c-namespace=ConsoleKit \ + --interface-prefix=org.freedesktop.ConsoleKit. \ + --generate-c-code=ck-session-generated \ + $(srcdir)/org.freedesktop.ConsoleKit.Session.xml ck-marshal.c: ck-marshal.list echo "#include \"ck-marshal.h\"" > $@ && \ @@ -169,6 +175,7 @@ noinst_PROGRAMS = \ test-tty-idle-monitor \ test-vt-monitor \ test-inhibit \ + test-session \ $(NULL) test_event_logger_SOURCES = \ @@ -232,6 +239,31 @@ test_inhibit_LDADD = \ libck.la \ $(NULL) +test_session_CFLAGS = \ + $(AM_CFLAGS) \ + -URUNDIR \ + -DRUNDIR=\"/tmp\" \ + $(NULL) + +test_session_SOURCES = \ + $(BUILT_SOURCES) \ + ck-run-programs.c \ + ck-run-programs.h \ + ck-file-monitor.h \ + ck-file-monitor-dummy.c \ + ck-tty-idle-monitor.h \ + ck-tty-idle-monitor.c \ + ck-session.c \ + ck-session.h \ + test-session.c \ + $(NULL) + +test_session_LDADD = \ + $(CONSOLE_KIT_LIBS) \ + $(POLKIT_LIBS) \ + libck.la \ + $(NULL) + EXTRA_DIST = \ ck-marshal.list \ @@ -239,6 +271,7 @@ EXTRA_DIST = \ valgrind.sh \ test-open-session \ test-open-session-with-parameters \ + test-session \ $(NULL) CLEANFILES = $(BUILT_SOURCES) diff --git a/src/ck-manager.c b/src/ck-manager.c index 4d3cd6c..049f06f 100644 --- a/src/ck-manager.c +++ b/src/ck-manager.c @@ -51,6 +51,7 @@ #include "ck-seat.h" #include "ck-session-leader.h" #include "ck-session.h" +#include "ck-session-generated.h" #include "ck-marshal.h" #include "ck-event-logger.h" #include "ck-inhibit-manager.h" @@ -2125,12 +2126,13 @@ find_seat_for_session (CkManager *manager, CkSession *session) { CkSeat *seat; + ConsoleKitSession *cksession; gboolean is_static_x11; gboolean is_static_text; - char *display_device; - char *x11_display_device; - char *x11_display; - char *remote_host_name; + const char *display_device; + const char *x11_display_device; + const char *x11_display; + const char *remote_host_name; gboolean is_local; is_static_text = FALSE; @@ -2142,13 +2144,14 @@ find_seat_for_session (CkManager *manager, x11_display = NULL; remote_host_name = NULL; is_local = FALSE; + cksession = CONSOLE_KIT_SESSION (session); /* FIXME: use matching to group entries? */ - ck_session_get_display_device (session, &display_device, NULL); - ck_session_get_x11_display_device (session, &x11_display_device, NULL); - ck_session_get_x11_display (session, &x11_display, NULL); - ck_session_get_remote_host_name (session, &remote_host_name, NULL); + display_device = console_kit_session_get_display_device (cksession); + x11_display_device = console_kit_session_get_x11_display_device (cksession); + x11_display = console_kit_session_get_x11_display (cksession); + remote_host_name = console_kit_session_get_remote_host_name (cksession); ck_session_is_local (session, &is_local, NULL); if (IS_STR_SET (x11_display) @@ -2171,11 +2174,6 @@ find_seat_for_session (CkManager *manager, g_free (sid); } - g_free (display_device); - g_free (x11_display_device); - g_free (x11_display); - g_free (remote_host_name); - return seat; } @@ -2207,14 +2205,8 @@ is_session_busy (char *id, CkSession *session, gpointer data) { - gboolean idle_hint; - - idle_hint = FALSE; - - ck_session_get_idle_hint (session, &idle_hint, NULL); - /* return TRUE to stop search */ - return !idle_hint; + return !console_kit_session_get_idle_hint (CONSOLE_KIT_SESSION (session)); } static void @@ -2323,7 +2315,8 @@ open_session_for_leader (CkManager *manager, session = ck_session_new_with_parameters (ssid, cookie, - parameters); + parameters, + NULL); if (session == NULL) { GError *error; @@ -3246,12 +3239,9 @@ get_sessions_for_unix_user_iter (char *id, CkSession *session, GetSessionsData *data) { - guint uid; - gboolean res; - - res = ck_session_get_unix_user (session, &uid, NULL); + guint uid = console_kit_session_get_unix_user (CONSOLE_KIT_SESSION (session)); - if (res && uid == data->uid) { + if (uid == data->uid) { g_ptr_array_add (data->sessions, g_strdup (id)); } } diff --git a/src/ck-seat.c b/src/ck-seat.c index 6e6800f..229c743 100644 --- a/src/ck-seat.c +++ b/src/ck-seat.c @@ -195,7 +195,7 @@ _seat_activate_session (CkSeat *seat, gboolean res; gboolean ret; guint num; - char *device; + const char *device; ActivateData *adata; GError *vt_error; @@ -225,9 +225,9 @@ _seat_activate_session (CkSeat *seat, } device = NULL; - ck_session_get_x11_display_device (session, &device, NULL); + device = console_kit_session_get_x11_display_device (CONSOLE_KIT_SESSION (session)); if (device == NULL) { - ck_session_get_display_device (session, &device, NULL); + device = console_kit_session_get_display_device (CONSOLE_KIT_SESSION (session)); } res = ck_get_console_num_from_device (device, &num); if (! res) { @@ -265,7 +265,6 @@ _seat_activate_session (CkSeat *seat, } out: - g_free (device); return ret; } @@ -307,8 +306,8 @@ match_session_display_device (const char *key, CkSession *session, const char *display_device) { - char *device; - gboolean ret; + const char *device; + gboolean ret; device = NULL; ret = FALSE; @@ -317,7 +316,7 @@ match_session_display_device (const char *key, goto out; } - ck_session_get_display_device (session, &device, NULL); + device = console_kit_session_get_display_device (CONSOLE_KIT_SESSION (session)); if (device != NULL && display_device != NULL @@ -327,8 +326,6 @@ match_session_display_device (const char *key, } out: - g_free (device); - return ret; } @@ -337,8 +334,8 @@ match_session_x11_display_device (const char *key, CkSession *session, const char *x11_display_device) { - char *device; - gboolean ret; + const char *device; + gboolean ret; device = NULL; ret = FALSE; @@ -347,7 +344,7 @@ match_session_x11_display_device (const char *key, goto out; } - ck_session_get_x11_display_device (session, &device, NULL); + device = console_kit_session_get_x11_display_device (CONSOLE_KIT_SESSION (session)); if (device != NULL && x11_display_device != NULL @@ -357,8 +354,6 @@ match_session_x11_display_device (const char *key, } out: - g_free (device); - return ret; } @@ -492,7 +487,7 @@ change_active_session (CkSeat *seat, old_session = seat->priv->active_session; if (old_session != NULL) { - ck_session_set_active (old_session, FALSE, NULL); + console_kit_session_set_active (CONSOLE_KIT_SESSION (old_session), FALSE); } seat->priv->active_session = session; @@ -501,7 +496,7 @@ change_active_session (CkSeat *seat, if (session != NULL) { g_object_ref (session); ck_session_get_id (session, &ssid, NULL); - ck_session_set_active (session, TRUE, NULL); + console_kit_session_set_active (CONSOLE_KIT_SESSION (session), TRUE); } g_debug ("Active session changed: %s", ssid ? ssid : "(null)"); @@ -1192,53 +1187,51 @@ env_add_session_info (CkSession *session, char **extra_env, int *n) { - char *s; - gboolean b; - guint u; + ConsoleKitSession *cksession; + const char *s; + char *c; + gboolean b; + guint u; if (session == NULL) { return; } - s = NULL; - if (ck_session_get_id (session, &s, NULL) && s != NULL && *s != '\0') { - extra_env[(*n)++] = g_strdup_printf ("%sID=%s", prefix, s); + cksession = CONSOLE_KIT_SESSION (session); + + c = NULL; + if (ck_session_get_id (session, &c, NULL) && c != NULL && *c != '\0') { + extra_env[(*n)++] = g_strdup_printf ("%sID=%s", prefix, c); } - g_free (s); + g_free (c); - s = NULL; - if (ck_session_get_session_type (session, &s, NULL) && s != NULL && *s != '\0') { + s = console_kit_session_get_session_type (cksession); + if (s != NULL && *s != '\0') { extra_env[(*n)++] = g_strdup_printf ("%sTYPE=%s", prefix, s); } - g_free (s); - if (ck_session_get_unix_user (session, &u, NULL)) { - extra_env[(*n)++] = g_strdup_printf ("%sUSER_UID=%u", prefix, u); - } + u = console_kit_session_get_unix_user (cksession); + extra_env[(*n)++] = g_strdup_printf ("%sUSER_UID=%u", prefix, u); - s = NULL; - if (ck_session_get_display_device (session, &s, NULL) && s != NULL && *s != '\0') { + s = console_kit_session_get_display_device (cksession); + if (s != NULL && *s != '\0') { extra_env[(*n)++] = g_strdup_printf ("%sDISPLAY_DEVICE=%s", prefix, s); } - g_free (s); - s = NULL; - if (ck_session_get_x11_display_device (session, &s, NULL) && s != NULL && *s != '\0') { + s = console_kit_session_get_x11_display_device (cksession); + if (s != NULL && *s != '\0') { extra_env[(*n)++] = g_strdup_printf ("%sX11_DISPLAY_DEVICE=%s", prefix, s); } - g_free (s); - s = NULL; - if (ck_session_get_x11_display (session, &s, NULL) && s != NULL && *s != '\0') { + s = console_kit_session_get_x11_display (cksession); + if (s != NULL && *s != '\0') { extra_env[(*n)++] = g_strdup_printf ("%sX11_DISPLAY=%s", prefix, s); } - g_free (s); - s = NULL; - if (ck_session_get_remote_host_name (session, &s, NULL) && s != NULL && *s != '\0') { + s = console_kit_session_get_remote_host_name (cksession); + if (s != NULL && *s != '\0') { extra_env[(*n)++] = g_strdup_printf ("%sREMOTE_HOST_NAME=%s", prefix, s); } - g_free (s); if (ck_session_is_local (session, &b, NULL)) { extra_env[(*n)++] = g_strdup_printf ("%sIS_LOCAL=%s", prefix, b ? "true" : "false"); diff --git a/src/ck-session.c b/src/ck-session.c index f84a73b..cf98d50 100644 --- a/src/ck-session.c +++ b/src/ck-session.c @@ -31,20 +31,16 @@ #include <glib.h> #include <glib/gi18n.h> #include <glib/gstdio.h> -#include <glib-object.h> -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> +#include <gio/gio.h> #include "ck-tty-idle-monitor.h" #include "ck-session.h" -#include "ck-session-glue.h" #include "ck-marshal.h" #include "ck-run-programs.h" #define CK_SESSION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CK_TYPE_SESSION, CkSessionPrivate)) -#define CK_DBUS_PATH "/org/freedesktop/ConsoleKit" -#define CK_DBUS_NAME "org.freedesktop.ConsoleKit" +#define CK_SESSION_DBUS_NAME "org.freedesktop.ConsoleKit.Session" #define NONULL_STRING(x) ((x) != NULL ? (x) : "") @@ -56,127 +52,150 @@ struct CkSessionPrivate char *cookie; char *seat_id; - char *session_type; char *login_session_id; - char *display_device; - char *x11_display_device; - char *x11_display; - char *remote_host_name; guint uid; - gboolean active; - gboolean is_local; - GTimeVal creation_time; CkTtyIdleMonitor *idle_monitor; - gboolean idle_hint; GTimeVal idle_since_hint; - DBusGConnection *connection; - DBusGProxy *bus_proxy; -}; - -enum { - ACTIVATE, - LOCK, - UNLOCK, - ACTIVE_CHANGED, - IDLE_HINT_CHANGED, - LAST_SIGNAL + GDBusConnection *connection; + GDBusProxy *bus_proxy; }; +/* Private properties not exported over D-BUS */ enum { PROP_0, PROP_ID, PROP_COOKIE, - PROP_USER, - PROP_UNIX_USER, - PROP_X11_DISPLAY, - PROP_X11_DISPLAY_DEVICE, - PROP_DISPLAY_DEVICE, - PROP_SESSION_TYPE, - PROP_REMOTE_HOST_NAME, PROP_LOGIN_SESSION_ID, - PROP_IS_LOCAL, - PROP_ACTIVE, - PROP_IDLE_HINT, }; -static guint signals [LAST_SIGNAL] = { 0, }; -static void ck_session_class_init (CkSessionClass *klass); -static void ck_session_init (CkSession *session); -static void ck_session_finalize (GObject *object); +static void ck_session_class_init (CkSessionClass *klass); +static void ck_session_init (CkSession *session); +static void ck_session_iface_init (ConsoleKitSessionIface *iface); +static void ck_session_finalize (GObject *object); + -G_DEFINE_TYPE (CkSession, ck_session, G_TYPE_OBJECT) +G_DEFINE_TYPE_WITH_CODE (CkSession, ck_session, CONSOLE_KIT_TYPE_SESSION_SKELETON, G_IMPLEMENT_INTERFACE (CONSOLE_KIT_TYPE_SESSION, ck_session_iface_init)); + +static const GDBusErrorEntry ck_session_error_entries[] = +{ + { CK_SESSION_ERROR_FAILED, CK_SESSION_DBUS_NAME ".Error.Failed" }, + { CK_SESSION_ERROR_GENERAL, CK_SESSION_DBUS_NAME ".Error.General" }, + { CK_SESSION_ERROR_INSUFFICIENT_PERMISSION, CK_SESSION_DBUS_NAME ".Error.InsufficientPermission" }, + { CK_SESSION_ERROR_NOT_SUPPORTED, CK_SESSION_DBUS_NAME ".Error.NotSupported" } +}; GQuark ck_session_error_quark (void) { - static GQuark ret = 0; - if (ret == 0) { - ret = g_quark_from_static_string ("ck_session_error"); - } + static volatile gsize quark_volatile = 0; - return ret; + g_dbus_error_register_error_domain ("ck_session_error", + &quark_volatile, + ck_session_error_entries, + G_N_ELEMENTS (ck_session_error_entries)); + + return (GQuark) quark_volatile; } +#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC } -static gboolean -register_session (CkSession *session) +GType +ck_session_error_get_type (void) { - GError *error = NULL; + static GType etype = 0; - error = NULL; - session->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); - if (session->priv->connection == NULL) { - if (error != NULL) { - g_critical ("error getting system bus: %s", error->message); - g_error_free (error); - } - return FALSE; - } + if (etype == 0) + { + static const GEnumValue values[] = + { + ENUM_ENTRY (CK_SESSION_ERROR_FAILED, "Failed"), + ENUM_ENTRY (CK_SESSION_ERROR_GENERAL, "General"), + ENUM_ENTRY (CK_SESSION_ERROR_INSUFFICIENT_PERMISSION, "InsufficientPermission"), + ENUM_ENTRY (CK_SESSION_ERROR_NOT_SUPPORTED, "NotSupported"), + { 0, 0, 0 } + }; + g_assert (NUM_ERRORS == G_N_ELEMENTS (values) - 1); + etype = g_enum_register_static ("Error", values); + } + return etype; +} - session->priv->bus_proxy = dbus_g_proxy_new_for_name (session->priv->connection, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS); +static void +throw_error (GDBusMethodInvocation *context, + gint error_code, + const gchar *format, + ...) +{ + va_list args; + gchar *message; - dbus_g_connection_register_g_object (session->priv->connection, session->priv->id, G_OBJECT (session)); + va_start (args, format); + message = g_strdup_vprintf (format, args); + va_end (args); - return TRUE; + g_dbus_method_invocation_return_error (context, CK_SESSION_ERROR, error_code, "%s", message); + + g_free (message); } -/* - lock and unlock are separate functions because: - 1. we don't maintain state for locked - 2. so security policy can be handled separately -*/ -gboolean -ck_session_lock (CkSession *session, - DBusGMethodInvocation *context) +static gboolean +register_session (CkSession *session, GDBusConnection *connection) { - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); + GError *error = NULL; - g_debug ("Emitting lock for session %s", session->priv->id); - g_signal_emit (session, signals [LOCK], 0); + g_debug ("register session"); - dbus_g_method_return (context); + error = NULL; - return TRUE; -} + if (connection == NULL) { + session->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); + } else { + session->priv->connection = connection; + } -gboolean -ck_session_unlock (CkSession *session, - DBusGMethodInvocation *context) -{ - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - g_debug ("Emitting unlock for session %s", session->priv->id); - g_signal_emit (session, signals [UNLOCK], 0); + if (session->priv->connection == NULL) { + if (error != NULL) { + g_critical ("error getting system bus: %s", error->message); + g_error_free (error); + } + return FALSE; + } + + g_debug ("exporting path %s", session->priv->id); - dbus_g_method_return (context); + if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (CONSOLE_KIT_SESSION (session)), + session->priv->connection, + session->priv->id, + &error)) { + if (error != NULL) { + g_critical ("error exporting interface: %s", error->message); + g_error_free (error); + return FALSE; + } + } + + g_debug ("exported on %s", g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (CONSOLE_KIT_SESSION (session)))); + + /* connect to DBus for get_caller_info */ + session->priv->bus_proxy = g_dbus_proxy_new_sync (session->priv->connection, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + "org.freedesktop.DBus", + "/org/freedesktop/DBus/Bus", + "org.freedesktop.DBus", + NULL, + &error); + if (session->priv->bus_proxy == NULL) { + g_warning ("cannot connect to DBus: %s", error->message); + g_error_free (error); + } return TRUE; } @@ -188,34 +207,41 @@ get_caller_info (CkSession *session, uid_t *calling_uid, pid_t *calling_pid) { - gboolean res; - GError *error = NULL; - - res = FALSE; + gboolean res = FALSE; + GVariant *value = NULL; + GError *error = NULL; if (sender == NULL) { goto out; } - if (! dbus_g_proxy_call (session->priv->bus_proxy, "GetConnectionUnixUser", &error, - G_TYPE_STRING, sender, - G_TYPE_INVALID, - G_TYPE_UINT, calling_uid, - G_TYPE_INVALID)) { + value = g_dbus_proxy_call_sync (session->priv->bus_proxy, "GetConnectionUnixUser", + g_variant_new ("(s)", sender), + G_DBUS_CALL_FLAGS_NONE, + 2000, + NULL, + &error); + + if (value == NULL) { g_warning ("GetConnectionUnixUser() failed: %s", error->message); g_error_free (error); goto out; } + g_variant_get (value, "(u)", &calling_uid); + + value = g_dbus_proxy_call_sync (session->priv->bus_proxy, "GetConnectionUnixProcessID", + g_variant_new ("(s)", sender), + G_DBUS_CALL_FLAGS_NONE, + 2000, + NULL, + &error); - if (! dbus_g_proxy_call (session->priv->bus_proxy, "GetConnectionUnixProcessID", &error, - G_TYPE_STRING, sender, - G_TYPE_INVALID, - G_TYPE_UINT, calling_pid, - G_TYPE_INVALID)) { + if (value == NULL) { g_warning ("GetConnectionUnixProcessID() failed: %s", error->message); g_error_free (error); goto out; } + g_variant_get (value, "(u)", &calling_pid); res = TRUE; @@ -230,15 +256,16 @@ static gboolean session_set_idle_hint_internal (CkSession *session, gboolean idle_hint) { - if (session->priv->idle_hint != idle_hint) { - session->priv->idle_hint = idle_hint; - g_object_notify (G_OBJECT (session), "idle-hint"); + ConsoleKitSession *cksession = CONSOLE_KIT_SESSION (session); + + if (console_kit_session_get_idle_hint (cksession) != idle_hint) { + console_kit_session_set_idle_hint (cksession, idle_hint); /* FIXME: can we get a time from the dbus message? */ g_get_current_time (&session->priv->idle_since_hint); g_debug ("Emitting idle-changed for session %s", session->priv->id); - g_signal_emit (session, signals [IDLE_HINT_CHANGED], 0, idle_hint); + console_kit_session_emit_idle_hint_changed (cksession, idle_hint); } return TRUE; @@ -251,141 +278,43 @@ session_set_idle_hint_internal (CkSession *session, /org/freedesktop/ConsoleKit/Session1 \ org.freedesktop.ConsoleKit.Session.SetIdleHint boolean:TRUE */ -gboolean -ck_session_set_idle_hint (CkSession *session, - gboolean idle_hint, - DBusGMethodInvocation *context) +static gboolean +dbus_set_idle_hint (ConsoleKitSession *cksession, + GDBusMethodInvocation *context, + gboolean idle_hint) { - char *sender; + const char *sender; uid_t calling_uid; pid_t calling_pid; gboolean res; + CkSession *session; - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); + g_return_val_if_fail (CK_IS_SESSION (cksession), FALSE); + + session = CK_SESSION(cksession); - sender = dbus_g_method_get_sender (context); + sender = g_dbus_method_invocation_get_sender (context); res = get_caller_info (session, sender, &calling_uid, &calling_pid); - g_free (sender); if (! res) { - GError *error; - error = g_error_new (CK_SESSION_ERROR, - CK_SESSION_ERROR_GENERAL, - _("Unable to lookup information about calling process '%d'"), - calling_pid); g_warning ("stat on pid %d failed", calling_pid); - dbus_g_method_return_error (context, error); - g_error_free (error); + throw_error (context, CK_SESSION_ERROR_FAILED, _("Unable to lookup information about calling process '%d'"), calling_pid); return FALSE; } /* only restrict this by UID for now */ if (session->priv->uid != calling_uid) { - GError *error; - error = g_error_new (CK_SESSION_ERROR, - CK_SESSION_ERROR_GENERAL, - _("Only session owner may set idle hint state")); - dbus_g_method_return_error (context, error); - g_error_free (error); + throw_error (context, CK_SESSION_ERROR_INSUFFICIENT_PERMISSION, _("Only session owner may set idle hint state")); return FALSE; } session_set_idle_hint_internal (session, idle_hint); - dbus_g_method_return (context); - - return TRUE; -} - -gboolean -ck_session_get_idle_hint (CkSession *session, - gboolean *idle_hint, - GError **error) -{ - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - - if (idle_hint != NULL) { - *idle_hint = session->priv->idle_hint; - } - - return TRUE; -} - -#if GLIB_CHECK_VERSION(2,12,0) -#define _g_time_val_to_iso8601(t) g_time_val_to_iso8601(t) -#else -/* copied from GLib */ -static gchar * -_g_time_val_to_iso8601 (GTimeVal *time_) -{ - gchar *retval; - - g_return_val_if_fail (time_->tv_usec >= 0 && time_->tv_usec < G_USEC_PER_SEC, NULL); - -#define ISO_8601_LEN 21 -#define ISO_8601_FORMAT "%Y-%m-%dT%H:%M:%SZ" - retval = g_new0 (gchar, ISO_8601_LEN + 1); - - strftime (retval, ISO_8601_LEN, - ISO_8601_FORMAT, - gmtime (&(time_->tv_sec))); - - return retval; -} -#endif - -gboolean -ck_session_get_idle_since_hint (CkSession *session, - char **iso8601_datetime, - GError **error) -{ - char *date_str; - - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - - date_str = NULL; - if (session->priv->idle_hint) { - date_str = _g_time_val_to_iso8601 (&session->priv->idle_since_hint); - } - - if (iso8601_datetime != NULL) { - *iso8601_datetime = g_strdup (date_str); - } - - g_free (date_str); - - return TRUE; -} - -gboolean -ck_session_activate (CkSession *session, - DBusGMethodInvocation *context) -{ - gboolean res; - - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - - res = FALSE; - g_signal_emit (session, signals [ACTIVATE], 0, context, &res); - if (! res) { - GError *error; - - /* if the signal is not handled then either: - a) aren't attached to seat - b) seat doesn't support activation changes */ - g_debug ("Activate signal not handled"); - - error = g_error_new (CK_SESSION_ERROR, - CK_SESSION_ERROR_GENERAL, - _("Unable to activate session")); - dbus_g_method_return_error (context, error); - g_error_free (error); - return FALSE; - } + console_kit_session_complete_set_idle_hint (cksession, context); return TRUE; } @@ -394,34 +323,34 @@ ck_session_set_active (CkSession *session, gboolean active, GError **error) { + ConsoleKitSession *cksession; + g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - if (session->priv->active != active) { - session->priv->active = active; - g_signal_emit (session, signals [ACTIVE_CHANGED], 0, active); + cksession = CONSOLE_KIT_SESSION (session); + + if (console_kit_session_get_active (cksession) != active) { + console_kit_session_set_active (cksession, active); + console_kit_session_emit_active_changed (cksession, active); } return TRUE; } -gboolean -ck_session_set_is_local (CkSession *session, - gboolean is_local, - GError **error) +static gboolean +dbus_activate (ConsoleKitSession *cksession, + GDBusMethodInvocation *context) { - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - - if (session->priv->is_local != is_local) { - session->priv->is_local = is_local; - } + ck_session_set_active (CK_SESSION (cksession), TRUE, NULL); + console_kit_session_complete_activate (cksession, context); return TRUE; } gboolean -ck_session_get_id (CkSession *session, - char **id, - GError **error) +ck_session_get_id (CkSession *session, + char **id, + GError **error) { g_return_val_if_fail (CK_IS_SESSION (session), FALSE); @@ -447,94 +376,73 @@ ck_session_get_seat_id (CkSession *session, } gboolean -ck_session_get_unix_user (CkSession *session, - guint *uid, +ck_session_set_unix_user (CkSession *session, + guint uid, GError **error) { g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - if (uid != NULL) { - *uid = session->priv->uid; - } + console_kit_session_set_unix_user (CONSOLE_KIT_SESSION (session), uid); return TRUE; } -/* deprecated */ gboolean -ck_session_get_user (CkSession *session, - guint *uid, - GError **error) -{ - return ck_session_get_unix_user (session, uid, error); -} - -gboolean -ck_session_get_x11_display (CkSession *session, - char **x11_display, +ck_session_set_x11_display (CkSession *session, + const char *x11_display, GError **error) { g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - if (x11_display != NULL) { - *x11_display = g_strdup (session->priv->x11_display); - } + console_kit_session_set_x11_display (CONSOLE_KIT_SESSION (session), x11_display); return TRUE; } gboolean -ck_session_get_display_device (CkSession *session, - char **display_device, +ck_session_set_display_device (CkSession *session, + const char *display_device, GError **error) { - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - - if (display_device != NULL) { - *display_device = g_strdup (session->priv->display_device); - } - - return TRUE; -} + ConsoleKitSession *cksession; -gboolean -ck_session_get_login_session_id (CkSession *session, - char **login_session_id, - GError **error) -{ g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - if (login_session_id != NULL) { - *login_session_id = g_strdup (session->priv->login_session_id); - } + cksession = CONSOLE_KIT_SESSION (session); + + console_kit_session_set_display_device (cksession, display_device); return TRUE; } gboolean -ck_session_get_x11_display_device (CkSession *session, - char **x11_display_device, +ck_session_set_x11_display_device (CkSession *session, + const char *x11_display_device, GError **error) { + ConsoleKitSession *cksession; + g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - if (x11_display_device != NULL) { - *x11_display_device = g_strdup (session->priv->x11_display_device); - } + cksession = CONSOLE_KIT_SESSION (session); + + console_kit_session_set_x11_display_device (cksession, x11_display_device); return TRUE; } gboolean -ck_session_get_remote_host_name (CkSession *session, - char **remote_host_name, +ck_session_set_remote_host_name (CkSession *session, + const char *remote_host_name, GError **error) { + ConsoleKitSession *cksession; + g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - if (remote_host_name != NULL) { - *remote_host_name = g_strdup (session->priv->remote_host_name); - } + cksession = CONSOLE_KIT_SESSION (session); + + console_kit_session_set_remote_host_name (cksession, remote_host_name); return TRUE; } @@ -547,49 +455,33 @@ ck_session_get_creation_time (CkSession *session, g_return_val_if_fail (CK_IS_SESSION (session), FALSE); if (iso8601_datetime != NULL) { - *iso8601_datetime = _g_time_val_to_iso8601 (&session->priv->creation_time); + *iso8601_datetime = g_time_val_to_iso8601 (&session->priv->creation_time); } return TRUE; } gboolean -ck_session_get_session_type (CkSession *session, - char **type, - GError **error) -{ - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - - if (type != NULL) { - *type = g_strdup (session->priv->session_type); - } - - return TRUE; -} - -gboolean -ck_session_is_active (CkSession *session, - gboolean *active, - GError **error) +ck_session_set_is_local (CkSession *session, + gboolean is_local, + GError **error) { g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - if (active != NULL) { - *active = session->priv->active; - } + console_kit_session_set_is_local (CONSOLE_KIT_SESSION (session), is_local); return TRUE; } gboolean -ck_session_is_local (CkSession *session, - gboolean *local, - GError **error) +ck_session_is_local (CkSession *session, + gboolean *local, + GError **error) { g_return_val_if_fail (CK_IS_SESSION (session), FALSE); if (local != NULL) { - *local = session->priv->is_local; + *local = console_kit_session_get_is_local (CONSOLE_KIT_SESSION (session)); } return TRUE; @@ -635,57 +527,6 @@ ck_session_set_seat_id (CkSession *session, } gboolean -ck_session_set_unix_user (CkSession *session, - guint uid, - GError **error) -{ - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - - session->priv->uid = uid; - - return TRUE; -} - -gboolean -ck_session_set_x11_display (CkSession *session, - const char *x11_display, - GError **error) -{ - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - - g_free (session->priv->x11_display); - session->priv->x11_display = g_strdup (x11_display); - - return TRUE; -} - -gboolean -ck_session_set_display_device (CkSession *session, - const char *display_device, - GError **error) -{ - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - - g_free (session->priv->display_device); - session->priv->display_device = g_strdup (display_device); - - return TRUE; -} - -gboolean -ck_session_set_x11_display_device (CkSession *session, - const char *x11_display_device, - GError **error) -{ - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - - g_free (session->priv->x11_display_device); - session->priv->x11_display_device = g_strdup (x11_display_device); - - return TRUE; -} - -gboolean ck_session_set_login_session_id (CkSession *session, const char *login_session_id, GError **error) @@ -699,27 +540,15 @@ ck_session_set_login_session_id (CkSession *session, } gboolean -ck_session_set_remote_host_name (CkSession *session, - const char *remote_host_name, - GError **error) -{ - g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - - g_free (session->priv->remote_host_name); - session->priv->remote_host_name = g_strdup (remote_host_name); - - return TRUE; -} - -gboolean ck_session_set_session_type (CkSession *session, const char *type, GError **error) { + ConsoleKitSession *cksession = CONSOLE_KIT_SESSION (session); + g_return_val_if_fail (CK_IS_SESSION (session), FALSE); - g_free (session->priv->session_type); - session->priv->session_type = g_strdup (type); + console_kit_session_set_session_type (cksession, type); return TRUE; } @@ -735,45 +564,15 @@ ck_session_set_property (GObject *object, self = CK_SESSION (object); switch (prop_id) { - case PROP_ACTIVE: - ck_session_set_active (self, g_value_get_boolean (value), NULL); - break; - case PROP_IS_LOCAL: - ck_session_set_is_local (self, g_value_get_boolean (value), NULL); - break; case PROP_ID: ck_session_set_id (self, g_value_get_string (value), NULL); break; case PROP_COOKIE: ck_session_set_cookie (self, g_value_get_string (value), NULL); break; - case PROP_SESSION_TYPE: - ck_session_set_session_type (self, g_value_get_string (value), NULL); - break; - case PROP_X11_DISPLAY: - ck_session_set_x11_display (self, g_value_get_string (value), NULL); - break; - case PROP_X11_DISPLAY_DEVICE: - ck_session_set_x11_display_device (self, g_value_get_string (value), NULL); - break; - case PROP_DISPLAY_DEVICE: - ck_session_set_display_device (self, g_value_get_string (value), NULL); - break; case PROP_LOGIN_SESSION_ID: ck_session_set_login_session_id (self, g_value_get_string (value), NULL); break; - case PROP_UNIX_USER: - ck_session_set_unix_user (self, g_value_get_uint (value), NULL); - break; - case PROP_USER: /* deprecated */ - ck_session_set_unix_user (self, g_value_get_uint (value), NULL); - break; - case PROP_REMOTE_HOST_NAME: - ck_session_set_remote_host_name (self, g_value_get_string (value), NULL); - break; - case PROP_IDLE_HINT: - session_set_idle_hint_internal (self, g_value_get_boolean (value)); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -791,61 +590,34 @@ ck_session_get_property (GObject *object, self = CK_SESSION (object); switch (prop_id) { - case PROP_ACTIVE: - g_value_set_boolean (value, self->priv->active); - break; - case PROP_IS_LOCAL: - g_value_set_boolean (value, self->priv->is_local); - break; case PROP_ID: g_value_set_string (value, self->priv->id); break; case PROP_COOKIE: g_value_set_string (value, self->priv->cookie); break; - case PROP_SESSION_TYPE: - g_value_set_string (value, self->priv->session_type); - break; - case PROP_X11_DISPLAY: - g_value_set_string (value, self->priv->x11_display); - break; - case PROP_X11_DISPLAY_DEVICE: - g_value_set_string (value, self->priv->x11_display_device); - break; - case PROP_DISPLAY_DEVICE: - g_value_set_string (value, self->priv->display_device); - break; case PROP_LOGIN_SESSION_ID: g_value_set_string (value, self->priv->login_session_id); break; - case PROP_UNIX_USER: - g_value_set_uint (value, self->priv->uid); - break; - case PROP_USER: /* deprecated */ - g_value_set_uint (value, self->priv->uid); - break; - case PROP_REMOTE_HOST_NAME: - g_value_set_string (value, self->priv->remote_host_name); - break; - case PROP_IDLE_HINT: - g_value_set_boolean (value, self->priv->idle_hint); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } + #define IS_STR_SET(x) (x != NULL && x[0] != '\0') static gboolean session_is_text (CkSession *session) { + ConsoleKitSession *cksession; gboolean ret; ret = FALSE; + cksession = CONSOLE_KIT_SESSION (session); - if (! IS_STR_SET (session->priv->x11_display_device) - && ! IS_STR_SET (session->priv->x11_display) - && IS_STR_SET (session->priv->display_device)) { + if (! IS_STR_SET (console_kit_session_get_x11_display_device (cksession)) + && ! IS_STR_SET (console_kit_session_get_x11_display (cksession)) + && IS_STR_SET (console_kit_session_get_display_device (cksession))) { ret = TRUE; } @@ -868,7 +640,7 @@ static void session_add_activity_watch (CkSession *session) { if (session->priv->idle_monitor == NULL) { - session->priv->idle_monitor = ck_tty_idle_monitor_new (session->priv->display_device); + session->priv->idle_monitor = ck_tty_idle_monitor_new (console_kit_session_get_display_device (CONSOLE_KIT_SESSION (session))); g_signal_connect (session->priv->idle_monitor, "idle-hint-changed", G_CALLBACK (tty_idle_changed_cb), @@ -917,71 +689,8 @@ ck_session_class_init (CkSessionClass *klass) object_class->set_property = ck_session_set_property; object_class->finalize = ck_session_finalize; - signals [ACTIVE_CHANGED] = - g_signal_new ("active-changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CkSessionClass, active_changed), - NULL, - NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, - 1, G_TYPE_BOOLEAN); - signals [ACTIVATE] = - g_signal_new ("activate", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CkSessionClass, activate), - NULL, - NULL, - ck_marshal_BOOLEAN__POINTER, - G_TYPE_BOOLEAN, - 1, G_TYPE_POINTER); - signals [LOCK] = - g_signal_new ("lock", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CkSessionClass, lock), - NULL, - NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - signals [UNLOCK] = - g_signal_new ("unlock", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CkSessionClass, unlock), - NULL, - NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - signals [IDLE_HINT_CHANGED] = - g_signal_new ("idle-hint-changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (CkSessionClass, idle_hint_changed), - NULL, - NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, - 1, G_TYPE_BOOLEAN); - g_object_class_install_property (object_class, - PROP_ACTIVE, - g_param_spec_boolean ("active", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); - g_object_class_install_property (object_class, - PROP_IS_LOCAL, - g_param_spec_boolean ("is-local", - NULL, - NULL, - TRUE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + /* Install private properties we're not exporting over D-BUS */ g_object_class_install_property (object_class, PROP_ID, g_param_spec_string ("id", @@ -996,14 +705,6 @@ ck_session_class_init (CkSessionClass *klass) "cookie", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - - g_object_class_install_property (object_class, - PROP_SESSION_TYPE, - g_param_spec_string ("session-type", - "session-type", - "session type", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); g_object_class_install_property (object_class, PROP_LOGIN_SESSION_ID, g_param_spec_string ("login-session-id", @@ -1011,65 +712,8 @@ ck_session_class_init (CkSessionClass *klass) "login session id", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - g_object_class_install_property (object_class, - PROP_X11_DISPLAY, - g_param_spec_string ("x11-display", - "x11-display", - "X11 Display", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - g_object_class_install_property (object_class, - PROP_X11_DISPLAY_DEVICE, - g_param_spec_string ("x11-display-device", - "x11-display-device", - "X11 Display device", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - g_object_class_install_property (object_class, - PROP_DISPLAY_DEVICE, - g_param_spec_string ("display-device", - "display-device", - "Display device", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - g_object_class_install_property (object_class, - PROP_REMOTE_HOST_NAME, - g_param_spec_string ("remote-host-name", - "remote-host-name", - "Remote host name", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - - g_object_class_install_property (object_class, - PROP_UNIX_USER, - g_param_spec_uint ("unix-user", - "POSIX User Id", - "POSIX User Id", - 0, - G_MAXINT, - 0, - G_PARAM_READWRITE)); - /* deprecated */ - g_object_class_install_property (object_class, - PROP_USER, - g_param_spec_uint ("user", - "User Id", - "User Id", - 0, - G_MAXINT, - 0, - G_PARAM_READWRITE)); - g_object_class_install_property (object_class, - PROP_IDLE_HINT, - g_param_spec_boolean ("idle-hint", - NULL, - NULL, - FALSE, - G_PARAM_READWRITE)); g_type_class_add_private (klass, sizeof (CkSessionPrivate)); - - dbus_g_object_type_install_info (CK_TYPE_SESSION, &dbus_glib_ck_session_object_info); } static void @@ -1082,10 +726,19 @@ ck_session_init (CkSession *session) } static void +ck_session_iface_init (ConsoleKitSessionIface *iface) +{ + iface->handle_activate = dbus_activate; + iface->handle_set_idle_hint = dbus_set_idle_hint; +} + +static void ck_session_finalize (GObject *object) { CkSession *session; + g_debug ("ck_session_finalize"); + g_return_if_fail (object != NULL); g_return_if_fail (CK_IS_SESSION (object)); @@ -1095,24 +748,17 @@ ck_session_finalize (GObject *object) session_remove_activity_watch (session); - g_object_unref (session->priv->bus_proxy); - g_free (session->priv->id); g_free (session->priv->cookie); - g_free (session->priv->seat_id); - g_free (session->priv->session_type); g_free (session->priv->login_session_id); - g_free (session->priv->display_device); - g_free (session->priv->x11_display_device); - g_free (session->priv->x11_display); - g_free (session->priv->remote_host_name); G_OBJECT_CLASS (ck_session_parent_class)->finalize (object); } CkSession * -ck_session_new (const char *ssid, - const char *cookie) +ck_session_new (const char *ssid, + const char *cookie, + GDBusConnection *connection) { GObject *object; gboolean res; @@ -1121,7 +767,7 @@ ck_session_new (const char *ssid, "id", ssid, "cookie", cookie, NULL); - res = register_session (CK_SESSION (object)); + res = register_session (CK_SESSION (object), connection); if (! res) { g_object_unref (object); return NULL; @@ -1138,7 +784,8 @@ ck_session_new (const char *ssid, CkSession * ck_session_new_with_parameters (const char *ssid, const char *cookie, - const GPtrArray *parameters) + const GPtrArray *parameters, + GDBusConnection *connection) { GObject *object; gboolean res; @@ -1242,7 +889,7 @@ ck_session_new_with_parameters (const char *ssid, g_free (params); g_type_class_unref (class); - res = register_session (CK_SESSION (object)); + res = register_session (CK_SESSION (object), connection); if (! res) { g_object_unref (object); return NULL; @@ -1255,30 +902,32 @@ void ck_session_run_programs (CkSession *session, const char *action) { + ConsoleKitSession *cksession; int n; char *extra_env[11]; /* be sure to adjust this as needed */ n = 0; + cksession = CONSOLE_KIT_SESSION (session); extra_env[n++] = g_strdup_printf ("CK_SESSION_ID=%s", session->priv->id); - if (session->priv->session_type != NULL) { - extra_env[n++] = g_strdup_printf ("CK_SESSION_TYPE=%s", session->priv->session_type); + if (console_kit_session_get_session_type (cksession) != NULL) { + extra_env[n++] = g_strdup_printf ("CK_SESSION_TYPE=%s", console_kit_session_get_session_type (cksession)); } extra_env[n++] = g_strdup_printf ("CK_SESSION_SEAT_ID=%s", session->priv->seat_id); extra_env[n++] = g_strdup_printf ("CK_SESSION_USER_UID=%d", session->priv->uid); - if (session->priv->display_device != NULL && strlen (session->priv->display_device) > 0) { - extra_env[n++] = g_strdup_printf ("CK_SESSION_DISPLAY_DEVICE=%s", session->priv->display_device); + if (console_kit_session_get_display_device (cksession) != NULL && strlen (console_kit_session_get_display_device (cksession)) > 0) { + extra_env[n++] = g_strdup_printf ("CK_SESSION_DISPLAY_DEVICE=%s", console_kit_session_get_display_device (cksession)); } - if (session->priv->x11_display_device != NULL && strlen (session->priv->x11_display_device) > 0) { - extra_env[n++] = g_strdup_printf ("CK_SESSION_X11_DISPLAY_DEVICE=%s", session->priv->x11_display_device); + if (console_kit_session_get_x11_display_device (cksession) != NULL && strlen (console_kit_session_get_x11_display_device (cksession) ) > 0) { + extra_env[n++] = g_strdup_printf ("CK_SESSION_X11_DISPLAY_DEVICE=%s", console_kit_session_get_x11_display_device (cksession) ); } extra_env[n++] = g_strdup_printf ("CK_SESSION_X11_DISPLAY=%s", - session->priv->x11_display ? session->priv->x11_display : ""); - if (session->priv->remote_host_name != NULL && strlen (session->priv->remote_host_name) > 0) { - extra_env[n++] = g_strdup_printf ("CK_SESSION_REMOTE_HOST_NAME=%s", session->priv->remote_host_name); + console_kit_session_get_x11_display (cksession) ? console_kit_session_get_x11_display (cksession) : ""); + if (console_kit_session_get_remote_host_name (cksession) != NULL && strlen (console_kit_session_get_remote_host_name (cksession)) > 0) { + extra_env[n++] = g_strdup_printf ("CK_SESSION_REMOTE_HOST_NAME=%s", console_kit_session_get_remote_host_name (cksession)); } - extra_env[n++] = g_strdup_printf ("CK_SESSION_IS_ACTIVE=%s", session->priv->active ? "true" : "false"); - extra_env[n++] = g_strdup_printf ("CK_SESSION_IS_LOCAL=%s", session->priv->is_local ? "true" : "false"); + extra_env[n++] = g_strdup_printf ("CK_SESSION_IS_ACTIVE=%s", console_kit_session_get_active (cksession) ? "true" : "false"); + extra_env[n++] = g_strdup_printf ("CK_SESSION_IS_LOCAL=%s", console_kit_session_get_is_local (cksession) ? "true" : "false"); extra_env[n++] = NULL; g_assert(n <= G_N_ELEMENTS(extra_env)); @@ -1297,6 +946,9 @@ ck_session_dump (CkSession *session, { char *s; char *group_name; + ConsoleKitSession *cksession; + + cksession = CONSOLE_KIT_SESSION (session); group_name = g_strdup_printf ("Session %s", session->priv->id); g_key_file_set_integer (key_file, group_name, "uid", session->priv->uid); @@ -1304,11 +956,11 @@ ck_session_dump (CkSession *session, group_name, "seat", NONULL_STRING (session->priv->seat_id)); - if (session->priv->session_type != NULL) { + if (console_kit_session_get_session_type (cksession) != NULL) { g_key_file_set_string (key_file, group_name, "type", - NONULL_STRING (session->priv->session_type)); + NONULL_STRING (console_kit_session_get_session_type (cksession))); } if (session->priv->login_session_id != NULL && strlen (session->priv->login_session_id) > 0) { g_key_file_set_string (key_file, @@ -1316,36 +968,37 @@ ck_session_dump (CkSession *session, "login_session_id", NONULL_STRING (session->priv->login_session_id)); } - if (session->priv->display_device != NULL && strlen (session->priv->display_device) > 0) { + if (console_kit_session_get_display_device (cksession) != NULL && strlen (console_kit_session_get_display_device (cksession)) > 0) { g_key_file_set_string (key_file, group_name, "display_device", - NONULL_STRING (session->priv->display_device)); + NONULL_STRING (console_kit_session_get_display_device (cksession))); } - if (session->priv->x11_display_device != NULL && strlen (session->priv->x11_display_device) > 0) { + if (console_kit_session_get_x11_display_device (cksession) != NULL && strlen (console_kit_session_get_x11_display_device (cksession)) > 0) { g_key_file_set_string (key_file, group_name, "x11_display_device", - NONULL_STRING (session->priv->x11_display_device)); + NONULL_STRING (console_kit_session_get_x11_display_device (cksession))); } - if (session->priv->x11_display != NULL && strlen (session->priv->x11_display) > 0) { + if (console_kit_session_get_x11_display (cksession) != NULL && strlen (console_kit_session_get_x11_display (cksession)) > 0) { g_key_file_set_string (key_file, group_name, "x11_display", - NONULL_STRING (session->priv->x11_display)); + NONULL_STRING (console_kit_session_get_x11_display (cksession))); } - if (session->priv->remote_host_name != NULL && strlen (session->priv->remote_host_name) > 0) { + if (console_kit_session_get_remote_host_name (cksession) != NULL && strlen (console_kit_session_get_remote_host_name (cksession)) > 0) { g_key_file_set_string (key_file, group_name, "remote_host_name", - NONULL_STRING (session->priv->remote_host_name)); + NONULL_STRING (console_kit_session_get_remote_host_name (cksession))); } g_key_file_set_string (key_file, group_name, "remote_host_name", - NONULL_STRING (session->priv->remote_host_name)); - g_key_file_set_boolean (key_file, group_name, "is_active", session->priv->active); - g_key_file_set_boolean (key_file, group_name, "is_local", session->priv->is_local); + NONULL_STRING (console_kit_session_get_remote_host_name (cksession))); + + console_kit_session_set_active (cksession, g_key_file_get_boolean (key_file, group_name, "is_active", NULL)); + console_kit_session_set_is_local (cksession, g_key_file_get_boolean (key_file, group_name, "is_local", NULL)); s = g_time_val_to_iso8601 (&(session->priv->creation_time)); g_key_file_set_string (key_file, diff --git a/src/ck-session.h b/src/ck-session.h index b6b565b..c7db807 100644 --- a/src/ck-session.h +++ b/src/ck-session.h @@ -23,7 +23,7 @@ #define __CK_SESSION_H #include <glib-object.h> -#include <dbus/dbus-glib.h> +#include "ck-session-generated.h" G_BEGIN_DECLS @@ -38,48 +38,44 @@ typedef struct CkSessionPrivate CkSessionPrivate; typedef struct { - GObject parent; - CkSessionPrivate *priv; + ConsoleKitSessionSkeleton parent; + CkSessionPrivate *priv; } CkSession; typedef struct { - GObjectClass parent_class; - - /* internal signals */ - void (* activate) (CkSession *session, - DBusGMethodInvocation *context); - - /* exported signals */ - void (* lock) (CkSession *session); - void (* unlock) (CkSession *session); - void (* active_changed) (CkSession *session, - gboolean active); - void (* idle_hint_changed) (CkSession *session, - gboolean idle_hint); + ConsoleKitSessionSkeletonClass parent_class; } CkSessionClass; typedef enum { - CK_SESSION_ERROR_GENERAL + CK_SESSION_ERROR_FAILED, + CK_SESSION_ERROR_GENERAL, + CK_SESSION_ERROR_INSUFFICIENT_PERMISSION, + CK_SESSION_ERROR_NOT_SUPPORTED, + NUM_ERRORS } CkSessionError; #define CK_SESSION_ERROR ck_session_error_quark () + GQuark ck_session_error_quark (void); +GType ck_session_error_get_type (void); GType ck_session_get_type (void); + CkSession * ck_session_new (const char *ssid, - const char *cookie); + const char *cookie, + GDBusConnection *connection); CkSession * ck_session_new_with_parameters (const char *ssid, const char *cookie, - const GPtrArray *parameters); + const GPtrArray *parameters, + GDBusConnection *connection); void ck_session_dump (CkSession *session, GKeyFile *key_file); void ck_session_run_programs (CkSession *session, const char *action); - gboolean ck_session_set_active (CkSession *session, gboolean active, GError **error); @@ -117,8 +113,6 @@ gboolean ck_session_set_session_type (CkSession *se const char *type, GError **error); -/* Exported methods */ - /* Authoritative properties */ gboolean ck_session_get_id (CkSession *session, char **ssid, @@ -132,53 +126,26 @@ gboolean ck_session_is_active (CkSession *se gboolean ck_session_is_local (CkSession *session, gboolean *local, GError **error); -gboolean ck_session_get_unix_user (CkSession *session, - guint *uid, - GError **error); -gboolean ck_session_get_x11_display (CkSession *session, - char **display, - GError **error); -gboolean ck_session_get_x11_display_device (CkSession *session, - char **display, - GError **error); -gboolean ck_session_get_display_device (CkSession *session, - char **display, - GError **error); gboolean ck_session_get_login_session_id (CkSession *session, char **login_session_id, GError **error); -gboolean ck_session_get_session_type (CkSession *session, - char **type, - GError **error); -gboolean ck_session_get_remote_host_name (CkSession *session, - char **host_name, - GError **error); gboolean ck_session_get_creation_time (CkSession *session, char **iso8601_datetime, GError **error); -/*deprecated*/ -gboolean ck_session_get_user (CkSession *session, - guint *uid, - GError **error); -/* Non-authoritative properties */ -gboolean ck_session_get_idle_hint (CkSession *session, - gboolean *idle_hint, + +gboolean ck_session_set_id (CkSession *session, + const char *ssid, GError **error); -gboolean ck_session_get_idle_since_hint (CkSession *session, - char **iso8601_datetime, +gboolean ck_session_set_cookie (CkSession *session, + const char *cookie, + GError **error); +gboolean ck_session_set_seat_id (CkSession *session, + const char *sid, + GError **error); +gboolean ck_session_set_login_session_id (CkSession *session, + const char *login_session_id, GError **error); -gboolean ck_session_set_idle_hint (CkSession *session, - gboolean idle_hint, - DBusGMethodInvocation *context); - -/* Privileged actions */ -gboolean ck_session_activate (CkSession *session, - DBusGMethodInvocation *context); -gboolean ck_session_lock (CkSession *session, - DBusGMethodInvocation *context); -gboolean ck_session_unlock (CkSession *session, - DBusGMethodInvocation *context); G_END_DECLS diff --git a/src/test-session.c b/src/test-session.c new file mode 100644 index 0000000..e0c6059 --- /dev/null +++ b/src/test-session.c @@ -0,0 +1,354 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright (C) 2014 Eric Koegel <eric.koegel@gmail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> + +#include <glib.h> +#include <glib-object.h> +#include <glib-unix.h> +#include <glib/gstdio.h> +#include <unistd.h> +#include <sys/types.h> +#include <gio/gio.h> + +#include "ck-session.h" + + +CkSession *session; +GDBusProxy *proxy; +ConsoleKitSession *cksession; +static GMainLoop *loop; + +#define DBUS_NAME "org.freedesktop.ConsoleKit.TestSession" +#define DBUS_PATH "/org/freedesktop/ConsoleKit/TestSession" + + +static void +test_unref_session (void) +{ + /* Verify we have an object */ + g_assert (session != NULL); + g_assert (CK_IS_SESSION (session)); + + g_object_unref (session); + session = NULL; +} + +static void +test_set_some_stuff (void) +{ + g_print ("console_kit_session_call_activate_sync\n"); + + console_kit_session_call_activate_sync (cksession, NULL, NULL); + + g_print ("test_set_some_stuff\n"); + + console_kit_session_set_unix_user (cksession, 1000); + console_kit_session_set_session_type (cksession, "graphical"); + console_kit_session_set_remote_host_name (cksession, "test-client"); + console_kit_session_set_display_device (cksession, "/dev/tty64"); + console_kit_session_set_is_local (cksession, TRUE); +} + +static gboolean +test_validate_stuff (gpointer user_data) +{ + g_print ("test_validate_stuff\n"); + + if (cksession == NULL) + return FALSE; + + g_print ("unix user: %d\n", console_kit_session_get_unix_user (cksession)); + g_print ("session type: %s\n", console_kit_session_get_session_type (cksession)); + g_print ("remote hostname: %s\n", console_kit_session_get_remote_host_name (cksession)); + g_print ("display device: %s\n", console_kit_session_get_display_device (cksession)); + g_print ("is active? %s\n", console_kit_session_get_active (cksession) ? "TRUE" : "FALSE"); + g_print ("is local? %s\n", console_kit_session_get_is_local (cksession) ? "TRUE" : "FALSE"); + g_print ("done printing stuff\n\n"); + + return TRUE; +} + +static void +test_setup_cksession_proxy (void) +{ + GError *error = NULL; + + g_print ("test_setup_cksession_proxy\n"); + + cksession = console_kit_session_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_BUS_NAME_OWNER_FLAGS_NONE, + DBUS_NAME, DBUS_PATH, + NULL, + &error); + + if (cksession == NULL) + { + g_printerr ("Error creating cksession proxy: %s\n", error->message); + g_error_free (error); + } + + g_timeout_add_seconds (10, test_validate_stuff, NULL); +} + +static void +print_properties (GDBusProxy *proxy) +{ + gchar **property_names; + guint n; + + g_print (" properties:\n"); + + property_names = g_dbus_proxy_get_cached_property_names (proxy); + for (n = 0; property_names != NULL && property_names[n] != NULL; n++) + { + const gchar *key = property_names[n]; + GVariant *value; + gchar *value_str; + value = g_dbus_proxy_get_cached_property (proxy, key); + value_str = g_variant_print (value, TRUE); + g_print (" %s -> %s\n", key, value_str); + g_variant_unref (value); + g_free (value_str); + } + g_strfreev (property_names); +} + +static void +on_properties_changed (GDBusProxy *proxy, + GVariant *changed_properties, + const gchar* const *invalidated_properties, + gpointer user_data) +{ + /* Note that we are guaranteed that changed_properties and + * invalidated_properties are never NULL + */ + + g_print ("on_properties_changed\n"); + + if (g_variant_n_children (changed_properties) > 0) + { + GVariantIter *iter; + const gchar *key; + GVariant *value; + + g_print (" *** Properties Changed:\n"); + g_variant_get (changed_properties, + "a{sv}", + &iter); + while (g_variant_iter_loop (iter, "{&sv}", &key, &value)) + { + gchar *value_str; + value_str = g_variant_print (value, TRUE); + g_print (" %s -> %s\n", key, value_str); + g_free (value_str); + } + g_variant_iter_free (iter); + } + + if (g_strv_length ((GStrv) invalidated_properties) > 0) + { + guint n; + g_print (" *** Properties Invalidated:\n"); + for (n = 0; invalidated_properties[n] != NULL; n++) + { + const gchar *key = invalidated_properties[n]; + g_print (" %s\n", key); + } + } +} + +static void +on_signal (GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + gchar *parameters_str; + + g_print ("on_signal\n"); + + parameters_str = g_variant_print (parameters, TRUE); + g_print (" *** Received Signal: %s: %s\n", + signal_name, + parameters_str); + g_free (parameters_str); +} + +static void +print_proxy (GDBusProxy *proxy) +{ + gchar *name_owner; + + g_print ("print_proxy\n"); + + name_owner = g_dbus_proxy_get_name_owner (proxy); + if (name_owner != NULL) + { + g_print ("+++ Proxy object points to remote object owned by %s\n" + " bus: %s\n" + " name: %s\n" + " object path: %s\n" + " interface: %s\n", + name_owner, + "Session Bus", + DBUS_NAME, + DBUS_PATH, + "org.freedesktop.ConsoleKit.Session"); + print_properties (proxy); + } + else + { + g_print ("--- Proxy object is inert - there is no name owner for the name\n" + " bus: %s\n" + " name: %s\n" + " object path: %s\n" + " interface: %s\n", + "Session Bus", + DBUS_NAME, + DBUS_PATH, + "org.freedesktop.ConsoleKit.Session"); + } + g_free (name_owner); + + test_setup_cksession_proxy (); + test_set_some_stuff (); +} + +static void +on_name_owner_notify (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + GDBusProxy *proxy = G_DBUS_PROXY (object); + g_print ("on_name_owner_notify\n"); + print_proxy (proxy); +} + +static gboolean +test_setup_proxy (gpointer user_data) +{ + GError *error = NULL; + + g_print ("test_setup_proxy\n"); + + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_BUS_NAME_OWNER_FLAGS_NONE, + NULL, /* GDBusInterfaceInfo */ + DBUS_NAME, + DBUS_PATH, + "org.freedesktop.ConsoleKit.Session", + NULL, /* GCancellable */ + &error); + + if (proxy == NULL) + { + g_printerr ("Error creating proxy: %s\n", error->message); + g_error_free (error); + return FALSE; + } + + g_signal_connect (proxy, + "g-properties-changed", + G_CALLBACK (on_properties_changed), + NULL); + g_signal_connect (proxy, + "g-signal", + G_CALLBACK (on_signal), + NULL); + g_signal_connect (proxy, + "notify::g-name-owner", + G_CALLBACK (on_name_owner_notify), + NULL); + print_proxy (proxy); + + return FALSE; +} + +static void +bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_print ("bus_acquired\n"); + + session = ck_session_new (DBUS_PATH, "cookie!", connection); + + /* Verify we got a valid object */ + g_assert (session != NULL); + g_assert (CK_IS_SESSION (session)); +} + +static void +name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_print ("name_acquired\n"); + + g_timeout_add_seconds (4, test_setup_proxy, NULL); +} + +static void +name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_print ("name_lost\n"); + + /* Release the object */ + test_unref_session (); +} + +static void +test_own_bus (void) +{ + g_bus_own_name (G_BUS_TYPE_SESSION, DBUS_NAME, + G_BUS_NAME_OWNER_FLAGS_NONE, + bus_acquired, name_acquired, name_lost, + NULL, NULL); +} + +int +main (int argc, + char *argv[]) +{ + /* do not run these tests as root */ + if (getuid () == 0) { + g_warning ("You must NOT be root to run these tests"); + exit (1); + } + + loop = g_main_loop_new (NULL, FALSE); + + session = NULL; + + test_own_bus (); + + g_main_loop_run (loop); + + g_object_unref (loop); + + return 0; +} |