diff --git a/server/Watcher.js b/server/Watcher.js index 3ce6a5f5d4..f348ce8e6c 100644 --- a/server/Watcher.js +++ b/server/Watcher.js @@ -6,7 +6,7 @@ const LibraryScanner = require('./scanner/LibraryScanner') const Task = require('./objects/Task') const TaskManager = require('./managers/TaskManager') -const { filePathToPOSIX } = require('./utils/fileUtils') +const { filePathToPOSIX, isSameOrSubPath } = require('./utils/fileUtils') /** * @typedef PendingFileUpdate @@ -183,7 +183,7 @@ class FolderWatcher extends EventEmitter { } // Get file folder - const folder = libwatcher.folders.find(fold => path.startsWith(filePathToPOSIX(fold.fullPath))) + const folder = libwatcher.folders.find(fold => isSameOrSubPath(fold.fullPath, path)) if (!folder) { Logger.error(`[Watcher] New file folder not found in library "${libwatcher.name}" with path "${path}"`) return @@ -233,7 +233,7 @@ class FolderWatcher extends EventEmitter { checkShouldIgnorePath(path) { return !!this.ignoreDirs.find(dirpath => { - return filePathToPOSIX(path).startsWith(dirpath) + return isSameOrSubPath(dirpath, path) }) } diff --git a/server/utils/fileUtils.js b/server/utils/fileUtils.js index 4df264004e..19735fb70d 100644 --- a/server/utils/fileUtils.js +++ b/server/utils/fileUtils.js @@ -19,6 +19,25 @@ const filePathToPOSIX = (path) => { } module.exports.filePathToPOSIX = filePathToPOSIX +/** + * Check path is a child of or equal to another path + * + * @param {string} parentPath + * @param {string} childPath + * @returns {boolean} + */ +function isSameOrSubPath(parentPath, childPath) { + parentPath = filePathToPOSIX(parentPath) + childPath = filePathToPOSIX(childPath) + if (parentPath === childPath) return true + const relativePath = Path.relative(parentPath, childPath) + return ( + relativePath === '' // Same path (e.g. parentPath = '/a/b/', childPath = '/a/b') + || !relativePath.startsWith('..') && !Path.isAbsolute(relativePath) // Sub path + ) +} +module.exports.isSameOrSubPath = isSameOrSubPath + async function getFileStat(path) { try { var stat = await fs.stat(path)