summaryrefslogtreecommitdiff
path: root/daemon/gdm-session-worker.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/gdm-session-worker.c')
-rw-r--r--daemon/gdm-session-worker.c960
1 files changed, 288 insertions, 672 deletions
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index 44dbfa27..ddd91e11 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -39,10 +39,6 @@
#include <glib/gstdio.h>
#include <glib-object.h>
#include <gio/gio.h>
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
#include <X11/Xauth.h>
@@ -53,6 +49,7 @@
#include "gdm-common.h"
#include "gdm-log.h"
#include "gdm-session-worker.h"
+#include "gdm-session-glue.h"
#if defined (HAVE_ADT)
#include "gdm-session-solaris-auditor.h"
@@ -67,7 +64,7 @@
#define GDM_SESSION_WORKER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_SESSION_WORKER, GdmSessionWorkerPrivate))
#define GDM_SESSION_DBUS_PATH "/org/gnome/DisplayManager/Session"
-#define GDM_SESSION_DBUS_INTERFACE "org.gnome.DisplayManager.Session"
+#define GDM_SESSION_DBUS_NAME "org.gnome.DisplayManager.Session"
#define GDM_SESSION_DBUS_ERROR_CANCEL "org.gnome.DisplayManager.Session.Error.Cancel"
#ifndef GDM_PASSWD_AUXILLARY_BUFFER_SIZE
@@ -138,7 +135,8 @@ struct GdmSessionWorkerPrivate
guint state_change_idle_id;
char *server_address;
- DBusConnection *connection;
+ GDBusConnection *connection;
+ GdmDBusSession *session_proxy;
GdmSessionAuditor *auditor;
GdmSessionSettings *user_settings;
@@ -521,148 +519,6 @@ gdm_session_execute (const char *file,
return -1;
}
-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 ("GdmSessionWorker: Calling %s", method);
- message = dbus_message_new_method_call (NULL,
- GDM_SESSION_DBUS_PATH,
- GDM_SESSION_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_debug ("%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,
- GDM_SESSION_DBUS_PATH,
- GDM_SESSION_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 gboolean
-send_dbus_void_method (DBusConnection *connection,
- const char *method)
-{
- DBusError error;
- DBusMessage *message;
- DBusMessage *reply;
-
- g_debug ("GdmSessionWorker: Calling %s", method);
- message = dbus_message_new_method_call (NULL,
- GDM_SESSION_DBUS_PATH,
- GDM_SESSION_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 (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;
-}
-
/*
* This function is called with username set to NULL to update the
* auditor username value.
@@ -728,9 +584,10 @@ gdm_session_worker_update_username (GdmSessionWorker *worker)
worker->priv->username = username;
username = NULL;
- send_dbus_string_method (worker->priv->connection,
- "UsernameChanged",
- worker->priv->username);
+ gdm_dbus_session_call_username_changed_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ worker->priv->username,
+ NULL, NULL);
/* We have a new username to try. If we haven't been able to
* read user settings up until now, then give it a go now
@@ -748,81 +605,15 @@ gdm_session_worker_update_username (GdmSessionWorker *worker)
}
static gboolean
-send_question_method (GdmSessionWorker *worker,
- const char *method,
- const char *question,
- char **answerp)
-{
- DBusError error;
- DBusMessage *message;
- DBusMessage *reply;
- DBusMessageIter iter;
- gboolean ret;
- const char *answer;
-
- ret = FALSE;
-
- g_debug ("GdmSessionWorker: Calling %s", method);
- message = dbus_message_new_method_call (NULL,
- GDM_SESSION_DBUS_PATH,
- GDM_SESSION_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,
- &question);
-
- dbus_error_init (&error);
-
- /*
- * Pass in INT_MAX for the timeout. This is a special value that
- * means block forever. This fixes bug #607861
- */
- reply = dbus_connection_send_with_reply_and_block (worker->priv->connection,
- message,
- INT_MAX,
- &error);
- dbus_message_unref (message);
-
- if (dbus_error_is_set (&error)) {
- if (dbus_error_has_name (&error, GDM_SESSION_DBUS_ERROR_CANCEL)) {
- worker->priv->cancelled = TRUE;
- } else if (dbus_error_has_name (&error, DBUS_ERROR_NO_REPLY)) {
- worker->priv->timed_out = TRUE;
- }
- g_debug ("%s %s raised: %s\n",
- method,
- error.name,
- error.message);
- goto out;
- }
-
- dbus_message_iter_init (reply, &iter);
- dbus_message_iter_get_basic (&iter, &answer);
- if (answerp != NULL) {
- *answerp = g_strdup (answer);
- }
- ret = TRUE;
-
- dbus_message_unref (reply);
- dbus_connection_flush (worker->priv->connection);
-
- out:
-
- return ret;
-}
-
-static gboolean
gdm_session_worker_ask_question (GdmSessionWorker *worker,
const char *question,
char **answerp)
{
- return send_question_method (worker, "InfoQuery", question, answerp);
+ return gdm_dbus_session_call_info_query_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ question,
+ answerp,
+ NULL, NULL);
}
static gboolean
@@ -830,25 +621,31 @@ gdm_session_worker_ask_for_secret (GdmSessionWorker *worker,
const char *question,
char **answerp)
{
- return send_question_method (worker, "SecretInfoQuery", question, answerp);
+ return gdm_dbus_session_call_secret_info_query_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ question,
+ answerp,
+ NULL, NULL);
}
static gboolean
gdm_session_worker_report_info (GdmSessionWorker *worker,
const char *info)
{
- return send_dbus_string_method (worker->priv->connection,
- "Info",
- info);
+ return gdm_dbus_session_call_info_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ info,
+ NULL, NULL);
}
static gboolean
gdm_session_worker_report_problem (GdmSessionWorker *worker,
const char *problem)
{
- return send_dbus_string_method (worker->priv->connection,
- "Problem",
- problem);
+ return gdm_dbus_session_call_problem_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ problem,
+ NULL, NULL);
}
static char *
@@ -923,7 +720,9 @@ gdm_session_worker_process_pam_message (GdmSessionWorker *worker,
}
if (worker->priv->timed_out) {
- send_dbus_void_method (worker->priv->connection, "CancelPendingQuery");
+ gdm_dbus_session_call_cancel_pending_query_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ NULL, NULL);
worker->priv->timed_out = FALSE;
}
@@ -1705,19 +1504,10 @@ session_worker_child_watch (GPid pid,
gdm_session_worker_uninitialize_pam (worker, PAM_SUCCESS);
- if (WIFEXITED (status)) {
- int code = WEXITSTATUS (status);
-
- send_dbus_int_method (worker->priv->connection,
- "SessionExited",
- code);
- } else if (WIFSIGNALED (status)) {
- int num = WTERMSIG (status);
-
- send_dbus_int_method (worker->priv->connection,
- "SessionDied",
- num);
- }
+ gdm_dbus_session_call_session_exited_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ status,
+ NULL, NULL);
worker->priv->child_pid = -1;
}
@@ -2106,120 +1896,46 @@ gdm_session_worker_get_property (GObject *object,
}
static void
-on_set_environment_variable (GdmSessionWorker *worker,
- DBusMessage *message)
-{
- DBusError error;
- const char *key;
- const char *value;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &key,
- DBUS_TYPE_STRING, &value,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmSessionWorker: set env: %s = %s", key, value);
- gdm_session_worker_set_environment_variable (worker, key, value);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
+on_set_environment_variable (GdmDBusSession *proxy,
+ const char *key,
+ const char *value,
+ GdmSessionWorker *worker)
+{
+ g_debug ("GdmSessionWorker: set env: %s = %s", key, value);
+ gdm_session_worker_set_environment_variable (worker, key, value);
}
static void
-gdm_session_worker_set_session_name (GdmSessionWorker *worker,
- const char *session_name)
+on_set_session_name (GdmDBusSession *proxy,
+ const char *session_name,
+ GdmSessionWorker *worker)
{
+ g_debug ("GdmSessionWorker: session name set to %s", session_name);
gdm_session_settings_set_session_name (worker->priv->user_settings,
session_name);
}
static void
-on_set_session_name (GdmSessionWorker *worker,
- DBusMessage *message)
-{
- DBusError error;
- const char *session_name;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &session_name,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmSessionWorker: session name set to %s", session_name);
- gdm_session_worker_set_session_name (worker, session_name);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
-}
-
-static void
-gdm_session_worker_set_session_type (GdmSessionWorker *worker,
- const char *session_type)
+on_set_session_type (GdmDBusSession *proxy,
+ const char *session_type,
+ GdmSessionWorker *worker)
{
+ g_debug ("GdmSessionWorker: session type set to %s", session_type);
g_free (worker->priv->session_type);
worker->priv->session_type = g_strdup (session_type);
}
static void
-on_set_session_type (GdmSessionWorker *worker,
- DBusMessage *message)
-{
- DBusError error;
- const char *session_type;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &session_type,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmSessionWorker: session type set to %s", session_type);
- gdm_session_worker_set_session_type (worker, session_type);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
-}
-
-static void
-gdm_session_worker_set_language_name (GdmSessionWorker *worker,
- const char *language_name)
+on_set_language_name (GdmDBusSession *proxy,
+ const char *language_name,
+ GdmSessionWorker *worker)
{
+ g_debug ("GdmSessionWorker: language name set to %s", language_name);
gdm_session_settings_set_language_name (worker->priv->user_settings,
language_name);
}
static void
-on_set_language_name (GdmSessionWorker *worker,
- DBusMessage *message)
-{
- DBusError error;
- const char *language_name;
- dbus_bool_t res;
-
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &language_name,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmSessionWorker: language name set to %s", language_name);
- gdm_session_worker_set_language_name (worker, language_name);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
-}
-
-static void
on_saved_language_name_read (GdmSessionWorker *worker)
{
char *language_name;
@@ -2227,9 +1943,9 @@ on_saved_language_name_read (GdmSessionWorker *worker)
language_name = gdm_session_settings_get_language_name (worker->priv->user_settings);
g_debug ("GdmSessionWorker: Saved language is %s", language_name);
- send_dbus_string_method (worker->priv->connection,
- "SavedLanguageNameRead",
- language_name);
+ gdm_dbus_session_call_saved_language_name_read_sync (worker->priv->session_proxy,
+ language_name,
+ NULL, NULL);
g_free (language_name);
}
@@ -2241,9 +1957,9 @@ on_saved_session_name_read (GdmSessionWorker *worker)
session_name = gdm_session_settings_get_session_name (worker->priv->user_settings);
g_debug ("GdmSessionWorker: Saved session is %s", session_name);
- send_dbus_string_method (worker->priv->connection,
- "SavedSessionNameRead",
- session_name);
+ gdm_dbus_session_call_saved_session_name_read_sync (worker->priv->session_proxy,
+ session_name,
+ NULL, NULL);
g_free (session_name);
}
@@ -2267,12 +1983,15 @@ do_setup (GdmSessionWorker *worker)
if (g_error_matches (error,
GDM_SESSION_WORKER_ERROR,
GDM_SESSION_WORKER_ERROR_SERVICE_UNAVAILABLE)) {
- send_dbus_void_method (worker->priv->connection,
- "ServiceUnavailable");
+ gdm_dbus_session_call_service_unavailable_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ error->message,
+ NULL, NULL);
} else {
- send_dbus_string_method (worker->priv->connection,
- "SetupFailed",
- error->message);
+ gdm_dbus_session_call_setup_failed_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ error->message,
+ NULL, NULL);
}
g_error_free (error);
return;
@@ -2290,7 +2009,9 @@ do_setup (GdmSessionWorker *worker)
G_CALLBACK (on_saved_language_name_read),
worker);
- send_dbus_void_method (worker->priv->connection, "SetupComplete");
+ gdm_dbus_session_call_setup_complete_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ NULL, NULL);
}
static void
@@ -2310,13 +2031,16 @@ do_authenticate (GdmSessionWorker *worker)
GDM_SESSION_WORKER_ERROR,
GDM_SESSION_WORKER_ERROR_SERVICE_UNAVAILABLE)) {
g_debug ("GdmSessionWorker: Unable to use authentication service");
- send_dbus_void_method (worker->priv->connection,
- "ServiceUnavailable");
+ gdm_dbus_session_call_service_unavailable_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ error->message,
+ NULL, NULL);
} else {
g_debug ("GdmSessionWorker: Unable to verify user");
- send_dbus_string_method (worker->priv->connection,
- "AuthenticationFailed",
- error->message);
+ gdm_dbus_session_call_authentication_failed_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ error->message,
+ NULL, NULL);
}
g_error_free (error);
return;
@@ -2330,7 +2054,9 @@ do_authenticate (GdmSessionWorker *worker)
gdm_session_worker_update_username (worker);
}
- send_dbus_void_method (worker->priv->connection, "Authenticated");
+ gdm_dbus_session_call_authenticated_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ NULL, NULL);
}
static void
@@ -2346,14 +2072,17 @@ do_authorize (GdmSessionWorker *worker)
worker->priv->password_is_required,
&error);
if (! res) {
- send_dbus_string_method (worker->priv->connection,
- "AuthorizationFailed",
- error->message);
+ gdm_dbus_session_call_authorization_failed_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ error->message,
+ NULL, NULL);
g_error_free (error);
return;
}
- send_dbus_void_method (worker->priv->connection, "Authorized");
+ gdm_dbus_session_call_authorized_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ NULL, NULL);
}
static void
@@ -2368,14 +2097,17 @@ do_accredit (GdmSessionWorker *worker)
res = gdm_session_worker_accredit_user (worker, &error);
if (! res) {
- send_dbus_string_method (worker->priv->connection,
- "AccreditationFailed",
- error->message);
+ gdm_dbus_session_call_accreditation_failed_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ error->message,
+ NULL, NULL);
g_error_free (error);
return;
}
- send_dbus_void_method (worker->priv->connection, "Accredited");
+ gdm_dbus_session_call_accredited_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ NULL, NULL);
}
static void
@@ -2445,14 +2177,17 @@ do_open_session (GdmSessionWorker *worker)
error = NULL;
res = gdm_session_worker_open_session (worker, &error);
if (! res) {
- send_dbus_string_method (worker->priv->connection,
- "OpenFailed",
- error->message);
+ gdm_dbus_session_call_open_failed_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ error->message,
+ NULL, NULL);
g_error_free (error);
return;
}
- send_dbus_void_method (worker->priv->connection, "SessionOpened");
+ gdm_dbus_session_call_opened_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ NULL, NULL);
}
static void
@@ -2464,16 +2199,18 @@ do_start_session (GdmSessionWorker *worker)
error = NULL;
res = gdm_session_worker_start_session (worker, &error);
if (! res) {
- send_dbus_string_method (worker->priv->connection,
- "StartFailed",
- error->message);
+ gdm_dbus_session_call_session_start_failed_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ error->message,
+ NULL, NULL);
g_error_free (error);
return;
}
- send_dbus_int_method (worker->priv->connection,
- "SessionStarted",
- (int)worker->priv->child_pid);
+ gdm_dbus_session_call_session_started_sync (worker->priv->session_proxy,
+ worker->priv->service,
+ worker->priv->child_pid,
+ NULL, NULL);
}
static const char *
@@ -2567,212 +2304,136 @@ queue_state_change (GdmSessionWorker *worker)
}
static void
-on_start_program (GdmSessionWorker *worker,
- DBusMessage *message)
+on_start_program (GdmDBusSession *proxy,
+ const char *text,
+ GdmSessionWorker *worker)
{
- DBusError error;
- const char *text;
- dbus_bool_t res;
+ GError *parse_error = NULL;
if (worker->priv->state != GDM_SESSION_WORKER_STATE_SESSION_OPENED) {
g_debug ("GdmSessionWorker: ignoring spurious start program while in state %s", get_state_name (worker->priv->state));
return;
}
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &text,
- DBUS_TYPE_INVALID);
- if (res) {
- GError *parse_error;
-
- g_debug ("GdmSessionWorker: start program: %s", text);
-
- if (worker->priv->arguments != NULL) {
- g_strfreev (worker->priv->arguments);
- worker->priv->arguments = NULL;
- }
-
- parse_error = NULL;
- if (! g_shell_parse_argv (text, NULL, &worker->priv->arguments, &parse_error)) {
- g_warning ("Unable to parse command: %s", parse_error->message);
- g_error_free (parse_error);
- return;
- }
+ g_debug ("GdmSessionWorker: start program: %s", text);
- queue_state_change (worker);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
+ g_clear_pointer (&worker->priv->arguments, (GDestroyNotify) g_strfreev);
+ if (! g_shell_parse_argv (text, NULL, &worker->priv->arguments, &parse_error)) {
+ g_warning ("Unable to parse command: %s", parse_error->message);
+ g_error_free (parse_error);
+ return;
}
+
+ queue_state_change (worker);
}
static void
-on_setup (GdmSessionWorker *worker,
- DBusMessage *message)
-{
- DBusError error;
- const char *service;
- const char *x11_display_name;
- const char *x11_authority_file;
- const char *console;
- const char *seat_id;
- const char *hostname;
- dbus_bool_t res;
-
+on_setup (GdmDBusSession *proxy,
+ const char *service,
+ const char *x11_display_name,
+ const char *x11_authority_file,
+ const char *console,
+ const char *seat_id,
+ const char *hostname,
+ GdmSessionWorker *worker)
+{
if (worker->priv->state != GDM_SESSION_WORKER_STATE_NONE) {
g_debug ("GdmSessionWorker: ignoring spurious setup while in state %s", get_state_name (worker->priv->state));
return;
}
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service,
- DBUS_TYPE_STRING, &x11_display_name,
- DBUS_TYPE_STRING, &console,
- DBUS_TYPE_STRING, &seat_id,
- DBUS_TYPE_STRING, &hostname,
- DBUS_TYPE_STRING, &x11_authority_file,
- DBUS_TYPE_INVALID);
- if (res) {
- worker->priv->service = g_strdup (service);
- worker->priv->x11_display_name = g_strdup (x11_display_name);
- worker->priv->x11_authority_file = g_strdup (x11_authority_file);
- worker->priv->display_device = g_strdup (console);
- worker->priv->display_seat_id = g_strdup (seat_id);
- worker->priv->hostname = g_strdup (hostname);
- worker->priv->username = NULL;
-
- g_debug ("GdmSessionWorker: queuing setup: %s %s", service, console);
- queue_state_change (worker);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
+ worker->priv->service = g_strdup (service);
+ worker->priv->x11_display_name = g_strdup (x11_display_name);
+ worker->priv->x11_authority_file = g_strdup (x11_authority_file);
+ worker->priv->display_device = g_strdup (console);
+ worker->priv->display_seat_id = g_strdup (seat_id);
+ worker->priv->hostname = g_strdup (hostname);
+ worker->priv->username = NULL;
+
+ g_debug ("GdmSessionWorker: queuing setup: %s %s", service, console);
+ queue_state_change (worker);
}
static void
-on_setup_for_user (GdmSessionWorker *worker,
- DBusMessage *message)
-{
- DBusError error;
- const char *service;
- const char *x11_display_name;
- const char *x11_authority_file;
- const char *console;
- const char *seat_id;
- const char *hostname;
- const char *username;
- dbus_bool_t res;
-
+on_setup_for_user (GdmDBusSession *proxy,
+ const char *service,
+ const char *username,
+ const char *x11_display_name,
+ const char *x11_authority_file,
+ const char *console,
+ const char *seat_id,
+ const char *hostname,
+ GdmSessionWorker *worker)
+{
if (worker->priv->state != GDM_SESSION_WORKER_STATE_NONE) {
- g_debug ("GdmSessionWorker: ignoring spurious setup for user while in state %s", get_state_name (worker->priv->state));
+ g_debug ("GdmSessionWorker: ignoring spurious setup while in state %s", get_state_name (worker->priv->state));
return;
}
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service,
- DBUS_TYPE_STRING, &x11_display_name,
- DBUS_TYPE_STRING, &console,
- DBUS_TYPE_STRING, &seat_id,
- DBUS_TYPE_STRING, &hostname,
- DBUS_TYPE_STRING, &x11_authority_file,
- DBUS_TYPE_STRING, &username,
- DBUS_TYPE_INVALID);
- if (res) {
- worker->priv->service = g_strdup (service);
- worker->priv->x11_display_name = g_strdup (x11_display_name);
- worker->priv->x11_authority_file = g_strdup (x11_authority_file);
- worker->priv->display_device = g_strdup (console);
- worker->priv->display_seat_id = g_strdup (seat_id);
- worker->priv->hostname = g_strdup (hostname);
- worker->priv->username = g_strdup (username);
-
- g_signal_connect_swapped (worker->priv->user_settings,
- "notify::language-name",
- G_CALLBACK (on_saved_language_name_read),
- worker);
-
- g_signal_connect_swapped (worker->priv->user_settings,
- "notify::session-name",
- G_CALLBACK (on_saved_session_name_read),
- worker);
-
- /* Load settings from accounts daemon before continuing
- * FIXME: need to handle username not loading
- */
- if (gdm_session_settings_load (worker->priv->user_settings, username)) {
- queue_state_change (worker);
- } else {
- g_signal_connect (G_OBJECT (worker->priv->user_settings),
- "notify::is-loaded",
- G_CALLBACK (on_settings_is_loaded_changed),
- worker);
- }
+ worker->priv->service = g_strdup (service);
+ worker->priv->x11_display_name = g_strdup (x11_display_name);
+ worker->priv->x11_authority_file = g_strdup (x11_authority_file);
+ worker->priv->display_device = g_strdup (console);
+ worker->priv->display_seat_id = g_strdup (seat_id);
+ worker->priv->hostname = g_strdup (hostname);
+ worker->priv->username = g_strdup (username);
+
+ g_signal_connect_swapped (worker->priv->user_settings,
+ "notify::language-name",
+ G_CALLBACK (on_saved_language_name_read),
+ worker);
+
+ g_signal_connect_swapped (worker->priv->user_settings,
+ "notify::session-name",
+ G_CALLBACK (on_saved_session_name_read),
+ worker);
+
+ /* Load settings from accounts daemon before continuing
+ * FIXME: need to handle username not loading
+ */
+ if (gdm_session_settings_load (worker->priv->user_settings, username)) {
+ queue_state_change (worker);
} else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
+ g_signal_connect (G_OBJECT (worker->priv->user_settings),
+ "notify::is-loaded",
+ G_CALLBACK (on_settings_is_loaded_changed),
+ worker);
}
}
static void
-on_setup_for_program (GdmSessionWorker *worker,
- DBusMessage *message)
-{
- DBusError error;
- char *service;
- char *x11_display_name;
- char *console;
- char *seat_id;
- char *hostname;
- char *x11_authority_file;
- char *log_file;
- dbus_bool_t res;
-
+on_setup_for_program (GdmDBusSession *proxy,
+ const char *service,
+ const char *x11_display_name,
+ const char *x11_authority_file,
+ const char *console,
+ const char *seat_id,
+ const char *hostname,
+ const char *log_file,
+ GdmSessionWorker *worker)
+{
if (worker->priv->state != GDM_SESSION_WORKER_STATE_NONE) {
- g_debug ("GdmSessionWorker: ignoring spurious setup for program while in state %s", get_state_name (worker->priv->state));
+ g_debug ("GdmSessionWorker: ignoring spurious setup while in state %s", get_state_name (worker->priv->state));
return;
}
- dbus_error_init (&error);
- res = dbus_message_get_args (message,
- &error,
- DBUS_TYPE_STRING, &service,
- DBUS_TYPE_STRING, &x11_display_name,
- DBUS_TYPE_STRING, &console,
- DBUS_TYPE_STRING, &seat_id,
- DBUS_TYPE_STRING, &hostname,
- DBUS_TYPE_STRING, &x11_authority_file,
- DBUS_TYPE_STRING, &log_file,
- DBUS_TYPE_INVALID);
- if (res) {
- g_debug ("GdmSessionWorker: program with log file '%s'", log_file);
-
- queue_state_change (worker);
- worker->priv->service = g_strdup (service);
- worker->priv->username = g_strdup (GDM_USERNAME);
- worker->priv->x11_display_name = g_strdup (x11_display_name);
- worker->priv->hostname = g_strdup (hostname);
- worker->priv->display_device = g_strdup (console);
- worker->priv->display_seat_id = g_strdup (seat_id);
- worker->priv->x11_authority_file = g_strdup (x11_authority_file);
- worker->priv->log_file = g_strdup (log_file);
- worker->priv->is_program_session = TRUE;
+ worker->priv->service = g_strdup (service);
+ worker->priv->x11_display_name = g_strdup (x11_display_name);
+ worker->priv->x11_authority_file = g_strdup (x11_authority_file);
+ worker->priv->display_device = g_strdup (console);
+ worker->priv->display_seat_id = g_strdup (seat_id);
+ worker->priv->hostname = g_strdup (hostname);
+ worker->priv->username = g_strdup (GDM_USERNAME);
+ worker->priv->log_file = g_strdup (log_file);
+ worker->priv->is_program_session = TRUE;
- queue_state_change (worker);
- } else {
- g_warning ("Unable to get arguments: %s", error.message);
- dbus_error_free (&error);
- }
+ queue_state_change (worker);
}
static void
-on_authenticate (GdmSessionWorker *worker,
- DBusMessage *message)
+on_authenticate (GdmDBusSession *session,
+ const char *service_name,
+ GdmSessionWorker *worker)
{
if (worker->priv->state != GDM_SESSION_WORKER_STATE_SETUP_COMPLETE) {
g_debug ("GdmSessionWorker: ignoring spurious authenticate for user while in state %s", get_state_name (worker->priv->state));
@@ -2783,8 +2444,9 @@ on_authenticate (GdmSessionWorker *worker,
}
static void
-on_authorize (GdmSessionWorker *worker,
- DBusMessage *message)
+on_authorize (GdmDBusSession *session,
+ const char *service_name,
+ GdmSessionWorker *worker)
{
if (worker->priv->state != GDM_SESSION_WORKER_STATE_AUTHENTICATED) {
g_debug ("GdmSessionWorker: ignoring spurious authorize for user while in state %s", get_state_name (worker->priv->state));
@@ -2795,8 +2457,9 @@ on_authorize (GdmSessionWorker *worker,
}
static void
-on_establish_credentials (GdmSessionWorker *worker,
- DBusMessage *message)
+on_establish_credentials (GdmDBusSession *session,
+ const char *service_name,
+ GdmSessionWorker *worker)
{
if (worker->priv->state != GDM_SESSION_WORKER_STATE_AUTHORIZED) {
g_debug ("GdmSessionWorker: ignoring spurious establish credentials for user while in state %s", get_state_name (worker->priv->state));
@@ -2809,8 +2472,9 @@ on_establish_credentials (GdmSessionWorker *worker,
}
static void
-on_open_session (GdmSessionWorker *worker,
- DBusMessage *message)
+on_open_session (GdmDBusSession *session,
+ const char *service_name,
+ GdmSessionWorker *worker)
{
if (worker->priv->state != GDM_SESSION_WORKER_STATE_ACCREDITED) {
g_debug ("GdmSessionWorker: ignoring spurious open session for user while in state %s", get_state_name (worker->priv->state));
@@ -2820,119 +2484,13 @@ on_open_session (GdmSessionWorker *worker,
queue_state_change (worker);
}
-static DBusHandlerResult
-worker_dbus_handle_message (DBusConnection *connection,
- DBusMessage *message,
- void *user_data,
- dbus_bool_t local_interface)
-{
- GdmSessionWorker *worker = GDM_SESSION_WORKER (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, GDM_SESSION_DBUS_INTERFACE, "Setup")) {
- on_setup (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetupForUser")) {
- on_setup_for_user (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetupForProgram")) {
- on_setup_for_program (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "Authenticate")) {
- on_authenticate (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "Authorize")) {
- on_authorize (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "EstablishCredentials")) {
- on_establish_credentials (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "OpenSession")) {
- on_open_session (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "StartProgram")) {
- on_start_program (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetEnvironmentVariable")) {
- on_set_environment_variable (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetLanguageName")) {
- on_set_language_name (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetSessionName")) {
- on_set_session_name (worker, message);
- } else if (dbus_message_is_signal (message, GDM_SESSION_DBUS_INTERFACE, "SetSessionType")) {
- on_set_session_type (worker, message);
- } else {
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-worker_dbus_filter_function (DBusConnection *connection,
- DBusMessage *message,
- void *user_data)
-{
- GdmSessionWorker *worker = GDM_SESSION_WORKER (user_data);
- const char *path;
-
- path = dbus_message_get_path (message);
-
- g_debug ("GdmSessionWorker: 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 ("GdmSessionWorker: Got disconnected from the server");
-
- dbus_connection_unref (connection);
- worker->priv->connection = NULL;
-
- } else if (dbus_message_is_signal (message,
- DBUS_INTERFACE_DBUS,
- "NameOwnerChanged")) {
- g_debug ("GdmSessionWorker: Name owner changed?");
- } else {
- return worker_dbus_handle_message (connection, message, user_data, FALSE);
- }
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static void
-send_hello (GdmSessionWorker *worker)
-{
- DBusMessage *message, *reply;
- DBusError error;
-
- message = dbus_message_new_method_call (NULL,
- GDM_SESSION_DBUS_PATH,
- GDM_SESSION_DBUS_INTERFACE,
- "Hello");
-
- dbus_error_init (&error);
- reply = dbus_connection_send_with_reply_and_block (worker->priv->connection,
- message, -1, &error);
- dbus_message_unref (message);
- dbus_error_free (&error);
-
- if (reply != NULL) {
- dbus_message_unref (reply);
- }
-}
-
static GObject *
gdm_session_worker_constructor (GType type,
guint n_construct_properties,
GObjectConstructParam *construct_properties)
{
- GdmSessionWorker *worker;
- DBusError error;
+ GdmSessionWorker *worker;
+ GError *error;
worker = GDM_SESSION_WORKER (G_OBJECT_CLASS (gdm_session_worker_parent_class)->constructor (type,
n_construct_properties,
@@ -2940,30 +2498,88 @@ gdm_session_worker_constructor (GType type,
g_debug ("GdmSessionWorker: connecting to address: %s", worker->priv->server_address);
- dbus_error_init (&error);
- worker->priv->connection = dbus_connection_open (worker->priv->server_address, &error);
+ error = NULL;
+ worker->priv->connection = g_dbus_connection_new_for_address_sync (worker->priv->server_address,
+ G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
+ NULL,
+ NULL,
+ &error);
if (worker->priv->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");
- }
+ g_warning ("error opening connection: %s", error->message);
+ g_clear_error (&error);
+
exit (1);
}
+ worker->priv->session_proxy = GDM_DBUS_SESSION (gdm_dbus_session_proxy_new_sync (worker->priv->connection,
+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+ NULL, /* dbus name */
+ GDM_SESSION_DBUS_PATH,
+ NULL,
+ &error));
+ if (worker->priv->session_proxy == NULL) {
+ g_warning ("error creating session proxy: %s", error->message);
+ g_clear_error (&error);
+
+ exit (1);
+ }
+
+ g_dbus_proxy_set_default_timeout (G_DBUS_PROXY (worker->priv->session_proxy), -1);
+
+ g_signal_connect (worker->priv->session_proxy,
+ "authenticate",
+ G_CALLBACK (on_authenticate),
+ worker);
+ g_signal_connect (worker->priv->session_proxy,
+ "authorize",
+ G_CALLBACK (on_authorize),
+ worker);
+ g_signal_connect (worker->priv->session_proxy,
+ "establish-credentials",
+ G_CALLBACK (on_establish_credentials),
+ worker);
+ g_signal_connect (worker->priv->session_proxy,
+ "open-session",
+ G_CALLBACK (on_open_session),
+ worker);
+ g_signal_connect (worker->priv->session_proxy,
+ "set-environment-variable",
+ G_CALLBACK (on_set_environment_variable),
+ worker);
+ g_signal_connect (worker->priv->session_proxy,
+ "set-session-name",
+ G_CALLBACK (on_set_session_name),
+ worker);
+ g_signal_connect (worker->priv->session_proxy,
+ "set-language-name",
+ G_CALLBACK (on_set_language_name),
+ worker);
+ g_signal_connect (worker->priv->session_proxy,
+ "set-session-type",
+ G_CALLBACK (on_set_session_type),
+ worker);
+ g_signal_connect (worker->priv->session_proxy,
+ "setup",
+ G_CALLBACK (on_setup),
+ worker);
+ g_signal_connect (worker->priv->session_proxy,
+ "setup-for-user",
+ G_CALLBACK (on_setup_for_user),
+ worker);
+ g_signal_connect (worker->priv->session_proxy,
+ "setup-for-program",
+ G_CALLBACK (on_setup_for_program),
+ worker);
+ g_signal_connect (worker->priv->session_proxy,
+ "start-program",
+ G_CALLBACK (on_start_program),
+ worker);
+
/* Send an initial Hello message so that the session can associate
* the conversation we manage with our pid.
*/
- send_hello (worker);
-
- dbus_connection_setup_with_g_main (worker->priv->connection, NULL);
- dbus_connection_set_exit_on_disconnect (worker->priv->connection, TRUE);
-
- dbus_connection_add_filter (worker->priv->connection,
- worker_dbus_filter_function,
- worker,
- NULL);
+ gdm_dbus_session_call_hello_sync (worker->priv->session_proxy,
+ NULL, NULL);
return G_OBJECT (worker);
}