From 1ce41edc7ffcc71f74173e1062ef59873d4ad191 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 13 May 2026 14:30:02 -0400 Subject: [PATCH] Move CertificateApi and RateLimitChallengeApi deps. --- .../securesms/testing/MockProvider.kt | 3 -- .../ratelimit/SubmitPushChallengePayload.java | 24 ---------- .../SubmitRecaptchaChallengePayload.java | 28 ------------ .../internal/push/SenderCertificate.java | 45 ------------------- .../org/signal/network/api/CertificateApi.kt | 32 ++++++++++++- .../network/api/RateLimitChallengeApi.kt | 19 +++++++- 6 files changed, 47 insertions(+), 104 deletions(-) delete mode 100644 lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitPushChallengePayload.java delete mode 100644 lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitRecaptchaChallengePayload.java delete mode 100644 lib/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SenderCertificate.java diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt index a5d186a10d..be467837aa 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt @@ -17,7 +17,6 @@ import org.whispersystems.signalservice.internal.push.PreKeyResponse import org.whispersystems.signalservice.internal.push.PreKeyResponseItem import org.whispersystems.signalservice.internal.push.PushServiceSocket import org.whispersystems.signalservice.internal.push.RegistrationSessionMetadataJson -import org.whispersystems.signalservice.internal.push.SenderCertificate import org.whispersystems.signalservice.internal.push.VerifyAccountResponse import org.whispersystems.signalservice.internal.push.WhoAmIResponse import java.security.SecureRandom @@ -27,8 +26,6 @@ import java.security.SecureRandom */ object MockProvider { - val senderCertificate = SenderCertificate().apply { certificate = ByteArray(0) } - val lockedFailure = PushServiceSocket.RegistrationLockFailure().apply { svr1Credentials = AuthCredentials.create("username", "password") svr2Credentials = AuthCredentials.create("username", "password") diff --git a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitPushChallengePayload.java b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitPushChallengePayload.java deleted file mode 100644 index 06099bd80a..0000000000 --- a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitPushChallengePayload.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2025 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.whispersystems.signalservice.api.ratelimit; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class SubmitPushChallengePayload { - - @JsonProperty - private String type; - - @JsonProperty - private String challenge; - - public SubmitPushChallengePayload() {} - - public SubmitPushChallengePayload(String challenge) { - this.type = "rateLimitPushChallenge"; - this.challenge = challenge; - } -} diff --git a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitRecaptchaChallengePayload.java b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitRecaptchaChallengePayload.java deleted file mode 100644 index 654a42152c..0000000000 --- a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitRecaptchaChallengePayload.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2025 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.whispersystems.signalservice.api.ratelimit; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class SubmitRecaptchaChallengePayload { - - @JsonProperty - private String type; - - @JsonProperty - private String token; - - @JsonProperty - private String captcha; - - public SubmitRecaptchaChallengePayload() {} - - public SubmitRecaptchaChallengePayload(String challenge, String recaptchaToken) { - this.type = "captcha"; - this.token = challenge; - this.captcha = recaptchaToken; - } -} diff --git a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SenderCertificate.java b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SenderCertificate.java deleted file mode 100644 index 1bda288c91..0000000000 --- a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SenderCertificate.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.whispersystems.signalservice.internal.push; - - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -import org.signal.core.util.Base64; - -import java.io.IOException; - -public class SenderCertificate { - - @JsonProperty - @JsonDeserialize(using = ByteArrayDesieralizer.class) - @JsonSerialize(using = ByteArraySerializer.class) - public byte[] certificate; - - public SenderCertificate() {} - - public byte[] getCertificate() { - return certificate; - } - - public static class ByteArraySerializer extends JsonSerializer { - @Override - public void serialize(byte[] value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - gen.writeString(Base64.encodeWithPadding(value)); - } - } - - public static class ByteArrayDesieralizer extends JsonDeserializer { - - @Override - public byte[] deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - return Base64.decode(p.getValueAsString()); - } - } -} diff --git a/lib/network/src/main/java/org/signal/network/api/CertificateApi.kt b/lib/network/src/main/java/org/signal/network/api/CertificateApi.kt index ec62df6f93..f5b89c21b1 100644 --- a/lib/network/src/main/java/org/signal/network/api/CertificateApi.kt +++ b/lib/network/src/main/java/org/signal/network/api/CertificateApi.kt @@ -5,14 +5,23 @@ package org.signal.network.api +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.databind.DeserializationContext +import com.fasterxml.jackson.databind.JsonDeserializer +import com.fasterxml.jackson.databind.JsonSerializer +import com.fasterxml.jackson.databind.SerializerProvider +import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import org.signal.core.util.Base64 import org.whispersystems.signalservice.api.NetworkResult import org.whispersystems.signalservice.api.websocket.SignalWebSocket import org.whispersystems.signalservice.internal.get -import org.whispersystems.signalservice.internal.push.SenderCertificate import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage /** - * Endpoints to get [org.whispersystems.signalservice.internal.push.SenderCertificate]s. + * Endpoints to get sender certificates. */ class CertificateApi(private val authWebSocket: SignalWebSocket.AuthenticatedWebSocket) { @@ -36,3 +45,22 @@ class CertificateApi(private val authWebSocket: SignalWebSocket.AuthenticatedWeb .map { it.certificate } } } + +private class SenderCertificate { + @JsonProperty + @JsonDeserialize(using = ByteArrayDeserializer::class) + @JsonSerialize(using = ByteArraySerializer::class) + var certificate: ByteArray = byteArrayOf() + + class ByteArraySerializer : JsonSerializer() { + override fun serialize(value: ByteArray, gen: JsonGenerator, serializers: SerializerProvider) { + gen.writeString(Base64.encodeWithPadding(value)) + } + } + + class ByteArrayDeserializer : JsonDeserializer() { + override fun deserialize(p: JsonParser, ctxt: DeserializationContext): ByteArray { + return Base64.decode(p.valueAsString) + } + } +} diff --git a/lib/network/src/main/java/org/signal/network/api/RateLimitChallengeApi.kt b/lib/network/src/main/java/org/signal/network/api/RateLimitChallengeApi.kt index b7d0021757..850391c700 100644 --- a/lib/network/src/main/java/org/signal/network/api/RateLimitChallengeApi.kt +++ b/lib/network/src/main/java/org/signal/network/api/RateLimitChallengeApi.kt @@ -5,9 +5,8 @@ package org.signal.network.api +import com.fasterxml.jackson.annotation.JsonProperty import org.whispersystems.signalservice.api.NetworkResult -import org.whispersystems.signalservice.api.ratelimit.SubmitPushChallengePayload -import org.whispersystems.signalservice.api.ratelimit.SubmitRecaptchaChallengePayload import org.whispersystems.signalservice.api.websocket.SignalWebSocket import org.whispersystems.signalservice.internal.post import org.whispersystems.signalservice.internal.put @@ -58,3 +57,19 @@ class RateLimitChallengeApi(private val authWebSocket: SignalWebSocket.Authentic return NetworkResult.fromWebSocketRequest(authWebSocket, request) } } + +private class SubmitPushChallengePayload(@JsonProperty val challenge: String) { + @JsonProperty + val type: String = "rateLimitPushChallenge" +} + +private class SubmitRecaptchaChallengePayload(challenge: String, recaptchaToken: String) { + @JsonProperty + val type: String = "captcha" + + @JsonProperty + val token: String = challenge + + @JsonProperty + val captcha: String = recaptchaToken +}