Write capabilities to service.

This commit is contained in:
Alan Evans 2020-03-02 12:01:50 -04:00 committed by GitHub
parent d2e94dad7e
commit ceb9e4aee2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 64 additions and 11 deletions

View File

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

View File

@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.AppCapabilities;
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil; import org.thoughtcrime.securesms.crypto.ProfileKeyUtil;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Data;
@ -64,7 +65,8 @@ public class RefreshAttributesJob extends BaseJob {
SignalServiceAccountManager signalAccountManager = ApplicationDependencies.getSignalServiceAccountManager(); SignalServiceAccountManager signalAccountManager = ApplicationDependencies.getSignalServiceAccountManager();
signalAccountManager.setAccountAttributes(null, registrationId, fetchesMessages, signalAccountManager.setAccountAttributes(null, registrationId, fetchesMessages,
pin, registrationLockToken, pin, registrationLockToken,
unidentifiedAccessKey, universalUnidentifiedAccess); unidentifiedAccessKey, universalUnidentifiedAccess,
AppCapabilities.getCapabilities());
} }
@Override @Override

View File

@ -7,6 +7,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import org.signal.zkgroup.profiles.ProfileKey; import org.signal.zkgroup.profiles.ProfileKey;
import org.thoughtcrime.securesms.AppCapabilities;
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; import org.thoughtcrime.securesms.crypto.IdentityKeyUtil;
import org.thoughtcrime.securesms.crypto.PreKeyUtil; import org.thoughtcrime.securesms.crypto.PreKeyUtil;
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil; import org.thoughtcrime.securesms.crypto.ProfileKeyUtil;
@ -216,7 +217,8 @@ public final class CodeVerificationRequest {
UUID uuid = accountManager.verifyAccountWithCode(code, null, registrationId, !present, UUID uuid = accountManager.verifyAccountWithCode(code, null, registrationId, !present,
pinForServer, registrationLock, pinForServer, registrationLock,
unidentifiedAccessKey, universalUnidentifiedAccess); unidentifiedAccessKey, universalUnidentifiedAccess,
AppCapabilities.getCapabilities());
IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(context); IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(context);
List<PreKeyRecord> records = PreKeyUtil.generatePreKeys(context); List<PreKeyRecord> records = PreKeyUtil.generatePreKeys(context);

View File

@ -27,6 +27,7 @@ import org.whispersystems.signalservice.api.push.exceptions.NoContentException;
import org.whispersystems.signalservice.api.storage.StorageKey; import org.whispersystems.signalservice.api.storage.StorageKey;
import org.whispersystems.signalservice.api.messages.calls.TurnServerInfo; import org.whispersystems.signalservice.api.messages.calls.TurnServerInfo;
import org.whispersystems.signalservice.api.messages.multidevice.DeviceInfo; 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.profiles.SignalServiceProfileWrite;
import org.whispersystems.signalservice.api.push.ContactTokenDetails; import org.whispersystems.signalservice.api.push.ContactTokenDetails;
import org.whispersystems.signalservice.api.push.SignedPreKeyEntity; 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, public UUID verifyAccountWithCode(String verificationCode, String signalingKey, int signalProtocolRegistrationId, boolean fetchesMessages,
String pin, String registrationLock, String pin, String registrationLock,
byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess,
SignalServiceProfile.Capabilities capabilities)
throws IOException throws IOException
{ {
return this.pushServiceSocket.verifyAccountCode(verificationCode, signalingKey, return this.pushServiceSocket.verifyAccountCode(verificationCode, signalingKey,
@ -229,7 +231,8 @@ public class SignalServiceAccountManager {
fetchesMessages, fetchesMessages,
pin, registrationLock, pin, registrationLock,
unidentifiedAccessKey, unidentifiedAccessKey,
unrestrictedUnidentifiedAccess); unrestrictedUnidentifiedAccess,
capabilities);
} }
/** /**
@ -247,12 +250,14 @@ public class SignalServiceAccountManager {
*/ */
public void setAccountAttributes(String signalingKey, int signalProtocolRegistrationId, boolean fetchesMessages, public void setAccountAttributes(String signalingKey, int signalProtocolRegistrationId, boolean fetchesMessages,
String pin, String registrationLock, String pin, String registrationLock,
byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess,
SignalServiceProfile.Capabilities capabilities)
throws IOException throws IOException
{ {
this.pushServiceSocket.setAccountAttributes(signalingKey, signalProtocolRegistrationId, fetchesMessages, this.pushServiceSocket.setAccountAttributes(signalingKey, signalProtocolRegistrationId, fetchesMessages,
pin, registrationLock, pin, registrationLock,
unidentifiedAccessKey, unrestrictedUnidentifiedAccess); unidentifiedAccessKey, unrestrictedUnidentifiedAccess,
capabilities);
} }
/** /**

View File

@ -1,6 +1,7 @@
package org.whispersystems.signalservice.api.profiles; package org.whispersystems.signalservice.api.profiles;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@ -104,8 +105,14 @@ public class SignalServiceProfile {
@JsonProperty @JsonProperty
private boolean gv2; private boolean gv2;
@JsonCreator
public Capabilities() {} public Capabilities() {}
public Capabilities(boolean uuid, boolean gv2) {
this.uuid = uuid;
this.gv2 = gv2;
}
public boolean isUuid() { public boolean isUuid() {
return uuid; return uuid;
} }

View File

@ -8,6 +8,8 @@ package org.whispersystems.signalservice.internal.push;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import org.whispersystems.signalservice.api.profiles.SignalServiceProfile;
public class AccountAttributes { public class AccountAttributes {
@JsonProperty @JsonProperty
@ -37,7 +39,18 @@ public class AccountAttributes {
@JsonProperty @JsonProperty
private boolean unrestrictedUnidentifiedAccess; 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.signalingKey = signalingKey;
this.registrationId = registrationId; this.registrationId = registrationId;
this.voice = true; this.voice = true;
@ -47,6 +60,7 @@ public class AccountAttributes {
this.registrationLock = registrationLock; this.registrationLock = registrationLock;
this.unidentifiedAccessKey = unidentifiedAccessKey; this.unidentifiedAccessKey = unidentifiedAccessKey;
this.unrestrictedUnidentifiedAccess = unrestrictedUnidentifiedAccess; this.unrestrictedUnidentifiedAccess = unrestrictedUnidentifiedAccess;
this.capabilities = capabilities;
} }
public AccountAttributes() {} public AccountAttributes() {}
@ -86,4 +100,8 @@ public class AccountAttributes {
public boolean isUnrestrictedUnidentifiedAccess() { public boolean isUnrestrictedUnidentifiedAccess() {
return unrestrictedUnidentifiedAccess; return unrestrictedUnidentifiedAccess;
} }
public SignalServiceProfile.Capabilities getCapabilities() {
return capabilities;
}
} }

View File

@ -249,10 +249,11 @@ public class PushServiceSocket {
public UUID verifyAccountCode(String verificationCode, String signalingKey, int registrationId, boolean fetchesMessages, public UUID verifyAccountCode(String verificationCode, String signalingKey, int registrationId, boolean fetchesMessages,
String pin, String registrationLock, String pin, String registrationLock,
byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess,
SignalServiceProfile.Capabilities capabilities)
throws IOException 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 requestBody = JsonUtil.toJson(signalingKeyEntity);
String responseBody = makeServiceRequest(String.format(VERIFY_ACCOUNT_CODE_PATH, verificationCode), "PUT", requestBody); String responseBody = makeServiceRequest(String.format(VERIFY_ACCOUNT_CODE_PATH, verificationCode), "PUT", requestBody);
VerifyAccountResponse response = JsonUtil.fromJson(responseBody, VerifyAccountResponse.class); VerifyAccountResponse response = JsonUtil.fromJson(responseBody, VerifyAccountResponse.class);
@ -267,7 +268,8 @@ public class PushServiceSocket {
public void setAccountAttributes(String signalingKey, int registrationId, boolean fetchesMessages, public void setAccountAttributes(String signalingKey, int registrationId, boolean fetchesMessages,
String pin, String registrationLock, String pin, String registrationLock,
byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess,
SignalServiceProfile.Capabilities capabilities)
throws IOException throws IOException
{ {
if (registrationLock != null && pin != null) { if (registrationLock != null && pin != null) {
@ -275,7 +277,7 @@ public class PushServiceSocket {
} }
AccountAttributes accountAttributes = new AccountAttributes(signalingKey, registrationId, fetchesMessages, pin, registrationLock, AccountAttributes accountAttributes = new AccountAttributes(signalingKey, registrationId, fetchesMessages, pin, registrationLock,
unidentifiedAccessKey, unrestrictedUnidentifiedAccess); unidentifiedAccessKey, unrestrictedUnidentifiedAccess, capabilities);
makeServiceRequest(SET_ACCOUNT_ATTRIBUTES, "PUT", JsonUtil.toJson(accountAttributes)); makeServiceRequest(SET_ACCOUNT_ATTRIBUTES, "PUT", JsonUtil.toJson(accountAttributes));
} }