[evolution-data-server/gnome-3-0] Bug #645783 - Return safe paths from CamelService::get_path() (cherry picked from commit de8f0fcd815
- From: David Woodhouse <dwmw2 src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/gnome-3-0] Bug #645783 - Return safe paths from CamelService::get_path() (cherry picked from commit de8f0fcd815
- Date: Tue, 19 Apr 2011 20:51:50 +0000 (UTC)
commit dbeca5fcae6e4628b0c2e27fd78662b39e1d0b6e
Author: Milan Crha <mcrha redhat com>
Date: Tue Apr 19 12:13:57 2011 +0200
Bug #645783 - Return safe paths from CamelService::get_path()
(cherry picked from commit de8f0fcd81534a60b81fa1802e75910556a3ab6f)
camel/camel-service.c | 70 +++++++++++++++++++++++++++++++++++++++---------
1 files changed, 57 insertions(+), 13 deletions(-)
---
diff --git a/camel/camel-service.c b/camel/camel-service.c
index 888ec49..8e19cff 100644
--- a/camel/camel-service.c
+++ b/camel/camel-service.c
@@ -34,6 +34,8 @@
#include <glib/gi18n-lib.h>
+#include <libedataserver/e-data-server-util.h>
+
#include "camel-debug.h"
#include "camel-operation.h"
#include "camel-service.h"
@@ -129,42 +131,84 @@ service_get_path (CamelService *service)
{
CamelProvider *prov = service->provider;
CamelURL *url = service->url;
- GString *gpath;
- gchar *path;
+ GString *use_path1 = NULL, *use_path2 = NULL;
+ gchar *ret_path = NULL;
/* A sort of ad-hoc default implementation that works for our
* current set of services.
*/
- gpath = g_string_new (service->provider->protocol);
if (CAMEL_PROVIDER_ALLOWS (prov, CAMEL_URL_PART_USER)) {
+ use_path1 = g_string_new ("");
+
if (CAMEL_PROVIDER_ALLOWS (prov, CAMEL_URL_PART_HOST)) {
- g_string_append_printf (gpath, "/%s %s",
+ g_string_append_printf (use_path1, "%s %s",
url->user ? url->user : "",
url->host ? url->host : "");
if (url->port)
- g_string_append_printf (gpath, ":%d", url->port);
+ g_string_append_printf (use_path1, ":%d", url->port);
} else {
- g_string_append_printf (gpath, "/%s%s", url->user ? url->user : "",
+ g_string_append_printf (use_path1, "%s%s", url->user ? url->user : "",
CAMEL_PROVIDER_NEEDS (prov, CAMEL_URL_PART_USER) ? "" : "@");
}
+
+ e_filename_make_safe (use_path1->str);
} else if (CAMEL_PROVIDER_ALLOWS (prov, CAMEL_URL_PART_HOST)) {
- g_string_append_printf (gpath, "/%s%s",
+ use_path1 = g_string_new ("");
+
+ g_string_append_printf (use_path1, "%s%s",
CAMEL_PROVIDER_NEEDS (prov, CAMEL_URL_PART_HOST) ? "" : "@",
url->host ? url->host : "");
if (url->port)
- g_string_append_printf (gpath, ":%d", url->port);
+ g_string_append_printf (use_path1, ":%d", url->port);
+
+ e_filename_make_safe (use_path1->str);
+ }
+
+ if (CAMEL_PROVIDER_NEEDS (prov, CAMEL_URL_PART_PATH) && url->path && *url->path) {
+ use_path2 = g_string_new (*url->path == '/' ? url->path + 1 : url->path);
+
+ /* fix directory separators, if needed */
+ if (G_DIR_SEPARATOR != '/') {
+ gchar **elems = g_strsplit (use_path2->str, "/", -1);
+
+ if (elems) {
+ gint ii;
+
+ g_string_truncate (use_path2, 0);
+
+ for (ii = 0; elems[ii]; ii++) {
+ gchar *elem = elems[ii];
+
+ if (*elem) {
+ e_filename_make_safe (elem);
+
+ if (use_path2->len)
+ g_string_append_c (use_path2, G_DIR_SEPARATOR);
+ g_string_append (use_path2, elem);
+ }
+ }
+
+ g_strfreev (elems);
+ }
+ }
+ }
+
+ if (!use_path1 && use_path2) {
+ use_path1 = use_path2;
+ use_path2 = NULL;
}
- if (CAMEL_PROVIDER_NEEDS (prov, CAMEL_URL_PART_PATH))
- g_string_append_printf (gpath, "%s%s", *url->path == '/' ? "" : "/", url->path);
+ ret_path = g_build_filename (service->provider->protocol, use_path1 ? use_path1->str : NULL, use_path2 ? use_path2->str : NULL, NULL);
- path = gpath->str;
- g_string_free (gpath, FALSE);
+ if (use_path1)
+ g_string_free (use_path1, TRUE);
+ if (use_path2)
+ g_string_free (use_path2, TRUE);
- return path;
+ return ret_path;
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]