diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java index 92331c5493e..d6bdbbe9242 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java @@ -124,6 +124,7 @@ import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration; import org.whispersystems.signalservice.internal.configuration.SignalUrl; import org.whispersystems.signalservice.internal.crypto.AttachmentDigest; +import org.whispersystems.signalservice.internal.push.exceptions.CaptchaRejectedException; import org.whispersystems.signalservice.internal.push.exceptions.DonationProcessorError; import org.whispersystems.signalservice.internal.push.exceptions.DonationReceiptCredentialError; import org.whispersystems.signalservice.internal.push.exceptions.ForbiddenException; @@ -1247,7 +1248,12 @@ public void requestRateLimitPushChallenge() throws IOException { public void submitRateLimitPushChallenge(String challenge) throws IOException { String payload = JsonUtil.toJson(new SubmitPushChallengePayload(challenge)); - makeServiceRequest(SUBMIT_RATE_LIMIT_CHALLENGE, "PUT", payload); + makeServiceRequest(SUBMIT_RATE_LIMIT_CHALLENGE, "PUT", payload, NO_HEADERS, (responseCode, body) -> { + if (responseCode == 428) { + throw new CaptchaRejectedException(); + } + }, Optional.empty()); + } public void submitRateLimitRecaptchaChallenge(String challenge, String recaptchaToken) throws IOException { diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/exceptions/CaptchaRejectedException.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/exceptions/CaptchaRejectedException.kt new file mode 100644 index 00000000000..8ae9e289c82 --- /dev/null +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/exceptions/CaptchaRejectedException.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.whispersystems.signalservice.internal.push.exceptions + +import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException + +/** + * Indicates that the captcha we submitted was not accepted by the server. + */ +class CaptchaRejectedException : NonSuccessfulResponseCodeException(428, "Captcha rejected by server.")