diff options
Diffstat (limited to 'daemon/gdm-session-direct.c')
-rw-r--r-- | daemon/gdm-session-direct.c | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c index e9774869..49705291 100644 --- a/daemon/gdm-session-direct.c +++ b/daemon/gdm-session-direct.c @@ -59,6 +59,8 @@ #include "gdm-session-worker-job.h" #include "gdm-common.h" +#define GDM_DBUS_NAME "org.gnome.DisplayManager" +#define GDM_DBUS_DISPLAY_INTERFACE "org.gnome.DisplayManager.Display" #define GDM_SESSION_DBUS_PATH "/org/gnome/DisplayManager/Session" #define GDM_SESSION_DBUS_INTERFACE "org.gnome.DisplayManager.Session" #define GDM_SESSION_DBUS_ERROR_CANCEL "org.gnome.DisplayManager.Session.Error.Cancel" @@ -101,6 +103,9 @@ struct _GdmSessionDirectPrivate char *display_hostname; char *display_device; char *display_x11_authority_file; + char *display_console_session; + char *display_type; + char *display_seat_id; gboolean display_is_local; char *fallback_session_name; @@ -108,6 +113,7 @@ struct _GdmSessionDirectPrivate DBusServer *server; char *server_address; GHashTable *environment; + DBusGProxy *display_proxy; DBusGConnection *connection; }; @@ -119,7 +125,10 @@ enum { PROP_DISPLAY_IS_LOCAL, PROP_DISPLAY_DEVICE, PROP_DISPLAY_X11_AUTHORITY_FILE, + PROP_DISPLAY_CONSOLE_SESSION, PROP_USER_X11_AUTHORITY_FILE, + PROP_DISPLAY_TYPE, + PROP_DISPLAY_SEAT_ID, }; static void gdm_session_iface_init (GdmSessionIface *iface); @@ -826,6 +835,34 @@ gdm_session_direct_handle_username_changed (GdmSessionDirect *session, return DBUS_HANDLER_RESULT_HANDLED; } +static DBusHandlerResult +gdm_session_direct_handle_display_console_session_updated (GdmSessionDirect *session, + GdmSessionConversation *conversation, + DBusMessage *message) +{ + DBusMessage *reply; + DBusError error; + const char *text; + + dbus_error_init (&error); + if (! dbus_message_get_args (message, &error, + DBUS_TYPE_STRING, &text, + DBUS_TYPE_INVALID)) { + g_warning ("ERROR: %s", error.message); + } + + reply = dbus_message_new_method_return (message); + dbus_connection_send (conversation->worker_connection, reply, NULL); + dbus_message_unref (reply); + + g_debug ("GdmSessionDirect: changing ck session id to '%s'", + text); + + + + return DBUS_HANDLER_RESULT_HANDLED; +} + static void cancel_pending_query (GdmSessionConversation *conversation) { @@ -1279,6 +1316,8 @@ session_worker_message (DBusConnection *connection, return gdm_session_direct_handle_accreditation_failed (session, conversation, message); } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "UsernameChanged")) { return gdm_session_direct_handle_username_changed (session, conversation, message); + } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "DisplayConsoleSessionUpdated")) { + return gdm_session_direct_handle_display_console_session_updated (session, conversation, message); } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "SessionOpened")) { return gdm_session_direct_handle_session_opened (session, conversation, message); } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "OpenFailed")) { @@ -1385,6 +1424,8 @@ do_introspect (DBusConnection *connection, " <signal name=\"Setup\">\n" " <arg name=\"service_name\" type=\"s\"/>\n" " <arg name=\"x11_display_name\" type=\"s\"/>\n" + " <arg name=\"x11_display_type\" type=\"s\"/>\n" + " <arg name=\"x11_display_seat_id\" type=\"s\"/>\n" " <arg name=\"display_device\" type=\"s\"/>\n" " <arg name=\"hostname\" type=\"s\"/>\n" " <arg name=\"x11_authority_file\" type=\"s\"/>\n" @@ -1392,6 +1433,8 @@ do_introspect (DBusConnection *connection, " <signal name=\"SetupForUser\">\n" " <arg name=\"service_name\" type=\"s\"/>\n" " <arg name=\"x11_display_name\" type=\"s\"/>\n" + " <arg name=\"x11_display_type\" type=\"s\"/>\n" + " <arg name=\"x11_seat_id\" type=\"s\"/>\n" " <arg name=\"display_device\" type=\"s\"/>\n" " <arg name=\"hostname\" type=\"s\"/>\n" " <arg name=\"x11_authority_file\" type=\"s\"/>\n" @@ -1922,6 +1965,8 @@ send_setup (GdmSessionDirect *session, DBusMessage *message; DBusMessageIter iter; const char *display_name; + const char *display_type; + const char *display_seat_id; const char *display_device; const char *display_hostname; const char *display_x11_authority_file; @@ -1934,6 +1979,16 @@ send_setup (GdmSessionDirect *session, } else { display_name = ""; } + if (session->priv->display_type != NULL) { + display_type = session->priv->display_type; + } else { + display_type = ""; + } + if (session->priv->display_seat_id!= NULL) { + display_seat_id = session->priv->display_seat_id; + } else { + display_seat_id = ""; + } if (session->priv->display_hostname != NULL) { display_hostname = session->priv->display_hostname; } else { @@ -1959,6 +2014,8 @@ send_setup (GdmSessionDirect *session, dbus_message_iter_init_append (message, &iter); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &service_name); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_name); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_type); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_seat_id); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_device); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_x11_authority_file); @@ -1978,6 +2035,8 @@ send_setup_for_user (GdmSessionDirect *session, DBusMessage *message; DBusMessageIter iter; const char *display_name; + const char *display_type; + const char *display_seat_id; const char *display_device; const char *display_hostname; const char *display_x11_authority_file; @@ -1991,6 +2050,16 @@ send_setup_for_user (GdmSessionDirect *session, } else { display_name = ""; } + if (session->priv->display_type != NULL) { + display_type = session->priv->display_type; + } else { + display_type = ""; + } + if (session->priv->display_seat_id != NULL) { + display_seat_id = session->priv->display_seat_id; + } else { + display_seat_id = ""; + } if (session->priv->display_hostname != NULL) { display_hostname = session->priv->display_hostname; } else { @@ -2021,6 +2090,8 @@ send_setup_for_user (GdmSessionDirect *session, dbus_message_iter_init_append (message, &iter); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &service_name); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_name); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_type); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_seat_id); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_device); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_x11_authority_file); @@ -2600,6 +2671,30 @@ _gdm_session_direct_set_display_x11_authority_file (GdmSessionDirect *session, } static void +_gdm_session_direct_set_display_type (GdmSessionDirect *session, + const char *type) +{ + g_free (session->priv->display_type); + session->priv->display_type = g_strdup (type); +} + +static void +_gdm_session_direct_set_display_seat_id (GdmSessionDirect *session, + const char *sid) +{ + g_free (session->priv->display_seat_id); + session->priv->display_seat_id = g_strdup (sid); +} + +static void +_gdm_session_direct_set_display_console_session (GdmSessionDirect *session, + const char *console_session) +{ + g_free (session->priv->display_console_session); + session->priv->display_console_session = g_strdup (console_session); +} + +static void _gdm_session_direct_set_display_is_local (GdmSessionDirect *session, gboolean is) { @@ -2635,9 +2730,18 @@ gdm_session_direct_set_property (GObject *object, case PROP_DISPLAY_X11_AUTHORITY_FILE: _gdm_session_direct_set_display_x11_authority_file (self, g_value_get_string (value)); break; + case PROP_DISPLAY_CONSOLE_SESSION: + _gdm_session_direct_set_display_console_session (self, g_value_get_string (value)); + break; case PROP_DISPLAY_IS_LOCAL: _gdm_session_direct_set_display_is_local (self, g_value_get_boolean (value)); break; + case PROP_DISPLAY_TYPE: + _gdm_session_direct_set_display_type (self, g_value_get_string (value)); + break; + case PROP_DISPLAY_SEAT_ID: + _gdm_session_direct_set_display_seat_id (self, g_value_get_string (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -2673,9 +2777,18 @@ gdm_session_direct_get_property (GObject *object, case PROP_DISPLAY_X11_AUTHORITY_FILE: g_value_set_string (value, self->priv->display_x11_authority_file); break; + case PROP_DISPLAY_CONSOLE_SESSION: + g_value_set_string (value, self->priv->display_console_session); + break; case PROP_DISPLAY_IS_LOCAL: g_value_set_boolean (value, self->priv->display_is_local); break; + case PROP_DISPLAY_TYPE: + g_value_set_string (value, self->priv->display_type); + break; + case PROP_DISPLAY_SEAT_ID: + g_value_set_string (value, self->priv->display_seat_id); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -2711,6 +2824,12 @@ gdm_session_direct_dispose (GObject *object) g_free (session->priv->server_address); session->priv->server_address = NULL; + g_free (session->priv->display_type); + session->priv->display_type = NULL; + + g_free (session->priv->display_seat_id); + session->priv->display_seat_id = NULL; + if (session->priv->server != NULL) { dbus_server_disconnect (session->priv->server); dbus_server_unref (session->priv->server); @@ -2722,6 +2841,11 @@ gdm_session_direct_dispose (GObject *object) session->priv->environment = NULL; } + if (session->priv->display_proxy != NULL) { + g_object_unref (session->priv->display_proxy); + } + + G_OBJECT_CLASS (gdm_session_direct_parent_class)->dispose (object); } @@ -2872,6 +2996,14 @@ gdm_session_direct_class_init (GdmSessionDirectClass *session_class) "display x11 authority file", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property (object_class, + PROP_DISPLAY_CONSOLE_SESSION, + g_param_spec_string ("display-console-session", + "Display ConsoleKit session", + "The ConsoleKit Session Id for the display", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); /* not construct only */ g_object_class_install_property (object_class, PROP_USER_X11_AUTHORITY_FILE, @@ -2887,11 +3019,140 @@ gdm_session_direct_class_init (GdmSessionDirectClass *session_class) "display device", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_DISPLAY_TYPE, + g_param_spec_string ("display-type", + "display type", + "display type", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, + PROP_DISPLAY_SEAT_ID, + g_param_spec_string ("seat-id", + "seat id", + "seat id", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); dbus_g_object_type_install_info (GDM_TYPE_SESSION_DIRECT, &dbus_glib_gdm_session_direct_object_info); } +static void +display_proxy_destroyed_cb (DBusGProxy *display_proxy, + GdmSessionDirect *session) +{ + g_debug ("GdmSessionDirect: Disconnected from display"); + + session->priv->display_proxy = NULL; +} + +static gboolean +init_display_data (GdmSessionDirect *session) +{ + gboolean res; + char *id; + GError *error; + + g_assert (session->priv->display_proxy == NULL); + + 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); + } + exit (1); + } + + error = NULL; + session->priv->display_proxy = dbus_g_proxy_new_for_name_owner ( + session->priv->connection, + GDM_DBUS_NAME, + session->priv->display_id, + GDM_DBUS_DISPLAY_INTERFACE, + &error); + + g_signal_connect (session->priv->display_proxy, + "destroy", + G_CALLBACK (display_proxy_destroyed_cb), + session); + + if (session->priv->display_proxy == NULL) { + if (error != NULL) { + g_warning ("Failed to create display proxy %s: %s", session->priv->display_id, error->message); + g_error_free (error); + } else { + g_warning ("Unable to create display proxy"); + } + return FALSE; + } + + /* Make sure display ID works */ + error = NULL; + res = dbus_g_proxy_call (session->priv->display_proxy, + "GetId", + &error, + G_TYPE_INVALID, + DBUS_TYPE_G_OBJECT_PATH, &id, + G_TYPE_INVALID); + if (! res) { + if (error != NULL) { + g_warning ("Failed to get display id %s: %s", session->priv->display_id, error->message); + g_error_free (error); + } else { + g_warning ("Failed to get display id %s", session->priv->display_id); + } + + return FALSE; + } + + if (strcmp (id, session->priv->display_id) != 0) { + g_critical ("Display ID doesn't match"); + exit (1); + } + + error = NULL; + res = dbus_g_proxy_call (session->priv->display_proxy, + "GetX11DisplayType", + &error, + G_TYPE_INVALID, + G_TYPE_STRING, &session->priv->display_type, + G_TYPE_INVALID); + if (! res) { + if (error != NULL) { + g_warning ("Failed to get value: %s", error->message); + g_error_free (error); + } else { + g_warning ("Failed to get value"); + } + + return FALSE; + } + + error = NULL; + res = dbus_g_proxy_call (session->priv->display_proxy, + "GetSeatId", + &error, + G_TYPE_INVALID, + G_TYPE_STRING, &session->priv->display_seat_id, + G_TYPE_INVALID); + if (! res) { + if (error != NULL) { + g_warning ("Failed to get value: %s", error->message); + g_error_free (error); + } else { + g_warning ("Failed to get value"); + } + + return FALSE; + } + + return TRUE; +} + + GdmSessionDirect * gdm_session_direct_new (const char *display_id, const char *display_name, @@ -2911,6 +3172,8 @@ gdm_session_direct_new (const char *display_id, "display-is-local", display_is_local, NULL); + init_display_data (session); + return session; } |