diff --git a/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.java b/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.java index a6dd4e5ea3..4a14180f09 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.java +++ b/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.java @@ -1,7 +1,7 @@ package org.thoughtcrime.securesms; import org.thoughtcrime.securesms.util.FeatureFlags; -import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; +import org.whispersystems.signalservice.api.account.AccountAttributes; public final class AppCapabilities { @@ -14,7 +14,7 @@ public final class AppCapabilities { * @param storageCapable Whether or not the user can use storage service. This is another way of * asking if the user has set a Signal PIN or not. */ - public static SignalServiceProfile.Capabilities getCapabilities(boolean storageCapable) { - return new SignalServiceProfile.Capabilities(UUID_CAPABLE, FeatureFlags.groupsV2(), storageCapable); + public static AccountAttributes.Capabilities getCapabilities(boolean storageCapable) { + return new AccountAttributes.Capabilities(UUID_CAPABLE, FeatureFlags.groupsV2(), storageCapable); } } 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 553f40e48a..2af0325c42 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java @@ -16,8 +16,8 @@ import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.crypto.UnidentifiedAccess; -import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException; +import org.whispersystems.signalservice.api.account.AccountAttributes; import java.io.IOException; @@ -73,7 +73,7 @@ public class RefreshAttributesJob extends BaseJob { boolean phoneNumberDiscoverable = SignalStore.phoneNumberPrivacy().getPhoneNumberListingMode().isDiscoverable(); - SignalServiceProfile.Capabilities capabilities = AppCapabilities.getCapabilities(kbsValues.hasPin() && !kbsValues.hasOptedOut()); + AccountAttributes.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:" + diff --git a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionCapabilities.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionCapabilities.java index 9c49dc37a1..ec7329c35f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionCapabilities.java +++ b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionCapabilities.java @@ -7,7 +7,7 @@ import androidx.annotation.NonNull; import org.thoughtcrime.securesms.AppCapabilities; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; +import org.whispersystems.signalservice.api.account.AccountAttributes; public final class LogSectionCapabilities implements LogSection { @@ -28,7 +28,7 @@ public final class LogSectionCapabilities implements LogSection { Recipient self = Recipient.self(); - SignalServiceProfile.Capabilities capabilities = AppCapabilities.getCapabilities(false); + AccountAttributes.Capabilities capabilities = AppCapabilities.getCapabilities(false); return new StringBuilder().append("Local device UUID : ").append(capabilities.isUuid()).append("\n") .append("Global UUID : ").append(self.getUuidCapability()).append("\n") 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 b20351f56b..73586bd2a9 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 @@ -29,7 +29,6 @@ import org.whispersystems.signalservice.api.kbs.MasterKey; import org.whispersystems.signalservice.api.messages.calls.TurnServerInfo; import org.whispersystems.signalservice.api.messages.multidevice.DeviceInfo; import org.whispersystems.signalservice.api.profiles.ProfileAndCredential; -import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; import org.whispersystems.signalservice.api.profiles.SignalServiceProfileWrite; import org.whispersystems.signalservice.api.push.ContactTokenDetails; import org.whispersystems.signalservice.api.push.SignedPreKeyEntity; @@ -55,6 +54,7 @@ import org.whispersystems.signalservice.internal.contacts.crypto.Unauthenticated import org.whispersystems.signalservice.internal.contacts.entities.DiscoveryRequest; import org.whispersystems.signalservice.internal.contacts.entities.DiscoveryResponse; import org.whispersystems.signalservice.internal.crypto.ProvisioningCipher; +import org.whispersystems.signalservice.api.account.AccountAttributes; import org.whispersystems.signalservice.internal.push.ProfileAvatarData; import org.whispersystems.signalservice.internal.push.PushServiceSocket; import org.whispersystems.signalservice.internal.push.RemoteAttestationUtil; @@ -244,7 +244,7 @@ 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, + AccountAttributes.Capabilities capabilities, boolean discoverableByPhoneNumber) throws IOException { @@ -274,7 +274,7 @@ public class SignalServiceAccountManager { public void setAccountAttributes(String signalingKey, int signalProtocolRegistrationId, boolean fetchesMessages, String pin, String registrationLock, byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess, - SignalServiceProfile.Capabilities capabilities, + AccountAttributes.Capabilities capabilities, boolean discoverableByPhoneNumber) throws IOException { diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/AccountAttributes.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/account/AccountAttributes.java similarity index 76% rename from libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/AccountAttributes.java rename to libsignal/service/src/main/java/org/whispersystems/signalservice/api/account/AccountAttributes.java index 5e7eb4956e..2825b0f01b 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/AccountAttributes.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/account/AccountAttributes.java @@ -4,8 +4,9 @@ * Licensed according to the LICENSE file in this repository. */ -package org.whispersystems.signalservice.internal.push; +package org.whispersystems.signalservice.api.account; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; @@ -43,7 +44,7 @@ public class AccountAttributes { private boolean discoverableByPhoneNumber; @JsonProperty - private SignalServiceProfile.Capabilities capabilities; + private Capabilities capabilities; public AccountAttributes(String signalingKey, int registrationId, @@ -52,7 +53,7 @@ public class AccountAttributes { String registrationLock, byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess, - SignalServiceProfile.Capabilities capabilities, + Capabilities capabilities, boolean discoverableByPhoneNumber) { this.signalingKey = signalingKey; @@ -110,7 +111,39 @@ public class AccountAttributes { return discoverableByPhoneNumber; } - public SignalServiceProfile.Capabilities getCapabilities() { + public Capabilities getCapabilities() { return capabilities; } + + public static class Capabilities { + @JsonProperty + private boolean uuid; + + @JsonProperty("gv2-2") + private boolean gv2; + + @JsonProperty + private boolean storage; + + @JsonCreator + public Capabilities() {} + + public Capabilities(boolean uuid, boolean gv2, boolean storage) { + this.uuid = uuid; + this.gv2 = gv2; + this.storage = storage; + } + + public boolean isUuid() { + return uuid; + } + + public boolean isGv2() { + return gv2; + } + + public boolean isStorage() { + return storage; + } + } } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/profiles/SignalServiceProfile.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/profiles/SignalServiceProfile.java index 21d0f0ad74..219e4ca323 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/profiles/SignalServiceProfile.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/profiles/SignalServiceProfile.java @@ -103,12 +103,6 @@ public class SignalServiceProfile { @JsonCreator public Capabilities() {} - public Capabilities(boolean uuid, boolean gv2, boolean storage) { - this.uuid = uuid; - this.gv2 = gv2; - this.storage = storage; - } - public boolean isUuid() { return uuid; } 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 b82487b722..414ef0b41d 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 @@ -32,6 +32,7 @@ import org.whispersystems.libsignal.state.PreKeyRecord; import org.whispersystems.libsignal.state.SignedPreKeyRecord; import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.guava.Optional; +import org.whispersystems.signalservice.api.account.AccountAttributes; import org.whispersystems.signalservice.api.crypto.UnidentifiedAccess; import org.whispersystems.signalservice.api.groupsv2.CredentialResponse; import org.whispersystems.signalservice.api.groupsv2.GroupsV2AuthorizationString; @@ -293,7 +294,7 @@ 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, + AccountAttributes.Capabilities capabilities, boolean discoverableByPhoneNumber) throws IOException { @@ -307,7 +308,7 @@ public class PushServiceSocket { public void setAccountAttributes(String signalingKey, int registrationId, boolean fetchesMessages, String pin, String registrationLock, byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess, - SignalServiceProfile.Capabilities capabilities, + AccountAttributes.Capabilities capabilities, boolean discoverableByPhoneNumber) throws IOException { diff --git a/libsignal/service/src/test/java/org/whispersystems/signalservice/api/account/AccountAttributesTest.java b/libsignal/service/src/test/java/org/whispersystems/signalservice/api/account/AccountAttributesTest.java new file mode 100644 index 0000000000..f2cc73126b --- /dev/null +++ b/libsignal/service/src/test/java/org/whispersystems/signalservice/api/account/AccountAttributesTest.java @@ -0,0 +1,46 @@ +package org.whispersystems.signalservice.api.account; + +import org.junit.Test; +import org.whispersystems.signalservice.internal.util.JsonUtil; + +import static org.junit.Assert.assertEquals; + +public final class AccountAttributesTest { + + @Test + public void can_write_account_attributes() { + String json = JsonUtil.toJson(new AccountAttributes("skey", + 123, + true, + "1234", + "reglock1234", + new byte[10], + false, + new AccountAttributes.Capabilities(true, true, true), + false)); + assertEquals("{\"signalingKey\":\"skey\"," + + "\"registrationId\":123," + + "\"voice\":true," + + "\"video\":true," + + "\"fetchesMessages\":true," + + "\"pin\":\"1234\"," + + "\"registrationLock\":\"reglock1234\"," + + "\"unidentifiedAccessKey\":\"AAAAAAAAAAAAAA==\"," + + "\"unrestrictedUnidentifiedAccess\":false," + + "\"discoverableByPhoneNumber\":false," + + "\"capabilities\":{\"uuid\":true,\"storage\":true,\"gv2-2\":true}}", json); + } + + @Test + public void gv2_true() { + String json = JsonUtil.toJson(new AccountAttributes.Capabilities(false, true, false)); + assertEquals("{\"uuid\":false,\"storage\":false,\"gv2-2\":true}", json); + } + + @Test + public void gv2_false() { + String json = JsonUtil.toJson(new AccountAttributes.Capabilities(false, false, false)); + assertEquals("{\"uuid\":false,\"storage\":false,\"gv2-2\":false}", json); + } + +} \ No newline at end of file