]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
Add missing null check
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / ManagerImpl.java
index d2ffaaabe577d8c6d2a7bf749a24fe70712ce457..cc90de5ca049ff0aa3f7e6c184a72be2cecd7050 100644 (file)
@@ -887,6 +887,8 @@ public class ManagerImpl implements Manager {
         signalWebSocket.connect();
 
         hasCaughtUpWithOldMessages = false;
+        var backOffCounter = 0;
+        final var MAX_BACKOFF_COUNTER = 9;
 
         while (!Thread.interrupted()) {
             SignalServiceEnvelope envelope;
@@ -901,6 +903,8 @@ public class ManagerImpl implements Manager {
                     // store message on disk, before acknowledging receipt to the server
                     cachedMessage[0] = account.getMessageCache().cacheMessage(envelope1, recipientId);
                 });
+                backOffCounter = 0;
+
                 if (result.isPresent()) {
                     envelope = result.get();
                     logger.debug("New message received from server");
@@ -924,11 +928,24 @@ public class ManagerImpl implements Manager {
                 } else {
                     throw e;
                 }
-            } catch (WebSocketUnavailableException e) {
-                logger.debug("Pipe unexpectedly unavailable, connecting");
-                signalWebSocket.connect();
-                continue;
+            } catch (IOException e) {
+                logger.debug("Pipe unexpectedly unavailable: {}", e.getMessage());
+                if (e instanceof WebSocketUnavailableException || "Connection closed!".equals(e.getMessage())) {
+                    final var sleepMilliseconds = 100 * (long) Math.pow(2, backOffCounter);
+                    backOffCounter = Math.min(backOffCounter + 1, MAX_BACKOFF_COUNTER);
+                    logger.warn("Connection closed unexpectedly, reconnecting in {} ms", sleepMilliseconds);
+                    try {
+                        Thread.sleep(sleepMilliseconds);
+                    } catch (InterruptedException interruptedException) {
+                        return;
+                    }
+                    hasCaughtUpWithOldMessages = false;
+                    signalWebSocket.connect();
+                    continue;
+                }
+                throw e;
             } catch (TimeoutException e) {
+                backOffCounter = 0;
                 if (returnOnTimeout) return;
                 continue;
             }
@@ -939,9 +956,11 @@ public class ManagerImpl implements Manager {
 
             if (hasCaughtUpWithOldMessages) {
                 handleQueuedActions(queuedActions);
+                queuedActions.clear();
             }
             if (cachedMessage[0] != null) {
                 if (exception instanceof UntrustedIdentityException) {
+                    logger.debug("Keeping message with untrusted identity in message cache");
                     final var address = ((UntrustedIdentityException) exception).getSender();
                     final var recipientId = resolveRecipient(address);
                     if (!envelope.hasSourceUuid()) {
@@ -958,6 +977,7 @@ public class ManagerImpl implements Manager {
             }
         }
         handleQueuedActions(queuedActions);
+        queuedActions.clear();
     }
 
     @Override
@@ -966,6 +986,7 @@ public class ManagerImpl implements Manager {
     }
 
     private void handleQueuedActions(final Collection<HandleAction> queuedActions) {
+        logger.debug("Handling message actions");
         var interrupted = false;
         for (var action : queuedActions) {
             try {
@@ -1060,11 +1081,12 @@ public class ManagerImpl implements Manager {
         }
 
         final var address = account.getRecipientStore().resolveRecipientAddress(identityInfo.getRecipientId());
+        final var scannableFingerprint = identityHelper.computeSafetyNumberForScanning(identityInfo.getRecipientId(),
+                identityInfo.getIdentityKey());
         return new Identity(address,
                 identityInfo.getIdentityKey(),
                 identityHelper.computeSafetyNumber(identityInfo.getRecipientId(), identityInfo.getIdentityKey()),
-                identityHelper.computeSafetyNumberForScanning(identityInfo.getRecipientId(),
-                        identityInfo.getIdentityKey()).getSerialized(),
+                scannableFingerprint == null ? null : scannableFingerprint.getSerialized(),
                 identityInfo.getTrustLevel(),
                 identityInfo.getDateAdded());
     }