From d51c6fd2f8c1913720e58a5af6d0bd1d6f7ca401 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Mon, 7 Aug 2023 12:37:07 -0400 Subject: [PATCH] Convert `Device.Capabilities` to a record --- .../java/org/signal/integration/TestUser.java | 2 +- .../controllers/DeviceController.java | 2 +- .../textsecuregcm/storage/Account.java | 8 ++-- .../textsecuregcm/storage/Device.java | 39 +------------------ .../RegistrationControllerTest.java | 12 +++--- .../textsecuregcm/storage/AccountTest.java | 4 +- ...ntsManagerChangeNumberIntegrationTest.java | 2 +- 7 files changed, 16 insertions(+), 53 deletions(-) diff --git a/integration-tests/src/main/java/org/signal/integration/TestUser.java b/integration-tests/src/main/java/org/signal/integration/TestUser.java index 7bbce9462..9abfcb7ea 100644 --- a/integration-tests/src/main/java/org/signal/integration/TestUser.java +++ b/integration-tests/src/main/java/org/signal/integration/TestUser.java @@ -117,7 +117,7 @@ public class TestUser { } public AccountAttributes accountAttributes() { - return new AccountAttributes(true, registrationId, "", "", true, new Device.DeviceCapabilities()) + return new AccountAttributes(true, registrationId, "", "", true, new Device.DeviceCapabilities(false, false, false, false)) .withUnidentifiedAccessKey(unidentifiedAccessKey) .withRecoveryPassword(registrationPassword); } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java index ac15e6d9a..d13055040 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java @@ -344,7 +344,7 @@ public class DeviceController { } static boolean isCapabilityDowngrade(Account account, DeviceCapabilities capabilities) { - return account.isPniSupported() && !capabilities.isPni(); + return account.isPniSupported() && !capabilities.pni(); } private Pair createDevice(final String password, diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java index 7ff7e352d..e3eccd575 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java @@ -247,21 +247,21 @@ public class Account { public boolean isStorageSupported() { requireNotStale(); - return devices.stream().anyMatch(device -> device.getCapabilities() != null && device.getCapabilities().isStorage()); + return devices.stream().anyMatch(device -> device.getCapabilities() != null && device.getCapabilities().storage()); } public boolean isTransferSupported() { requireNotStale(); - return getMasterDevice().map(Device::getCapabilities).map(Device.DeviceCapabilities::isTransfer).orElse(false); + return getMasterDevice().map(Device::getCapabilities).map(Device.DeviceCapabilities::transfer).orElse(false); } public boolean isPniSupported() { - return allEnabledDevicesHaveCapability(DeviceCapabilities::isPni); + return allEnabledDevicesHaveCapability(DeviceCapabilities::pni); } public boolean isPaymentActivationSupported() { - return allEnabledDevicesHaveCapability(DeviceCapabilities::isPaymentActivation); + return allEnabledDevicesHaveCapability(DeviceCapabilities::paymentActivation); } private boolean allEnabledDevicesHaveCapability(final Predicate predicate) { diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java index 359d2ff7c..64f986409 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java @@ -274,43 +274,6 @@ public class Device { return this.userAgent; } - public static class DeviceCapabilities { - @JsonProperty - private boolean storage; - - @JsonProperty - private boolean transfer; - - @JsonProperty - private boolean pni; - - @JsonProperty - private boolean paymentActivation; - - public DeviceCapabilities() { - } - - public DeviceCapabilities(boolean storage, boolean transfer, final boolean pni, final boolean paymentActivation) { - this.storage = storage; - this.transfer = transfer; - this.pni = pni; - this.paymentActivation = paymentActivation; - } - - public boolean isStorage() { - return storage; - } - - public boolean isTransfer() { - return transfer; - } - - public boolean isPni() { - return pni; - } - - public boolean isPaymentActivation() { - return paymentActivation; - } + public record DeviceCapabilities(boolean storage, boolean transfer, boolean pni, boolean paymentActivation) { } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/RegistrationControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/RegistrationControllerTest.java index e572aa175..552aa36dd 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/RegistrationControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/RegistrationControllerTest.java @@ -437,10 +437,10 @@ class RegistrationControllerTest { } final AccountAttributes fetchesMessagesAccountAttributes = - new AccountAttributes(true, 1, "test", null, true, new Device.DeviceCapabilities()); + new AccountAttributes(true, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); final AccountAttributes pushAccountAttributes = - new AccountAttributes(false, 1, "test", null, true, new Device.DeviceCapabilities()); + new AccountAttributes(false, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); return Stream.of( // "Fetches messages" is true, but an APNs token is provided @@ -529,7 +529,7 @@ class RegistrationControllerTest { } final AccountAttributes accountAttributes = - new AccountAttributes(true, 1, "test", null, true, new Device.DeviceCapabilities()); + new AccountAttributes(true, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); return Stream.of( // Signed PNI EC pre-key is missing @@ -720,7 +720,7 @@ class RegistrationControllerTest { RegistrationRequest reg = new RegistrationRequest("session-id", new byte[0], - new AccountAttributes(true, 1, "test", null, true, new Device.DeviceCapabilities()), + new AccountAttributes(true, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)), true, requireAtomic, Optional.empty(), @@ -758,10 +758,10 @@ class RegistrationControllerTest { } final AccountAttributes fetchesMessagesAccountAttributes = - new AccountAttributes(true, 1, "test", null, true, new Device.DeviceCapabilities()); + new AccountAttributes(true, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); final AccountAttributes pushAccountAttributes = - new AccountAttributes(false, 1, "test", null, true, new Device.DeviceCapabilities()); + new AccountAttributes(false, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); final String apnsToken = "apns-token"; final String apnsVoipToken = "apns-voip-token"; diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountTest.java index 2e3b6796e..0ff085f43 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountTest.java @@ -222,8 +222,8 @@ class AccountTest { when(transferCapableLinkedDevice.isMaster()).thenReturn(false); when(transferCapableLinkedDevice.getCapabilities()).thenReturn(transferCapabilities); - when(transferCapabilities.isTransfer()).thenReturn(true); - when(nonTransferCapabilities.isTransfer()).thenReturn(false); + when(transferCapabilities.transfer()).thenReturn(true); + when(nonTransferCapabilities.transfer()).thenReturn(false); { final Account transferableMasterAccount = diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java index ca8d4c982..f1b9a086f 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java @@ -153,7 +153,7 @@ class AccountsManagerChangeNumberIntegrationTest { final ECKeyPair pniIdentityKeyPair = Curve.generateKeyPair(); final ECSignedPreKey rotatedSignedPreKey = KeysHelper.signedECPreKey(1L, pniIdentityKeyPair); - final AccountAttributes accountAttributes = new AccountAttributes(true, rotatedPniRegistrationId + 1, "test", null, true, new Device.DeviceCapabilities()); + final AccountAttributes accountAttributes = new AccountAttributes(true, rotatedPniRegistrationId + 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); final Account account = accountsManager.create(originalNumber, "password", null, accountAttributes, new ArrayList<>()); account.getMasterDevice().orElseThrow().setSignedPreKey(KeysHelper.signedECPreKey(1, pniIdentityKeyPair));