]> nmode's Git Repositories - signal-cli/commitdiff
Handle groups sync message again
authorAsamK <asamk@gmx.de>
Fri, 10 Jun 2022 08:34:37 +0000 (10:34 +0200)
committerAsamK <asamk@gmx.de>
Sat, 11 Jun 2022 10:34:55 +0000 (12:34 +0200)
lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java
lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java

index b6e3d8cb71a70e1c94ed1f85846b77c7259cce2f..4940e67cbd9db926285742ff732e52a933ef16c4 100644 (file)
@@ -367,7 +367,13 @@ public final class IncomingMessageHandler {
             }
         }
         if (syncMessage.getGroups().isPresent()) {
-            logger.warn("Received a group v1 sync message, that can't be handled anymore, ignoring.");
+            try {
+                final var groupsMessage = syncMessage.getGroups().get();
+                context.getAttachmentHelper()
+                        .retrieveAttachment(groupsMessage, context.getSyncHelper()::handleSyncDeviceGroups);
+            } catch (Exception e) {
+                logger.warn("Failed to handle received sync groups, ignoring: {}", e.getMessage());
+            }
         }
         if (syncMessage.getBlockedList().isPresent()) {
             final var blockedListMessage = syncMessage.getBlockedList().get();
index 3ad1fda84be78d0e344f6ab168036bf398f9c856..9a5b5a7d1bf2dec03952815361c8da7753d07f1e 100644 (file)
@@ -3,6 +3,7 @@ package org.asamk.signal.manager.helper;
 import com.google.protobuf.ByteString;
 
 import org.asamk.signal.manager.api.TrustLevel;
+import org.asamk.signal.manager.groups.GroupId;
 import org.asamk.signal.manager.storage.SignalAccount;
 import org.asamk.signal.manager.storage.groups.GroupInfoV1;
 import org.asamk.signal.manager.storage.recipients.Contact;
@@ -21,6 +22,7 @@ import org.whispersystems.signalservice.api.messages.multidevice.DeviceContact;
 import org.whispersystems.signalservice.api.messages.multidevice.DeviceContactsInputStream;
 import org.whispersystems.signalservice.api.messages.multidevice.DeviceContactsOutputStream;
 import org.whispersystems.signalservice.api.messages.multidevice.DeviceGroup;
+import org.whispersystems.signalservice.api.messages.multidevice.DeviceGroupsInputStream;
 import org.whispersystems.signalservice.api.messages.multidevice.DeviceGroupsOutputStream;
 import org.whispersystems.signalservice.api.messages.multidevice.KeysMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.RequestMessage;
@@ -36,7 +38,9 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.file.Files;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 public class SyncHelper {
 
@@ -237,6 +241,48 @@ public class SyncHelper {
         context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forPniIdentity(pniIdentity));
     }
 
+    public void handleSyncDeviceGroups(final InputStream input) {
+        final var s = new DeviceGroupsInputStream(input);
+        DeviceGroup g;
+        while (true) {
+            try {
+                g = s.read();
+            } catch (IOException e) {
+                logger.warn("Sync groups contained invalid group, ignoring: {}", e.getMessage());
+                continue;
+            }
+            if (g == null) {
+                break;
+            }
+            var syncGroup = account.getGroupStore().getOrCreateGroupV1(GroupId.v1(g.getId()));
+            if (syncGroup != null) {
+                if (g.getName().isPresent()) {
+                    syncGroup.name = g.getName().get();
+                }
+                syncGroup.addMembers(g.getMembers()
+                        .stream()
+                        .map(account.getRecipientResolver()::resolveRecipient)
+                        .collect(Collectors.toSet()));
+                if (!g.isActive()) {
+                    syncGroup.removeMember(account.getSelfRecipientId());
+                } else {
+                    // Add ourself to the member set as it's marked as active
+                    syncGroup.addMembers(List.of(account.getSelfRecipientId()));
+                }
+                syncGroup.blocked = g.isBlocked();
+                if (g.getColor().isPresent()) {
+                    syncGroup.color = g.getColor().get();
+                }
+
+                if (g.getAvatar().isPresent()) {
+                    context.getGroupHelper().downloadGroupAvatar(syncGroup.getGroupId(), g.getAvatar().get());
+                }
+                syncGroup.archived = g.isArchived();
+                account.getGroupStore().updateGroup(syncGroup);
+            }
+        }
+    }
+
     public void handleSyncDeviceContacts(final InputStream input) throws IOException {
         final var s = new DeviceContactsInputStream(input);
         DeviceContact c;