From ceeec091f85d0094e07537b7f62f18292655a710 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 3 Nov 2024 16:22:32 -0800 Subject: [PATCH] Fixed: Normalize unicode characters when comparing paths for equality Closes #6657 --- src/NzbDrone.Common.Test/PathExtensionFixture.cs | 10 ++++++++++ src/NzbDrone.Common/Extensions/PathExtensions.cs | 4 ++++ src/NzbDrone.Common/PathEqualityComparer.cs | 4 ++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Common.Test/PathExtensionFixture.cs b/src/NzbDrone.Common.Test/PathExtensionFixture.cs index d06d2d9a8..870c30866 100644 --- a/src/NzbDrone.Common.Test/PathExtensionFixture.cs +++ b/src/NzbDrone.Common.Test/PathExtensionFixture.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Text; using FluentAssertions; using Moq; using NUnit.Framework; @@ -434,5 +435,14 @@ namespace NzbDrone.Common.Test { parentPath.GetRelativePath(childPath).Should().Be(relativePath); } + + [Test] + public void should_be_equal_with_different_unicode_representations() + { + var path1 = @"C:\Test\file.mkv".AsOsAgnostic().Normalize(NormalizationForm.FormC); + var path2 = @"C:\Test\file.mkv".AsOsAgnostic().Normalize(NormalizationForm.FormD); + + path1.PathEquals(path2); + } } } diff --git a/src/NzbDrone.Common/Extensions/PathExtensions.cs b/src/NzbDrone.Common/Extensions/PathExtensions.cs index 3245ca580..bbad26f60 100644 --- a/src/NzbDrone.Common/Extensions/PathExtensions.cs +++ b/src/NzbDrone.Common/Extensions/PathExtensions.cs @@ -54,6 +54,10 @@ namespace NzbDrone.Common.Extensions public static bool PathEquals(this string firstPath, string secondPath, StringComparison? comparison = null) { + // Normalize paths to ensure unicode characters are represented the same way + firstPath = firstPath.Normalize(); + secondPath = secondPath?.Normalize(); + if (!comparison.HasValue) { comparison = DiskProviderBase.PathStringComparison; diff --git a/src/NzbDrone.Common/PathEqualityComparer.cs b/src/NzbDrone.Common/PathEqualityComparer.cs index 5b9c3aa1c..bd6fa430d 100644 --- a/src/NzbDrone.Common/PathEqualityComparer.cs +++ b/src/NzbDrone.Common/PathEqualityComparer.cs @@ -21,10 +21,10 @@ namespace NzbDrone.Common { if (OsInfo.IsWindows) { - return obj.CleanFilePath().ToLower().GetHashCode(); + return obj.CleanFilePath().Normalize().ToLower().GetHashCode(); } - return obj.CleanFilePath().GetHashCode(); + return obj.CleanFilePath().Normalize().GetHashCode(); } } }