X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/1d2c7a479d791dedde6c2022ac65e9c82400af79..a91e3f762e0e5d6a9cf9e208fe85207d7829e22d:/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 53ba5300..6606e966 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -1,30 +1,31 @@ package org.asamk.signal.dbus; import org.asamk.Signal; +import org.asamk.signal.BaseConfig; import org.asamk.signal.manager.AttachmentInvalidException; import org.asamk.signal.manager.Manager; +import org.asamk.signal.manager.NotMasterDeviceException; import org.asamk.signal.manager.groups.GroupId; +import org.asamk.signal.manager.groups.GroupInviteLinkUrl; import org.asamk.signal.manager.groups.GroupNotFoundException; import org.asamk.signal.manager.groups.NotAGroupMemberException; -import org.asamk.signal.manager.groups.GroupInviteLinkUrl; -import org.asamk.signal.manager.storage.protocol.IdentityInfo; +import org.asamk.signal.manager.storage.identities.IdentityInfo; import org.asamk.signal.util.ErrorUtils; -import org.asamk.signal.manager.util.Utils; -import org.asamk.signal.BaseConfig; import org.freedesktop.dbus.exceptions.DBusExecutionException; +import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.guava.Optional; +import org.whispersystems.signalservice.api.groupsv2.GroupLinkNotActiveException; import org.whispersystems.signalservice.api.messages.SendMessageResult; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.util.InvalidNumberException; -import org.whispersystems.signalservice.api.groupsv2.GroupLinkNotActiveException; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.stream.Stream; import java.util.stream.Collectors; +import java.util.stream.Stream; public class DbusSignalImpl implements Signal { @@ -67,8 +68,9 @@ public class DbusSignalImpl implements Signal { } } - private static void checkSendMessageResults(long timestamp, List results) - throws DBusExecutionException { + private static void checkSendMessageResults( + long timestamp, List results + ) throws DBusExecutionException { if (results.size() == 1) { checkSendMessageResult(timestamp, results.get(0)); return; @@ -105,8 +107,80 @@ public class DbusSignalImpl implements Signal { } @Override - public long sendNoteToSelfMessage(final String message, final List attachments) - throws Error.AttachmentInvalid, Error.Failure, Error.UntrustedIdentity { + public long sendRemoteDeleteMessage( + final long targetSentTimestamp, final String recipient + ) { + var recipients = new ArrayList(1); + recipients.add(recipient); + return sendRemoteDeleteMessage(targetSentTimestamp, recipients); + } + + @Override + public long sendRemoteDeleteMessage( + final long targetSentTimestamp, final List recipients + ) { + try { + final var results = m.sendRemoteDeleteMessage(targetSentTimestamp, recipients); + checkSendMessageResults(results.first(), results.second()); + return results.first(); + } catch (IOException e) { + throw new Error.Failure(e.getMessage()); + } catch (InvalidNumberException e) { + throw new Error.InvalidNumber(e.getMessage()); + } + } + + @Override + public long sendGroupRemoteDeleteMessage( + final long targetSentTimestamp, final byte[] groupId + ) { + try { + final var results = m.sendGroupRemoteDeleteMessage(targetSentTimestamp, GroupId.unknownVersion(groupId)); + checkSendMessageResults(results.first(), results.second()); + return results.first(); + } catch (IOException e) { + throw new Error.Failure(e.getMessage()); + } catch (GroupNotFoundException | NotAGroupMemberException e) { + throw new Error.GroupNotFound(e.getMessage()); + } + } + + @Override + public long sendMessageReaction( + final String emoji, + final boolean remove, + final String targetAuthor, + final long targetSentTimestamp, + final String recipient + ) { + var recipients = new ArrayList(1); + recipients.add(recipient); + return sendMessageReaction(emoji, remove, targetAuthor, targetSentTimestamp, recipients); + } + + @Override + public long sendMessageReaction( + final String emoji, + final boolean remove, + final String targetAuthor, + final long targetSentTimestamp, + final List recipients + ) { + try { + final var results = m.sendMessageReaction(emoji, remove, targetAuthor, targetSentTimestamp, recipients); + checkSendMessageResults(results.first(), results.second()); + return results.first(); + } catch (InvalidNumberException e) { + throw new Error.InvalidNumber(e.getMessage()); + } catch (IOException e) { + throw new Error.Failure(e.getMessage()); + } + } + + @Override + public long sendNoteToSelfMessage( + final String message, final List attachments + ) throws Error.AttachmentInvalid, Error.Failure, Error.UntrustedIdentity { try { final var results = m.sendSelfMessage(message, attachments); checkSendMessageResult(results.first(), results.second()); @@ -145,17 +219,40 @@ public class DbusSignalImpl implements Signal { } } + @Override + public long sendGroupMessageReaction( + final String emoji, + final boolean remove, + final String targetAuthor, + final long targetSentTimestamp, + final byte[] groupId + ) { + try { + final var results = m.sendGroupMessageReaction(emoji, + remove, + targetAuthor, + targetSentTimestamp, + GroupId.unknownVersion(groupId)); + checkSendMessageResults(results.first(), results.second()); + return results.first(); + } catch (IOException e) { + throw new Error.Failure(e.getMessage()); + } catch (InvalidNumberException e) { + throw new Error.InvalidNumber(e.getMessage()); + } catch (GroupNotFoundException | NotAGroupMemberException e) { + throw new Error.GroupNotFound(e.getMessage()); + } + } + // Since contact names might be empty if not defined, also potentially return // the profile name @Override public String getContactName(final String number) { - String name=""; try { - name = m.getContactOrProfileName(number); - } catch (Exception e) { + return m.getContactOrProfileName(number); + } catch (InvalidNumberException e) { throw new Error.InvalidNumber(e.getMessage()); } - return name; } @Override @@ -164,6 +261,8 @@ public class DbusSignalImpl implements Signal { m.setContactName(number, name); } catch (InvalidNumberException e) { throw new Error.InvalidNumber(e.getMessage()); + } catch (NotMasterDeviceException e) { + throw new Error.Failure("This command doesn't work on linked devices."); } } @@ -173,6 +272,8 @@ public class DbusSignalImpl implements Signal { m.setContactBlocked(number, blocked); } catch (InvalidNumberException e) { throw new Error.InvalidNumber(e.getMessage()); + } catch (NotMasterDeviceException e) { + throw new Error.Failure("This command doesn't work on linked devices."); } } @@ -211,8 +312,11 @@ public class DbusSignalImpl implements Signal { if (group == null) { return List.of(); } else { - return group.getMembers().stream().map(m::resolveSignalServiceAddress) - .map(SignalServiceAddress::getLegacyIdentifier).collect(Collectors.toList()); + return group.getMembers() + .stream() + .map(m::resolveSignalServiceAddress) + .map(SignalServiceAddress::getLegacyIdentifier) + .collect(Collectors.toList()); } } @@ -231,10 +335,20 @@ public class DbusSignalImpl implements Signal { if (avatar.isEmpty()) { avatar = null; } - final var results = m.updateGroup(groupId == null ? null : GroupId.unknownVersion(groupId), name, members, - avatar == null ? null : new File(avatar)); - checkSendMessageResults(0, results.second()); - return results.first().serialize(); + if (groupId == null) { + final var results = m.createGroup(name, members, avatar == null ? null : new File(avatar)); + checkSendMessageResults(0, results.second()); + return results.first().serialize(); + } else { + final var results = m.updateGroup(GroupId.unknownVersion(groupId), + name, + null, + members, + null, + avatar == null ? null : new File(avatar)); + checkSendMessageResults(results.first(), results.second()); + return groupId; + } } catch (IOException e) { throw new Error.Failure(e.getMessage()); } catch (GroupNotFoundException | NotAGroupMemberException e) { @@ -252,15 +366,21 @@ public class DbusSignalImpl implements Signal { } @Override - public void updateProfile(final String name, final String about, final String aboutEmoji, String avatarPath, - final boolean removeAvatar) { + public void updateProfile( + final String name, + final String about, + final String aboutEmoji, + String avatarPath, + final boolean removeAvatar + ) { try { if (avatarPath.isEmpty()) { avatarPath = null; } - Optional avatarFile = removeAvatar ? Optional.absent() + Optional avatarFile = removeAvatar + ? Optional.absent() : avatarPath == null ? null : Optional.of(new File(avatarPath)); - m.setProfile(name, about, aboutEmoji, avatarFile); + m.setProfile(name, null, about, aboutEmoji, avatarFile); } catch (IOException e) { throw new Error.Failure(e.getMessage()); } @@ -277,8 +397,10 @@ public class DbusSignalImpl implements Signal { // all numbers the system knows @Override public List listNumbers() { - return Stream.concat(m.getIdentities().stream().map(i -> i.getAddress().getNumber().orNull()), - m.getContacts().stream().map(c -> c.number)) + return Stream.concat(m.getIdentities().stream().map(IdentityInfo::getRecipientId), + m.getContacts().stream().map(Pair::first)) + .map(m::resolveSignalServiceAddress) + .map(a -> a.getNumber().orNull()) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); @@ -286,29 +408,26 @@ public class DbusSignalImpl implements Signal { @Override public List getContactNumber(final String name) { - // Contact names have precendence. - List numbers=new ArrayList<>(); + // Contact names have precedence. + var numbers = new ArrayList(); var contacts = m.getContacts(); for (var c : contacts) { - if (c.name!=null && c.name.equals(name)) { - numbers.add(c.number); + if (name.equals(c.second().getName())) { + numbers.add(m.resolveSignalServiceAddress(c.first()).getLegacyIdentifier()); } } // Try profiles if no contact name was found - for (IdentityInfo identity : m.getIdentities()) { - String number = identity.getAddress().getNumber().orNull(); + for (var identity : m.getIdentities()) { + final var recipientId = identity.getRecipientId(); + final var address = m.resolveSignalServiceAddress(recipientId); + var number = address.getNumber().orNull(); if (number != null) { - var address = Utils.getSignalServiceAddressFromIdentifier(number); - var profile = m.getRecipientProfile(address); - String profileName = profile.getDisplayName(); - if (profileName.equals(name)) { + var profile = m.getRecipientProfile(recipientId); + if (profile != null && profile.getDisplayName().equals(name)) { numbers.add(number); } } } - if (numbers.size()==0) { - throw new Error.Failure("Contact name not found"); - } return numbers; } @@ -326,9 +445,11 @@ public class DbusSignalImpl implements Signal { @Override public void joinGroup(final String groupLink) { - final GroupInviteLinkUrl linkUrl; try { - linkUrl = GroupInviteLinkUrl.fromUri(groupLink); + final var linkUrl = GroupInviteLinkUrl.fromUri(groupLink); + if (linkUrl == null) { + throw new Error.Failure("Group link is invalid:"); + } m.joinGroup(linkUrl); } catch (GroupInviteLinkUrl.InvalidGroupLinkException | GroupLinkNotActiveException e) { throw new Error.Failure("Group link is invalid: " + e.getMessage()); @@ -341,13 +462,11 @@ public class DbusSignalImpl implements Signal { @Override public boolean isContactBlocked(final String number) { - var contacts = m.getContacts(); - for (var c : contacts) { - if (c.number.equals(number)) { - return c.blocked; - } + try { + return m.isContactBlocked(number); + } catch (InvalidNumberException e) { + throw new Error.InvalidNumber(e.getMessage()); } - return false; } @Override @@ -366,8 +485,7 @@ public class DbusSignalImpl implements Signal { if (group == null) { return false; } else { - return group.isMember(m.getSelfAddress()); + return group.isMember(m.getSelfRecipientId()); } } - }