From e80882b83b440cd18f3b938c211c326a00a80f61 Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Tue, 30 Apr 2013 11:14:01 -0700 Subject: [PATCH] Locally encrypted messages no longer show as ciphertext notifications. --- .../securesms/ConversationItem.java | 4 +- .../securesms/crypto/DecryptingQueue.java | 2 +- .../database/EncryptingSmsDatabase.java | 13 ++--- .../securesms/database/MmsDatabase.java | 37 +++++++------- .../securesms/database/SmsDatabase.java | 32 ++++++++----- .../securesms/database/ThreadDatabase.java | 48 +++++++++---------- .../database/model/DisplayRecord.java | 32 ++++++++++--- .../database/model/MediaMmsMessageRecord.java | 17 ++----- .../database/model/MessageRecord.java | 26 +++++----- .../model/NotificationMmsMessageRecord.java | 2 +- .../database/model/SmsMessageRecord.java | 8 ++-- .../database/model/ThreadRecord.java | 8 ++-- .../securesms/sms/OutgoingTextMessage.java | 6 +-- .../securesms/transport/SmsTransport.java | 4 +- 14 files changed, 130 insertions(+), 109 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ConversationItem.java b/src/org/thoughtcrime/securesms/ConversationItem.java index 32399856a0..980959c3a3 100644 --- a/src/org/thoughtcrime/securesms/ConversationItem.java +++ b/src/org/thoughtcrime/securesms/ConversationItem.java @@ -195,7 +195,7 @@ public class ConversationItem extends LinearLayout { if (!messageRecord.isOutgoing() && messageRecord.getRecipients().isSingleRecipient()) { checkForAutoInitiate(messageRecord.getIndividualRecipient(), - messageRecord.getBody(), + messageRecord.getBody().getBody(), messageRecord.getThreadId()); } } @@ -321,7 +321,7 @@ public class ConversationItem extends LinearLayout { private void handleKeyExchangeClicked() { Intent intent = new Intent(context, ReceiveKeyActivity.class); intent.putExtra("recipient", messageRecord.getIndividualRecipient()); - intent.putExtra("body", messageRecord.getBody()); + intent.putExtra("body", messageRecord.getBody().getBody()); intent.putExtra("thread_id", messageRecord.getThreadId()); intent.putExtra("master_secret", masterSecret); intent.putExtra("sent", messageRecord.isOutgoing()); diff --git a/src/org/thoughtcrime/securesms/crypto/DecryptingQueue.java b/src/org/thoughtcrime/securesms/crypto/DecryptingQueue.java index 1eb940d3c5..cce8f67dfe 100644 --- a/src/org/thoughtcrime/securesms/crypto/DecryptingQueue.java +++ b/src/org/thoughtcrime/securesms/crypto/DecryptingQueue.java @@ -122,7 +122,7 @@ public class DecryptingQueue { SmsMessageRecord record) { long messageId = record.getId(); - String body = record.getBody(); + String body = record.getBody().getBody(); String originator = record.getIndividualRecipient().getNumber(); boolean isSecureMessage = record.isSecure(); diff --git a/src/org/thoughtcrime/securesms/database/EncryptingSmsDatabase.java b/src/org/thoughtcrime/securesms/database/EncryptingSmsDatabase.java index 43d8754be0..8a165676f5 100644 --- a/src/org/thoughtcrime/securesms/database/EncryptingSmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/EncryptingSmsDatabase.java @@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.crypto.AsymmetricMasterCipher; import org.thoughtcrime.securesms.crypto.AsymmetricMasterSecret; import org.thoughtcrime.securesms.crypto.MasterCipher; import org.thoughtcrime.securesms.crypto.MasterSecret; +import org.thoughtcrime.securesms.database.model.DisplayRecord; import org.thoughtcrime.securesms.sms.IncomingTextMessage; import org.thoughtcrime.securesms.sms.OutgoingTextMessage; import org.thoughtcrime.securesms.util.InvalidMessageException; @@ -128,27 +129,27 @@ public class EncryptingSmsDatabase extends SmsDatabase { } @Override - protected String getBody(Cursor cursor) { + protected DisplayRecord.Body getBody(Cursor cursor) { long type = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.TYPE)); - String ciphertext = super.getBody(cursor); + String ciphertext = cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabase.BODY)); try { if (SmsDatabase.Types.isSymmetricEncryption(type)) { String plaintext = plaintextCache.get(ciphertext); if (plaintext != null) - return plaintext; + return new DisplayRecord.Body(plaintext, true); plaintext = masterCipher.decryptBody(ciphertext); plaintextCache.put(ciphertext, plaintext); - return plaintext; + return new DisplayRecord.Body(plaintext, true); } else { - return ciphertext; + return new DisplayRecord.Body(ciphertext, true); } } catch (InvalidMessageException e) { Log.w("EncryptingSmsDatabase", e); - return "Error decrypting message."; + return new DisplayRecord.Body("Error decrypting message.", true); } } } diff --git a/src/org/thoughtcrime/securesms/database/MmsDatabase.java b/src/org/thoughtcrime/securesms/database/MmsDatabase.java index 2ba11798e7..3db25ec0a2 100644 --- a/src/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -29,6 +29,7 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contacts.ContactPhotoFactory; import org.thoughtcrime.securesms.crypto.MasterCipher; import org.thoughtcrime.securesms.crypto.MasterSecret; +import org.thoughtcrime.securesms.database.model.DisplayRecord; import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.NotificationMmsMessageRecord; @@ -241,14 +242,14 @@ public class MmsDatabase extends Database implements MmsSmsColumns { ContentValues contentValues = new ContentValues(); contentValues.put(RESPONSE_STATUS, status); - database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {messageId+""}); + database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {messageId + ""}); } private void updateMailboxBitmask(long id, long maskOff, long maskOn) { SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.execSQL("UPDATE " + TABLE_NAME + " SET " + MESSAGE_BOX + " = (" + MESSAGE_BOX + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + " )" + - " WHERE " + ID + " = ?", new String[] {id+""}); + " WHERE " + ID + " = ?", new String[] {id + ""}); } public void markAsSentFailed(long messageId) { @@ -272,7 +273,7 @@ public class MmsDatabase extends Database implements MmsSmsColumns { ContentValues contentValues = new ContentValues(); contentValues.put(STATUS, state); - database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {messageId+""}); + database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {messageId + ""}); notifyConversationListeners(getThreadIdForMessage(messageId)); } @@ -759,14 +760,14 @@ public class MmsDatabase extends Database implements MmsSmsColumns { } private MediaMmsMessageRecord getMediaMmsMessageRecord(Cursor cursor) { - long id = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.ID)); - long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.NORMALIZED_DATE_SENT)); - long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.NORMALIZED_DATE_RECEIVED)); - long box = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX)); - long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.THREAD_ID)); - String body = getBody(cursor); - int partCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.PART_COUNT)); - Recipient recipient = getMessageRecipient(id); + long id = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.ID)); + long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.NORMALIZED_DATE_SENT)); + long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.NORMALIZED_DATE_RECEIVED)); + long box = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX)); + long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.THREAD_ID)); + DisplayRecord.Body body = getBody(cursor); + int partCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.PART_COUNT)); + Recipient recipient = getMessageRecipient(id); ListenableFutureTask slideDeck = getSlideDeck(masterSecret, id); @@ -775,19 +776,21 @@ public class MmsDatabase extends Database implements MmsSmsColumns { slideDeck, partCount, box); } - private String getBody(Cursor cursor) { + private DisplayRecord.Body getBody(Cursor cursor) { try { String body = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.BODY)); long box = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX)); - if (body != null && masterCipher != null && Types.isSymmetricEncryption(box)) { - return masterCipher.decryptBody(body); + if (!Util.isEmpty(body) && masterCipher != null && Types.isSymmetricEncryption(box)) { + return new DisplayRecord.Body(masterCipher.decryptBody(body), true); + } else if (!Util.isEmpty(body) && masterCipher == null && Types.isSymmetricEncryption(box)) { + return new DisplayRecord.Body(body, false); + } else { + return new DisplayRecord.Body(body == null ? "" : body, true); } - - return body; } catch (InvalidMessageException e) { Log.w("MmsDatabase", e); - return "Error decrypting message."; + return new DisplayRecord.Body("Error decrypting message.", true); } } diff --git a/src/org/thoughtcrime/securesms/database/SmsDatabase.java b/src/org/thoughtcrime/securesms/database/SmsDatabase.java index 6bc4bc7132..9d3890608c 100644 --- a/src/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -27,6 +27,7 @@ import android.util.Log; import android.util.Pair; import org.thoughtcrime.securesms.contacts.ContactPhotoFactory; +import org.thoughtcrime.securesms.database.model.DisplayRecord; import org.thoughtcrime.securesms.database.model.SmsMessageRecord; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientFactory; @@ -179,7 +180,7 @@ public class SmsDatabase extends Database implements MmsSmsColumns { database.update(TABLE_NAME, contentValues, THREAD_ID + " = ? AND " + READ + " = 0", new String[] {threadId+""}); long end = System.currentTimeMillis(); - Log.w("SmsDatabase", "setMessagesRead time: " + (end-start)); + Log.w("SmsDatabase", "setMessagesRead time: " + (end - start)); } protected void updateMessageBodyAndType(long messageId, String body, long maskOff, long maskOn) { @@ -395,15 +396,15 @@ public class SmsDatabase extends Database implements MmsSmsColumns { } public SmsMessageRecord getCurrent() { - long messageId = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.ID)); - String address = cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabase.ADDRESS)); - long type = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.TYPE)); - long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.NORMALIZED_DATE_RECEIVED)); - long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.NORMALIZED_DATE_SENT)); - long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.THREAD_ID)); - int status = cursor.getInt(cursor.getColumnIndexOrThrow(SmsDatabase.STATUS)); - Recipients recipients = getRecipientsFor(address); - String body = getBody(cursor); + long messageId = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.ID)); + String address = cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabase.ADDRESS)); + long type = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.TYPE)); + long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.NORMALIZED_DATE_RECEIVED)); + long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.NORMALIZED_DATE_SENT)); + long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.THREAD_ID)); + int status = cursor.getInt(cursor.getColumnIndexOrThrow(SmsDatabase.STATUS)); + Recipients recipients = getRecipientsFor(address); + DisplayRecord.Body body = getBody(cursor); return new SmsMessageRecord(context, messageId, body, recipients, recipients.getPrimaryRecipient(), @@ -421,8 +422,15 @@ public class SmsDatabase extends Database implements MmsSmsColumns { } } - protected String getBody(Cursor cursor) { - return cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabase.BODY)); + protected DisplayRecord.Body getBody(Cursor cursor) { + long type = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.TYPE)); + String body = cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabase.BODY)); + + if (Types.isSymmetricEncryption(type)) { + return new DisplayRecord.Body(body, false); + } else { + return new DisplayRecord.Body(body, true); + } } public void close() { diff --git a/src/org/thoughtcrime/securesms/database/ThreadDatabase.java b/src/org/thoughtcrime/securesms/database/ThreadDatabase.java index 4ebe5bee07..5ef496ab2f 100644 --- a/src/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/src/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -25,6 +25,7 @@ import android.util.Log; import org.thoughtcrime.securesms.crypto.MasterCipher; import org.thoughtcrime.securesms.crypto.MasterSecret; +import org.thoughtcrime.securesms.database.model.DisplayRecord; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.ThreadRecord; import org.thoughtcrime.securesms.recipients.Recipient; @@ -372,7 +373,7 @@ public class ThreadDatabase extends Database { MessageRecord record = null; if (reader != null && (record = reader.getNext()) != null) { - updateThread(threadId, count, record.getBody(), record.getDateReceived(), record.getType()); + updateThread(threadId, count, record.getBody().getBody(), record.getDateReceived(), record.getType()); } else { deleteThread(threadId); } @@ -401,13 +402,13 @@ public class ThreadDatabase extends Database { public class Reader { private final Cursor cursor; - private final MasterSecret masterSecret; private final MasterCipher masterCipher; public Reader(Cursor cursor, MasterSecret masterSecret) { - this.cursor = cursor; - this.masterSecret = masterSecret; - this.masterCipher = new MasterCipher(masterSecret); + this.cursor = cursor; + + if (masterSecret != null) this.masterCipher = new MasterCipher(masterSecret); + else this.masterCipher = null; } public ThreadRecord getNext() { @@ -422,40 +423,35 @@ public class ThreadDatabase extends Database { String recipientId = cursor.getString(cursor.getColumnIndexOrThrow(ThreadDatabase.RECIPIENT_IDS)); Recipients recipients = RecipientFactory.getRecipientsForIds(context, recipientId, true); - String body = getPlaintextBody(cursor); - long date = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.DATE)); - long count = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.MESSAGE_COUNT)); - long read = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.READ)); - long type = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.SNIPPET_TYPE)); - int distributionType = cursor.getInt(cursor.getColumnIndexOrThrow(ThreadDatabase.TYPE)); + DisplayRecord.Body body = getPlaintextBody(cursor); + long date = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.DATE)); + long count = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.MESSAGE_COUNT)); + long read = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.READ)); + long type = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.SNIPPET_TYPE)); + int distributionType = cursor.getInt(cursor.getColumnIndexOrThrow(ThreadDatabase.TYPE)); return new ThreadRecord(context, body, recipients, date, count, read == 1, threadId, type, distributionType); } - private String getPlaintextBody(Cursor cursor) { - long type = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.SNIPPET_TYPE)); - String ciphertextBody = cursor.getString(cursor.getColumnIndexOrThrow(SNIPPET)); - - if (masterSecret == null) - return ciphertextBody; - + private DisplayRecord.Body getPlaintextBody(Cursor cursor) { try { - if (!Util.isEmpty(ciphertextBody) && MmsSmsColumns.Types.isSymmetricEncryption(type)) { - return masterCipher.decryptBody(ciphertextBody); + long type = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.SNIPPET_TYPE)); + String body = cursor.getString(cursor.getColumnIndexOrThrow(SNIPPET)); + + if (!Util.isEmpty(body) && masterCipher != null && MmsSmsColumns.Types.isSymmetricEncryption(type)) { + return new DisplayRecord.Body(masterCipher.decryptBody(body), true); + } else if (!Util.isEmpty(body) && masterCipher == null && MmsSmsColumns.Types.isSymmetricEncryption(type)) { + return new DisplayRecord.Body(body, false); } else { - return ciphertextBody; + return new DisplayRecord.Body(body, true); } } catch (InvalidMessageException e) { Log.w("ThreadDatabase", e); - return "Error decrypting message."; + return new DisplayRecord.Body("Error decrypting message.", true); } } - protected String getBody(Cursor cursor) { - return cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabase.BODY)); - } - public void close() { cursor.close(); } diff --git a/src/org/thoughtcrime/securesms/database/model/DisplayRecord.java b/src/org/thoughtcrime/securesms/database/model/DisplayRecord.java index a2381e3bdc..a58f4cf6c3 100644 --- a/src/org/thoughtcrime/securesms/database/model/DisplayRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/DisplayRecord.java @@ -33,15 +33,16 @@ import org.thoughtcrime.securesms.recipients.Recipients; public abstract class DisplayRecord { protected final Context context; + protected final long type; + private final Recipients recipients; private final long dateSent; private final long dateReceived; private final long threadId; - protected final long type; + private final Body body; +// private final String body; - private final String body; - - public DisplayRecord(Context context, String body, Recipients recipients, long dateSent, + public DisplayRecord(Context context, Body body, Recipients recipients, long dateSent, long dateReceived, long threadId, long type) { this.context = context.getApplicationContext(); @@ -53,8 +54,9 @@ public abstract class DisplayRecord { this.body = body; } - public String getBody() { - return body == null ? "" : body; + public Body getBody() { + return body; +// return body == null ? "" : body; } public abstract SpannableString getDisplayBody(); @@ -78,4 +80,22 @@ public abstract class DisplayRecord { public boolean isKeyExchange() { return SmsDatabase.Types.isKeyExchangeType(type); } + + public static class Body { + private final String body; + private final boolean plaintext; + + public Body(String body, boolean plaintext) { + this.body = body; + this.plaintext = plaintext; + } + + public boolean isPlaintext() { + return plaintext; + } + + public String getBody() { + return body == null ? "" : body; + } + } } diff --git a/src/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java b/src/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java index 6e084eebeb..979b49f9ab 100644 --- a/src/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java @@ -43,7 +43,7 @@ public class MediaMmsMessageRecord extends MessageRecord { public MediaMmsMessageRecord(Context context, long id, Recipients recipients, Recipient individualRecipient, long dateSent, long dateReceived, - long threadId, String body, ListenableFutureTask slideDeck, + long threadId, Body body, ListenableFutureTask slideDeck, int partCount, long mailbox) { super(context, id, body, recipients, individualRecipient, dateSent, dateReceived, @@ -75,21 +75,10 @@ public class MediaMmsMessageRecord extends MessageRecord { return emphasisAdded(context.getString(R.string.MmsMessageRecord_bad_encrypted_mms_message)); } else if (MmsDatabase.Types.isNoRemoteSessionType(type)) { return emphasisAdded(context.getString(R.string.MmsMessageRecord_mms_message_encrypted_for_non_existing_session)); + } else if (getBody().isPlaintext()) { + return emphasisAdded(context.getString(R.string.MessageNotifier_encrypted_message)); } return super.getDisplayBody(); } - -// private static String getBodyFromSlidesIfAvailable(SlideDeck slideDeck) { -// if (slideDeck == null) -// return ""; -// -// for (Slide slide : slideDeck.getSlides()) { -// if (slide.hasText()) -// return slide.getText(); -// } -// -// return ""; -// } - } diff --git a/src/org/thoughtcrime/securesms/database/model/MessageRecord.java b/src/org/thoughtcrime/securesms/database/model/MessageRecord.java index 87f2f8dbb2..2e3d2e026a 100644 --- a/src/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -46,7 +46,7 @@ public abstract class MessageRecord extends DisplayRecord { private final long id; private final int deliveryStatus; - public MessageRecord(Context context, long id, String body, Recipients recipients, + public MessageRecord(Context context, long id, Body body, Recipients recipients, Recipient individualRecipient, long dateSent, long dateReceived, long threadId, int deliveryStatus, @@ -80,7 +80,7 @@ public abstract class MessageRecord extends DisplayRecord { @Override public SpannableString getDisplayBody() { - return new SpannableString(getBody()); + return new SpannableString(getBody().getBody()); } public long getId() { @@ -119,15 +119,15 @@ public abstract class MessageRecord extends DisplayRecord { return spannable; } - public static class GroupData { - public final int groupSize; - public final int groupSentCount; - public final int groupSendFailedCount; - - public GroupData(int groupSize, int groupSentCount, int groupSendFailedCount) { - this.groupSize = groupSize; - this.groupSentCount = groupSentCount; - this.groupSendFailedCount = groupSendFailedCount; - } - } +// public static class GroupData { +// public final int groupSize; +// public final int groupSentCount; +// public final int groupSendFailedCount; +// +// public GroupData(int groupSize, int groupSentCount, int groupSendFailedCount) { +// this.groupSize = groupSize; +// this.groupSentCount = groupSentCount; +// this.groupSendFailedCount = groupSendFailedCount; +// } +// } } diff --git a/src/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java b/src/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java index 66837358a0..99039e773f 100644 --- a/src/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java @@ -46,7 +46,7 @@ public class NotificationMmsMessageRecord extends MessageRecord { byte[] contentLocation, long messageSize, long expiry, int status, byte[] transactionId, long mailbox) { - super(context, id, "", recipients, individualRecipient, dateSent, dateReceived, + super(context, id, new Body("", true), recipients, individualRecipient, dateSent, dateReceived, threadId, DELIVERY_STATUS_NONE, mailbox); this.contentLocation = contentLocation; diff --git a/src/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java b/src/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java index 89f2793409..41dd394c0f 100644 --- a/src/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java @@ -36,7 +36,7 @@ import org.thoughtcrime.securesms.recipients.Recipients; public class SmsMessageRecord extends MessageRecord { public SmsMessageRecord(Context context, long id, - String body, Recipients recipients, + Body body, Recipients recipients, Recipient individualRecipient, long dateSent, long dateReceived, long type, long threadId, @@ -60,14 +60,16 @@ public class SmsMessageRecord extends MessageRecord { return emphasisAdded(context.getString(R.string.ConversationListAdapter_key_exchange_message)); } else if (isKeyExchange() && !isOutgoing()) { return emphasisAdded(context.getString(R.string.ConversationItem_received_key_exchange_message_click_to_process)); - } else if (isOutgoing() && Tag.isTagged(getBody())) { - return new SpannableString(Tag.stripTag(getBody())); } else if (SmsDatabase.Types.isFailedDecryptType(type)) { return emphasisAdded(context.getString(R.string.MessageDisplayHelper_bad_encrypted_message)); } else if (SmsDatabase.Types.isDecryptInProgressType(type)) { return emphasisAdded(context.getString(R.string.MessageDisplayHelper_decrypting_please_wait)); } else if (SmsDatabase.Types.isNoRemoteSessionType(type)) { return emphasisAdded(context.getString(R.string.MessageDisplayHelper_message_encrypted_for_non_existing_session)); + } else if (!getBody().isPlaintext()) { + return emphasisAdded(context.getString(R.string.MessageNotifier_encrypted_message)); + } else if (isOutgoing() && Tag.isTagged(getBody().getBody())) { + return new SpannableString(Tag.stripTag(getBody().getBody())); } else { return super.getDisplayBody(); } diff --git a/src/org/thoughtcrime/securesms/database/model/ThreadRecord.java b/src/org/thoughtcrime/securesms/database/model/ThreadRecord.java index 12218c280f..eefffd03ec 100644 --- a/src/org/thoughtcrime/securesms/database/model/ThreadRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/ThreadRecord.java @@ -39,7 +39,7 @@ public class ThreadRecord extends DisplayRecord { private final boolean read; private final int distributionType; - public ThreadRecord(Context context, String body, Recipients recipients, long date, + public ThreadRecord(Context context, Body body, Recipients recipients, long date, long count, boolean read, long threadId, long snippetType, int distributionType) { @@ -60,11 +60,13 @@ public class ThreadRecord extends DisplayRecord { return emphasisAdded(context.getString(R.string.MessageDisplayHelper_bad_encrypted_message)); } else if (SmsDatabase.Types.isNoRemoteSessionType(type)) { return emphasisAdded(context.getString(R.string.MessageDisplayHelper_message_encrypted_for_non_existing_session)); + } else if (!getBody().isPlaintext()) { + return emphasisAdded(context.getString(R.string.MessageNotifier_encrypted_message)); } else { - if (Util.isEmpty(getBody())) { + if (Util.isEmpty(getBody().getBody())) { return new SpannableString(context.getString(R.string.MessageNotifier_no_subject)); } else { - return new SpannableString(getBody()); + return new SpannableString(getBody().getBody()); } } } diff --git a/src/org/thoughtcrime/securesms/sms/OutgoingTextMessage.java b/src/org/thoughtcrime/securesms/sms/OutgoingTextMessage.java index a611b26a33..0aafd52f1e 100644 --- a/src/org/thoughtcrime/securesms/sms/OutgoingTextMessage.java +++ b/src/org/thoughtcrime/securesms/sms/OutgoingTextMessage.java @@ -41,11 +41,11 @@ public class OutgoingTextMessage { public static OutgoingTextMessage from(SmsMessageRecord record) { if (record.isSecure()) { - return new OutgoingEncryptedMessage(record.getIndividualRecipient(), record.getBody()); + return new OutgoingEncryptedMessage(record.getIndividualRecipient(), record.getBody().getBody()); } else if (record.isKeyExchange()) { - return new OutgoingKeyExchangeMessage(record.getIndividualRecipient(), record.getBody()); + return new OutgoingKeyExchangeMessage(record.getIndividualRecipient(), record.getBody().getBody()); } else { - return new OutgoingTextMessage(record.getIndividualRecipient(), record.getBody()); + return new OutgoingTextMessage(record.getIndividualRecipient(), record.getBody().getBody()); } } diff --git a/src/org/thoughtcrime/securesms/transport/SmsTransport.java b/src/org/thoughtcrime/securesms/transport/SmsTransport.java index d69a93eee7..b43dea6c24 100644 --- a/src/org/thoughtcrime/securesms/transport/SmsTransport.java +++ b/src/org/thoughtcrime/securesms/transport/SmsTransport.java @@ -44,7 +44,7 @@ public class SmsTransport { OutgoingTextMessage transportMessage = OutgoingTextMessage.from(message); if (message.isSecure()) { - String encryptedMessage = getAsymmetricEncrypt(masterSecret, message.getBody(), + String encryptedMessage = getAsymmetricEncrypt(masterSecret, message.getBody().getBody(), message.getIndividualRecipient()); transportMessage = transportMessage.withBody(encryptedMessage); } @@ -78,7 +78,7 @@ public class SmsTransport { private void deliverPlaintextMessage(SmsMessageRecord message) throws UndeliverableMessageException { - ArrayList messages = SmsManager.getDefault().divideMessage(message.getBody()); + ArrayList messages = SmsManager.getDefault().divideMessage(message.getBody().getBody()); ArrayList sentIntents = constructSentIntents(message.getId(), message.getType(), messages); ArrayList deliveredIntents = constructDeliveredIntents(message.getId(), message.getType(), messages); String recipient = message.getIndividualRecipient().getNumber();