[ 
https://issues.apache.org/jira/browse/TIKA-4944?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18124988#comment-18124988
 ] 

ASF GitHub Bot commented on TIKA-4944:
--------------------------------------

Copilot commented on code in PR #3278:
URL: https://github.com/apache/tika/pull/3278#discussion_r4218119185


##########
tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/OneNoteTreeWalker.java:
##########
@@ -615,6 +624,20 @@ private Map<String, Object> 
processPropertyValue(PropertyValue propertyValue,
                         // have the onlyLatestRevision = false
                         handleRichEditTextUnicode(content.size());
                     }
+                } else if (propertyValue.propertyId.propertyEnum ==
+                        OneNotePropertyEnum.NotebookManagementEntityGuid
+                        && content.size() == 16) {
+                    ByteBuffer guidBuffer = ByteBuffer.allocate(16);
+                    dif.read(guidBuffer);
+                    String guid = 
pooledGuid(GUID.fromMicrosoftBytes(guidBuffer.array()).toString());
+                    propMap.put("notebookManagementEntityGuid", guid);
+                    // Version-history copies of a page are object-space 
roots; only the
+                    // current page's metadata is referenced via 
MetaDataObjectsAboveGraphSpace.
+                    if (objectType != OneNoteJcid.PAGE_METADATA || 
(parentPropertyId != null
+                            && parentPropertyId.propertyEnum ==
+                            
OneNotePropertyEnum.MetaDataObjectsAboveGraphSpace)) {
+                        addClassicEntityGuid(objectType, guid);
+                    }

Review Comment:
   `dif.read(guidBuffer)` is not guaranteed to fill the buffer in a single 
call; if it returns fewer than 16 bytes, the remaining bytes stay `0` and 
you’ll silently compute the wrong GUID. Please read in a loop until 
`guidBuffer` has no remaining bytes (or fail if EOF) before decoding; this also 
avoids potential `NullPointerException` risk if decode ever returns `null`.



##########
tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/fsshttpb/MSOneStorePackage.java:
##########
@@ -235,45 +244,68 @@ public void walkTree(OneNoteTreeWalkerOptions options, 
Metadata metadata,
             metadata.add(TikaCoreProperties.TIKA_META_EXCEPTION_WARNING, 
warning);
         }
         parseWarnings.clear();
-        if (!cells.isEmpty()) {
-            // Walk each page cell (object space) as a tree, starting from the 
root objects of
-            // its current revision and following the object references in 
property order. This
-            // emits the text in document order. The pages are walked in the 
order in which the
-            // section object space references them; cells that hold older 
versions of a page
-            // (the same object space in a different revision context) are 
skipped.
-            List<RevisionStoreCell> pageCells = new ArrayList<>();
-            List<RevisionStoreCell> otherCells = new ArrayList<>();
-            splitCells(pageCells, otherCells);
-            for (RevisionStoreCell cell : pageCells) {
-                xhtml.startElement("div", "class", "page");
-                try {
-                    walkCell(cell, options, metadata, xhtml);
-                } finally {
-                    xhtml.endElement("div");
+        try {
+            collectSectionFileIdentityGuids();
+            if (!cells.isEmpty()) {
+                // Walk each page cell (object space) as a tree, starting from 
the root objects of
+                // its current revision and following the object references in 
property order. This
+                // emits the text in document order. The pages are walked in 
the order in which the
+                // section object space references them; cells that hold older 
versions of a page
+                // (the same object space in a different revision context) are 
skipped.
+                List<RevisionStoreCell> pageCells = new ArrayList<>();
+                List<RevisionStoreCell> otherCells = new ArrayList<>();
+                splitCells(pageCells, otherCells);
+                for (RevisionStoreCell cell : pageCells) {
+                    emitPage(cell, options, metadata, xhtml);
+                }
+                for (RevisionStoreCell cell : otherCells) {
+                    walkCell(cell, indexObjectsById(cell.objectGroups), 
options, metadata, xhtml);
+                }
+            } else {
+                // no cell information available - walk the object groups in 
revision order
+                Map<ExGuid, RevisionStoreObject> objectsById = 
indexObjectsById(OtherFileNodeList);
+                Set<ExGuid> visited = new HashSet<>();
+                for (RevisionStoreObjectGroup objectGroup : OtherFileNodeList) 
{
+                    for (RevisionStoreObject object : objectGroup.objects) {
+                        walkObject(object, objectsById, visited, 
AuthorRole.NONE, options, metadata,
+                                xhtml, 0);

Review Comment:
   This loop will throw `NullPointerException` if `OtherFileNodeList` contains 
a `null` group or a group with `objects == null` (both patterns are exercised 
elsewhere in tests as “malformed” cases). Add `null` guards for `objectGroup`, 
`objectGroup.objects`, and (ideally) `object` before iterating/walking so 
damaged/fuzzed inputs can fall back safely instead of crashing.



##########
tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/OneNotePtr.java:
##########
@@ -148,33 +148,13 @@ public OneNoteHeader deserializeHeader() throws 
IOException, TikaException {
     }
 
     private GUID deserializeGUID() throws IOException {
-        int[] guid = new int[16];
+        byte[] guidBytes = new byte[16];
         for (int i = 0; i < 16; ++i) {
-            guid[i] = dif.read();
+            guidBytes[i] = (byte) dif.read();
         }
-        int[] guid2 = new int[16];
-        // re-order [0,1,2,3] to little endian
-        guid2[0] = guid[3];
-        guid2[1] = guid[2];
-        guid2[2] = guid[1];
-        guid2[3] = guid[0];
-        // re-order [4,5,6,7] to little endian
-        guid2[4] = guid[5];
-        guid2[5] = guid[4];
-        guid2[6] = guid[7];
-        guid2[7] = guid[6];
-        // the rest is already in right order.
-        guid2[8] = guid[8];
-        guid2[9] = guid[9];
-        guid2[10] = guid[10];
-        guid2[11] = guid[11];
-        guid2[12] = guid[12];
-        guid2[13] = guid[13];
-        guid2[14] = guid[14];
-        guid2[15] = guid[15];
-
+        GUID guid = GUID.fromMicrosoftBytes(guidBytes);
         offset = dif.position();
-        return new GUID(guid2);
+        return guid;

Review Comment:
   `dif.read()` returns `-1` at EOF; casting that to `byte` silently turns it 
into `0xFF`, and `GUID.fromMicrosoftBytes` will then happily decode a 
“valid-looking” GUID instead of failing. Please detect EOF during the loop 
(e.g., read into an `int`, throw an `IOException`/`TikaException` if it’s `-1`) 
so truncated/corrupt headers don’t yield incorrect GUIDs.





> Emit onenote page guids in properties
> -------------------------------------
>
>                 Key: TIKA-4944
>                 URL: https://issues.apache.org/jira/browse/TIKA-4944
>             Project: Tika
>          Issue Type: Improvement
>          Components: parser
>            Reporter: Henry Lindeman
>            Priority: Minor
>
> Onenote section files contain page GUIDs which can be used to reconstruct a 
> url pointing to a page in the MS SaaS Onenote application. Since MS hands you 
> the documents section at a time the only other way to get to the page GUID is 
> to ask MS to list the pages in the section, which we'd prefer not to do



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

Reply via email to