Fixed: Normalize unicode characters when comparing paths for equality

Closes #6657
pull/7376/head
Mark McDowall 4 months ago committed by Mark McDowall
parent 675e3cd38a
commit ceeec091f8

@ -1,5 +1,6 @@
using System; using System;
using System.IO; using System.IO;
using System.Text;
using FluentAssertions; using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
@ -434,5 +435,14 @@ namespace NzbDrone.Common.Test
{ {
parentPath.GetRelativePath(childPath).Should().Be(relativePath); 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);
}
} }
} }

@ -54,6 +54,10 @@ namespace NzbDrone.Common.Extensions
public static bool PathEquals(this string firstPath, string secondPath, StringComparison? comparison = null) 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) if (!comparison.HasValue)
{ {
comparison = DiskProviderBase.PathStringComparison; comparison = DiskProviderBase.PathStringComparison;

@ -21,10 +21,10 @@ namespace NzbDrone.Common
{ {
if (OsInfo.IsWindows) if (OsInfo.IsWindows)
{ {
return obj.CleanFilePath().ToLower().GetHashCode(); return obj.CleanFilePath().Normalize().ToLower().GetHashCode();
} }
return obj.CleanFilePath().GetHashCode(); return obj.CleanFilePath().Normalize().GetHashCode();
} }
} }
} }

Loading…
Cancel
Save