[ 
https://issues.apache.org/jira/browse/TIKA-4959?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Adam Rauch updated TIKA-4959:
-----------------------------
    Attachment: msg_header_date_sample.msg

> OutlookExtractor never uses the Date: transport header, because header keys 
> are stored without the colon
> --------------------------------------------------------------------------------------------------------
>
>                 Key: TIKA-4959
>                 URL: https://issues.apache.org/jira/browse/TIKA-4959
>             Project: Tika
>          Issue Type: Bug
>          Components: parser
>    Affects Versions: 2.9.2, 3.3.2, 4.1.0
>         Environment:  Eclipse Adoptium OpenJDK 25.0.4.1+1-LTS on Windows 11
>            Reporter: Adam Rauch
>            Priority: Minor
>         Attachments: msg_header_date_sample.msg
>
>
> Discovered while upgrading to 4.1.0 with assistance from Claude Code. This 
> report is Claude-generated, but reviewed and edited by a human.
> When an Outlook {{.msg}} file has no message date property (no submission 
> chunk, and none of {{{}PR_CLIENT_SUBMIT_TIME{}}}, {{PR_CREATION_TIME}} or 
> {{{}PR_LAST_MODIFICATION_TIME{}}}), {{OutlookExtractor.handleGeneralDates()}} 
> is meant to fall back to the {{Date:}} line in the transport headers. That 
> fallback can never run, so such messages get no 
> {{{}dcterms:created{}}}/{{{}dcterms:modified{}}}, even when the headers 
> contain a valid date.
> {{normalizeHeaders()}} stores each header under its bare name. 
> {{HEADER_KEY_PAT}} excludes {{:}} from the key, so the {{Date:}} line is 
> stored under the key {{{}Date{}}}. {{handleGeneralDates()}} then tests:
> {code:java}
> if (headerKey.toLowerCase(Locale.ROOT).startsWith("date:")) {
>     String date = headerKey.substring(headerKey.indexOf(':') + 1).trim();
> {code}
> No key can contain a colon, so the condition is always false and 
> {{MailDateParser.parseDateLenient()}} is never reached. The value extraction 
> is also wrong: it
> reads the date from the key, not from the header's value.
> Steps to reproduce
> Take a {{.msg}} with {{PR_TRANSPORT_MESSAGE_HEADERS}} containing a {{Date:}} 
> line, for example {{{}Date: Thu, 5 Apr 2007 09:26:06 -0700{}}}.
> Remove the top-level {{{}0x0039{}}}, {{0x3007}} and {{0x3008}} entries from 
> {{{}__properties_version1.0{}}}. With POI, {{MAPIMessage.getMessageDate()}} 
> now returns null, and {{getHeaders()}} still contains the {{Date:}} line.
> Parse it with {{{}AutoDetectParser{}}}.
> Expected: {{dcterms:created}} and {{dcterms:modified}} are 
> 2007-04-05T16:26:06Z, from the header.
> Actual: both are absent.
> Suggested fix:
> {code:java}
> if (headerKey.equalsIgnoreCase("date") && header.getValue().length > 0) {
>     String date = header.getValue()[0];
> {code}
> Related: TIKA-4798 (PR #2987) changes the same method.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to