From d9f81f8ffcdba8d662a834d044aaa2fbfe968135 Mon Sep 17 00:00:00 2001 From: AdityaNPL Date: Thu, 18 Mar 2021 15:24:51 +0000 Subject: [PATCH 1/6] fix(backup_chain): UNC paths were not being recognised on Linux OS --- src/BackupChain.cs | 17 +------------ src/SmoFacade/BackupFileTools.cs | 20 ++++++++++++++++ tests/AgDatabaseMove.Unit/FileToolsTest.cs | 28 ++++++++++++++++++++++ 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/src/BackupChain.cs b/src/BackupChain.cs index 4d85f29..5061b87 100755 --- a/src/BackupChain.cs +++ b/src/BackupChain.cs @@ -98,22 +98,7 @@ private static IEnumerable NextLogBackup(IEnumerable Date: Mon, 29 Mar 2021 17:49:33 +0100 Subject: [PATCH 2/6] fix(unc path validation): better approach by using Uri class --- src/BackupChain.cs | 3 ++- src/SmoFacade/BackupFileTools.cs | 18 +++++++++++++++--- tests/AgDatabaseMove.Unit/FileToolsTest.cs | 21 +++++++++++++++++++-- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/BackupChain.cs b/src/BackupChain.cs index 5061b87..13916fd 100755 --- a/src/BackupChain.cs +++ b/src/BackupChain.cs @@ -98,7 +98,8 @@ private static IEnumerable NextLogBackup(IEnumerable Date: Mon, 29 Mar 2021 17:50:47 +0100 Subject: [PATCH 3/6] fix(unc path validation): small refactor --- src/SmoFacade/BackupFileTools.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/SmoFacade/BackupFileTools.cs b/src/SmoFacade/BackupFileTools.cs index 865167c..da6a452 100755 --- a/src/SmoFacade/BackupFileTools.cs +++ b/src/SmoFacade/BackupFileTools.cs @@ -51,8 +51,7 @@ public static BackupType BackupTypeAbbrevToType(string type) public static bool IsValidPath(string path) { // A quick check before leaning on exceptions - if (Path.GetInvalidPathChars().Any(path.Contains)) - { + if(Path.GetInvalidPathChars().Any(path.Contains)) { return false; } From 07cc5c4e2564f3857334fcd0dd2624f14bedb79b Mon Sep 17 00:00:00 2001 From: AdityaNPL Date: Tue, 30 Mar 2021 11:59:51 +0100 Subject: [PATCH 4/6] refactor(isUrl): using the `Uri` calss for the check and consolidating the UNC check inside that as well --- src/BackupChain.cs | 2 +- src/SmoFacade/BackupFileTools.cs | 15 +---- tests/AgDatabaseMove.Unit/FileToolsTest.cs | 68 ++++++++-------------- 3 files changed, 28 insertions(+), 57 deletions(-) diff --git a/src/BackupChain.cs b/src/BackupChain.cs index 13916fd..4dc3946 100755 --- a/src/BackupChain.cs +++ b/src/BackupChain.cs @@ -99,7 +99,7 @@ private static IEnumerable NextLogBackup(IEnumerable UrlFileExamples => new List { - new object[] { "https://hello/a.bak" }, - new object[] { "https://hello/a.full" }, - new object[] { "https://storage-account.blob.core.windows.net/container/file.trn" }, - new object[] { "https://hello/a.diff" }, - new object[] { "https://a.diff" }, - new object[] { "https://1/2/3/4/5/a.diff" }, - new object[] { "https://storage-account.blob.core.windows.net/container/file.bad" }, - new object[] - { "https://storage-account.blob.core.windows.net/container/sql/db_name/backup_2020_09_02_170003_697.trn" }, - new object[] { "http://hello/a.bak" } - }; - - public static IEnumerable NonUrlFileExamples => new List { - new object[] { @"c:\hello\a.bak" }, - new object[] { @"\\abc\hello/a.bak" }, - new object[] { "https://storage-account.blob.core.windows.net/container" }, - new object[] { "http://storage-account.blob.core.windows.net/container" } - }; [Theory] - [MemberData(nameof(UrlFileExamples))] - public void UrlFilesAreUrl(string file) + [InlineData(@"https://hello/a.bak")] + [InlineData(@"https://hello/a.full")] + [InlineData(@"https://storage-account.blob.core.windows.net/container/file.trn")] + [InlineData(@"https://hello/a.diff")] + [InlineData(@"https://1/2/3/4/5/a.diff")] + [InlineData(@"https://storage-account.blob.core.windows.net/container/file.bad")] + [InlineData(@"https://storage-account.blob.core.windows.net/container/sql/db_name/backup_2020_09_02_170003_697.trn")] + [InlineData(@"http://a.bak")] + // works for UNC urls too + [InlineData(@"\\server\file")] + [InlineData(@"\\server\path\file")] + [InlineData(@"\\server\path\file.ext")] + [InlineData(@"//Unix/syntax/file.ext")] + public void ValidUrlTests(string url) { - Assert.True(BackupFileTools.IsUrl(file)); + Assert.True(BackupFileTools.IsUrl(url)); } [Theory] - [MemberData(nameof(NonUrlFileExamples))] - public void NonUrlFilesAreNotUrl(string file) + // can't be to a dir + [InlineData(@"https://storage-account.blob.core.windows.net/container/")] + [InlineData(@"http://storage-account.blob.core.windows.net/container/")] + [InlineData(@"C:/hello/a.bak")] + [InlineData(@"\\C:/")] + [InlineData(@"\server\file.txt")] + [InlineData(@"/server/file.txt")] + public void InvalidUrlTests(string url) { - Assert.False(BackupFileTools.IsUrl(file)); + Assert.False(BackupFileTools.IsUrl(url)); } [Theory] @@ -84,24 +83,5 @@ public void InValidPathTests(string path) { Assert.False(BackupFileTools.IsValidPath(path)); } - - [Theory] - [InlineData(@"\\server\file")] - [InlineData(@"\\server\path\file")] - [InlineData(@"\\server\path\file.ext")] - [InlineData(@"//Unix/syntax/file.ext")] - public void ValidUncTests(string path) - { - Assert.True(BackupFileTools.IsUnc(path)); - } - - [Theory] - [InlineData(@"\\C:/")] - [InlineData(@"\server\")] - [InlineData(@"/server/")] - public void InvalidUncTests(string path) - { - Assert.False(BackupFileTools.IsUnc(path)); - } } } \ No newline at end of file From 147f7fe43c4430a66d954dc48c90fc704a2bd084 Mon Sep 17 00:00:00 2001 From: AdityaNPL Date: Tue, 30 Mar 2021 12:04:33 +0100 Subject: [PATCH 5/6] refactor(FileToolsTests): Remove redundant comments --- tests/AgDatabaseMove.Unit/FileToolsTest.cs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/tests/AgDatabaseMove.Unit/FileToolsTest.cs b/tests/AgDatabaseMove.Unit/FileToolsTest.cs index 3104d0b..10e801c 100755 --- a/tests/AgDatabaseMove.Unit/FileToolsTest.cs +++ b/tests/AgDatabaseMove.Unit/FileToolsTest.cs @@ -17,10 +17,10 @@ public class BackupFileToolsTest [InlineData(@"https://storage-account.blob.core.windows.net/container/file.bad")] [InlineData(@"https://storage-account.blob.core.windows.net/container/sql/db_name/backup_2020_09_02_170003_697.trn")] [InlineData(@"http://a.bak")] - // works for UNC urls too - [InlineData(@"\\server\file")] - [InlineData(@"\\server\path\file")] + [InlineData(@"\\UNC\syntax\path\file")] [InlineData(@"\\server\path\file.ext")] + [InlineData(@"\\server\file")] + [InlineData(@"\\server\file.ext")] [InlineData(@"//Unix/syntax/file.ext")] public void ValidUrlTests(string url) { @@ -28,13 +28,11 @@ public void ValidUrlTests(string url) } [Theory] - // can't be to a dir - [InlineData(@"https://storage-account.blob.core.windows.net/container/")] - [InlineData(@"http://storage-account.blob.core.windows.net/container/")] - [InlineData(@"C:/hello/a.bak")] [InlineData(@"\\C:/")] - [InlineData(@"\server\file.txt")] - [InlineData(@"/server/file.txt")] + [InlineData(@"\wrongUNC\file.txt")] + [InlineData(@"/wrongUNC/file.txt")] + [InlineData(@"https://storage-account.blob.core.windows.net/dir/")] + [InlineData(@"http://storage-account.blob.core.windows.net/dir/")] public void InvalidUrlTests(string url) { Assert.False(BackupFileTools.IsUrl(url)); From 6307f3427610fa9531bc083454bbec1918200d31 Mon Sep 17 00:00:00 2001 From: AdityaNPL Date: Fri, 9 Apr 2021 12:35:33 +0100 Subject: [PATCH 6/6] fix(path checks): make sure that path has file extension Tests and function names changed to reflect the same --- src/BackupChain.cs | 2 +- src/SmoFacade/BackupFileTools.cs | 8 +++--- src/SmoFacade/Server.cs | 4 +-- tests/AgDatabaseMove.Unit/FileToolsTest.cs | 33 +++++++++++++--------- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/BackupChain.cs b/src/BackupChain.cs index 4dc3946..778f297 100755 --- a/src/BackupChain.cs +++ b/src/BackupChain.cs @@ -99,7 +99,7 @@ private static IEnumerable NextLogBackup(IEnumerable backupOrder, string databaseName var restore = new Restore { Database = databaseName, NoRecovery = true }; foreach(var backup in backupOrder) { - var device = BackupFileTools.IsUrl(backup.PhysicalDeviceName) ? DeviceType.Url : DeviceType.File; + var device = BackupFileTools.IsValidFileUrl(backup.PhysicalDeviceName) ? DeviceType.Url : DeviceType.File; var backupDeviceItem = new BackupDeviceItem(backup.PhysicalDeviceName, device); if(_credentialName != null && device == DeviceType.Url) backupDeviceItem.CredentialName = _credentialName; @@ -207,7 +207,7 @@ private void Backup(Backup backup, string backupDirectoryPathQuery, string datab var backupDirectory = BackupDirectoryOrDefault(backupDirectoryPathQuery); var filePath = $"{backupDirectory}/{databaseName}_backup_{DateTime.Now.ToString("yyyy_MM_dd_hhmmss_fff")}.{BackupFileTools.BackupTypeToExtension(type)}"; - var deviceType = BackupFileTools.IsUrl(filePath) ? DeviceType.Url : DeviceType.File; + var deviceType = BackupFileTools.IsValidFileUrl(filePath) ? DeviceType.Url : DeviceType.File; var bdi = new BackupDeviceItem(filePath, deviceType); if(_credentialName != null && deviceType == DeviceType.Url) diff --git a/tests/AgDatabaseMove.Unit/FileToolsTest.cs b/tests/AgDatabaseMove.Unit/FileToolsTest.cs index 10e801c..20d7a52 100755 --- a/tests/AgDatabaseMove.Unit/FileToolsTest.cs +++ b/tests/AgDatabaseMove.Unit/FileToolsTest.cs @@ -17,25 +17,29 @@ public class BackupFileToolsTest [InlineData(@"https://storage-account.blob.core.windows.net/container/file.bad")] [InlineData(@"https://storage-account.blob.core.windows.net/container/sql/db_name/backup_2020_09_02_170003_697.trn")] [InlineData(@"http://a.bak")] - [InlineData(@"\\UNC\syntax\path\file")] - [InlineData(@"\\server\path\file.ext")] - [InlineData(@"\\server\file")] + [InlineData(@"\\UNC\syntax\path\file.ext")] [InlineData(@"\\server\file.ext")] [InlineData(@"//Unix/syntax/file.ext")] public void ValidUrlTests(string url) { - Assert.True(BackupFileTools.IsUrl(url)); + Assert.True(BackupFileTools.IsValidFileUrl(url)); } [Theory] + [InlineData(@"")] + [InlineData(@" ")] + [InlineData(@"c:\hello\a.bak")] [InlineData(@"\\C:/")] [InlineData(@"\wrongUNC\file.txt")] [InlineData(@"/wrongUNC/file.txt")] - [InlineData(@"https://storage-account.blob.core.windows.net/dir/")] + [InlineData(@"\\server\dir")] + [InlineData(@"\\server\dir\")] + [InlineData(@"https://storage-account.blob.core.windows.net/dir")] + [InlineData(@"http://storage-account.blob.core.windows.net/dir")] [InlineData(@"http://storage-account.blob.core.windows.net/dir/")] public void InvalidUrlTests(string url) { - Assert.False(BackupFileTools.IsUrl(url)); + Assert.False(BackupFileTools.IsValidFileUrl(url)); } [Theory] @@ -58,28 +62,29 @@ public void BackupTypeAbbrevToType(string abbrev, BackupFileTools.BackupType typ [Theory] [InlineData(@"C:\dir\file.ext")] - [InlineData(@"C:\dir\")] - [InlineData(@"C:\dir")] - [InlineData(@"C:\")] - [InlineData(@"/some/file")] - [InlineData(@"/dir")] - [InlineData(@"/")] + [InlineData(@"/some/file.ext")] + public void ValidPathTests(string path) { - Assert.True(BackupFileTools.IsValidPath(path)); + Assert.True(BackupFileTools.IsValidFilePath(path)); } [Theory] [InlineData(@"")] [InlineData(@" ")] + [InlineData(@"/dir")] + [InlineData(@"/")] [InlineData(@"file.ext")] [InlineData(@"dir\file.ext")] [InlineData(@"C dir\file.ext")] [InlineData(@"dir")] + [InlineData(@"C:\dir\")] + [InlineData(@"C:\dir")] + [InlineData(@"C:\")] [InlineData(@"C:\inval|d")] public void InValidPathTests(string path) { - Assert.False(BackupFileTools.IsValidPath(path)); + Assert.False(BackupFileTools.IsValidFilePath(path)); } } } \ No newline at end of file