diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java index d7e28c74d0..bf74efa8d5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java @@ -390,14 +390,12 @@ public class TextSecurePreferences { if (previous != value) { Recipient.self().live().refresh(); + if (value) { notifyUnregisteredReceived(context); + clearLocalCredentials(context); } } - - if (value) { - clearLocalCredentials(context); - } } public static boolean isUnauthorizedReceived(Context context) { @@ -895,7 +893,6 @@ public class TextSecurePreferences { } private static void clearLocalCredentials(Context context) { - ProfileKey newProfileKey = ProfileKeyUtil.createNew(); Recipient self = Recipient.self(); SignalDatabase.recipients().setProfileKey(self.getId(), newProfileKey); diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/LibSignalChatConnection.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/LibSignalChatConnection.kt index f48df3142f..bc0f3b4b44 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/LibSignalChatConnection.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/LibSignalChatConnection.kt @@ -21,6 +21,7 @@ import org.signal.libsignal.net.ChatServiceException import org.signal.libsignal.net.DeviceDeregisteredException import org.signal.libsignal.net.Network import org.signal.libsignal.net.UnauthenticatedChatConnection +import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException import org.whispersystems.signalservice.api.util.CredentialsProvider import org.whispersystems.signalservice.api.websocket.HealthMonitor import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState @@ -285,10 +286,14 @@ class LibSignalChatConnection( { error -> single.onError(error) } ) }, - onFailure = { + onFailure = { throwable -> // This matches the behavior of OkHttpWebSocketConnection when the connection fails // before the buffered request can be sent. - single.onError(SocketException("Closed unexpectedly")) + val downstreamThrowable = when (throwable) { + is DeviceDeregisteredException -> NonSuccessfulResponseCodeException(403) + else -> SocketException("Closed unexpectedly") + } + single.onError(downstreamThrowable) } ) return single.subscribeOn(Schedulers.io()).observeOn(Schedulers.io()) diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/OkHttpWebSocketConnection.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/OkHttpWebSocketConnection.java index 9aee47a8fb..c99060f7a8 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/OkHttpWebSocketConnection.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/OkHttpWebSocketConnection.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.NotNull; import org.signal.libsignal.protocol.logging.Log; import org.signal.libsignal.protocol.util.Pair; import org.whispersystems.signalservice.api.push.TrustStore; +import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException; import org.whispersystems.signalservice.api.util.CredentialsProvider; import org.whispersystems.signalservice.api.util.Tls12SocketFactory; import org.whispersystems.signalservice.api.util.TlsProxySocketFactory; @@ -329,7 +330,7 @@ public class OkHttpWebSocketConnection extends WebSocketListener implements WebS log("onClose()"); webSocketState.onNext(WebSocketConnectionState.DISCONNECTED); - cleanupAfterShutdown(); + cleanupAfterShutdown(code); notifyAll(); } @@ -344,17 +345,24 @@ public class OkHttpWebSocketConnection extends WebSocketListener implements WebS webSocketState.onNext(WebSocketConnectionState.FAILED); } - cleanupAfterShutdown(); + cleanupAfterShutdown(response != null ? response.code() : 1000); notifyAll(); } - private void cleanupAfterShutdown() { + private void cleanupAfterShutdown(int code) { Iterator> iterator = outgoingRequests.entrySet().iterator(); + IOException exception; + if (code == 403) { + exception = new NonSuccessfulResponseCodeException(code); + } else { + exception = new SocketException("Closed unexpectedly"); + } + while (iterator.hasNext()) { Map.Entry entry = iterator.next(); - entry.getValue().onError(new SocketException("Closed unexpectedly")); + entry.getValue().onError(exception); iterator.remove(); }