X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/ee5062a2cc83078d1d1d33cba32bbaa89e96f52e..6a9f791f0d91bfd8edd224f31e69be780b196648:/src/main/java/org/asamk/signal/Manager.java diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index 68f66455..117c1ba3 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -44,6 +44,7 @@ import org.whispersystems.signalservice.api.crypto.SignalServiceCipher; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; import org.whispersystems.signalservice.api.messages.*; import org.whispersystems.signalservice.api.messages.multidevice.*; +import org.whispersystems.signalservice.api.push.ContactTokenDetails; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.TrustStore; import org.whispersystems.signalservice.api.push.exceptions.*; @@ -515,6 +516,19 @@ class Manager implements Signal { return Optional.of(createAttachment(file)); } + private GroupInfo getGroupForSending(byte[] groupId) throws GroupNotFoundException, NotAGroupMemberException { + GroupInfo g = groupStore.getGroup(groupId); + if (g == null) { + throw new GroupNotFoundException(groupId); + } + for (String member : g.members) { + if (member.equals(this.username)) { + return g; + } + } + throw new NotAGroupMemberException(groupId, g.name); + } + @Override public void sendGroupMessage(String messageText, List attachments, byte[] groupId) @@ -531,10 +545,7 @@ class Manager implements Signal { } SignalServiceDataMessage message = messageBuilder.build(); - GroupInfo g = groupStore.getGroup(groupId); - if (g == null) { - throw new GroupNotFoundException(groupId); - } + final GroupInfo g = getGroupForSending(groupId); // Don't send group message to ourself final List membersSend = new ArrayList<>(g.members); @@ -551,16 +562,25 @@ class Manager implements Signal { .asGroupMessage(group) .build(); - final GroupInfo g = groupStore.getGroup(groupId); - if (g == null) { - throw new GroupNotFoundException(groupId); - } + final GroupInfo g = getGroupForSending(groupId); g.members.remove(this.username); groupStore.updateGroup(g); sendMessage(message, g.members); } + private static String join(CharSequence separator, Iterable list) { + StringBuilder buf = new StringBuilder(); + for (CharSequence str : list) { + if (buf.length() > 0) { + buf.append(separator); + } + buf.append(str); + } + + return buf.toString(); + } + public byte[] sendUpdateGroupMessage(byte[] groupId, String name, Collection members, String avatarFile) throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException { GroupInfo g; if (groupId == null) { @@ -568,10 +588,7 @@ class Manager implements Signal { g = new GroupInfo(Util.getSecretBytes(16)); g.members.add(username); } else { - g = groupStore.getGroup(groupId); - if (g == null) { - throw new GroupNotFoundException(groupId); - } + g = getGroupForSending(groupId); } if (name != null) { @@ -579,14 +596,30 @@ class Manager implements Signal { } if (members != null) { + Set newMembers = new HashSet<>(); for (String member : members) { try { - g.members.add(canonicalizeNumber(member)); + member = canonicalizeNumber(member); } catch (InvalidNumberException e) { System.err.println("Failed to add member \"" + member + "\" to group: " + e.getMessage()); System.err.println("Aborting…"); System.exit(1); } + if (g.members.contains(member)) { + continue; + } + newMembers.add(member); + g.members.add(member); + } + final List contacts = accountManager.getContacts(newMembers); + if (contacts.size() != newMembers.size()) { + // Some of the new members are not registered on Signal + for (ContactTokenDetails contact : contacts) { + newMembers.remove(contact.getNumber()); + } + System.err.println("Failed to add members " + join(", ", newMembers) + " to group: Not registered on Signal"); + System.err.println("Aborting…"); + System.exit(1); } }