From b568ce70b2b351d95946715c56ed5d8b994c13d8 Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Mon, 20 Oct 2014 21:06:34 -0700 Subject: [PATCH] Make delivery receipts work correctly for groups. --- .../securesms/database/MmsDatabase.java | 36 +++++++++++-------- .../securesms/database/SmsDatabase.java | 28 +++++++-------- src/org/thoughtcrime/securesms/util/Util.java | 7 ++++ 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/src/org/thoughtcrime/securesms/database/MmsDatabase.java b/src/org/thoughtcrime/securesms/database/MmsDatabase.java index 652b6dfee2..c2e8dbe716 100644 --- a/src/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -31,6 +31,7 @@ import com.google.i18n.phonenumbers.PhoneNumberUtil; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.mms.OutgoingGroupMediaMessage; import org.thoughtcrime.securesms.mms.OutgoingMediaMessage; +import org.thoughtcrime.securesms.util.GroupUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.libaxolotl.InvalidMessageException; import org.whispersystems.textsecure.crypto.MasterCipher; @@ -74,6 +75,9 @@ import ws.com.google.android.mms.pdu.PduHeaders; import ws.com.google.android.mms.pdu.PduPart; import ws.com.google.android.mms.pdu.SendReq; +import static org.thoughtcrime.securesms.util.Util.canonicalizeNumber; +import static org.thoughtcrime.securesms.util.Util.canonicalizeNumberOrGroup; + // XXXX Clean up MMS efficiency: // 1) We need to be careful about how much memory we're using for parts. SoftRefereences. // 2) How many queries do we make? calling getMediaMessageForId() from within an existing query @@ -175,28 +179,30 @@ public class MmsDatabase extends Database implements MmsSmsColumns { Cursor cursor = null; try { - cursor = database.query(TABLE_NAME, new String[] {ID, THREAD_ID}, DATE_SENT + " = ?", new String[] {String.valueOf(timestamp / 1000)}, null, null, null, null); + cursor = database.query(TABLE_NAME, new String[] {ID, THREAD_ID, MESSAGE_BOX}, DATE_SENT + " = ?", new String[] {String.valueOf(timestamp / 1000)}, null, null, null, null); while (cursor.moveToNext()) { - List addresses = addressDatabase.getAddressesForId(cursor.getLong(cursor.getColumnIndexOrThrow(ID))); + if (Types.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(MESSAGE_BOX)))) { + List addresses = addressDatabase.getAddressesForId(cursor.getLong(cursor.getColumnIndexOrThrow(ID))); - for (String storedAddress : addresses) { - try { - String ourAddress = org.thoughtcrime.securesms.util.Util.canonicalizeNumber(context, address); - String theirAddress = org.thoughtcrime.securesms.util.Util.canonicalizeNumber(context, storedAddress); + for (String storedAddress : addresses) { + try { + String ourAddress = canonicalizeNumber(context, address); + String theirAddress = canonicalizeNumberOrGroup(context, storedAddress); - if (ourAddress.equals(theirAddress)) { - long id = cursor.getLong(cursor.getColumnIndexOrThrow(ID)); - long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID)); + if (ourAddress.equals(theirAddress) || GroupUtil.isEncodedGroup(theirAddress)) { + long id = cursor.getLong(cursor.getColumnIndexOrThrow(ID)); + long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID)); - database.execSQL("UPDATE " + TABLE_NAME + " SET " + - RECEIPT_COUNT + " = " + RECEIPT_COUNT + " + 1 WHERE " + ID + " = ?", - new String[] {String.valueOf(id)}); + database.execSQL("UPDATE " + TABLE_NAME + " SET " + + RECEIPT_COUNT + " = " + RECEIPT_COUNT + " + 1 WHERE " + ID + " = ?", + new String[] {String.valueOf(id)}); - notifyConversationListeners(threadId); + notifyConversationListeners(threadId); + } + } catch (InvalidNumberException e) { + Log.w("MmsDatabase", e); } - } catch (InvalidNumberException e) { - Log.w("MmsDatabase", e); } } } diff --git a/src/org/thoughtcrime/securesms/database/SmsDatabase.java b/src/org/thoughtcrime/securesms/database/SmsDatabase.java index 3e98bbfd17..3f90709041 100644 --- a/src/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -36,9 +36,7 @@ import org.thoughtcrime.securesms.sms.IncomingGroupMessage; import org.thoughtcrime.securesms.sms.IncomingKeyExchangeMessage; import org.thoughtcrime.securesms.sms.IncomingTextMessage; import org.thoughtcrime.securesms.sms.OutgoingTextMessage; -import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Trimmer; -import org.whispersystems.textsecure.util.Base64; import org.whispersystems.textsecure.util.InvalidNumberException; import org.whispersystems.textsecure.util.Util; @@ -252,25 +250,27 @@ public class SmsDatabase extends Database implements MmsSmsColumns { Cursor cursor = null; try { - cursor = database.query(TABLE_NAME, new String[] {ID, THREAD_ID, ADDRESS}, + cursor = database.query(TABLE_NAME, new String[] {ID, THREAD_ID, ADDRESS, TYPE}, DATE_SENT + " = ?", new String[] {String.valueOf(timestamp)}, null, null, null, null); while (cursor.moveToNext()) { - try { - String theirAddress = canonicalizeNumber(context, address); - String ourAddress = canonicalizeNumber(context, cursor.getString(cursor.getColumnIndexOrThrow(ADDRESS))); + if (Types.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(TYPE)))) { + try { + String theirAddress = canonicalizeNumber(context, address); + String ourAddress = canonicalizeNumber(context, cursor.getString(cursor.getColumnIndexOrThrow(ADDRESS))); - if (ourAddress.equals(theirAddress)) { - database.execSQL("UPDATE " + TABLE_NAME + - " SET " + RECEIPT_COUNT + " = " + RECEIPT_COUNT + " + 1 WHERE " + - ID + " = ?", - new String[] {String.valueOf(cursor.getLong(cursor.getColumnIndexOrThrow(ID)))}); + if (ourAddress.equals(theirAddress)) { + database.execSQL("UPDATE " + TABLE_NAME + + " SET " + RECEIPT_COUNT + " = " + RECEIPT_COUNT + " + 1 WHERE " + + ID + " = ?", + new String[] {String.valueOf(cursor.getLong(cursor.getColumnIndexOrThrow(ID)))}); - notifyConversationListeners(cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID))); + notifyConversationListeners(cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID))); + } + } catch (InvalidNumberException e) { + Log.w("SmsDatabase", e); } - } catch (InvalidNumberException e) { - Log.w("SmsDatabase", e); } } } finally { diff --git a/src/org/thoughtcrime/securesms/util/Util.java b/src/org/thoughtcrime/securesms/util/Util.java index d16a1be1b6..04871dd6bb 100644 --- a/src/org/thoughtcrime/securesms/util/Util.java +++ b/src/org/thoughtcrime/securesms/util/Util.java @@ -134,6 +134,13 @@ public class Util { return PhoneNumberFormatter.formatNumber(number, localNumber); } + public static String canonicalizeNumberOrGroup(Context context, String number) + throws InvalidNumberException + { + if (GroupUtil.isEncodedGroup(number)) return number; + else return canonicalizeNumber(context, number); + } + public static byte[] readFully(InputStream in) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[4069];