}
}
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();
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;
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;
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 {
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;