From 90df256e8524281db7ae2f4d569d5861498746c0 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 28 Jan 2024 11:46:34 +0100 Subject: [PATCH] Fix storage sync issues --- .../signal/manager/helper/StorageHelper.java | 4 +- .../signal/manager/helper/SyncHelper.java | 7 ++- .../signal/manager/internal/ManagerImpl.java | 2 +- .../signal/manager/storage/SignalAccount.java | 2 +- .../manager/storage/groups/GroupStore.java | 14 ++++- .../storage/recipients/RecipientStore.java | 23 ++++--- .../syncStorage/ContactRecordProcessor.java | 62 ++++++++----------- .../DefaultStorageRecordProcessor.java | 4 +- 8 files changed, 67 insertions(+), 51 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java index 5bccfd05..c18e8df3 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java @@ -155,7 +155,7 @@ public class StorageHelper { if (updated > 0) { logger.warn( - "Found {} records that were deleted remotely but only marked unregistered locally. Removed those from local store. Recalculating diff.", + "Found {} records that were deleted remotely but only marked unregistered locally. Removed those from local store.", updated); } } @@ -502,7 +502,7 @@ public class StorageHelper { final var remote = remoteByRawId.get(rawId); final var local = localByRawId.get(rawId); - if (remote.getType() != local.getType()) { + if (remote.getType() != local.getType() && local.getType() != 0) { remoteOnlyRawIds.remove(rawId); localOnlyRawIds.remove(rawId); hasTypeMismatch = true; diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java index ac611046..de3a495a 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java @@ -324,7 +324,12 @@ public class SyncHelper { final var recipientId = account.getRecipientTrustedResolver().resolveRecipientTrusted(c.getAddress()); var contact = account.getContactStore().getContact(recipientId); final var builder = contact == null ? Contact.newBuilder() : Contact.newBuilder(contact); - if (c.getName().isPresent()) { + if (c.getName().isPresent() && ( + contact == null || ( + contact.givenName() == null + && contact.familyName() == null + ) + )) { builder.withGivenName(c.getName().get()); builder.withFamilyName(null); } diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java index a2575e90..75dcb138 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java @@ -1355,8 +1355,8 @@ public class ManagerImpl implements Manager { if (thread != null) { stopReceiveThread(thread); } - executor.close(); context.close(); + executor.close(); dependencies.getSignalWebSocket().disconnect(); dependencies.getPushServiceSocket().close(); diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java index 41c05b98..fa5496d2 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -362,7 +362,7 @@ public class SignalAccount implements Closeable { } private void init() { - this.selfRecipientId = getRecipientResolver().resolveRecipient(getSelfRecipientAddress()); + this.selfRecipientId = getRecipientTrustedResolver().resolveSelfRecipientTrusted(getSelfRecipientAddress()); } private void migrateLegacyConfigs() { diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java index e7cf5752..5079da07 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java @@ -122,13 +122,25 @@ public class GroupStore { public void storeStorageRecord( final Connection connection, final GroupId groupId, final StorageId storageId, final byte[] storageRecord ) throws SQLException { + final var groupTable = groupId instanceof GroupIdV1 ? TABLE_GROUP_V1 : TABLE_GROUP_V2; + final var deleteSql = ( + """ + UPDATE %s + SET storage_id = NULL + WHERE storage_id = ? + """ + ).formatted(groupTable); + try (final var statement = connection.prepareStatement(deleteSql)) { + statement.setBytes(1, storageId.getRaw()); + statement.executeUpdate(); + } final var sql = ( """ UPDATE %s SET storage_id = ?, storage_record = ? WHERE group_id = ? """ - ).formatted(groupId instanceof GroupIdV1 ? TABLE_GROUP_V1 : TABLE_GROUP_V2); + ).formatted(groupTable); try (final var statement = connection.prepareStatement(sql)) { statement.setBytes(1, storageId.getRaw()); if (storageRecord == null) { 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 46f8652c..285d5cf6 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 @@ -37,8 +37,6 @@ import java.util.Set; import java.util.function.Supplier; import java.util.stream.Collectors; -import static org.asamk.signal.manager.config.ServiceConfig.UNREGISTERED_LIFESPAN; - public class RecipientStore implements RecipientIdCreator, RecipientResolver, RecipientTrustedResolver, ContactsStore, ProfileStore { private static final Logger logger = LoggerFactory.getLogger(RecipientStore.class); @@ -524,7 +522,7 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re """ SELECT r._id FROM %s r - WHERE r.storage_id IS NULL AND (r.unregistered_timestamp IS NULL OR r.unregistered_timestamp > ?) + WHERE r.storage_id IS NULL AND r.unregistered_timestamp IS NULL """ ).formatted(TABLE_RECIPIENT); final var updateSql = ( @@ -537,7 +535,6 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re try (final var connection = database.getConnection()) { connection.setAutoCommit(false); try (final var selectStmt = connection.prepareStatement(selectSql)) { - selectStmt.setLong(1, System.currentTimeMillis() - UNREGISTERED_LIFESPAN); final var recipientIds = Utils.executeQueryForStream(selectStmt, this::getRecipientIdFromResultSet) .toList(); try (final var updateStmt = connection.prepareStatement(updateSql)) { @@ -735,14 +732,25 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re final StorageId storageId, final byte[] storageRecord ) throws SQLException { - final var sql = ( + final var deleteSql = ( + """ + UPDATE %s + SET storage_id = NULL + WHERE storage_id = ? + """ + ).formatted(TABLE_RECIPIENT); + try (final var statement = connection.prepareStatement(deleteSql)) { + statement.setBytes(1, storageId.getRaw()); + statement.executeUpdate(); + } + final var insertSql = ( """ UPDATE %s SET storage_id = ?, storage_record = ? WHERE _id = ? """ ).formatted(TABLE_RECIPIENT); - try (final var statement = connection.prepareStatement(sql)) { + try (final var statement = connection.prepareStatement(insertSql)) { statement.setBytes(1, storageId.getRaw()); if (storageRecord == null) { statement.setNull(2, Types.BLOB); @@ -846,7 +854,7 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re """ UPDATE %s SET storage_id = NULL - WHERE storage_id = ? AND storage_id IS NOT NULL AND unregistered_timestamp IS NOT NULL + WHERE storage_id = ? AND unregistered_timestamp IS NOT NULL """ ).formatted(TABLE_RECIPIENT); var count = 0; @@ -1002,6 +1010,7 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re } if (!pair.second().isEmpty()) { + logger.debug("Resolved address {}, merging {} other recipients", address, pair.second().size()); try (final var connection = database.getConnection()) { connection.setAutoCommit(false); mergeRecipients(connection, pair.first(), pair.second()); diff --git a/lib/src/main/java/org/asamk/signal/manager/syncStorage/ContactRecordProcessor.java b/lib/src/main/java/org/asamk/signal/manager/syncStorage/ContactRecordProcessor.java index 2e557e1a..6114a018 100644 --- a/lib/src/main/java/org/asamk/signal/manager/syncStorage/ContactRecordProcessor.java +++ b/lib/src/main/java/org/asamk/signal/manager/syncStorage/ContactRecordProcessor.java @@ -105,8 +105,12 @@ public class ContactRecordProcessor extends DefaultStorageRecordProcessor