summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Terry <michael.terry@canonical.com>2012-08-17 14:38:21 -0400
committerMichael Terry <michael.terry@canonical.com>2012-08-17 14:38:21 -0400
commit8c308d4e3455bc9600fd3b64832156f6f0ba775c (patch)
treeac42627985a04163b6fac837e726472dff82e671
parent902617f00b428cef10c524839e7d6940a03297d9 (diff)
downloadlightdm-8c308d4e3455bc9600fd3b64832156f6f0ba775c.tar.gz
queue up responses in greeter and send them at once to lightdm daemon
-rw-r--r--liblightdm-gobject/greeter.c46
1 files changed, 36 insertions, 10 deletions
diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c
index 78943d76..2d31b84c 100644
--- a/liblightdm-gobject/greeter.c
+++ b/liblightdm-gobject/greeter.c
@@ -50,7 +50,9 @@ typedef struct
GIOChannel *to_server_channel, *from_server_channel;
guint8 *read_buffer;
gsize n_read;
- gsize n_prompts_waiting;
+
+ gsize n_responses_waiting;
+ GList *responses_received;
GHashTable *hints;
guint autologin_timeout;
@@ -302,6 +304,10 @@ handle_prompt_authentication (LightDMGreeter *greeter, guint8 *message, gsize me
g_free (priv->authentication_user);
priv->authentication_user = username;
+ g_list_free_full (priv->responses_received, g_free);
+ priv->responses_received = NULL;
+ priv->n_responses_waiting = 0;
+
n_messages = read_int (message, message_length, offset);
g_debug ("Prompt user with %d message(s)", n_messages);
@@ -317,11 +323,11 @@ handle_prompt_authentication (LightDMGreeter *greeter, guint8 *message, gsize me
switch (style)
{
case PAM_PROMPT_ECHO_OFF:
- priv->n_prompts_waiting++;
+ priv->n_responses_waiting++;
g_signal_emit (G_OBJECT (greeter), signals[SHOW_PROMPT], 0, text, LIGHTDM_PROMPT_TYPE_SECRET);
break;
case PAM_PROMPT_ECHO_ON:
- priv->n_prompts_waiting++;
+ priv->n_responses_waiting++;
g_signal_emit (G_OBJECT (greeter), signals[SHOW_PROMPT], 0, text, LIGHTDM_PROMPT_TYPE_QUESTION);
break;
case PAM_ERROR_MSG:
@@ -845,15 +851,35 @@ lightdm_greeter_respond (LightDMGreeter *greeter, const gchar *response)
priv = GET_PRIVATE (greeter);
g_return_if_fail (priv->connected);
- g_return_if_fail (priv->n_prompts_waiting > 0);
+ g_return_if_fail (priv->n_responses_waiting > 0);
- priv->n_prompts_waiting--;
+ priv->n_responses_waiting--;
+ priv->responses_received = g_list_append (priv->responses_received, g_strdup (response));
- g_debug ("Providing response to display manager");
- write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONTINUE_AUTHENTICATION, int_length () + string_length (response), &offset);
- write_int (message, MAX_MESSAGE_LENGTH, 1, &offset);
- write_string (message, MAX_MESSAGE_LENGTH, response, &offset);
- write_message (greeter, message, offset);
+ if (priv->n_responses_waiting == 0)
+ {
+ guint32 msg_length;
+ GList *iter;
+
+ g_debug ("Providing response to display manager");
+
+ msg_length = int_length ();
+ for (iter = priv->responses_received; iter; iter = iter->next)
+ {
+ msg_length += string_length ((gchar *)iter->data);
+ }
+
+ write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONTINUE_AUTHENTICATION, msg_length, &offset);
+ write_int (message, MAX_MESSAGE_LENGTH, g_list_length (priv->responses_received), &offset);
+ for (iter = priv->responses_received; iter; iter = iter->next)
+ {
+ write_string (message, MAX_MESSAGE_LENGTH, (gchar *)iter->data, &offset);
+ }
+ write_message (greeter, message, offset);
+
+ g_list_free_full (priv->responses_received, g_free);
+ priv->responses_received = NULL;
+ }
}
/**