/*
- 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
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;
throws IOException, EncapsulatedExceptions, AttachmentInvalidException {
final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder().withBody(messageText);
if (attachments != null) {
- messageBuilder.withAttachments(Utils.getSignalServiceAttachments(attachments));
+ List<SignalServiceAttachment> attachmentStreams = Utils.getSignalServiceAttachments(attachments);
+
+ // Upload attachments here, so we only upload once even for multiple recipients
+ SignalServiceMessageSender messageSender = getMessageSender();
+ List<SignalServiceAttachment> 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);
}
@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 {
}
@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);
}
contact.profileKey = Base64.encodeBytes(message.getProfileKey().get());
}
+ if (message.getPreviews().isPresent()) {
+ final List<SignalServiceDataMessage.Preview> 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) {
return account.getSignalProtocolStore().getIdentities();
}
- public List<JsonIdentityKeyStore.Identity> getIdentities(String number) {
- return account.getSignalProtocolStore().getIdentities(number);
+ public Pair<String, List<JsonIdentityKeyStore.Identity>> getIdentities(String number) throws InvalidNumberException {
+ String canonicalizedNumber = Utils.canonicalizeNumber(number, username);
+ return new Pair<>(canonicalizedNumber, account.getSignalProtocolStore().getIdentities(canonicalizedNumber));
}
/**