Separate capability reads from writes and introduce gv2-2 write flag.

This commit is contained in:
Alan Evans 2020-09-22 11:09:51 -03:00 committed by Greyson Parrelli
parent 15ee8c6cac
commit 74e94f3a97
8 changed files with 96 additions and 22 deletions

View file

@ -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);
}
}

View file

@ -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:" +

View file

@ -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")

View file

@ -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
{

View file

@ -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;
}
}
}

View file

@ -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;
}

View file

@ -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
{

View file

@ -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);
}
}