[gnome-keyring] Implement dummy prompting.



commit 04bbaee1fec85708f445b1e987c7380c77f36150
Author: Stef Walter <stef memberwebs com>
Date:   Tue Jun 8 04:50:29 2010 +0000

    Implement dummy prompting.
    
    Tests can now queue up responses, so we can test prompting
    and various usage patterns.

 pkcs11/wrap-layer/tests/test-create-credential.c |    4 +
 ui/gku-prompt-tool.c                             |    9 ++-
 ui/gku-prompt.c                                  |   95 +++++++++++++++++++++-
 ui/gku-prompt.h                                  |    8 ++
 4 files changed, 111 insertions(+), 5 deletions(-)
---
diff --git a/pkcs11/wrap-layer/tests/test-create-credential.c b/pkcs11/wrap-layer/tests/test-create-credential.c
index 99375e8..2cf235a 100644
--- a/pkcs11/wrap-layer/tests/test-create-credential.c
+++ b/pkcs11/wrap-layer/tests/test-create-credential.c
@@ -31,6 +31,8 @@
 
 #include "wrap-layer/gkm-wrap-layer.h"
 
+#include "ui/gku-prompt.h"
+
 #include <glib-object.h>
 
 CK_FUNCTION_LIST create_credential_functions = {
@@ -116,6 +118,8 @@ test (gpointer loop)
 	CK_ULONG n_slots = 1;
 	CK_RV rv;
 
+	gku_prompt_queue_dummy_ok_password ("booo");
+
 	gkm_wrap_layer_add_module (&create_credential_functions);
 	module = gkm_wrap_layer_get_functions ();
 
diff --git a/ui/gku-prompt-tool.c b/ui/gku-prompt-tool.c
index acf607b..43ddea0 100644
--- a/ui/gku-prompt-tool.c
+++ b/ui/gku-prompt-tool.c
@@ -27,6 +27,7 @@
 #include "egg/egg-dh.h"
 #include "egg/egg-entry-buffer.h"
 #include "egg/egg-error.h"
+#include "egg/egg-hex.h"
 #include "egg/egg-libgcrypt.h"
 #include "egg/egg-secure-memory.h"
 
@@ -505,6 +506,8 @@ gather_password (GtkBuilder *builder, const gchar *password_type)
 	gpointer data;
 	gsize n_data;
 	gchar *name;
+	const gchar *text;
+	gchar *value;
 
 	name = g_strdup_printf ("%s_entry", password_type);
 	entry = GTK_ENTRY (gtk_builder_get_object (builder, name));
@@ -516,9 +519,11 @@ gather_password (GtkBuilder *builder, const gchar *password_type)
 
 	/* A non-encrypted password: just send the value back */
 	if (!g_key_file_has_group (input_data, "transport")) {
+		text = gtk_entry_get_text (entry);
+		value = egg_hex_encode ((const guchar*)text, strlen (text));
 		g_key_file_set_value (output_data, password_type, "parameter", "");
-		g_key_file_set_value (output_data, password_type, "value",
-		                      gtk_entry_get_text (entry));
+		g_key_file_set_value (output_data, password_type, "value", value);
+		g_free (value);
 		return;
 	}
 
diff --git a/ui/gku-prompt.c b/ui/gku-prompt.c
index f816142..7dfcf0b 100644
--- a/ui/gku-prompt.c
+++ b/ui/gku-prompt.c
@@ -445,6 +445,47 @@ display_async_prompt (GkuPrompt *self)
 }
 
 static void
+display_dummy_prompt (GkuPrompt *self, const gchar *response)
+{
+	GError *error = NULL;
+	gchar *title = NULL;
+
+	g_assert (GKU_IS_PROMPT (self));
+
+	if (!response && self->pv->input)
+		title = g_key_file_get_value (self->pv->input, "prompt", "title", NULL);
+
+	/* Fires completed event when fails */
+	if (!prepare_input_data (self)) {
+		g_free (title);
+		return;
+	}
+
+	if (response) {
+	#if DEBUG_PROMPT
+		g_printerr ("PROMPT OUTPUT:\n%s\n", response);
+	#endif
+		self->pv->output = g_key_file_new ();
+		if (!g_key_file_load_from_data (self->pv->output, response, strlen (response),
+						G_KEY_FILE_NONE, &error)) {
+			g_key_file_free (self->pv->output);
+			g_warning ("couldn't parse output from prompt: %s", egg_error_message (error));
+			g_clear_error (&error);
+			mark_failed (self);
+		} else {
+			mark_responded (self);
+		}
+
+	/* No response, problem! */
+	} else {
+		g_warning ("unexpected prompt without response: %s", title ? title : "unknown");
+		mark_failed (self);
+	}
+
+	g_free (title);
+}
+
+static void
 clear_prompt_data (GkuPrompt *self)
 {
 	TransportCrypto *transport;
@@ -886,8 +927,12 @@ typedef struct _Attention {
 	GCond *cond;
 } AttentionReq;
 
-static GHashTable *attention_reqs = NULL;
 static GStaticMutex attention_mutex = G_STATIC_MUTEX_INIT;
+static GHashTable *attention_reqs = NULL;
+
+/* Used for testing, to queue responses without showing prompt */
+static gboolean dummy_responses = FALSE;
+static GQueue queued_responses = G_QUEUE_INIT;
 
 static void
 done_attention_req (GkuPrompt *prompt, gpointer user_data)
@@ -981,6 +1026,7 @@ alloc_attention_queue (void)
 static void
 next_attention_req (const gchar *window_id)
 {
+	gchar *response;
 	AttentionReq *att;
 	GQueue *queue;
 
@@ -1017,10 +1063,20 @@ next_attention_req (const gchar *window_id)
 	att->active = TRUE;
 	g_signal_connect_data (att->prompt, "completed", G_CALLBACK (done_attention_req), att,
 	                       (GClosureNotify)free_attention_req, G_CONNECT_AFTER);
+	gku_prompt_set_window_id (att->prompt, window_id);
+
+	/* Fake display the prompt */
+	if (dummy_responses) {
+		g_static_mutex_lock (&attention_mutex);
+			response = g_queue_pop_head (&queued_responses);
+		g_static_mutex_unlock (&attention_mutex);
+		display_dummy_prompt (att->prompt, response);
+		g_free (response);
 
 	/* Actually display the prompt, "completed" signal will fire */
-	gku_prompt_set_window_id (att->prompt, window_id);
-	display_async_prompt (att->prompt);
+	} else {
+		display_async_prompt (att->prompt);
+	}
 }
 
 static gboolean
@@ -1100,3 +1156,36 @@ gku_prompt_request_attention_sync (const gchar *window_id, GkuPromptAttentionFun
 
 	g_cond_free (cond);
 }
+
+#ifdef WITH_TESTS
+
+static void
+queue_dummy_response (gchar *response)
+{
+	g_assert (response);
+	g_static_mutex_lock (&attention_mutex);
+		dummy_responses = TRUE;
+		g_queue_push_tail (&queued_responses, response);
+	g_static_mutex_unlock (&attention_mutex);
+}
+
+void
+gku_prompt_queue_dummy_response (const gchar *response)
+{
+	g_return_if_fail (response);
+	queue_dummy_response (g_strdup (response));
+}
+
+void
+gku_prompt_queue_dummy_ok_password (const gchar *password)
+{
+	const static gchar *RESPONSE = "[password]\nparameter=\nvalue=%s\n[prompt]\nresponse=ok\n";
+	gchar *value;
+
+	g_return_if_fail (password);
+	value = egg_hex_encode ((const guchar*)password, strlen (password));
+	queue_dummy_response (g_strdup_printf (RESPONSE, value));
+	g_free (value);
+}
+
+#endif
diff --git a/ui/gku-prompt.h b/ui/gku-prompt.h
index a1c6fcb..2d31459 100644
--- a/ui/gku-prompt.h
+++ b/ui/gku-prompt.h
@@ -139,4 +139,12 @@ void                gku_prompt_request_attention_sync     (const gchar *window_i
                                                            gpointer user_data,
                                                            GDestroyNotify destroy_notify);
 
+#ifdef WITH_TESTS
+
+void                gku_prompt_queue_dummy_response        (const gchar *response);
+
+void                gku_prompt_queue_dummy_ok_password     (const gchar *password);
+
+#endif
+
 #endif /* __GKU_PROMPT_H__ */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]