From 3c9fef4af23491f4d1dc6e8629ad2f57c33b897d Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Mon, 12 Dec 2022 22:05:26 -0500 Subject: [PATCH] Parse all SIMS and OOBs on a message Use a set that keys on URL so that we don't get duplicates. Still only store the first one for now. --- .../siacs/conversations/entities/Message.java | 10 +++++++ .../conversations/parser/MessageParser.java | 27 ++++++++++++------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index 8234408b31c58116fd82c6bd1159f89d441245ae..2f2564acab60b68ac89387f7844ac240470315ed 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/src/main/java/eu/siacs/conversations/entities/Message.java @@ -1125,6 +1125,16 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable if (runtime > 0) builder.append('|').append(runtime); return builder.toString(); } + + public boolean equals(Object o) { + if (!(o instanceof FileParams)) return false; + + return url.equals(((FileParams) o).url); + } + + public int hashCode() { + return url.hashCode(); + } } public void setFingerprint(String fingerprint) { diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index a6f924b28cb7e903f872c88285dfb18395fc14e0..f4030e437d4fa0136838326340ea97872f3c700c 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; @@ -410,13 +411,19 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece final Element mucUserElement = packet.findChild("x", Namespace.MUC_USER); final String pgpEncrypted = packet.findChildContent("x", "jabber:x:encrypted"); final Element replaceElement = packet.findChild("replace", "urn:xmpp:message-correct:0"); - Element oob = packet.findChild("x", Namespace.OOB); - if (oob != null && oob.findChildContent("url") == null) { - oob = null; + Set attachments = new LinkedHashSet<>(); + for (Element child : packet.getChildren()) { + // SIMS first so they get preference in the set + if (child.getName().equals("reference") && child.getNamespace().equals("urn:xmpp:reference:0")) { + if (child.findChild("media-sharing", "urn:xmpp:sims:1") != null) { + attachments.add(new Message.FileParams(child)); + } + } } - final Element reference = packet.findChild("reference", "urn:xmpp:reference:0"); - if (reference != null && reference.findChild("media-sharing", "urn:xmpp:sims:1") != null) { - oob = reference; + for (Element child : packet.getChildren()) { + if (child.getName().equals("x") && child.getNamespace().equals(Namespace.OOB)) { + attachments.add(new Message.FileParams(child)); + } } String replacementId = replaceElement == null ? null : replaceElement.getAttribute("id"); if (replacementId == null) { @@ -485,7 +492,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece } } - if ((body != null || pgpEncrypted != null || (axolotlEncrypted != null && axolotlEncrypted.hasChild("payload")) || oob != null || html != null) && !isMucStatusMessage) { + if ((body != null || pgpEncrypted != null || (axolotlEncrypted != null && axolotlEncrypted.hasChild("payload")) || !attachments.isEmpty() || html != null) && !isMucStatusMessage) { final boolean conversationIsProbablyMuc = isTypeGroupChat || mucUserElement != null || account.getXmppConnection().getMucServersWithholdAccount().contains(counterpart.getDomain().toEscapedString()); final Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, counterpart.asBareJid(), conversationIsProbablyMuc, false, query, false); final boolean conversationMultiMode = conversation.getMode() == Conversation.MODE_MULTI; @@ -583,7 +590,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece if (conversationMultiMode) { message.setTrueCounterpart(origin); } - } else if (body == null && oob != null) { + } else if (body == null && !attachments.isEmpty()) { message = new Message(conversation, "", Message.ENCRYPTION_NONE, status); } else { message = new Message(conversation, body == null ? "HTML-only message" : body.content, Message.ENCRYPTION_NONE, status); @@ -599,8 +606,8 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece message.setServerMsgId(serverMsgId); message.setCarbon(isCarbon); message.setTime(timestamp); - if (oob != null) { - message.setFileParams(new Message.FileParams(oob)); + if (!attachments.isEmpty()) { + message.setFileParams(attachments.iterator().next()); if (CryptoHelper.isPgpEncryptedUrl(message.getFileParams().url)) { message.setEncryption(Message.ENCRYPTION_DECRYPTED); }