From 817f0579273d366f2ff95fbf821309fc75732901 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Tue, 19 May 2020 15:55:28 -0400 Subject: [PATCH] Inject timestamps into responses. --- .../textsecuregcm/WhisperServerService.java | 3 +++ .../filters/TimestampResponseFilter.java | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 service/src/main/java/org/whispersystems/textsecuregcm/filters/TimestampResponseFilter.java diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index 050291102..0c7e75f82 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -73,6 +73,7 @@ import org.whispersystems.textsecuregcm.controllers.SecureBackupController; import org.whispersystems.textsecuregcm.controllers.SecureStorageController; import org.whispersystems.textsecuregcm.controllers.StickerController; import org.whispersystems.textsecuregcm.controllers.VoiceVerificationController; +import org.whispersystems.textsecuregcm.filters.TimestampResponseFilter; import org.whispersystems.textsecuregcm.limits.RateLimiters; import org.whispersystems.textsecuregcm.liquibase.NameableMigrationsBundle; import org.whispersystems.textsecuregcm.mappers.DeviceLimitExceededExceptionMapper; @@ -323,6 +324,8 @@ public class WhisperServerService extends Application(ImmutableSet.of(Account.class, DisabledPermittedAccount.class))); + environment.jersey().register(new TimestampResponseFilter()); + environment.jersey().register(new AccountController(pendingAccountsManager, accountsManager, usernamesManager, abusiveHostRules, rateLimiters, smsSender, directoryQueue, messagesManager, turnTokenGenerator, config.getTestDevices(), recaptchaClient, gcmSender, apnSender, backupCredentialsGenerator)); environment.jersey().register(new DeviceController(pendingDevicesManager, accountsManager, messagesManager, directoryQueue, rateLimiters, config.getMaxDevices())); environment.jersey().register(new DirectoryController(rateLimiters, directory, directoryCredentialsGenerator)); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/filters/TimestampResponseFilter.java b/service/src/main/java/org/whispersystems/textsecuregcm/filters/TimestampResponseFilter.java new file mode 100644 index 000000000..130787a24 --- /dev/null +++ b/service/src/main/java/org/whispersystems/textsecuregcm/filters/TimestampResponseFilter.java @@ -0,0 +1,19 @@ +package org.whispersystems.textsecuregcm.filters; + +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; +import java.util.Collections; + +/** + * Injects a timestamp header into all outbound responses. + */ +public class TimestampResponseFilter implements ContainerResponseFilter { + + private static final String TIMESTAMP_HEADER = "X-Signal-Timestamp"; + + @Override + public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) { + responseContext.getStringHeaders().put(TIMESTAMP_HEADER, Collections.singletonList(String.valueOf(System.currentTimeMillis()))); + } +}