summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2009-06-16 14:05:33 -0400
committerRay Strode <rstrode@redhat.com>2009-08-03 15:50:57 -0400
commit87d99932e037456ffb6295a40a0609eebebd83ad (patch)
tree9e42e364ffa9b47446681fcdacd6a48aec0d0f28
parenta9788c2f3b0287697811351146be5313a7c0a810 (diff)
downloadgdm-87d99932e037456ffb6295a40a0609eebebd83ad.tar.gz
Pass session id from SessionToAdd to OpenSession
When ConsoleKit requests the display manager open a session with the "SessionToAdd" signal, it needs to get told during the OpenSession call which session is getting opened.
-rw-r--r--common/gdm-marshal.list2
-rw-r--r--daemon/ck-connector.c1
-rw-r--r--daemon/gdm-display.c38
-rw-r--r--daemon/gdm-display.h3
-rw-r--r--daemon/gdm-display.xml3
-rw-r--r--daemon/gdm-factory-slave.c4
-rw-r--r--daemon/gdm-greeter-session.c2
-rw-r--r--daemon/gdm-greeter-session.h1
-rw-r--r--daemon/gdm-local-display-factory.c10
-rw-r--r--daemon/gdm-simple-slave.c4
-rw-r--r--daemon/gdm-slave.c41
-rw-r--r--daemon/gdm-welcome-session.c31
12 files changed, 136 insertions, 4 deletions
diff --git a/common/gdm-marshal.list b/common/gdm-marshal.list
index 97a7facd..a15b076b 100644
--- a/common/gdm-marshal.list
+++ b/common/gdm-marshal.list
@@ -5,4 +5,4 @@ VOID:STRING,STRING
VOID:UINT,UINT
VOID:STRING,INT
VOID:DOUBLE
-VOID:BOOLEAN,STRING,POINTER,STRING,POINTER
+VOID:STRING,BOOLEAN,STRING,POINTER,STRING,POINTER
diff --git a/daemon/ck-connector.c b/daemon/ck-connector.c
index 6f966137..9fb933ba 100644
--- a/daemon/ck-connector.c
+++ b/daemon/ck-connector.c
@@ -77,6 +77,7 @@ static struct {
{ "x11-display-device", DBUS_TYPE_STRING },
{ "x11-display", DBUS_TYPE_STRING },
{ "seat-id", DBUS_TYPE_STRING },
+ { "session", DBUS_TYPE_STRING },
{ "remote-host-name", DBUS_TYPE_STRING },
{ "session-type", DBUS_TYPE_STRING },
{ "is-local", DBUS_TYPE_BOOLEAN },
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index 45521ad5..0264dedc 100644
--- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c
@@ -51,6 +51,7 @@ static guint32 display_serial = 1;
struct GdmDisplayPrivate
{
char *id;
+ char *session_id;
char *seat_id;
char *remote_hostname;
@@ -81,6 +82,7 @@ enum {
PROP_ID,
PROP_STATUS,
PROP_SEAT_ID,
+ PROP_SESSION_ID,
PROP_X11_COMMAND,
PROP_REMOTE_HOSTNAME,
PROP_X11_DISPLAY_NUMBER,
@@ -496,6 +498,20 @@ gdm_display_get_seat_id (GdmDisplay *display,
return TRUE;
}
+gboolean
+gdm_display_get_session_id (GdmDisplay *display,
+ char **session_id,
+ GError **error)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ if (session_id != NULL) {
+ *session_id = g_strdup (display->priv->session_id);
+ }
+
+ return TRUE;
+}
+
static gboolean
finish_idle (GdmDisplay *display)
{
@@ -845,6 +861,14 @@ _gdm_display_set_seat_id (GdmDisplay *display,
}
static void
+_gdm_display_set_session_id (GdmDisplay *display,
+ const char *session_id)
+{
+ g_free (display->priv->session_id);
+ display->priv->session_id = g_strdup (session_id);
+}
+
+static void
_gdm_display_set_remote_hostname (GdmDisplay *display,
const char *hostname)
{
@@ -927,6 +951,9 @@ gdm_display_set_property (GObject *object,
case PROP_SEAT_ID:
_gdm_display_set_seat_id (self, g_value_get_string (value));
break;
+ case PROP_SESSION_ID:
+ _gdm_display_set_session_id (self, g_value_get_string (value));
+ break;
case PROP_REMOTE_HOSTNAME:
_gdm_display_set_remote_hostname (self, g_value_get_string (value));
break;
@@ -980,6 +1007,9 @@ gdm_display_get_property (GObject *object,
case PROP_SEAT_ID:
g_value_set_string (value, self->priv->seat_id);
break;
+ case PROP_SESSION_ID:
+ g_value_set_string (value, self->priv->session_id);
+ break;
case PROP_REMOTE_HOSTNAME:
g_value_set_string (value, self->priv->remote_hostname);
break;
@@ -1161,6 +1191,13 @@ gdm_display_class_init (GdmDisplayClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class,
+ PROP_SESSION_ID,
+ g_param_spec_string ("session-id",
+ "session id",
+ "session id",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
PROP_X11_COOKIE,
g_param_spec_string ("x11-cookie",
"cookie",
@@ -1243,6 +1280,7 @@ gdm_display_finalize (GObject *object)
g_free (display->priv->id);
g_free (display->priv->x11_command);
g_free (display->priv->seat_id);
+ g_free (display->priv->session_id);
g_free (display->priv->remote_hostname);
g_free (display->priv->x11_display_name);
g_free (display->priv->x11_cookie);
diff --git a/daemon/gdm-display.h b/daemon/gdm-display.h
index 6f240bbb..fffc1956 100644
--- a/daemon/gdm-display.h
+++ b/daemon/gdm-display.h
@@ -117,6 +117,9 @@ gboolean gdm_display_get_x11_display_name (GdmDisplay *disp
gboolean gdm_display_get_seat_id (GdmDisplay *display,
char **seat_id,
GError **error);
+gboolean gdm_display_get_session_id (GdmDisplay *display,
+ char **session_id,
+ GError **error);
gboolean gdm_display_is_local (GdmDisplay *display,
gboolean *local,
GError **error);
diff --git a/daemon/gdm-display.xml b/daemon/gdm-display.xml
index 894d5c01..c8bd803d 100644
--- a/daemon/gdm-display.xml
+++ b/daemon/gdm-display.xml
@@ -22,6 +22,9 @@
<method name="GetSeatId">
<arg name="seat_id" direction="out" type="s"/>
</method>
+ <method name="GetSessionId">
+ <arg name="session_id" direction="out" type="s"/>
+ </method>
<method name="GetRemoteHostname">
<arg name="hostname" direction="out" type="s"/>
</method>
diff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c
index f5fe731b..5cbcd742 100644
--- a/daemon/gdm-factory-slave.c
+++ b/daemon/gdm-factory-slave.c
@@ -462,6 +462,7 @@ run_greeter (GdmFactorySlave *slave)
char *display_id;
char *display_name;
char *seat_id;
+ char *session_id;
char *display_device;
char *display_hostname;
char *auth_file;
@@ -474,6 +475,7 @@ run_greeter (GdmFactorySlave *slave)
display_id = NULL;
display_name = NULL;
seat_id = NULL;
+ session_id = NULL;
auth_file = NULL;
display_device = NULL;
display_hostname = NULL;
@@ -484,6 +486,7 @@ run_greeter (GdmFactorySlave *slave)
"display-id", &display_id,
"display-name", &display_name,
"seat-id", &seat_id,
+ "session-id", &session_id,
"display-hostname", &display_hostname,
"display-x11-authority-file", &auth_file,
NULL);
@@ -541,6 +544,7 @@ run_greeter (GdmFactorySlave *slave)
g_debug ("GdmFactorySlave: Creating greeter on %s %s", display_name, display_device);
slave->priv->greeter = gdm_greeter_session_new (display_name,
seat_id,
+ session_id,
display_device,
display_hostname,
display_is_local,
diff --git a/daemon/gdm-greeter-session.c b/daemon/gdm-greeter-session.c
index eaec1c9e..073994b1 100644
--- a/daemon/gdm-greeter-session.c
+++ b/daemon/gdm-greeter-session.c
@@ -141,6 +141,7 @@ gdm_greeter_session_finalize (GObject *object)
GdmGreeterSession *
gdm_greeter_session_new (const char *display_name,
const char *seat_id,
+ const char *session_id,
const char *display_device,
const char *display_hostname,
gboolean display_is_local,
@@ -156,6 +157,7 @@ gdm_greeter_session_new (const char *display_name,
"register-ck-session", TRUE,
"x11-display-name", display_name,
"x11-display-seat-id", seat_id,
+ "x11-display-session-id", session_id,
"x11-display-device", display_device,
"x11-display-hostname", display_hostname,
"x11-display-is-local", display_is_local,
diff --git a/daemon/gdm-greeter-session.h b/daemon/gdm-greeter-session.h
index 284ae247..aa111884 100644
--- a/daemon/gdm-greeter-session.h
+++ b/daemon/gdm-greeter-session.h
@@ -51,6 +51,7 @@ typedef struct
GType gdm_greeter_session_get_type (void);
GdmGreeterSession * gdm_greeter_session_new (const char *display_name,
const char *seat_id,
+ const char *session_id,
const char *display_device,
const char *display_hostname,
gboolean display_is_local,
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index e2536b75..5fc1b897 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -481,6 +481,7 @@ strrep (char* in, char** out, char* old, char* new)
static void
seat_session_to_add (DBusGProxy *seat_proxy,
+ const char *ssid,
gboolean is_dynamic,
const char *type,
GHashTable *display_variables,
@@ -562,6 +563,8 @@ seat_session_to_add (DBusGProxy *seat_proxy,
return;
}
+ g_object_set (display, "session-id", ssid, NULL);
+
sid = dbus_g_proxy_get_path (seat_proxy);
if (IS_STR_SET (sid))
g_object_set (display, "seat-id", sid, NULL);
@@ -625,15 +628,16 @@ manage_static_sessions_per_seat (GdmLocalDisplayFactory *factory,
return;
}
- dbus_g_object_register_marshaller (gdm_marshal_VOID__BOOLEAN_STRING_POINTER_STRING_POINTER,
+ dbus_g_object_register_marshaller (gdm_marshal_VOID__STRING_BOOLEAN_STRING_POINTER_STRING_POINTER,
G_TYPE_NONE,
- G_TYPE_BOOLEAN, G_TYPE_STRING,
+ G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING,
GDM_DBUS_TYPE_G_STRING_STRING_HASHTABLE,
G_TYPE_STRING,
GDM_DBUS_TYPE_G_STRING_STRING_HASHTABLE,
G_TYPE_INVALID);
dbus_g_proxy_add_signal (proxy,
"SessionToAdd",
+ G_TYPE_STRING,
G_TYPE_BOOLEAN,
G_TYPE_STRING,
GDM_DBUS_TYPE_G_STRING_STRING_HASHTABLE,
@@ -642,7 +646,7 @@ manage_static_sessions_per_seat (GdmLocalDisplayFactory *factory,
G_TYPE_INVALID);
dbus_g_proxy_add_signal (proxy,
"SessionToRemove",
- G_TYPE_INT,
+ G_TYPE_STRING,
G_TYPE_INVALID);
dbus_g_proxy_connect_signal (proxy,
"SessionToAdd",
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index e15cb9ca..0f2bd542 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -869,6 +869,7 @@ start_greeter (GdmSimpleSlave *slave)
char *display_id;
char *display_name;
char *seat_id;
+ char *session_id;
char *display_device;
char *display_hostname;
char *auth_file;
@@ -882,6 +883,7 @@ start_greeter (GdmSimpleSlave *slave)
display_id = NULL;
display_name = NULL;
seat_id = NULL;
+ session_id = NULL;
auth_file = NULL;
display_device = NULL;
display_hostname = NULL;
@@ -892,6 +894,7 @@ start_greeter (GdmSimpleSlave *slave)
"display-is-dynamic", &display_is_dynamic,
"display-name", &display_name,
"display-seat-id", &seat_id,
+ "display-session-id", &session_id,
"display-hostname", &display_hostname,
"display-x11-authority-file", &auth_file,
NULL);
@@ -974,6 +977,7 @@ start_greeter (GdmSimpleSlave *slave)
g_debug ("GdmSimpleSlave: Creating greeter on %s %s %s", display_name, display_device, display_hostname);
slave->priv->greeter = gdm_greeter_session_new (display_name,
seat_id,
+ session_id,
display_device,
display_hostname,
display_is_local,
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index 13864b77..e77a11cf 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -85,6 +85,7 @@ struct GdmSlavePrivate
gboolean display_is_dynamic;
gboolean display_is_parented;
char *display_seat_id;
+ char *display_session_id;
char *display_x11_authority_file;
char *parent_display_name;
char *parent_display_x11_authority_file;
@@ -104,6 +105,7 @@ enum {
PROP_DISPLAY_IS_LOCAL,
PROP_DISPLAY_IS_DYNAMIC,
PROP_DISPLAY_SEAT_ID,
+ PROP_DISPLAY_SESSION_ID,
PROP_DISPLAY_X11_AUTHORITY_FILE
};
@@ -675,6 +677,24 @@ gdm_slave_real_start (GdmSlave *slave)
return FALSE;
}
+ error = NULL;
+ res = dbus_g_proxy_call (slave->priv->display_proxy,
+ "GetSessionId",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &slave->priv->display_session_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;
}
@@ -1231,6 +1251,14 @@ _gdm_slave_set_display_seat_id (GdmSlave *slave,
}
static void
+_gdm_slave_set_display_session_id (GdmSlave *slave,
+ const char *id)
+{
+ g_free (slave->priv->display_session_id);
+ slave->priv->display_session_id = g_strdup (id);
+}
+
+static void
_gdm_slave_set_display_is_local (GdmSlave *slave,
gboolean is)
{
@@ -1270,6 +1298,9 @@ gdm_slave_set_property (GObject *object,
case PROP_DISPLAY_SEAT_ID:
_gdm_slave_set_display_seat_id (self, g_value_get_string (value));
break;
+ case PROP_DISPLAY_SESSION_ID:
+ _gdm_slave_set_display_session_id (self, g_value_get_string (value));
+ break;
case PROP_DISPLAY_X11_AUTHORITY_FILE:
_gdm_slave_set_display_x11_authority_file (self, g_value_get_string (value));
break;
@@ -1311,6 +1342,9 @@ gdm_slave_get_property (GObject *object,
case PROP_DISPLAY_SEAT_ID:
g_value_set_string (value, self->priv->display_seat_id);
break;
+ case PROP_DISPLAY_SESSION_ID:
+ g_value_set_string (value, self->priv->display_session_id);
+ break;
case PROP_DISPLAY_X11_AUTHORITY_FILE:
g_value_set_string (value, self->priv->display_x11_authority_file);
break;
@@ -1431,6 +1465,13 @@ gdm_slave_class_init (GdmSlaveClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
+ PROP_DISPLAY_SESSION_ID,
+ g_param_spec_string ("display-session-id",
+ "",
+ "",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
PROP_DISPLAY_X11_AUTHORITY_FILE,
g_param_spec_string ("display-x11-authority-file",
"",
diff --git a/daemon/gdm-welcome-session.c b/daemon/gdm-welcome-session.c
index 14558c13..f8f52166 100644
--- a/daemon/gdm-welcome-session.c
+++ b/daemon/gdm-welcome-session.c
@@ -66,6 +66,7 @@ struct GdmWelcomeSessionPrivate
char *x11_display_name;
char *x11_display_seat_id;
+ char *x11_display_session_id;
char *x11_display_device;
char *x11_display_hostname;
char *x11_authority_file;
@@ -88,6 +89,7 @@ enum {
PROP_0,
PROP_X11_DISPLAY_NAME,
PROP_X11_DISPLAY_SEAT_ID,
+ PROP_X11_DISPLAY_SESSION_ID,
PROP_X11_DISPLAY_DEVICE,
PROP_X11_DISPLAY_HOSTNAME,
PROP_X11_AUTHORITY_FILE,
@@ -138,6 +140,7 @@ open_welcome_session (GdmWelcomeSession *welcome_session)
const char *hostname;
const char *x11_display_device;
const char *seat_id;
+ const char *session_id;
int res;
gboolean ret;
DBusError error;
@@ -179,6 +182,12 @@ open_welcome_session (GdmWelcomeSession *welcome_session)
seat_id = "";
}
+ if (welcome_session->priv->x11_display_session_id != NULL) {
+ session_id = welcome_session->priv->x11_display_session_id;
+ } else {
+ session_id = "";
+ }
+
g_debug ("GdmWelcomeSession: Opening ConsoleKit session for user:%d x11-display:'%s' x11-display-device:'%s' remote-host-name:'%s' is-local:%d is-dynamic:%d",
pwent->pw_uid,
welcome_session->priv->x11_display_name,
@@ -194,6 +203,7 @@ open_welcome_session (GdmWelcomeSession *welcome_session)
"session-type", &session_type,
"x11-display", &welcome_session->priv->x11_display_name,
"seat-id", &seat_id,
+ "session", &session_id,
"x11-display-device", &x11_display_device,
"remote-host-name", &hostname,
"is-local", &welcome_session->priv->x11_display_is_local,
@@ -902,6 +912,14 @@ _gdm_welcome_session_set_x11_display_seat_id (GdmWelcomeSession *welcome_session
}
static void
+_gdm_welcome_session_set_x11_display_session_id (GdmWelcomeSession *welcome_session,
+ const char *ssid)
+{
+ g_free (welcome_session->priv->x11_display_session_id);
+ welcome_session->priv->x11_display_session_id = g_strdup (ssid);
+}
+
+static void
_gdm_welcome_session_set_x11_display_hostname (GdmWelcomeSession *welcome_session,
const char *name)
{
@@ -1011,6 +1029,9 @@ gdm_welcome_session_set_property (GObject *object,
case PROP_X11_DISPLAY_SEAT_ID:
_gdm_welcome_session_set_x11_display_seat_id (self, g_value_get_string (value));
break;
+ case PROP_X11_DISPLAY_SESSION_ID:
+ _gdm_welcome_session_set_x11_display_session_id (self, g_value_get_string (value));
+ break;
case PROP_X11_DISPLAY_HOSTNAME:
_gdm_welcome_session_set_x11_display_hostname (self, g_value_get_string (value));
break;
@@ -1073,6 +1094,9 @@ gdm_welcome_session_get_property (GObject *object,
case PROP_X11_DISPLAY_SEAT_ID:
g_value_set_string (value, self->priv->x11_display_seat_id);
break;
+ case PROP_X11_DISPLAY_SESSION_ID:
+ g_value_set_string (value, self->priv->x11_display_session_id);
+ break;
case PROP_X11_DISPLAY_HOSTNAME:
g_value_set_string (value, self->priv->x11_display_hostname);
break;
@@ -1159,6 +1183,13 @@ gdm_welcome_session_class_init (GdmWelcomeSessionClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
+ PROP_X11_DISPLAY_SESSION_ID,
+ g_param_spec_string ("x11-display-session-id",
+ "session id",
+ "session id",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
PROP_X11_DISPLAY_HOSTNAME,
g_param_spec_string ("x11-display-hostname",
"hostname",