diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/MergeRecipientHelper.java b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/MergeRecipientHelper.java index 5cf3c675e2..dd18f401ce 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/MergeRecipientHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/MergeRecipientHelper.java @@ -17,12 +17,12 @@ public class MergeRecipientHelper { static Pair> resolveRecipientTrustedLocked( Store store, RecipientAddress address ) throws SQLException { - // address has serviceId and number, optionally also pni + // address has at least one of serviceId/pni and optionally number/username final var recipients = store.findAllByAddress(address); if (recipients.isEmpty()) { - logger.debug("Got new recipient, serviceId, PNI and number are unknown"); + logger.debug("Got new recipient, serviceId, PNI, number, username are unknown"); return new Pair<>(store.addNewRecipient(address), List.of()); } @@ -47,7 +47,7 @@ static Pair> resolveRecipientTrustedLocked( } logger.debug( - "Got recipient {} existing with number/pni, but different serviceId, so stripping its number and adding new recipient", + "Got recipient {} existing with number/pni/username, but different serviceId, so stripping its number and adding new recipient", recipient.id()); store.updateRecipientAddress(recipient.id(), recipient.address().removeIdentifiersFrom(address)); diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java index c27499ab00..63b6780fbd 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java @@ -793,8 +793,8 @@ private RecipientId addNewRecipient( ) throws SQLException { final var sql = ( """ - INSERT INTO %s (number, uuid, pni) - VALUES (?, ?, ?) + INSERT INTO %s (number, uuid, pni, username) + VALUES (?, ?, ?, ?) RETURNING _id """ ).formatted(TABLE_RECIPIENT); @@ -803,6 +803,7 @@ private RecipientId addNewRecipient( statement.setBytes(2, address.serviceId().map(ServiceId::getRawUuid).map(UuidUtil::toByteArray).orElse(null)); statement.setBytes(3, address.pni().map(PNI::getRawUuid).map(UuidUtil::toByteArray).orElse(null)); + statement.setString(4, address.username().orElse(null)); final var generatedKey = Utils.executeQueryForOptional(statement, Utils::getIdMapper); if (generatedKey.isPresent()) { final var recipientId = new RecipientId(generatedKey.get(), this); @@ -820,7 +821,7 @@ private void removeRecipientAddress(Connection connection, RecipientId recipient final var sql = ( """ UPDATE %s - SET number = NULL, uuid = NULL, pni = NULL + SET number = NULL, uuid = NULL, pni = NULL, username = NULL WHERE _id = ? """ ).formatted(TABLE_RECIPIENT); diff --git a/lib/src/test/java/org/asamk/signal/manager/storage/recipients/MergeRecipientHelperTest.java b/lib/src/test/java/org/asamk/signal/manager/storage/recipients/MergeRecipientHelperTest.java index 770054f32a..eae8958f21 100644 --- a/lib/src/test/java/org/asamk/signal/manager/storage/recipients/MergeRecipientHelperTest.java +++ b/lib/src/test/java/org/asamk/signal/manager/storage/recipients/MergeRecipientHelperTest.java @@ -23,19 +23,24 @@ class MergeRecipientHelperTest { static final PNI PNI_B = PNI.from(UUID.randomUUID()); static final String NUMBER_A = "+AAA"; static final String NUMBER_B = "+BBB"; + static final String USERNAME_A = "USER.1"; + static final String USERNAME_B = "USER.2"; - static final PartialAddresses ADDR_A = new PartialAddresses(SERVICE_ID_A, PNI_A, NUMBER_A); - static final PartialAddresses ADDR_B = new PartialAddresses(SERVICE_ID_B, PNI_B, NUMBER_B); + static final PartialAddresses ADDR_A = new PartialAddresses(SERVICE_ID_A, PNI_A, NUMBER_A, USERNAME_A); + static final PartialAddresses ADDR_B = new PartialAddresses(SERVICE_ID_B, PNI_B, NUMBER_B, USERNAME_B); static final T[] testInstancesNone = new T[]{ new T(Set.of(), ADDR_A.FULL, Set.of(rec(1000000, ADDR_A.FULL))), new T(Set.of(), ADDR_A.ACI_NUM, Set.of(rec(1000000, ADDR_A.ACI_NUM))), new T(Set.of(), ADDR_A.ACI_PNI, Set.of(rec(1000000, ADDR_A.ACI_PNI))), new T(Set.of(), ADDR_A.PNI_NUM, Set.of(rec(1000000, ADDR_A.PNI_NUM))), + new T(Set.of(), ADDR_A.ACI_USERNAME, Set.of(rec(1000000, ADDR_A.ACI_USERNAME))), + new T(Set.of(), ADDR_A.FULL_USERNAME, Set.of(rec(1000000, ADDR_A.FULL_USERNAME))), }; static final T[] testInstancesSingle = new T[]{ new T(Set.of(rec(1, ADDR_A.FULL)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))), + new T(Set.of(rec(1, ADDR_A.FULL_USERNAME)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL_USERNAME))), new T(Set.of(rec(1, ADDR_A.ACI)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))), new T(Set.of(rec(1, ADDR_A.PNI)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))), new T(Set.of(rec(1, ADDR_A.NUM)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))), @@ -72,6 +77,10 @@ class MergeRecipientHelperTest { new T(Set.of(rec(1, ADDR_A.ACI_PNI)), ADDR_A.ACI_PNI, Set.of(rec(1, ADDR_A.ACI_PNI))), new T(Set.of(rec(1, ADDR_A.FULL)), ADDR_B.FULL, Set.of(rec(1, ADDR_A.FULL), rec(1000000, ADDR_B.FULL))), + + new T(Set.of(rec(1, ADDR_A.FULL)), ADDR_A.ACI_USERNAME, Set.of(rec(1, ADDR_A.FULL_USERNAME))), + new T(Set.of(rec(1, ADDR_A.ACI)), ADDR_A.ACI_USERNAME, Set.of(rec(1, ADDR_A.ACI_USERNAME))), + new T(Set.of(rec(1, ADDR_A.ACI_NUM)), ADDR_A.ACI_USERNAME, Set.of(rec(1, ADDR_A.ACI_NUM_USERNAME))), }; static final T[] testInstancesTwo = new T[]{ @@ -225,22 +234,28 @@ public void removeRecipientAddress(final RecipientId recipientId) { private record PartialAddresses( RecipientAddress FULL, + RecipientAddress FULL_USERNAME, RecipientAddress ACI, RecipientAddress PNI, RecipientAddress NUM, RecipientAddress ACI_NUM, + RecipientAddress ACI_NUM_USERNAME, RecipientAddress PNI_NUM, - RecipientAddress ACI_PNI + RecipientAddress ACI_PNI, + RecipientAddress ACI_USERNAME ) { - PartialAddresses(ServiceId serviceId, PNI pni, String number) { + PartialAddresses(ServiceId serviceId, PNI pni, String number, String username) { this(new RecipientAddress(serviceId, pni, number), + new RecipientAddress(serviceId, pni, number, username), new RecipientAddress(serviceId, null, null), new RecipientAddress(null, pni, null), new RecipientAddress(null, null, number), new RecipientAddress(serviceId, null, number), + new RecipientAddress(serviceId, null, number, username), new RecipientAddress(null, pni, number), - new RecipientAddress(serviceId, pni, null)); + new RecipientAddress(serviceId, pni, null), + new RecipientAddress(serviceId, null, null, username)); } } }