From 5158fc4530d9de249ed5eeb7e2f89fc1bd29a45d Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 19 Jan 2024 18:01:29 +0100 Subject: [PATCH] do not process JMI from offline queue as live messages --- .../conversations/parser/MessageParser.java | 43 ++++++++++++------- .../conversations/xmpp/XmppConnection.java | 6 ++- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index d20e4dd46..cb0620fa1 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -378,6 +378,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece final Element result = MessageArchiveService.Version.findResult(original); final String queryId = result == null ? null : result.getAttribute("queryid"); final MessageArchiveService.Query query = queryId == null ? null : mXmppConnectionService.getMessageArchiveService().findQuery(queryId); + final boolean offlineMessagesRetrieved = account.getXmppConnection().isOfflineMessagesRetrieved(); if (query != null && query.validFrom(original.getFrom())) { final Pair f = original.getForwardedMessagePacket("result", query.version.namespace); if (f == null) { @@ -852,7 +853,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece if (sessionId == null) { break; } - if (query == null) { + if (query == null && offlineMessagesRetrieved) { if (serverMsgId == null) { serverMsgId = extractStanzaId(account, packet); } @@ -873,24 +874,25 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece && contact.showInContactList()) { processMessageReceipts(account, packet, remoteMsgId, null); } - } else if (query.isCatchup()) { + } else if ((query != null && query.isCatchup()) || !offlineMessagesRetrieved) { if ("propose".equals(action)) { final Element description = child.findChild("description"); - final String namespace = description == null ? null : description.getNamespace(); + final String namespace = + description == null ? null : description.getNamespace(); if (Namespace.JINGLE_APPS_RTP.equals(namespace)) { - final Conversation c = mXmppConnectionService.findOrCreateConversation(account, counterpart.asBareJid(), false, false); - final Message preExistingMessage = c.findRtpSession(sessionId, status); + final Conversation c = + mXmppConnectionService.findOrCreateConversation( + account, counterpart.asBareJid(), false, false); + final Message preExistingMessage = + c.findRtpSession(sessionId, status); if (preExistingMessage != null) { preExistingMessage.setServerMsgId(serverMsgId); mXmppConnectionService.updateMessage(preExistingMessage); break; } - final Message message = new Message( - c, - status, - Message.TYPE_RTP_SESSION, - sessionId - ); + final Message message = + new Message( + c, status, Message.TYPE_RTP_SESSION, sessionId); message.setServerMsgId(serverMsgId); message.setTime(timestamp); message.setBody(new RtpSessionStatus(false, 0).toString()); @@ -898,9 +900,14 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece mXmppConnectionService.databaseBackend.createMessage(message); } } else if ("proceed".equals(action)) { - //status needs to be flipped to find the original propose - final Conversation c = mXmppConnectionService.findOrCreateConversation(account, counterpart.asBareJid(), false, false); - final int s = packet.fromAccount(account) ? Message.STATUS_RECEIVED : Message.STATUS_SEND; + // status needs to be flipped to find the original propose + final Conversation c = + mXmppConnectionService.findOrCreateConversation( + account, counterpart.asBareJid(), false, false); + final int s = + packet.fromAccount(account) + ? Message.STATUS_RECEIVED + : Message.STATUS_SEND; final Message message = c.findRtpSession(sessionId, s); if (message != null) { message.setBody(new RtpSessionStatus(true, 0).toString()); @@ -910,11 +917,15 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece message.setTime(timestamp); mXmppConnectionService.updateMessage(message, true); } else { - Log.d(Config.LOGTAG, "unable to find original rtp session message for received propose"); + Log.d( + Config.LOGTAG, + "unable to find original rtp session message for received propose"); } } else if ("finish".equals(action)) { - Log.d(Config.LOGTAG,"received JMI 'finish' during MAM catch-up. Can be used to update success/failure and duration"); + Log.d( + Config.LOGTAG, + "received JMI 'finish' during MAM catch-up. Can be used to update success/failure and duration"); } } else { //MAM reloads (non catchups diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 0500517dc..7011c4d54 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -2739,7 +2739,7 @@ public class XmppConnection implements Runnable { Log.d( Config.LOGTAG, account.getJid().asBareJid() - + ": received ping response after sending initial presence"); + + ": got ping response after sending initial presence"); XmppConnection.this.offlineMessagesRetrieved = true; }); } else { @@ -2747,6 +2747,10 @@ public class XmppConnection implements Runnable { } } + public boolean isOfflineMessagesRetrieved() { + return this.offlineMessagesRetrieved; + } + private class MyKeyManager implements X509KeyManager { @Override public String chooseClientAlias(String[] strings, Principal[] principals, Socket socket) {