diff options
Diffstat (limited to 'src/users-service-dbus.c')
-rw-r--r-- | src/users-service-dbus.c | 154 |
1 files changed, 142 insertions, 12 deletions
diff --git a/src/users-service-dbus.c b/src/users-service-dbus.c index b9e9391..593ef83 100644 --- a/src/users-service-dbus.c +++ b/src/users-service-dbus.c @@ -26,6 +26,8 @@ #include <pwd.h> #include <dbus/dbus-glib.h> +#include <dbus/dbus-glib.h> +#include <dbus/dbus-glib-lowlevel.h> #include "dbus-shared-names.h" #include "users-service-dbus.h" @@ -81,7 +83,7 @@ static void seat_proxy_session_added (DBusGProxy *seat_ static void seat_proxy_session_removed (DBusGProxy *seat_proxy, const gchar *session_id, UsersServiceDbus *service); -static gboolean maybe_add_session_for_user (UsersServiceDbus *service, +static gboolean do_add_session (UsersServiceDbus *service, UserData *user, const gchar *ssid); static gchar * get_seat_internal (UsersServiceDbus *self); @@ -464,12 +466,11 @@ get_seat (UsersServiceDbus *service) return NULL; } + g_print ("get_seat(): ssid is %s\n", ssid); + priv->ssid = ssid; create_cksession_proxy (service); - if (ssid) - g_free (ssid); - seat = get_seat_internal (service); return seat; @@ -495,13 +496,15 @@ get_seat_internal (UsersServiceDbus *self) } } + g_print ("get_seat_internal: %s\n", seat); + return seat; } static gboolean -get_uid_from_session_id (UsersServiceDbus *service, - const gchar *session_id, - uid_t *uidp) +get_unix_user (UsersServiceDbus *service, + const gchar *session_id, + uid_t *uidp) { UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (service); GError *error; @@ -543,10 +546,65 @@ session_compare (const gchar *a, return strcmp (a, b); } +static gchar * +get_session_for_user (UsersServiceDbus *service, + UserData *user) +{ + UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (service); + gboolean can_activate; + GError *error = NULL; + GList *l; + + if (!priv->seat_proxy) + create_seat_proxy (service); + + if (priv->seat == NULL || priv->seat[0] == '\0') + { + return NULL; + } + + if (!dbus_g_proxy_call (priv->seat_proxy, + "CanActivateSessions", + &error, + G_TYPE_INVALID, + G_TYPE_BOOLEAN, &can_activate, + G_TYPE_INVALID)) + { + g_warning ("Failed to determine if seat can activate sessions: %s", error->message); + g_error_free (error); + + return NULL; + } + + if (!can_activate) { + return NULL; + } + + if (!user->sessions || g_list_length (user->sessions) == 0) + { + return NULL; + } + + for (l = user->sessions; l != NULL; l = l->next) + { + const char *ssid; + + ssid = l->data; + + /* FIXME: better way to choose? */ + if (ssid != NULL) + { + return g_strdup (ssid); + } + } + + return NULL; +} + static gboolean -maybe_add_session_for_user (UsersServiceDbus *service, - UserData *user, - const gchar *ssid) +do_add_session (UsersServiceDbus *service, + UserData *user, + const gchar *ssid) { UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (service); GError *error = NULL; @@ -577,6 +635,8 @@ maybe_add_session_for_user (UsersServiceDbus *service, if (!xdisplay || xdisplay[0] == '\0') return FALSE; + g_print ("xdisplay is %s\n", xdisplay); + if (g_hash_table_lookup (priv->exclusions, user->user_name)) return FALSE; @@ -610,7 +670,7 @@ seat_proxy_session_added (DBusGProxy *seat_proxy, struct passwd *pwent; UserData *user; - if (!get_uid_from_session_id (service, session_id, &uid)) + if (!get_unix_user (service, session_id, &uid)) { g_warning ("Failed to lookup user for session"); return; @@ -636,7 +696,7 @@ seat_proxy_session_added (DBusGProxy *seat_proxy, return; } - res = maybe_add_session_for_user (service, user, session_id); + res = do_add_session (service, user, session_id); } static void @@ -765,6 +825,76 @@ users_service_dbus_get_user_list (UsersServiceDbus *self) return g_hash_table_get_values (priv->users); } +gboolean +users_service_dbus_activate_user_session (UsersServiceDbus *self, + UserData *user) +{ + UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (self); + DBusMessage *message = NULL; + DBusMessage *reply = NULL; + DBusError error; + gchar *ssid; + + dbus_error_init (&error); + + if (!priv->seat) + priv->seat = get_seat (self); + + ssid = get_session_for_user (self, user); + + g_print ("users_service_dbus_activate_user_session...\n"); + g_print ("seat is %s\n", priv->seat); + g_print ("ssid is %s\n", ssid); + + if (!(message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit", + priv->seat, + "org.freedesktop.ConsoleKit.Seat", + "ActivateSession"))) + { + g_warning ("failed to create new message"); + return FALSE; + } + + if (!dbus_message_append_args (message, + DBUS_TYPE_OBJECT_PATH, + &ssid, + DBUS_TYPE_INVALID)) + { + g_warning ("failed to append args"); + return FALSE; + } + + if (!(reply = dbus_connection_send_with_reply_and_block (dbus_g_connection_get_connection (priv->system_bus), + message, + -1, + &error))) + { + g_warning ("send_with_reply_and_block failed"); + + if (dbus_error_is_set (&error)) + { + g_warning ("Unable to activate session: %s", error.message); + dbus_error_free (&error); + + return FALSE; + } + } + + g_print ("freeing shit up..\n"); + + if (message) + { + dbus_message_unref (message); + } + + if (reply) + { + dbus_message_unref (reply); + } + + return TRUE; +} + static void user_added (DBusGProxy *proxy, guint uid, |