]> 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 327e876df89bdbeaecc625d90b94db3e0b1d68da..a2152fac2476751c975b306693bc326b40142d44 100644 (file)
@@ -472,9 +472,6 @@ public class Manager implements Closeable {
 
             account.setRegistrationLockPin(pin.get(), masterKey);
         } else {
-            // Remove legacy registration lock
-            dependencies.getAccountManager().removeRegistrationLockV1();
-
             // Remove KBS Pin
             pinHelper.removeRegistrationLockPin();
 
@@ -1597,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);
@@ -1620,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);
             }
@@ -1633,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 {