]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/Manager.java
Handle changed identity key correctly when sending message
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / Manager.java
index 0fcb42d293d2f494c544908688a3826efdd38991..a2152fac2476751c975b306693bc326b40142d44 100644 (file)
@@ -1594,14 +1594,7 @@ public class Manager implements Closeable {
                             () -> false);
 
                     for (var r : result) {
-                        if (r.getIdentityFailure() != null) {
-                            final var recipientId = resolveRecipient(r.getAddress());
-                            final var newIdentity = account.getIdentityKeyStore()
-                                    .saveIdentity(recipientId, r.getIdentityFailure().getIdentityKey(), new Date());
-                            if (newIdentity) {
-                                account.getSessionStore().archiveSessions(recipientId);
-                            }
-                        }
+                        handlePossibleIdentityFailure(r);
                     }
 
                     return new Pair<>(timestamp, result);
@@ -1617,7 +1610,9 @@ public class Manager implements Closeable {
                     final var expirationTime = contact != null ? contact.getMessageExpirationTime() : 0;
                     messageBuilder.withExpiration(expirationTime);
                     message = messageBuilder.build();
-                    results.add(sendMessage(recipientId, message));
+                    final var result = sendMessage(recipientId, message);
+                    handlePossibleIdentityFailure(result);
+                    results.add(result);
                 }
                 return new Pair<>(timestamp, results);
             }
@@ -1630,6 +1625,23 @@ public class Manager implements Closeable {
         }
     }
 
+    private void handlePossibleIdentityFailure(final SendMessageResult r) {
+        if (r.getIdentityFailure() != null) {
+            final var recipientId = resolveRecipient(r.getAddress());
+            final var identityKey = r.getIdentityFailure().getIdentityKey();
+            if (identityKey != null) {
+                final var newIdentity = account.getIdentityKeyStore()
+                        .saveIdentity(recipientId, identityKey, new Date());
+                if (newIdentity) {
+                    account.getSessionStore().archiveSessions(recipientId);
+                }
+            } else {
+                // Retrieve profile to get the current identity key from the server
+                retrieveEncryptedProfile(recipientId);
+            }
+        }
+    }
+
     private Pair<Long, SendMessageResult> sendSelfMessage(
             SignalServiceDataMessage.Builder messageBuilder
     ) throws IOException {