dotnet / dotnet/Open-XML-SDK

Open document fail when Content_Types records paths with wrong case

Open
#1,355 3 comments 2 reactions 1 assignee Claimed by @twsouthwick View on GitHub
blocked: corefx System.IO.Packaging
Dominant language
C#
Stars
4.6k
Forks
605
PR merge metrics
No merged PRs in 30d

Description

**Describe the bug**

The `PresentationDocument.Open` will throw the OpenXmlPackageException exception when we open the document which Content_Types records paths with wrong case.

```
DocumentFormat.OpenXml.Packaging.OpenXmlPackageException:“The document cannot be opened because there is an invalid part with an unexpected content type.
[Part Uri=/ppt/presProps.xml],
[Content Type=application/xml],
[Expected Content Type=application/vnd.openxmlformats-officedocument.presentationml.presProps+xml].”

DocumentFormat.OpenXml.Packaging.OpenXmlPart.Load(DocumentFormat.OpenXml.Packaging.OpenXmlPackage, DocumentFormat.OpenXml.Packaging.OpenXmlPart, System.Uri, string, System.Collections.Generic.Dictionary)
DocumentFormat.OpenXml.Packaging.OpenXmlPartContainer.LoadReferencedPartsAndRelationships(DocumentFormat.OpenXml.Packaging.OpenXmlPackage, DocumentFormat.OpenXml.Packaging.OpenXmlPart, DocumentFormat.OpenXml.Packaging.RelationshipCollection, System.Collections.Generic.Dictionary)
DocumentFormat.OpenXml.Packaging.OpenXmlPartContainer.LoadReferencedPartsAndRelationships(DocumentFormat.OpenXml.Packaging.OpenXmlPackage, DocumentFormat.OpenXml.Packaging.OpenXmlPart, DocumentFormat.OpenXml.Packaging.RelationshipCollection, System.Collections.Generic.Dictionary)
DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Load(System.IO.Packaging.Package)
DocumentFormat.OpenXml.Packaging.PresentationDocument.Open(System.IO.Stream, bool, DocumentFormat.OpenXml.Packaging.OpenSettings)
```

The `[Content_Types].xml` records the PartName with wrong case, such as `/ppt/presprops.xml` what we expect is `/ppt/presProps.xml`.

And we can open the document with Office PowerPoint, but fail with OpenXMLSDK.

**Screenshots**

**To Reproduce**
// Please add a self-contained, minimum viable repro of the issue.
// If you require external resources, please provide a gist or GitHub repro
// An Xunit style test is preferred, but a console application would work too.

Steps to reproduce the behavior:
1. Download the [test file](https://github.com/dotnet/Open-XML-SDK/files/10907289/Content_Types.Path.case.pptx)
2. Use the code to open the test file:

```
PresentationDocument.Open(testFilePath, false)
```

**Observed behavior**
Throw the exception

**Expected behavior**
The Open XML SDK can open the document file.

**Desktop (please complete the following information):**
- OS: any
- Office version [e.g. 16.0.15427.20178]
- .NET Target: any
- DocumentFormat.OpenXml Version: 2.19.0

**Additional context**

Why the Open XML SDK can not open this document? Because the Open XML SDK will use ZipPackage to get the ContentType, see

https://github.com/dotnet/runtime/blob/2d5a9162f6bd9583981d54363d077a04e4efc868/src/libraries/System.IO.Packaging/src/System/IO/Packaging/ZipPackage.cs#L604-L624

But the `_overrideDictionary` does not ignore case, see

https://github.com/dotnet/runtime/blob/2d5a9162f6bd9583981d54363d077a04e4efc868/src/libraries/System.IO.Packaging/src/System/IO/Packaging/ZipPackage.cs#L694-L699

And it may be fixed in https://github.com/dotnet/Open-XML-SDK/pull/1295

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.