From 43ed9e73106d945cd00242de9b4b4ba26f830d7e Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Fri, 4 Sep 2020 16:59:24 -0300 Subject: [PATCH] Set discoverable account attribute. --- .../securesms/jobs/RefreshAttributesJob.java | 8 ++++++-- .../securesms/keyvalue/PhoneNumberPrivacyValues.java | 10 +++++++++- .../preferences/AppProtectionPreferenceFragment.java | 1 + .../service/CodeVerificationRequest.java | 4 +++- .../securesms/storage/StorageSyncHelper.java | 2 +- .../api/SignalServiceAccountManager.java | 12 ++++++++---- .../internal/push/AccountAttributes.java | 11 ++++++++++- .../internal/push/PushServiceSocket.java | 11 +++++++---- 8 files changed, 45 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java index 98801a20f..553f40e48 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java @@ -71,18 +71,22 @@ public class RefreshAttributesJob extends BaseJob { registrationLockV1 = TextSecurePreferences.getDeprecatedV1RegistrationLockPin(context); } + boolean phoneNumberDiscoverable = SignalStore.phoneNumberPrivacy().getPhoneNumberListingMode().isDiscoverable(); + SignalServiceProfile.Capabilities capabilities = AppCapabilities.getCapabilities(kbsValues.hasPin() && !kbsValues.hasOptedOut()); Log.i(TAG, "Calling setAccountAttributes() reglockV1? " + !TextUtils.isEmpty(registrationLockV1) + ", reglockV2? " + !TextUtils.isEmpty(registrationLockV2) + ", pin? " + kbsValues.hasPin() + + "\n Phone number discoverable : " + phoneNumberDiscoverable + "\n Capabilities:" + "\n Storage? " + capabilities.isStorage() + "\n GV2? " + capabilities.isGv2() + - "\n UUID? " + capabilities.isUuid()) ; + "\n UUID? " + capabilities.isUuid()); SignalServiceAccountManager signalAccountManager = ApplicationDependencies.getSignalServiceAccountManager(); signalAccountManager.setAccountAttributes(null, registrationId, fetchesMessages, registrationLockV1, registrationLockV2, unidentifiedAccessKey, universalUnidentifiedAccess, - capabilities); + capabilities, + phoneNumberDiscoverable); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues.java index 1215c60c8..4d013f7fb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues.java @@ -81,6 +81,14 @@ public final class PhoneNumberPrivacyValues extends SignalStoreValues { */ public enum PhoneNumberListingMode { LISTED, - UNLISTED + UNLISTED; + + public boolean isDiscoverable() { + return this == LISTED; + } + + public boolean isUnlisted() { + return this == UNLISTED; + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/AppProtectionPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/AppProtectionPreferenceFragment.java index 0f3bf4aa0..5d147200d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/AppProtectionPreferenceFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/AppProtectionPreferenceFragment.java @@ -599,6 +599,7 @@ public class AppProtectionPreferenceFragment extends CorrectedPreferenceFragment phoneNumberPrivacyValues.setPhoneNumberListingMode(phoneNumberListingMode); Log.i(TAG, String.format("PhoneNumberListingMode changed to %s. Scheduling storage value sync", phoneNumberListingMode)); StorageSyncHelper.scheduleSyncForDataChange(); + ApplicationDependencies.getJobManager().add(new RefreshAttributesJob()); initializePhoneNumberPrivacyWhoCanFindSummary(); }) .setNegativeButton(android.R.string.cancel, null) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/service/CodeVerificationRequest.java b/app/src/main/java/org/thoughtcrime/securesms/registration/service/CodeVerificationRequest.java index c132ba1a7..12e5483ea 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/service/CodeVerificationRequest.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/service/CodeVerificationRequest.java @@ -20,6 +20,7 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.JobManager; import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob; import org.thoughtcrime.securesms.jobs.RotateCertificateJob; +import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.pin.PinState; import org.thoughtcrime.securesms.push.AccountManagerFactory; @@ -220,7 +221,8 @@ public final class CodeVerificationRequest { registrationLockV2, unidentifiedAccessKey, universalUnidentifiedAccess, - AppCapabilities.getCapabilities(true)); + AppCapabilities.getCapabilities(true), + SignalStore.phoneNumberPrivacy().getPhoneNumberListingMode().isDiscoverable()); UUID uuid = UuidUtil.parseOrThrow(response.getUuid()); boolean hasPin = response.isStorageCapable(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java index 6c2fad47c..74d803511 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java @@ -399,7 +399,7 @@ public final class StorageSyncHelper { .setReadReceiptsEnabled(TextSecurePreferences.isReadReceiptsEnabled(context)) .setSealedSenderIndicatorsEnabled(TextSecurePreferences.isShowUnidentifiedDeliveryIndicatorsEnabled(context)) .setLinkPreviewsEnabled(SignalStore.settings().isLinkPreviewsEnabled()) - .setUnlistedPhoneNumber(SignalStore.phoneNumberPrivacy().getPhoneNumberListingMode() == PhoneNumberPrivacyValues.PhoneNumberListingMode.UNLISTED) + .setUnlistedPhoneNumber(SignalStore.phoneNumberPrivacy().getPhoneNumberListingMode().isUnlisted()) .setPhoneNumberSharingMode(localToRemotePhoneNumberSharingMode(SignalStore.phoneNumberPrivacy().getPhoneNumberSharingMode())) .build(); diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java index 6bd0d758f..6f62e5b7d 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java @@ -244,7 +244,8 @@ public class SignalServiceAccountManager { public VerifyAccountResponse verifyAccountWithCode(String verificationCode, String signalingKey, int signalProtocolRegistrationId, boolean fetchesMessages, String pin, String registrationLock, byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess, - SignalServiceProfile.Capabilities capabilities) + SignalServiceProfile.Capabilities capabilities, + boolean discoverableByPhoneNumber) throws IOException { return this.pushServiceSocket.verifyAccountCode(verificationCode, signalingKey, @@ -253,7 +254,8 @@ public class SignalServiceAccountManager { pin, registrationLock, unidentifiedAccessKey, unrestrictedUnidentifiedAccess, - capabilities); + capabilities, + discoverableByPhoneNumber); } /** @@ -272,13 +274,15 @@ public class SignalServiceAccountManager { public void setAccountAttributes(String signalingKey, int signalProtocolRegistrationId, boolean fetchesMessages, String pin, String registrationLock, byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess, - SignalServiceProfile.Capabilities capabilities) + SignalServiceProfile.Capabilities capabilities, + boolean discoverableByPhoneNumber) throws IOException { this.pushServiceSocket.setAccountAttributes(signalingKey, signalProtocolRegistrationId, fetchesMessages, pin, registrationLock, unidentifiedAccessKey, unrestrictedUnidentifiedAccess, - capabilities); + capabilities, + discoverableByPhoneNumber); } /** diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/AccountAttributes.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/AccountAttributes.java index 9d9cfcc17..5e7eb4956 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/AccountAttributes.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/AccountAttributes.java @@ -39,6 +39,9 @@ public class AccountAttributes { @JsonProperty private boolean unrestrictedUnidentifiedAccess; + @JsonProperty + private boolean discoverableByPhoneNumber; + @JsonProperty private SignalServiceProfile.Capabilities capabilities; @@ -49,7 +52,8 @@ public class AccountAttributes { String registrationLock, byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess, - SignalServiceProfile.Capabilities capabilities) + SignalServiceProfile.Capabilities capabilities, + boolean discoverableByPhoneNumber) { this.signalingKey = signalingKey; this.registrationId = registrationId; @@ -61,6 +65,7 @@ public class AccountAttributes { this.unidentifiedAccessKey = unidentifiedAccessKey; this.unrestrictedUnidentifiedAccess = unrestrictedUnidentifiedAccess; this.capabilities = capabilities; + this.discoverableByPhoneNumber = discoverableByPhoneNumber; } public AccountAttributes() {} @@ -101,6 +106,10 @@ public class AccountAttributes { return unrestrictedUnidentifiedAccess; } + public boolean isDiscoverableByPhoneNumber() { + return discoverableByPhoneNumber; + } + public SignalServiceProfile.Capabilities getCapabilities() { return capabilities; } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java index 858fe7108..11439ad2f 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java @@ -292,10 +292,11 @@ public class PushServiceSocket { public VerifyAccountResponse verifyAccountCode(String verificationCode, String signalingKey, int registrationId, boolean fetchesMessages, String pin, String registrationLock, byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess, - SignalServiceProfile.Capabilities capabilities) + SignalServiceProfile.Capabilities capabilities, + boolean discoverableByPhoneNumber) throws IOException { - AccountAttributes signalingKeyEntity = new AccountAttributes(signalingKey, registrationId, fetchesMessages, pin, registrationLock, unidentifiedAccessKey, unrestrictedUnidentifiedAccess, capabilities); + AccountAttributes signalingKeyEntity = new AccountAttributes(signalingKey, registrationId, fetchesMessages, pin, registrationLock, unidentifiedAccessKey, unrestrictedUnidentifiedAccess, capabilities, discoverableByPhoneNumber); String requestBody = JsonUtil.toJson(signalingKeyEntity); String responseBody = makeServiceRequest(String.format(VERIFY_ACCOUNT_CODE_PATH, verificationCode), "PUT", requestBody); @@ -305,7 +306,8 @@ public class PushServiceSocket { public void setAccountAttributes(String signalingKey, int registrationId, boolean fetchesMessages, String pin, String registrationLock, byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess, - SignalServiceProfile.Capabilities capabilities) + SignalServiceProfile.Capabilities capabilities, + boolean discoverableByPhoneNumber) throws IOException { if (registrationLock != null && pin != null) { @@ -313,7 +315,8 @@ public class PushServiceSocket { } AccountAttributes accountAttributes = new AccountAttributes(signalingKey, registrationId, fetchesMessages, pin, registrationLock, - unidentifiedAccessKey, unrestrictedUnidentifiedAccess, capabilities); + unidentifiedAccessKey, unrestrictedUnidentifiedAccess, capabilities, + discoverableByPhoneNumber); makeServiceRequest(SET_ACCOUNT_ATTRIBUTES, "PUT", JsonUtil.toJson(accountAttributes)); }