From 415b65d2080822030aebe53cc0b752a722d713aa Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 19 Nov 2021 17:17:13 +0100 Subject: [PATCH] Only store recipient if there were changes --- graalvm-config-dir/resource-config.json | 21 ++++++++++++++ .../manager/helper/AttachmentHelper.java | 4 ++- .../signal/manager/helper/StorageHelper.java | 1 + .../manager/storage/recipients/Contact.java | 19 +++++++++++++ .../manager/storage/recipients/Profile.java | 28 +++++++++++++++++++ .../manager/storage/recipients/Recipient.java | 20 +++++++++++++ .../storage/recipients/RecipientStore.java | 19 +++++++++---- .../commands/ListIdentitiesCommand.java | 3 +- 8 files changed, 107 insertions(+), 8 deletions(-) diff --git a/graalvm-config-dir/resource-config.json b/graalvm-config-dir/resource-config.json index 54fbfb2a..f14c8491 100644 --- a/graalvm-config-dir/resource-config.json +++ b/graalvm-config-dir/resource-config.json @@ -37,6 +37,9 @@ { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM\\E" }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR\\E" + }, { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS\\E" }, @@ -46,6 +49,9 @@ { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH\\E" }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN\\E" + }, { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ\\E" }, @@ -70,6 +76,15 @@ { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR\\E" }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK\\E" + }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU\\E" + }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID\\E" + }, { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL\\E" }, @@ -85,6 +100,9 @@ { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO\\E" }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY\\E" + }, { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL\\E" }, @@ -106,6 +124,9 @@ { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA\\E" }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG\\E" + }, { "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US\\E" }, diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/AttachmentHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/AttachmentHelper.java index 449a575e..4944c7b3 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/AttachmentHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/AttachmentHelper.java @@ -94,8 +94,10 @@ public class AttachmentHelper { return; } + final var pointer = attachment.asPointer(); + logger.debug("Retrieving attachment {} with size {}", pointer.getRemoteId(), pointer.getSize()); var tmpFile = IOUtils.createTempFile(); - try (var input = retrieveAttachmentAsStream(attachment.asPointer(), tmpFile)) { + try (var input = retrieveAttachmentAsStream(pointer, tmpFile)) { consumer.handle(input); } finally { try { 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 25ffe1fd..4548b420 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 @@ -83,6 +83,7 @@ public class StorageHelper { readContactRecord(record); } } + logger.debug("Done reading data from remote storage"); } private void readContactRecord(final SignalStorageRecord record) { diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Contact.java b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Contact.java index f2867c9f..c03f5c7f 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Contact.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Contact.java @@ -1,5 +1,7 @@ package org.asamk.signal.manager.storage.recipients; +import java.util.Objects; + public class Contact { private final String name; @@ -68,6 +70,23 @@ public class Contact { return archived; } + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final Contact contact = (Contact) o; + return messageExpirationTime == contact.messageExpirationTime + && blocked == contact.blocked + && archived == contact.archived + && Objects.equals(name, contact.name) + && Objects.equals(color, contact.color); + } + + @Override + public int hashCode() { + return Objects.hash(name, color, messageExpirationTime, blocked, archived); + } + public static final class Builder { private String name; diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Profile.java b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Profile.java index c6ba5c92..44ee5f6d 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Profile.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Profile.java @@ -3,6 +3,7 @@ package org.asamk.signal.manager.storage.recipients; import org.whispersystems.signalservice.internal.util.Util; import java.util.Collections; +import java.util.Objects; import java.util.Set; public class Profile { @@ -156,6 +157,33 @@ public class Profile { } } + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final Profile profile = (Profile) o; + return lastUpdateTimestamp == profile.lastUpdateTimestamp + && Objects.equals(givenName, profile.givenName) + && Objects.equals(familyName, profile.familyName) + && Objects.equals(about, profile.about) + && Objects.equals(aboutEmoji, profile.aboutEmoji) + && Objects.equals(avatarUrlPath, profile.avatarUrlPath) + && unidentifiedAccessMode == profile.unidentifiedAccessMode + && Objects.equals(capabilities, profile.capabilities); + } + + @Override + public int hashCode() { + return Objects.hash(lastUpdateTimestamp, + givenName, + familyName, + about, + aboutEmoji, + avatarUrlPath, + unidentifiedAccessMode, + capabilities); + } + public static final class Builder { private String givenName; diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Recipient.java b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Recipient.java index 2d2950dc..df7d10aa 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Recipient.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Recipient.java @@ -3,6 +3,8 @@ package org.asamk.signal.manager.storage.recipients; import org.signal.zkgroup.profiles.ProfileKey; import org.signal.zkgroup.profiles.ProfileKeyCredential; +import java.util.Objects; + public class Recipient { private final RecipientId recipientId; @@ -81,6 +83,24 @@ public class Recipient { return profile; } + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final Recipient recipient = (Recipient) o; + return Objects.equals(recipientId, recipient.recipientId) + && Objects.equals(address, recipient.address) + && Objects.equals(contact, recipient.contact) + && Objects.equals(profileKey, recipient.profileKey) + && Objects.equals(profileKeyCredential, recipient.profileKeyCredential) + && Objects.equals(profile, recipient.profile); + } + + @Override + public int hashCode() { + return Objects.hash(recipientId, address, contact, profileKey, profileKeyCredential, profile); + } + public static final class Builder { private RecipientId recipientId; 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 2f07bd2e..82db8946 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 @@ -130,10 +130,7 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile public Recipient getRecipient(RecipientId recipientId) { synchronized (recipients) { - while (recipientsMerged.containsKey(recipientId)) { - recipientId = recipientsMerged.get(recipientId); - } - return recipients.get(recipientId); + return getRecipientLocked(recipientId); } } @@ -378,11 +375,21 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile storeRecipientLocked(recipientId, Recipient.newBuilder(recipient).withAddress(address).build()); } + private Recipient getRecipientLocked(RecipientId recipientId) { + while (recipientsMerged.containsKey(recipientId)) { + recipientId = recipientsMerged.get(recipientId); + } + return recipients.get(recipientId); + } + private void storeRecipientLocked( final RecipientId recipientId, final Recipient recipient ) { - recipients.put(recipientId, recipient); - saveLocked(); + final var existingRecipient = getRecipientLocked(recipientId); + if (existingRecipient == null || !existingRecipient.equals(recipient)) { + recipients.put(recipientId, recipient); + saveLocked(); + } } private void mergeRecipientsLocked(RecipientId recipientId, RecipientId toBeMergedRecipientId) { diff --git a/src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java b/src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java index 04cc00a0..c3cfbce8 100644 --- a/src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java +++ b/src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java @@ -17,6 +17,7 @@ import org.slf4j.LoggerFactory; import java.util.Base64; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; public class ListIdentitiesCommand implements JsonRpcLocalCommand { @@ -67,7 +68,7 @@ public class ListIdentitiesCommand implements JsonRpcLocalCommand { var safetyNumber = Util.formatSafetyNumber(id.safetyNumber()); var scannableSafetyNumber = id.scannableSafetyNumber(); return new JsonIdentity(address.getNumber().orElse(null), - address.getUuid().toString(), + address.getUuid().map(UUID::toString).orElse(null), Hex.toString(id.getFingerprint()), safetyNumber, scannableSafetyNumber == null -- 2.50.1