diff --git a/domain/src/main/java/org/mercury_im/messenger/core/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/core/Messenger.java index 741e433..e6d8df3 100644 --- a/domain/src/main/java/org/mercury_im/messenger/core/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/core/Messenger.java @@ -19,6 +19,7 @@ import org.mercury_im.messenger.core.connection.message.PlaintextMessageConsigno import org.mercury_im.messenger.core.data.repository.MessageRepository; import org.mercury_im.messenger.core.exception.ConnectionNotFoundException; import org.mercury_im.messenger.core.exception.ContactAlreadyAddedException; +import org.mercury_im.messenger.entity.Encryption; import org.mercury_im.messenger.entity.chat.Chat; import org.mercury_im.messenger.entity.contact.Peer; @@ -137,7 +138,9 @@ public class Messenger { } public MessageConsignor getMessageConsignor(Chat chat) { - switch (chat.getChatPreferences().getEncryption()) { + Encryption encryption = // chat.getChatPreferences().getEncryption() + Encryption.ox_signcrypt; + switch (encryption) { case plain: return new PlaintextMessageConsignor(connectionManager, messageRepository, chat); case ox_sign: diff --git a/domain/src/main/java/org/mercury_im/messenger/core/connection/message/OxMessageConsignor.java b/domain/src/main/java/org/mercury_im/messenger/core/connection/message/OxMessageConsignor.java index cf0cd98..a13911f 100644 --- a/domain/src/main/java/org/mercury_im/messenger/core/connection/message/OxMessageConsignor.java +++ b/domain/src/main/java/org/mercury_im/messenger/core/connection/message/OxMessageConsignor.java @@ -1,11 +1,28 @@ package org.mercury_im.messenger.core.connection.message; +import org.jivesoftware.smack.chat2.ChatManager; +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.packet.MessageBuilder; +import org.jivesoftware.smack.packet.Stanza; +import org.jivesoftware.smackx.bytestreams.ibb.packet.Open; +import org.jivesoftware.smackx.ox.OpenPgpContact; +import org.jivesoftware.smackx.ox.OpenPgpManager; +import org.jivesoftware.smackx.ox_im.OXInstantMessagingManager; +import org.jivesoftware.smackx.sid.element.OriginIdElement; +import org.mercury_im.messenger.core.connection.MercuryConnection; import org.mercury_im.messenger.core.connection.MercuryConnectionManager; import org.mercury_im.messenger.core.data.repository.MessageRepository; +import org.mercury_im.messenger.core.util.AppendCompletableToSingle; import org.mercury_im.messenger.entity.chat.Chat; +import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.chat.GroupChat; +import org.mercury_im.messenger.entity.message.MessageDeliveryState; +import java.util.Collection; +import java.util.Collections; import java.util.UUID; +import io.reactivex.Completable; import io.reactivex.Single; public class OxMessageConsignor extends AbstractMessageConsignor { @@ -20,6 +37,55 @@ public class OxMessageConsignor extends AbstractMessageConsignor { @Override public Single sendTextMessage(Chat chat, String body) { - return null; + org.mercury_im.messenger.entity.message.Message message = messageComposer.createTextMessage(chat, body); + MessageBuilder messageBuilder = commonMessageBuilder(message); + + Completable deliverMessage = null; + if (chat instanceof DirectChat) { + deliverMessage = sendDirectChatMessage((DirectChat) chat, messageBuilder, body); + } else if (chat instanceof GroupChat) { + // deliverMessage = sendGroupChatMessage((GroupChat) chat, messageBuilder); + } else { + throw new AssertionError("Unknown chat type."); + } + + Single deliverAndStore = messageRepository.insertMessage(message) + .map(org.mercury_im.messenger.entity.message.Message::getId) + .compose(new AppendCompletableToSingle<>(deliverMessage)) + .flatMap(messageId -> messageRepository.updateDeliveryState(messageId, MessageDeliveryState.delivered_to_server) + .toSingle(() -> messageId)); + + return deliverAndStore; + } + + private Completable sendDirectChatMessage(DirectChat chat, MessageBuilder messageBuilder, String body) { + return Completable.fromAction(() -> { + MercuryConnection connection = connectionManager.getConnection(chat.getAccount()); + OpenPgpManager ox = OpenPgpManager.getInstanceFor(connection.getConnection()); + OXInstantMessagingManager oxim = OXInstantMessagingManager.getInstanceFor(connection.getConnection()); + + OpenPgpContact contact = ox.getOpenPgpContact(chat.getJid().asEntityBareJid()); + contact.updateKeys(connection.getConnection()); + + OpenPgpContact self = ox.getOpenPgpSelf(); + self.updateKeys(connection.getConnection()); + + Message.Body bodyElement = new Message.Body(Stanza.getDefaultLanguage(), body); + oxim.addOxMessage(messageBuilder, contact, Collections.singletonList(bodyElement)); + + + ChatManager chatManager = ChatManager.getInstanceFor(connection.getConnection()); + org.jivesoftware.smack.chat2.Chat smackChat = chatManager.chatWith(chat.getJid().asEntityBareJid()); + smackChat.send(messageBuilder.build()); + }); + + } + + private MessageBuilder commonMessageBuilder(org.mercury_im.messenger.entity.message.Message message) { + return MessageBuilder.buildMessage(message.getLegacyStanzaId()) + .ofType(org.jivesoftware.smack.packet.Message.Type.chat) + .addExtension(new OriginIdElement(message.getOriginId())) + .to(chat.getJid()) + .from(chat.getAccount().getJid()); } } diff --git a/domain/src/main/java/org/mercury_im/messenger/core/store/crypto/IkeyAwareOpenPgpStore.java b/domain/src/main/java/org/mercury_im/messenger/core/store/crypto/IkeyAwareOpenPgpStore.java index 412b5dc..058f151 100644 --- a/domain/src/main/java/org/mercury_im/messenger/core/store/crypto/IkeyAwareOpenPgpStore.java +++ b/domain/src/main/java/org/mercury_im/messenger/core/store/crypto/IkeyAwareOpenPgpStore.java @@ -77,7 +77,7 @@ public class IkeyAwareOpenPgpStore extends MercuryOpenPgpStore { if (record.getTrust() == Trust.trusted && record.hasSubordinate(fingerprint)) { return Trust.ikey_trusted; } - return record.getTrust(); + return Trust.undecided; }) .firstElement() .flatMap(t -> t == Trust.undecided ? readManualTrust(owner, fingerprint).toMaybe() : Maybe.just(t)) diff --git a/libs/Smack b/libs/Smack index 695a798..d35354b 160000 --- a/libs/Smack +++ b/libs/Smack @@ -1 +1 @@ -Subproject commit 695a7982bfc9aa4720e9eb846bfaaf367b1fcaaa +Subproject commit d35354b1b05d80a6ab45fed9548304707eaab460