Fix storing of username

This commit is contained in:
AsamK 2023-11-12 18:50:56 +01:00
parent 1bbfa74b3f
commit 21f7a6de88
3 changed files with 27 additions and 11 deletions

View file

@ -17,12 +17,12 @@ public class MergeRecipientHelper {
static Pair<RecipientId, List<RecipientId>> 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 @@ public class MergeRecipientHelper {
}
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));

View file

@ -790,8 +790,8 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
) 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);
@ -800,6 +800,7 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
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);
@ -817,7 +818,7 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re
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);

View file

@ -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 @@ class MergeRecipientHelperTest {
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));
}
}
}