diff --git a/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.java b/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.java new file mode 100644 index 0000000000..6f6e2116dc --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/AppCapabilities.java @@ -0,0 +1,17 @@ +package org.thoughtcrime.securesms; + +import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; + +public final class AppCapabilities { + + private AppCapabilities() { + } + + private static final boolean UUID_CAPABLE = false; + private static final boolean GROUPS_V2_CAPABLE = false; + + public static SignalServiceProfile.Capabilities getCapabilities() { + return new SignalServiceProfile.Capabilities(UUID_CAPABLE, + GROUPS_V2_CAPABLE); + } +} 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 687c21ea87..f4771b6fad 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.jobs; import androidx.annotation.NonNull; +import org.thoughtcrime.securesms.AppCapabilities; import org.thoughtcrime.securesms.crypto.ProfileKeyUtil; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.Data; @@ -64,7 +65,8 @@ public class RefreshAttributesJob extends BaseJob { SignalServiceAccountManager signalAccountManager = ApplicationDependencies.getSignalServiceAccountManager(); signalAccountManager.setAccountAttributes(null, registrationId, fetchesMessages, pin, registrationLockToken, - unidentifiedAccessKey, universalUnidentifiedAccess); + unidentifiedAccessKey, universalUnidentifiedAccess, + AppCapabilities.getCapabilities()); } @Override 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 495a213162..43bd63b5ce 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 @@ -7,6 +7,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.signal.zkgroup.profiles.ProfileKey; +import org.thoughtcrime.securesms.AppCapabilities; import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; import org.thoughtcrime.securesms.crypto.PreKeyUtil; import org.thoughtcrime.securesms.crypto.ProfileKeyUtil; @@ -216,7 +217,8 @@ public final class CodeVerificationRequest { UUID uuid = accountManager.verifyAccountWithCode(code, null, registrationId, !present, pinForServer, registrationLock, - unidentifiedAccessKey, universalUnidentifiedAccess); + unidentifiedAccessKey, universalUnidentifiedAccess, + AppCapabilities.getCapabilities()); IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(context); List records = PreKeyUtil.generatePreKeys(context); 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 c61906c3c0..fce5221b66 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 @@ -27,6 +27,7 @@ import org.whispersystems.signalservice.api.push.exceptions.NoContentException; import org.whispersystems.signalservice.api.storage.StorageKey; import org.whispersystems.signalservice.api.messages.calls.TurnServerInfo; import org.whispersystems.signalservice.api.messages.multidevice.DeviceInfo; +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; @@ -221,7 +222,8 @@ public class SignalServiceAccountManager { */ public UUID verifyAccountWithCode(String verificationCode, String signalingKey, int signalProtocolRegistrationId, boolean fetchesMessages, String pin, String registrationLock, - byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) + byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess, + SignalServiceProfile.Capabilities capabilities) throws IOException { return this.pushServiceSocket.verifyAccountCode(verificationCode, signalingKey, @@ -229,7 +231,8 @@ public class SignalServiceAccountManager { fetchesMessages, pin, registrationLock, unidentifiedAccessKey, - unrestrictedUnidentifiedAccess); + unrestrictedUnidentifiedAccess, + capabilities); } /** @@ -247,12 +250,14 @@ public class SignalServiceAccountManager { */ public void setAccountAttributes(String signalingKey, int signalProtocolRegistrationId, boolean fetchesMessages, String pin, String registrationLock, - byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) + byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess, + SignalServiceProfile.Capabilities capabilities) throws IOException { this.pushServiceSocket.setAccountAttributes(signalingKey, signalProtocolRegistrationId, fetchesMessages, pin, registrationLock, - unidentifiedAccessKey, unrestrictedUnidentifiedAccess); + unidentifiedAccessKey, unrestrictedUnidentifiedAccess, + capabilities); } /** 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 03a5586634..f083387dbd 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 @@ -1,6 +1,7 @@ package org.whispersystems.signalservice.api.profiles; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @@ -104,8 +105,14 @@ public class SignalServiceProfile { @JsonProperty private boolean gv2; + @JsonCreator public Capabilities() {} + public Capabilities(boolean uuid, boolean gv2) { + this.uuid = uuid; + this.gv2 = gv2; + } + public boolean isUuid() { return uuid; } 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 ad881637d3..9d9cfcc170 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 @@ -8,6 +8,8 @@ package org.whispersystems.signalservice.internal.push; import com.fasterxml.jackson.annotation.JsonProperty; +import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; + public class AccountAttributes { @JsonProperty @@ -37,7 +39,18 @@ public class AccountAttributes { @JsonProperty private boolean unrestrictedUnidentifiedAccess; - public AccountAttributes(String signalingKey, int registrationId, boolean fetchesMessages, String pin, String registrationLock, byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) { + @JsonProperty + private SignalServiceProfile.Capabilities capabilities; + + public AccountAttributes(String signalingKey, + int registrationId, + boolean fetchesMessages, + String pin, + String registrationLock, + byte[] unidentifiedAccessKey, + boolean unrestrictedUnidentifiedAccess, + SignalServiceProfile.Capabilities capabilities) + { this.signalingKey = signalingKey; this.registrationId = registrationId; this.voice = true; @@ -47,6 +60,7 @@ public class AccountAttributes { this.registrationLock = registrationLock; this.unidentifiedAccessKey = unidentifiedAccessKey; this.unrestrictedUnidentifiedAccess = unrestrictedUnidentifiedAccess; + this.capabilities = capabilities; } public AccountAttributes() {} @@ -86,4 +100,8 @@ public class AccountAttributes { public boolean isUnrestrictedUnidentifiedAccess() { return unrestrictedUnidentifiedAccess; } + + 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 7538317cbf..5db8417ad5 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 @@ -249,10 +249,11 @@ public class PushServiceSocket { public UUID verifyAccountCode(String verificationCode, String signalingKey, int registrationId, boolean fetchesMessages, String pin, String registrationLock, - byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) + byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess, + SignalServiceProfile.Capabilities capabilities) throws IOException { - AccountAttributes signalingKeyEntity = new AccountAttributes(signalingKey, registrationId, fetchesMessages, pin, registrationLock, unidentifiedAccessKey, unrestrictedUnidentifiedAccess); + AccountAttributes signalingKeyEntity = new AccountAttributes(signalingKey, registrationId, fetchesMessages, pin, registrationLock, unidentifiedAccessKey, unrestrictedUnidentifiedAccess, capabilities); String requestBody = JsonUtil.toJson(signalingKeyEntity); String responseBody = makeServiceRequest(String.format(VERIFY_ACCOUNT_CODE_PATH, verificationCode), "PUT", requestBody); VerifyAccountResponse response = JsonUtil.fromJson(responseBody, VerifyAccountResponse.class); @@ -267,7 +268,8 @@ public class PushServiceSocket { public void setAccountAttributes(String signalingKey, int registrationId, boolean fetchesMessages, String pin, String registrationLock, - byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) + byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess, + SignalServiceProfile.Capabilities capabilities) throws IOException { if (registrationLock != null && pin != null) { @@ -275,7 +277,7 @@ public class PushServiceSocket { } AccountAttributes accountAttributes = new AccountAttributes(signalingKey, registrationId, fetchesMessages, pin, registrationLock, - unidentifiedAccessKey, unrestrictedUnidentifiedAccess); + unidentifiedAccessKey, unrestrictedUnidentifiedAccess, capabilities); makeServiceRequest(SET_ACCOUNT_ATTRIBUTES, "PUT", JsonUtil.toJson(accountAttributes)); }