summaryrefslogtreecommitdiff
path: root/daemon/gdm-session-direct.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/gdm-session-direct.c')
-rw-r--r--daemon/gdm-session-direct.c263
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;
}