X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/6cfddc0aff5785930c2264da683ba92a66963b73..7f9379f78bf310febd57d5d6521ee9c1b5c6732f:/src/main/java/org/asamk/signal/manager/Manager.java diff --git a/src/main/java/org/asamk/signal/manager/Manager.java b/src/main/java/org/asamk/signal/manager/Manager.java index 04bef98e..37091ad0 100644 --- a/src/main/java/org/asamk/signal/manager/Manager.java +++ b/src/main/java/org/asamk/signal/manager/Manager.java @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2018 AsamK + Copyright (C) 2015-2020 AsamK and contributors This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -53,6 +53,7 @@ import org.whispersystems.libsignal.state.PreKeyRecord; import org.whispersystems.libsignal.state.SignedPreKeyRecord; import org.whispersystems.libsignal.util.KeyHelper; import org.whispersystems.libsignal.util.Medium; +import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.SignalServiceMessagePipe; @@ -647,7 +648,20 @@ public class Manager implements Signal { throws IOException, EncapsulatedExceptions, AttachmentInvalidException { final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder().withBody(messageText); if (attachments != null) { - messageBuilder.withAttachments(Utils.getSignalServiceAttachments(attachments)); + List attachmentStreams = Utils.getSignalServiceAttachments(attachments); + + // Upload attachments here, so we only upload once even for multiple recipients + SignalServiceMessageSender messageSender = getMessageSender(); + List attachmentPointers = new ArrayList<>(attachmentStreams.size()); + for (SignalServiceAttachment attachment : attachmentStreams) { + if (attachment.isStream()) { + attachmentPointers.add(messageSender.uploadAttachment(attachment.asStream())); + } else if (attachment.isPointer()) { + attachmentPointers.add(attachment.asPointer()); + } + } + + messageBuilder.withAttachments(attachmentPointers); } messageBuilder.withProfileKey(account.getProfileKey()); sendMessageLegacy(messageBuilder, recipients); @@ -662,8 +676,9 @@ public class Manager implements Signal { } @Override - public String getContactName(String number) { - ContactInfo contact = account.getContactStore().getContact(number); + public String getContactName(String number) throws InvalidNumberException { + String canonicalizedNumber = Utils.canonicalizeNumber(number, username); + ContactInfo contact = account.getContactStore().getContact(canonicalizedNumber); if (contact == null) { return ""; } else { @@ -672,14 +687,15 @@ public class Manager implements Signal { } @Override - public void setContactName(String number, String name) { - ContactInfo contact = account.getContactStore().getContact(number); + public void setContactName(String number, String name) throws InvalidNumberException { + String canonicalizedNumber = Utils.canonicalizeNumber(number, username); + ContactInfo contact = account.getContactStore().getContact(canonicalizedNumber); if (contact == null) { contact = new ContactInfo(); - contact.number = number; - System.err.println("Add contact " + number + " named " + name); + contact.number = canonicalizedNumber; + System.err.println("Add contact " + canonicalizedNumber + " named " + name); } else { - System.err.println("Updating contact " + number + " name " + contact.name + " -> " + name); + System.err.println("Updating contact " + canonicalizedNumber + " name " + contact.name + " -> " + name); } contact.name = name; account.getContactStore().updateContact(contact); @@ -1049,6 +1065,19 @@ public class Manager implements Signal { } contact.profileKey = Base64.encodeBytes(message.getProfileKey().get()); } + if (message.getPreviews().isPresent()) { + final List previews = message.getPreviews().get(); + for (SignalServiceDataMessage.Preview preview : previews) { + if (preview.getImage().isPresent() && preview.getImage().get().isPointer()) { + SignalServiceAttachmentPointer attachment = preview.getImage().get().asPointer(); + try { + retrieveAttachment(attachment); + } catch (IOException | InvalidMessageException e) { + System.err.println("Failed to retrieve attachment (" + attachment.getId() + "): " + e.getMessage()); + } + } + } + } } private void retryFailedReceivedMessages(ReceiveMessageHandler handler, boolean ignoreAttachments) { @@ -1517,8 +1546,9 @@ public class Manager implements Signal { return account.getSignalProtocolStore().getIdentities(); } - public List getIdentities(String number) { - return account.getSignalProtocolStore().getIdentities(number); + public Pair> getIdentities(String number) throws InvalidNumberException { + String canonicalizedNumber = Utils.canonicalizeNumber(number, username); + return new Pair<>(canonicalizedNumber, account.getSignalProtocolStore().getIdentities(canonicalizedNumber)); } /**