Don't send contacts to CDS if they've opted out of discoverability. (SERVER-130)

This commit is contained in:
Jon Chambers
2020-08-25 12:40:51 -04:00
committed by Jon Chambers
parent 58e3122dab
commit ce026e7ad0
14 changed files with 215 additions and 89 deletions

View File

@@ -345,7 +345,7 @@ public class AccountController {
accounts.update(account);
if (!wasAccountEnabled && account.isEnabled()) {
directoryQueue.addRegisteredUser(account.getUuid(), account.getNumber());
directoryQueue.refreshRegisteredUser(account);
}
}
@@ -359,10 +359,7 @@ public class AccountController {
device.setFetchesMessages(false);
accounts.update(account);
if (!account.isEnabled()) {
directoryQueue.deleteRegisteredUser(account.getUuid(), account.getNumber());
}
directoryQueue.refreshRegisteredUser(account);
}
@Timed
@@ -381,7 +378,7 @@ public class AccountController {
accounts.update(account);
if (!wasAccountEnabled && account.isEnabled()) {
directoryQueue.addRegisteredUser(account.getUuid(), account.getNumber());
directoryQueue.refreshRegisteredUser(account);
}
}
@@ -395,10 +392,7 @@ public class AccountController {
device.setFetchesMessages(false);
accounts.update(account);
if (!account.isEnabled()) {
directoryQueue.deleteRegisteredUser(account.getUuid(), account.getNumber());
}
directoryQueue.refreshRegisteredUser(account);
}
@Timed
@@ -485,7 +479,9 @@ public class AccountController {
account.setDiscoverableByPhoneNumber(attributes.isDiscoverableByPhoneNumber());
accounts.update(account);
directoryQueue.refreshRegisteredUser(account);
}
@GET
@Path("/whoami")
@Produces(MediaType.APPLICATION_JSON)
@@ -636,12 +632,7 @@ public class AccountController {
newUserMeter.mark();
}
if (account.isEnabled()) {
directoryQueue.addRegisteredUser(account.getUuid(), number);
} else {
directoryQueue.deleteRegisteredUser(account.getUuid(), number);
}
directoryQueue.refreshRegisteredUser(account);
messagesManager.clear(number, maybeExistingAccount.map(Account::getUuid).orElse(null));
pendingAccounts.remove(number);

View File

@@ -112,11 +112,7 @@ public class DeviceController {
account.removeDevice(deviceId);
accounts.update(account);
if (!account.isEnabled()) {
directoryQueue.deleteRegisteredUser(account.getUuid(), account.getNumber());
}
directoryQueue.refreshRegisteredUser(account);
messages.clear(account.getNumber(), account.getUuid(), deviceId);
}

View File

@@ -106,7 +106,7 @@ public class KeysController {
accounts.update(account);
if (!wasAccountEnabled && account.isEnabled()) {
directoryQueue.addRegisteredUser(account.getUuid(), account.getNumber());
directoryQueue.refreshRegisteredUser(account);
}
}
@@ -172,7 +172,7 @@ public class KeysController {
accounts.update(account);
if (!wasAccountEnabled && account.isEnabled()) {
directoryQueue.addRegisteredUser(account.getUuid(), account.getNumber());
directoryQueue.refreshRegisteredUser(account);
}
}

View File

@@ -28,9 +28,11 @@ import com.amazonaws.services.sqs.model.SendMessageRequest;
import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.SharedMetricRegistries;
import com.google.common.annotations.VisibleForTesting;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.whispersystems.textsecuregcm.configuration.SqsConfiguration;
import org.whispersystems.textsecuregcm.storage.Account;
import org.whispersystems.textsecuregcm.util.Constants;
import java.util.HashMap;
@@ -58,12 +60,14 @@ public class DirectoryQueue {
this.sqs = AmazonSQSClientBuilder.standard().withRegion(sqsConfig.getRegion()).withCredentials(credentialsProvider).build();
}
public void addRegisteredUser(UUID uuid, String number) {
sendMessage("add", uuid, number);
@VisibleForTesting
DirectoryQueue(final String queueUrl, final AmazonSQS sqs) {
this.queueUrl = queueUrl;
this.sqs = sqs;
}
public void deleteRegisteredUser(UUID uuid, String number) {
sendMessage("delete", uuid, number);
public void refreshRegisteredUser(final Account account) {
sendMessage(account.isEnabled() && account.isDiscoverableByPhoneNumber() ? "add" : "delete", account.getUuid(), account.getNumber());
}
private void sendMessage(String action, UUID uuid, String number) {

View File

@@ -71,8 +71,7 @@ public class AccountCleaner extends AccountDatabaseCrawlerListener {
accountUpdateCount++;
accountsManager.update(account);
directoryQueue.deleteRegisteredUser(account.getUuid(), account.getNumber());
directoryQueue.refreshRegisteredUser(account);
}
}
}

View File

@@ -36,7 +36,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
import static com.codahale.metrics.MetricRegistry.name;
@@ -83,7 +82,7 @@ public class DirectoryReconciler extends AccountDatabaseCrawlerListener {
try {
for (Account account : accounts) {
if (account.isEnabled()) {
if (account.isEnabled() && account.isDiscoverableByPhoneNumber()) {
byte[] token = Util.getContactToken(account.getNumber());
ClientContact clientContact = new ClientContact(token, null, true, true);
directoryManager.add(batchOperation, clientContact);
@@ -100,7 +99,7 @@ public class DirectoryReconciler extends AccountDatabaseCrawlerListener {
private DirectoryReconciliationRequest createChunkRequest(Optional<UUID> fromUuid, List<Account> accounts) {
List<DirectoryReconciliationRequest.User> users = new ArrayList<>(accounts.size());
for (Account account : accounts) {
if (account.isEnabled()) {
if (account.isEnabled() && account.isDiscoverableByPhoneNumber()) {
users.add(new DirectoryReconciliationRequest.User(account.getUuid(), account.getNumber()));
}
}

View File

@@ -60,10 +60,7 @@ public class PushFeedbackProcessor extends AccountDatabaseCrawlerListener {
if (update) {
accountsManager.update(account);
if (!account.isEnabled()) {
directoryQueue.deleteRegisteredUser(account.getUuid(), account.getNumber());
}
directoryQueue.refreshRegisteredUser(account);
}
}
}

View File

@@ -89,7 +89,7 @@ public class DeleteUserCommand extends EnvironmentCommand<WhisperServerConfigura
device.get().setAuthenticationCredentials(new AuthenticationCredentials(Base64.encodeBytes(random)));
accountsManager.update(account.get());
directoryQueue.deleteRegisteredUser(account.get().getUuid(), account.get().getNumber());
directoryQueue.refreshRegisteredUser(account.get());
logger.warn("Removed " + account.get().getNumber());
} else {