[
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)