File bgo-552583-save-passwords.patch of Package evolution

--- mail/mail-config.c	2009-01-15 16:58:29.000000000 +0530
+++ mail/mail-config.c	2008-12-24 19:07:19.000000000 +0530
@@ -778,52 +800,67 @@ mail_config_get_account_by_uid (const ch
 	return (EAccount *) e_account_list_find (config->accounts, E_ACCOUNT_FIND_UID, uid);
 }
 
+static gboolean
+mail_config_account_url_equal (const CamelURL *u1,
+                               const CamelURL *u2)
+{
+	/* For the purpose of matching a URL to an EAccount, only compare
+	 * the protocol, user, host and port and disregard the rest. */
+
+	if (g_strcmp0 (u1->protocol, u2->protocol) != 0)
+		return FALSE;
+
+	if (g_strcmp0 (u1->user, u2->user) != 0)
+		return FALSE;
+
+	if (g_strcmp0 (u1->host, u2->host) != 0)
+		return FALSE;
+
+	return (u1->port == u2->port);
+}
+
 EAccount *
 mail_config_get_account_by_source_url (const char *source_url)
 {
-	CamelProvider *provider;
-	EAccount *account;
-	CamelURL *source;
+	EAccount *account = NULL;
 	EIterator *iter;
+	CamelURL *url;
 
 	g_return_val_if_fail (source_url != NULL, NULL);
 
-	provider = camel_provider_get(source_url, NULL);
-	if (!provider)
-		return NULL;
-
-	source = camel_url_new (source_url, NULL);
-	if (!source)
-		return NULL;
+	url = camel_url_new (source_url, NULL);
+	g_return_val_if_fail (url != NULL, NULL);
 
 	iter = e_list_get_iterator ((EList *) config->accounts);
-	while (e_iterator_is_valid (iter)) {
-		account = (EAccount *) e_iterator_get (iter);
+	while (account == NULL && e_iterator_is_valid (iter)) {
+		CamelURL *account_url;
 
-		if (account->source && account->source->url && account->source->url[0]) {
-			CamelURL *url;
+		account = (EAccount *) e_iterator_get (iter);
 
-			url = camel_url_new (account->source->url, NULL);
-			if (url && provider->url_equal (url, source)) {
-				camel_url_free (url);
-				camel_url_free (source);
-				g_object_unref (iter);
+		e_iterator_next (iter);
 
-				return account;
-			}
+		if ( !account || (account->source == NULL) || 
+			(account->source->url == NULL) || (*account->source->url == '\0')) {
+			account = NULL;
+			continue;
+		}
 
-			if (url)
-				camel_url_free (url);
+		account_url = camel_url_new (account->source->url, NULL);
+		if (account_url == NULL) {
+			account = NULL;
+			continue;
 		}
 
-		e_iterator_next (iter);
+		if (!mail_config_account_url_equal (url, account_url))
+			account = NULL;  /* not a match */
+
+		camel_url_free (account_url);
 	}
 
 	g_object_unref (iter);
+	camel_url_free (url);
 
-	camel_url_free (source);
-
-	return NULL;
+	return account;
 }
 
 EAccount *
@@ -831,48 +868,43 @@ mail_config_get_account_by_transport_url
 {
 	EAccount *account = NULL;
 	EIterator *iter;
+	CamelURL *url;
 
 	g_return_val_if_fail (transport_url != NULL, NULL);
 
+	url = camel_url_new (transport_url, NULL);
+	g_return_val_if_fail (url != NULL, NULL);
+
 	iter = e_list_get_iterator ((EList *) config->accounts);
-	while (e_iterator_is_valid (iter)) {
-		CamelURL *url;
-		gchar *string;
+	while (account == NULL && e_iterator_is_valid (iter)) {
+		CamelURL *account_url;
 
 		account = (EAccount *) e_iterator_get (iter);
 
 		e_iterator_next (iter);
 
-		if (account->transport == NULL)
-			continue;
-
-		else if (account->transport->url == NULL)
-			continue;
-
-		else if (*account->transport->url == '\0')
-			continue;
+		if ( !account || (account->transport == NULL) || 
+			(account->transport->url == NULL) || (*account->transport->url == '\0')) {
+				account = NULL;
+				continue;
+		}
 
-		url = camel_url_new (account->transport->url, NULL);
-		if (url == NULL)
+		account_url = camel_url_new (account->transport->url, NULL);
+		if (account_url == NULL) {
+			account = NULL;
 			continue;
+		}
 
-		/* Simplify the account URL for comparison. */
-		string = camel_url_to_string (url, CAMEL_URL_HIDE_ALL);
-		if (string == NULL || strcmp (string, transport_url) != 0)
+		if (!mail_config_account_url_equal (url, account_url))
 			account = NULL;  /* not a match */
 
-		camel_url_free (url);
-		g_free (string);
-
-		if (account != NULL) {
-			g_object_unref (iter);
-			return account;
-		}
+		camel_url_free (account_url);
 	}
 
 	g_object_unref (iter);
+	camel_url_free (url);
 
-	return NULL;
+	return account;
 }
 
 int
openSUSE Build Service is sponsored by