From 61a8636217e8a6683c79e5371ddaf97fe15a2705 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Tue, 11 Mar 2025 15:22:50 -0400 Subject: [PATCH] Convert rate limit apis to WebSocket. --- .../securesms/dependencies/AppDependencies.kt | 5 ++ .../ApplicationDependencyProvider.java | 6 ++ .../dependencies/NetworkDependenciesModule.kt | 5 ++ .../jobs/SubmitRateLimitPushChallengeJob.java | 9 +-- .../securesms/net/SignalNetwork.kt | 6 ++ .../ProofRequiredExceptionHandler.kt | 37 ++++++------ .../ratelimit/RecaptchaProofActivity.java | 15 +++-- .../securesms/util/ExceptionExtensions.kt | 18 ++++++ .../MockApplicationDependencyProvider.kt | 5 ++ .../api/SignalServiceAccountManager.java | 12 ---- .../api/ratelimit/RateLimitChallengeApi.kt | 58 +++++++++++++++++++ .../SubmitPushChallengePayload.java | 7 ++- .../SubmitRecaptchaChallengePayload.java | 7 ++- .../internal/push/PushServiceSocket.java | 22 ------- 14 files changed, 149 insertions(+), 63 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/util/ExceptionExtensions.kt create mode 100644 libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/RateLimitChallengeApi.kt rename libsignal-service/src/main/java/org/whispersystems/signalservice/{internal/push => api/ratelimit}/SubmitPushChallengePayload.java (71%) rename libsignal-service/src/main/java/org/whispersystems/signalservice/{internal/push => api/ratelimit}/SubmitRecaptchaChallengePayload.java (75%) diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/AppDependencies.kt b/app/src/main/java/org/thoughtcrime/securesms/dependencies/AppDependencies.kt index 6744302f59..1180911e78 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/AppDependencies.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/AppDependencies.kt @@ -51,6 +51,7 @@ import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations import org.whispersystems.signalservice.api.keys.KeysApi import org.whispersystems.signalservice.api.link.LinkDeviceApi import org.whispersystems.signalservice.api.payments.PaymentsApi +import org.whispersystems.signalservice.api.ratelimit.RateLimitChallengeApi import org.whispersystems.signalservice.api.registration.RegistrationApi import org.whispersystems.signalservice.api.services.DonationsService import org.whispersystems.signalservice.api.services.ProfileService @@ -326,6 +327,9 @@ object AppDependencies { val cdsApi: CdsApi get() = networkModule.cdsApi + val rateLimitChallengeApi: RateLimitChallengeApi + get() = networkModule.rateLimitChallengeApi + @JvmStatic val okHttpClient: OkHttpClient get() = networkModule.okHttpClient @@ -401,5 +405,6 @@ object AppDependencies { fun provideCallingApi(authWebSocket: SignalWebSocket.AuthenticatedWebSocket, pushServiceSocket: PushServiceSocket): CallingApi fun providePaymentsApi(authWebSocket: SignalWebSocket.AuthenticatedWebSocket): PaymentsApi fun provideCdsApi(authWebSocket: SignalWebSocket.AuthenticatedWebSocket): CdsApi + fun provideRateLimitChallengeApi(authWebSocket: SignalWebSocket.AuthenticatedWebSocket): RateLimitChallengeApi } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java index 174b258c81..d00f9486d9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java @@ -92,6 +92,7 @@ import org.whispersystems.signalservice.api.link.LinkDeviceApi; import org.whispersystems.signalservice.api.payments.PaymentsApi; import org.whispersystems.signalservice.api.push.ServiceId.ACI; import org.whispersystems.signalservice.api.push.ServiceId.PNI; +import org.whispersystems.signalservice.api.ratelimit.RateLimitChallengeApi; import org.whispersystems.signalservice.api.registration.RegistrationApi; import org.whispersystems.signalservice.api.services.DonationsService; import org.whispersystems.signalservice.api.services.ProfileService; @@ -516,6 +517,11 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider { return new CdsApi(authWebSocket); } + @Override + public @NonNull RateLimitChallengeApi provideRateLimitChallengeApi(@NonNull SignalWebSocket.AuthenticatedWebSocket authWebSocket) { + return new RateLimitChallengeApi(authWebSocket); + } + @VisibleForTesting static class DynamicCredentialsProvider implements CredentialsProvider { diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/NetworkDependenciesModule.kt b/app/src/main/java/org/thoughtcrime/securesms/dependencies/NetworkDependenciesModule.kt index 4a38d6bd64..079fad7aa3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/NetworkDependenciesModule.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/NetworkDependenciesModule.kt @@ -36,6 +36,7 @@ import org.whispersystems.signalservice.api.keys.KeysApi import org.whispersystems.signalservice.api.link.LinkDeviceApi import org.whispersystems.signalservice.api.payments.PaymentsApi import org.whispersystems.signalservice.api.push.TrustStore +import org.whispersystems.signalservice.api.ratelimit.RateLimitChallengeApi import org.whispersystems.signalservice.api.registration.RegistrationApi import org.whispersystems.signalservice.api.services.DonationsService import org.whispersystems.signalservice.api.services.ProfileService @@ -177,6 +178,10 @@ class NetworkDependenciesModule( provider.provideCdsApi(authWebSocket) } + val rateLimitChallengeApi: RateLimitChallengeApi by lazy { + provider.provideRateLimitChallengeApi(authWebSocket) + } + val okHttpClient: OkHttpClient by lazy { OkHttpClient.Builder() .addInterceptor(StandardUserAgentInterceptor()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/SubmitRateLimitPushChallengeJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SubmitRateLimitPushChallengeJob.java index f0d117b8d7..18082aecc3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/SubmitRateLimitPushChallengeJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/SubmitRateLimitPushChallengeJob.java @@ -4,13 +4,14 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.greenrobot.eventbus.EventBus; -import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.jobmanager.JsonJobData; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.keyvalue.SignalStore; +import org.thoughtcrime.securesms.net.SignalNetwork; import org.thoughtcrime.securesms.ratelimit.RateLimitUtil; -import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; +import org.thoughtcrime.securesms.util.ExceptionHelper; +import org.whispersystems.signalservice.api.NetworkResultUtil; import java.util.concurrent.TimeUnit; @@ -51,7 +52,7 @@ public final class SubmitRateLimitPushChallengeJob extends BaseJob { @Override protected void onRun() throws Exception { - AppDependencies.getSignalServiceAccountManager().submitRateLimitPushChallenge(challenge); + NetworkResultUtil.toBasicLegacy(SignalNetwork.rateLimitChallenge().submitPushChallenge(challenge)); SignalStore.rateLimit().onProofAccepted(); EventBus.getDefault().post(new SuccessEvent()); RateLimitUtil.retryAllRateLimitedMessages(context); @@ -59,7 +60,7 @@ public final class SubmitRateLimitPushChallengeJob extends BaseJob { @Override protected boolean onShouldRetry(@NonNull Exception e) { - return e instanceof PushNetworkException; + return ExceptionHelper.isRetryableIOException(e); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/net/SignalNetwork.kt b/app/src/main/java/org/thoughtcrime/securesms/net/SignalNetwork.kt index e22d29ec87..a2ad78c266 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/net/SignalNetwork.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/net/SignalNetwork.kt @@ -14,6 +14,7 @@ import org.whispersystems.signalservice.api.cds.CdsApi import org.whispersystems.signalservice.api.keys.KeysApi import org.whispersystems.signalservice.api.link.LinkDeviceApi import org.whispersystems.signalservice.api.payments.PaymentsApi +import org.whispersystems.signalservice.api.ratelimit.RateLimitChallengeApi import org.whispersystems.signalservice.api.storage.StorageServiceApi import org.whispersystems.signalservice.api.username.UsernameApi @@ -51,6 +52,11 @@ object SignalNetwork { val payments: PaymentsApi get() = AppDependencies.paymentsApi + @JvmStatic + @get:JvmName("rateLimitChallenge") + val rateLimitChallenge: RateLimitChallengeApi + get() = AppDependencies.rateLimitChallengeApi + val storageService: StorageServiceApi get() = AppDependencies.storageServiceApi diff --git a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/ProofRequiredExceptionHandler.kt b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/ProofRequiredExceptionHandler.kt index 2e97681ced..ad784241a6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/ProofRequiredExceptionHandler.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/ProofRequiredExceptionHandler.kt @@ -16,11 +16,11 @@ import org.thoughtcrime.securesms.database.model.ParentStoryId import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.jobs.SubmitRateLimitPushChallengeJob.SuccessEvent import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.net.SignalNetwork import org.thoughtcrime.securesms.notifications.v2.ConversationId import org.thoughtcrime.securesms.recipients.Recipient -import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException +import org.whispersystems.signalservice.api.NetworkResult import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredException -import java.io.IOException import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit import kotlin.time.Duration @@ -42,25 +42,26 @@ object ProofRequiredExceptionHandler { fun handle(context: Context, proofRequired: ProofRequiredException, recipient: Recipient?, threadId: Long, messageId: Long): Result { Log.w(TAG, "[Proof Required] Options: ${proofRequired.options}") - try { - if (ProofRequiredException.Option.PUSH_CHALLENGE in proofRequired.options) { - AppDependencies.signalServiceAccountManager.requestRateLimitPushChallenge() - Log.i(TAG, "[Proof Required] Successfully requested a challenge. Waiting up to $PUSH_CHALLENGE_TIMEOUT ms.") + if (ProofRequiredException.Option.PUSH_CHALLENGE in proofRequired.options) { + when (val result = SignalNetwork.rateLimitChallenge.requestPushChallenge()) { + is NetworkResult.Success -> { + Log.i(TAG, "[Proof Required] Successfully requested a challenge. Waiting up to $PUSH_CHALLENGE_TIMEOUT ms.") + val success = PushChallengeRequest(PUSH_CHALLENGE_TIMEOUT).blockUntilSuccess() - val success = PushChallengeRequest(PUSH_CHALLENGE_TIMEOUT).blockUntilSuccess() - - if (success) { - Log.i(TAG, "Successfully responded to a push challenge. Retrying message send.") - return Result.RETRY_NOW - } else { - Log.w(TAG, "Failed to respond to the push challeng in time. Falling back.") + if (success) { + Log.i(TAG, "Successfully responded to a push challenge. Retrying message send.") + return Result.RETRY_NOW + } else { + Log.w(TAG, "Failed to respond to the push challeng in time. Falling back.") + } } + is NetworkResult.StatusCodeError -> Log.w(TAG, "[Proof Required] Could not request a push challenge (${result.code}). Falling back.", result.exception) + is NetworkResult.NetworkError -> { + Log.w(TAG, "[Proof Required] Network error when requesting push challenge. Retrying later.") + return Result.RETRY_LATER + } + is NetworkResult.ApplicationError -> throw result.throwable } - } catch (e: NonSuccessfulResponseCodeException) { - Log.w(TAG, "[Proof Required] Could not request a push challenge (${e.code}). Falling back.", e) - } catch (e: IOException) { - Log.w(TAG, "[Proof Required] Network error when requesting push challenge. Retrying later.") - return Result.RETRY_LATER } if (messageId > 0) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofActivity.java index 8ca2d37c97..44cc44d94e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ratelimit/RecaptchaProofActivity.java @@ -19,12 +19,13 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.PassphraseRequiredActivity; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.keyvalue.SignalStore; +import org.thoughtcrime.securesms.net.SignalNetwork; import org.thoughtcrime.securesms.util.DynamicTheme; +import org.thoughtcrime.securesms.util.ExceptionHelper; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; -import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; +import org.whispersystems.signalservice.api.NetworkResultUtil; import java.io.IOException; @@ -98,12 +99,16 @@ public class RecaptchaProofActivity extends PassphraseRequiredActivity { try { for (int i = 0; i < 3; i++) { try { - AppDependencies.getSignalServiceAccountManager().submitRateLimitRecaptchaChallenge(challenge, token); + NetworkResultUtil.toBasicLegacy(SignalNetwork.rateLimitChallenge().submitCaptchaChallenge(challenge, token)); RateLimitUtil.retryAllRateLimitedMessages(this); Log.i(TAG, "Successfully completed reCAPTCHA."); return new TokenResult(true, true); - } catch (PushNetworkException e) { - Log.w(TAG, "Network error during submission. Retrying.", e); + } catch (IOException e) { + if (ExceptionHelper.isRetryableIOException(e)) { + Log.w(TAG, "Network error during submission. Retrying.", e); + } else { + throw e; + } } } } catch (IOException e) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ExceptionExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/util/ExceptionExtensions.kt new file mode 100644 index 0000000000..f6dfee3372 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/util/ExceptionExtensions.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +@file:JvmName("ExceptionHelper") + +package org.thoughtcrime.securesms.util + +import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException +import java.io.IOException + +/** + * Returns true if this exception is a retryable I/O Exception. Helpful for jobs. + */ +fun Throwable.isRetryableIOException(): Boolean { + return this is IOException && this !is NonSuccessfulResponseCodeException +} diff --git a/app/src/test/java/org/thoughtcrime/securesms/dependencies/MockApplicationDependencyProvider.kt b/app/src/test/java/org/thoughtcrime/securesms/dependencies/MockApplicationDependencyProvider.kt index 67f6cc8736..ab070679f0 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/dependencies/MockApplicationDependencyProvider.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/dependencies/MockApplicationDependencyProvider.kt @@ -45,6 +45,7 @@ import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations import org.whispersystems.signalservice.api.keys.KeysApi import org.whispersystems.signalservice.api.link.LinkDeviceApi import org.whispersystems.signalservice.api.payments.PaymentsApi +import org.whispersystems.signalservice.api.ratelimit.RateLimitChallengeApi import org.whispersystems.signalservice.api.registration.RegistrationApi import org.whispersystems.signalservice.api.services.DonationsService import org.whispersystems.signalservice.api.services.ProfileService @@ -265,4 +266,8 @@ class MockApplicationDependencyProvider : AppDependencies.Provider { override fun provideCdsApi(authWebSocket: SignalWebSocket.AuthenticatedWebSocket): CdsApi { return mockk(relaxed = true) } + + override fun provideRateLimitChallengeApi(authWebSocket: SignalWebSocket.AuthenticatedWebSocket): RateLimitChallengeApi { + return mockk(relaxed = true) + } } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java index ffcb432963..f9f20b7c0a 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java @@ -238,18 +238,6 @@ public class SignalServiceAccountManager { } } - public void requestRateLimitPushChallenge() throws IOException { - this.pushServiceSocket.requestRateLimitPushChallenge(); - } - - public void submitRateLimitPushChallenge(String challenge) throws IOException { - this.pushServiceSocket.submitRateLimitPushChallenge(challenge); - } - - public void submitRateLimitRecaptchaChallenge(String challenge, String recaptchaToken) throws IOException { - this.pushServiceSocket.submitRateLimitRecaptchaChallenge(challenge, recaptchaToken); - } - public void cancelInFlightRequests() { this.pushServiceSocket.cancelInFlightRequests(); } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/RateLimitChallengeApi.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/RateLimitChallengeApi.kt new file mode 100644 index 0000000000..69d8d8cd45 --- /dev/null +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/RateLimitChallengeApi.kt @@ -0,0 +1,58 @@ +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.whispersystems.signalservice.api.ratelimit + +import org.whispersystems.signalservice.api.NetworkResult +import org.whispersystems.signalservice.api.websocket.SignalWebSocket +import org.whispersystems.signalservice.internal.post +import org.whispersystems.signalservice.internal.put +import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage + +/** + * Calls for requesting and submitting rate limit triggered challenges. + */ +class RateLimitChallengeApi(private val authWebSocket: SignalWebSocket.AuthenticatedWebSocket) { + + /** + * Request a push challenge for rate limits. + * + * PUT /v1/challenge/push + * - 200: Success + * - 404: No push token available + * - 413: Submitted non-empty body + * - 429: Too many attempts + */ + fun requestPushChallenge(): NetworkResult { + val request = WebSocketRequestMessage.post("/v1/challenge/push", null) + return NetworkResult.fromWebSocketRequest(authWebSocket, request) + } + + /** + * Submit a push token to reset rate limits. + * + * PUT /v1/challenge + * - 200: Success + * - 428: Challenge token is invalid + * - 429: Too many attempts + */ + fun submitPushChallenge(challenge: String): NetworkResult { + val request = WebSocketRequestMessage.put("/v1/challenge", SubmitPushChallengePayload(challenge)) + return NetworkResult.fromWebSocketRequest(authWebSocket, request) + } + + /** + * Submit a captcha token to reset rate limits. + * + * PUT /v1/challenge + * - 200: Success + * - 428: Challenge token is invalid + * - 429: Too many attempts + */ + fun submitCaptchaChallenge(challenge: String, token: String): NetworkResult { + val request = WebSocketRequestMessage.put("/v1/challenge", SubmitRecaptchaChallengePayload(challenge, token)) + return NetworkResult.fromWebSocketRequest(authWebSocket, request) + } +} diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SubmitPushChallengePayload.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitPushChallengePayload.java similarity index 71% rename from libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SubmitPushChallengePayload.java rename to libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitPushChallengePayload.java index 8ff609725c..da3536267e 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SubmitPushChallengePayload.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitPushChallengePayload.java @@ -1,4 +1,9 @@ -package org.whispersystems.signalservice.internal.push; +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.whispersystems.signalservice.api.ratelimit; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SubmitRecaptchaChallengePayload.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitRecaptchaChallengePayload.java similarity index 75% rename from libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SubmitRecaptchaChallengePayload.java rename to libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitRecaptchaChallengePayload.java index 2218dab3be..82d06a90d8 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SubmitRecaptchaChallengePayload.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/ratelimit/SubmitRecaptchaChallengePayload.java @@ -1,4 +1,9 @@ -package org.whispersystems.signalservice.internal.push; +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.whispersystems.signalservice.api.ratelimit; import com.fasterxml.jackson.annotation.JsonProperty; 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 6c7f7033f3..edcfc62d31 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 @@ -230,9 +230,6 @@ public class PushServiceSocket { private static final String GROUPSV2_TOKEN = "/v2/groups/token"; private static final String GROUPSV2_JOINED_AT = "/v2/groups/joined_at_version"; - private static final String SUBMIT_RATE_LIMIT_CHALLENGE = "/v1/challenge"; - private static final String REQUEST_RATE_LIMIT_PUSH_CHALLENGE = "/v1/challenge/push"; - private static final String DONATION_REDEEM_RECEIPT = "/v1/donation/redeem-receipt"; private static final String ARCHIVES_REDEEM_RECEIPT = "/v1/archives/redeem-receipt"; @@ -945,25 +942,6 @@ public class PushServiceSocket { return JsonUtil.fromJson(response, BackupV3AuthCheckResponse.class); } - public void requestRateLimitPushChallenge() throws IOException { - makeServiceRequest(REQUEST_RATE_LIMIT_PUSH_CHALLENGE, "POST", ""); - } - - public void submitRateLimitPushChallenge(String challenge) throws IOException { - String payload = JsonUtil.toJson(new SubmitPushChallengePayload(challenge)); - makeServiceRequest(SUBMIT_RATE_LIMIT_CHALLENGE, "PUT", payload, NO_HEADERS, (responseCode, body, getHeader) -> { - if (responseCode == 428) { - throw new CaptchaRejectedException(); - } - }, SealedSenderAccess.NONE); - - } - - public void submitRateLimitRecaptchaChallenge(String challenge, String recaptchaToken) throws IOException { - String payload = JsonUtil.toJson(new SubmitRecaptchaChallengePayload(challenge, recaptchaToken)); - makeServiceRequest(SUBMIT_RATE_LIMIT_CHALLENGE, "PUT", payload); - } - public void redeemDonationReceipt(ReceiptCredentialPresentation receiptCredentialPresentation, boolean visible, boolean primary) throws IOException { String payload = JsonUtil.toJson(new RedeemDonationReceiptRequest(Base64.encodeWithPadding(receiptCredentialPresentation.serialize()), visible, primary)); makeServiceRequest(DONATION_REDEEM_RECEIPT, "POST", payload);