[evolution] Bug #578335 - CalDAV - replace '@' in username to "%40"



commit c37d8283829c74d8ca2cb803b6663840160d5f24
Author: Milan Crha <mcrha redhat com>
Date:   Mon May 25 17:55:38 2009 +0200

    Bug #578335 - CalDAV - replace '@' in username to "%40"
---
 plugins/caldav/caldav-source.c |   55 +++++++++++++++++++++++++++++++++------
 1 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/plugins/caldav/caldav-source.c b/plugins/caldav/caldav-source.c
index 5df807a..e3d2c52 100644
--- a/plugins/caldav/caldav-source.c
+++ b/plugins/caldav/caldav-source.c
@@ -79,6 +79,29 @@ e_plugin_lib_enable (EPluginLib *ep, int enable)
 	return 0;
 }
 
+/* replaces all '@' with '%40' in str; returns newly allocated string */
+static char *
+replace_at_sign (const char *str)
+{
+	char *res, *at;
+
+	if (!str)
+		return NULL;
+
+	res = g_strdup (str);
+	while (at = strchr (res, '@'), at) {
+		char *tmp = g_malloc0 (sizeof (char) * (1 + strlen (res) + 2));
+
+		strncpy (tmp, res, at - res);
+		strcat (tmp, "%40");
+		strcat (tmp, at + 1);
+
+		g_free (res);
+		res = tmp;
+	}
+
+	return res;
+}
 
 /*****************************************************************************/
 /* the location field for caldav sources */
@@ -87,17 +110,27 @@ e_plugin_lib_enable (EPluginLib *ep, int enable)
 static gchar *
 print_uri_noproto (EUri *uri)
 {
-	gchar *uri_noproto;
+	gchar *uri_noproto, *user, *pass;
+
+	if (uri->user)
+		user = replace_at_sign (uri->user);
+	else
+		user = NULL;
+
+	if (uri->passwd)
+		pass = replace_at_sign (uri->passwd);
+	else
+		pass = NULL;
 
 	if (uri->port != 0)
 		uri_noproto = g_strdup_printf (
 			"%s%s%s%s%s%s%s:%d%s%s%s",
-			uri->user ? uri->user : "",
+			user ? user : "",
 			uri->authmech ? ";auth=" : "",
 			uri->authmech ? uri->authmech : "",
-			uri->passwd ? ":" : "",
-			uri->passwd ? uri->passwd : "",
-			uri->user ? "@" : "",
+			pass ? ":" : "",
+			pass ? pass : "",
+			user ? "@" : "",
 			uri->host ? uri->host : "",
 			uri->port,
 			uri->path ? uri->path : "",
@@ -106,16 +139,20 @@ print_uri_noproto (EUri *uri)
 	else
 		uri_noproto = g_strdup_printf (
 			"%s%s%s%s%s%s%s%s%s%s",
-			uri->user ? uri->user : "",
+			user ? user : "",
 			uri->authmech ? ";auth=" : "",
 			uri->authmech ? uri->authmech : "",
-			uri->passwd ? ":" : "",
-			uri->passwd ? uri->passwd : "",
-			uri->user ? "@" : "",
+			pass ? ":" : "",
+			pass ? pass : "",
+			user ? "@" : "",
 			uri->host ? uri->host : "",
 			uri->path ? uri->path : "",
 			uri->query ? "?" : "",
 			uri->query ? uri->query : "");
+
+	g_free (user);
+	g_free (pass);
+
 	return uri_noproto;
 }
 



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