Don't attempt to update PNI PQ prekeys for disabled devices
This commit is contained in:
parent
5659cb2820
commit
7299067829
|
@ -336,12 +336,16 @@ public class AccountsManager {
|
||||||
keysManager.storeEcSignedPreKeys(phoneNumberIdentifier, pniSignedPreKeys);
|
keysManager.storeEcSignedPreKeys(phoneNumberIdentifier, pniSignedPreKeys);
|
||||||
|
|
||||||
if (pniPqLastResortPreKeys != null) {
|
if (pniPqLastResortPreKeys != null) {
|
||||||
keysManager.storePqLastResort(
|
keysManager.getPqEnabledDevices(uuid).thenCompose(
|
||||||
|
deviceIds -> keysManager.storePqLastResort(
|
||||||
phoneNumberIdentifier,
|
phoneNumberIdentifier,
|
||||||
keysManager.getPqEnabledDevices(uuid).join().stream().collect(
|
deviceIds.stream()
|
||||||
|
.filter(pniPqLastResortPreKeys::containsKey)
|
||||||
|
.collect(
|
||||||
Collectors.toMap(
|
Collectors.toMap(
|
||||||
Function.identity(),
|
Function.identity(),
|
||||||
pniPqLastResortPreKeys::get)));
|
pniPqLastResortPreKeys::get))))
|
||||||
|
.join();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -373,11 +377,17 @@ public class AccountsManager {
|
||||||
final UUID pni = account.getPhoneNumberIdentifier();
|
final UUID pni = account.getPhoneNumberIdentifier();
|
||||||
final Account updatedAccount = update(account, a -> { return setPniKeys(a, pniIdentityKey, pniSignedPreKeys, pniRegistrationIds); });
|
final Account updatedAccount = update(account, a -> { return setPniKeys(a, pniIdentityKey, pniSignedPreKeys, pniRegistrationIds); });
|
||||||
|
|
||||||
final List<Long> pqEnabledDeviceIDs = keysManager.getPqEnabledDevices(pni).join();
|
|
||||||
keysManager.delete(pni);
|
keysManager.delete(pni);
|
||||||
keysManager.storeEcSignedPreKeys(pni, pniSignedPreKeys).join();
|
keysManager.storeEcSignedPreKeys(pni, pniSignedPreKeys).join();
|
||||||
if (pniPqLastResortPreKeys != null && !pqEnabledDeviceIDs.isEmpty()) {
|
if (pniPqLastResortPreKeys != null) {
|
||||||
keysManager.storePqLastResort(pni, pqEnabledDeviceIDs.stream().collect(Collectors.toMap(Function.identity(), pniPqLastResortPreKeys::get))).join();
|
keysManager.getPqEnabledDevices(pni)
|
||||||
|
.thenCompose(
|
||||||
|
deviceIds -> keysManager.storePqLastResort(
|
||||||
|
pni,
|
||||||
|
deviceIds.stream()
|
||||||
|
.filter(pniPqLastResortPreKeys::containsKey)
|
||||||
|
.collect(Collectors.toMap(Function.identity(), pniPqLastResortPreKeys::get))))
|
||||||
|
.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
return updatedAccount;
|
return updatedAccount;
|
||||||
|
|
|
@ -1118,9 +1118,13 @@ class AccountsManagerTest {
|
||||||
|
|
||||||
final Account existingAccount = AccountsHelper.generateTestAccount(targetNumber, existingAccountUuid, targetPni, new ArrayList<>(), new byte[UnidentifiedAccessUtil.UNIDENTIFIED_ACCESS_KEY_LENGTH]);
|
final Account existingAccount = AccountsHelper.generateTestAccount(targetNumber, existingAccountUuid, targetPni, new ArrayList<>(), new byte[UnidentifiedAccessUtil.UNIDENTIFIED_ACCESS_KEY_LENGTH]);
|
||||||
when(accounts.getByE164(targetNumber)).thenReturn(Optional.of(existingAccount));
|
when(accounts.getByE164(targetNumber)).thenReturn(Optional.of(existingAccount));
|
||||||
when(keysManager.getPqEnabledDevices(uuid)).thenReturn(CompletableFuture.completedFuture(List.of(1L)));
|
when(keysManager.getPqEnabledDevices(uuid)).thenReturn(CompletableFuture.completedFuture(List.of(1L, 3L)));
|
||||||
|
when(keysManager.storePqLastResort(any(), any())).thenReturn(CompletableFuture.completedFuture(null));
|
||||||
|
|
||||||
final List<Device> devices = List.of(DevicesHelper.createDevice(1L, 0L, 101), DevicesHelper.createDevice(2L, 0L, 102));
|
final List<Device> devices = List.of(
|
||||||
|
DevicesHelper.createDevice(1L, 0L, 101),
|
||||||
|
DevicesHelper.createDevice(2L, 0L, 102),
|
||||||
|
DevicesHelper.createDisabledDevice(3L, 103));
|
||||||
final Account account = AccountsHelper.generateTestAccount(originalNumber, uuid, originalPni, devices, new byte[UnidentifiedAccessUtil.UNIDENTIFIED_ACCESS_KEY_LENGTH]);
|
final Account account = AccountsHelper.generateTestAccount(originalNumber, uuid, originalPni, devices, new byte[UnidentifiedAccessUtil.UNIDENTIFIED_ACCESS_KEY_LENGTH]);
|
||||||
final Account updatedAccount = accountsManager.changeNumber(
|
final Account updatedAccount = accountsManager.changeNumber(
|
||||||
account, targetNumber, new IdentityKey(Curve.generateKeyPair().getPublicKey()), newSignedKeys, newSignedPqKeys, newRegistrationIds);
|
account, targetNumber, new IdentityKey(Curve.generateKeyPair().getPublicKey()), newSignedKeys, newSignedPqKeys, newRegistrationIds);
|
||||||
|
@ -1306,11 +1310,7 @@ class AccountsManagerTest {
|
||||||
|
|
||||||
when(keysManager.getPqEnabledDevices(oldPni)).thenReturn(CompletableFuture.completedFuture(List.of()));
|
when(keysManager.getPqEnabledDevices(oldPni)).thenReturn(CompletableFuture.completedFuture(List.of()));
|
||||||
when(keysManager.storeEcSignedPreKeys(any(), any())).thenReturn(CompletableFuture.completedFuture(null));
|
when(keysManager.storeEcSignedPreKeys(any(), any())).thenReturn(CompletableFuture.completedFuture(null));
|
||||||
when(keysManager.storePqLastResort(any(), any())).thenAnswer(
|
when(keysManager.storePqLastResort(any(), any())).thenReturn(CompletableFuture.completedFuture(null));
|
||||||
invocation -> {
|
|
||||||
assertFalse(invocation.getArgument(1, Map.class).isEmpty());
|
|
||||||
return CompletableFuture.completedFuture(null);
|
|
||||||
});
|
|
||||||
|
|
||||||
Map<Long, ECSignedPreKey> oldSignedPreKeys = account.getDevices().stream()
|
Map<Long, ECSignedPreKey> oldSignedPreKeys = account.getDevices().stream()
|
||||||
.collect(Collectors.toMap(Device::getId, d -> d.getSignedPreKey(IdentityType.ACI)));
|
.collect(Collectors.toMap(Device::getId, d -> d.getSignedPreKey(IdentityType.ACI)));
|
||||||
|
@ -1342,9 +1342,7 @@ class AccountsManagerTest {
|
||||||
|
|
||||||
verify(keysManager).delete(oldPni);
|
verify(keysManager).delete(oldPni);
|
||||||
verify(keysManager).storeEcSignedPreKeys(oldPni, newSignedKeys);
|
verify(keysManager).storeEcSignedPreKeys(oldPni, newSignedKeys);
|
||||||
|
verify(keysManager).storePqLastResort(any(), argThat(Map::isEmpty));
|
||||||
// no pq-enabled devices -> no pq last resort keys should be stored
|
|
||||||
verify(keysManager, never()).storePqLastResort(any(), any());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -34,6 +34,17 @@ public class DevicesHelper {
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Device createDisabledDevice(final long deviceId, final int registrationId) {
|
||||||
|
final Device device = new Device();
|
||||||
|
device.setId(deviceId);
|
||||||
|
device.setUserAgent("OWT");
|
||||||
|
device.setRegistrationId(registrationId);
|
||||||
|
|
||||||
|
setEnabled(device, false);
|
||||||
|
|
||||||
|
return device;
|
||||||
|
}
|
||||||
|
|
||||||
public static void setEnabled(Device device, boolean enabled) {
|
public static void setEnabled(Device device, boolean enabled) {
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
device.setSignedPreKey(KeysHelper.signedECPreKey(RANDOM.nextLong(), Curve.generateKeyPair()));
|
device.setSignedPreKey(KeysHelper.signedECPreKey(RANDOM.nextLong(), Curve.generateKeyPair()));
|
||||||
|
|
Loading…
Reference in New Issue