diff options
author | Giovanni Campagna <gcampagna@src.gnome.org> | 2012-05-07 18:58:11 +0200 |
---|---|---|
committer | Giovanni Campagna <gcampagna@src.gnome.org> | 2012-05-18 16:12:44 +0200 |
commit | 6c5255e60a58b08d1f018040357216ca0affc77c (patch) | |
tree | 974d0fa507f2c6968ed1c0d79634d5d2840e908a | |
parent | e177962d33a480e401b0b70fb35ea3224516c654 (diff) | |
download | gdm-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.am | 28 | ||||
-rw-r--r-- | daemon/gdm-factory-slave.c | 533 | ||||
-rw-r--r-- | daemon/gdm-product-slave.c | 918 | ||||
-rw-r--r-- | daemon/gdm-session-relay.c | 1299 | ||||
-rw-r--r-- | daemon/gdm-session-relay.h | 64 | ||||
-rw-r--r-- | daemon/gdm-session.xml | 160 |
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> |