[evolution-data-server/account-mgmt: 28/42] Adapt e-book-auth-util.c to the new ESource API.



commit 45986ce22cf16e84f07175f5500dccb67cf1e8c4
Author: Matthew Barnes <mbarnes redhat com>
Date:   Wed Nov 24 09:57:29 2010 -0500

    Adapt e-book-auth-util.c to the new ESource API.

 .../libedataserverui/libedataserverui-sections.txt |    1 -
 libedataserverui/e-book-auth-util.c                |  484 +-------------------
 libedataserverui/e-book-auth-util.h                |    4 -
 3 files changed, 2 insertions(+), 487 deletions(-)
---
diff --git a/docs/reference/libedataserverui/libedataserverui-sections.txt b/docs/reference/libedataserverui/libedataserverui-sections.txt
index 652af90..f21a7df 100644
--- a/docs/reference/libedataserverui/libedataserverui-sections.txt
+++ b/docs/reference/libedataserverui/libedataserverui-sections.txt
@@ -1,6 +1,5 @@
 <SECTION>
 <FILE>e-book-auth-util</FILE>
-e_load_book_source
 e_load_book_source_async
 e_load_book_source_finish
 </SECTION>
diff --git a/libedataserverui/e-book-auth-util.c b/libedataserverui/e-book-auth-util.c
index f4001e4..c35ad0d 100644
--- a/libedataserverui/e-book-auth-util.c
+++ b/libedataserverui/e-book-auth-util.c
@@ -33,307 +33,11 @@
 #include <libebook/e-book.h>
 #include <libedataserverui/e-passwords.h>
 #include <libedataserver/e-url.h>
+#include <libedataserver/e-source-authentication.h>
 #include "e-book-auth-util.h"
 
-static void addressbook_authenticate (EBook *book, gboolean previous_failure,
-				      ESource *source, EBookAsyncCallback cb, gpointer closure);
-static void auth_required_cb (EBook *book, gpointer data);
-typedef struct {
-	ESource       *source;
-	EBook         *book;
-
-	EBookCallback  open_func;
-	EBookAsyncCallback  open_func_ex;
-	gpointer       open_func_data;
-} LoadSourceData;
-
-static void
-free_load_source_data (LoadSourceData *data)
-{
-	if (data->source)
-		g_object_unref (data->source);
-	if (data->book) {
-		g_signal_handlers_disconnect_by_func (data->book, auth_required_cb, NULL);
-		g_object_unref (data->book);
-	}
-	g_free (data);
-}
-
-static gchar *
-remove_parameters_from_uri (const gchar *uri)
-{
-	gchar *euri_str;
-	EUri *euri;
-
-	euri = e_uri_new (uri);
-	euri_str = e_uri_to_string (euri, FALSE);
-	e_uri_free (euri);
-	return euri_str;
-}
-
-static void
-load_source_auth_cb (EBook *book,
-                     const GError *error,
-                     gpointer closure)
-{
-	LoadSourceData *data = closure;
-
-	switch (error ? error->code : E_BOOK_ERROR_OK) {
-
-		/* the user clicked cancel in the password dialog */
-		case E_BOOK_ERROR_CANCELLED:
-			if (e_book_check_static_capability (book, "anon-access")) {
-				GtkWidget *dialog;
-
-				/* XXX "LDAP" has to be removed from the folowing message
-				 * so that it wil valid for other servers which provide
-				 * anonymous access */
-
-				dialog = gtk_message_dialog_new (NULL,
-								 0,
-								 GTK_MESSAGE_WARNING,
-								 GTK_BUTTONS_OK,
-								 _("Accessing LDAP Server anonymously"));
-				g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
-				gtk_widget_show (dialog);
-			}
-			break;
-
-		case E_BOOK_ERROR_INVALID_SERVER_VERSION:
-			/* aka E_BOOK_ERROR_OK */
-			error = NULL;
-			break;
-
-		case E_BOOK_ERROR_AUTHENTICATION_FAILED:
-		case E_BOOK_ERROR_AUTHENTICATION_REQUIRED:
-		{
-			const gchar *uri = e_book_get_uri (book);
-			gchar *stripped_uri = remove_parameters_from_uri (uri);
-
-			if (error->code == E_BOOK_ERROR_AUTHENTICATION_FAILED)
-				e_passwords_forget_password (NULL, stripped_uri);
-
-			addressbook_authenticate (book, TRUE, data->source, load_source_auth_cb, closure);
-
-			g_free (stripped_uri);
-
-			return;
-		}
-
-		default:
-			break;
-	}
-
-	if (data->open_func)
-		data->open_func (book, error ? error->code : E_BOOK_ERROR_OK, data->open_func_data);
-	if (data->open_func_ex)
-		data->open_func_ex (book, error, data->open_func_data);
-
-	free_load_source_data (data);
-}
-
-static gboolean
-get_remember_password (ESource *source)
-{
-	const gchar *value;
-
-	value = e_source_get_property (source, "remember_password");
-	if (value && !g_ascii_strcasecmp (value, "true"))
-		return TRUE;
-
-	return FALSE;
-}
-
-static void
-set_remember_password (ESource *source,
-                       gboolean value)
-{
-	e_source_set_property (source, "remember_password",
-			       value ? "true" : "false");
-}
-
-static void
-addressbook_authenticate (EBook *book,
-                          gboolean previous_failure,
-                          ESource *source,
-                          EBookAsyncCallback cb,
-                          gpointer closure)
-{
-	const gchar *auth;
-	const gchar *user;
-	gchar *password = NULL;
-	const gchar *uri = e_book_get_uri (book);
-	gchar *stripped_uri = remove_parameters_from_uri (uri);
-
-	uri = stripped_uri;
-
-	password = e_passwords_get_password (NULL, uri);
-
-	auth = e_source_get_property (source, "auth");
-
-	if (auth && !strcmp ("ldap/simple-binddn", auth)) {
-		user = e_source_get_property (source, "binddn");
-	}
-	else if (auth && !strcmp ("plain/password", auth)) {
-		user = e_source_get_property (source, "user");
-		if (!user) {
-			user = e_source_get_property (source, "username");
-		}
-	}
-	else {
-		user = e_source_get_property (source, "email_addr");
-	}
-	if (!user)
-		user = "";
-
-	if (!password) {
-		gchar *prompt;
-		gchar *password_prompt;
-		gboolean remember;
-		const gchar *failed_auth;
-		guint32 flags = E_PASSWORDS_REMEMBER_FOREVER | E_PASSWORDS_SECRET | E_PASSWORDS_ONLINE;
-
-		if (previous_failure) {
-			failed_auth = _("Failed to authenticate.\n");
-			flags |= E_PASSWORDS_REPROMPT;
-		}
-		else {
-			failed_auth = "";
-		}
-
-		password_prompt = g_strdup_printf (_("Enter password for %s (user %s)"),
-						   e_source_get_display_name (source), user);
-
-		prompt = g_strconcat (failed_auth, password_prompt, NULL);
-		g_free (password_prompt);
-
-		remember = get_remember_password (source);
-		password = e_passwords_ask_password (prompt, NULL, uri, prompt,
-						     flags, &remember,
-						     NULL);
-		if (remember != get_remember_password (source))
-			set_remember_password (source, remember);
-
-		g_free (prompt);
-	}
-
-	if (password) {
-		e_book_authenticate_user_async (book, user, password,
-						e_source_get_property (source, "auth"),
-						cb, closure);
-		g_free (password);
-	}
-	else {
-		GError *error = g_error_new (E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED, _("Cancelled"));
-
-		/* they hit cancel */
-		cb (book, error, closure);
-
-		g_error_free (error);
-	}
-
-	g_free (stripped_uri);
-}
-
-static void
-auth_required_cb (EBook *book,
-                  gpointer data)
-{
-	LoadSourceData *load_source_data = g_new0 (LoadSourceData, 1);
-
-	load_source_data->source = g_object_ref (g_object_ref (e_book_get_source (book)));
-
-	addressbook_authenticate (book, FALSE, load_source_data->source,
-				  load_source_auth_cb, load_source_data);
-}
-
-static void
-load_source_cb (EBook *book,
-                const GError *error,
-                gpointer closure)
-{
-	LoadSourceData *load_source_data = closure;
-
-	if (!error && book != NULL) {
-		const gchar *auth;
-
-		/* Listen for "auth-required" signals regardless of
-		 * whether the ESource claims to require authentication. */
-		g_signal_connect (
-			book, "auth-required",
-			G_CALLBACK (auth_required_cb), NULL);
-
-		auth = e_source_get_property (load_source_data->source, "auth");
-		if (auth && strcmp (auth, "none")) {
-
-			if (e_book_is_online (book)) {
-				addressbook_authenticate (book, FALSE, load_source_data->source,
-							  load_source_auth_cb, closure);
-				return;
-			}
-		}
-	}
-
-	if (load_source_data->open_func)
-		load_source_data->open_func (book, error ? error->code : E_BOOK_ERROR_OK, load_source_data->open_func_data);
-	if (load_source_data->open_func_ex)
-		load_source_data->open_func_ex (book, error, load_source_data->open_func_data);
-
-	free_load_source_data (load_source_data);
-}
-
-/**
- * e_load_book_source:
- * @source: an #ESource
- * @open_func: a function to call when the operation finishes, or %NULL
- * @user_data: data to pass to callback function
- *
- * Creates a new #EBook specified by @source, and starts a non-blocking
- * open operation on it. If the book requires authorization, presents
- * a window asking the user for such.
- *
- * When the operation finishes, calls the callback function indicating
- * if it succeeded or not. If you don't care, you can pass %NULL for
- * @open_func, and no action will be taken on completion.
- *
- * Returns: A new #EBook that is being opened.
- *
- * Deprecated: 3.0: Use e_load_book_source_async() instead.
- **/
-EBook *
-e_load_book_source (ESource *source,
-                    EBookCallback open_func,
-                    gpointer user_data)
-{
-	EBook          *book;
-	LoadSourceData *load_source_data = g_new0 (LoadSourceData, 1);
-
-	load_source_data->source = g_object_ref (source);
-	load_source_data->open_func = open_func;
-	load_source_data->open_func_data = user_data;
-
-	book = e_book_new (source, NULL);
-	if (!book)
-		return NULL;
-
-	load_source_data->book = book;
-	g_object_ref (book);
-	e_book_open_async (book, FALSE, load_source_cb, load_source_data);
-	return book;
-}
-
 typedef struct {
 	EBook *book;
-	GtkWindow *parent;
-	GCancellable *cancellable;
-
-	gboolean anonymous_alert;
-
-	/* Authentication Details */
-	gchar *auth_uri;
-	gchar *auth_method;
-	gchar *auth_username;
-	gboolean auth_remember;
 } LoadContext;
 
 static void
@@ -342,113 +46,16 @@ load_book_source_context_free (LoadContext *context)
 	if (context->book != NULL)
 		g_object_unref (context->book);
 
-	if (context->parent != NULL)
-		g_object_unref (context->parent);
-
-	if (context->cancellable != NULL)
-		g_object_unref (context->cancellable);
-
-	g_free (context->auth_uri);
-	g_free (context->auth_method);
-	g_free (context->auth_username);
-
 	g_slice_free (LoadContext, context);
 }
 
 static void
-load_book_source_get_auth_details (ESource *source,
-                                   LoadContext *context)
-{
-	const gchar *property;
-	gchar *uri;
-
-	/* auth_method */
-
-	property = e_source_get_property (source, "auth");
-
-	if (property == NULL || strcmp (property, "none") == 0)
-		return;
-
-	context->auth_method = g_strdup (property);
-
-	/* auth_uri */
-
-	uri = e_source_get_uri (source);
-	context->auth_uri = remove_parameters_from_uri (uri);
-	g_free (uri);
-
-	/* auth_username */
-
-	if (g_strcmp0 (context->auth_method, "ldap/simple-binddn") == 0) {
-		property = e_source_get_property (source, "binddn");
-
-	} else if (g_strcmp0 (context->auth_method, "plain/password") == 0) {
-		property = e_source_get_property (source, "user");
-		if (property == NULL)
-			property = e_source_get_property (source, "username");
-
-	} else
-		property = e_source_get_property (source, "email_addr");
-
-	if (property == NULL)
-		property = "";
-
-	context->auth_username = g_strdup (property);
-
-	/* auth_remember */
-
-	property = e_source_get_property (source, "remember_password");
-
-	context->auth_remember = (g_strcmp0 (property, "true") == 0);
-}
-
-static gchar *
-load_book_source_password_prompt (EBook *book,
-                                  LoadContext *context,
-                                  gboolean reprompt)
-{
-	ESource *source;
-	GString *string;
-	const gchar *title;
-	gchar *password;
-	guint32 flags;
-
-	source = e_book_get_source (book);
-	string = g_string_sized_new (256);
-
-	flags = E_PASSWORDS_REMEMBER_FOREVER |
-		E_PASSWORDS_SECRET | E_PASSWORDS_ONLINE;
-
-	if (reprompt) {
-		g_string_assign (string, _("Failed to authenticate.\n"));
-		flags |= E_PASSWORDS_REPROMPT;
-	}
-
-	g_string_append_printf (
-		string, _("Enter password for %s (user %s)"),
-		e_source_get_display_name (source), context->auth_username);
-
-	/* XXX Dialog windows should not have titles. */
-	title = "";
-
-	password = e_passwords_ask_password (
-		title, NULL, context->auth_uri, string->str,
-		flags, &context->auth_remember, context->parent);
-
-	g_string_free (string, TRUE);
-
-	return password;
-}
-
-static void
 load_book_source_thread (GSimpleAsyncResult *simple,
                          ESource *source,
                          GCancellable *cancellable)
 {
 	EBook *book;
 	LoadContext *context;
-	gchar *password;
-	gboolean reprompt = FALSE;
 	GError *error = NULL;
 
 	context = g_simple_async_result_get_op_res_gpointer (simple);
@@ -471,67 +78,6 @@ load_book_source_thread (GSimpleAsyncResult *simple,
 		return;
 	}
 
-	if (g_cancellable_set_error_if_cancelled (cancellable, &error)) {
-		g_simple_async_result_take_error (simple, error);
-		g_object_unref (book);
-		return;
-	}
-
-	/* Do we need to authenticate? */
-	if (context->auth_method == NULL)
-		goto exit;
-
-	password = e_passwords_get_password (NULL, context->auth_uri);
-
-prompt:
-	if (g_cancellable_set_error_if_cancelled (cancellable, &error)) {
-		g_simple_async_result_take_error (simple, error);
-		g_object_unref (book);
-		g_free (password);
-		return;
-	}
-
-	if (password == NULL) {
-		password = load_book_source_password_prompt (
-			book, context, reprompt);
-		reprompt = TRUE;
-	}
-
-	/* If we have a password, attempt to authenticate with it. */
-	if (password != NULL) {
-		e_book_authenticate_user (
-			book, context->auth_username, password,
-			context->auth_method, &error);
-
-		g_free (password);
-		password = NULL;
-
-	/* The user did not wish to provide a password.  If the address
-	 * book can be accessed anonymously, do that but warn about it. */
-	} else if (e_book_check_static_capability (book, "anon-access")) {
-		context->anonymous_alert = TRUE;
-		goto exit;
-
-	/* Final fallback is to fail. */
-	} else {
-		g_cancellable_cancel (cancellable);
-		goto prompt;
-	}
-
-	/* If authentication failed, forget the password and reprompt. */
-	if (g_error_matches (
-		error, E_BOOK_ERROR, E_BOOK_ERROR_AUTHENTICATION_FAILED)) {
-		e_passwords_forget_password (NULL, context->auth_uri);
-		g_clear_error (&error);
-		goto prompt;
-
-	} else if (error != NULL) {
-		g_simple_async_result_take_error (simple, error);
-		g_object_unref (book);
-		return;
-	}
-
-exit:
 	context->book = book;
 }
 
@@ -565,9 +111,6 @@ e_load_book_source_async (ESource *source,
 
 	g_return_if_fail (E_IS_SOURCE (source));
 
-	/* Source must have a group so we can obtain its URI. */
-	g_return_if_fail (e_source_peek_group (source) != NULL);
-
 	if (parent != NULL) {
 		g_return_if_fail (GTK_IS_WINDOW (parent));
 		g_object_ref (parent);
@@ -582,12 +125,6 @@ e_load_book_source_async (ESource *source,
 	}
 
 	context = g_slice_new0 (LoadContext);
-	context->parent = parent;
-	context->cancellable = cancellable;
-
-	/* Extract authentication details from the ESource before
-	 * spawning the thread, since ESource is not thread-safe. */
-	load_book_source_get_auth_details (source, context);
 
 	simple = g_simple_async_result_new (
 		G_OBJECT (source), callback,
@@ -601,7 +138,7 @@ e_load_book_source_async (ESource *source,
 
 	g_simple_async_result_run_in_thread (
 		simple, (GSimpleAsyncThreadFunc) load_book_source_thread,
-		G_PRIORITY_DEFAULT, context->cancellable);
+		G_PRIORITY_DEFAULT, cancellable);
 
 	g_object_unref (simple);
 }
@@ -647,22 +184,5 @@ e_load_book_source_finish (ESource *source,
 	context = g_simple_async_result_get_op_res_gpointer (simple);
 	g_return_val_if_fail (context != NULL, NULL);
 
-	/* Alert the user that an address book is being accessed anonymously.
-	 * FIXME Do not mention "LDAP", as this may apply to other backends. */
-	if (context->anonymous_alert) {
-		GtkWidget *dialog;
-
-		dialog = gtk_message_dialog_new (
-			context->parent, 0,
-			GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
-			_("Accessing LDAP Server anonymously"));
-		gtk_dialog_run (GTK_DIALOG (dialog));
-		gtk_widget_destroy (dialog);
-	}
-
-	e_source_set_property (
-		source, "remember_password",
-		context->auth_remember ? "true" : "false");
-
 	return g_object_ref (context->book);
 }
diff --git a/libedataserverui/e-book-auth-util.h b/libedataserverui/e-book-auth-util.h
index 7977b57..ed3514b 100644
--- a/libedataserverui/e-book-auth-util.h
+++ b/libedataserverui/e-book-auth-util.h
@@ -30,10 +30,6 @@
 
 G_BEGIN_DECLS
 
-EBook *		e_load_book_source		(ESource *source,
-						 EBookCallback open_func,
-						 gpointer user_data);
-
 void		e_load_book_source_async	(ESource *source,
 						 GtkWindow *parent,
 						 GCancellable *cancellable,



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