From 9094e8839d8d9790fb4ec18d961891492606033e Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Thu, 12 Apr 2018 21:45:17 +0200 Subject: figure out fallbacks with omemo source id --- .../messenger/crypto/axolotl/AxolotlService.java | 17 +++++++++++++ .../crypto/axolotl/XmppAxolotlMessage.java | 12 +++++++++ .../de/pixart/messenger/parser/MessageParser.java | 29 +++++++++++++++++++--- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/pixart/messenger/crypto/axolotl/AxolotlService.java b/src/main/java/de/pixart/messenger/crypto/axolotl/AxolotlService.java index d23e3a88b..ed432bb9b 100644 --- a/src/main/java/de/pixart/messenger/crypto/axolotl/AxolotlService.java +++ b/src/main/java/de/pixart/messenger/crypto/axolotl/AxolotlService.java @@ -206,6 +206,19 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { this.fillMap(store); } + public Set findCounterpartsForSourceId(Integer sid) { + Set candidates = new HashSet<>(); + synchronized (MAP_LOCK) { + for (Map.Entry> entry : map.entrySet()) { + String key = entry.getKey(); + if (entry.getValue().containsKey(sid)) { + candidates.add(Jid.of(key)); + } + } + } + return candidates; + } + private void putDevicesForJid(String bareJid, List deviceIds, SQLiteAxolotlStore store) { for (Integer deviceId : deviceIds) { SignalProtocolAddress axolotlAddress = new SignalProtocolAddress(bareJid, deviceId); @@ -316,6 +329,10 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { return keys; } + public Set findCounterpartsBySourceId(int sid) { + return sessions.findCounterpartsForSourceId(sid); + } + public long getNumTrustedKeys(Jid jid) { return axolotlStore.getContactNumTrustedKeys(jid.asBareJid().toString()); } diff --git a/src/main/java/de/pixart/messenger/crypto/axolotl/XmppAxolotlMessage.java b/src/main/java/de/pixart/messenger/crypto/axolotl/XmppAxolotlMessage.java index 603eedde8..f5a41e6b3 100644 --- a/src/main/java/de/pixart/messenger/crypto/axolotl/XmppAxolotlMessage.java +++ b/src/main/java/de/pixart/messenger/crypto/axolotl/XmppAxolotlMessage.java @@ -88,6 +88,18 @@ public class XmppAxolotlMessage { } } + public static int parseSourceId(final Element axolotlMessage) throws IllegalArgumentException { + final Element header = axolotlMessage.findChild(HEADER); + if (header == null) { + throw new IllegalArgumentException("No header found"); + } + try { + return Integer.parseInt(header.getAttribute(SOURCEID)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("invalid source id"); + } + } + private XmppAxolotlMessage(final Element axolotlMessage, final Jid from) throws IllegalArgumentException { this.from = from; Element header = axolotlMessage.findChild(HEADER); diff --git a/src/main/java/de/pixart/messenger/parser/MessageParser.java b/src/main/java/de/pixart/messenger/parser/MessageParser.java index e908ae0e1..8dad92356 100644 --- a/src/main/java/de/pixart/messenger/parser/MessageParser.java +++ b/src/main/java/de/pixart/messenger/parser/MessageParser.java @@ -11,6 +11,7 @@ import net.java.otr4j.session.SessionStatus; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Locale; @@ -472,17 +473,39 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece message = new Message(conversation, pgpEncrypted, Message.ENCRYPTION_PGP, status); } else if (axolotlEncrypted != null && Config.supportOmemo()) { Jid origin; + Set fallbacksBySourceId = Collections.emptySet(); if (conversationMultiMode) { final Jid fallback = conversation.getMucOptions().getTrueCounterpart(counterpart); origin = getTrueCounterpart(query != null ? mucUserElement : null, fallback); if (origin == null) { - Log.d(Config.LOGTAG, "axolotl message in non anonymous conference received"); + try { + fallbacksBySourceId = account.getAxolotlService().findCounterpartsBySourceId(XmppAxolotlMessage.parseSourceId(axolotlEncrypted)); + } catch (IllegalArgumentException e) { + //ignoring + } + } + if (origin == null && fallbacksBySourceId.size() == 0) { + Log.d(Config.LOGTAG, "axolotl message in anonymous conference received and no possible fallbacks"); return; } } else { + fallbacksBySourceId = Collections.emptySet(); origin = from; } - message = parseAxolotlChat(axolotlEncrypted, origin, conversation, status, query != null); + if (origin != null) { + message = parseAxolotlChat(axolotlEncrypted, origin, conversation, status, query != null); + } else { + Message trial = null; + for (Jid fallback : fallbacksBySourceId) { + trial = parseAxolotlChat(axolotlEncrypted, fallback, conversation, status, query != null); + if (trial != null) { + Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": decoded muc message using fallback"); + origin = fallback; + break; + } + } + message = trial; + } if (message == null) { if (query == null && extractChatState(mXmppConnectionService.find(account, counterpart.asBareJid()), isTypeGroupChat, packet)) { mXmppConnectionService.updateConversationUi(); @@ -686,7 +709,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece final Jid fallback = conversation.getMucOptions().getTrueCounterpart(counterpart); origin = getTrueCounterpart(query != null ? mucUserElement : null, fallback); if (origin == null) { - Log.d(Config.LOGTAG, "omemo key transport message in non anonymous conference received"); + Log.d(Config.LOGTAG, "omemo key transport message in anonymous conference received"); return; } } else if (isTypeGroupChat) { -- cgit v1.2.3