This is an automated email from the ASF dual-hosted git repository.

tallison pushed a commit to branch TIKA-4091
in repository https://gitbox.apache.org/repos/asf/tika.git

commit 8c5b355f990e75b9f14dbebace17188416ecadb9
Author: tallison <[email protected]>
AuthorDate: Wed Jul 26 13:26:47 2023 -0400

    TIKA-4091 -- small fixes to surprises from the initial commits for TIKA-4091
---
 .../main/java/org/apache/tika/metadata/Office.java |  2 ++
 .../detect/microsoft/POIFSContainerDetector.java   |  6 ++++
 .../parser/microsoft/AbstractPOIFSExtractor.java   | 40 ++++++++++++++++++++++
 3 files changed, 48 insertions(+)

diff --git a/tika-core/src/main/java/org/apache/tika/metadata/Office.java 
b/tika-core/src/main/java/org/apache/tika/metadata/Office.java
index aff57f701..815f060c1 100644
--- a/tika-core/src/main/java/org/apache/tika/metadata/Office.java
+++ b/tika-core/src/main/java/org/apache/tika/metadata/Office.java
@@ -174,4 +174,6 @@ public interface Office {
      * Word.Document.12 or AcroExch.Document.DC
      */
     Property PROG_ID = Property.internalText("msoffice:progID");
+
+    Property OCX_NAME = Property.internalText("msoffice:ocxName");
 }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/detect/microsoft/POIFSContainerDetector.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/detect/microsoft/POIFSContainerDetector.java
index 23648c884..b67638f8d 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/detect/microsoft/POIFSContainerDetector.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/detect/microsoft/POIFSContainerDetector.java
@@ -91,6 +91,8 @@ public class POIFSContainerDetector implements Detector {
      */
     public static final MediaType MS_EQUATION = application("vnd.ms-equation");
 
+    public static final String OCX_NAME = "\u0003OCXNAME";
+
     /**
      * Microsoft Excel
      */
@@ -343,6 +345,10 @@ public class POIFSContainerDetector implements Detector {
             return WPS;
         } else if (ucNames.contains(EQUATION_NATIVE)) {
             return MS_EQUATION;
+        } else if (ucNames.contains(OCX_NAME)) {
+            //active x control should be parsed as OLE, not COMP_OBJ -- 
TIKA-4091
+            //TODO -- create a mime for active x
+            return OLE;
         } else if (ucNames.contains(CONTENTS) && ucNames.contains(OBJ_INFO)) {
             return COMP_OBJ;
         } else if (ucNames.contains(CONTENTS) && 
ucNames.contains(COMP_OBJ_STRING)) {
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/AbstractPOIFSExtractor.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/AbstractPOIFSExtractor.java
index fa464b902..b98220d95 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/AbstractPOIFSExtractor.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/AbstractPOIFSExtractor.java
@@ -16,9 +16,14 @@
  */
 package org.apache.tika.parser.microsoft;
 
+import java.io.ByteArrayOutputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.util.Iterator;
 
+import javax.print.Doc;
+
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.apache.poi.hpsf.ClassID;
 import org.apache.poi.poifs.filesystem.DirectoryEntry;
 import org.apache.poi.poifs.filesystem.DirectoryNode;
@@ -27,6 +32,8 @@ import org.apache.poi.poifs.filesystem.DocumentInputStream;
 import org.apache.poi.poifs.filesystem.Entry;
 import org.apache.poi.poifs.filesystem.Ole10Native;
 import org.apache.poi.poifs.filesystem.Ole10NativeException;
+import org.apache.poi.util.IOUtils;
+import org.apache.poi.util.StringUtil;
 import org.xml.sax.SAXException;
 
 import org.apache.tika.config.TikaConfig;
@@ -36,6 +43,7 @@ import org.apache.tika.exception.TikaException;
 import org.apache.tika.extractor.EmbeddedDocumentUtil;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.Office;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.mime.MimeType;
@@ -48,6 +56,8 @@ import org.apache.tika.sax.XHTMLContentHandler;
 import org.apache.tika.utils.StringUtils;
 
 abstract class AbstractPOIFSExtractor {
+
+    private static final String OCX_NAME = "\u0003OCXNAME";
     protected final Metadata parentMetadata;//metadata of the parent/container 
document
     protected final OfficeParserConfig officeParserConfig;
     protected final ParseContext context;
@@ -199,6 +209,7 @@ abstract class AbstractPOIFSExtractor {
         }
         POIFSDocumentType type = POIFSDocumentType.detectType(dir);
         String rName = (resourceName == null) ? dir.getName() : resourceName;
+        extractOCXName(dir, metadata);
         if (type == POIFSDocumentType.OLE10_NATIVE) {
             handleOLENative(dir, type, rName, metadata, xhtml, outputHtml);
         } else if (type == POIFSDocumentType.COMP_OBJ) {
@@ -217,6 +228,35 @@ abstract class AbstractPOIFSExtractor {
         }
     }
 
+    private void extractOCXName(DirectoryEntry dir, Metadata metadata) {
+        if (! dir.hasEntry(OCX_NAME)) {
+            return;
+        }
+        try {
+            Entry e = dir.getEntry(OCX_NAME);
+            if (!e.isDocumentEntry()) {
+                return;
+            }
+            UnsynchronizedByteArrayOutputStream bos = new 
UnsynchronizedByteArrayOutputStream();
+            try (DocumentInputStream dis = new 
DocumentInputStream((DocumentEntry) e)) {
+                IOUtils.copy(dis, bos);
+            }
+            byte[] bytes = bos.toByteArray();
+            int charCount = (bytes.length - 4);
+            if (charCount < 0) {
+                return;
+            }
+            if (charCount % 2 != 0) {
+                return;
+            }
+            charCount /= 2;
+            String ocxName = StringUtil.getFromUnicodeLE0Terminated(bytes, 0, 
charCount);
+            metadata.set(Office.OCX_NAME, ocxName);
+        } catch (IOException e) {
+            //log this?
+        }
+    }
+
     private void handleCompObj(DirectoryEntry dir, POIFSDocumentType type, 
String rName,
                                Metadata metadata, XHTMLContentHandler xhtml, 
boolean outputHtml)
             throws IOException, SAXException {

Reply via email to