summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Campagna <gcampagna@src.gnome.org>2012-05-07 18:58:11 +0200
committerGiovanni Campagna <gcampagna@src.gnome.org>2012-05-18 16:12:44 +0200
commit6c5255e60a58b08d1f018040357216ca0affc77c (patch)
tree974d0fa507f2c6968ed1c0d79634d5d2840e908a
parente177962d33a480e401b0b70fb35ea3224516c654 (diff)
downloadgdm-6c5255e60a58b08d1f018040357216ca0affc77c.tar.gz
Continue porting GdmFactorySlave / GdmProductSlave to GDBus
This commit tackles the GdmSession infrastructure, trying to consolidate GdmSessionRelay and GdmSessionDirect into a single generated class. For now, only GdmSessionRelay is ported (both client and server side).
-rw-r--r--daemon/Makefile.am28
-rw-r--r--daemon/gdm-factory-slave.c533
-rw-r--r--daemon/gdm-product-slave.c918
-rw-r--r--daemon/gdm-session-relay.c1299
-rw-r--r--daemon/gdm-session-relay.h64
-rw-r--r--daemon/gdm-session.xml160
6 files changed, 764 insertions, 2238 deletions
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index 22266316..945e91dd 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -42,10 +42,10 @@ BUILT_SOURCES = \
gdm-static-display-glue.h \
gdm-transient-display-glue.h \
gdm-local-display-factory-glue.h \
- gdm-local-display-factory-glue.c \
gdm-product-display-glue.h \
gdm-slave-resources.h \
gdm-greeter-glue.h \
+ gdm-session-glue.h \
$(NULL)
gdm-manager-glue.h: gdm-manager.xml Makefile.am
@@ -73,8 +73,12 @@ gdm-static-display-glue.h: gdm-static-display.xml Makefile.am
gdm-transient-display-glue.h: gdm-transient-display.xml Makefile.am
dbus-binding-tool --prefix=gdm_transient_display --mode=glib-server --output=gdm-transient-display-glue.h $(srcdir)/gdm-transient-display.xml
-gdm-product-display-glue.h: gdm-product-display.xml Makefile.am
- dbus-binding-tool --prefix=gdm_product_display --mode=glib-server --output=gdm-product-display-glue.h $(srcdir)/gdm-product-display.xml
+gdm-product-display-glue.c gdm-product-display-glue.h: gdm-product-display.xml Makefile.am
+ gdbus-codegen \
+ --c-namespace=GdmDBus \
+ --interface-prefix=org.gnome.DisplayManager \
+ --generate-c-code=gdm-product-display-glue \
+ $(srcdir)/gdm-product-display.xml
gdm-local-display-factory-glue.c gdm-local-display-factory-glue.h : gdm-local-display-factory.xml Makefile.am
gdbus-codegen \
@@ -83,6 +87,13 @@ gdm-local-display-factory-glue.c gdm-local-display-factory-glue.h : gdm-local-di
--generate-c-code=gdm-local-display-factory-glue \
$(srcdir)/gdm-local-display-factory.xml
+gdm-session-glue.c gdm-session-glue.h : gdm-session.xml Makefile.am
+ gdbus-codegen \
+ --c-namespace=GdmDBus \
+ --interface-prefix=org.gnome.DisplayManager \
+ --generate-c-code=gdm-session-glue \
+ $(srcdir)/gdm-session.xml
+
gdm-greeter-glue.c gdm-greeter-glue.h : gdm-greeter-server.xml Makefile.am
gdbus-codegen \
--c-namespace=GdmDBus \
@@ -192,8 +203,6 @@ gdm_factory_slave_SOURCES = \
gdm-session-private.h \
gdm-session-record.c \
gdm-session-record.h \
- gdm-session-relay.c \
- gdm-session-relay.h \
gdm-session-worker-job.c \
gdm-session-worker-job.h \
gdm-xerrors.h \
@@ -211,6 +220,8 @@ nodist_gdm_factory_slave_SOURCES = \
gdm-greeter-glue.h \
gdm-local-display-factory-glue.h \
gdm-local-display-factory-glue.c \
+ gdm-session-glue.c \
+ gdm-session-glue.h \
$(NULL)
gdm_factory_slave_LDFLAGS = \
@@ -246,6 +257,13 @@ gdm_product_slave_SOURCES = \
gdm-product-slave.h \
$(NULL)
+nodist_gdm_product_slave_SOURCES = \
+ gdm-product-display-glue.c \
+ gdm-product-display-glue.h \
+ gdm-session-glue.c \
+ gdm-session-glue.h \
+ $(NULL)
+
gdm_product_slave_LDFLAGS = \
$(PAM_LIBS) \
$(LIBXKLAVIER_LIBS) \
diff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c
index 1c5dfdd1..cdaae3a1 100644
--- a/daemon/gdm-factory-slave.c
+++ b/daemon/gdm-factory-slave.c
@@ -47,9 +47,9 @@
#include "gdm-greeter-session.h"
#include "gdm-greeter-server.h"
-#include "gdm-session-relay.h"
-
+#include "gdm-session-glue.h"
#include "gdm-local-display-factory-glue.h"
+#include "gdm-dbus-util.h"
extern char **environ;
@@ -71,8 +71,12 @@ struct GdmFactorySlavePrivate
Display *server_display;
guint connection_attempts;
+ GHashTable *pending_queries;
+
+ GdmDBusSession *session;
+ GDBusServer *session_server;
+
GdmServer *server;
- GdmSessionRelay *session;
GdmGreeterServer *greeter_server;
GdmGreeterSession *greeter;
GdmDBusLocalDisplayFactory *factory_proxy;
@@ -139,150 +143,197 @@ on_greeter_session_died (GdmGreeterSession *greeter,
}
-static void
-on_session_info (GdmSession *session,
- const char *service_name,
- const char *text,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_info (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ const char *text,
+ GdmFactorySlave *slave)
{
g_debug ("GdmFactorySlave: Info: %s", text);
gdm_greeter_server_info (slave->priv->greeter_server, service_name, text);
+
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_problem (GdmSession *session,
- const char *service_name,
- const char *text,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_problem (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ const char *text,
+ GdmFactorySlave *slave)
{
g_debug ("GdmFactorySlave: Problem: %s", text);
gdm_greeter_server_problem (slave->priv->greeter_server, service_name, text);
+
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_info_query (GdmSession *session,
- const char *service_name,
- const char *text,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_info_query (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ const char *text,
+ GdmFactorySlave *slave)
{
+ GDBusMethodInvocation *previous;
g_debug ("GdmFactorySlave: Info query: %s", text);
+
+ if ((previous = g_hash_table_lookup (slave->priv->pending_queries, service_name))) {
+ g_dbus_method_invocation_return_dbus_error (invocation,
+ "org.gnome.DisplayManager.SessionRelayCancelled",
+ "Cancelled by another request for the same service");
+ }
+
+ g_hash_table_replace (slave->priv->pending_queries, g_strdup (service_name), g_object_ref (invocation));
gdm_greeter_server_info_query (slave->priv->greeter_server, service_name, text);
+
+ return TRUE;
}
-static void
-on_session_secret_info_query (GdmSession *session,
- const char *service_name,
- const char *text,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_secret_info_query (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ const char *text,
+ GdmFactorySlave *slave)
{
+ GDBusMethodInvocation *previous;
+
g_debug ("GdmFactorySlave: Secret info query: %s", text);
+
+ if ((previous = g_hash_table_lookup (slave->priv->pending_queries, service_name))) {
+ g_dbus_method_invocation_return_dbus_error (invocation,
+ "org.gnome.DisplayManager.SessionRelayCancelled",
+ "Cancelled by another request for the same service");
+ }
+
+ g_hash_table_replace (slave->priv->pending_queries, g_strdup (service_name), g_object_ref (invocation));
gdm_greeter_server_secret_info_query (slave->priv->greeter_server, service_name, text);
+
+ return TRUE;
}
-static void
-on_session_conversation_started (GdmSession *session,
- const char *service_name,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_conversation_started (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ GdmFactorySlave *slave)
{
g_debug ("GdmFactorySlave: session conversation started");
gdm_greeter_server_ready (slave->priv->greeter_server,
service_name);
+
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_setup_complete (GdmSession *session,
- const char *service_name,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_setup_complete (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ GdmFactorySlave *slave)
{
- gdm_session_authenticate (session, service_name);
+ gdm_dbus_session_emit_authenticate (session, service_name);
+
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_setup_failed (GdmSession *session,
- const char *service_name,
- const char *message,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_setup_failed (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ const char *message,
+ GdmFactorySlave *slave)
{
gdm_greeter_server_problem (slave->priv->greeter_server, service_name, _("Unable to initialize login system"));
queue_greeter_reset (slave);
-}
-static void
-on_session_reset_complete (GdmSession *session,
- GdmFactorySlave *slave)
-{
- g_debug ("GdmFactorySlave: PAM reset");
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_reset_failed (GdmSession *session,
- const char *message,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_authenticated (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ GdmFactorySlave *slave)
{
- g_critical ("Unable to reset PAM");
-}
+ gdm_dbus_session_emit_authorize (session, service_name);
-static void
-on_session_authenticated (GdmSession *session,
- const char *service_name,
- GdmFactorySlave *slave)
-{
- gdm_session_authorize (session, service_name);
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_authentication_failed (GdmSession *session,
- const char *service_name,
- const char *message,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_authentication_failed (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ const char *message,
+ GdmFactorySlave *slave)
{
gdm_greeter_server_problem (slave->priv->greeter_server, service_name, _("Unable to authenticate user"));
queue_greeter_reset (slave);
+
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_authorized (GdmSession *session,
- const char *service_name,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_authorized (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ GdmFactorySlave *slave)
{
- int flag;
-
/* FIXME: check for migration? */
- flag = GDM_SESSION_CRED_ESTABLISH;
+ gdm_dbus_session_emit_establish_credentials (session, service_name);
- gdm_session_accredit (session, service_name, flag);
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_authorization_failed (GdmSession *session,
- const char *service_name,
- const char *message,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_authorization_failed (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ const char *message,
+ GdmFactorySlave *slave)
{
gdm_greeter_server_problem (slave->priv->greeter_server, service_name, _("Unable to authorize user"));
queue_greeter_reset (slave);
+
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_accredited (GdmSession *session,
- const char *service_name,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_accredited (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ GdmFactorySlave *slave)
{
g_debug ("GdmFactorySlave: session user verified");
- gdm_session_open_session (session, service_name);
+ gdm_dbus_session_emit_open_session (session, service_name);
+
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_accreditation_failed (GdmSession *session,
- const char *service_name,
- const char *message,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_accreditation_failed (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ const char *message,
+ GdmFactorySlave *slave)
{
g_debug ("GdmFactorySlave: could not successfully authenticate user: %s",
message);
@@ -290,48 +341,65 @@ on_session_accreditation_failed (GdmSession *session,
gdm_greeter_server_problem (slave->priv->greeter_server, service_name, _("Unable to establish credentials"));
queue_greeter_reset (slave);
+
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_opened (GdmSession *session,
- const char *service_name,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_opened (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ GdmFactorySlave *slave)
{
g_debug ("GdmFactorySlave: session opened");
- gdm_session_start_session (session, service_name);
+ gdm_dbus_session_emit_start_session (session, service_name);
gdm_greeter_server_reset (slave->priv->greeter_server);
+
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_open_failed (GdmSession *session,
- const char *service_name,
- const char *message,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_open_failed (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ const char *message,
+ GdmFactorySlave *slave)
{
g_debug ("GdmFactorySlave: could not open session: %s", message);
gdm_greeter_server_problem (slave->priv->greeter_server, service_name, _("Unable to open session"));
queue_greeter_reset (slave);
+
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
-static void
-on_session_session_started (GdmSession *session,
- int pid,
- GdmFactorySlave *slave)
+static gboolean
+on_session_handle_session_started (GdmDBusSession *session,
+ GDBusMethodInvocation *invocation,
+ const char *service_name,
+ int pid,
+ const char **environment,
+ GdmFactorySlave *slave)
{
g_debug ("GdmFactorySlave: Relay session started");
gdm_greeter_server_reset (slave->priv->greeter_server);
+
+ g_dbus_method_invocation_return_value (invocation, NULL);
+ return TRUE;
}
static gboolean
create_product_display (GdmFactorySlave *slave)
{
char *parent_display_id;
- char *server_address;
+ const char *server_address;
char *product_id;
GError *error = NULL;
gboolean res;
@@ -354,7 +422,7 @@ create_product_display (GdmFactorySlave *slave)
goto out;
}
- server_address = gdm_session_relay_get_address (slave->priv->session);
+ server_address = g_dbus_server_get_client_address (slave->priv->session_server);
g_object_get (slave,
"display-id", &parent_display_id,
@@ -365,7 +433,6 @@ create_product_display (GdmFactorySlave *slave)
server_address,
&product_id,
NULL, &error);
- g_free (server_address);
g_free (parent_display_id);
if (! res) {
@@ -385,21 +452,18 @@ create_product_display (GdmFactorySlave *slave)
}
static void
-on_session_relay_disconnected (GdmSessionRelay *session,
- GdmFactorySlave *slave)
+on_session_connection_closed (GDBusConnection *connection,
+ gboolean remote_peer_vanished,
+ GdmFactorySlave *slave)
{
g_debug ("GdmFactorySlave: Relay disconnected");
/* FIXME: do some kind of loop detection */
gdm_greeter_server_reset (slave->priv->greeter_server);
create_product_display (slave);
-}
-static void
-on_session_relay_connected (GdmSessionRelay *session,
- GdmFactorySlave *slave)
-{
- g_debug ("GdmFactorySlave: Relay Connected");
+ /* pair the reference added in handle_new_connection */
+ g_object_unref (connection);
}
static void
@@ -409,7 +473,7 @@ on_greeter_start_conversation (GdmGreeterServer *greeter_server,
{
g_debug ("GdmFactorySlave: start conversation");
- gdm_session_start_conversation (GDM_SESSION (slave->priv->session), service_name);
+ gdm_dbus_session_emit_start_conversation (slave->priv->session, service_name);
}
static void
@@ -418,8 +482,8 @@ on_greeter_begin_verification (GdmGreeterServer *greeter_server,
GdmFactorySlave *slave)
{
g_debug ("GdmFactorySlave: begin verification");
- gdm_session_setup (GDM_SESSION (slave->priv->session),
- service_name);
+ gdm_dbus_session_emit_setup (slave->priv->session,
+ service_name, "", "", "", "", "");
}
static void
@@ -429,9 +493,9 @@ on_greeter_begin_verification_for_user (GdmGreeterServer *greeter_server,
GdmFactorySlave *slave)
{
g_debug ("GdmFactorySlave: begin verification for user");
- gdm_session_setup_for_user (GDM_SESSION (slave->priv->session),
- service_name,
- username);
+ gdm_dbus_session_emit_setup_for_user (slave->priv->session,
+ service_name, username,
+ "", "", "", "", "");
}
static void
@@ -440,8 +504,15 @@ on_greeter_answer (GdmGreeterServer *greeter_server,
const char *text,
GdmFactorySlave *slave)
{
+ GDBusMethodInvocation *invocation;
+
g_debug ("GdmFactorySlave: Greeter answer");
- gdm_session_answer_query (GDM_SESSION (slave->priv->session), service_name, text);
+
+ invocation = g_hash_table_lookup (slave->priv->pending_queries, service_name);
+ g_dbus_method_invocation_return_value (invocation,
+ g_variant_new ("(s)", text));
+
+ g_hash_table_remove (slave->priv->pending_queries, service_name);
}
static void
@@ -449,7 +520,7 @@ on_greeter_session_selected (GdmGreeterServer *greeter_server,
const char *text,
GdmFactorySlave *slave)
{
- gdm_session_select_session (GDM_SESSION (slave->priv->session), text);
+ gdm_dbus_session_emit_set_session_name (slave->priv->session, text);
}
static void
@@ -457,7 +528,7 @@ on_greeter_language_selected (GdmGreeterServer *greeter_server,
const char *text,
GdmFactorySlave *slave)
{
- gdm_session_select_language (GDM_SESSION (slave->priv->session), text);
+ gdm_dbus_session_emit_set_language_name (slave->priv->session, text);
}
static void
@@ -465,14 +536,14 @@ on_greeter_user_selected (GdmGreeterServer *greeter_server,
const char *text,
GdmFactorySlave *slave)
{
- gdm_session_select_user (GDM_SESSION (slave->priv->session), text);
+ gdm_dbus_session_emit_set_user_name (slave->priv->session, text);
}
static void
on_greeter_cancel (GdmGreeterServer *greeter_server,
GdmFactorySlave *slave)
{
- gdm_session_cancel (GDM_SESSION (slave->priv->session));
+ gdm_dbus_session_emit_cancelled (slave->priv->session);
}
static void
@@ -726,102 +797,121 @@ gdm_factory_slave_run (GdmFactorySlave *slave)
}
static gboolean
+handle_new_connection (GDBusServer *server,
+ GDBusConnection *connection,
+ GdmFactorySlave *slave)
+{
+ g_object_ref (connection);
+
+ slave->priv->session = GDM_DBUS_SESSION (gdm_dbus_session_skeleton_new ());
+
+ g_signal_connect_object (slave->priv->session,
+ "handle-conversation-started",
+ G_CALLBACK (on_session_handle_conversation_started),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-setup-complete",
+ G_CALLBACK (on_session_handle_setup_complete),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-setup-failed",
+ G_CALLBACK (on_session_handle_setup_failed),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-authenticated",
+ G_CALLBACK (on_session_handle_authenticated),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-authentication-failed",
+ G_CALLBACK (on_session_handle_authentication_failed),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-authorized",
+ G_CALLBACK (on_session_handle_authorized),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-authorization-failed",
+ G_CALLBACK (on_session_handle_authorization_failed),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-accredited",
+ G_CALLBACK (on_session_handle_accredited),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-accreditation-failed",
+ G_CALLBACK (on_session_handle_accreditation_failed),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-session-opened",
+ G_CALLBACK (on_session_handle_opened),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-session-open-failed",
+ G_CALLBACK (on_session_handle_open_failed),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-info",
+ G_CALLBACK (on_session_handle_info),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-problem",
+ G_CALLBACK (on_session_handle_problem),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-info-query",
+ G_CALLBACK (on_session_handle_info_query),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-secret-info-query",
+ G_CALLBACK (on_session_handle_secret_info_query),
+ slave, 0);
+ g_signal_connect_object (slave->priv->session,
+ "handle-session-started",
+ G_CALLBACK (on_session_handle_session_started),
+ slave, 0);
+
+ g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (slave->priv->session),
+ connection,
+ "/org/gnome/DisplayManager/Session",
+ NULL);
+
+ g_signal_connect_object (connection, "closed",
+ G_CALLBACK (on_session_connection_closed), slave, 0);
+
+ return TRUE;
+}
+
+static gboolean
gdm_factory_slave_start (GdmSlave *slave)
{
+ GdmFactorySlave *self;
+ GError *error = NULL;
gboolean ret;
ret = FALSE;
+ self = GDM_FACTORY_SLAVE (slave);
+
g_debug ("GdmFactorySlave: Starting factory slave");
GDM_SLAVE_CLASS (gdm_factory_slave_parent_class)->start (slave);
- GDM_FACTORY_SLAVE (slave)->priv->session = gdm_session_relay_new ();
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "conversation-started",
- G_CALLBACK (on_session_conversation_started),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "setup-complete",
- G_CALLBACK (on_session_setup_complete),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "setup-failed",
- G_CALLBACK (on_session_setup_failed),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "reset-complete",
- G_CALLBACK (on_session_reset_complete),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "reset-failed",
- G_CALLBACK (on_session_reset_failed),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "authenticated",
- G_CALLBACK (on_session_authenticated),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "authentication-failed",
- G_CALLBACK (on_session_authentication_failed),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "authorized",
- G_CALLBACK (on_session_authorized),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "authorization-failed",
- G_CALLBACK (on_session_authorization_failed),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "accredited",
- G_CALLBACK (on_session_accredited),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "accreditation-failed",
- G_CALLBACK (on_session_accreditation_failed),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "session-opened",
- G_CALLBACK (on_session_opened),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "session-open-failed",
- G_CALLBACK (on_session_open_failed),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "info",
- G_CALLBACK (on_session_info),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "problem",
- G_CALLBACK (on_session_problem),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "info-query",
- G_CALLBACK (on_session_info_query),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "secret-info-query",
- G_CALLBACK (on_session_secret_info_query),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "session-started",
- G_CALLBACK (on_session_session_started),
- slave);
+ self->priv->pending_queries = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, g_object_unref);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "connected",
- G_CALLBACK (on_session_relay_connected),
- slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
- "disconnected",
- G_CALLBACK (on_session_relay_disconnected),
- slave);
+ self->priv->session_server = gdm_dbus_setup_private_server (NULL,
+ &error);
+
+ if (self->priv->session_server == NULL) {
+ g_critical ("Failed to setup private DBus server: %s", error->message);
+ return FALSE;
+ }
+ g_signal_connect_object (self->priv->session_server, "new-connection",
+ G_CALLBACK (handle_new_connection), slave, 0);
- gdm_session_relay_start (GDM_FACTORY_SLAVE (slave)->priv->session);
+ g_dbus_server_start (self->priv->session_server);
- gdm_factory_slave_run (GDM_FACTORY_SLAVE (slave));
+ gdm_factory_slave_run (self);
ret = TRUE;
@@ -831,34 +921,41 @@ gdm_factory_slave_start (GdmSlave *slave)
static gboolean
gdm_factory_slave_stop (GdmSlave *slave)
{
+ GdmFactorySlave *self = GDM_FACTORY_SLAVE (slave);
+
g_debug ("GdmFactorySlave: Stopping factory_slave");
GDM_SLAVE_CLASS (gdm_factory_slave_parent_class)->stop (slave);
- if (GDM_FACTORY_SLAVE (slave)->priv->session != NULL) {
- gdm_session_relay_stop (GDM_FACTORY_SLAVE (slave)->priv->session);
- g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->session);
- GDM_FACTORY_SLAVE (slave)->priv->session = NULL;
+ if (self->priv->session != NULL) {
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (self->priv->session));
+ g_clear_object (&self->priv->session);
}
- if (GDM_FACTORY_SLAVE (slave)->priv->greeter_server != NULL) {
- gdm_greeter_server_stop (GDM_FACTORY_SLAVE (slave)->priv->greeter_server);
- g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->greeter_server);
- GDM_FACTORY_SLAVE (slave)->priv->greeter_server = NULL;
+ if (self->priv->session_server != NULL) {
+ g_dbus_server_stop (self->priv->session_server);
+ g_clear_object (&self->priv->session_server);
}
- if (GDM_FACTORY_SLAVE (slave)->priv->greeter != NULL) {
- gdm_welcome_session_stop (GDM_WELCOME_SESSION (GDM_FACTORY_SLAVE (slave)->priv->greeter));
+ if (self->priv->greeter_server != NULL) {
+ gdm_greeter_server_stop (self->priv->greeter_server);
+ g_clear_object (&self->priv->greeter_server);
}
- if (GDM_FACTORY_SLAVE (slave)->priv->server != NULL) {
- gdm_server_stop (GDM_FACTORY_SLAVE (slave)->priv->server);
- g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->server);
- GDM_FACTORY_SLAVE (slave)->priv->server = NULL;
+ if (self->priv->greeter != NULL) {
+ gdm_welcome_session_stop (GDM_WELCOME_SESSION (self->priv->greeter));
}
- if (GDM_FACTORY_SLAVE (slave)->priv->factory_proxy != NULL) {
- g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->factory_proxy);
+ if (self->priv->server != NULL) {
+ gdm_server_stop (self->priv->server);
+ g_clear_object (&self->priv->server);
+ }
+
+ g_clear_object (&self->priv->factory_proxy);
+
+ if (self->priv->pending_queries) {
+ g_hash_table_unref (self->priv->pending_queries);
+ self->priv->pending_queries = NULL;
}
return TRUE;
diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c
index 844af485..da3b8856 100644
--- a/daemon/gdm-product-slave.c
+++ b/daemon/gdm-product-slave.c
@@ -35,20 +35,18 @@
#include <glib/gi18n.h>
#include <glib/gstdio.h>
#include <glib-object.h>
-
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
+#include <gio/gio.h>
#include <X11/Xlib.h> /* for Display */
#include "gdm-common.h"
#include "gdm-product-slave.h"
-#include "gdm-product-slave-glue.h"
#include "gdm-server.h"
#include "gdm-session-direct.h"
+#include "gdm-session-glue.h"
+#include "gdm-product-display-glue.h"
extern char **environ;
@@ -75,10 +73,11 @@ struct GdmProductSlavePrivate
GdmServer *server;
GdmSessionDirect *session;
- DBusConnection *session_relay_connection;
+ GdmDBusSession *session_relay;
+ GDBusConnection *session_connection;
- DBusGProxy *product_display_proxy;
- DBusGConnection *connection;
+ GdmDBusProductDisplay *product_display;
+ GDBusConnection *connection;
char *start_session_service_name;
};
@@ -89,227 +88,22 @@ static void gdm_product_slave_finalize (GObject *object);
G_DEFINE_TYPE (GdmProductSlave, gdm_product_slave, GDM_TYPE_SLAVE)
-static gboolean
-send_dbus_string_string_method (DBusConnection *connection,
- const char *method,
- const char *payload1,
- const char *payload2)
-{
- DBusError error;
- DBusMessage *message;
- DBusMessage *reply;
- DBusMessageIter iter;
- const char *str;
-
- g_debug ("GdmProductSlave: Calling %s", method);
- message = dbus_message_new_method_call (NULL,
- RELAY_SERVER_DBUS_PATH,
- RELAY_SERVER_DBUS_INTERFACE,
- method);
- if (message == NULL) {
- g_warning ("Couldn't allocate the D-Bus message");
- return FALSE;
- }
-
- dbus_message_iter_init_append (message, &iter);
-
- if (payload1 != NULL) {
- str = payload1;
- } else {
- str = "";
- }
- dbus_message_iter_append_basic (&iter,
- DBUS_TYPE_STRING,
- &str);
- if (payload2 != NULL) {
- str = payload2;
- } else {
- str = "";
- }
- dbus_message_iter_append_basic (&iter,
- DBUS_TYPE_STRING,
- &str);
- dbus_error_init (&error);
- reply = dbus_connection_send_with_reply_and_block (connection,
- message,
- -1,
- &error);
-
- dbus_message_unref (message);
-
- if (dbus_error_is_set (&error)) {
- g_warning ("%s %s raised: %s\n",
- method,
- error.name,
- error.message);
- return FALSE;
- }
- if (reply != NULL) {
- dbus_message_unref (reply);
- }
- dbus_connection_flush (connection);
-
- return TRUE;
-}
-static gboolean
-send_dbus_string_method (DBusConnection *connection,
- const char *method,
- const char *payload)
-{
- DBusError error;
- DBusMessage *message;
- DBusMessage *reply;
- DBusMessageIter iter;
- const char *str;
-
- if (payload != NULL) {
- str = payload;
- } else {
- str = "";
- }
-
- g_debug ("GdmProductSlave: Calling %s", method);
- message = dbus_message_new_method_call (NULL,
- RELAY_SERVER_DBUS_PATH,
- RELAY_SERVER_DBUS_INTERFACE,
- method);
- if (message == NULL) {
- g_warning ("Couldn't allocate the D-Bus message");
- return FALSE;
- }
-
- dbus_message_iter_init_append (message, &iter);
- dbus_message_iter_append_basic (&iter,
- DBUS_TYPE_STRING,
- &str);
-
- dbus_error_init (&error);
- reply = dbus_connection_send_with_reply_and_block (connection,
- message,
- -1,
- &error);
-
- dbus_message_unref (message);
-
- if (dbus_error_is_set (&error)) {
- g_warning ("%s %s raised: %s\n",
- method,
- error.name,
- error.message);
- return FALSE;
- }
- if (reply != NULL) {
- dbus_message_unref (reply);
- }
- dbus_connection_flush (connection);
-
- return TRUE;
-}
-
-static gboolean
-send_dbus_void_method (DBusConnection *connection,
- const char *method)
-{
- DBusError error;
- DBusMessage *message;
- DBusMessage *reply;
-
- g_debug ("GdmProductSlave: Calling %s", method);
- message = dbus_message_new_method_call (NULL,
- RELAY_SERVER_DBUS_PATH,
- RELAY_SERVER_DBUS_INTERFACE,
- method);
- if (message == NULL) {
- g_warning ("Couldn't allocate the D-Bus message");
- return FALSE;
- }
-
- dbus_error_init (&error);
- reply = dbus_connection_send_with_reply_and_block (connection,
- message,
- -1,
- &error);
-
- dbus_message_unref (message);
-
- if (dbus_error_is_set (&error)) {
- g_warning ("%s %s raised: %s\n",
- method,
- error.name,
- error.message);
- return FALSE;
- }
- if (reply != NULL) {
- dbus_message_unref (reply);
- }
- dbus_connection_flush (connection);
-
- return TRUE;
-}
-
-
-static gboolean
-send_dbus_int_method (DBusConnection *connection,
- const char *method,
- int payload)
-{
- DBusError error;
- DBusMessage *message;
- DBusMessage *reply;
- DBusMessageIter iter;
-
- g_debug ("GdmSessionWorker: Calling %s", method);
- message = dbus_message_new_method_call (NULL,
- RELAY_SERVER_DBUS_PATH,
- RELAY_SERVER_DBUS_INTERFACE,
- method);
- if (message == NULL) {
- g_warning ("Couldn't allocate the D-Bus message");
- return FALSE;
- }
-
- dbus_message_iter_init_append (message, &iter);
- dbus_message_iter_append_basic (&iter,
- DBUS_TYPE_INT32,
- &payload);
-
- dbus_error_init (&error);
- reply = dbus_connection_send_with_reply_and_block (connection,
- message,
- -1,
- &error);
- dbus_message_unref (message);
- if (reply != NULL) {
- dbus_message_unref (reply);
- }
- dbus_connection_flush (connection);
-
- if (dbus_error_is_set (&error)) {
- g_debug ("%s %s raised: %s\n",
- method,
- error.name,
- error.message);
- return FALSE;
- }
-
- return TRUE;
-}
-
static void
relay_session_started (GdmProductSlave *slave,
int pid)
{
- send_dbus_int_method (slave->priv->session_relay_connection,
- "SessionStarted",
- pid);
+ gdm_dbus_session_call_session_started_sync (slave->priv->session_relay,
+ pid,
+ NULL, NULL);
}
static void
relay_session_conversation_started (GdmProductSlave *slave,
const char *service_name)
{
- send_dbus_string_method (slave->priv->session_relay_connection,
- "ConversationStarted", service_name);
+ gdm_dbus_session_call_conversation_started_sync (slave->priv->session_relay,
+ service_name,
+ NULL, NULL);
}
static void
@@ -327,8 +121,8 @@ disconnect_relay (GdmProductSlave *slave)
{
/* drop the connection */
- dbus_connection_close (slave->priv->session_relay_connection);
- slave->priv->session_relay_connection = NULL;
+ g_dbus_connection_close_sync (slave->priv->session_connection, NULL, NULL);
+ g_clear_object (&slave->priv->session_connection);
}
static void
@@ -534,28 +328,31 @@ gdm_product_slave_create_server (GdmProductSlave *slave)
static void
on_session_setup_complete (GdmSession *session,
+ const char *service_name,
GdmProductSlave *slave)
{
- send_dbus_void_method (slave->priv->session_relay_connection,
- "SetupComplete");
+ gdm_dbus_session_call_setup_complete_sync (slave->priv->session_relay,
+ service_name,
+ NULL, NULL);
}
static void
on_session_setup_failed (GdmSession *session,
+ const char *service_name,
const char *message,
GdmProductSlave *slave)
{
- send_dbus_string_method (slave->priv->session_relay_connection,
- "SetupFailed",
- message);
+ gdm_dbus_session_call_setup_failed_sync (slave->priv->session_relay,
+ service_name,
+ message,
+ NULL, NULL);
}
static void
on_session_reset_complete (GdmSession *session,
GdmProductSlave *slave)
{
- send_dbus_void_method (slave->priv->session_relay_connection,
- "ResetComplete");
+ g_debug ("Session reset complete");
}
static void
@@ -563,9 +360,7 @@ on_session_reset_failed (GdmSession *session,
const char *message,
GdmProductSlave *slave)
{
- send_dbus_string_method (slave->priv->session_relay_connection,
- "ResetFailed",
- message);
+ g_debug ("Session reset failed: %s", message);
}
static void
@@ -573,8 +368,9 @@ on_session_authenticated (GdmSession *session,
const char *service_name,
GdmProductSlave *slave)
{
- send_dbus_string_method (slave->priv->session_relay_connection,
- "Authenticated", service_name);
+ gdm_dbus_session_call_authenticated_sync (slave->priv->session_relay,
+ service_name,
+ NULL, NULL);
}
static void
@@ -583,10 +379,10 @@ on_session_authentication_failed (GdmSession *session,
const char *message,
GdmProductSlave *slave)
{
- send_dbus_string_string_method (slave->priv->session_relay_connection,
- "AuthenticationFailed",
- service_name,
- message);
+ gdm_dbus_session_call_authentication_failed_sync (slave->priv->session_relay,
+ service_name,
+ message,
+ NULL, NULL);
}
static void
@@ -594,8 +390,9 @@ on_session_authorized (GdmSession *session,
const char *service_name,
GdmProductSlave *slave)
{
- send_dbus_string_method (slave->priv->session_relay_connection,
- "Authorized", service_name);
+ gdm_dbus_session_call_authorized_sync (slave->priv->session_relay,
+ service_name,
+ NULL, NULL);
}
static void
@@ -604,10 +401,10 @@ on_session_authorization_failed (GdmSession *session,
const char *message,
GdmProductSlave *slave)
{
- send_dbus_string_string_method (slave->priv->session_relay_connection,
- "AuthorizationFailed",
- service_name,
- message);
+ gdm_dbus_session_call_authorization_failed_sync (slave->priv->session_relay,
+ service_name,
+ message,
+ NULL, NULL);
}
static void
@@ -615,8 +412,9 @@ on_session_accredited (GdmSession *session,
const char *service_name,
GdmProductSlave *slave)
{
- send_dbus_string_method (slave->priv->session_relay_connection,
- "Accredited", service_name);
+ gdm_dbus_session_call_accredited_sync (slave->priv->session_relay,
+ service_name,
+ NULL, NULL);
}
static void
@@ -625,10 +423,10 @@ on_session_accreditation_failed (GdmSession *session,
const char *message,
GdmProductSlave *slave)
{
- send_dbus_string_string_method (slave->priv->session_relay_connection,
- "AccreditationFailed",
- service_name,
- message);
+ gdm_dbus_session_call_accreditation_failed_sync (slave->priv->session_relay,
+ service_name,
+ message,
+ NULL, NULL);
}
static void
@@ -636,8 +434,9 @@ on_session_opened (GdmSession *session,
const char *service_name,
GdmProductSlave *slave)
{
- send_dbus_string_method (slave->priv->session_relay_connection,
- "SessionOpened", service_name);
+ gdm_dbus_session_call_opened_sync (slave->priv->session_relay,
+ service_name,
+ NULL, NULL);
}
static void
@@ -646,10 +445,10 @@ on_session_open_failed (GdmSession *session,
const char *message,
GdmProductSlave *slave)
{
- send_dbus_string_string_method (slave->priv->session_relay_connection,
- "SessionOpenFailed",
- service_name,
- message);
+ gdm_dbus_session_call_open_failed_sync (slave->priv->session_relay,
+ service_name,
+ message,
+ NULL, NULL);
}
static void
@@ -658,10 +457,10 @@ on_session_info (GdmSession *session,
const char *text,
GdmProductSlave *slave)
{
- send_dbus_string_string_method (slave->priv->session_relay_connection,
- "Info",
- service_name,
- text);
+ gdm_dbus_session_call_info_sync (slave->priv->session_relay,
+ service_name,
+ text,
+ NULL, NULL);
}
static void
@@ -670,10 +469,41 @@ on_session_problem (GdmSession *session,
const char *text,
GdmProductSlave *slave)
{
- send_dbus_string_string_method (slave->priv->session_relay_connection,
- "Problem",
- service_name,
- text);
+ gdm_dbus_session_call_problem_sync (slave->priv->session_relay,
+ service_name,
+ text,
+ NULL, NULL);
+}
+
+typedef struct {
+ GdmProductSlave *slave;
+ char *service_name;
+} QueryClosure;
+
+static void
+on_session_query_finish (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GVariant *res;
+ const char *text;
+ QueryClosure *closure;
+
+ closure = user_data;
+
+ res = g_dbus_proxy_call_finish (G_DBUS_PROXY (object),
+ result, NULL);
+ if (!res)
+ return;
+
+ g_variant_get (res, "(&s)", &text);
+
+ gdm_session_answer_query (GDM_SESSION (closure->slave->priv->session),
+ closure->service_name, text);
+
+ g_object_unref (closure->slave);
+ g_free (closure->service_name);
+ g_slice_free (QueryClosure, closure);
}
static void
@@ -682,9 +512,17 @@ on_session_info_query (GdmSession *session,
const char *text,
GdmProductSlave *slave)
{
- send_dbus_string_string_method (slave->priv->session_relay_connection,
- "InfoQuery",
- service_name, text);
+ QueryClosure *closure;
+
+ closure = g_slice_new (QueryClosure);
+ closure->slave = g_object_ref (slave);
+ closure->service_name = g_strdup (service_name);
+
+ gdm_dbus_session_call_info_query (slave->priv->session_relay,
+ service_name,
+ text,
+ NULL,
+ on_session_query_finish, closure);
}
static void
@@ -693,303 +531,141 @@ on_session_secret_info_query (GdmSession *session,
const char *text,
GdmProductSlave *slave)
{
- send_dbus_string_string_method (slave->priv->session_relay_connection,
- "SecretInfoQuery",
- service_name,
- text);
-}
-
-static void
-on_relay_setup (GdmProductSlave *slave,
- DBusMessage *message)
-{
- DBusError error;
- const char *service_name;
- dbus_bool_t res;
+ QueryClosure *closure;
- service_name = NULL;
+ closure = g_slice_new (QueryClosure);
+ closure->slave = g_object_ref (slave);
+ closure->service_name = g_strdup (service_name);
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmProductSlave: Relay Setup");
- gdm_session_setup (GDM_SESSION (slave->priv->session),
- service_name);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
+ gdm_dbus_session_call_secret_info_query (slave->priv->session_relay,
+ service_name,
+ text,
+ NULL,
+ on_session_query_finish, closure);
}
static void
-on_relay_setup_for_user (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_setup (GdmDBusSession *session_relay,
+ const gchar *service_name,
+ const gchar *x11_display_name,
+ const gchar *x11_authority_file,
+ const gchar *display_device,
+ const gchar *display_seat,
+ const gchar *hostname,
+ GdmProductSlave *slave)
{
- DBusError error;
- const char *service_name;
- const char *username;
- dbus_bool_t res;
-
- username = NULL;
- service_name = NULL;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_STRING, &username,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmProductSlave: Relay SetupForUser");
- gdm_session_setup_for_user (GDM_SESSION (slave->priv->session),
- service_name,
- username);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
+ g_debug ("GdmProductSlave: Relay Setup");
+ gdm_session_setup (GDM_SESSION (slave->priv->session), service_name);
}
static void
-on_relay_authenticate (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_setup_for_user (GdmDBusSession *session_relay,
+ const gchar *service_name,
+ const gchar *user_name,
+ const gchar *x11_display_name,
+ const gchar *x11_authority_file,
+ const gchar *display_device,
+ const gchar *display_seat,
+ const gchar *hostname,
+ GdmProductSlave *slave)
{
- DBusError error;
- char *service_name;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmProductSlave: Relay Authenticate");
- gdm_session_authenticate (GDM_SESSION (slave->priv->session), service_name);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
- dbus_error_free (&error);
+ g_debug ("GdmProductSlave: Relay SetupForUser");
+ gdm_session_setup_for_user (GDM_SESSION (slave->priv->session),
+ service_name, user_name);
}
static void
-on_relay_authorize (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_authenticate (GdmDBusSession *session_relay,
+ const gchar *service_name,
+ GdmProductSlave *slave)
{
- DBusError error;
- char *service_name;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmProductSlave: Relay Authorize");
- gdm_session_authorize (GDM_SESSION (slave->priv->session), service_name);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
- dbus_error_free (&error);
+ g_debug ("GdmProductSlave: Relay Authenticate");
+ gdm_session_authenticate (GDM_SESSION (slave->priv->session), service_name);
}
static void
-on_relay_establish_credentials (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_authorize (GdmDBusSession *session_relay,
+ const gchar *service_name,
+ GdmProductSlave *slave)
{
- DBusError error;
- char *service_name;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmProductSlave: Relay EstablishCredentials");
- gdm_session_accredit (GDM_SESSION (slave->priv->session), service_name, GDM_SESSION_CRED_ESTABLISH);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
- dbus_error_free (&error);
+ g_debug ("GdmProductSlave: Relay Authorize");
+ gdm_session_authorize (GDM_SESSION (slave->priv->session), service_name);
}
static void
-on_relay_refresh_credentials (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_establish_credentials (GdmDBusSession *session_relay,
+ const gchar *service_name,
+ GdmProductSlave *slave)
{
- DBusError error;
- char *service_name;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmProductSlave: Relay RefreshCredentials");
- gdm_session_accredit (GDM_SESSION (slave->priv->session), service_name, GDM_SESSION_CRED_REFRESH);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
- dbus_error_free (&error);
+ g_debug ("GdmProductSlave: Relay Establish Credentials");
+ gdm_session_accredit (GDM_SESSION (slave->priv->session), service_name, GDM_SESSION_CRED_ESTABLISH);
}
static void
-on_relay_answer_query (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_refresh_credentials (GdmDBusSession *session_relay,
+ const gchar *service_name,
+ GdmProductSlave *slave)
{
- DBusError error;
- const char *text;
- const char *service_name;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmProductSlave: Relay AnswerQuery");
- gdm_session_answer_query (GDM_SESSION (slave->priv->session), service_name, text);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
+ g_debug ("GdmProductSlave: Relay Refresh Credentials");
+ gdm_session_accredit (GDM_SESSION (slave->priv->session), service_name, GDM_SESSION_CRED_REFRESH);
}
static void
-on_relay_session_selected (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_set_session_name (GdmDBusSession *session_relay,
+ const gchar *session_name,
+ GdmProductSlave *slave)
{
- DBusError error;
- const char *text;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmProductSlave: Session selected %s", text);
- gdm_session_select_session (GDM_SESSION (slave->priv->session), text);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
+ g_debug ("GdmProductSlave: Relay Set Session Name");
+ gdm_session_select_session (GDM_SESSION (slave->priv->session), session_name);
}
static void
-on_relay_language_selected (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_set_language_name (GdmDBusSession *session_relay,
+ const gchar *language_name,
+ GdmProductSlave *slave)
{
- DBusError error;
- const char *text;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmProductSlave: Language selected %s", text);
- gdm_session_select_language (GDM_SESSION (slave->priv->session), text);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
+ g_debug ("GdmProductSlave: Relay Set Language Name");
+ gdm_session_select_language (GDM_SESSION (slave->priv->session), language_name);
}
static void
-on_relay_user_selected (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_set_user_name (GdmDBusSession *session_relay,
+ const gchar *user_name,
+ GdmProductSlave *slave)
{
- g_debug ("GdmProductSlave: Greeter user selected");
+ g_debug ("GdmProductSlave: Relay Set User Name");
+
+ /* FIXME: and then? */
}
static void
-on_relay_start_conversation (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_start_conversation (GdmDBusSession *session_relay,
+ const gchar *service_name,
+ GdmProductSlave *slave)
{
- DBusError error;
- char *service_name;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmProductSlave: Started conversation with %s service", service_name);
- gdm_session_start_conversation (GDM_SESSION (slave->priv->session),
- service_name);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- }
-
- dbus_error_free (&error);
+ g_debug ("GdmProductSlave: Started Conversation with %s", service_name);
+ gdm_session_start_conversation (GDM_SESSION (slave->priv->session), service_name);
}
static void
-on_relay_open_session (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_open_session (GdmDBusSession *session_relay,
+ const gchar *service_name,
+ GdmProductSlave *slave)
{
- DBusError error;
- const char *text;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmProductSlave: open session %s", text);
- gdm_session_open_session (GDM_SESSION (slave->priv->session),
- text);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
+ g_debug ("GdmProductSlave: open session for %s", service_name);
+ gdm_session_open_session (GDM_SESSION (slave->priv->session), service_name);
}
static void
-on_relay_start_session (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_start_session (GdmDBusSession *session_relay,
+ const gchar *service_name,
+ GdmProductSlave *slave)
{
- DBusError error;
- const char *service_name;
- dbus_bool_t res;
-
- dbus_error_init (&error);
+ g_debug ("GdmProductSlave: Relay StartSession");
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmProductSlave: Relay StartSession");
- g_free (slave->priv->start_session_service_name);
- slave->priv->start_session_service_name = g_strdup (service_name);
- gdm_product_slave_create_server (slave);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
+ g_free (slave->priv->start_session_service_name);
+ slave->priv->start_session_service_name = g_strdup (service_name);
+ gdm_product_slave_create_server (slave);
}
static void
@@ -1114,8 +790,8 @@ create_new_session (GdmProductSlave *slave)
}
static void
-on_relay_cancelled (GdmProductSlave *slave,
- DBusMessage *message)
+on_relay_cancelled (GdmDBusSession *session_relay,
+ GdmProductSlave *slave)
{
g_debug ("GdmProductSlave: Relay cancelled");
@@ -1136,140 +812,78 @@ get_relay_address (GdmProductSlave *slave)
text = NULL;
error = NULL;
- res = dbus_g_proxy_call (slave->priv->product_display_proxy,
- "GetRelayAddress",
- &error,
- G_TYPE_INVALID,
- G_TYPE_STRING, &text,
- G_TYPE_INVALID);
+ res = gdm_dbus_product_display_call_get_relay_address_sync (slave->priv->product_display,
+ &text,
+ NULL, &error);
+
if (! res) {
g_warning ("Unable to get relay address: %s", error->message);
g_error_free (error);
} else {
g_free (slave->priv->relay_address);
- slave->priv->relay_address = g_strdup (text);
+ slave->priv->relay_address = text;
g_debug ("GdmProductSlave: Got relay address: %s", slave->priv->relay_address);
}
-
- g_free (text);
-}
-
-static DBusHandlerResult
-relay_dbus_handle_message (DBusConnection *connection,
- DBusMessage *message,
- void *user_data,
- dbus_bool_t local_interface)
-{
- GdmProductSlave *slave = GDM_PRODUCT_SLAVE (user_data);
-
-#if 0
- g_message ("obj_path=%s interface=%s method=%s destination=%s",
- dbus_message_get_path (message),
- dbus_message_get_interface (message),
- dbus_message_get_member (message),
- dbus_message_get_destination (message));
-#endif
-
- g_return_val_if_fail (connection != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
- g_return_val_if_fail (message != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
-
- if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "Setup")) {
- on_relay_setup (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "SetupForUser")) {
- on_relay_setup_for_user (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "Authenticate")) {
- on_relay_authenticate (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "Authorize")) {
- on_relay_authorize (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "EstablishCredentials")) {
- on_relay_establish_credentials (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "RefreshCredentials")) {
- on_relay_refresh_credentials (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "AnswerQuery")) {
- on_relay_answer_query (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "SessionSelected")) {
- on_relay_session_selected (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "LanguageSelected")) {
- on_relay_language_selected (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "UserSelected")) {
- on_relay_user_selected (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "OpenSession")) {
- on_relay_open_session (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "StartSession")) {
- on_relay_start_session (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "StartConversation")) {
- on_relay_start_conversation (slave, message);
- } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "Cancelled")) {
- on_relay_cancelled (slave, message);
- } else {
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-relay_dbus_filter_function (DBusConnection *connection,
- DBusMessage *message,
- void *user_data)
-{
- GdmProductSlave *slave = GDM_PRODUCT_SLAVE (user_data);
- const char *path;
-
- path = dbus_message_get_path (message);
-
- g_debug ("GdmProductSlave: obj_path=%s interface=%s method=%s",
- dbus_message_get_path (message),
- dbus_message_get_interface (message),
- dbus_message_get_member (message));
-
- if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected")
- && strcmp (path, DBUS_PATH_LOCAL) == 0) {
-
- g_debug ("GdmProductSlave: Got disconnected from the server");
-
- dbus_connection_unref (connection);
- slave->priv->connection = NULL;
-
- } else if (dbus_message_is_signal (message,
- DBUS_INTERFACE_DBUS,
- "NameOwnerChanged")) {
- g_debug ("GdmProductSlave: Name owner changed?");
- } else {
- return relay_dbus_handle_message (connection, message, user_data, FALSE);
- }
-
- return DBUS_HANDLER_RESULT_HANDLED;
}
static gboolean
connect_to_session_relay (GdmProductSlave *slave)
{
- DBusError error;
+ GError *error = NULL;
get_relay_address (slave);
g_debug ("GdmProductSlave: connecting to session relay address: %s", slave->priv->relay_address);
- dbus_error_init (&error);
- slave->priv->session_relay_connection = dbus_connection_open_private (slave->priv->relay_address, &error);
- if (slave->priv->session_relay_connection == NULL) {
- if (dbus_error_is_set (&error)) {
- g_warning ("error opening connection: %s", error.message);
- dbus_error_free (&error);
- } else {
- g_warning ("Unable to open connection");
- }
- exit (1);
+ slave->priv->session_connection = g_dbus_connection_new_for_address_sync (slave->priv->relay_address,
+ G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
+ NULL, NULL, &error);
+ if (!slave->priv->session_connection) {
+ g_warning ("Unable to connect to session relay: %s", error->message);
+
+ g_clear_error (&error);
+ return FALSE;
}
- dbus_connection_setup_with_g_main (slave->priv->session_relay_connection, NULL);
- dbus_connection_set_exit_on_disconnect (slave->priv->session_relay_connection, FALSE);
+ slave->priv->session_relay = GDM_DBUS_SESSION (gdm_dbus_session_proxy_new_sync (slave->priv->session_connection,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL, /* dbus name */
+ "/org/gnome/DisplayManager/Session",
+ NULL, &error));
+ if (!slave->priv->session_relay) {
+ g_warning ("Unable to construct session relay: %s", error->message);
- dbus_connection_add_filter (slave->priv->session_relay_connection,
- relay_dbus_filter_function,
- slave,
- NULL);
+ g_clear_object (&slave->priv->session_connection);
+ g_clear_error (&error);
+ return FALSE;
+ }
+
+ g_signal_connect_object (slave->priv->session_relay, "setup",
+ G_CALLBACK (on_relay_setup), slave, 0);
+ g_signal_connect_object (slave->priv->session_relay, "setup-for-user",
+ G_CALLBACK (on_relay_setup_for_user), slave, 0);
+ g_signal_connect_object (slave->priv->session_relay, "authenticate",
+ G_CALLBACK (on_relay_authenticate), slave, 0);
+ g_signal_connect_object (slave->priv->session_relay, "authorize",
+ G_CALLBACK (on_relay_authorize), slave, 0);
+ g_signal_connect_object (slave->priv->session_relay, "establish-credentials",
+ G_CALLBACK (on_relay_establish_credentials), slave, 0);
+ g_signal_connect_object (slave->priv->session_relay, "refresh-credentials",
+ G_CALLBACK (on_relay_refresh_credentials), slave, 0);
+ g_signal_connect_object (slave->priv->session_relay, "set-language-name",
+ G_CALLBACK (on_relay_set_language_name), slave, 0);
+ g_signal_connect_object (slave->priv->session_relay, "set-session-name",
+ G_CALLBACK (on_relay_set_session_name), slave, 0);
+ g_signal_connect_object (slave->priv->session_relay, "set-user-name",
+ G_CALLBACK (on_relay_set_user_name), slave, 0);
+ g_signal_connect_object (slave->priv->session_relay, "start-conversation",
+ G_CALLBACK (on_relay_start_conversation), slave, 0);
+ g_signal_connect_object (slave->priv->session_relay, "open-session",
+ G_CALLBACK (on_relay_open_session), slave, 0);
+ g_signal_connect_object (slave->priv->session_relay, "start-session",
+ G_CALLBACK (on_relay_start_session), slave, 0);
+ g_signal_connect_object (slave->priv->session_relay, "cancelled",
+ G_CALLBACK (on_relay_cancelled), slave, 0);
return TRUE;
}
@@ -1277,11 +891,13 @@ connect_to_session_relay (GdmProductSlave *slave)
static gboolean
gdm_product_slave_start (GdmSlave *slave)
{
+ GdmProductSlave *self;
gboolean ret;
GError *error;
char *display_id;
ret = FALSE;
+ self = GDM_PRODUCT_SLAVE (slave);
GDM_SLAVE_CLASS (gdm_product_slave_parent_class)->start (slave);
@@ -1290,8 +906,8 @@ gdm_product_slave_start (GdmSlave *slave)
NULL);
error = NULL;
- GDM_PRODUCT_SLAVE (slave)->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
- if (GDM_PRODUCT_SLAVE (slave)->priv->connection == NULL) {
+ self->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+ if (self->priv->connection == NULL) {
if (error != NULL) {
g_critical ("error getting system bus: %s", error->message);
g_error_free (error);
@@ -1300,12 +916,13 @@ gdm_product_slave_start (GdmSlave *slave)
}
error = NULL;
- GDM_PRODUCT_SLAVE (slave)->priv->product_display_proxy = dbus_g_proxy_new_for_name_owner (GDM_PRODUCT_SLAVE (slave)->priv->connection,
- GDM_DBUS_NAME,
- display_id,
- GDM_DBUS_PRODUCT_DISPLAY_INTERFACE,
- &error);
- if (GDM_PRODUCT_SLAVE (slave)->priv->product_display_proxy == NULL) {
+ self->priv->product_display = GDM_DBUS_PRODUCT_DISPLAY (
+ gdm_dbus_product_display_proxy_new_sync (self->priv->connection,
+ G_DBUS_PROXY_FLAGS_NONE,
+ GDM_DBUS_NAME,
+ display_id,
+ NULL, &error));
+ if (self->priv->product_display == NULL) {
if (error != NULL) {
g_warning ("Failed to create display proxy %s: %s", display_id, error->message);
g_error_free (error);
@@ -1315,9 +932,8 @@ gdm_product_slave_start (GdmSlave *slave)
goto out;
}
- create_new_session (GDM_PRODUCT_SLAVE (slave));
-
- connect_to_session_relay (GDM_PRODUCT_SLAVE (slave));
+ create_new_session (self);
+ connect_to_session_relay (self);
ret = TRUE;
@@ -1330,25 +946,25 @@ gdm_product_slave_start (GdmSlave *slave)
static gboolean
gdm_product_slave_stop (GdmSlave *slave)
{
+ GdmProductSlave *self = GDM_PRODUCT_SLAVE (slave);
+
g_debug ("GdmProductSlave: Stopping product_slave");
GDM_SLAVE_CLASS (gdm_product_slave_parent_class)->stop (slave);
- if (GDM_PRODUCT_SLAVE (slave)->priv->session != NULL) {
- gdm_session_close (GDM_SESSION (GDM_PRODUCT_SLAVE (slave)->priv->session));
- g_object_unref (GDM_PRODUCT_SLAVE (slave)->priv->session);
- GDM_PRODUCT_SLAVE (slave)->priv->session = NULL;
+ if (self->priv->session != NULL) {
+ gdm_session_close (GDM_SESSION (self->priv->session));
+ g_clear_object (&self->priv->session);
}
- if (GDM_PRODUCT_SLAVE (slave)->priv->server != NULL) {
- gdm_server_stop (GDM_PRODUCT_SLAVE (slave)->priv->server);
- g_object_unref (GDM_PRODUCT_SLAVE (slave)->priv->server);
- GDM_PRODUCT_SLAVE (slave)->priv->server = NULL;
+ if (self->priv->server != NULL) {
+ gdm_server_stop (self->priv->server);
+ g_clear_object (&self->priv->server);
}
- if (GDM_PRODUCT_SLAVE (slave)->priv->product_display_proxy != NULL) {
- g_object_unref (GDM_PRODUCT_SLAVE (slave)->priv->product_display_proxy);
- }
+ g_clear_object (&self->priv->product_display);
+ g_clear_object (&self->priv->session_connection);
+ g_clear_object (&self->priv->session_relay);
return TRUE;
}
@@ -1365,8 +981,6 @@ gdm_product_slave_class_init (GdmProductSlaveClass *klass)
slave_class->stop = gdm_product_slave_stop;
g_type_class_add_private (klass, sizeof (GdmProductSlavePrivate));
-
- dbus_g_object_type_install_info (GDM_TYPE_PRODUCT_SLAVE, &dbus_glib_gdm_product_slave_object_info);
}
static void
diff --git a/daemon/gdm-session-relay.c b/daemon/gdm-session-relay.c
deleted file mode 100644
index dc0c79fb..00000000
--- a/daemon/gdm-session-relay.c
+++ /dev/null
@@ -1,1299 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <errno.h>
-#include <ctype.h>
-#include <pwd.h>
-#include <grp.h>
-
-#if defined (_POSIX_PRIORITY_SCHEDULING) && defined (HAVE_SCHED_YIELD)
-#include <sched.h>
-#endif
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <glib-object.h>
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
-
-#include "gdm-session-private.h"
-#include "gdm-session-relay.h"
-
-#define GDM_SESSION_RELAY_DBUS_PATH "/org/gnome/DisplayManager/SessionRelay"
-#define GDM_SESSION_RELAY_DBUS_INTERFACE "org.gnome.DisplayManager.SessionRelay"
-
-#define GDM_SESSION_RELAY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_SESSION_RELAY, GdmSessionRelayPrivate))
-
-struct GdmSessionRelayPrivate
-{
- DBusServer *server;
- char *server_address;
- DBusConnection *session_connection;
-};
-
-enum {
- PROP_0,
-};
-
-enum {
- CONNECTED,
- DISCONNECTED,
- LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL] = { 0, };
-
-static void gdm_session_relay_class_init (GdmSessionRelayClass *klass);
-static void gdm_session_relay_init (GdmSessionRelay *session_relay);
-static void gdm_session_iface_init (GdmSessionIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GdmSessionRelay,
- gdm_session_relay,
- G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (GDM_TYPE_SESSION,
- gdm_session_iface_init))
-
-static gboolean
-send_dbus_message (DBusConnection *connection,
- DBusMessage *message)
-{
- gboolean is_connected;
- gboolean sent;
-
- g_return_val_if_fail (message != NULL, FALSE);
-
- if (connection == NULL) {
- g_debug ("GdmSessionRelay: There is no valid connection");
- return FALSE;
- }
-
- is_connected = dbus_connection_get_is_connected (connection);
- if (! is_connected) {
- g_warning ("Not connected!");
- return FALSE;
- }
-
- sent = dbus_connection_send (connection, message, NULL);
-
- return sent;
-}
-
-static void
-send_dbus_string_signal (GdmSessionRelay *session_relay,
- const char *name,
- const char *text)
-{
- DBusMessage *message;
- DBusMessageIter iter;
-
- g_return_if_fail (session_relay != NULL);
-
- g_debug ("GdmSessionRelay: sending signal %s", name);
- message = dbus_message_new_signal (GDM_SESSION_RELAY_DBUS_PATH,
- GDM_SESSION_RELAY_DBUS_INTERFACE,
- name);
-
- dbus_message_iter_init_append (message, &iter);
- dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &text);
-
- if (! send_dbus_message (session_relay->priv->session_connection, message)) {
- g_debug ("GdmSessionRelay: Could not send %s signal", name);
- }
-
- dbus_message_unref (message);
-}
-
-static void
-send_dbus_string_string_signal (GdmSessionRelay *session_relay,
- const char *name,
- const char *text1,
- const char *text2)
-{
- DBusMessage *message;
- DBusMessageIter iter;
-
- g_return_if_fail (session_relay != NULL);
-
- g_debug ("GdmSessionRelay: sending signal %s", name);
- message = dbus_message_new_signal (GDM_SESSION_RELAY_DBUS_PATH,
- GDM_SESSION_RELAY_DBUS_INTERFACE,
- name);
-
- dbus_message_iter_init_append (message, &iter);
- dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &text1);
- dbus_message_iter_init_append (message, &iter);
- dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &text2);
-
- if (! send_dbus_message (session_relay->priv->session_connection, message)) {
- g_debug ("GdmSessionRelay: Could not send %s signal", name);
- }
-
- dbus_message_unref (message);
-}
-
-static void
-send_dbus_void_signal (GdmSessionRelay *session_relay,
- const char *name)
-{
- DBusMessage *message;
-
- g_return_if_fail (session_relay != NULL);
-
- g_debug ("GdmSessionRelay: sending signal %s", name);
- message = dbus_message_new_signal (GDM_SESSION_RELAY_DBUS_PATH,
- GDM_SESSION_RELAY_DBUS_INTERFACE,
- name);
-
- if (! send_dbus_message (session_relay->priv->session_connection, message)) {
- g_debug ("GdmSessionRelay: Could not send %s signal", name);
- }
-
- dbus_message_unref (message);
-}
-
-static void
-gdm_session_relay_start_conversation (GdmSession *session,
- const char *service_name)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
- send_dbus_string_signal (impl, "StartConversation", service_name);
-}
-
-static void
-gdm_session_relay_close (GdmSession *session)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
- send_dbus_void_signal (impl, "Close");
-}
-
-static void
-gdm_session_relay_setup (GdmSession *session,
- const char *service_name)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
- send_dbus_string_signal (impl, "Setup", service_name);
-}
-
-static void
-gdm_session_relay_setup_for_user (GdmSession *session,
- const char *service_name,
- const char *username)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
- send_dbus_string_string_signal (impl, "SetupForUser", service_name, username);
-}
-
-static void
-gdm_session_relay_authenticate (GdmSession *session,
- const char *service_name)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
- send_dbus_string_signal (impl, "Authenticate", service_name);
-}
-
-static void
-gdm_session_relay_authorize (GdmSession *session,
- const char *service_name)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
- send_dbus_string_signal (impl, "Authorize", service_name);
-}
-
-static void
-gdm_session_relay_accredit (GdmSession *session,
- const char *service_name,
- int cred_flag)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
-
- switch (cred_flag) {
- case GDM_SESSION_CRED_ESTABLISH:
- send_dbus_string_signal (impl, "EstablishCredentials", service_name);
- break;
- case GDM_SESSION_CRED_REFRESH:
- send_dbus_string_signal (impl, "RefreshCredentials", service_name);
- break;
- default:
- g_assert_not_reached ();
- }
-}
-
-static void
-gdm_session_relay_open_session (GdmSession *session,
- const char *service_name)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
- send_dbus_string_signal (impl, "OpenSession", service_name);
-}
-
-static void
-gdm_session_relay_answer_query (GdmSession *session,
- const char *service_name,
- const char *text)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
- send_dbus_string_string_signal (impl, "AnswerQuery", service_name, text);
-}
-
-static void
-gdm_session_relay_select_session (GdmSession *session,
- const char *text)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
- send_dbus_string_signal (impl, "SessionSelected", text);
-}
-
-static void
-gdm_session_relay_select_language (GdmSession *session,
- const char *text)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
- send_dbus_string_signal (impl, "LanguageSelected", text);
-}
-
-static void
-gdm_session_relay_select_user (GdmSession *session,
- const char *text)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
- send_dbus_string_signal (impl, "UserSelected", text);
-}
-
-static void
-gdm_session_relay_cancel (GdmSession *session)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
-
- send_dbus_void_signal (impl, "Cancelled");
-}
-
-static void
-gdm_session_relay_start_session (GdmSession *session,
- const char *service_name)
-{
- GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
-
- send_dbus_string_signal (impl, "StartSession", service_name);
-}
-
-/* Note: Use abstract sockets like dbus does by default on Linux. Abstract
- * sockets are only available on Linux.
- */
-static char *
-generate_address (void)
-{
- char *path;
-#if defined (__linux__)
- int i;
- char tmp[9];
-
- for (i = 0; i < 8; i++) {
- if (g_random_int_range (0, 2) == 0) {
- tmp[i] = g_random_int_range ('a', 'z' + 1);
- } else {
- tmp[i] = g_random_int_range ('A', 'Z' + 1);
- }
- }
- tmp[8] = '\0';
-
- path = g_strdup_printf ("unix:abstract=/tmp/gdm-session-%s", tmp);
-#else
- path = g_strdup ("unix:tmpdir=/tmp");
-#endif
-
- return path;
-}
-
-static DBusHandlerResult
-handle_info_query (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
- char *text;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
-
- g_debug ("GdmSessionRelay: InfoQuery: %s", text);
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_info_query (GDM_SESSION (session_relay), service_name, text);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_secret_info_query (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
- char *text;
-
- text = NULL;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
-
- g_debug ("GdmSessionRelay: SecretInfoQuery: %s", text);
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_secret_info_query (GDM_SESSION (session_relay), service_name, text);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_info (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
- char *text;
-
- text = NULL;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
-
- g_debug ("GdmSessionRelay: Info: %s", text);
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_info (GDM_SESSION (session_relay), service_name, text);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_problem (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
- char *text;
-
- text = NULL;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
-
- g_debug ("GdmSessionRelay: Problem: %s", text);
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_problem (GDM_SESSION (session_relay), service_name, text);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_service_unavailable (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
- dbus_error_free (&error);
-
- g_debug ("GdmSessionRelay: ServiceUnavailable");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_service_unavailable (GDM_SESSION (session_relay), service_name);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_setup_complete (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
- dbus_error_free (&error);
-
- g_debug ("GdmSessionRelay: SetupComplete");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_setup_complete (GDM_SESSION (session_relay), service_name);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_setup_failed (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
- dbus_error_free (&error);
-
- g_debug ("GdmSessionRelay: SetupFailed");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_setup_failed (GDM_SESSION (session_relay), service_name, NULL);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-
-static DBusHandlerResult
-handle_authenticated (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
- dbus_error_free (&error);
-
- g_debug ("GdmSessionRelay: Authenticated");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_authenticated (GDM_SESSION (session_relay), service_name);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_authentication_failed (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
- dbus_error_free (&error);
-
- g_debug ("GdmSessionRelay: AuthenticationFailed");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_authentication_failed (GDM_SESSION (session_relay), service_name, NULL);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_authorized (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
- dbus_error_free (&error);
-
- g_debug ("GdmSessionRelay: Authorized");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_authorized (GDM_SESSION (session_relay), service_name);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_authorization_failed (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
- dbus_error_free (&error);
-
- g_debug ("GdmSessionRelay: AuthorizationFailed");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_authorization_failed (GDM_SESSION (session_relay), service_name, NULL);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_accredited (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
- dbus_error_free (&error);
-
- g_debug ("GdmSessionRelay: Accredited");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_accredited (GDM_SESSION (session_relay), service_name);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_accreditation_failed (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
- dbus_error_free (&error);
-
- g_debug ("GdmSessionRelay: AccreditationFailed");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_accreditation_failed (GDM_SESSION (session_relay), service_name, NULL);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-static DBusHandlerResult
-handle_session_opened (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
- dbus_error_free (&error);
-
- g_debug ("GdmSessionRelay: Session Opened");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_session_opened (GDM_SESSION (session_relay), service_name);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_session_open_failed (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
- dbus_error_free (&error);
-
- g_debug ("GdmSessionRelay: Session Open Failed");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_session_open_failed (GDM_SESSION (session_relay), service_name, NULL);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_session_started (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
- int pid;
-
- dbus_error_init (&error);
-
- pid = 0;
- if (! dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INT32, &pid,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
-
- g_debug ("GdmSessionRelay: SessionStarted");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_session_started (GDM_SESSION (session_relay),
- service_name,
- pid);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_session_stopped (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
-
- dbus_error_init (&error);
-
- g_debug ("GdmSessionRelay: SessionStopped");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
-#if 0
- _gdm_session_session_stopped (GDM_SESSION (session_relay));
-#endif
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-handle_conversation_started (GdmSessionRelay *session_relay,
- DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- DBusError error;
- char *service_name;
-
- dbus_error_init (&error);
- if (! dbus_message_get_args (message, &error,
- DBUS_TYPE_STRING, &service_name,
- DBUS_TYPE_INVALID)) {
- g_warning ("ERROR: %s", error.message);
- }
-
- g_debug ("GdmSessionRelay: Conversation Started");
-
- reply = dbus_message_new_method_return (message);
- dbus_connection_send (connection, reply, NULL);
- dbus_message_unref (reply);
-
- _gdm_session_conversation_started (GDM_SESSION (session_relay), service_name);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-session_handle_child_message (DBusConnection *connection,
- DBusMessage *message,
- void *user_data)
-{
- GdmSessionRelay *session_relay = GDM_SESSION_RELAY (user_data);
-
- if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "InfoQuery")) {
- return handle_info_query (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "SecretInfoQuery")) {
- return handle_secret_info_query (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "Info")) {
- return handle_info (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "Problem")) {
- return handle_problem (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "ServiceUnavailable")) {
- return handle_service_unavailable (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "SetupComplete")) {
- return handle_setup_complete (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "SetupFailed")) {
- return handle_setup_failed (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "Authenticated")) {
- return handle_authenticated (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "AuthenticationFailed")) {
- return handle_authentication_failed (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "Authorized")) {
- return handle_authorized (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "AuthorizationFailed")) {
- return handle_authorization_failed (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "Accredited")) {
- return handle_accredited (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "AccreditationFailed")) {
- return handle_accreditation_failed (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "SessionOpened")) {
- return handle_session_opened (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "SessionOpenFailed")) {
- return handle_session_open_failed (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "SessionStarted")) {
- return handle_session_started (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "SessionStopped")) {
- return handle_session_stopped (session_relay, connection, message);
- } else if (dbus_message_is_method_call (message, GDM_SESSION_RELAY_DBUS_INTERFACE, "ConversationStarted")) {
- return handle_conversation_started (session_relay, connection, message);
- }
-
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-static DBusHandlerResult
-do_introspect (DBusConnection *connection,
- DBusMessage *message)
-{
- DBusMessage *reply;
- GString *xml;
- char *xml_string;
-
- g_debug ("GdmSessionRelay: Do introspect");
-
- /* standard header */
- xml = g_string_new ("<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n"
- "\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
- "<node>\n"
- " <interface name=\"org.freedesktop.DBus.Introspectable\">\n"
- " <method name=\"Introspect\">\n"
- " <arg name=\"data\" direction=\"out\" type=\"s\"/>\n"
- " </method>\n"
- " </interface>\n");
-
- /* interface */
- xml = g_string_append (xml,
- " <interface name=\"org.gnome.DisplayManager.SessionRelay\">\n"
- " <method name=\"ConversationStarted\">\n"
- " <arg name=\"service_name\" direction=\"in\" type=\"s\"/>\n"
- " </method>\n"
- " <method name=\"ServiceUnavailable\">\n"
- " <arg name=\"message\" direction=\"in\" type=\"s\"/>\n"
- " </method>\n"
- " <method name=\"SetupComplete\">\n"
- " </method>\n"
- " <method name=\"SetupFailed\">\n"
- " <arg name=\"message\" direction=\"in\" type=\"s\"/>\n"
- " </method>\n"
- " <method name=\"ResetComplete\">\n"
- " </method>\n"
- " <method name=\"RestFailed\">\n"
- " <arg name=\"message\" direction=\"in\" type=\"s\"/>\n"
- " </method>\n"
- " <method name=\"Authenticated\">\n"
- " </method>\n"
- " <method name=\"AuthenticationFailed\">\n"
- " <arg name=\"message\" direction=\"in\" type=\"s\"/>\n"
- " </method>\n"
- " <method name=\"Authorized\">\n"
- " </method>\n"
- " <method name=\"AuthorizationFailed\">\n"
- " <arg name=\"message\" direction=\"in\" type=\"s\"/>\n"
- " </method>\n"
- " <method name=\"Accredited\">\n"
- " </method>\n"
- " <method name=\"AccreditationFailed\">\n"
- " <arg name=\"message\" direction=\"in\" type=\"s\"/>\n"
- " </method>\n"
- " <method name=\"InfoQuery\">\n"
- " <arg name=\"text\" type=\"s\"/>\n"
- " </method>\n"
- " <method name=\"SecretInfoQuery\">\n"
- " <arg name=\"text\" type=\"s\"/>\n"
- " </method>\n"
- " <method name=\"Info\">\n"
- " <arg name=\"text\" type=\"s\"/>\n"
- " </method>\n"
- " <method name=\"Problem\">\n"
- " <arg name=\"text\" type=\"s\"/>\n"
- " </method>\n"
- " <method name=\"SessionStarted\">\n"
- " </method>\n"
- " <method name=\"SessionStopped\">\n"
- " </method>\n"
- " <signal name=\"Reset\">\n"
- " </signal>\n"
- " <signal name=\"Setup\">\n"
- " <arg name=\"service_name\" type=\"s\"/>\n"
- " </signal>\n"
- " <signal name=\"SetupForUser\">\n"
- " <arg name=\"service_name\" type=\"s\"/>\n"
- " <arg name=\"username\" type=\"s\"/>\n"
- " </signal>\n"
- " <signal name=\"Authenticate\">\n"
- " </signal>\n"
- " <signal name=\"Authorize\">\n"
- " </signal>\n"
- " <signal name=\"EstablishCredentials\">\n"
- " </signal>\n"
- " <signal name=\"RefreshCredentials\">\n"
- " </signal>\n"
-
- " <signal name=\"StartConversation\">\n"
- " <arg name=\"service_name\" type=\"s\"/>\n"
- " </signal>\n"
- " <signal name=\"Close\">\n"
- " </signal>\n"
- " <signal name=\"StartSession\">\n"
- " </signal>\n"
- " <signal name=\"AnswerQuery\">\n"
- " <arg name=\"text\" type=\"s\"/>\n"
- " </signal>\n"
- " <signal name=\"LanguageSelected\">\n"
- " <arg name=\"language\" type=\"s\"/>\n"
- " </signal>\n"
- " <signal name=\"SessionSelected\">\n"
- " <arg name=\"session\" type=\"s\"/>\n"
- " </signal>\n"
- " <signal name=\"UserSelected\">\n"
- " <arg name=\"session\" type=\"s\"/>\n"
- " </signal>\n"
- " <signal name=\"Cancelled\">\n"
- " <arg name=\"session\" type=\"s\"/>\n"
- " </signal>\n"
- " </interface>\n");
-
- reply = dbus_message_new_method_return (message);
-
- xml = g_string_append (xml, "</node>\n");
- xml_string = g_string_free (xml, FALSE);
-
- dbus_message_append_args (reply,
- DBUS_TYPE_STRING, &xml_string,
- DBUS_TYPE_INVALID);
-
- g_free (xml_string);
-
- if (reply == NULL) {
- g_error ("No memory");
- }
-
- if (! dbus_connection_send (connection, reply, NULL)) {
- g_error ("No memory");
- }
-
- dbus_message_unref (reply);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-session_relay_message_handler (DBusConnection *connection,
- DBusMessage *message,
- void *user_data)
-{
- const char *dbus_destination = dbus_message_get_destination (message);
- const char *dbus_path = dbus_message_get_path (message);
- const char *dbus_interface = dbus_message_get_interface (message);
- const char *dbus_member = dbus_message_get_member (message);
-
- g_debug ("GdmSessionRelay: session_relay_message_handler: destination=%s obj_path=%s interface=%s method=%s",
- dbus_destination ? dbus_destination : "(null)",
- dbus_path ? dbus_path : "(null)",
- dbus_interface ? dbus_interface : "(null)",
- dbus_member ? dbus_member : "(null)");
-
- if (dbus_message_is_method_call (message, "org.freedesktop.DBus", "AddMatch")) {
- DBusMessage *reply;
-
- reply = dbus_message_new_method_return (message);
-
- if (reply == NULL) {
- g_error ("No memory");
- }
-
- if (! dbus_connection_send (connection, reply, NULL)) {
- g_error ("No memory");
- }
-
- dbus_message_unref (reply);
-
- return DBUS_HANDLER_RESULT_HANDLED;
- } else if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected") &&
- strcmp (dbus_message_get_path (message), DBUS_PATH_LOCAL) == 0) {
-
- /*dbus_connection_unref (connection);*/
-
- return DBUS_HANDLER_RESULT_HANDLED;
- } else if (dbus_message_is_method_call (message, "org.freedesktop.DBus.Introspectable", "Introspect")) {
- return do_introspect (connection, message);
- } else {
- return session_handle_child_message (connection, message, user_data);
- }
-
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-static void
-session_relay_unregister_handler (DBusConnection *connection,
- void *user_data)
-{
- g_debug ("session_relay_unregister_handler");
-}
-
-static DBusHandlerResult
-connection_filter_function (DBusConnection *connection,
- DBusMessage *message,
- void *user_data)
-{
- GdmSessionRelay *session_relay = GDM_SESSION_RELAY (user_data);
- const char *dbus_path = dbus_message_get_path (message);
- const char *dbus_interface = dbus_message_get_interface (message);
- const char *dbus_message = dbus_message_get_member (message);
-
- g_debug ("GdmSessionRelay: obj_path=%s interface=%s method=%s",
- dbus_path ? dbus_path : "(null)",
- dbus_interface ? dbus_interface : "(null)",
- dbus_message ? dbus_message : "(null)");
-
- if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected")
- && strcmp (dbus_path, DBUS_PATH_LOCAL) == 0) {
-
- g_debug ("GdmSessionRelay: Disconnected");
-
- dbus_connection_unref (connection);
- session_relay->priv->session_connection = NULL;
-
- g_signal_emit (session_relay, signals[DISCONNECTED], 0);
- } else if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) {
-
-
- } else {
- return session_relay_message_handler (connection, message, user_data);
- }
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static dbus_bool_t
-allow_user_function (DBusConnection *connection,
- unsigned long uid,
- void *data)
-{
- if (uid == 0) {
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-handle_connection (DBusServer *server,
- DBusConnection *new_connection,
- void *user_data)
-{
- GdmSessionRelay *session_relay = GDM_SESSION_RELAY (user_data);
-
- g_debug ("GdmSessionRelay: Handling new connection");
-
- g_assert (session_relay->priv->session_connection == NULL);
-
- if (session_relay->priv->session_connection == NULL) {
- DBusObjectPathVTable vtable = { &session_relay_unregister_handler,
- &session_relay_message_handler,
- NULL, NULL, NULL, NULL
- };
-
- session_relay->priv->session_connection = new_connection;
- dbus_connection_ref (new_connection);
- dbus_connection_setup_with_g_main (new_connection, NULL);
-
- g_debug ("GdmSessionRelay: session connection is %p", new_connection);
-
- dbus_connection_add_filter (new_connection,
- connection_filter_function,
- session_relay,
- NULL);
-
- dbus_connection_set_unix_user_function (new_connection,
- allow_user_function,
- session_relay,
- NULL);
-
- dbus_connection_register_object_path (new_connection,
- GDM_SESSION_RELAY_DBUS_PATH,
- &vtable,
- session_relay);
-
- g_signal_emit (session_relay, signals[CONNECTED], 0);
- }
-}
-
-gboolean
-gdm_session_relay_start (GdmSessionRelay *session_relay)
-{
- DBusError error;
- gboolean ret;
- char *address;
- const char *auth_mechanisms[] = {"EXTERNAL", NULL};
-
- ret = FALSE;
-
- g_debug ("GdmSessionRelay: Creating D-Bus relay for session");
-
- address = generate_address ();
-
- dbus_error_init (&error);
- session_relay->priv->server = dbus_server_listen (address, &error);
- g_free (address);
-
- if (session_relay->priv->server == NULL) {
- g_warning ("Cannot create D-BUS relay for the session: %s", error.message);
- /* FIXME: should probably fail if we can't create the socket */
- goto out;
- }
-
- dbus_server_setup_with_g_main (session_relay->priv->server, NULL);
- dbus_server_set_auth_mechanisms (session_relay->priv->server, auth_mechanisms);
- dbus_server_set_new_connection_function (session_relay->priv->server,
- handle_connection,
- session_relay,
- NULL);
- ret = TRUE;
-
- g_free (session_relay->priv->server_address);
- session_relay->priv->server_address = dbus_server_get_address (session_relay->priv->server);
-
- g_debug ("GdmSessionRelay: D-Bus relay listening on %s", session_relay->priv->server_address);
-
- out:
-
- return ret;
-}
-
-gboolean
-gdm_session_relay_stop (GdmSessionRelay *session_relay)
-{
- gboolean ret;
-
- ret = FALSE;
-
- g_debug ("GdmSessionRelay: Stopping session relay...");
-
- return ret;
-}
-
-char *
-gdm_session_relay_get_address (GdmSessionRelay *session_relay)
-{
- return g_strdup (session_relay->priv->server_address);
-}
-
-static void
-gdm_session_iface_init (GdmSessionIface *iface)
-{
-
- iface->start_conversation = gdm_session_relay_start_conversation;
- iface->setup = gdm_session_relay_setup;
- iface->setup_for_user = gdm_session_relay_setup_for_user;
- iface->authenticate = gdm_session_relay_authenticate;
- iface->authorize = gdm_session_relay_authorize;
- iface->accredit = gdm_session_relay_accredit;
- iface->open_session = gdm_session_relay_open_session;
- iface->close = gdm_session_relay_close;
-
- iface->cancel = gdm_session_relay_cancel;
- iface->start_session = gdm_session_relay_start_session;
- iface->answer_query = gdm_session_relay_answer_query;
- iface->select_session = gdm_session_relay_select_session;
- iface->select_language = gdm_session_relay_select_language;
- iface->select_user = gdm_session_relay_select_user;
-}
-
-static void
-gdm_session_relay_class_init (GdmSessionRelayClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- g_type_class_add_private (klass, sizeof (GdmSessionRelayPrivate));
-
- signals [CONNECTED] =
- g_signal_new ("connected",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionRelayClass, connected),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
- signals [DISCONNECTED] =
- g_signal_new ("disconnected",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionRelayClass, disconnected),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
-}
-
-static void
-gdm_session_relay_init (GdmSessionRelay *session_relay)
-{
-
- session_relay->priv = GDM_SESSION_RELAY_GET_PRIVATE (session_relay);
-}
-
-GdmSessionRelay *
-gdm_session_relay_new (void)
-{
- GObject *object;
-
- object = g_object_new (GDM_TYPE_SESSION_RELAY,
- NULL);
-
- return GDM_SESSION_RELAY (object);
-}
diff --git a/daemon/gdm-session-relay.h b/daemon/gdm-session-relay.h
deleted file mode 100644
index 5efd2bd3..00000000
--- a/daemon/gdm-session-relay.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-
-#ifndef __GDM_SESSION_RELAY_H
-#define __GDM_SESSION_RELAY_H
-
-#include <glib-object.h>
-
-#include "gdm-session.h"
-
-G_BEGIN_DECLS
-
-#define GDM_TYPE_SESSION_RELAY (gdm_session_relay_get_type ())
-#define GDM_SESSION_RELAY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_SESSION_RELAY, GdmSessionRelay))
-#define GDM_SESSION_RELAY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_SESSION_RELAY, GdmSessionRelayClass))
-#define GDM_IS_SESSION_RELAY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_SESSION_RELAY))
-#define GDM_IS_SESSION_RELAY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_SESSION_RELAY))
-#define GDM_SESSION_RELAY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_SESSION_RELAY, GdmSessionRelayClass))
-
-typedef struct GdmSessionRelayPrivate GdmSessionRelayPrivate;
-
-typedef struct
-{
- GObject parent;
- GdmSessionRelayPrivate *priv;
-} GdmSessionRelay;
-
-typedef struct
-{
- GObjectClass parent_class;
-
- /* Signals */
- void (* connected) (GdmSessionRelay *session_relay);
- void (* disconnected) (GdmSessionRelay *session_relay);
-} GdmSessionRelayClass;
-
-GType gdm_session_relay_get_type (void);
-GdmSessionRelay * gdm_session_relay_new (void);
-
-gboolean gdm_session_relay_start (GdmSessionRelay *session_relay);
-gboolean gdm_session_relay_stop (GdmSessionRelay *session_relay);
-char * gdm_session_relay_get_address (GdmSessionRelay *session_relay);
-
-G_END_DECLS
-
-#endif /* __GDM_SESSION_RELAY_H */
diff --git a/daemon/gdm-session.xml b/daemon/gdm-session.xml
new file mode 100644
index 00000000..ac0d2e96
--- /dev/null
+++ b/daemon/gdm-session.xml
@@ -0,0 +1,160 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node name="/org/gnome/DisplayManager/Session">
+ <!-- methods are called by the child (product slave or session worker),
+ signals are emitted by the parent (factory slave or simple slave) -->
+ <interface name="org.gnome.DisplayManager.Session">
+ <!-- only used by SessionRelay (factory slave to product slave) -->
+ <method name="ConversationStarted">
+ <arg name="service_name" direction="in" type="s"/>
+ </method>
+ <method name="ServiceUnavailable">
+ <arg name="message" direction="in" type="s"/>
+ </method>
+ <signal name="StartConversation">
+ <!-- XXX fold in Setup? -->
+ <arg name="service_name" type="s"/>
+ </signal>
+ <signal name="Close"/>
+ <signal name="Cancelled"/> <!-- XXX: fold in Reset? -->
+
+ <!-- only used by SessionDirect (simple slave to session worker) -->
+ <method name="CancelPendingQuery">
+ <!-- XXX why isn't this used by SessionRelay? -->
+ </method>
+ <signal name="StartProgram">
+ <arg name="command" type="s"/>
+ </signal>
+
+ <!-- used by both of them -->
+ <method name="SetupComplete">
+ <arg name="service_name" direction="in" type="s"/>
+ </method>
+ <method name="SetupFailed">
+ <arg name="service_name" direction="in" type="s"/>
+ <arg name="message" direction="in" type="s"/>
+ </method>
+ <method name="Authenticated">
+ <arg name="service_name" direction="in" type="s"/>
+ </method>
+ <method name="AuthenticationFailed">
+ <arg name="service_name" direction="in" type="s"/>
+ <arg name="message" direction="in" type="s"/>
+ </method>
+ <method name="Authorized">
+ <arg name="service_name" direction="in" type="s"/>
+ </method>
+ <method name="AuthorizationFailed">
+ <arg name="service_name" direction="in" type="s"/>
+ <arg name="message" direction="in" type="s"/>
+ </method>
+ <method name="Accredited">
+ <arg name="service_name" direction="in" type="s"/>
+ </method>
+ <method name="AccreditationFailed">
+ <arg name="service_name" direction="in" type="s"/>
+ <arg name="message" direction="in" type="s"/>
+ </method>
+ <method name="InfoQuery">
+ <arg name="service_name" direction="in" type="s"/>
+ <arg name="text" direction="in" type="s"/>
+ <arg name="answer" direction="out" type="s"/>
+ </method>
+ <method name="SecretInfoQuery">
+ <arg name="service_name" direction="in" type="s"/>
+ <arg name="text" direction="in" type="s"/>
+ <arg name="answer" direction="out" type="s"/>
+ </method>
+ <method name="Info">
+ <arg name="service_name" direction="in" type="s"/>
+ <arg name="text" direction="in" type="s"/>
+ </method>
+ <method name="Problem">
+ <arg name="service_name" direction="in" type="s"/>
+ <arg name="text" direction="in" type="s"/>
+ </method>
+ <method name="Opened">
+ <arg name="service_name" direction="in" type="s"/>
+ </method>
+ <method name="OpenFailed">
+ <arg name="service_name" direction="in" type="s"/>
+ <arg name="message" direction="in" type="s"/>
+ </method>
+ <method name="SessionStarted">
+ <arg name="pid" direction="in" type="i"/>
+ </method>
+ <method name="SessionExited">
+ <arg name="service_name" direction="in" type="s"/>
+ <!-- This is a combination of exit code and exit
+ signal. Use macros in sys/wait.h to handle it. -->
+ <arg name="status" direction="in" type="i"/>
+ </method>
+
+ <signal name="Reset" />
+ <signal name="Setup">
+ <!-- Only service_name is used by SessionRelay -->
+ <arg name="service_name" type="s"/>
+ <arg name="x11_display_name" type="s"/>
+ <arg name="x11_authority_file" type="s"/>
+ <arg name="display_device" type="s"/>
+ <arg name="display_seat" type="s"/>
+ <arg name="hostname" type="s"/>
+ </signal>
+ <signal name="SetupForUser">
+ <!-- Only service_name and username are used by SessionRelay -->
+ <arg name="service_name" type="s"/>
+ <arg name="user_name" type="s"/>
+ <arg name="x11_display_name" type="s"/>
+ <arg name="x11_authority_file" type="s"/>
+ <arg name="display_device" type="s"/>
+ <arg name="display_seat" type="s"/>
+ <arg name="hostname" type="s"/>
+ </signal>
+ <signal name="SetupForProgram">
+ <!-- not used by SessionRelay (but kept here because it's near
+ the other Setup* signals -->
+ <arg name="service_name" type="s"/>
+ <arg name="x11_display_name" type="s"/>
+ <arg name="x11_authority_file" type="s"/>
+ <arg name="display_device" type="s"/>
+ <arg name="display_seat" type="s"/>
+ <arg name="hostname" type="s"/>
+ <arg name="log_file" type="s"/>
+ </signal>
+ <signal name="Authenticate">
+ <arg name="service_name" type="s"/>
+ </signal>
+ <signal name="Authorize">
+ <arg name="service_name" type="s"/>
+ </signal>
+ <signal name="EstablishCredentials">
+ <arg name="service_name" type="s"/>
+ </signal>
+ <signal name="RefreshCredentials">
+ <arg name="service_name" type="s"/>
+ </signal>
+ <signal name="OpenSession">
+ <arg name="service_name" type="s"/>
+ </signal>
+ <signal name="StartSession">
+ <arg name="service_name" type="s"/>
+ </signal>
+ <signal name="SetEnvironmentVariable">
+ <arg name="name" type="s" />
+ <arg name="value" type="s" />
+ </signal>
+ <signal name="SetLanguageName">
+ <arg name="language" type="s" />
+ </signal>
+ <signal name="SetSessionName">
+ <arg name="session_name" type="s" />
+ </signal>
+ <signal name="SetSessionType">
+ <!-- XXX session type? -->
+ <arg name="session_type" type="s" />
+ </signal>
+ <signal name="SetUserName">
+ <!-- XXX why isn't this used by SessionDirect? -->
+ <arg name="user_name" type="s" />
+ </signal>
+ </interface>
+</node>