Remove deprecated, unversioned profile setters
This commit is contained in:
		
							parent
							
								
									b496ef8d6f
								
							
						
					
					
						commit
						2b2e26f14b
					
				|  | @ -5,12 +5,8 @@ | ||||||
| 
 | 
 | ||||||
| package org.whispersystems.textsecuregcm.controllers; | package org.whispersystems.textsecuregcm.controllers; | ||||||
| 
 | 
 | ||||||
| import static org.whispersystems.textsecuregcm.metrics.MetricsUtil.name; |  | ||||||
| 
 |  | ||||||
| import com.codahale.metrics.annotation.Timed; | import com.codahale.metrics.annotation.Timed; | ||||||
| import io.dropwizard.auth.Auth; | import io.dropwizard.auth.Auth; | ||||||
| import io.micrometer.core.instrument.Metrics; |  | ||||||
| import io.micrometer.core.instrument.Tags; |  | ||||||
| import java.security.SecureRandom; | import java.security.SecureRandom; | ||||||
| import java.time.Clock; | import java.time.Clock; | ||||||
| import java.time.Duration; | import java.time.Duration; | ||||||
|  | @ -27,7 +23,6 @@ import java.util.UUID; | ||||||
| import java.util.function.Function; | import java.util.function.Function; | ||||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||||
| import javax.validation.Valid; | import javax.validation.Valid; | ||||||
| import javax.validation.valueextraction.Unwrapping; |  | ||||||
| import javax.ws.rs.BadRequestException; | import javax.ws.rs.BadRequestException; | ||||||
| import javax.ws.rs.Consumes; | import javax.ws.rs.Consumes; | ||||||
| import javax.ws.rs.DefaultValue; | import javax.ws.rs.DefaultValue; | ||||||
|  | @ -72,7 +67,6 @@ import org.whispersystems.textsecuregcm.entities.Profile; | ||||||
| import org.whispersystems.textsecuregcm.entities.ProfileAvatarUploadAttributes; | import org.whispersystems.textsecuregcm.entities.ProfileAvatarUploadAttributes; | ||||||
| import org.whispersystems.textsecuregcm.entities.UserCapabilities; | import org.whispersystems.textsecuregcm.entities.UserCapabilities; | ||||||
| import org.whispersystems.textsecuregcm.limits.RateLimiters; | import org.whispersystems.textsecuregcm.limits.RateLimiters; | ||||||
| import org.whispersystems.textsecuregcm.metrics.UserAgentTagUtil; |  | ||||||
| import org.whispersystems.textsecuregcm.s3.PolicySigner; | import org.whispersystems.textsecuregcm.s3.PolicySigner; | ||||||
| import org.whispersystems.textsecuregcm.s3.PostPolicyGenerator; | import org.whispersystems.textsecuregcm.s3.PostPolicyGenerator; | ||||||
| import org.whispersystems.textsecuregcm.storage.Account; | import org.whispersystems.textsecuregcm.storage.Account; | ||||||
|  | @ -81,7 +75,6 @@ import org.whispersystems.textsecuregcm.storage.AccountsManager; | ||||||
| import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager; | import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager; | ||||||
| import org.whispersystems.textsecuregcm.storage.ProfilesManager; | import org.whispersystems.textsecuregcm.storage.ProfilesManager; | ||||||
| import org.whispersystems.textsecuregcm.storage.VersionedProfile; | import org.whispersystems.textsecuregcm.storage.VersionedProfile; | ||||||
| import org.whispersystems.textsecuregcm.util.ExactlySize; |  | ||||||
| import org.whispersystems.textsecuregcm.util.Pair; | import org.whispersystems.textsecuregcm.util.Pair; | ||||||
| import software.amazon.awssdk.services.s3.S3Client; | import software.amazon.awssdk.services.s3.S3Client; | ||||||
| import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; | import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; | ||||||
|  | @ -110,8 +103,6 @@ public class ProfileController { | ||||||
|   private static final String PROFILE_KEY_CREDENTIAL_TYPE = "profileKey"; |   private static final String PROFILE_KEY_CREDENTIAL_TYPE = "profileKey"; | ||||||
|   private static final String PNI_CREDENTIAL_TYPE = "pni"; |   private static final String PNI_CREDENTIAL_TYPE = "pni"; | ||||||
| 
 | 
 | ||||||
|   private static final String LEGACY_GET_PROFILE_COUNTER_NAME = name(ProfileController.class, "legacyGetProfileByPlatform"); |  | ||||||
| 
 |  | ||||||
|   public ProfileController( |   public ProfileController( | ||||||
|       Clock clock, |       Clock clock, | ||||||
|       RateLimiters rateLimiters, |       RateLimiters rateLimiters, | ||||||
|  | @ -395,24 +386,13 @@ public class ProfileController { | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // Old profile endpoints. Replaced by versioned profile endpoints (above) |   // Although clients should generally be using versioned profiles wherever possible, there are still a few lingering | ||||||
| 
 |   // use cases for getting profiles without a version (e.g. getting a contact's unidentified access key checksum). | ||||||
|     @Deprecated |  | ||||||
|     @Timed |  | ||||||
|     @PUT |  | ||||||
|     @Produces(MediaType.APPLICATION_JSON) |  | ||||||
|     @Path("/name/{name}") |  | ||||||
|     public void setLegacyProfile(@Auth AuthenticatedAccount auth, |  | ||||||
|                            @PathParam("name") @ExactlySize(value = {72, 108}, payload = {Unwrapping.Unwrap.class}) Optional<String> name) { |  | ||||||
|         accountsManager.update(auth.getAccount(), a -> a.setProfileName(name.orElse(null))); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|   @Deprecated |  | ||||||
|   @Timed |   @Timed | ||||||
|   @GET |   @GET | ||||||
|   @Produces(MediaType.APPLICATION_JSON) |   @Produces(MediaType.APPLICATION_JSON) | ||||||
|   @Path("/{identifier}") |   @Path("/{identifier}") | ||||||
|   public Profile getLegacyProfile( |   public Profile getUnversionedProfile( | ||||||
|       @Auth Optional<AuthenticatedAccount> auth, |       @Auth Optional<AuthenticatedAccount> auth, | ||||||
|       @HeaderParam(OptionalAccess.UNIDENTIFIED) Optional<Anonymous> accessKey, |       @HeaderParam(OptionalAccess.UNIDENTIFIED) Optional<Anonymous> accessKey, | ||||||
|       @Context ContainerRequestContext containerRequestContext, |       @Context ContainerRequestContext containerRequestContext, | ||||||
|  | @ -425,8 +405,6 @@ public class ProfileController { | ||||||
|       throw new WebApplicationException(Response.Status.UNAUTHORIZED); |       throw new WebApplicationException(Response.Status.UNAUTHORIZED); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     Metrics.counter(LEGACY_GET_PROFILE_COUNTER_NAME, Tags.of(UserAgentTagUtil.getPlatformTag(userAgent))).increment(); |  | ||||||
| 
 |  | ||||||
|     boolean isSelf = false; |     boolean isSelf = false; | ||||||
|     if (auth.isPresent()) { |     if (auth.isPresent()) { | ||||||
|       UUID authedUuid = auth.get().getAccount().getUuid(); |       UUID authedUuid = auth.get().getAccount().getUuid(); | ||||||
|  | @ -459,30 +437,6 @@ public class ProfileController { | ||||||
|         null); |         null); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|     @Deprecated |  | ||||||
|     @Timed |  | ||||||
|     @GET |  | ||||||
|     @Produces(MediaType.APPLICATION_JSON) |  | ||||||
|     @Path("/form/avatar") |  | ||||||
|     public ProfileAvatarUploadAttributes getLegacyAvatarUploadForm(@Auth AuthenticatedAccount auth) { |  | ||||||
|         String previousAvatar = auth.getAccount().getAvatar(); |  | ||||||
|         String objectName = generateAvatarObjectName(); |  | ||||||
|         ProfileAvatarUploadAttributes profileAvatarUploadAttributes = generateAvatarUploadForm(objectName); |  | ||||||
| 
 |  | ||||||
|         if (previousAvatar != null && previousAvatar.startsWith("profiles/")) { |  | ||||||
|             s3client.deleteObject(DeleteObjectRequest.builder() |  | ||||||
|                     .bucket(bucket) |  | ||||||
|                     .key(previousAvatar) |  | ||||||
|                     .build()); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         accountsManager.update(auth.getAccount(), a -> a.setAvatar(objectName)); |  | ||||||
| 
 |  | ||||||
|     return profileAvatarUploadAttributes; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   //// |  | ||||||
| 
 |  | ||||||
|   private ProfileAvatarUploadAttributes generateAvatarUploadForm(String objectName) { |   private ProfileAvatarUploadAttributes generateAvatarUploadForm(String objectName) { | ||||||
|     ZonedDateTime        now            = ZonedDateTime.now(ZoneOffset.UTC); |     ZonedDateTime        now            = ZonedDateTime.now(ZoneOffset.UTC); | ||||||
|     Pair<String, String> policy         = policyGenerator.createFor(now, objectName, 10 * 1024 * 1024); |     Pair<String, String> policy         = policyGenerator.createFor(now, objectName, 10 * 1024 * 1024); | ||||||
|  |  | ||||||
|  | @ -323,46 +323,6 @@ class ProfileControllerTest { | ||||||
|     assertThat(profile.getCapabilities().isAnnouncementGroup()).isFalse(); |     assertThat(profile.getCapabilities().isAnnouncementGroup()).isFalse(); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   @Test |  | ||||||
|   void testSetProfileNameDeprecated() { |  | ||||||
|     Response response = resources.getJerseyTest() |  | ||||||
|                                  .target("/v1/profile/name/123456789012345678901234567890123456789012345678901234567890123456789012") |  | ||||||
|                                  .request() |  | ||||||
|                                  .header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_UUID, AuthHelper.VALID_PASSWORD)) |  | ||||||
|                                  .put(Entity.text("")); |  | ||||||
| 
 |  | ||||||
|     assertThat(response.getStatus()).isEqualTo(204); |  | ||||||
| 
 |  | ||||||
|     verify(accountsManager, times(1)).update(any(Account.class), any()); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   @Test |  | ||||||
|   void testSetProfileNameExtendedDeprecated() { |  | ||||||
|     Response response = resources.getJerseyTest() |  | ||||||
|                                  .target("/v1/profile/name/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678") |  | ||||||
|                                  .request() |  | ||||||
|                                  .header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_UUID, AuthHelper.VALID_PASSWORD)) |  | ||||||
|                                  .put(Entity.text("")); |  | ||||||
| 
 |  | ||||||
|     assertThat(response.getStatus()).isEqualTo(204); |  | ||||||
| 
 |  | ||||||
|     verify(accountsManager, times(1)).update(any(Account.class), any()); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   @Test |  | ||||||
|   void testSetProfileNameWrongSizeDeprecated() { |  | ||||||
|     Response response = resources.getJerseyTest() |  | ||||||
|                                  .target("/v1/profile/name/1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890") |  | ||||||
|                                  .request() |  | ||||||
|                                  .header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_UUID, AuthHelper.VALID_PASSWORD)) |  | ||||||
|                                  .put(Entity.text("")); |  | ||||||
| 
 |  | ||||||
|     assertThat(response.getStatus()).isEqualTo(400); |  | ||||||
|     verifyNoMoreInteractions(accountsManager); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   ///// |  | ||||||
| 
 |  | ||||||
|   @Test |   @Test | ||||||
|   void testSetProfileWantAvatarUpload() throws InvalidInputException { |   void testSetProfileWantAvatarUpload() throws InvalidInputException { | ||||||
|     ProfileKeyCommitment commitment = new ProfileKey(new byte[32]).getCommitment(AuthHelper.VALID_UUID); |     ProfileKeyCommitment commitment = new ProfileKey(new byte[32]).getCommitment(AuthHelper.VALID_UUID); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Jon Chambers
						Jon Chambers