From b384ed7f5c2bfc1cad8af56f1c5a1730ee181e27 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Wed, 30 Jun 2021 15:21:04 -0400 Subject: [PATCH] Add a counter for requests for delivery certificates with/without e164s. --- .../auth/CertificateGenerator.java | 2 +- .../controllers/CertificateController.java | 43 +++++++++++-------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/auth/CertificateGenerator.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/CertificateGenerator.java index 9d8c6b6b1..26b06b6b6 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/auth/CertificateGenerator.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/auth/CertificateGenerator.java @@ -33,7 +33,7 @@ public class CertificateGenerator { this.serverCertificate = ServerCertificate.parseFrom(serverCertificate); } - public byte[] createFor(Account account, Device device, boolean includeE164) throws IOException, InvalidKeyException { + public byte[] createFor(Account account, Device device, boolean includeE164) throws InvalidKeyException { SenderCertificate.Certificate.Builder builder = SenderCertificate.Certificate.newBuilder() .setSenderDevice(Math.toIntExact(device.getId())) .setExpires(System.currentTimeMillis() + TimeUnit.DAYS.toMillis(expiresDays)) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/CertificateController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/CertificateController.java index d3f3a87e2..31725f997 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/CertificateController.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/CertificateController.java @@ -5,17 +5,16 @@ package org.whispersystems.textsecuregcm.controllers; +import static com.codahale.metrics.MetricRegistry.name; + import com.codahale.metrics.annotation.Timed; import io.dropwizard.auth.Auth; -import org.signal.zkgroup.auth.ServerZkAuthOperations; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.whispersystems.textsecuregcm.auth.CertificateGenerator; -import org.whispersystems.textsecuregcm.entities.DeliveryCertificate; -import org.whispersystems.textsecuregcm.entities.GroupCredentials; -import org.whispersystems.textsecuregcm.storage.Account; -import org.whispersystems.textsecuregcm.util.Util; - +import io.micrometer.core.instrument.Metrics; +import java.io.IOException; +import java.security.InvalidKeyException; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; @@ -24,22 +23,24 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.io.IOException; -import java.security.InvalidKeyException; -import java.util.LinkedList; -import java.util.List; -import java.util.Optional; +import org.signal.zkgroup.auth.ServerZkAuthOperations; +import org.whispersystems.textsecuregcm.auth.CertificateGenerator; +import org.whispersystems.textsecuregcm.entities.DeliveryCertificate; +import org.whispersystems.textsecuregcm.entities.GroupCredentials; +import org.whispersystems.textsecuregcm.storage.Account; +import org.whispersystems.textsecuregcm.util.Util; @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @Path("/v1/certificate") public class CertificateController { - private final Logger logger = LoggerFactory.getLogger(CertificateController.class); - private final CertificateGenerator certificateGenerator; private final ServerZkAuthOperations serverZkAuthOperations; private final boolean isZkEnabled; + private static final String GENERATE_DELIVERY_CERTIFICATE_COUNTER_NAME = name(CertificateGenerator.class, "generateCertificate"); + private static final String INCLUDE_E164_TAG_NAME = "includeE164"; + public CertificateController(CertificateGenerator certificateGenerator, ServerZkAuthOperations serverZkAuthOperations, boolean isZkEnabled) { this.certificateGenerator = certificateGenerator; this.serverZkAuthOperations = serverZkAuthOperations; @@ -51,8 +52,8 @@ public class CertificateController { @Produces(MediaType.APPLICATION_JSON) @Path("/delivery") public DeliveryCertificate getDeliveryCertificate(@Auth Account account, - @QueryParam("includeE164") Optional includeE164) - throws IOException, InvalidKeyException + @QueryParam("includeE164") Optional maybeIncludeE164) + throws InvalidKeyException { if (account.getAuthenticatedDevice().isEmpty()) { throw new AssertionError(); @@ -61,7 +62,11 @@ public class CertificateController { throw new WebApplicationException(Response.Status.BAD_REQUEST); } - return new DeliveryCertificate(certificateGenerator.createFor(account, account.getAuthenticatedDevice().get(), includeE164.orElse(true))); + final boolean includeE164 = maybeIncludeE164.orElse(true); + + Metrics.counter(GENERATE_DELIVERY_CERTIFICATE_COUNTER_NAME, INCLUDE_E164_TAG_NAME, String.valueOf(includeE164)).increment(); + + return new DeliveryCertificate(certificateGenerator.createFor(account, account.getAuthenticatedDevice().get(), includeE164)); } @Timed