summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2011-09-21 16:25:32 +1000
committerRobert Ancell <robert.ancell@canonical.com>2011-09-21 16:25:32 +1000
commit9f4c03d50831aee9cc30f910edff1376ad93c2a2 (patch)
tree6c05a7fa6c1c406ef48d6bc222a78b2f3a2de72a
parent0983c63074e5c5049194a1fd8f1096590844a318 (diff)
downloadlightdm-9f4c03d50831aee9cc30f910edff1376ad93c2a2.tar.gz
Create 'AddLocalXSeat' D-Bus method, and require root to use 'AddSeat'
-rw-r--r--NEWS1
-rw-r--r--data/org.freedesktop.DisplayManager.conf2
-rw-r--r--src/lightdm.c39
-rw-r--r--utils/dm-tool.c53
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 @@
<!-- Only root can own the service -->
<policy user="root">
<allow own="org.freedesktop.DisplayManager"/>
+ <allow send_destination="org.freedesktop.DisplayManager" send_interface="org.freedesktop.DisplayManager" send_member="AddSeat"/>
</policy>
<policy context="default">
@@ -14,6 +15,7 @@
<allow send_destination="org.freedesktop.DisplayManager" send_interface="org.freedesktop.DisplayManager"/>
<allow send_destination="org.freedesktop.DisplayManager" send_interface="org.freedesktop.DisplayManager.Seat"/>
<allow send_destination="org.freedesktop.DisplayManager" send_interface="org.freedesktop.DisplayManager.Session"/>
+ <deny send_destination="org.freedesktop.DisplayManager" send_interface="org.freedesktop.DisplayManager" send_member="AddSeat"/>
</policy>
</busconfig>
diff --git a/src/lightdm.c b/src/lightdm.c
index 769efa82..ff59a534 100644
--- a/src/lightdm.c
+++ b/src/lightdm.c
@@ -270,6 +270,41 @@ handle_display_manager_call (GDBusConnection *connection,
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;
+
+ 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");
+ }
}
static GVariant *
@@ -565,6 +600,10 @@ bus_acquired_cb (GDBusConnection *connection,
" <arg name='properties' direction='in' type='a(ss)'/>"
" <arg name='seat' direction='out' type='o'/>"
" </method>"
+ " <method name='AddLocalXSeat'>"
+ " <arg name='display-number' direction='in' type='i'/>"
+ " <arg name='seat' direction='out' type='o'/>"
+ " </method>"
" <signal name='SeatAdded'>"
" <arg name='seat' type='o'/>"
" </signal>"
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;