From d41efdbd1c2388a9859ae2b546e57cf102c9f3c6 Mon Sep 17 00:00:00 2001 From: Jake McGinty Date: Tue, 13 Jan 2015 09:40:29 -1000 Subject: [PATCH] prepareMessageMedia before we encrypt and fail more nicely when pdu composition fails // FREEBIE Closes #2338 --- .../thoughtcrime/securesms/crypto/MmsCipher.java | 7 ++++++- .../thoughtcrime/securesms/jobs/MmsSendJob.java | 14 ++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/org/thoughtcrime/securesms/crypto/MmsCipher.java b/src/org/thoughtcrime/securesms/crypto/MmsCipher.java index 56a49df641..29832a522d 100644 --- a/src/org/thoughtcrime/securesms/crypto/MmsCipher.java +++ b/src/org/thoughtcrime/securesms/crypto/MmsCipher.java @@ -8,6 +8,7 @@ import org.thoughtcrime.securesms.protocol.WirePrefix; import org.thoughtcrime.securesms.recipients.RecipientFactory; import org.thoughtcrime.securesms.recipients.RecipientFormattingException; import org.thoughtcrime.securesms.recipients.Recipients; +import org.thoughtcrime.securesms.transport.UndeliverableMessageException; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.libaxolotl.DuplicateMessageException; import org.whispersystems.libaxolotl.InvalidMessageException; @@ -84,7 +85,7 @@ public class MmsCipher { } public SendReq encrypt(Context context, SendReq message) - throws NoSessionException, RecipientFormattingException + throws NoSessionException, RecipientFormattingException, UndeliverableMessageException { EncodedStringValue[] encodedRecipient = message.getTo(); String recipientString = encodedRecipient[0].getString(); @@ -92,6 +93,10 @@ public class MmsCipher { long recipientId = recipients.getPrimaryRecipient().getRecipientId(); byte[] pduBytes = new PduComposer(context, message).make(); + if (pduBytes == null) { + throw new UndeliverableMessageException("PDU composition failed, null payload"); + } + if (!axolotlStore.containsSession(recipientId, PushAddress.DEFAULT_DEVICE_ID)) { throw new NoSessionException("No session for: " + recipientId); } diff --git a/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java b/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java index 9bd434cbd7..cb297bb6df 100644 --- a/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java @@ -149,6 +149,8 @@ public class MmsSendJob extends SendJob { String number = ((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE)).getLine1Number(); boolean upgradedSecure = false; + prepareMessageMedia(masterSecret, message, MediaConstraints.MMS_CONSTRAINTS, true); + if (MmsDatabase.Types.isSecureType(message.getDatabaseMessageBox())) { message = getEncryptedMessage(masterSecret, message); upgradedSecure = true; @@ -158,10 +160,14 @@ public class MmsSendJob extends SendJob { message.setFrom(new EncodedStringValue(number)); } - prepareMessageMedia(masterSecret, message, MediaConstraints.MMS_CONSTRAINTS, true); - try { - OutgoingMmsConnection connection = new OutgoingMmsConnection(context, radio.getApnInformation(), new PduComposer(context, message).make()); + byte[] pdu = new PduComposer(context, message).make(); + + if (pdu == null) { + throw new UndeliverableMessageException("PDU composition failed, null payload"); + } + + OutgoingMmsConnection connection = new OutgoingMmsConnection(context, radio.getApnInformation(), pdu); SendConf conf = connection.send(usingMmsRadio, useProxy); if (conf == null) { @@ -179,7 +185,7 @@ public class MmsSendJob extends SendJob { } private SendReq getEncryptedMessage(MasterSecret masterSecret, SendReq pdu) - throws InsecureFallbackApprovalException + throws InsecureFallbackApprovalException, UndeliverableMessageException { try { MmsCipher cipher = new MmsCipher(new TextSecureAxolotlStore(context, masterSecret));