From cb257574db2704a87f83605fbdaa051309cba6c9 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Wed, 4 Jul 2012 16:59:29 +0000 Subject: [PATCH] dbus OpenDirectory() proper path handling if using URI. A path provided with URI will use URI escaping code and we must handle that. SVN revision: 73290 --- src/modules/fileman/e_mod_dbus.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/modules/fileman/e_mod_dbus.c b/src/modules/fileman/e_mod_dbus.c index 8f20d16cb..9af09584e 100644 --- a/src/modules/fileman/e_mod_dbus.c +++ b/src/modules/fileman/e_mod_dbus.c @@ -63,13 +63,13 @@ _e_fileman_dbus_daemon_free(E_Fileman_DBus_Daemon *d) free(d); } -DBusMessage * +static DBusMessage * _e_fileman_dbus_daemon_open_directory_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *message) { DBusMessageIter itr; const char *directory = NULL, *p; - char *dev; + char *dev, *to_free = NULL; E_Zone *zone; dbus_message_iter_init(message, &itr); @@ -78,13 +78,26 @@ _e_fileman_dbus_daemon_open_directory_cb(E_DBus_Object *obj __UNUSED__, if ((!directory) || (directory[0] == '\0')) return _e_fileman_dbus_daemon_error(message, "no directory provided."); - if (strncmp(directory, "file://", sizeof("file://") - 1) == 0) - directory += sizeof("file://") - 1; - zone = e_util_zone_current_get(e_manager_current_get()); if (!zone) return _e_fileman_dbus_daemon_error(message, "could not find a zone."); + if (strstr(directory, "://")) + { + Efreet_Uri *uri = efreet_uri_decode(directory); + + directory = NULL; + if (uri) + { + if ((uri->protocol) && (strcmp(uri->protocol, "file") == 0)) + directory = to_free = strdup(uri->path); + efreet_uri_free(uri); + } + + if (!directory) + return _e_fileman_dbus_daemon_error(message, "unsupported protocol"); + } + p = strchr(directory, '/'); if (p) { @@ -92,8 +105,11 @@ _e_fileman_dbus_daemon_open_directory_cb(E_DBus_Object *obj __UNUSED__, dev = malloc(len + 1); if (!dev) - return _e_fileman_dbus_daemon_error - (message, "could not allocate memory."); + { + free(to_free); + return _e_fileman_dbus_daemon_error(message, + "could not allocate memory."); + } memcpy(dev, directory, len); dev[len] = '\0'; @@ -111,6 +127,7 @@ _e_fileman_dbus_daemon_open_directory_cb(E_DBus_Object *obj __UNUSED__, e_fwin_new(zone->container, dev, directory); free(dev); + free(to_free); return dbus_message_new_method_return(message); }