diff --git a/core/js/js.js b/core/js/js.js index 16da273c8e..0db9967094 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -422,6 +422,28 @@ var OC={ return path.replace(/\\/g,'/').replace(/\/[^\/]*$/, ''); }, + /** + * Returns whether the given paths are the same, without + * leading, trailing or doubled slashes and also removing + * the dot sections. + * + * @param {String} path1 first path + * @param {String} path2 second path + * @return {bool} true if the paths are the same + * + * @since 9.0 + */ + isSamePath: function(path1, path2) { + var filterDot = function(p) { + return p !== '.'; + }; + var pathSections1 = _.filter((path1 || '').split('/'), filterDot); + var pathSections2 = _.filter((path2 || '').split('/'), filterDot); + path1 = OC.joinPaths.apply(OC, pathSections1); + path2 = OC.joinPaths.apply(OC, pathSections2); + return path1 === path2; + }, + /** * Join path sections * diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js index 01a0e6acb6..5d42f0881d 100644 --- a/core/js/tests/specs/coreSpec.js +++ b/core/js/tests/specs/coreSpec.js @@ -188,6 +188,71 @@ describe('Core base tests', function() { expect(OC.joinPaths('/', '//', '/')).toEqual('/'); }); }); + describe('isSamePath', function() { + it('recognizes empty paths are equal', function() { + expect(OC.isSamePath('', '')).toEqual(true); + expect(OC.isSamePath('/', '')).toEqual(true); + expect(OC.isSamePath('//', '')).toEqual(true); + expect(OC.isSamePath('/', '/')).toEqual(true); + expect(OC.isSamePath('/', '//')).toEqual(true); + }); + it('recognizes path with single sections as equal regardless of extra slashes', function() { + expect(OC.isSamePath('abc', 'abc')).toEqual(true); + expect(OC.isSamePath('/abc', 'abc')).toEqual(true); + expect(OC.isSamePath('//abc', 'abc')).toEqual(true); + expect(OC.isSamePath('abc', '/abc')).toEqual(true); + expect(OC.isSamePath('abc/', 'abc')).toEqual(true); + expect(OC.isSamePath('abc/', 'abc/')).toEqual(true); + expect(OC.isSamePath('/abc/', 'abc/')).toEqual(true); + expect(OC.isSamePath('/abc/', '/abc/')).toEqual(true); + expect(OC.isSamePath('//abc/', '/abc/')).toEqual(true); + expect(OC.isSamePath('//abc//', '/abc/')).toEqual(true); + + expect(OC.isSamePath('abc', 'def')).toEqual(false); + expect(OC.isSamePath('/abc', 'def')).toEqual(false); + expect(OC.isSamePath('//abc', 'def')).toEqual(false); + expect(OC.isSamePath('abc', '/def')).toEqual(false); + expect(OC.isSamePath('abc/', 'def')).toEqual(false); + expect(OC.isSamePath('abc/', 'def/')).toEqual(false); + expect(OC.isSamePath('/abc/', 'def/')).toEqual(false); + expect(OC.isSamePath('/abc/', '/def/')).toEqual(false); + expect(OC.isSamePath('//abc/', '/def/')).toEqual(false); + expect(OC.isSamePath('//abc//', '/def/')).toEqual(false); + }); + it('recognizes path with multiple sections as equal regardless of extra slashes', function() { + expect(OC.isSamePath('abc/def', 'abc/def')).toEqual(true); + expect(OC.isSamePath('/abc/def', 'abc/def')).toEqual(true); + expect(OC.isSamePath('abc/def', '/abc/def')).toEqual(true); + expect(OC.isSamePath('abc/def/', '/abc/def/')).toEqual(true); + expect(OC.isSamePath('/abc/def/', '/abc/def/')).toEqual(true); + expect(OC.isSamePath('/abc/def/', 'abc/def/')).toEqual(true); + expect(OC.isSamePath('//abc/def/', 'abc/def/')).toEqual(true); + expect(OC.isSamePath('//abc/def//', 'abc/def/')).toEqual(true); + + expect(OC.isSamePath('abc/def', 'abc/ghi')).toEqual(false); + expect(OC.isSamePath('/abc/def', 'abc/ghi')).toEqual(false); + expect(OC.isSamePath('abc/def', '/abc/ghi')).toEqual(false); + expect(OC.isSamePath('abc/def/', '/abc/ghi/')).toEqual(false); + expect(OC.isSamePath('/abc/def/', '/abc/ghi/')).toEqual(false); + expect(OC.isSamePath('/abc/def/', 'abc/ghi/')).toEqual(false); + expect(OC.isSamePath('//abc/def/', 'abc/ghi/')).toEqual(false); + expect(OC.isSamePath('//abc/def//', 'abc/ghi/')).toEqual(false); + }); + it('recognizes path entries with dot', function() { + expect(OC.isSamePath('.', '')).toEqual(true); + expect(OC.isSamePath('.', '.')).toEqual(true); + expect(OC.isSamePath('.', '/')).toEqual(true); + expect(OC.isSamePath('/.', '/')).toEqual(true); + expect(OC.isSamePath('/./', '/')).toEqual(true); + expect(OC.isSamePath('/./', '/.')).toEqual(true); + expect(OC.isSamePath('/./', '/./')).toEqual(true); + expect(OC.isSamePath('/./', '/./')).toEqual(true); + + expect(OC.isSamePath('a/./b', 'a/b')).toEqual(true); + expect(OC.isSamePath('a/b/.', 'a/b')).toEqual(true); + expect(OC.isSamePath('./a/b', 'a/b')).toEqual(true); + }); + }); describe('filePath', function() { beforeEach(function() { OC.webroot = 'http://localhost';