Handle the case where a number changes during a recipient merge.

fork-5.53.8
Greyson Parrelli 2021-11-18 13:19:32 -05:00 zatwierdzone przez GitHub
rodzic 686219d473
commit 42d0d84ae0
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
2 zmienionych plików z 44 dodań i 7 usunięć

Wyświetl plik

@ -302,6 +302,28 @@ class RecipientDatabaseTest {
assertEquals(E164_A, existingRecipient2.requireE164())
}
/**
* Another high trust case that results in a merge. Nothing strictly new here, but this case is called out because its a merge but *also* an E164 change,
* which clients may need to know for UX purposes.
*/
@Test
fun getAndPossiblyMerge_bothAciAndE164MapToExistingUser_aciAndE164_mergeAndPhoneNumberChange_highTrust() {
val existingId1: RecipientId = recipientDatabase.getAndPossiblyMerge(ACI_A, E164_B, true)
val existingId2: RecipientId = recipientDatabase.getAndPossiblyMerge(null, E164_A, true)
val retrievedId: RecipientId = recipientDatabase.getAndPossiblyMerge(ACI_A, E164_A, true)
assertEquals(existingId1, retrievedId)
val retrievedRecipient = Recipient.resolved(retrievedId)
assertEquals(ACI_A, retrievedRecipient.requireAci())
assertEquals(E164_A, retrievedRecipient.requireE164())
assertFalse(recipientDatabase.getByE164(E164_B).isPresent)
val recipientWithId2 = Recipient.resolved(existingId2)
assertEquals(retrievedId, recipientWithId2.id)
}
// ==============================================================
// Misc
// ==============================================================

Wyświetl plik

@ -548,14 +548,29 @@ public class RecipientDatabase extends Database {
finalId = byAci.get();
}
} else {
if (highTrust) {
Log.w(TAG, "We have one contact with just an E164, and another with just an ACI. High-trust, so merging the two rows together.", true);
finalId = merge(byAci.get(), byE164.get());
recipientNeedingRefresh = byAci.get();
remapped = new Pair<>(byE164.get(), byAci.get());
RecipientSettings aciSettings = getRecipientSettings(byAci.get());
if (aciSettings.getE164() != null) {
if (highTrust) {
Log.w(TAG, "We have one contact with just an E164, and another with both an ACI and a different E164. High-trust, so merging the two rows together. The E164 has also effectively changed for the ACI contact.", true);
finalId = merge(byAci.get(), byE164.get());
recipientNeedingRefresh = byAci.get();
remapped = new Pair<>(byE164.get(), byAci.get());
recipientChangedNumber = finalId;
} else {
Log.w(TAG, "We have one contact with just an E164, and another with both an ACI and a different E164. Low-trust, so doing nothing.", true);
finalId = byAci.get();
}
} else {
Log.w(TAG, "We have one contact with just an E164, and another with just an ACI. Low-trust, so doing nothing.", true);
finalId = byAci.get();
if (highTrust) {
Log.w(TAG, "We have one contact with just an E164, and another with just an ACI. High-trust, so merging the two rows together.", true);
finalId = merge(byAci.get(), byE164.get());
recipientNeedingRefresh = byAci.get();
remapped = new Pair<>(byE164.get(), byAci.get());
} else {
Log.w(TAG, "We have one contact with just an E164, and another with just an ACI. Low-trust, so doing nothing.", true);
finalId = byAci.get();
}
}
}
}