don't crash on broken base64 in omemo messages. fixes #1934

This commit is contained in:
Daniel Gultsch 2016-06-29 17:18:57 +02:00
parent 1d79a677c8
commit f7933c26d7
2 changed files with 14 additions and 8 deletions

View file

@ -99,7 +99,7 @@ public class XmppAxolotlMessage {
case KEYTAG: case KEYTAG:
try { try {
Integer recipientId = Integer.parseInt(keyElement.getAttribute(REMOTEID)); Integer recipientId = Integer.parseInt(keyElement.getAttribute(REMOTEID));
byte[] key = Base64.decode(keyElement.getContent(), Base64.DEFAULT); byte[] key = Base64.decode(keyElement.getContent().trim(), Base64.DEFAULT);
this.keys.put(recipientId, key); this.keys.put(recipientId, key);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
throw new IllegalArgumentException(e); throw new IllegalArgumentException(e);
@ -109,7 +109,7 @@ public class XmppAxolotlMessage {
if (this.iv != null) { if (this.iv != null) {
throw new IllegalArgumentException("Duplicate iv entry"); throw new IllegalArgumentException("Duplicate iv entry");
} }
iv = Base64.decode(keyElement.getContent(), Base64.DEFAULT); iv = Base64.decode(keyElement.getContent().trim(), Base64.DEFAULT);
break; break;
default: default:
Log.w(Config.LOGTAG, "Unexpected element in header: " + keyElement.toString()); Log.w(Config.LOGTAG, "Unexpected element in header: " + keyElement.toString());
@ -118,7 +118,7 @@ public class XmppAxolotlMessage {
} }
Element payloadElement = axolotlMessage.findChild(PAYLOAD); Element payloadElement = axolotlMessage.findChild(PAYLOAD);
if (payloadElement != null) { if (payloadElement != null) {
ciphertext = Base64.decode(payloadElement.getContent(), Base64.DEFAULT); ciphertext = Base64.decode(payloadElement.getContent().trim(), Base64.DEFAULT);
} }
} }

View file

@ -146,17 +146,23 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
} }
private Message parseAxolotlChat(Element axolotlMessage, Jid from, Conversation conversation, int status) { private Message parseAxolotlChat(Element axolotlMessage, Jid from, Conversation conversation, int status) {
Message finishedMessage = null;
AxolotlService service = conversation.getAccount().getAxolotlService(); AxolotlService service = conversation.getAccount().getAxolotlService();
XmppAxolotlMessage xmppAxolotlMessage = XmppAxolotlMessage.fromElement(axolotlMessage, from.toBareJid()); XmppAxolotlMessage xmppAxolotlMessage;
try {
xmppAxolotlMessage = XmppAxolotlMessage.fromElement(axolotlMessage, from.toBareJid());
} catch (Exception e) {
Log.d(Config.LOGTAG,conversation.getAccount().getJid().toBareJid()+": invalid omemo message received "+e.getMessage());
return null;
}
XmppAxolotlMessage.XmppAxolotlPlaintextMessage plaintextMessage = service.processReceivingPayloadMessage(xmppAxolotlMessage); XmppAxolotlMessage.XmppAxolotlPlaintextMessage plaintextMessage = service.processReceivingPayloadMessage(xmppAxolotlMessage);
if(plaintextMessage != null) { if(plaintextMessage != null) {
finishedMessage = new Message(conversation, plaintextMessage.getPlaintext(), Message.ENCRYPTION_AXOLOTL, status); Message finishedMessage = new Message(conversation, plaintextMessage.getPlaintext(), Message.ENCRYPTION_AXOLOTL, status);
finishedMessage.setFingerprint(plaintextMessage.getFingerprint()); finishedMessage.setFingerprint(plaintextMessage.getFingerprint());
Log.d(Config.LOGTAG, AxolotlService.getLogprefix(finishedMessage.getConversation().getAccount())+" Received Message with session fingerprint: "+plaintextMessage.getFingerprint()); Log.d(Config.LOGTAG, AxolotlService.getLogprefix(finishedMessage.getConversation().getAccount())+" Received Message with session fingerprint: "+plaintextMessage.getFingerprint());
return finishedMessage;
} else {
return null;
} }
return finishedMessage;
} }
private class Invite { private class Invite {