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 e047c19e3..fb7089c24 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java @@ -450,6 +450,8 @@ public class DeviceController { private static boolean isCapabilityDowngrade(final Account account, final Set capabilities) { final Set requiredCapabilities = Arrays.stream(DeviceCapability.values()) + // `ALWAYS_CAPABLE` capabilities are always assumed to be present, so we don't require callers to specify them + .filter(capability -> capability.getAccountCapabilityMode() != DeviceCapability.AccountCapabilityMode.ALWAYS_CAPABLE) .filter(DeviceCapability::preventDowngrade) .filter(account::hasCapability) .collect(Collectors.toSet()); 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 35928e075..dc1520c06 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/DeviceControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/DeviceControllerTest.java @@ -348,7 +348,8 @@ class DeviceControllerTest { new DeviceActivationRequest(aciSignedPreKey, pniSignedPreKey, aciPqLastResortPreKey, pniPqLastResortPreKey, Optional.empty(), Optional.of(new GcmRegistrationId("gcm-id")))); final int expectedStatus = - capability.preventDowngrade() && accountHasCapability && !requestHasCapability ? 409 : 200; + capability.getAccountCapabilityMode() != DeviceCapability.AccountCapabilityMode.ALWAYS_CAPABLE + && capability.preventDowngrade() && accountHasCapability && !requestHasCapability ? 409 : 200; try (final Response response = resources.getJerseyTest() .target("/v1/devices/link")