[gdm] daemon: add better unified authentication compatibility
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm] daemon: add better unified authentication compatibility
- Date: Mon, 19 Sep 2011 22:28:09 +0000 (UTC)
commit f91f017071ffa5f5999e6c2e2c0929e290482932
Author: Ray Strode <rstrode redhat com>
Date: Mon Sep 19 18:16:25 2011 -0400
daemon: add better unified authentication compatibility
The daemon and fallback greeter support --disable-split-authentication,
but the new shiny greeter doesn't. This posed a problem for
distributions that want to use the new shiny greeter (in an albeit
degraded mode) but don't yet have support at the system level for
split authentication.
This commit adds a small amount of goo to make the split authentication
pam service names translate to the unified pam service name and
thus give the shell greeter a level of compatibility with
--disable-split-authentication.
configure.ac | 4 +++
daemon/gdm-greeter-server.c | 55 ++++++++++++++++++++++++++++++++++++++++++-
daemon/gdm-simple-slave.c | 3 +-
3 files changed, 60 insertions(+), 2 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 6893c26..8d746c8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -234,6 +234,10 @@ AC_ARG_ENABLE(split-authentication,
enable_split_authentication=yes)
AM_CONDITIONAL(ENABLE_SPLIT_AUTHENTICATION, test x$enable_split_authentication = xyes)
+if test x$enable_split_authentication = xyes; then
+ AC_DEFINE(ENABLE_SPLIT_AUTHENTICATION, 1, [Define if split authentication is enabled])
+fi
+
AC_ARG_ENABLE(console-helper,
AS_HELP_STRING([--enable-console-helper],
[Enable PAM console helper @<:@default=auto@:>@]),,
diff --git a/daemon/gdm-greeter-server.c b/daemon/gdm-greeter-server.c
index 4c40a4e..4803bc3 100644
--- a/daemon/gdm-greeter-server.c
+++ b/daemon/gdm-greeter-server.c
@@ -60,6 +60,8 @@ struct GdmGreeterServerPrivate
DBusServer *server;
char *server_address;
DBusConnection *greeter_connection;
+
+ guint using_legacy_service_name : 1;
};
enum {
@@ -246,11 +248,42 @@ send_dbus_void_signal (GdmGreeterServer *greeter_server,
dbus_message_unref (message);
}
+static const char *
+translate_outgoing_service_name (GdmGreeterServer *greeter_server,
+ const char *service_name)
+{
+#ifndef ENABLE_SPLIT_AUTHENTICATION
+ if (strcmp (service_name, "gdm") == 0 && greeter_server->priv->using_legacy_service_name) {
+ return "gdm-password";
+ }
+#endif
+
+ return service_name;
+}
+
+static const char *
+translate_incoming_service_name (GdmGreeterServer *greeter_server,
+ const char *service_name)
+{
+#ifndef ENABLE_SPLIT_AUTHENTICATION
+ if (strcmp (service_name, "gdm-password") == 0) {
+ g_debug ("GdmGreeterServer: Adjusting pam service from '%s' to 'gdm' for legacy compatibility", service_name);
+ service_name = "gdm";
+ greeter_server->priv->using_legacy_service_name = TRUE;
+ } else if (g_str_has_prefix (service_name, "gdm-") == 0 && strcmp (service_name, "gdm-autologin") != 0) {
+ g_debug ("GdmGreeterServer: Rejecting pam service '%s' for legacy compatibility", service_name);
+ return NULL;
+ }
+#endif
+ return service_name;
+}
+
gboolean
gdm_greeter_server_info_query (GdmGreeterServer *greeter_server,
const char *service_name,
const char *text)
{
+ service_name = translate_outgoing_service_name (greeter_server, service_name);
send_dbus_string_string_signal (greeter_server, "InfoQuery", service_name, text);
return TRUE;
@@ -261,6 +294,7 @@ gdm_greeter_server_secret_info_query (GdmGreeterServer *greeter_server,
const char *service_name,
const char *text)
{
+ service_name = translate_outgoing_service_name (greeter_server, service_name);
send_dbus_string_string_signal (greeter_server, "SecretInfoQuery", service_name, text);
return TRUE;
}
@@ -270,6 +304,7 @@ gdm_greeter_server_info (GdmGreeterServer *greeter_server,
const char *service_name,
const char *text)
{
+ service_name = translate_outgoing_service_name (greeter_server, service_name);
send_dbus_string_string_signal (greeter_server, "Info", service_name, text);
return TRUE;
}
@@ -279,6 +314,7 @@ gdm_greeter_server_problem (GdmGreeterServer *greeter_server,
const char *service_name,
const char *text)
{
+ service_name = translate_outgoing_service_name (greeter_server, service_name);
send_dbus_string_string_signal (greeter_server, "Problem", service_name, text);
return TRUE;
}
@@ -287,6 +323,7 @@ gboolean
gdm_greeter_server_authentication_failed (GdmGreeterServer *greeter_server,
const char *service_name)
{
+ service_name = translate_outgoing_service_name (greeter_server, service_name);
send_dbus_string_signal (greeter_server, "AuthenticationFailed", service_name);
return TRUE;
}
@@ -295,6 +332,7 @@ gboolean
gdm_greeter_server_service_unavailable (GdmGreeterServer *greeter_server,
const char *service_name)
{
+ service_name = translate_outgoing_service_name (greeter_server, service_name);
send_dbus_string_signal (greeter_server, "ServiceUnavailable", service_name);
return TRUE;
}
@@ -310,6 +348,7 @@ gboolean
gdm_greeter_server_ready (GdmGreeterServer *greeter_server,
const char *service_name)
{
+ service_name = translate_outgoing_service_name (greeter_server, service_name);
send_dbus_string_signal (greeter_server, "Ready", service_name);
return TRUE;
}
@@ -318,6 +357,7 @@ gboolean
gdm_greeter_server_conversation_stopped (GdmGreeterServer *greeter_server,
const char *service_name)
{
+ service_name = translate_outgoing_service_name (greeter_server, service_name);
send_dbus_string_signal (greeter_server, "ConversationStopped", service_name);
return TRUE;
}
@@ -355,6 +395,7 @@ void
gdm_greeter_server_session_opened (GdmGreeterServer *greeter_server,
const char *service_name)
{
+ service_name = translate_outgoing_service_name (greeter_server, service_name);
send_dbus_string_signal (greeter_server, "SessionOpened", service_name);
}
@@ -394,6 +435,7 @@ handle_start_conversation (GdmGreeterServer *greeter_server,
DBusMessage *reply;
DBusError error;
const char *service_name;
+ const char *translated_service_name;
dbus_error_init (&error);
if (! dbus_message_get_args (message, &error,
@@ -409,7 +451,14 @@ handle_start_conversation (GdmGreeterServer *greeter_server,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- g_signal_emit (greeter_server, signals [START_CONVERSATION], 0, service_name);
+ translated_service_name = translate_incoming_service_name (greeter_server, service_name);
+
+ if (translated_service_name == NULL) {
+ gdm_greeter_server_service_unavailable (greeter_server, service_name);
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
+
+ g_signal_emit (greeter_server, signals [START_CONVERSATION], 0, translated_service_name);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -437,6 +486,7 @@ handle_begin_verification (GdmGreeterServer *greeter_server,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
+ service_name = translate_outgoing_service_name (greeter_server, service_name);
g_signal_emit (greeter_server, signals [BEGIN_VERIFICATION], 0, service_name);
return DBUS_HANDLER_RESULT_HANDLED;
@@ -494,6 +544,7 @@ handle_begin_verification_for_user (GdmGreeterServer *greeter_server,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
+ service_name = translate_outgoing_service_name (greeter_server, service_name);
g_signal_emit (greeter_server, signals [BEGIN_VERIFICATION_FOR_USER], 0, service_name, text);
return DBUS_HANDLER_RESULT_HANDLED;
@@ -524,6 +575,7 @@ handle_answer_query (GdmGreeterServer *greeter_server,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
+ service_name = translate_outgoing_service_name (greeter_server, service_name);
g_signal_emit (greeter_server, signals [QUERY_ANSWER], 0, service_name, text);
return DBUS_HANDLER_RESULT_HANDLED;
@@ -711,6 +763,7 @@ handle_start_session_when_ready (GdmGreeterServer *greeter_server,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
+ service_name = (char *) translate_outgoing_service_name (greeter_server, service_name);
if (should_start_session) {
g_signal_emit (greeter_server, signals [START_SESSION_WHEN_READY], 0, service_name);
} else {
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index 38e7a84..b9165fd 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -1034,10 +1034,11 @@ on_greeter_start_conversation (GdmGreeterServer *greeter_server,
const char *service_name,
GdmSimpleSlave *slave)
{
- g_debug ("GdmSimpleSlave: starting conversation with '%s' pam service'", service_name);
if (slave->priv->greeter_reset_id > 0) {
return;
}
+
+ g_debug ("GdmSimpleSlave: starting conversation with '%s' pam service'", service_name);
gdm_session_start_conversation (GDM_SESSION (slave->priv->session),
service_name);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]