@@ -1176,28 +1176,45 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
}
@Nullable
- public XmppAxolotlMessage encrypt(Message message) {
+ public XmppAxolotlMessage encrypt(final String content, Jid counterpart) {
final XmppAxolotlMessage axolotlMessage = new XmppAxolotlMessage(account.getJid().asBareJid(), getOwnDeviceId());
- final String content;
- if (message.hasFileOnRemoteHost()) {
- content = message.getFileParams().url;
- } else {
- content = message.getRawBody();
+ try {
+ axolotlMessage.encrypt(content);
+ } catch (CryptoFailedException e) {
+ Log.w(Config.LOGTAG, getLogprefix(account) + "Failed to encrypt message: " + e.getMessage());
+ return null;
}
+ if (!buildHeader(axolotlMessage, counterpart)) return null;
+ return axolotlMessage;
+ }
+
+ @Nullable
+ public XmppAxolotlMessage encrypt(final String content, Conversation conversation) {
+ final XmppAxolotlMessage axolotlMessage = new XmppAxolotlMessage(account.getJid().asBareJid(), getOwnDeviceId());
try {
axolotlMessage.encrypt(content);
} catch (CryptoFailedException e) {
Log.w(Config.LOGTAG, getLogprefix(account) + "Failed to encrypt message: " + e.getMessage());
return null;
}
+ if (!buildHeader(axolotlMessage, conversation)) return null;
+ return axolotlMessage;
+ }
+
+ @Nullable
+ public XmppAxolotlMessage encrypt(Message message) {
+ final String content;
+ if (message.hasFileOnRemoteHost()) {
+ content = message.getFileParams().url;
+ } else {
+ content = message.getRawBody();
+ }
- final boolean success;
if (message.isPrivateMessage()) {
- success = buildHeader(axolotlMessage, message.getTrueCounterpart());
+ return encrypt(content, message.getTrueCounterpart());
} else {
- success = buildHeader(axolotlMessage, (Conversation) message.getConversation());
+ return encrypt(content, (Conversation) message.getConversation());
}
- return success ? axolotlMessage : null;
}
public void preparePayloadMessage(final Message message, final boolean delay) {
@@ -14,8 +14,6 @@ import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Conversational;
import eu.siacs.conversations.entities.Message;
-import eu.siacs.conversations.ui.util.QuoteHelper;
-import eu.siacs.conversations.utils.MessageUtils;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xml.Namespace;
@@ -202,7 +200,7 @@ public class MessageGenerator extends AbstractGenerator {
return packet;
}
- public im.conversations.android.xmpp.model.stanza.Message reaction(final Conversational conversation, final Message inReplyTo, final String reactingTo, final Collection<String> ourReactions, final Collection<String> newReactions) {
+ public im.conversations.android.xmpp.model.stanza.Message reaction(final Conversational conversation, final Message inReplyTo, final String reactingTo, final Collection<String> ourReactions) {
final boolean groupChat = conversation.getMode() == Conversational.MODE_MULTI;
final Jid to = conversation.getJid().asBareJid();
final im.conversations.android.xmpp.model.stanza.Message packet = new im.conversations.android.xmpp.model.stanza.Message();
@@ -214,23 +212,6 @@ public class MessageGenerator extends AbstractGenerator {
reactions.addExtension(new Reaction(ourReaction));
}
- if (newReactions.size() > 0) {
- final var quote = QuoteHelper.quote(MessageUtils.prepareQuote(inReplyTo)) + "\n";
- packet.setBody(quote + String.join(" ", newReactions));
-
- packet.addChild("reply", "urn:xmpp:reply:0")
- .setAttribute("to", inReplyTo.getCounterpart())
- .setAttribute("id", reactingTo);
- final var replyFallback = packet.addChild("fallback", "urn:xmpp:fallback:0").setAttribute("for", "urn:xmpp:reply:0");
- replyFallback.addChild("body", "urn:xmpp:fallback:0")
- .setAttribute("start", "0")
- .setAttribute("end", "" + quote.codePointCount(0, quote.length()));
-
-
- final var fallback = packet.addChild("fallback", "urn:xmpp:fallback:0").setAttribute("for", "urn:xmpp:reactions:0");
- fallback.addChild("body", "urn:xmpp:fallback:0");
- }
-
final var thread = inReplyTo.getThread();
if (thread != null) packet.addChild(thread);
@@ -158,6 +158,7 @@ import eu.siacs.conversations.ui.UiCallback;
import eu.siacs.conversations.ui.interfaces.OnAvatarPublication;
import eu.siacs.conversations.ui.interfaces.OnMediaLoaded;
import eu.siacs.conversations.ui.interfaces.OnSearchResultsAvailable;
+import eu.siacs.conversations.ui.util.QuoteHelper;
import eu.siacs.conversations.utils.AccountUtils;
import eu.siacs.conversations.utils.Compatibility;
import eu.siacs.conversations.utils.ConversationsFileObserver;
@@ -166,6 +167,7 @@ import eu.siacs.conversations.utils.Emoticons;
import eu.siacs.conversations.utils.EasyOnboardingInvite;
import eu.siacs.conversations.utils.ExceptionHelper;
import eu.siacs.conversations.utils.FileUtils;
+import eu.siacs.conversations.utils.MessageUtils;
import eu.siacs.conversations.utils.MimeUtils;
import eu.siacs.conversations.utils.PhoneHelper;
import eu.siacs.conversations.utils.QuickLoader;
@@ -5307,11 +5309,43 @@ public class XmppConnectionService extends Service {
if (Strings.isNullOrEmpty(reactToId)) {
return false;
}
- final var reactionMessage =
- mMessageGenerator.reaction(conversation, message, reactToId, reactions, newReactions);
- sendMessagePacket(conversation.getAccount(), reactionMessage);
- message.setReactions(combinedReactions);
- updateMessage(message, false);
+ final var packet =
+ mMessageGenerator.reaction(conversation, message, reactToId, reactions);
+
+ final var quote = QuoteHelper.quote(MessageUtils.prepareQuote(message)) + "\n";
+ final var body = quote + String.join(" ", newReactions);
+ if (conversation.getNextEncryption() == Message.ENCRYPTION_AXOLOTL && newReactions.size() > 0) {
+ FILE_ATTACHMENT_EXECUTOR.execute(() -> {
+ XmppAxolotlMessage axolotlMessage = conversation.getAccount().getAxolotlService().encrypt(body, conversation);
+ packet.setAxolotlMessage(axolotlMessage.toElement());
+ packet.addChild("encryption", "urn:xmpp:eme:0")
+ .setAttribute("name", "OMEMO")
+ .setAttribute("namespace", AxolotlService.PEP_PREFIX);
+ sendMessagePacket(conversation.getAccount(), packet);
+ message.setReactions(combinedReactions);
+ updateMessage(message, false);
+ });
+ } else if (conversation.getNextEncryption() == Message.ENCRYPTION_NONE || newReactions.size() < 1) {
+ if (newReactions.size() > 0) {
+ packet.setBody(body);
+
+ packet.addChild("reply", "urn:xmpp:reply:0")
+ .setAttribute("to", message.getCounterpart())
+ .setAttribute("id", reactToId);
+ final var replyFallback = packet.addChild("fallback", "urn:xmpp:fallback:0").setAttribute("for", "urn:xmpp:reply:0");
+ replyFallback.addChild("body", "urn:xmpp:fallback:0")
+ .setAttribute("start", "0")
+ .setAttribute("end", "" + quote.codePointCount(0, quote.length()));
+
+ final var fallback = packet.addChild("fallback", "urn:xmpp:fallback:0").setAttribute("for", "urn:xmpp:reactions:0");
+ fallback.addChild("body", "urn:xmpp:fallback:0");
+ }
+
+ sendMessagePacket(conversation.getAccount(), packet);
+ message.setReactions(combinedReactions);
+ updateMessage(message, false);
+ }
+
return true;
} else {
return false;