Properly track message sender

Andreas Straub created

Previously, the sender was assumed to be the conversation counterpart.
This broke carboned own-device messages. We now track the sender
properly, and also set the status (sent by one of the own devices vs
received from the counterpart) accordingly.

Change summary

src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java     |  8 
src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java | 15 
src/main/java/eu/siacs/conversations/parser/MessageParser.java              |  8 
3 files changed, 16 insertions(+), 15 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java 🔗

@@ -856,14 +856,14 @@ public class AxolotlService {
 
 	@Nullable
 	public XmppAxolotlMessage encrypt(Message message ){
-		final XmppAxolotlMessage axolotlMessage = new XmppAxolotlMessage(message.getContact(),
+		final XmppAxolotlMessage axolotlMessage = new XmppAxolotlMessage(message.getContact().getJid().toBareJid(),
 				ownDeviceId, message.getBody());
 
-		if(findSessionsforContact(axolotlMessage.getContact()).isEmpty()) {
+		if(findSessionsforContact(message.getContact()).isEmpty()) {
 			return null;
 		}
 		Log.d(Config.LOGTAG, "Building axolotl foreign headers...");
-		for (XmppAxolotlSession session : findSessionsforContact(axolotlMessage.getContact())) {
+		for (XmppAxolotlSession session : findSessionsforContact(message.getContact())) {
 			Log.d(Config.LOGTAG, session.remoteAddress.toString());
 			//if(!session.isTrusted()) {
 			// TODO: handle this properly
@@ -910,7 +910,7 @@ public class AxolotlService {
 
 	public XmppAxolotlMessage.XmppAxolotlPlaintextMessage processReceiving(XmppAxolotlMessage message) {
 		XmppAxolotlMessage.XmppAxolotlPlaintextMessage plaintextMessage = null;
-		AxolotlAddress senderAddress = new AxolotlAddress(message.getContact().getJid().toBareJid().toString(),
+		AxolotlAddress senderAddress = new AxolotlAddress(message.getFrom().toString(),
 				message.getSenderDeviceId());
 
 		XmppAxolotlSession session = sessions.get(senderAddress);

src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java 🔗

@@ -19,13 +19,14 @@ import javax.crypto.spec.SecretKeySpec;
 
 import eu.siacs.conversations.entities.Contact;
 import eu.siacs.conversations.xml.Element;
+import eu.siacs.conversations.xmpp.jid.Jid;
 
 public class XmppAxolotlMessage {
 	private byte[] innerKey;
 	private byte[] ciphertext;
 	private byte[] iv;
 	private final Set<XmppAxolotlMessageHeader> headers;
-	private final Contact contact;
+	private final Jid from;
 	private final int sourceDeviceId;
 
 	public static class XmppAxolotlMessageHeader {
@@ -82,8 +83,8 @@ public class XmppAxolotlMessage {
 
 	}
 
-	public XmppAxolotlMessage(Contact contact, Element axolotlMessage) {
-		this.contact = contact;
+	public XmppAxolotlMessage(Jid from, Element axolotlMessage) {
+		this.from = from;
 		this.sourceDeviceId = Integer.parseInt(axolotlMessage.getAttribute("id"));
 		this.headers = new HashSet<>();
 		for(Element child:axolotlMessage.getChildren()) {
@@ -101,8 +102,8 @@ public class XmppAxolotlMessage {
 		}
 	}
 
-	public XmppAxolotlMessage(Contact contact, int sourceDeviceId, String plaintext) {
-		this.contact = contact;
+	public XmppAxolotlMessage(Jid from, int sourceDeviceId, String plaintext) {
+		this.from = from;
 		this.sourceDeviceId = sourceDeviceId;
 		this.headers = new HashSet<>();
 		this.encrypt(plaintext);
@@ -124,8 +125,8 @@ public class XmppAxolotlMessage {
 		}
 	}
 
-	public Contact getContact() {
-		return this.contact;
+	public Jid getFrom() {
+		return this.from;
 	}
 
 	public int getSenderDeviceId() {

src/main/java/eu/siacs/conversations/parser/MessageParser.java 🔗

@@ -99,13 +99,13 @@ public class MessageParser extends AbstractParser implements
 		}
 	}
 
-	private Message parseAxolotlChat(Element axolotlMessage, Jid from, String id, Conversation conversation) {
+	private Message parseAxolotlChat(Element axolotlMessage, Jid from, String id, Conversation conversation, int status) {
 		Message finishedMessage = null;
 		AxolotlService service = conversation.getAccount().getAxolotlService();
-		XmppAxolotlMessage xmppAxolotlMessage = new XmppAxolotlMessage(conversation.getContact(), axolotlMessage);
+		XmppAxolotlMessage xmppAxolotlMessage = new XmppAxolotlMessage(from.toBareJid(), axolotlMessage);
 		XmppAxolotlMessage.XmppAxolotlPlaintextMessage plaintextMessage = service.processReceiving(xmppAxolotlMessage);
 		if(plaintextMessage != null) {
-			finishedMessage = new Message(conversation, plaintextMessage.getPlaintext(), Message.ENCRYPTION_AXOLOTL, Message.STATUS_RECEIVED);
+			finishedMessage = new Message(conversation, plaintextMessage.getPlaintext(), Message.ENCRYPTION_AXOLOTL, status);
 			finishedMessage.setAxolotlSession(plaintextMessage.getSession());
 		}
 
@@ -322,7 +322,7 @@ public class MessageParser extends AbstractParser implements
 			} else if (pgpEncrypted != null) {
 				message = new Message(conversation, pgpEncrypted, Message.ENCRYPTION_PGP, status);
 			} else if (axolotlEncrypted != null) {
-				message = parseAxolotlChat(axolotlEncrypted, from, remoteMsgId, conversation);
+				message = parseAxolotlChat(axolotlEncrypted, from, remoteMsgId, conversation, status);
 				if (message == null) {
 					return;
 				}