From: AsamK Date: Wed, 10 Nov 2021 13:14:19 +0000 (+0100) Subject: Read phone number sharing mode from storage X-Git-Tag: v0.10.0~64 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/4baf0849a6f61f7769efe45723a51cd32df1fd90?ds=sidebyside Read phone number sharing mode from storage Fixes #755 --- diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index fe1cf4cb..418701cb 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -39,6 +39,10 @@ "allDeclaredFields":true, "allDeclaredMethods":true} , +{ + "name":"com.google.protobuf.GeneratedMessageLite", + "fields":[{"name":"unknownFields"}]} +, { "name":"com.google.protobuf.Internal$LongList", "allDeclaredMethods":true} @@ -659,13 +663,19 @@ "allDeclaredConstructors":true} , { - "name":"org.asamk.signal.manager.configuration.ConfigurationStore$Storage", + "name":"org.asamk.signal.manager.api.PhoneNumberSharingMode", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true} +, +{ + "name":"org.asamk.signal.manager.storage.configuration.ConfigurationStore$Storage", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, "methods":[ - {"name":"","parameterTypes":["java.lang.Boolean","java.lang.Boolean","java.lang.Boolean","java.lang.Boolean"] }, + {"name":"","parameterTypes":["java.lang.Boolean","java.lang.Boolean","java.lang.Boolean","java.lang.Boolean","org.asamk.signal.manager.api.PhoneNumberSharingMode"] }, {"name":"linkPreviews","parameterTypes":[] }, + {"name":"phoneNumberSharingMode","parameterTypes":[] }, {"name":"readReceipts","parameterTypes":[] }, {"name":"typingIndicators","parameterTypes":[] }, {"name":"unidentifiedDeliveryIndicators","parameterTypes":[] } @@ -2492,6 +2502,79 @@ {"name":"metadata_"} ]} , +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.AccountRecord", + "allDeclaredFields":true} +, +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.AccountRecord$PinnedConversation", + "fields":[ + {"name":"identifierCase_"}, + {"name":"identifier_"} + ]} +, +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.AccountRecord$PinnedConversation$Contact", + "fields":[ + {"name":"e164_"}, + {"name":"uuid_"} + ]} +, +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.ContactRecord", + "allDeclaredFields":true} +, +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.GroupV2Record", + "allDeclaredFields":true} +, +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.ManifestRecord", + "fields":[ + {"name":"identifiers_"}, + {"name":"version_"} + ]} +, +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.ManifestRecord$Identifier", + "fields":[ + {"name":"raw_"}, + {"name":"type_"} + ]} +, +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.Payments", + "allDeclaredFields":true} +, +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.ReadOperation", + "fields":[{"name":"readKey_"}]} +, +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.StorageItem", + "fields":[ + {"name":"key_"}, + {"name":"value_"} + ]} +, +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.StorageItems", + "fields":[{"name":"items_"}]} +, +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.StorageManifest", + "fields":[ + {"name":"value_"}, + {"name":"version_"} + ]} +, +{ + "name":"org.whispersystems.signalservice.internal.storage.protos.StorageRecord", + "fields":[ + {"name":"recordCase_"}, + {"name":"record_"} + ]} +, { "name":"org.whispersystems.signalservice.internal.util.JsonUtil$AciDeserializer", "methods":[{"name":"","parameterTypes":[] }]} diff --git a/lib/src/main/java/org/asamk/signal/manager/api/PhoneNumberSharingMode.java b/lib/src/main/java/org/asamk/signal/manager/api/PhoneNumberSharingMode.java new file mode 100644 index 00000000..9efa01be --- /dev/null +++ b/lib/src/main/java/org/asamk/signal/manager/api/PhoneNumberSharingMode.java @@ -0,0 +1,7 @@ +package org.asamk.signal.manager.api; + +public enum PhoneNumberSharingMode { + EVERYBODY, + CONTACTS, + NOBODY, +} 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 7c7b34cc..0bc0d02b 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 @@ -2,6 +2,7 @@ package org.asamk.signal.manager.helper; import org.asamk.signal.manager.SignalDependencies; import org.asamk.signal.manager.TrustLevel; +import org.asamk.signal.manager.api.PhoneNumberSharingMode; import org.asamk.signal.manager.groups.GroupId; import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.storage.recipients.Contact; @@ -17,6 +18,7 @@ import org.whispersystems.signalservice.api.storage.SignalAccountRecord; import org.whispersystems.signalservice.api.storage.SignalStorageManifest; import org.whispersystems.signalservice.api.storage.SignalStorageRecord; import org.whispersystems.signalservice.api.storage.StorageId; +import org.whispersystems.signalservice.internal.storage.protos.AccountRecord; import org.whispersystems.signalservice.internal.storage.protos.ManifestRecord; import java.io.IOException; @@ -202,6 +204,14 @@ public class StorageHelper { account.getConfigurationStore() .setUnidentifiedDeliveryIndicators(accountRecord.isSealedSenderIndicatorsEnabled()); account.getConfigurationStore().setLinkPreviews(accountRecord.isLinkPreviewsEnabled()); + if (accountRecord.getPhoneNumberSharingMode() != AccountRecord.PhoneNumberSharingMode.UNRECOGNIZED) { + account.getConfigurationStore() + .setPhoneNumberSharingMode(switch (accountRecord.getPhoneNumberSharingMode()) { + case EVERYBODY -> PhoneNumberSharingMode.EVERYBODY; + case NOBODY -> PhoneNumberSharingMode.NOBODY; + default -> PhoneNumberSharingMode.CONTACTS; + }); + } if (accountRecord.getProfileKey().isPresent()) { ProfileKey profileKey; diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/UnidentifiedAccessHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/UnidentifiedAccessHelper.java index 661a7f96..8294c463 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/UnidentifiedAccessHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/UnidentifiedAccessHelper.java @@ -1,6 +1,7 @@ package org.asamk.signal.manager.helper; import org.asamk.signal.manager.SignalDependencies; +import org.asamk.signal.manager.api.PhoneNumberSharingMode; import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.storage.recipients.RecipientId; import org.signal.libsignal.metadata.certificate.InvalidCertificateException; @@ -37,20 +38,38 @@ public class UnidentifiedAccessHelper { this.profileProvider = profileProvider; } - private byte[] getSenderCertificate() { - byte[] certificate; + private byte[] getSenderCertificateFor(final RecipientId recipientId) { + final var sharingMode = account.getConfigurationStore().getPhoneNumberSharingMode(); + if (sharingMode == PhoneNumberSharingMode.EVERYBODY || ( + sharingMode == PhoneNumberSharingMode.CONTACTS + && account.getContactStore().getContact(recipientId) != null + )) { + logger.debug("Using normal sender certificate for message to {}", recipientId); + return getSenderCertificate(); + } else { + logger.debug("Using phone number privacy sender certificate for message to {}", recipientId); + return getSenderCertificateForPhoneNumberPrivacy(); + } + } + + private byte[] getSenderCertificateForPhoneNumberPrivacy() { + // TODO cache for a day try { - if (account.isPhoneNumberShared()) { - certificate = dependencies.getAccountManager().getSenderCertificate(); - } else { - certificate = dependencies.getAccountManager().getSenderCertificateForPhoneNumberPrivacy(); - } + return dependencies.getAccountManager().getSenderCertificateForPhoneNumberPrivacy(); } catch (IOException e) { logger.warn("Failed to get sender certificate, ignoring: {}", e.getMessage()); return null; } + } + + private byte[] getSenderCertificate() { // TODO cache for a day - return certificate; + try { + return dependencies.getAccountManager().getSenderCertificate(); + } catch (IOException e) { + logger.warn("Failed to get sender certificate, ignoring: {}", e.getMessage()); + return null; + } } private byte[] getSelfUnidentifiedAccessKey() { @@ -102,7 +121,7 @@ public class UnidentifiedAccessHelper { public Optional getAccessFor(RecipientId recipient) { var recipientUnidentifiedAccessKey = getTargetUnidentifiedAccessKey(recipient); var selfUnidentifiedAccessKey = getSelfUnidentifiedAccessKey(); - var selfUnidentifiedAccessCertificate = getSenderCertificate(); + var selfUnidentifiedAccessCertificate = getSenderCertificateFor(recipient); if (recipientUnidentifiedAccessKey == null || selfUnidentifiedAccessKey == null 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 1f6b3d87..1fc405bd 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 @@ -5,8 +5,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.asamk.signal.manager.TrustLevel; import org.asamk.signal.manager.api.Pair; -import org.asamk.signal.manager.configuration.ConfigurationStore; import org.asamk.signal.manager.groups.GroupId; +import org.asamk.signal.manager.storage.configuration.ConfigurationStore; import org.asamk.signal.manager.storage.contacts.ContactsStore; import org.asamk.signal.manager.storage.contacts.LegacyJsonContactsStore; import org.asamk.signal.manager.storage.groups.GroupInfoV1; @@ -987,11 +987,6 @@ public class SignalAccount implements Closeable { return true; } - public boolean isPhoneNumberShared() { - // TODO make configurable - return true; - } - public void finishRegistration(final ACI aci, final MasterKey masterKey, final String pin) { this.pinMasterKey = masterKey; this.storageManifestVersion = -1; diff --git a/lib/src/main/java/org/asamk/signal/manager/configuration/ConfigurationStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/configuration/ConfigurationStore.java similarity index 66% rename from lib/src/main/java/org/asamk/signal/manager/configuration/ConfigurationStore.java rename to lib/src/main/java/org/asamk/signal/manager/storage/configuration/ConfigurationStore.java index 09d5162e..793683e6 100644 --- a/lib/src/main/java/org/asamk/signal/manager/configuration/ConfigurationStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/configuration/ConfigurationStore.java @@ -1,4 +1,6 @@ -package org.asamk.signal.manager.configuration; +package org.asamk.signal.manager.storage.configuration; + +import org.asamk.signal.manager.api.PhoneNumberSharingMode; public class ConfigurationStore { @@ -8,6 +10,7 @@ public class ConfigurationStore { private Boolean unidentifiedDeliveryIndicators; private Boolean typingIndicators; private Boolean linkPreviews; + private PhoneNumberSharingMode phoneNumberSharingMode; public ConfigurationStore(final Saver saver) { this.saver = saver; @@ -19,6 +22,7 @@ public class ConfigurationStore { store.unidentifiedDeliveryIndicators = storage.unidentifiedDeliveryIndicators; store.typingIndicators = storage.typingIndicators; store.linkPreviews = storage.linkPreviews; + store.phoneNumberSharingMode = storage.phoneNumberSharingMode; return store; } @@ -58,12 +62,29 @@ public class ConfigurationStore { saver.save(toStorage()); } + public PhoneNumberSharingMode getPhoneNumberSharingMode() { + return phoneNumberSharingMode; + } + + public void setPhoneNumberSharingMode(final PhoneNumberSharingMode phoneNumberSharingMode) { + this.phoneNumberSharingMode = phoneNumberSharingMode; + saver.save(toStorage()); + } + private Storage toStorage() { - return new Storage(readReceipts, unidentifiedDeliveryIndicators, typingIndicators, linkPreviews); + return new Storage(readReceipts, + unidentifiedDeliveryIndicators, + typingIndicators, + linkPreviews, + phoneNumberSharingMode); } public record Storage( - Boolean readReceipts, Boolean unidentifiedDeliveryIndicators, Boolean typingIndicators, Boolean linkPreviews + Boolean readReceipts, + Boolean unidentifiedDeliveryIndicators, + Boolean typingIndicators, + Boolean linkPreviews, + PhoneNumberSharingMode phoneNumberSharingMode ) {} public interface Saver {