From 23e0e5566fb13be50b1292094c7abb8cec5f34c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Berenguel?= Date: Tue, 8 Oct 2024 17:27:23 -0300 Subject: [PATCH] #2286: use item children property instead of extraAttribute map to store messages in chat evidence --- .../src/main/java/iped/data/IItemReader.java | 3 +++ .../src/main/java/iped/engine/data/Item.java | 22 +++++++++++++++++++ .../iped/engine/datasource/UfedXmlReader.java | 6 ++--- .../iped/parsers/ufed/UFEDChatParser.java | 14 +++++++----- .../parsers/util/BaseItemSearchContext.java | 5 +++++ 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/iped-api/src/main/java/iped/data/IItemReader.java b/iped-api/src/main/java/iped/data/IItemReader.java index 5251f61862..750b38b6ff 100644 --- a/iped-api/src/main/java/iped/data/IItemReader.java +++ b/iped-api/src/main/java/iped/data/IItemReader.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.util.Date; import java.util.HashSet; +import java.util.List; import java.util.Map; import javax.imageio.stream.ImageInputStream; @@ -154,6 +155,8 @@ public interface IItemReader extends IStreamSource { public IDataSource getDataSource(); + public List getChildren(); + /** * @return Object containing the metadata of the item */ diff --git a/iped-engine/src/main/java/iped/engine/data/Item.java b/iped-engine/src/main/java/iped/engine/data/Item.java index 5894b58b81..807a39d27e 100644 --- a/iped-engine/src/main/java/iped/engine/data/Item.java +++ b/iped-engine/src/main/java/iped/engine/data/Item.java @@ -35,6 +35,7 @@ import iped.data.IHashValue; import iped.data.IItem; +import iped.data.IItemReader; import iped.datasource.IDataSource; import iped.engine.core.Statistics; import iped.engine.io.ReferencedFile; @@ -207,6 +208,8 @@ public static void setStartID(int start) { private ISeekableInputStreamFactory inputStreamFactory; + private List children; + private static final int BUF_LEN = 8 * 1024 * 1024; private static final int maxImageLength = 128 << 20; @@ -1316,4 +1319,23 @@ public Object getTempAttribute(String key) { public void setTempAttribute(String key, Object value) { tempAttributes.put(key, value); } + + public void addChild(IItemReader child) { + if (children == null) { + children = new ArrayList<>(); + } + children.add(child); + } + + @Override + public List getChildren() { + if (children == null) { + return null; + } + try { + return new ArrayList<>(children); + } finally { + children.clear(); + } + } } diff --git a/iped-engine/src/main/java/iped/engine/datasource/UfedXmlReader.java b/iped-engine/src/main/java/iped/engine/datasource/UfedXmlReader.java index 1b502a6746..88d793f5f7 100644 --- a/iped-engine/src/main/java/iped/engine/datasource/UfedXmlReader.java +++ b/iped-engine/src/main/java/iped/engine/datasource/UfedXmlReader.java @@ -1153,11 +1153,9 @@ else if ("Participants".equalsIgnoreCase(role)) { processItem(item); } else { // add chat subitems in the chat via UFED_CHILDREN_ATTR extraAttribute - IItem parent = itemSeq.get(itemSeq.size() - 1); - List children = (List) parent.getExtraAttributeMap().computeIfAbsent( - UFEDChatParser.UFED_CHILDREN_ATTR, (key) -> new ArrayList()); + Item parent = itemSeq.get(itemSeq.size() - 1); Util.calctrackIDAndUpdateID((CaseData) caseData, item); - children.add(item); + parent.addChild(item); caseData.incDiscoveredEvidences(-1); } } else { diff --git a/iped-parsers/iped-parsers-impl/src/main/java/iped/parsers/ufed/UFEDChatParser.java b/iped-parsers/iped-parsers-impl/src/main/java/iped/parsers/ufed/UFEDChatParser.java index 63ca450a0b..efdb725de7 100644 --- a/iped-parsers/iped-parsers-impl/src/main/java/iped/parsers/ufed/UFEDChatParser.java +++ b/iped-parsers/iped-parsers-impl/src/main/java/iped/parsers/ufed/UFEDChatParser.java @@ -57,8 +57,6 @@ public class UFEDChatParser extends AbstractParser { public static final MediaType UFED_CHAT_PREVIEW_MIME = MediaType.application("x-ufed-chat-preview"); - public static final String UFED_CHILDREN_ATTR = "ufedChildren"; - public static final String UFED_REPLIED_MESSAGE_ATTR = "ufedOriginalMessage"; public static final Map appToMime = ImmutableMap.of( // @@ -154,9 +152,11 @@ public void parse(InputStream inputStream, ContentHandler handler, Metadata meta if (chat == null || searcher == null) return; - List messages = new ArrayList<>(); - List chatChildren = (List) chat.getExtraAttributeMap().remove(UFED_CHILDREN_ATTR); + updateChatMetadata(chatMeta, searcher); + Chat chat = createChat(chatItem, searcher); + List messages = new ArrayList<>(); + List chatChildren = chatItem.getChildren(); if (chatChildren != null) { for (IItemReader chatChild : chatChildren) { @@ -177,6 +177,7 @@ public void parse(InputStream inputStream, ContentHandler handler, Metadata meta if (messagesCount == 0 && ignoreEmptyChats) { return; } + chatMeta.set(ExtraProperties.CONVERSATION_MESSAGES_COUNT, messagesCount); Collections.sort(messages); @@ -340,6 +341,7 @@ private IItemReader lookupAccount(IItemSearcher searcher, Metadata chatMetadata) private void fillAccountInfo(IItemSearcher searcher, Metadata chatMetadata) { String name, id, phone = null, username = null; + String source = readUfedMetadata(chatMetadata, "Source"); IItemReader account = lookupAccount(searcher, chatMetadata); if (account != null) { name = readUfedMetadata(account, "name"); @@ -396,6 +398,7 @@ private IItemReader lookupParticipant(IItemSearcher searcher, Metadata chatMetad private void fillParticipantInfo(IItemSearcher searcher, Metadata chatMetadata, Metadata targetMetadata, String ufedProperty, String conversationProperty) { + String source = readUfedMetadata(chatMetadata, "Source"); List partyIDs = readUfedMetadataArray(targetMetadata, ufedProperty + ":ID"); List partyNames = readUfedMetadataArray(targetMetadata, ufedProperty + ":Name"); for (int i = 0; i < partyIDs.size(); i++) { @@ -524,8 +527,7 @@ private Message createMessage(IItemReader messageItem, IItemSearcher searcher) { Message message = new Message(messageItem); handleMessagePosition(message, searcher); - List msgChildren = (List) messageItem.getExtraAttributeMap() - .remove(UFED_CHILDREN_ATTR); + List msgChildren = messageItem.getChildren(); if (msgChildren != null) { for (IItemReader msgChild : msgChildren) { if (msgChild.getMediaType().equals(MediaTypes.UFED_CHATACTIVITY_MIME)) { diff --git a/iped-parsers/iped-parsers-impl/src/test/java/iped/parsers/util/BaseItemSearchContext.java b/iped-parsers/iped-parsers-impl/src/test/java/iped/parsers/util/BaseItemSearchContext.java index e6c607f9f5..b864a69842 100644 --- a/iped-parsers/iped-parsers-impl/src/test/java/iped/parsers/util/BaseItemSearchContext.java +++ b/iped-parsers/iped-parsers-impl/src/test/java/iped/parsers/util/BaseItemSearchContext.java @@ -659,6 +659,11 @@ public void setChangeDate(Date changeDate) { // TODO Auto-generated method stub } + + @Override + public List getChildren() { + return null; + } }; ItemInfo itemInfo = new ItemInfo(0, item.getHash(), Collections.emptySet(), Collections.emptySet(),