[gdm/multi-stack: 36/45] Emit "service-unavailable" from session when pam service refuses to work
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm/multi-stack: 36/45] Emit "service-unavailable" from session when pam service refuses to work
- Date: Tue, 27 Apr 2010 19:44:13 +0000 (UTC)
commit 0ca589b40a9e0671471d5207558849f6572a5e63
Author: Ray Strode <rstrode redhat com>
Date: Wed Oct 28 21:32:00 2009 -0400
Emit "service-unavailable" from session when pam service refuses to work
daemon/gdm-session-direct.c | 26 +++++++++++++++++++++++---
daemon/gdm-session-private.h | 2 ++
daemon/gdm-session-relay.c | 33 +++++++++++++++++++++++++++++++++
daemon/gdm-session-worker.c | 29 ++++++++++++++++++++++-------
daemon/gdm-session.c | 21 +++++++++++++++++++++
daemon/gdm-session.h | 2 ++
6 files changed, 103 insertions(+), 10 deletions(-)
---
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c
index 5d7dabc..0d283cd 100644
--- a/daemon/gdm-session-direct.c
+++ b/daemon/gdm-session-direct.c
@@ -280,9 +280,27 @@ on_session_exited (GdmSession *session,
}
static DBusHandlerResult
-gdm_session_direct_handle_setup_complete (GdmSessionDirect *session,
- GdmSessionConversation *conversation,
- DBusMessage *message)
+gdm_session_direct_handle_service_unavailable (GdmSessionDirect *session,
+ GdmSessionConversation *conversation,
+ DBusMessage *message)
+{
+ DBusMessage *reply;
+
+ g_debug ("GdmSessionDirect: Emitting 'service-unavailable' signal");
+
+ reply = dbus_message_new_method_return (message);
+ dbus_connection_send (conversation->worker_connection, reply, NULL);
+ dbus_message_unref (reply);
+
+ _gdm_session_service_unavailable (GDM_SESSION (session), conversation->service_name);
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+static DBusHandlerResult
+gdm_session_direct_handle_setup_complete (GdmSessionDirect *session,
+ GdmSessionConversation *conversation,
+ DBusMessage *message)
{
DBusMessage *reply;
@@ -1275,6 +1293,8 @@ session_worker_message (DBusConnection *connection,
return gdm_session_direct_handle_problem (session, conversation, message);
} else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "CancelPendingQuery")) {
return gdm_session_direct_handle_cancel_pending_query (session, conversation, message);
+ } else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "ServiceUnavailable")) {
+ return gdm_session_direct_handle_service_unavailable (session, conversation, message);
} else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "SetupComplete")) {
return gdm_session_direct_handle_setup_complete (session, conversation, message);
} else if (dbus_message_is_method_call (message, GDM_SESSION_DBUS_INTERFACE, "SetupFailed")) {
diff --git a/daemon/gdm-session-private.h b/daemon/gdm-session-private.h
index 36781dd..e0a810e 100644
--- a/daemon/gdm-session-private.h
+++ b/daemon/gdm-session-private.h
@@ -31,6 +31,8 @@ void _gdm_session_conversation_started (GdmSession *sessio
const char *service_name);
void _gdm_session_conversation_stopped (GdmSession *session,
const char *service_name);
+void _gdm_session_service_unavailable (GdmSession *session,
+ const char *service_name);
void _gdm_session_setup_complete (GdmSession *session,
const char *service_name);
void _gdm_session_setup_failed (GdmSession *session,
diff --git a/daemon/gdm-session-relay.c b/daemon/gdm-session-relay.c
index 98ccc51..88aee14 100644
--- a/daemon/gdm-session-relay.c
+++ b/daemon/gdm-session-relay.c
@@ -463,6 +463,34 @@ handle_problem (GdmSessionRelay *session_relay,
}
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)
@@ -841,6 +869,8 @@ session_handle_child_message (DBusConnection *connection,
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")) {
@@ -898,6 +928,9 @@ do_introspect (DBusConnection *connection,
" <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"
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index adc8dcf..4b77249 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -2364,9 +2364,16 @@ do_setup (GdmSessionWorker *worker)
worker->priv->display_device,
&error);
if (! res) {
- send_dbus_string_method (worker->priv->connection,
- "SetupFailed",
- error->message);
+ if (g_error_matches (error,
+ GDM_SESSION_WORKER_ERROR,
+ GDM_SESSION_WORKER_ERROR_SERVICE_UNAVAILABLE)) {
+ send_dbus_void_method (worker->priv->connection,
+ "ServiceUnavailable");
+ } else {
+ send_dbus_string_method (worker->priv->connection,
+ "SetupFailed",
+ error->message);
+ }
g_error_free (error);
return;
}
@@ -2387,10 +2394,18 @@ do_authenticate (GdmSessionWorker *worker)
worker->priv->password_is_required,
&error);
if (! res) {
- g_debug ("GdmSessionWorker: Unable to verify user");
- send_dbus_string_method (worker->priv->connection,
- "AuthenticationFailed",
- error->message);
+ if (g_error_matches (error,
+ 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");
+ } else {
+ g_debug ("GdmSessionWorker: Unable to verify user");
+ send_dbus_string_method (worker->priv->connection,
+ "AuthenticationFailed",
+ error->message);
+ }
g_error_free (error);
return;
}
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 8858071..8c4548a 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -31,6 +31,7 @@
enum {
CONVERSATION_STARTED = 0,
CONVERSATION_STOPPED,
+ SERVICE_UNAVAILABLE,
SETUP_COMPLETE,
SETUP_FAILED,
RESET_COMPLETE,
@@ -251,6 +252,17 @@ gdm_session_class_init (gpointer g_iface)
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE,
1, G_TYPE_STRING);
+ signals [SERVICE_UNAVAILABLE] =
+ g_signal_new ("service-unavailable",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, service_unavailable),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
signals [SETUP_COMPLETE] =
g_signal_new ("setup-complete",
iface_type,
@@ -525,6 +537,15 @@ gdm_session_class_init (gpointer g_iface)
}
void
+_gdm_session_service_unavailable (GdmSession *session,
+ const char *service_name)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ g_signal_emit (session, signals [SERVICE_UNAVAILABLE], 0, service_name);
+}
+
+void
_gdm_session_setup_complete (GdmSession *session,
const char *service_name)
{
diff --git a/daemon/gdm-session.h b/daemon/gdm-session.h
index 22c2ccb..9636b92 100644
--- a/daemon/gdm-session.h
+++ b/daemon/gdm-session.h
@@ -49,6 +49,8 @@ struct _GdmSessionIface
const char *service_name);
void (* stop_conversation) (GdmSession *session,
const char *service_name);
+ void (* service_unavailable) (GdmSession *session,
+ const char *service_name);
void (* setup) (GdmSession *session,
const char *service_name);
void (* setup_for_user) (GdmSession *session,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]