Add a discoverableByPhoneNumber account attribute. (SERVER-129)
This commit is contained in:
parent
3b55b2d1b2
commit
58e3122dab
|
@ -482,6 +482,7 @@ public class AccountController {
|
||||||
account.setUnidentifiedAccessKey(attributes.getUnidentifiedAccessKey());
|
account.setUnidentifiedAccessKey(attributes.getUnidentifiedAccessKey());
|
||||||
account.setUnrestrictedUnidentifiedAccess(attributes.isUnrestrictedUnidentifiedAccess());
|
account.setUnrestrictedUnidentifiedAccess(attributes.isUnrestrictedUnidentifiedAccess());
|
||||||
account.setPayments(attributes.getPayments());
|
account.setPayments(attributes.getPayments());
|
||||||
|
account.setDiscoverableByPhoneNumber(attributes.isDiscoverableByPhoneNumber());
|
||||||
|
|
||||||
accounts.update(account);
|
accounts.update(account);
|
||||||
}
|
}
|
||||||
|
@ -629,6 +630,7 @@ public class AccountController {
|
||||||
account.setUnidentifiedAccessKey(accountAttributes.getUnidentifiedAccessKey());
|
account.setUnidentifiedAccessKey(accountAttributes.getUnidentifiedAccessKey());
|
||||||
account.setUnrestrictedUnidentifiedAccess(accountAttributes.isUnrestrictedUnidentifiedAccess());
|
account.setUnrestrictedUnidentifiedAccess(accountAttributes.isUnrestrictedUnidentifiedAccess());
|
||||||
account.setPayments(accountAttributes.getPayments());
|
account.setPayments(accountAttributes.getPayments());
|
||||||
|
account.setDiscoverableByPhoneNumber(accountAttributes.isDiscoverableByPhoneNumber());
|
||||||
|
|
||||||
if (accounts.create(account)) {
|
if (accounts.create(account)) {
|
||||||
newUserMeter.mark();
|
newUserMeter.mark();
|
||||||
|
|
|
@ -23,7 +23,9 @@ import org.whispersystems.textsecuregcm.storage.Device;
|
||||||
import org.whispersystems.textsecuregcm.storage.Device.DeviceCapabilities;
|
import org.whispersystems.textsecuregcm.storage.Device.DeviceCapabilities;
|
||||||
import org.whispersystems.textsecuregcm.storage.PaymentAddress;
|
import org.whispersystems.textsecuregcm.storage.PaymentAddress;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public class AccountAttributes {
|
public class AccountAttributes {
|
||||||
|
|
||||||
|
@ -58,22 +60,26 @@ public class AccountAttributes {
|
||||||
@JsonProperty
|
@JsonProperty
|
||||||
private DeviceCapabilities capabilities;
|
private DeviceCapabilities capabilities;
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
private boolean discoverableByPhoneNumber = true;
|
||||||
|
|
||||||
public AccountAttributes() {}
|
public AccountAttributes() {}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public AccountAttributes(String signalingKey, boolean fetchesMessages, int registrationId, String pin) {
|
public AccountAttributes(String signalingKey, boolean fetchesMessages, int registrationId, String pin) {
|
||||||
this(signalingKey, fetchesMessages, registrationId, null, pin, null, null);
|
this(signalingKey, fetchesMessages, registrationId, null, pin, null, null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public AccountAttributes(String signalingKey, boolean fetchesMessages, int registrationId, String name, String pin, String registrationLock, List<PaymentAddress> payments) {
|
public AccountAttributes(String signalingKey, boolean fetchesMessages, int registrationId, String name, String pin, String registrationLock, List<PaymentAddress> payments, boolean discoverableByPhoneNumber) {
|
||||||
this.signalingKey = signalingKey;
|
this.signalingKey = signalingKey;
|
||||||
this.fetchesMessages = fetchesMessages;
|
this.fetchesMessages = fetchesMessages;
|
||||||
this.registrationId = registrationId;
|
this.registrationId = registrationId;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.pin = pin;
|
this.pin = pin;
|
||||||
this.registrationLock = registrationLock;
|
this.registrationLock = registrationLock;
|
||||||
this.payments = payments;
|
this.payments = payments;
|
||||||
|
this.discoverableByPhoneNumber = discoverableByPhoneNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSignalingKey() {
|
public String getSignalingKey() {
|
||||||
|
@ -115,4 +121,8 @@ public class AccountAttributes {
|
||||||
public List<PaymentAddress> getPayments() {
|
public List<PaymentAddress> getPayments() {
|
||||||
return payments;
|
return payments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isDiscoverableByPhoneNumber() {
|
||||||
|
return discoverableByPhoneNumber;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,6 +70,9 @@ public class Account implements Principal {
|
||||||
@JsonProperty("uua")
|
@JsonProperty("uua")
|
||||||
private boolean unrestrictedUnidentifiedAccess;
|
private boolean unrestrictedUnidentifiedAccess;
|
||||||
|
|
||||||
|
@JsonProperty("inCds")
|
||||||
|
private boolean discoverableByPhoneNumber = true;
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
private Device authenticatedDevice;
|
private Device authenticatedDevice;
|
||||||
|
|
||||||
|
@ -272,6 +275,14 @@ public class Account implements Principal {
|
||||||
else throw new AssertionError();
|
else throw new AssertionError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isDiscoverableByPhoneNumber() {
|
||||||
|
return this.discoverableByPhoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDiscoverableByPhoneNumber(final boolean discoverableByPhoneNumber) {
|
||||||
|
this.discoverableByPhoneNumber = discoverableByPhoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
// Principal implementation
|
// Principal implementation
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -507,8 +507,37 @@ public class AccountControllerTest {
|
||||||
assertThat(result.getUuid()).isNotNull();
|
assertThat(result.getUuid()).isNotNull();
|
||||||
assertThat(result.isStorageCapable()).isFalse();
|
assertThat(result.isStorageCapable()).isFalse();
|
||||||
|
|
||||||
verify(accountsManager, times(1)).create(isA(Account.class));
|
final ArgumentCaptor<Account> accountArgumentCaptor = ArgumentCaptor.forClass(Account.class);
|
||||||
|
|
||||||
|
verify(accountsManager, times(1)).create(accountArgumentCaptor.capture());
|
||||||
verify(directoryQueue, times(1)).deleteRegisteredUser(notNull(), eq(SENDER));
|
verify(directoryQueue, times(1)).deleteRegisteredUser(notNull(), eq(SENDER));
|
||||||
|
|
||||||
|
final Account createdAccount = accountArgumentCaptor.getValue();
|
||||||
|
|
||||||
|
assertThat(createdAccount.isDiscoverableByPhoneNumber()).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testVerifyCodeUndiscoverable() throws Exception {
|
||||||
|
AccountCreationResult result =
|
||||||
|
resources.getJerseyTest()
|
||||||
|
.target(String.format("/v1/accounts/code/%s", "1234"))
|
||||||
|
.request()
|
||||||
|
.header("Authorization", AuthHelper.getAuthHeader(SENDER, "bar"))
|
||||||
|
.put(Entity.entity(new AccountAttributes("keykeykeykey", false, 2222, null, null, null, null, false),
|
||||||
|
MediaType.APPLICATION_JSON_TYPE), AccountCreationResult.class);
|
||||||
|
|
||||||
|
assertThat(result.getUuid()).isNotNull();
|
||||||
|
assertThat(result.isStorageCapable()).isFalse();
|
||||||
|
|
||||||
|
final ArgumentCaptor<Account> accountArgumentCaptor = ArgumentCaptor.forClass(Account.class);
|
||||||
|
|
||||||
|
verify(accountsManager, times(1)).create(accountArgumentCaptor.capture());
|
||||||
|
verify(directoryQueue, times(1)).deleteRegisteredUser(notNull(), eq(SENDER));
|
||||||
|
|
||||||
|
final Account createdAccount = accountArgumentCaptor.getValue();
|
||||||
|
|
||||||
|
assertThat(createdAccount.isDiscoverableByPhoneNumber()).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -580,7 +609,7 @@ public class AccountControllerTest {
|
||||||
.target(String.format("/v1/accounts/code/%s", "666666"))
|
.target(String.format("/v1/accounts/code/%s", "666666"))
|
||||||
.request()
|
.request()
|
||||||
.header("Authorization", AuthHelper.getAuthHeader(SENDER_REG_LOCK, "bar"))
|
.header("Authorization", AuthHelper.getAuthHeader(SENDER_REG_LOCK, "bar"))
|
||||||
.put(Entity.entity(new AccountAttributes("keykeykeykey", false, 3333, null, null, Hex.toStringCondensed(registration_lock_key), null),
|
.put(Entity.entity(new AccountAttributes("keykeykeykey", false, 3333, null, null, Hex.toStringCondensed(registration_lock_key), null, true),
|
||||||
MediaType.APPLICATION_JSON_TYPE), AccountCreationResult.class);
|
MediaType.APPLICATION_JSON_TYPE), AccountCreationResult.class);
|
||||||
|
|
||||||
assertThat(result.getUuid()).isNotNull();
|
assertThat(result.getUuid()).isNotNull();
|
||||||
|
@ -596,7 +625,7 @@ public class AccountControllerTest {
|
||||||
.target(String.format("/v1/accounts/code/%s", "666666"))
|
.target(String.format("/v1/accounts/code/%s", "666666"))
|
||||||
.request()
|
.request()
|
||||||
.header("Authorization", AuthHelper.getAuthHeader(SENDER_REG_LOCK, "bar"))
|
.header("Authorization", AuthHelper.getAuthHeader(SENDER_REG_LOCK, "bar"))
|
||||||
.put(Entity.entity(new AccountAttributes("keykeykeykey", false, 3333, null, null, Hex.toStringCondensed(registration_lock_key), null),
|
.put(Entity.entity(new AccountAttributes("keykeykeykey", false, 3333, null, null, Hex.toStringCondensed(registration_lock_key), null, true),
|
||||||
MediaType.APPLICATION_JSON_TYPE), AccountCreationResult.class);
|
MediaType.APPLICATION_JSON_TYPE), AccountCreationResult.class);
|
||||||
|
|
||||||
assertThat(result.getUuid()).isNotNull();
|
assertThat(result.getUuid()).isNotNull();
|
||||||
|
@ -630,7 +659,7 @@ public class AccountControllerTest {
|
||||||
.target(String.format("/v1/accounts/code/%s", "666666"))
|
.target(String.format("/v1/accounts/code/%s", "666666"))
|
||||||
.request()
|
.request()
|
||||||
.header("Authorization", AuthHelper.getAuthHeader(SENDER_REG_LOCK, "bar"))
|
.header("Authorization", AuthHelper.getAuthHeader(SENDER_REG_LOCK, "bar"))
|
||||||
.put(Entity.entity(new AccountAttributes("keykeykeykey", false, 3333, null, null, null, null),
|
.put(Entity.entity(new AccountAttributes("keykeykeykey", false, 3333, null, null, null, null, true),
|
||||||
MediaType.APPLICATION_JSON_TYPE), AccountCreationResult.class);
|
MediaType.APPLICATION_JSON_TYPE), AccountCreationResult.class);
|
||||||
|
|
||||||
assertThat(result.getUuid()).isNotNull();
|
assertThat(result.getUuid()).isNotNull();
|
||||||
|
|
|
@ -213,7 +213,7 @@ public class DeviceControllerTest {
|
||||||
.target("/v1/devices/5678901")
|
.target("/v1/devices/5678901")
|
||||||
.request()
|
.request()
|
||||||
.header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_NUMBER, "password1"))
|
.header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_NUMBER, "password1"))
|
||||||
.put(Entity.entity(new AccountAttributes("keykeykeykey", false, 1234, "this is a really long name that is longer than 80 characters it's so long that it's even longer than 204 characters. that's a lot of characters. we're talking lots and lots and lots of characters. 12345678", null, null, null),
|
.put(Entity.entity(new AccountAttributes("keykeykeykey", false, 1234, "this is a really long name that is longer than 80 characters it's so long that it's even longer than 204 characters. that's a lot of characters. we're talking lots and lots and lots of characters. 12345678", null, null, null, true),
|
||||||
MediaType.APPLICATION_JSON_TYPE));
|
MediaType.APPLICATION_JSON_TYPE));
|
||||||
|
|
||||||
assertEquals(response.getStatus(), 422);
|
assertEquals(response.getStatus(), 422);
|
||||||
|
|
|
@ -166,4 +166,16 @@ public class AccountTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDiscoverableByPhoneNumber() {
|
||||||
|
final Account account = new Account("+14152222222", UUID.randomUUID(), Collections.singleton(recentMasterDevice), "1234".getBytes());
|
||||||
|
|
||||||
|
assertTrue("Freshly-loaded legacy accounts should be discoverable by phone number.", account.isDiscoverableByPhoneNumber());
|
||||||
|
|
||||||
|
account.setDiscoverableByPhoneNumber(false);
|
||||||
|
assertFalse(account.isDiscoverableByPhoneNumber());
|
||||||
|
|
||||||
|
account.setDiscoverableByPhoneNumber(true);
|
||||||
|
assertTrue(account.isDiscoverableByPhoneNumber());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue