From 132b27adeef3ab4d305facda7dd035015b00766f Mon Sep 17 00:00:00 2001 From: steckbrief Date: Sat, 5 May 2018 20:28:04 +0200 Subject: introduces new message state model --- .../crypto/otr/OtrMessageParser.java | 67 ++++++++++++++++++++++ .../conversationsplus/crypto/otr/OtrUtil.java | 39 +++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 src/main/java/de/thedevstack/conversationsplus/crypto/otr/OtrMessageParser.java create mode 100644 src/main/java/de/thedevstack/conversationsplus/crypto/otr/OtrUtil.java (limited to 'src/main/java/de/thedevstack/conversationsplus/crypto/otr') diff --git a/src/main/java/de/thedevstack/conversationsplus/crypto/otr/OtrMessageParser.java b/src/main/java/de/thedevstack/conversationsplus/crypto/otr/OtrMessageParser.java new file mode 100644 index 00000000..8791bff3 --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/crypto/otr/OtrMessageParser.java @@ -0,0 +1,67 @@ +package de.thedevstack.conversationsplus.crypto.otr; + +import net.java.otr4j.session.Session; +import net.java.otr4j.session.SessionStatus; + +import de.thedevstack.conversationsplus.crypto.OtrService; +import de.thedevstack.conversationsplus.entities.Conversation; +import de.thedevstack.conversationsplus.entities.Message; +import de.thedevstack.conversationsplus.utils.CryptoHelper; +import de.thedevstack.conversationsplus.utils.UiUpdateHelper; +import de.thedevstack.conversationsplus.utils.XmppConnectionServiceAccessor; +import de.thedevstack.conversationsplus.xmpp.jid.Jid; + +/** + */ +public class OtrMessageParser { + public static Message parseOtrChat(String body, Jid from, String id, Conversation conversation) { + String presence; + if (from.isBareJid()) { + presence = ""; + } else { + presence = from.getResourcepart(); + } + if (body.matches("^\\?OTRv\\d{1,2}\\?.*")) { + conversation.endOtrIfNeeded(); + } + if (!conversation.hasValidOtrSession()) { + conversation.startOtrSession(presence,false); + } else { + String foreignPresence = conversation.getOtrSession().getSessionID().getUserID(); + if (!foreignPresence.equals(presence)) { + conversation.endOtrIfNeeded(); + conversation.startOtrSession(presence, false); + } + } + try { + conversation.setLastReceivedOtrMessageId(id); + Session otrSession = conversation.getOtrSession(); + body = otrSession.transformReceiving(body); + SessionStatus status = otrSession.getSessionStatus(); + if (body == null && status == SessionStatus.ENCRYPTED) { + XmppConnectionServiceAccessor.xmppConnectionService.onOtrSessionEstablished(conversation); + return null; + } else if (body == null && status == SessionStatus.FINISHED) { + conversation.resetOtrSession(); + UiUpdateHelper.updateConversationUi(); + return null; + } else if (body == null || (body.isEmpty())) { + return null; + } + if (body.startsWith(CryptoHelper.FILETRANSFER)) { + String key = body.substring(CryptoHelper.FILETRANSFER.length()); + conversation.setSymmetricKey(CryptoHelper.hexToBytes(key)); + return null; + } + final OtrService otrService = conversation.getAccount().getOtrService(); + Message finishedMessage = new Message(conversation, body, Message.ENCRYPTION_OTR); + finishedMessage.setFingerprint(otrService.getFingerprint(otrSession.getRemotePublicKey())); + conversation.setLastReceivedOtrMessageId(null); + + return finishedMessage; + } catch (Exception e) { + conversation.resetOtrSession(); + return null; + } + } +} diff --git a/src/main/java/de/thedevstack/conversationsplus/crypto/otr/OtrUtil.java b/src/main/java/de/thedevstack/conversationsplus/crypto/otr/OtrUtil.java new file mode 100644 index 00000000..97075455 --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/crypto/otr/OtrUtil.java @@ -0,0 +1,39 @@ +package de.thedevstack.conversationsplus.crypto.otr; + +import net.java.otr4j.session.SessionID; +import net.java.otr4j.session.SessionImpl; + +import de.thedevstack.conversationsplus.entities.Account; +import de.thedevstack.conversationsplus.entities.Conversation; +import de.thedevstack.conversationsplus.xmpp.Forwarded; +import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.stanzas.MessagePacket; + +/** + */ +public class OtrUtil { + public static boolean isOtrSessionActive(Conversation conversation) { + return null != conversation && null != conversation.getOtrSession(); + } + + public static boolean isCounterpartOfActiveOtrSession(Conversation conversation, Jid counterpart) { + SessionImpl otrSession = (null != conversation) ? conversation.getOtrSession() : null; + SessionID sessionID = (null != otrSession) ? otrSession.getSessionID() : null; + String userID = (null != sessionID) ? sessionID.getUserID() : null; + + return null != userID && null != counterpart && userID.equals(counterpart.getResourcepart()); + } + + public static boolean isValidOtrMessagePacket(MessagePacket messagePacket, Account account) { + Jid to = messagePacket.getTo(); + boolean isProperlyAddressed = (to != null) && (!to.isBareJid() || account.countPresences() <= 1); + boolean isNotTypeGroupChat = messagePacket.getType() != MessagePacket.TYPE_GROUPCHAT; + boolean isNotForwarded = !messagePacket.hasChildRecursive(Forwarded.FORWARDED); + + return isProperlyAddressed && isNotTypeGroupChat && isNotForwarded; + } + + public static boolean isOtrBody(String body) { + return body != null && body.startsWith("?OTR"); + } +} -- cgit v1.2.3