From 9f4c03d50831aee9cc30f910edff1376ad93c2a2 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Wed, 21 Sep 2011 16:25:32 +1000 Subject: Create 'AddLocalXSeat' D-Bus method, and require root to use 'AddSeat' --- NEWS | 1 + data/org.freedesktop.DisplayManager.conf | 2 ++ src/lightdm.c | 39 +++++++++++++++++++++++ utils/dm-tool.c | 53 ++++++++++++++++++++++++++------ 4 files changed, 85 insertions(+), 10 deletions(-) diff --git a/NEWS b/NEWS index e51336e4..76aa1dde 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ Overview of changes in lightdm 0.9.8 * Allow TCP/IP connections if xserver-allow-tcp is true * Allow lightdm --version to be run as non-root * Automatically respond to PAM messages without prompts + * Create 'AddLocalXSeat' D-Bus method, and require root to use 'AddSeat' Overview of changes in lightdm 0.9.7 diff --git a/data/org.freedesktop.DisplayManager.conf b/data/org.freedesktop.DisplayManager.conf index 35257d49..66d9f240 100644 --- a/data/org.freedesktop.DisplayManager.conf +++ b/data/org.freedesktop.DisplayManager.conf @@ -6,6 +6,7 @@ + @@ -14,6 +15,7 @@ + diff --git a/src/lightdm.c b/src/lightdm.c index 769efa82..ff59a534 100644 --- a/src/lightdm.c +++ b/src/lightdm.c @@ -260,6 +260,41 @@ handle_display_manager_call (GDBusConnection *connection, return; } + if (display_manager_add_seat (display_manager, seat)) + { + BusEntry *entry; + + entry = g_hash_table_lookup (seat_bus_entries, seat); + g_dbus_method_invocation_return_value (invocation, g_variant_new ("(o)", entry->path)); + } + else// FIXME: Need to make proper error + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Failed to start seat"); + } + else if (g_strcmp0 (method_name, "AddLocalXSeat") == 0) + { + gint display_number; + gchar *display_number_string; + Seat *seat; + + if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(i)"))) + return; + + g_variant_get (parameters, "(i)", &display_number); + + g_debug ("Adding local X seat :%d", display_number); + + seat = seat_new ("xremote"); + display_number_string = g_strdup_printf ("%d", display_number); + seat_set_property (seat, "xserver-display-number", display_number_string); + g_free (display_number_string); + + if (!seat) + { + // FIXME: Need to make proper error + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Unable to create local X seat"); + return; + } + if (display_manager_add_seat (display_manager, seat)) { BusEntry *entry; @@ -565,6 +600,10 @@ bus_acquired_cb (GDBusConnection *connection, " " " " " " + " " + " " + " " + " " " " " " " " diff --git a/utils/dm-tool.c b/utils/dm-tool.c index 0be71e04..ab600a2a 100644 --- a/utils/dm-tool.c +++ b/utils/dm-tool.c @@ -38,24 +38,17 @@ xephyr_setup_cb (gpointer user_data) static void xephyr_signal_cb (int signum) { - gchar *display_number_string, *path; - GVariantBuilder *properties; + gchar *path; GVariant *result; GError *error = NULL; - properties = g_variant_builder_new (G_VARIANT_TYPE ("a(ss)")); - display_number_string = g_strdup_printf ("%d", xephyr_display_number); - g_variant_builder_add_value (properties, g_variant_new ("(ss)", "xserver-display-number", display_number_string)); - g_free (display_number_string); - result = g_dbus_proxy_call_sync (dm_proxy, - "AddSeat", - g_variant_new ("(sa(ss))", "xremote", properties), + "AddLocalXSeat", + g_variant_new ("(i)", xephyr_display_number), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); - g_variant_builder_unref (properties); if (!result) { g_printerr ("Unable to add seat: %s\n", error->message); @@ -110,6 +103,7 @@ main (int argc, char **argv) " switch-to-guest [SESSION] Switch to a guest session\n" " list-seats List the active seats\n" " add-nested-seat Start a nested display\n" + " add-local-x-seat DISPLAY_NUMBER Add a local X seat\n" " add-seat TYPE [NAME=VALUE...] Add a dynamic seat\n"); return EXIT_SUCCESS; } @@ -399,6 +393,45 @@ main (int argc, char **argv) loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); } + else if (strcmp (command, "add-local-x-seat") == 0) + { + GVariant *result; + gint display_number; + const gchar *path; + + if (n_options != 1) + { + g_printerr ("Usage add-seat DISPLAY_NUMBER\n"); + usage (); + return EXIT_FAILURE; + } + + display_number = atoi (options[0]); + + result = g_dbus_proxy_call_sync (dm_proxy, + "AddLocalXSeat", + g_variant_new ("(i)", display_number), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (!result) + { + g_printerr ("Unable to add local X seat: %s\n", error->message); + return EXIT_FAILURE; + } + + if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(o)"))) + { + g_printerr ("Unexpected response to AddLocalXSeat: %s\n", g_variant_get_type_string (result)); + return EXIT_FAILURE; + } + + g_variant_get (result, "(&o)", &path); + g_print ("%s\n", path); + + return EXIT_SUCCESS; + } else if (strcmp (command, "add-seat") == 0) { GVariant *result; -- cgit v1.2.1