30
30
#include <pwd.h> /* getpwuid() */
32
32
#include "dbus-accounts.h"
33
#include "dbus-consolekit-manager.h"
34
#include "dbus-consolekit-seat.h"
35
#include "dbus-consolekit-session.h"
33
#include "dbus-login1-manager.h"
34
#include "dbus-login1-session.h"
35
#include "dbus-login1-user.h"
36
36
#include "dbus-display-manager.h"
37
37
#include "dbus-user.h"
38
38
#include "shared-names.h"
39
39
#include "users-service-dbus.h"
41
#define CK_ADDR "org.freedesktop.ConsoleKit"
42
#define CK_SESSION_IFACE "org.freedesktop.ConsoleKit.Session"
41
#define LOGIND_ADDR "org.freedesktop.login1"
57
56
const gchar * user_object_path,
58
57
UsersServiceDbus * service);
60
static void on_session_added (ConsoleKitSeat * seat,
62
UsersServiceDbus * service);
64
static void on_session_removed (ConsoleKitSeat * seat,
66
UsersServiceDbus * service);
68
static void on_session_list (ConsoleKitSeat * seat,
69
GAsyncResult * result,
70
UsersServiceDbus * service);
59
static void on_session_added (Login1Manager * proxy,
62
UsersServiceDbus * service);
64
static void on_session_removed (Login1Manager * proxy,
67
UsersServiceDbus * service);
69
static void on_session_list (Login1Manager * proxy,
70
GAsyncResult * result,
71
UsersServiceDbus * service);
214
*** create the consolekit manager proxy...
213
*** create the logind manager proxy...
217
p->ck_manager_proxy = console_kit_manager_proxy_new_for_bus_sync (
216
p->manager_proxy = login1_manager_proxy_new_for_bus_sync (
218
217
G_BUS_TYPE_SYSTEM,
219
218
G_DBUS_PROXY_FLAGS_NONE,
220
"org.freedesktop.ConsoleKit",
221
"/org/freedesktop/ConsoleKit/Manager",
219
"org.freedesktop.login1",
220
"/org/freedesktop/login1",
224
223
if (error != NULL)
230
229
p->seat = get_seat (self);
233
*** create the consolekit seat proxy...
238
ConsoleKitSeat * proxy = console_kit_seat_proxy_new_for_bus_sync (
240
G_DBUS_PROXY_FLAGS_NONE,
241
"org.freedesktop.ConsoleKit",
248
g_warning ("Failed to connect to the ConsoleKit seat: %s", error->message);
249
g_clear_error (&error);
253
g_signal_connect (proxy, "session-added",
254
G_CALLBACK (on_session_added), self);
255
g_signal_connect (proxy, "session-removed",
256
G_CALLBACK (on_session_removed), self);
257
console_kit_seat_call_get_sessions (proxy, p->cancellable,
258
(GAsyncReadyCallback)on_session_list, self);
259
p->seat_proxy = proxy;
231
g_signal_connect (p->manager_proxy, "session-new",
232
G_CALLBACK (on_session_added), self);
233
g_signal_connect (p->manager_proxy, "session-removed",
234
G_CALLBACK (on_session_removed), self);
236
login1_manager_call_list_sessions (p->manager_proxy, p->cancellable,
237
(GAsyncReadyCallback) on_session_list, self);
264
240
*** create the accounts manager proxy...
314
static ConsoleKitSession*
315
create_consolekit_session_proxy (const char * ssid)
317
GError * error = NULL;
319
ConsoleKitSession * p = console_kit_session_proxy_new_for_bus_sync (
321
G_DBUS_PROXY_FLAGS_NONE,
328
g_warning ("%s: %s", G_STRLOC, error->message);
329
g_error_free (error);
291
create_login1_user_proxy (const char * path)
294
GError * error = NULL;
296
Login1User * p = login1_user_proxy_new_for_bus_sync (
298
G_DBUS_PROXY_FLAGS_NONE,
305
g_warning ("%s: %s", G_STRLOC, error->message);
306
g_error_free (error);
313
create_login1_user_proxy_from_uid (UsersServiceDbus * self,
316
Login1Manager * manager = self->priv->manager_proxy;
317
Login1User * user_proxy = NULL;
318
gchar * user_object_path = NULL;
319
GError * error = NULL;
321
login1_manager_call_get_user_sync (manager, uid, &user_object_path, NULL,
326
g_warning ("%s: %s", G_STRLOC, error->message);
327
g_error_free (error);
330
if (user_object_path != NULL)
331
user_proxy = create_login1_user_proxy (user_object_path);
337
static Login1Session *
338
create_login1_session_proxy (const char * path)
340
GError * error = NULL;
342
Login1Session * p = login1_session_proxy_new_for_bus_sync (
344
G_DBUS_PROXY_FLAGS_NONE,
351
g_warning ("%s: %s", G_STRLOC, error->message);
352
g_error_free (error);
336
get_seat_from_session_proxy (ConsoleKitSession * session_proxy)
360
get_seat_from_session_proxy (Login1Session * session_proxy)
363
GVariant * seatobj = login1_session_get_seat (session_proxy);
340
GError * error = NULL;
341
console_kit_session_call_get_seat_id_sync (session_proxy,
347
g_debug ("%s: %s", G_STRLOC, error->message);
348
g_error_free (error);
365
g_variant_get (seatobj, "(so)", &seat, NULL);
371
get_display_from_session_proxy (Login1Session * session_proxy)
373
const gchar * display;
374
display = login1_session_get_display (session_proxy);
355
379
get_seat (UsersServiceDbus *service)
357
381
gchar * seat = NULL;
359
383
GError * error = NULL;
360
384
UsersServiceDbusPrivate * priv = service->priv;
362
console_kit_manager_call_get_current_session_sync (priv->ck_manager_proxy,
385
Login1Session * session_proxy = NULL;
386
pid_t pid = getpid();
388
login1_manager_call_get_session_by_pid_sync (priv->manager_proxy,
367
395
if (error != NULL)
369
397
g_debug ("%s: %s", G_STRLOC, error->message);
370
398
g_error_free (error);
402
session_proxy = create_login1_session_proxy (path);
374
ConsoleKitSession * session = create_consolekit_session_proxy (ssid);
378
seat = get_seat_from_session_proxy (session);
379
g_object_unref (session);
406
g_debug ("%s: Could't get session proxy object", G_STRLOC);
409
seat = get_seat_from_session_proxy (session_proxy);
412
g_object_unref (session_proxy);
446
477
if (seat && priv->seat && !g_strcmp0 (seat, priv->seat))
448
479
/* does this session have a display? */
449
gchar * display = NULL;
450
console_kit_session_call_get_x11_display_sync (session_proxy,
453
const gboolean has_display = display && *display;
480
const gchar * display = get_display_from_session_proxy (session_proxy);
481
const gboolean has_display = g_strcmp0 ("", display) != 0;
480
507
const char * username = accounts_user_get_user_name (user);
481
508
g_debug ("%s adding %s (%i)", G_STRLOC, username, (int)uid);
483
GError * error = NULL;
484
gchar ** sessions = NULL;
485
console_kit_manager_call_get_sessions_for_unix_user_sync (
486
self->priv->ck_manager_proxy,
510
GVariant * sessions = NULL;
512
Login1User * user_proxy = create_login1_user_proxy_from_uid (self, uid);
514
if (user_proxy != NULL)
494
g_debug ("%s: %s", G_STRLOC, error->message);
495
g_error_free (error);
516
sessions = login1_user_get_sessions (user_proxy);
497
else if (sessions != NULL)
519
if (sessions != NULL)
522
g_variant_iter_init (&iter, sessions);
501
for (i=0; sessions[i]; i++)
526
while (g_variant_iter_loop (&iter, "(so)", &id, &object_path))
503
const char * const ssid = sessions[i];
504
g_debug ("%s adding %s's session %s", G_STRLOC, username, ssid);
505
add_user_session (self, user, ssid);
528
g_debug ("%s adding %s's session %s", G_STRLOC, username, id);
529
add_user_session (self, user, id, object_path);
508
g_strfreev (sessions);
533
g_object_unref (user_proxy);
512
536
/* returns true if this property is one we use */
760
get_unix_username_from_ssid (UsersServiceDbus * self,
785
get_unix_username_from_path (UsersServiceDbus * self,
763
gchar * username = NULL;
765
ConsoleKitSession * session_proxy = create_consolekit_session_proxy (ssid);
789
Login1Session * session_proxy = create_login1_session_proxy (path);
766
790
if (session_proxy != NULL)
769
GError * error = NULL;
770
console_kit_session_call_get_unix_user_sync (session_proxy,
775
g_warning ("%s: %s", G_STRLOC, error->message);
776
g_clear_error (&error);
781
const struct passwd * pwent = getpwuid (uid);
784
g_warning ("Failed to lookup user id %d: %s", (int)uid, g_strerror(errno));
788
username = g_strdup (pwent->pw_name);
792
gchar * username = g_strdup (login1_session_get_name (session_proxy));
794
g_debug ("%s Getting username for %s: %s", G_STRLOC, path, username);
792
796
g_object_unref (session_proxy);
810
818
/* If the new session belongs to 'guest', update our guest_ssid.
811
819
Otherwise, call add_user_session() to update our session tables */
813
on_session_added (ConsoleKitSeat * seat_proxy G_GNUC_UNUSED,
815
UsersServiceDbus * service)
821
on_session_added (Login1Manager * proxy G_GNUC_UNUSED,
824
UsersServiceDbus * service)
817
826
g_return_if_fail (IS_USERS_SERVICE_DBUS(service));
819
gchar * username = get_unix_username_from_ssid (service, ssid);
828
gchar * username = get_unix_username_from_path (service, path);
820
829
g_debug ("%s %s() username %s has new session %s", G_STRLOC, G_STRFUNC, username, ssid);
822
831
if (is_guest_username (username))
835
844
if (user != NULL)
837
add_user_session (service, user, ssid);
846
add_user_session (service, user, ssid, path);
838
847
emit_user_login_changed (service, user);
845
853
/* Receives a list of sessions and calls on_session_added() for each of them */
847
on_session_list (ConsoleKitSeat * seat_proxy,
855
on_session_list (Login1Manager * proxy,
848
856
GAsyncResult * result,
849
857
UsersServiceDbus * self)
851
859
GError * error = NULL;
852
gchar ** sessions = NULL;
853
861
g_debug ("%s bootstrapping the session list", G_STRLOC);
855
console_kit_seat_call_get_sessions_finish (seat_proxy,
863
login1_manager_call_list_sessions_finish (proxy,
860
868
if (error != NULL)
862
870
g_debug ("%s: %s", G_STRLOC, error->message);
863
871
g_error_free (error);
865
else if (sessions != NULL)
869
for (i=0; sessions[i]; i++)
879
g_variant_get (sessions, "a(susso)", &iter);
881
while (g_variant_iter_loop (iter,
871
g_debug ("%s adding initial session '%s'", G_STRLOC, sessions[i]);
872
on_session_added (seat_proxy, sessions[i], self);
889
if (g_strcmp0 (seat, self->priv->seat) == 0)
891
g_debug ("%s adding initial session '%s'", G_STRLOC, path);
892
on_session_added (proxy, seat, path, self);
875
g_strfreev (sessions);
896
g_variant_iter_free (iter);
897
g_variant_unref (sessions);
878
901
g_debug ("%s done bootstrapping the session list", G_STRLOC);
1008
users_service_dbus_can_activate_session (UsersServiceDbus * self)
1010
gboolean can_activate = FALSE;
1012
g_return_val_if_fail (IS_USERS_SERVICE_DBUS(self), can_activate);
1014
GError * error = NULL;
1015
console_kit_seat_call_can_activate_sessions_sync (self->priv->seat_proxy,
1021
g_warning ("%s: %s", G_STRLOC, error->message);
1022
g_error_free (error);
1025
return can_activate;
1029
1031
users_service_dbus_is_guest_logged_in (UsersServiceDbus * self)
1031
1033
g_return_val_if_fail (IS_USERS_SERVICE_DBUS(self), FALSE);