From aa66358725564ae7c28190a61b2a4934367ab81c Mon Sep 17 00:00:00 2001 From: ta264 Date: Tue, 1 Oct 2019 21:33:28 +0100 Subject: [PATCH] Fixed: Prevent GetFilesByBasePath matching partial paths When searching for /test/path it was returning files in /test/path2. Fix by making sure to search for /test/path/ --- .../MediaFiles/MediaFileRepositoryFixture.cs | 35 +++++++++++++++---- .../MediaFiles/MediaFileRepository.cs | 7 ++-- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/NzbDrone.Core.Test/MediaFiles/MediaFileRepositoryFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/MediaFileRepositoryFixture.cs index fbf128409..67b4aba40 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/MediaFileRepositoryFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/MediaFileRepositoryFixture.cs @@ -7,6 +7,7 @@ using NzbDrone.Core.Music; using NzbDrone.Core.Test.Framework; using System.Collections.Generic; using System.Linq; +using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.MediaFiles { @@ -55,9 +56,9 @@ namespace NzbDrone.Core.Test.MediaFiles .TheFirst(5) .With(c => c.AlbumId = album.Id) .TheFirst(1) - .With(c => c.Path = "/Test/Path/Artist/somefile1.flac") + .With(c => c.Path = @"C:\Test\Path\Artist\somefile1.flac".AsOsAgnostic()) .TheNext(1) - .With(c => c.Path = "/Test/Path/Artist/somefile2.flac") + .With(c => c.Path = @"C:\Test\Path\Artist\somefile2.flac".AsOsAgnostic()) .BuildListOfNew(); Db.InsertMany(files); @@ -116,21 +117,43 @@ namespace NzbDrone.Core.Test.MediaFiles secondReleaseFiles.Should().HaveCount(1); } - [Test] - public void get_files_by_base_path() + [TestCase("C:\\Test\\Path")] + [TestCase("C:\\Test\\Path\\")] + public void get_files_by_base_path_should_cope_with_trailing_slash(string dir) { VerifyData(); - var firstReleaseFiles = Subject.GetFilesWithBasePath("/Test/Path"); + var firstReleaseFiles = Subject.GetFilesWithBasePath(dir.AsOsAgnostic()); VerifyEagerLoaded(firstReleaseFiles); firstReleaseFiles.Should().HaveCount(2); } + [TestCase("C:\\Test\\Path")] + [TestCase("C:\\Test\\Path\\")] + public void get_files_by_base_path_should_not_get_files_for_partial_path(string dir) + { + VerifyData(); + + var files = Builder.CreateListOfSize(2) + .All() + .With(c => c.Id = 0) + .With(c => c.Quality =new QualityModel(Quality.MP3_192)) + .TheFirst(1) + .With(c => c.Path = @"C:\Test\Path2\Artist\somefile1.flac".AsOsAgnostic()) + .TheNext(1) + .With(c => c.Path = @"C:\Test\Path2\Artist\somefile2.flac".AsOsAgnostic()) + .BuildListOfNew(); + Db.InsertMany(files); + + var firstReleaseFiles = Subject.GetFilesWithBasePath(dir.AsOsAgnostic()); + firstReleaseFiles.Should().HaveCount(2); + } + [Test] public void get_file_by_path() { VerifyData(); - var file = Subject.GetFileWithPath("/Test/Path/Artist/somefile2.flac"); + var file = Subject.GetFileWithPath(@"C:\Test\Path\Artist\somefile2.flac".AsOsAgnostic()); file.Should().NotBeNull(); file.Tracks.IsLoaded.Should().BeTrue(); diff --git a/src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs b/src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs index da8b84ae7..175d13f10 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs @@ -1,9 +1,8 @@ using System.Collections.Generic; +using System.IO; using System.Linq; -using Marr.Data; using Marr.Data.QGen; using NzbDrone.Core.Datastore; -using NzbDrone.Core.Datastore.Extensions; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Music; @@ -80,8 +79,10 @@ namespace NzbDrone.Core.MediaFiles public List GetFilesWithBasePath(string path) { + // ensure path ends with a single trailing path separator to avoid matching partial paths + var safePath = path.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar; return Query - .Where(x => x.Path.StartsWith(path)) + .Where(x => x.Path.StartsWith(safePath)) .ToList(); }