Separate capability reads from writes and introduce gv2-2 write flag.
This commit is contained in:
parent
15ee8c6cac
commit
74e94f3a97
8 changed files with 96 additions and 22 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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:" +
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Reference in a new issue