X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/e1134d832a1460cc5e1bcc7edf5e908bf013e0bd..804ad34a0828d7b841f3fecd9af8f2bd948d31d3:/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 38c43753..457a6e54 100644 --- a/src/main/java/org/asamk/signal/manager/Manager.java +++ b/src/main/java/org/asamk/signal/manager/Manager.java @@ -121,7 +121,6 @@ import org.whispersystems.signalservice.api.messages.multidevice.StickerPackOper import org.whispersystems.signalservice.api.messages.multidevice.VerifiedMessage; import org.whispersystems.signalservice.api.profiles.ProfileAndCredential; import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; -import org.whispersystems.signalservice.api.push.ContactTokenDetails; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.MissingConfigurationException; import org.whispersystems.signalservice.api.util.InvalidNumberException; @@ -325,11 +324,9 @@ public class Manager implements Closeable { */ public Map areUsersRegistered(Set numbers) throws IOException { // Note "contactDetails" has no optionals. It only gives us info on users who are registered - List contactDetails = this.accountManager.getContacts(numbers); + Map contactDetails = getRegisteredUsers(numbers); - Set registeredUsers = contactDetails.stream() - .map(ContactTokenDetails::getNumber) - .collect(Collectors.toSet()); + Set registeredUsers = contactDetails.keySet(); return numbers.stream().collect(Collectors.toMap(x -> x, registeredUsers::contains)); } @@ -366,6 +363,11 @@ public class Manager implements Closeable { avatarStore.deleteProfileAvatar(getSelfAddress()); } } + + try { + sendSyncMessage(SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.LOCAL_PROFILE)); + } catch (UntrustedIdentityException ignored) { + } } public void unregister() throws IOException { @@ -496,6 +498,12 @@ public class Manager implements Closeable { private SignalProfile getRecipientProfile( SignalServiceAddress address + ) { + return getRecipientProfile(address, false); + } + + private SignalProfile getRecipientProfile( + SignalServiceAddress address, boolean force ) { SignalProfileEntry profileEntry = account.getProfileStore().getProfileEntry(address); if (profileEntry == null) { @@ -504,7 +512,9 @@ public class Manager implements Closeable { long now = new Date().getTime(); // Profiles are cached for 24h before retrieving them again if (!profileEntry.isRequestPending() && ( - profileEntry.getProfile() == null || now - profileEntry.getLastUpdateTimestamp() > 24 * 60 * 60 * 1000 + force + || profileEntry.getProfile() == null + || now - profileEntry.getLastUpdateTimestamp() > 24 * 60 * 60 * 1000 )) { profileEntry.setRequestPending(true); final SignalServiceProfile encryptedProfile; @@ -775,12 +785,10 @@ public class Manager implements Closeable { newE164Members.add(member.getNumber().get()); } - final List contacts = accountManager.getContacts(newE164Members); - if (contacts.size() != newE164Members.size()) { + final Map registeredUsers = getRegisteredUsers(newE164Members); + if (registeredUsers.size() != newE164Members.size()) { // Some of the new members are not registered on Signal - for (ContactTokenDetails contact : contacts) { - newE164Members.remove(contact.getNumber()); - } + newE164Members.removeAll(registeredUsers.keySet()); throw new IOException("Failed to add members " + String.join(", ", newE164Members) + " to group: Not registered on Signal"); @@ -953,7 +961,7 @@ public class Manager implements Closeable { return sendMessage(messageBuilder, getSignalServiceAddresses(recipients)); } - public Pair> sendSelfMessage( + public Pair sendSelfMessage( String messageText, List attachments ) throws IOException, AttachmentInvalidException { final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder() @@ -1184,28 +1192,29 @@ public class Manager implements Closeable { private Collection getSignalServiceAddresses(Collection numbers) throws InvalidNumberException { final Set signalServiceAddresses = new HashSet<>(numbers.size()); - final Set missingUuids = new HashSet<>(); + final Set addressesMissingUuid = new HashSet<>(); for (String number : numbers) { final SignalServiceAddress resolvedAddress = canonicalizeAndResolveSignalServiceAddress(number); if (resolvedAddress.getUuid().isPresent()) { signalServiceAddresses.add(resolvedAddress); } else { - missingUuids.add(resolvedAddress); + addressesMissingUuid.add(resolvedAddress); } } + final Set numbersMissingUuid = addressesMissingUuid.stream() + .map(a -> a.getNumber().get()) + .collect(Collectors.toSet()); Map registeredUsers; try { - registeredUsers = accountManager.getRegisteredUsers(getIasKeyStore(), - missingUuids.stream().map(a -> a.getNumber().get()).collect(Collectors.toSet()), - CDS_MRENCLAVE); - } catch (IOException | Quote.InvalidQuoteFormatException | UnauthenticatedQuoteException | SignatureException | UnauthenticatedResponseException e) { + registeredUsers = getRegisteredUsers(numbersMissingUuid); + } catch (IOException e) { logger.warn("Failed to resolve uuids from server, ignoring: {}", e.getMessage()); - registeredUsers = new HashMap<>(); + registeredUsers = Map.of(); } - for (SignalServiceAddress address : missingUuids) { + for (SignalServiceAddress address : addressesMissingUuid) { final String number = address.getNumber().get(); if (registeredUsers.containsKey(number)) { final SignalServiceAddress newAddress = resolveSignalServiceAddress(new SignalServiceAddress( @@ -1220,6 +1229,14 @@ public class Manager implements Closeable { return signalServiceAddresses; } + private Map getRegisteredUsers(final Set numbersMissingUuid) throws IOException { + try { + return accountManager.getRegisteredUsers(getIasKeyStore(), numbersMissingUuid, CDS_MRENCLAVE); + } catch (Quote.InvalidQuoteFormatException | UnauthenticatedQuoteException | SignatureException | UnauthenticatedResponseException e) { + throw new IOException(e); + } + } + private Pair> sendMessage( SignalServiceDataMessage.Builder messageBuilder, Collection recipients ) throws IOException { @@ -1278,7 +1295,7 @@ public class Manager implements Closeable { } } - private Pair> sendSelfMessage( + private Pair sendSelfMessage( SignalServiceDataMessage.Builder messageBuilder ) throws IOException { final long timestamp = System.currentTimeMillis(); @@ -1294,7 +1311,7 @@ public class Manager implements Closeable { SignalServiceDataMessage message = messageBuilder.build(); final SendMessageResult result = sendSelfMessage(message); - return new Pair<>(timestamp, List.of(result)); + return new Pair<>(timestamp, result); } finally { account.save(); } @@ -1988,6 +2005,14 @@ public class Manager implements Closeable { account.getStickerStore().updateSticker(sticker); } } + if (syncMessage.getFetchType().isPresent()) { + switch (syncMessage.getFetchType().get()) { + case LOCAL_PROFILE: + getRecipientProfile(getSelfAddress(), true); + case STORAGE_MANIFEST: + // TODO + } + } if (syncMessage.getConfiguration().isPresent()) { // TODO }