Move CertificateApi and RateLimitChallengeApi deps.

This commit is contained in:
Greyson Parrelli
2026-05-13 14:30:02 -04:00
committed by Michelle Tang
parent 3087116618
commit 1ce41edc7f
6 changed files with 47 additions and 104 deletions
@@ -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")
@@ -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;
}
}
@@ -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;
}
}
@@ -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<byte[]> {
@Override
public void serialize(byte[] value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(Base64.encodeWithPadding(value));
}
}
public static class ByteArrayDesieralizer extends JsonDeserializer<byte[]> {
@Override
public byte[] deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return Base64.decode(p.getValueAsString());
}
}
}
@@ -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<ByteArray>() {
override fun serialize(value: ByteArray, gen: JsonGenerator, serializers: SerializerProvider) {
gen.writeString(Base64.encodeWithPadding(value))
}
}
class ByteArrayDeserializer : JsonDeserializer<ByteArray>() {
override fun deserialize(p: JsonParser, ctxt: DeserializationContext): ByteArray {
return Base64.decode(p.valueAsString)
}
}
}
@@ -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
}