Skip to content

Commit

Permalink
Merge pull request #2245 from mikiher/watcher-fixes
Browse files Browse the repository at this point in the history
Fix incorrect subpath checks in server/watcher.js
  • Loading branch information
advplyr committed Oct 23, 2023
2 parents c4c1283 + 9a477a9 commit 0ee6336
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 3 deletions.
6 changes: 3 additions & 3 deletions server/Watcher.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -233,7 +233,7 @@ class FolderWatcher extends EventEmitter {

checkShouldIgnorePath(path) {
return !!this.ignoreDirs.find(dirpath => {
return filePathToPOSIX(path).startsWith(dirpath)
return isSameOrSubPath(dirpath, path)
})
}

Expand Down
19 changes: 19 additions & 0 deletions server/utils/fileUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 0ee6336

Please sign in to comment.