From fa5729bac689a097d815e5d3f876a2212f01d2a9 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 15 May 2020 14:14:41 -0400 Subject: [PATCH] Better handle identity key changes in response to storage service syncs. --- .../storage/TextSecureIdentityKeyStore.java | 2 +- .../securesms/database/IdentityDatabase.java | 22 +++++++++++++++++-- .../securesms/util/IdentityUtil.java | 8 +++---- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java index 7b10949ed3..d98c1220c5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java +++ b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java @@ -69,7 +69,7 @@ public class TextSecureIdentityKeyStore implements IdentityKeyStore { } identityDatabase.saveIdentity(recipient.getId(), identityKey, verifiedStatus, false, System.currentTimeMillis(), nonBlockingApproval); - IdentityUtil.markIdentityUpdate(context, recipient); + IdentityUtil.markIdentityUpdate(context, recipient.getId()); SessionUtil.archiveSiblingSessions(context, address); return true; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/IdentityDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/IdentityDatabase.java index acc57d1b53..b75b37b202 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/IdentityDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/IdentityDatabase.java @@ -29,6 +29,7 @@ import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.Base64; +import org.thoughtcrime.securesms.util.IdentityUtil; import org.whispersystems.libsignal.IdentityKey; import org.whispersystems.libsignal.InvalidKeyException; import org.whispersystems.libsignal.util.guava.Optional; @@ -145,14 +146,31 @@ public class IdentityDatabase extends Database { } public void updateIdentityAfterSync(@NonNull RecipientId id, IdentityKey identityKey, VerifiedStatus verifiedStatus) { - if (!hasMatchingKey(id, identityKey, verifiedStatus)) { + boolean keyMatches = hasMatchingKey(id, identityKey); + boolean statusMatches = keyMatches && hasMatchingStatus(id, identityKey, verifiedStatus); + + if (!keyMatches || !statusMatches) { saveIdentityInternal(id, identityKey, verifiedStatus, false, System.currentTimeMillis(), true); Optional record = getIdentity(id); if (record.isPresent()) EventBus.getDefault().post(record.get()); } + + if (!keyMatches) { + IdentityUtil.markIdentityUpdate(context, id); + } } - private boolean hasMatchingKey(@NonNull RecipientId id, IdentityKey identityKey, VerifiedStatus verifiedStatus) { + private boolean hasMatchingKey(@NonNull RecipientId id, IdentityKey identityKey) { + SQLiteDatabase db = databaseHelper.getReadableDatabase(); + String query = RECIPIENT_ID + " = ? AND " + IDENTITY_KEY + " = ?"; + String[] args = new String[]{id.serialize(), Base64.encodeBytes(identityKey.serialize())}; + + try (Cursor cursor = db.query(TABLE_NAME, null, query, args, null, null, null)) { + return cursor != null && cursor.moveToFirst(); + } + } + + private boolean hasMatchingStatus(@NonNull RecipientId id, IdentityKey identityKey, VerifiedStatus verifiedStatus) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); String query = RECIPIENT_ID + " = ? AND " + IDENTITY_KEY + " = ? AND " + VERIFIED + " = ?"; String[] args = new String[]{id.serialize(), Base64.encodeBytes(identityKey.serialize()), String.valueOf(verifiedStatus.toInt())}; diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java index a16546858e..950295f6cb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java @@ -119,7 +119,7 @@ public class IdentityUtil { } } - public static void markIdentityUpdate(Context context, Recipient recipient) { + public static void markIdentityUpdate(@NonNull Context context, @NonNull RecipientId recipientId) { long time = System.currentTimeMillis(); SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context); @@ -128,15 +128,15 @@ public class IdentityUtil { GroupDatabase.GroupRecord groupRecord; while ((groupRecord = reader.getNext()) != null) { - if (groupRecord.getMembers().contains(recipient.getId()) && groupRecord.isActive()) { - IncomingTextMessage incoming = new IncomingTextMessage(recipient.getId(), 1, time, time, null, Optional.of(groupRecord.getId()), 0, false); + if (groupRecord.getMembers().contains(recipientId) && groupRecord.isActive()) { + IncomingTextMessage incoming = new IncomingTextMessage(recipientId, 1, time, time, null, Optional.of(groupRecord.getId()), 0, false); IncomingIdentityUpdateMessage groupUpdate = new IncomingIdentityUpdateMessage(incoming); smsDatabase.insertMessageInbox(groupUpdate); } } - IncomingTextMessage incoming = new IncomingTextMessage(recipient.getId(), 1, time, -1, null, Optional.absent(), 0, false); + IncomingTextMessage incoming = new IncomingTextMessage(recipientId, 1, time, -1, null, Optional.absent(), 0, false); IncomingIdentityUpdateMessage individualUpdate = new IncomingIdentityUpdateMessage(incoming); Optional insertResult = smsDatabase.insertMessageInbox(individualUpdate);