diff --git a/src/org/thoughtcrime/securesms/database/GroupDatabase.java b/src/org/thoughtcrime/securesms/database/GroupDatabase.java index 19108e703e..92c5e13262 100644 --- a/src/org/thoughtcrime/securesms/database/GroupDatabase.java +++ b/src/org/thoughtcrime/securesms/database/GroupDatabase.java @@ -152,7 +152,9 @@ public class GroupDatabase extends Database { if (!includeSelf && Util.isOwnNumber(context, member)) continue; - recipients.add(Recipient.from(context, member, false)); + if (member.isPhone()) { + recipients.add(Recipient.from(context, member, false)); + } } return recipients; diff --git a/src/org/thoughtcrime/securesms/groups/GroupMessageProcessor.java b/src/org/thoughtcrime/securesms/groups/GroupMessageProcessor.java index 1ff6467a36..0c78bf185f 100644 --- a/src/org/thoughtcrime/securesms/groups/GroupMessageProcessor.java +++ b/src/org/thoughtcrime/securesms/groups/GroupMessageProcessor.java @@ -99,8 +99,7 @@ public class GroupMessageProcessor { } // We should only create the group if we are part of the member list - String masterHexEncodedPublicKey = TextSecurePreferences.getMasterHexEncodedPublicKey(context); - String hexEncodedPublicKey = masterHexEncodedPublicKey != null ? masterHexEncodedPublicKey : TextSecurePreferences.getLocalNumber(context); + String hexEncodedPublicKey = getMasterHexEncodedPublicKey(context, TextSecurePreferences.getLocalNumber(context)); if (members == null || !members.contains(Address.fromSerialized(hexEncodedPublicKey))) { Log.d("Loki - Group Message", "Received a group create message which doesn't include us in the member list. Ignoring."); return null; @@ -130,13 +129,7 @@ public class GroupMessageProcessor { // Only update group if admin sent the message if (group.getGroupType() == SignalServiceGroup.GroupType.SIGNAL) { - String sender = content.getSender(); - String hexEncodedPublicKey = sender; - try { - String primaryDevice = PromiseUtil.timeout(LokiStorageAPI.shared.getPrimaryDevicePublicKey(sender), 5000).get(); - if (primaryDevice != null) { hexEncodedPublicKey = primaryDevice; } - } catch (Exception e) { } - + String hexEncodedPublicKey = getMasterHexEncodedPublicKey(context, content.getSender()); if (!groupRecord.getAdmins().contains(Address.fromSerialized(hexEncodedPublicKey))) { Log.d("Loki - Group Message", "Received a group update message from a non-admin user for " + id +". Ignoring."); return null; @@ -198,7 +191,10 @@ public class GroupMessageProcessor { @NonNull SignalServiceGroup group, @NonNull GroupRecord record) { - if (record.getMembers().contains(Address.fromExternal(context, content.getSender()))) { + String hexEncodedPublicKey = getMasterHexEncodedPublicKey(context, content.getSender()); + String ourPublicKey = getMasterHexEncodedPublicKey(context, TextSecurePreferences.getLocalNumber(context)); + // If the requester is a group member and we are admin then we should send them the group update + if (record.getMembers().contains(Address.fromSerialized(hexEncodedPublicKey)) && record.getAdmins().contains(Address.fromSerialized(ourPublicKey))) { ApplicationContext.getInstance(context) .getJobManager() .add(new PushGroupUpdateJob(content.getSender(), group.getGroupId())); @@ -302,4 +298,15 @@ public class GroupMessageProcessor { return builder; } + private static String getMasterHexEncodedPublicKey(Context context, String hexEncodedPublicKey) { + String ourPublicKey = TextSecurePreferences.getLocalNumber(context); + try { + String masterHexEncodedPublicKey = hexEncodedPublicKey.equalsIgnoreCase(ourPublicKey) + ? TextSecurePreferences.getMasterHexEncodedPublicKey(context) + : PromiseUtil.timeout(LokiStorageAPI.shared.getPrimaryDevicePublicKey(hexEncodedPublicKey), 5000).get(); + return masterHexEncodedPublicKey != null ? masterHexEncodedPublicKey : hexEncodedPublicKey; + } catch (Exception e) { + return hexEncodedPublicKey; + } + } } diff --git a/src/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java b/src/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java index abe6dd862c..ee970fdaab 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java @@ -47,6 +47,8 @@ import org.whispersystems.signalservice.api.messages.shared.SharedContact; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.internal.push.SignalServiceProtos.GroupContext; import org.whispersystems.signalservice.loki.api.LokiPublicChat; +import org.whispersystems.signalservice.loki.api.LokiStorageAPI; +import org.whispersystems.signalservice.loki.utilities.PromiseUtil; import java.io.IOException; import java.util.ArrayList; @@ -313,7 +315,20 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType { if (!destinations.isEmpty()) return Stream.of(destinations).map(GroupReceiptInfo::getAddress).toList(); List members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupId, false); - return Stream.of(members).map(Recipient::getAddress).toList(); + + // Add secondary devices to the list + Set
memberSet = Stream.of(members).map(Recipient::getAddress).collect(Collectors.toSet()); + for (Recipient member : members) { + if (!member.getAddress().isPhone()) { continue; } + try { + List secondaryDevices = PromiseUtil.timeout(LokiStorageAPI.shared.getSecondaryDevicePublicKeys(member.getAddress().serialize()), 5000).get(); + memberSet.addAll(Stream.of(secondaryDevices).map(Address::fromSerialized).toList()); + } catch (Exception e) { + // Timed out, go to the next member + } + } + + return new LinkedList<>(memberSet); } }