Convert relative path to absolute path 65/201165/1
authorSeonah Moon <seonah1.moon@samsung.com>
Wed, 6 Mar 2019 08:23:29 +0000 (17:23 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Mon, 11 Mar 2019 05:23:29 +0000 (14:23 +0900)
Even if relative path is passed from user,
absolute path will be delivered to daemon.

Change-Id: I7616eb27f728bda81de4af6bc97aa5ec3b642f5b

packaging/download-provider.spec
provider-interface/download-provider-interface.c

index 62078b8..a85541b 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       download-provider
 Summary:    Download the contents in background
-Version:    2.1.106
+Version:    2.1.107
 Release:    0
 Group:      Development/Libraries
 License:    Apache-2.0
index edf8d15..323a125 100755 (executable)
@@ -81,6 +81,8 @@ typedef struct {
        void *state_data;
        dp_interface_progress_cb progress;
        void *progress_data;
+       char *saved_temp_path;
+       char *downloaded_path;
 } dp_interface_slot;
 
 // declare the variables
@@ -839,34 +841,51 @@ int dp_interface_get_url(const int id, char **url)
 int dp_interface_set_destination(const int id, const char *path)
 {
        char set_filename[DOWNLOAD_FILENAME_MAX] = {0, };
+       char *resolved_path = NULL;
+       int index = __get_my_slot_index(id);
+
+       if (index < 0)
+               return DOWNLOAD_ADAPTOR_ERROR_INVALID_PARAMETER;
 
        if (path == NULL)
                return __dp_ipc_echo(id, DP_SEC_UNSET, DP_PROP_DESTINATION, __FUNCTION__);
 
-       if (storage_get_origin_internal_path(path, DOWNLOAD_FILENAME_MAX, set_filename) == 0) {
+       if (g_interface_slots[index].downloaded_path)
+               free(g_interface_slots[index].downloaded_path);
+
+       g_interface_slots[index].downloaded_path = strdup(path);
+       resolved_path = realpath(g_interface_slots[index].downloaded_path, NULL);
+       if (!resolved_path) {
+               TRACE_ERROR("Invalid path");
+               return DOWNLOAD_ADAPTOR_ERROR_INVALID_PARAMETER;
+       }
+
+       if (storage_get_origin_internal_path(resolved_path,
+                               DOWNLOAD_FILENAME_MAX, set_filename) == 0) {
                /* Converted. Use converted path. */
-               TRACE_ERROR("Converted filename : %s -> %s", path, set_filename);
-               return __dp_ipc_set_string(id, DP_SEC_SET, DP_PROP_DESTINATION, set_filename, __FUNCTION__);
+               TRACE_ERROR("Converted filename : %s -> %s",
+                               resolved_path, set_filename);
+               return __dp_ipc_set_string(id, DP_SEC_SET,
+                               DP_PROP_DESTINATION, set_filename, __FUNCTION__);
        }
-       return __dp_ipc_set_string(id, DP_SEC_SET, DP_PROP_DESTINATION, path, __FUNCTION__);
+       return __dp_ipc_set_string(id, DP_SEC_SET,
+                       DP_PROP_DESTINATION, resolved_path, __FUNCTION__);
 }
 
 int dp_interface_get_destination(const int id, char **path)
 {
-       char compat_filename[DOWNLOAD_FILENAME_MAX] = {0, };
-       int ret = 0;
-
-       if (!path)
-               return DP_ERROR_INVALID_PARAMETER ;
+       int index = __get_my_slot_index(id);
 
-       ret = __dp_ipc_get_string(id, DP_PROP_DESTINATION, path, __FUNCTION__);
+       if (index < 0 || !path)
+               return DOWNLOAD_ADAPTOR_ERROR_INVALID_PARAMETER;
 
-       if (storage_get_compat_internal_path(*path, DOWNLOAD_FILENAME_MAX, compat_filename) == 0) {
-               /* Converted. Use converted path. */
-               TRACE_ERROR("Converted filename : %s -> %s", *path, compat_filename);
-               *path = strdup(compat_filename);
+       if (!g_interface_slots[index].downloaded_path) {
+               *path = NULL;
+               return DOWNLOAD_ADAPTOR_ERROR_NO_DATA;
        }
-       return ret;
+
+       *path = strdup(g_interface_slots[index].downloaded_path);
+       return DOWNLOAD_ADAPTOR_ERROR_NONE;
 }
 
 int dp_interface_set_file_name(const int id, const char *file_name)
@@ -901,19 +920,18 @@ int dp_interface_get_downloaded_file_path(const int id, char **path)
 
 int dp_interface_get_temp_path(const int id, char **temp_path)
 {
-       char compat_filename[DOWNLOAD_FILENAME_MAX] = {0, };
-       int ret = 0;
+       int index = __get_my_slot_index(id);
 
-       if (temp_path == NULL)
-               return DP_ERROR_INVALID_PARAMETER;
-       ret = __dp_ipc_get_string(id, DP_PROP_TEMP_SAVED_PATH, temp_path, __FUNCTION__);
+       if (index < 0 || !temp_path)
+               return DOWNLOAD_ADAPTOR_ERROR_INVALID_PARAMETER;
 
-       if (storage_get_compat_internal_path(*temp_path, DOWNLOAD_FILENAME_MAX, compat_filename) == 0) {
-               /* Converted. Use converted path. */
-               TRACE_ERROR("Converted filename : %s -> %s", *temp_path, compat_filename);
-               *temp_path = strdup(compat_filename);
+       if (!g_interface_slots[index].saved_temp_path) {
+               *temp_path = NULL;
+               return DOWNLOAD_ADAPTOR_ERROR_NO_DATA;
        }
-       return ret;
+
+       *temp_path = strdup(g_interface_slots[index].saved_temp_path);
+       return DOWNLOAD_ADAPTOR_ERROR_NONE;
 }
 
 int dp_interface_get_content_name(const int id, char **content_name)
@@ -929,13 +947,32 @@ int dp_interface_get_etag(const int id, char **etag)
 int dp_interface_set_temp_file_path(const int id, const char *path)
 {
        char set_filename[DOWNLOAD_FILENAME_MAX] = {0, };
+       char *resolved_path = NULL;
+       int index = __get_my_slot_index(id);
 
-       if (storage_get_origin_internal_path(path, DOWNLOAD_FILENAME_MAX, set_filename) == 0) {
-               /* Converted. Use converted path. */
-               TRACE_ERROR("Converted filename : %s -> %s", path, set_filename);
-               return __dp_ipc_set_string(id, DP_SEC_SET, DP_PROP_TEMP_SAVED_PATH, set_filename, __FUNCTION__);
+       if (index < 0)
+               return DOWNLOAD_ADAPTOR_ERROR_INVALID_PARAMETER;
+
+       if (g_interface_slots[index].saved_temp_path)
+               free(g_interface_slots[index].saved_temp_path);
+
+       g_interface_slots[index].saved_temp_path = strdup(path);
+       resolved_path = realpath(g_interface_slots[index].saved_temp_path, NULL);
+       if (!resolved_path) {
+               TRACE_ERROR("Invalid path");
+               return DOWNLOAD_ADAPTOR_ERROR_INVALID_PARAMETER;
+       } else {
+               if (storage_get_origin_internal_path(resolved_path,
+                                       DOWNLOAD_FILENAME_MAX, set_filename) == 0) {
+                       /* Converted. Use converted path. */
+                       TRACE_ERROR("Converted filename : %s -> %s",
+                                       resolved_path, set_filename);
+                       return __dp_ipc_set_string(id, DP_SEC_SET,
+                                       DP_PROP_TEMP_SAVED_PATH, set_filename, __FUNCTION__);
+               }
        }
-       return __dp_ipc_set_string(id, DP_SEC_SET, DP_PROP_TEMP_SAVED_PATH, path, __FUNCTION__);
+       return __dp_ipc_set_string(id, DP_SEC_SET,
+                       DP_PROP_TEMP_SAVED_PATH, resolved_path, __FUNCTION__);
 }
 
 int dp_interface_set_network_type(const int id, int net_type)