From ba0b81f7504fbbfcccea2bbe38e985974ee0f63c Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Thu, 11 Jan 2018 13:21:11 +0100 Subject: [PATCH] Add method to decrypt OmemoElements from a MamQueryResult --- .../smackx/omemo/OmemoManager.java | 40 +++++++-- .../smackx/omemo/OmemoService.java | 82 ++++++++++++++++++- 2 files changed, 115 insertions(+), 7 deletions(-) diff --git a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoManager.java b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoManager.java index e91f8ae37..a9f1a7599 100644 --- a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoManager.java +++ b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoManager.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Random; import java.util.SortedSet; import java.util.TreeMap; @@ -49,7 +50,9 @@ import org.jivesoftware.smackx.carbons.CarbonManager; import org.jivesoftware.smackx.carbons.packet.CarbonExtension; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; import org.jivesoftware.smackx.eme.element.ExplicitMessageEncryptionElement; +import org.jivesoftware.smackx.forward.packet.Forwarded; import org.jivesoftware.smackx.hints.element.StoreHint; +import org.jivesoftware.smackx.mam.MamManager; import org.jivesoftware.smackx.muc.MultiUserChat; import org.jivesoftware.smackx.muc.MultiUserChatManager; import org.jivesoftware.smackx.muc.RoomInfo; @@ -396,11 +399,39 @@ public final class OmemoManager extends Manager { return getOmemoService().decryptMessage(managerGuard, sender, omemoElement); } + /** + * Decrypt OmemoMessages of a {@link org.jivesoftware.smackx.mam.MamManager.MamQueryResult}. + * Return a map of Stanzas and their decrypted counterparts. + * + * Note: This method does not repair broken sessions. + * + * @param result MamQueryResult + * @return map of encrypted stanzas and decrypted messages. + * + * @throws SmackException.NotLoggedInException if the OmemoManager is not authenticated + */ + public Map decryptMAMQueryResult(MamManager.MamQueryResult result) + throws SmackException.NotLoggedInException + { + LoggedInOmemoManager managerGuard = new LoggedInOmemoManager(this); + HashMap decryptedMessages = new HashMap<>(); + + for (Forwarded forwarded : result.forwardedMessages) { + Stanza stanza = forwarded.getForwardedStanza(); + OmemoMessage.Received decrypted = getOmemoService().decryptStanza(stanza, managerGuard); + if (decrypted != null) { + decryptedMessages.put(stanza, decrypted); + } + } + + return decryptedMessages; + } + /** * Trust that a fingerprint belongs to an OmemoDevice. * The fingerprint must be the lowercase, hexadecimal fingerprint of the identityKey of the device and must * be of length 64. - * + * * @param device device * @param fingerprint fingerprint */ @@ -489,11 +520,8 @@ public final class OmemoManager extends Manager { // Set MAM Storage hint StoreHint.set(message); - - if (OmemoConfiguration.getAddEmeEncryptionHint()) { - message.addExtension(new ExplicitMessageEncryptionElement( - ExplicitMessageEncryptionElement.ExplicitMessageEncryptionProtocol.omemoVAxolotl)); - } + message.addExtension(new ExplicitMessageEncryptionElement( + ExplicitMessageEncryptionElement.ExplicitMessageEncryptionProtocol.omemoVAxolotl)); connection().sendStanza(message); } } diff --git a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoService.java b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoService.java index 4cb392d0e..9e9f3c8a0 100644 --- a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoService.java +++ b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoService.java @@ -1079,7 +1079,7 @@ public abstract class OmemoService