Search in sources :

Example 1 with MessagePacket

use of eu.siacs.conversations.xmpp.stanzas.MessagePacket in project Conversations by siacs.

the class XmppConnectionService method pushSubjectToConference.

public void pushSubjectToConference(final Conversation conference, final String subject) {
    MessagePacket packet = this.getMessageGenerator().conferenceSubject(conference, subject);
    this.sendMessagePacket(conference.getAccount(), packet);
    final MucOptions mucOptions = conference.getMucOptions();
    final MucOptions.User self = mucOptions.getSelf();
    if (!mucOptions.persistent() && self.getAffiliation().ranks(MucOptions.Affiliation.OWNER)) {
        Bundle options = new Bundle();
        options.putString("muc#roomconfig_persistentroom", "1");
        this.pushConferenceConfiguration(conference, options, null);
    }
}
Also used : MessagePacket(eu.siacs.conversations.xmpp.stanzas.MessagePacket) MucOptions(eu.siacs.conversations.entities.MucOptions) Bundle(android.os.Bundle)

Example 2 with MessagePacket

use of eu.siacs.conversations.xmpp.stanzas.MessagePacket in project Conversations by siacs.

the class XmppConnectionService method sendMessage.

private void sendMessage(final Message message, final boolean resend, final boolean delay) {
    final Account account = message.getConversation().getAccount();
    if (account.setShowErrorNotification(true)) {
        databaseBackend.updateAccount(account);
        mNotificationService.updateErrorNotification();
    }
    final Conversation conversation = message.getConversation();
    account.deactivateGracePeriod();
    MessagePacket packet = null;
    final boolean addToConversation = (conversation.getMode() != Conversation.MODE_MULTI || !Patches.BAD_MUC_REFLECTION.contains(account.getServerIdentity())) && !message.edited();
    boolean saveInDb = addToConversation;
    message.setStatus(Message.STATUS_WAITING);
    if (!resend && message.getEncryption() != Message.ENCRYPTION_OTR) {
        message.getConversation().endOtrIfNeeded();
        message.getConversation().findUnsentMessagesWithEncryption(Message.ENCRYPTION_OTR, new Conversation.OnMessageFound() {

            @Override
            public void onMessageFound(Message message) {
                markMessage(message, Message.STATUS_SEND_FAILED);
            }
        });
    }
    if (account.isOnlineAndConnected()) {
        switch(message.getEncryption()) {
            case Message.ENCRYPTION_NONE:
                if (message.needsUploading()) {
                    if (account.httpUploadAvailable(fileBackend.getFile(message, false).getSize()) || message.fixCounterpart()) {
                        this.sendFileMessage(message, delay);
                    } else {
                        break;
                    }
                } else {
                    packet = mMessageGenerator.generateChat(message);
                }
                break;
            case Message.ENCRYPTION_PGP:
            case Message.ENCRYPTION_DECRYPTED:
                if (message.needsUploading()) {
                    if (account.httpUploadAvailable(fileBackend.getFile(message, false).getSize()) || message.fixCounterpart()) {
                        this.sendFileMessage(message, delay);
                    } else {
                        break;
                    }
                } else {
                    packet = mMessageGenerator.generatePgpChat(message);
                }
                break;
            case Message.ENCRYPTION_OTR:
                SessionImpl otrSession = conversation.getOtrSession();
                if (otrSession != null && otrSession.getSessionStatus() == SessionStatus.ENCRYPTED) {
                    try {
                        message.setCounterpart(Jid.fromSessionID(otrSession.getSessionID()));
                    } catch (InvalidJidException e) {
                        break;
                    }
                    if (message.needsUploading()) {
                        mJingleConnectionManager.createNewConnection(message);
                    } else {
                        packet = mMessageGenerator.generateOtrChat(message);
                    }
                } else if (otrSession == null) {
                    if (message.fixCounterpart()) {
                        conversation.startOtrSession(message.getCounterpart().getResourcepart(), true);
                    } else {
                        Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": could not fix counterpart for OTR message to contact " + message.getContact().getJid());
                        break;
                    }
                } else {
                    Log.d(Config.LOGTAG, account.getJid().toBareJid() + " OTR session with " + message.getContact() + " is in wrong state: " + otrSession.getSessionStatus().toString());
                }
                break;
            case Message.ENCRYPTION_AXOLOTL:
                message.setFingerprint(account.getAxolotlService().getOwnFingerprint());
                if (message.needsUploading()) {
                    if (account.httpUploadAvailable(fileBackend.getFile(message, false).getSize()) || message.fixCounterpart()) {
                        this.sendFileMessage(message, delay);
                    } else {
                        break;
                    }
                } else {
                    XmppAxolotlMessage axolotlMessage = account.getAxolotlService().fetchAxolotlMessageFromCache(message);
                    if (axolotlMessage == null) {
                        account.getAxolotlService().preparePayloadMessage(message, delay);
                    } else {
                        packet = mMessageGenerator.generateAxolotlChat(message, axolotlMessage);
                    }
                }
                break;
        }
        if (packet != null) {
            if (account.getXmppConnection().getFeatures().sm() || (conversation.getMode() == Conversation.MODE_MULTI && message.getCounterpart().isBareJid())) {
                message.setStatus(Message.STATUS_UNSEND);
            } else {
                message.setStatus(Message.STATUS_SEND);
            }
        }
    } else {
        switch(message.getEncryption()) {
            case Message.ENCRYPTION_DECRYPTED:
                if (!message.needsUploading()) {
                    String pgpBody = message.getEncryptedBody();
                    String decryptedBody = message.getBody();
                    message.setBody(pgpBody);
                    message.setEncryption(Message.ENCRYPTION_PGP);
                    if (message.edited()) {
                        message.setBody(decryptedBody);
                        message.setEncryption(Message.ENCRYPTION_DECRYPTED);
                        databaseBackend.updateMessage(message, message.getEditedId());
                        updateConversationUi();
                        return;
                    } else {
                        databaseBackend.createMessage(message);
                        saveInDb = false;
                        message.setBody(decryptedBody);
                        message.setEncryption(Message.ENCRYPTION_DECRYPTED);
                    }
                }
                break;
            case Message.ENCRYPTION_OTR:
                if (!conversation.hasValidOtrSession() && message.getCounterpart() != null) {
                    Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": create otr session without starting for " + message.getContact().getJid());
                    conversation.startOtrSession(message.getCounterpart().getResourcepart(), false);
                }
                break;
            case Message.ENCRYPTION_AXOLOTL:
                message.setFingerprint(account.getAxolotlService().getOwnFingerprint());
                break;
        }
    }
    if (resend) {
        if (packet != null && addToConversation) {
            if (account.getXmppConnection().getFeatures().sm() || (conversation.getMode() == Conversation.MODE_MULTI && message.getCounterpart().isBareJid())) {
                markMessage(message, Message.STATUS_UNSEND);
            } else {
                markMessage(message, Message.STATUS_SEND);
            }
        }
    } else {
        if (addToConversation) {
            conversation.add(message);
        }
        if (saveInDb) {
            databaseBackend.createMessage(message);
        } else if (message.edited()) {
            databaseBackend.updateMessage(message, message.getEditedId());
        }
        updateConversationUi();
    }
    if (packet != null) {
        if (delay) {
            mMessageGenerator.addDelay(packet, message.getTimeSent());
        }
        if (conversation.setOutgoingChatState(Config.DEFAULT_CHATSTATE)) {
            if (this.sendChatStates()) {
                packet.addChild(ChatState.toElement(conversation.getOutgoingChatState()));
            }
        }
        sendMessagePacket(account, packet);
    }
}
Also used : MessagePacket(eu.siacs.conversations.xmpp.stanzas.MessagePacket) Account(eu.siacs.conversations.entities.Account) XmppAxolotlMessage(eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage) Message(eu.siacs.conversations.entities.Message) InvalidJidException(eu.siacs.conversations.xmpp.jid.InvalidJidException) Conversation(eu.siacs.conversations.entities.Conversation) XmppAxolotlMessage(eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage) SessionImpl(net.java.otr4j.session.SessionImpl)

Example 3 with MessagePacket

use of eu.siacs.conversations.xmpp.stanzas.MessagePacket in project Conversations by siacs.

the class XmppConnectionService method invite.

public void invite(Conversation conversation, Jid contact) {
    Log.d(Config.LOGTAG, conversation.getAccount().getJid().toBareJid() + ": inviting " + contact + " to " + conversation.getJid().toBareJid());
    MessagePacket packet = mMessageGenerator.invite(conversation, contact);
    sendMessagePacket(conversation.getAccount(), packet);
}
Also used : MessagePacket(eu.siacs.conversations.xmpp.stanzas.MessagePacket)

Example 4 with MessagePacket

use of eu.siacs.conversations.xmpp.stanzas.MessagePacket in project Conversations by siacs.

the class XmppConnectionService method sendReadMarker.

public void sendReadMarker(final Conversation conversation) {
    final Message markable = conversation.getLatestMarkableMessage();
    if (this.markRead(conversation)) {
        updateConversationUi();
    }
    if (confirmMessages() && markable != null && markable.trusted() && markable.getRemoteMsgId() != null) {
        Log.d(Config.LOGTAG, conversation.getAccount().getJid().toBareJid() + ": sending read marker to " + markable.getCounterpart().toString());
        Account account = conversation.getAccount();
        final Jid to = markable.getCounterpart();
        MessagePacket packet = mMessageGenerator.confirm(account, to, markable.getRemoteMsgId());
        this.sendMessagePacket(conversation.getAccount(), packet);
    }
}
Also used : MessagePacket(eu.siacs.conversations.xmpp.stanzas.MessagePacket) Account(eu.siacs.conversations.entities.Account) XmppAxolotlMessage(eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage) Message(eu.siacs.conversations.entities.Message) Jid(eu.siacs.conversations.xmpp.jid.Jid)

Example 5 with MessagePacket

use of eu.siacs.conversations.xmpp.stanzas.MessagePacket in project Conversations by siacs.

the class XmppConnectionService method renewSymmetricKey.

public boolean renewSymmetricKey(Conversation conversation) {
    Account account = conversation.getAccount();
    byte[] symmetricKey = new byte[32];
    this.mRandom.nextBytes(symmetricKey);
    Session otrSession = conversation.getOtrSession();
    if (otrSession != null) {
        MessagePacket packet = new MessagePacket();
        packet.setType(MessagePacket.TYPE_CHAT);
        packet.setFrom(account.getJid());
        MessageGenerator.addMessageHints(packet);
        packet.setAttribute("to", otrSession.getSessionID().getAccountID() + "/" + otrSession.getSessionID().getUserID());
        try {
            packet.setBody(otrSession.transformSending(CryptoHelper.FILETRANSFER + CryptoHelper.bytesToHex(symmetricKey))[0]);
            sendMessagePacket(account, packet);
            conversation.setSymmetricKey(symmetricKey);
            return true;
        } catch (OtrException e) {
            return false;
        }
    }
    return false;
}
Also used : MessagePacket(eu.siacs.conversations.xmpp.stanzas.MessagePacket) Account(eu.siacs.conversations.entities.Account) OtrException(net.java.otr4j.OtrException) Session(net.java.otr4j.session.Session)

Aggregations

MessagePacket (eu.siacs.conversations.xmpp.stanzas.MessagePacket)29 Element (eu.siacs.conversations.xml.Element)8 Account (eu.siacs.conversations.entities.Account)6 Conversation (eu.siacs.conversations.entities.Conversation)6 XmppAxolotlMessage (eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage)5 Message (eu.siacs.conversations.entities.Message)5 InvalidJidException (eu.siacs.conversations.xmpp.jid.InvalidJidException)4 Jid (eu.siacs.conversations.xmpp.jid.Jid)4 AbstractAcknowledgeableStanza (eu.siacs.conversations.xmpp.stanzas.AbstractAcknowledgeableStanza)3 Session (net.java.otr4j.session.Session)3 MucOptions (eu.siacs.conversations.entities.MucOptions)2 Tag (eu.siacs.conversations.xml.Tag)2 RequestPacket (eu.siacs.conversations.xmpp.stanzas.streammgmt.RequestPacket)2 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 OtrException (net.java.otr4j.OtrException)2 Bundle (android.os.Bundle)1 Bookmark (eu.siacs.conversations.entities.Bookmark)1 Contact (eu.siacs.conversations.entities.Contact)1 HttpConnectionManager (eu.siacs.conversations.http.HttpConnectionManager)1