From 84678b5e4e6c8ddbd1213da0c84a74bb292ecf3a Mon Sep 17 00:00:00 2001 From: Pawel Andruszkiewicz Date: Tue, 10 Nov 2015 15:26:33 +0100 Subject: [PATCH] [File] Added support for '..' to getFile() and getDirectory() methods. [Verification] Code compiles, pass rate: 136/140. Change-Id: I53930086ee9eaacc86c144e52ddc829f0c0bf90b Signed-off-by: Pawel Andruszkiewicz --- src/file/js/DirectoryEntry.js | 56 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/src/file/js/DirectoryEntry.js b/src/file/js/DirectoryEntry.js index 027c7a2..820c725 100644 --- a/src/file/js/DirectoryEntry.js +++ b/src/file/js/DirectoryEntry.js @@ -18,16 +18,43 @@ cordova.define('cordova-plugin-file.tizen.DirectoryEntry', function(require, exports, module) { // TODO: remove -> end + function sanitizePath(path) { + var prepend = '/' === path[0]; + var input = path.split('/'); + var output = []; + + for (var i = 0; i < input.length; ++i) { + var part = input[i]; + switch (part) { + case '': + case '.': + // ignore + break; + + case '..': + // remove previous part + output.pop(); + break; + + default: + output.push(part); + break; + } + } + + return (prepend ? '/' : '') + output.join('/'); + } + var getFunction = function(successCallback, errorCallback, args, isDirectory) { - var uri = args[0], - path = args[1], + var uri = rootsUtils.stripTrailingSlash(args[0]), + path = rootsUtils.stripTrailingSlash(args[1]), options = args[2] || {}, create_flag = !!options.create, exclusive_flag = !!options.exclusive, absolute_path = ''; if ('/' === path[0]) { - // path seems absolute, checking if path is a child of this object uri + // path seems absolute, checking if path is a child of this object URI if (0 === path.indexOf(uri)) { // path is child - OK absolute_path = path; @@ -39,13 +66,20 @@ cordova.define('cordova-plugin-file.tizen.DirectoryEntry', function(require, exp } } else { // path seems to be relative path, combining absolute path - absolute_path = uri + (uri[uri.length-1] === '/' ? '' : '/') + path; + absolute_path = uri + '/' + path; + } + + var root = rootsUtils.findFilesystem(absolute_path).fullPath; + var clean_path = sanitizePath(absolute_path); + + if (0 !== clean_path.indexOf(root)) { + // we went above the root directory, force the absolute path to be + // at least in that directory + clean_path = root + '/' + sanitizePath(absolute_path.substring(root.length + 1)); } - // removing slash at the end for safety when getting parent path - absolute_path = absolute_path[absolute_path.length-1] === '/' ? - absolute_path.substring(0, absolute_path.length-1) : absolute_path; - var parent_path = absolute_path.substring(0, absolute_path.lastIndexOf('/')); - var child_name = absolute_path.substring(absolute_path.lastIndexOf('/') + 1); + + var parent_path = clean_path.substring(0, clean_path.lastIndexOf('/')); + var child_name = clean_path.substring(clean_path.lastIndexOf('/') + 1); if (!rootsUtils.isValidFileName(child_name)) { console.error('Disallowed character detected in file name: ' + child_name); @@ -54,7 +88,7 @@ cordova.define('cordova-plugin-file.tizen.DirectoryEntry', function(require, exp } var resolveSuccess = function(dir) { - // absolute_path points to existing destination + // clean_path points to existing destination if (create_flag && exclusive_flag) { console.error('Error while resolving dir - already exist dir'); errorCallback && errorCallback(FileError.PATH_EXISTS_ERR); @@ -101,7 +135,7 @@ cordova.define('cordova-plugin-file.tizen.DirectoryEntry', function(require, exp // try to resolve try { - tizen.filesystem.resolve(absolute_path, resolveSuccess, resolveError, 'rw'); + tizen.filesystem.resolve(clean_path, resolveSuccess, resolveError, 'rw'); } catch (err) { console.error('Error - Could not resolve'); errorCallback && errorCallback(ConvertTizenFileError(err)); -- 2.7.4