From 87079dcb5293a39d8c8f3b6ade768ef08389a90e Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 12 Jun 2011 20:56:10 -0700 Subject: [PATCH] Added validation in RoodDirProvider to stop adding of invalid root folders. --- NzbDrone.Core.Test/RootDirProviderTest.cs | 38 +++++++++++++++++----- NzbDrone.Core/Providers/RootDirProvider.cs | 30 ++++++++++++----- 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/NzbDrone.Core.Test/RootDirProviderTest.cs b/NzbDrone.Core.Test/RootDirProviderTest.cs index 1ddf58866..796709dc2 100644 --- a/NzbDrone.Core.Test/RootDirProviderTest.cs +++ b/NzbDrone.Core.Test/RootDirProviderTest.cs @@ -40,15 +40,14 @@ namespace NzbDrone.Core.Test Assert.AreEqual(result.Count, 2); } - [Test] - public void AddRootDir() + [TestCase("D:\\TV Shows\\")] + [TestCase("//server//folder")] + public void AddRootDir(string path) { //Setup var mocker = new AutoMoqer(); mocker.SetConstant(MockLib.GetEmptyRepository()); - const string path = @"C:\TV\"; - //Act var rootDirProvider = mocker.Resolve(); rootDirProvider.Add(new RootDir { Path = path }); @@ -62,25 +61,26 @@ namespace NzbDrone.Core.Test Assert.AreEqual(path, rootDirs.First().Path); } - [Test] - public void UpdateRootDir() + + [TestCase("D:\\TV Shows\\")] + [TestCase("//server//folder")] + public void UpdateRootDir(string newPath) { //Setup var mocker = new AutoMoqer(); mocker.SetConstant(MockLib.GetEmptyRepository()); - const string path = @"C:\TV2"; //Act var rootDirProvider = mocker.Resolve(); rootDirProvider.Add(new RootDir { Path = @"C:\TV" }); - rootDirProvider.Update(new RootDir { Id = 1, Path = path }); + rootDirProvider.Update(new RootDir { Id = 1, Path = newPath }); //Assert var rootDirs = rootDirProvider.GetAll(); Assert.IsNotEmpty(rootDirs); rootDirs.Should().HaveCount(1); - Assert.AreEqual(path, rootDirs.First().Path); + Assert.AreEqual(newPath, rootDirs.First().Path); } [Test] @@ -144,5 +144,25 @@ namespace NzbDrone.Core.Test var mocker = new AutoMoqer(); mocker.Resolve().GetUnmappedFolders(""); } + + [TestCase("")] + [TestCase(null)] + [TestCase("BAD PATH")] + [ExpectedException(typeof(ArgumentException))] + public void invalid_folder_path_throws_on_add(string path) + { + var mocker = new AutoMoqer(); + mocker.Resolve().Add(new RootDir { Id = 0, Path = path }); + } + + [TestCase("")] + [TestCase(null)] + [TestCase("BAD PATH")] + [ExpectedException(typeof(ArgumentException))] + public void invalid_folder_path_throws_on_update(string path) + { + var mocker = new AutoMoqer(); + mocker.Resolve().Update(new RootDir { Id = 2, Path = path }); + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/RootDirProvider.cs b/NzbDrone.Core/Providers/RootDirProvider.cs index 9c1e1aee9..1bb341d20 100644 --- a/NzbDrone.Core/Providers/RootDirProvider.cs +++ b/NzbDrone.Core/Providers/RootDirProvider.cs @@ -11,15 +11,15 @@ namespace NzbDrone.Core.Providers { public class RootDirProvider { - private readonly IRepository _sonioRepo; + private readonly IRepository _repository; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private readonly DiskProvider _diskProvider; private readonly SeriesProvider _seriesProvider; - public RootDirProvider(IRepository sonicRepo, SeriesProvider seriesProvider, DiskProvider diskProvider) + public RootDirProvider(IRepository repository, SeriesProvider seriesProvider, DiskProvider diskProvider) { - _sonioRepo = sonicRepo; + _repository = repository; _diskProvider = diskProvider; _seriesProvider = seriesProvider; } @@ -28,27 +28,39 @@ namespace NzbDrone.Core.Providers public virtual List GetAll() { - return _sonioRepo.All().ToList(); + return _repository.All().ToList(); } - public virtual int Add(RootDir rootDir) + public virtual void Add(RootDir rootDir) { - return Convert.ToInt32(_sonioRepo.Add(rootDir)); + ValidatePath(rootDir); + + _repository.Add(rootDir); } public virtual void Remove(int rootDirId) { - _sonioRepo.Delete(rootDirId); + _repository.Delete(rootDirId); } public virtual void Update(RootDir rootDir) { - _sonioRepo.Update(rootDir); + ValidatePath(rootDir); + + _repository.Update(rootDir); + } + + private static void ValidatePath(RootDir rootDir) + { + if (String.IsNullOrWhiteSpace(rootDir.Path) || !Path.IsPathRooted(rootDir.Path)) + { + throw new ArgumentException("Invalid path"); + } } public virtual RootDir GetRootDir(int rootDirId) { - return _sonioRepo.Single(rootDirId); + return _repository.Single(rootDirId); } public List GetUnmappedFolders(string path)