aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/main/java/de/pixart/messenger/crypto/axolotl/AxolotlService.java17
-rw-r--r--src/main/java/de/pixart/messenger/crypto/axolotl/XmppAxolotlMessage.java12
-rw-r--r--src/main/java/de/pixart/messenger/parser/MessageParser.java29
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<Jid> findCounterpartsForSourceId(Integer sid) {
+ Set<Jid> candidates = new HashSet<>();
+ synchronized (MAP_LOCK) {
+ for (Map.Entry<String, Map<Integer, XmppAxolotlSession>> 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<Integer> 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<Jid> 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<Jid> 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) {