diff --git a/src/Sign.Core/Tools/VsixSignTool/OpcPart.cs b/src/Sign.Core/Tools/VsixSignTool/OpcPart.cs index fe29ae8e..e7456eb0 100644 --- a/src/Sign.Core/Tools/VsixSignTool/OpcPart.cs +++ b/src/Sign.Core/Tools/VsixSignTool/OpcPart.cs @@ -60,7 +60,10 @@ public string ContentType { var extension = Path.GetExtension(_path)?.TrimStart('.'); - return Package.ContentTypes.FirstOrDefault(ct => string.Equals(ct.Extension, extension, StringComparison.OrdinalIgnoreCase))?.ContentType ?? OpcKnownMimeTypes.OctetString; + var defaultContentType = Package.ContentTypes.FirstOrDefault(ct => string.Equals(ct.Extension, extension, StringComparison.OrdinalIgnoreCase)); + var overrideContentType = Package.ContentTypes.FirstOrDefault(ct => string.Equals(ct.PartName?.Trim('/'), _path, StringComparison.OrdinalIgnoreCase)); + + return overrideContentType?.ContentType ?? defaultContentType?.ContentType ?? OpcKnownMimeTypes.OctetString; } } @@ -111,4 +114,4 @@ private OpcRelationships ConstructRelationships() /// public override int GetHashCode() => Uri.GetHashCode(); } -} \ No newline at end of file +} diff --git a/test/Sign.Core.Test/TestAssets/VSIXSamples/OpenVsixSignToolTest-Overrides.vsix b/test/Sign.Core.Test/TestAssets/VSIXSamples/OpenVsixSignToolTest-Overrides.vsix new file mode 100644 index 00000000..7b243bcd Binary files /dev/null and b/test/Sign.Core.Test/TestAssets/VSIXSamples/OpenVsixSignToolTest-Overrides.vsix differ diff --git a/test/Sign.Core.Test/Tools/VSIXSignTool/OpcPackageTests.cs b/test/Sign.Core.Test/Tools/VSIXSignTool/OpcPackageTests.cs index 70412630..c0398721 100644 --- a/test/Sign.Core.Test/Tools/VSIXSignTool/OpcPackageTests.cs +++ b/test/Sign.Core.Test/Tools/VSIXSignTool/OpcPackageTests.cs @@ -7,6 +7,7 @@ namespace Sign.Core.Test public class OpcPackageTests : IDisposable { private static readonly string SamplePackage = Path.Combine(".", "TestAssets", "VSIXSamples", "OpenVsixSignToolTest.vsix"); + private static readonly string SamplePackageWithOverrides = Path.Combine(".", "TestAssets", "VSIXSamples", "OpenVsixSignToolTest-Overrides.vsix"); private static readonly string SamplePackageSigned = Path.Combine(".", "TestAssets", "VSIXSamples", "OpenVsixSignToolTest-Signed.vsix"); private readonly List _shadowFiles = new List(); @@ -187,6 +188,24 @@ public void ShouldReturnSignatureForSignedPackage() } } + [Fact] + public void ShouldHonorContentTypeIfOverrideIsListedInContentTypesFile() + { + string path; + using (var package = ShadowCopyPackage(SamplePackageWithOverrides, out path, OpcPackageFileMode.ReadWrite)) + { + var partToCheck = new Uri("/extension.vsixmanifest", UriKind.Relative); + var part = package.GetPart(partToCheck); + Assert.True(part != null && part.ContentType == "text/xml"); + } + using (var package = OpcPackage.Open(path, OpcPackageFileMode.ReadWrite)) + { + var partToCheck = new Uri("/extension.vsixmanifest", UriKind.Relative); + var part = package.GetPart(partToCheck); + Assert.True(part != null && part.ContentType == "text/xml"); + } + } + private OpcPackage ShadowCopyPackage(string packagePath, out string path, OpcPackageFileMode mode = OpcPackageFileMode.Read) { var temp = Path.GetTempFileName();