aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/caldav/caldav-source.c55
1 files changed, 46 insertions, 9 deletions
diff --git a/plugins/caldav/caldav-source.c b/plugins/caldav/caldav-source.c
index 5df807a691..e3d2c52ab4 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;
}