]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
queue up responses in greeter and send them at once to lightdm daemon
authorMichael Terry <michael.terry@canonical.com>
Fri, 17 Aug 2012 18:38:21 +0000 (14:38 -0400)
committerMichael Terry <michael.terry@canonical.com>
Fri, 17 Aug 2012 18:38:21 +0000 (14:38 -0400)
liblightdm-gobject/greeter.c

index 78943d761af84db5519f5edb347c63ceb3c58c40..2d31b84cf99905fc332746d1e0d1ddc229d31e23 100644 (file)
@@ -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;
+    }
 }
 
 /**