From f35ce068f954e4fd3cd70b88a290812f08c21155 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 24 Apr 2024 11:41:31 -0400 Subject: [PATCH] Change profile fetch REST fallback based on authentication error. --- .../api/services/ProfileService.java | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/ProfileService.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/ProfileService.java index 1b3ddad5ba..55cdcaced2 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/ProfileService.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/ProfileService.java @@ -18,6 +18,7 @@ import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.ServiceId.ACI; import org.whispersystems.signalservice.api.push.SignalServiceAddress; +import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException; import org.whispersystems.signalservice.api.push.exceptions.MalformedResponseException; import org.whispersystems.signalservice.internal.ServiceResponse; import org.whispersystems.signalservice.internal.ServiceResponseProcessor; @@ -37,6 +38,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Optional; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; @@ -150,7 +152,20 @@ public final class ProfileService { @Nonnull Locale locale) { return Single.fromFuture(receiver.retrieveProfile(address, profileKey, unidentifiedAccess, requestType, locale), 10, TimeUnit.SECONDS) - .onErrorResumeNext(t -> Single.fromFuture(receiver.retrieveProfile(address, profileKey, Optional.empty(), requestType, locale), 10, TimeUnit.SECONDS)) + .onErrorResumeNext(t -> { + Throwable error; + if (t instanceof ExecutionException && t.getCause() != null) { + error = t.getCause(); + } else { + error = t; + } + + if (error instanceof AuthorizationFailedException) { + return Single.fromFuture(receiver.retrieveProfile(address, profileKey, Optional.empty(), requestType, locale), 10, TimeUnit.SECONDS); + } else { + return Single.error(t); + } + }) .map(p -> ServiceResponse.forResult(p, 0, null)); } @@ -158,7 +173,20 @@ public final class ProfileService { @Nonnull Optional unidentifiedAccess, @Nonnull ResponseMapper responseMapper) { return receiver.performIdentityCheck(request, unidentifiedAccess, responseMapper) - .onErrorResumeNext(t -> receiver.performIdentityCheck(request, Optional.empty(), responseMapper)); + .onErrorResumeNext(t -> { + Throwable error; + if (t instanceof ExecutionException && t.getCause() != null) { + error = t.getCause(); + } else { + error = t; + } + + if (error instanceof AuthorizationFailedException) { + return receiver.performIdentityCheck(request, Optional.empty(), responseMapper); + } else { + return Single.error(t); + } + }); } /**