From 93515e5a0fd85405e210263e33011016c3aa29c9 Mon Sep 17 00:00:00 2001 From: Katherine Date: Tue, 8 Oct 2024 16:01:09 -0400 Subject: [PATCH] Retire `paymentActivation` capability --- .../java/org/signal/integration/TestUser.java | 2 +- .../entities/UserCapabilities.java | 4 +- .../grpc/DevicesGrpcService.java | 1 - .../textsecuregcm/grpc/ProfileGrpcHelper.java | 1 - .../textsecuregcm/storage/Account.java | 4 -- .../textsecuregcm/storage/Device.java | 2 +- .../main/proto/org/signal/chat/device.proto | 5 +-- .../main/proto/org/signal/chat/profile.proto | 8 +--- .../controllers/DeviceControllerTest.java | 13 +++---- .../controllers/ProfileControllerTest.java | 1 - .../RegistrationControllerTest.java | 14 +++---- .../grpc/DevicesGrpcServiceTest.java | 3 -- ...ccountCreationDeletionIntegrationTest.java | 7 +--- .../textsecuregcm/storage/AccountTest.java | 37 ++----------------- ...ntsManagerChangeNumberIntegrationTest.java | 2 +- ...ConcurrentModificationIntegrationTest.java | 2 +- .../storage/AccountsManagerTest.java | 4 +- .../AddRemoveDeviceIntegrationTest.java | 10 ++--- .../tests/util/AccountsHelper.java | 1 - 19 files changed, 35 insertions(+), 86 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 56fd9a722..8a7dbeff5 100644 --- a/integration-tests/src/main/java/org/signal/integration/TestUser.java +++ b/integration-tests/src/main/java/org/signal/integration/TestUser.java @@ -126,7 +126,7 @@ public class TestUser { } public AccountAttributes accountAttributes() { - return new AccountAttributes(true, registrationId, pniRegistrationId, "".getBytes(StandardCharsets.UTF_8), "", true, new Device.DeviceCapabilities(false, false, false, false, false)) + return new AccountAttributes(true, registrationId, pniRegistrationId, "".getBytes(StandardCharsets.UTF_8), "", true, new Device.DeviceCapabilities(false, false, false, false)) .withUnidentifiedAccessKey(unidentifiedAccessKey) .withRecoveryPassword(registrationPassword); } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/entities/UserCapabilities.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/UserCapabilities.java index a65026607..f3f74a662 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/entities/UserCapabilities.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/entities/UserCapabilities.java @@ -8,13 +8,11 @@ package org.whispersystems.textsecuregcm.entities; import org.whispersystems.textsecuregcm.storage.Account; public record UserCapabilities( - // TODO: Remove the paymentActivation capability entirely sometime soon after 2024-10-07 - boolean paymentActivation, boolean deleteSync, boolean versionedExpirationTimer) { public static UserCapabilities createForAccount(final Account account) { - return new UserCapabilities(true, account.isDeleteSyncSupported(), + return new UserCapabilities(account.isDeleteSyncSupported(), account.isVersionedExpirationTimerSupported()); } } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcService.java b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcService.java index 829b912c6..401af43ce 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcService.java @@ -191,7 +191,6 @@ public class DevicesGrpcService extends ReactorDevicesGrpc.DevicesImplBase { d -> d.setCapabilities(new Device.DeviceCapabilities( request.getStorage(), request.getTransfer(), - request.getPaymentActivation(), request.getDeleteSync(), request.getVersionedExpirationTimer()))))) .thenReturn(SetCapabilitiesResponse.newBuilder().build()); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/ProfileGrpcHelper.java b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/ProfileGrpcHelper.java index 09be841ff..463ca4bc9 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/ProfileGrpcHelper.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/ProfileGrpcHelper.java @@ -82,7 +82,6 @@ public class ProfileGrpcHelper { @VisibleForTesting static UserCapabilities buildUserCapabilities(final org.whispersystems.textsecuregcm.entities.UserCapabilities capabilities) { return UserCapabilities.newBuilder() - .setPaymentActivation(capabilities.paymentActivation()) .setDeleteSync(capabilities.deleteSync()) .setVersionedExpirationTimer(capabilities.versionedExpirationTimer()) .build(); 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 fd4595226..7d42d5b7c 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java @@ -288,10 +288,6 @@ public class Account { .orElse(false); } - public boolean isPaymentActivationSupported() { - return allDevicesHaveCapability(DeviceCapabilities::paymentActivation); - } - public boolean isDeleteSyncSupported() { return allDevicesHaveCapability(DeviceCapabilities::deleteSync); } 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 4b6387c67..6cffa39ef 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java @@ -221,7 +221,7 @@ public class Device { return this.userAgent; } - public record DeviceCapabilities(boolean storage, boolean transfer, boolean paymentActivation, boolean deleteSync, + public record DeviceCapabilities(boolean storage, boolean transfer, boolean deleteSync, boolean versionedExpirationTimer) { } } diff --git a/service/src/main/proto/org/signal/chat/device.proto b/service/src/main/proto/org/signal/chat/device.proto index 46dd4f9f9..c3e51fa66 100644 --- a/service/src/main/proto/org/signal/chat/device.proto +++ b/service/src/main/proto/org/signal/chat/device.proto @@ -140,9 +140,8 @@ message ClearPushTokenResponse {} message SetCapabilitiesRequest { bool storage = 1; bool transfer = 2; - bool paymentActivation = 3; - bool deleteSync = 4; - bool versionedExpirationTimer = 5; + bool deleteSync = 3; + bool versionedExpirationTimer = 4; } message SetCapabilitiesResponse {} diff --git a/service/src/main/proto/org/signal/chat/profile.proto b/service/src/main/proto/org/signal/chat/profile.proto index ff778e561..af44fd621 100644 --- a/service/src/main/proto/org/signal/chat/profile.proto +++ b/service/src/main/proto/org/signal/chat/profile.proto @@ -318,18 +318,14 @@ message ProfileAvatarUploadAttributes { } message UserCapabilities { - /** - * Whether all devices linked to the account support MobileCoin payments. - */ - bool payment_activation = 1; /** * Whether all devices linked to the account support delete syncing */ - bool delete_sync = 2; + bool delete_sync = 1; /** * Whether all devices linked to the account support a versioned expiration timer */ - bool versioned_expiration_timer = 3; + bool versioned_expiration_timer = 2; } message Badge { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/DeviceControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/DeviceControllerTest.java index 3e5ed353e..9f28daa5a 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/DeviceControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/DeviceControllerTest.java @@ -129,7 +129,6 @@ class DeviceControllerTest { when(account.getNumber()).thenReturn(AuthHelper.VALID_NUMBER); when(account.getUuid()).thenReturn(AuthHelper.VALID_UUID); when(account.getPhoneNumberIdentifier()).thenReturn(AuthHelper.VALID_PNI); - when(account.isPaymentActivationSupported()).thenReturn(false); when(accountsManager.getByAccountIdentifier(AuthHelper.VALID_UUID)).thenReturn(Optional.of(account)); when(accountsManager.getByE164(AuthHelper.VALID_NUMBER)).thenReturn(Optional.of(account)); @@ -199,7 +198,7 @@ class DeviceControllerTest { when(asyncCommands.set(any(), any(), any())).thenReturn(MockRedisFuture.completedFuture(null)); final AccountAttributes accountAttributes = new AccountAttributes(fetchesMessages, 1234, 5678, null, - null, true, new DeviceCapabilities(true, true, true, false, false)); + null, true, new DeviceCapabilities(true, true, false, false)); final LinkDeviceRequest request = new LinkDeviceRequest("link-device-token", accountAttributes, @@ -272,7 +271,7 @@ class DeviceControllerTest { when(accountsManager.checkDeviceLinkingToken(anyString())).thenReturn(Optional.of(AuthHelper.VALID_UUID)); final LinkDeviceRequest request = new LinkDeviceRequest("link-device-token", - new AccountAttributes(false, 1234, 5678, null, null, true, new DeviceCapabilities(true, true, true, deviceSupportsDeleteSync, false)), + new AccountAttributes(false, 1234, 5678, null, null, true, new DeviceCapabilities(true, true, deviceSupportsDeleteSync, false)), new DeviceActivationRequest(aciSignedPreKey, pniSignedPreKey, aciPqLastResortPreKey, pniPqLastResortPreKey, Optional.empty(), Optional.of(new GcmRegistrationId("gcm-id")))); try (final Response response = resources.getJerseyTest() @@ -327,7 +326,7 @@ class DeviceControllerTest { when(accountsManager.checkDeviceLinkingToken(anyString())).thenReturn(Optional.of(AuthHelper.VALID_UUID)); final LinkDeviceRequest request = new LinkDeviceRequest("link-device-token", - new AccountAttributes(false, 1234, 5678, null, null, true, new DeviceCapabilities(true, true, true, deviceSupportsVersionedExpirationTimer, false)), + new AccountAttributes(false, 1234, 5678, null, null, true, new DeviceCapabilities(true, true, deviceSupportsVersionedExpirationTimer, false)), new DeviceActivationRequest(aciSignedPreKey, pniSignedPreKey, aciPqLastResortPreKey, pniPqLastResortPreKey, Optional.empty(), Optional.of(new GcmRegistrationId("gcm-id")))); try (final Response response = resources.getJerseyTest() @@ -416,7 +415,7 @@ class DeviceControllerTest { when(asyncCommands.set(any(), any(), any())).thenReturn(MockRedisFuture.completedFuture(null)); final AccountAttributes accountAttributes = new AccountAttributes(true, 1234, 5678, null, - null, true, new DeviceCapabilities(true, true, true, false, false)); + null, true, new DeviceCapabilities(true, true, false, false)); final LinkDeviceRequest request = new LinkDeviceRequest("link-device-token", accountAttributes, @@ -750,7 +749,7 @@ class DeviceControllerTest { when(asyncCommands.set(any(), any(), any())).thenReturn(MockRedisFuture.completedFuture(null)); final LinkDeviceRequest request = new LinkDeviceRequest("link-device-token", - new AccountAttributes(false, registrationId, pniRegistrationId, null, null, true, new DeviceCapabilities(true, true, true, false, false)), + new AccountAttributes(false, registrationId, pniRegistrationId, null, null, true, new DeviceCapabilities(true, true, false, false)), new DeviceActivationRequest(aciSignedPreKey, pniSignedPreKey, aciPqLastResortPreKey, pniPqLastResortPreKey, Optional.of(new ApnRegistrationId("apn")), Optional.empty())); try (final Response response = resources.getJerseyTest() @@ -809,7 +808,7 @@ class DeviceControllerTest { @Test void putCapabilitiesSuccessTest() { - final DeviceCapabilities deviceCapabilities = new DeviceCapabilities(true, true, true, false, false); + final DeviceCapabilities deviceCapabilities = new DeviceCapabilities(true, true, false, false); final Response response = resources .getJerseyTest() .target("/v1/devices/capabilities") diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/ProfileControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/ProfileControllerTest.java index 57ccc3e21..bb176a17b 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/ProfileControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/ProfileControllerTest.java @@ -454,7 +454,6 @@ class ProfileControllerTest { assertEquals(isDeleteSyncSupported, profile.getCapabilities().deleteSync()); assertEquals(isVersionedExpirationTimerSupported, profile.getCapabilities().versionedExpirationTimer()); - assertThat(profile.getCapabilities().paymentActivation()).isTrue(); } @Test 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 43d7fb948..73fbf05b0 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/RegistrationControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/RegistrationControllerTest.java @@ -526,10 +526,10 @@ class RegistrationControllerTest { } final AccountAttributes fetchesMessagesAccountAttributes = - new AccountAttributes(true, 1, 1, "test".getBytes(StandardCharsets.UTF_8), null, true, new Device.DeviceCapabilities(false, false, false, false, false)); + new AccountAttributes(true, 1, 1, "test".getBytes(StandardCharsets.UTF_8), null, true, new Device.DeviceCapabilities(false, false, false, false)); final AccountAttributes pushAccountAttributes = - new AccountAttributes(false, 1, 1, "test".getBytes(StandardCharsets.UTF_8), null, true, new Device.DeviceCapabilities(false, false, false, false, false)); + new AccountAttributes(false, 1, 1, "test".getBytes(StandardCharsets.UTF_8), null, true, new Device.DeviceCapabilities(false, false, false, false)); return Stream.of( // "Fetches messages" is true, but an APNs token is provided @@ -615,7 +615,7 @@ class RegistrationControllerTest { } final AccountAttributes accountAttributes = - new AccountAttributes(true, 1, 1, "test".getBytes(StandardCharsets.UTF_8), null, true, new Device.DeviceCapabilities(false, false, false, false, false)); + new AccountAttributes(true, 1, 1, "test".getBytes(StandardCharsets.UTF_8), null, true, new Device.DeviceCapabilities(false, false, false, false)); return Stream.of( // Signed PNI EC pre-key is missing @@ -786,13 +786,13 @@ class RegistrationControllerTest { final int registrationId = 1; final int pniRegistrationId = 2; - final Device.DeviceCapabilities deviceCapabilities = new Device.DeviceCapabilities(false, false, false, false, false); + final Device.DeviceCapabilities deviceCapabilities = new Device.DeviceCapabilities(false, false, false, false); final AccountAttributes fetchesMessagesAccountAttributes = - new AccountAttributes(true, registrationId, pniRegistrationId, "test".getBytes(StandardCharsets.UTF_8), null, true, new Device.DeviceCapabilities(false, false, false, false, false)); + new AccountAttributes(true, registrationId, pniRegistrationId, "test".getBytes(StandardCharsets.UTF_8), null, true, new Device.DeviceCapabilities(false, false, false, false)); final AccountAttributes pushAccountAttributes = - new AccountAttributes(false, registrationId, pniRegistrationId, "test".getBytes(StandardCharsets.UTF_8), null, true, new Device.DeviceCapabilities(false, false, false, false, false)); + new AccountAttributes(false, registrationId, pniRegistrationId, "test".getBytes(StandardCharsets.UTF_8), null, true, new Device.DeviceCapabilities(false, false, false, false)); final String apnsToken = "apns-token"; final String gcmToken = "gcm-token"; @@ -906,7 +906,7 @@ class RegistrationControllerTest { final IdentityKey pniIdentityKey = new IdentityKey(pniIdentityKeyPair.getPublicKey()); final AccountAttributes accountAttributes = new AccountAttributes(true, registrationId, pniRegistrationId, "name".getBytes(StandardCharsets.UTF_8), "reglock", - true, new Device.DeviceCapabilities(true, true, true, false, false)); + true, new Device.DeviceCapabilities(true, true, false, false)); final RegistrationRequest request = new RegistrationRequest( Base64.getEncoder().encodeToString(sessionId.getBytes(StandardCharsets.UTF_8)), diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcServiceTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcServiceTest.java index f1fbbf951..fbecc2e05 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcServiceTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcServiceTest.java @@ -364,7 +364,6 @@ class DevicesGrpcServiceTest extends SimpleBaseGrpcTest when(updatedAccount.getPrimaryDevice()).thenAnswer(stubbing); case "isDiscoverableByPhoneNumber" -> when(updatedAccount.isDiscoverableByPhoneNumber()).thenAnswer(stubbing); case "getNextDeviceId" -> when(updatedAccount.getNextDeviceId()).thenAnswer(stubbing); - case "isPaymentActivationSupported" -> when(updatedAccount.isPaymentActivationSupported()).thenAnswer(stubbing); case "isDeleteSyncSupported" -> when(updatedAccount.isDeleteSyncSupported()).thenAnswer(stubbing); case "isVersionedExpirationTimerSupported" -> when(updatedAccount.isVersionedExpirationTimerSupported()).thenAnswer(stubbing); case "getRegistrationLock" -> when(updatedAccount.getRegistrationLock()).thenAnswer(stubbing);