]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/api/MessageEnvelope.java
Update libsignal-service
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / api / MessageEnvelope.java
index a3546a4b31e14a3595433261fa96588599ab6ae1..aefaa800333000db7d557fa3eafd6f917cbc5736 100644 (file)
@@ -1,15 +1,14 @@
 package org.asamk.signal.manager.api;
 
-import org.asamk.signal.manager.groups.GroupId;
 import org.asamk.signal.manager.groups.GroupUtils;
 import org.asamk.signal.manager.helper.RecipientAddressResolver;
-import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.asamk.signal.manager.storage.recipients.RecipientResolver;
 import org.signal.libsignal.metadata.ProtocolException;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
-import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentRemoteId;
+import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer;
 import org.whispersystems.signalservice.api.messages.SignalServiceContent;
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
+import org.whispersystems.signalservice.api.messages.SignalServiceEditMessage;
 import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroupContext;
@@ -33,8 +32,10 @@ import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptM
 import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.ViewOnceOpenMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.ViewedMessage;
+import org.whispersystems.signalservice.api.push.ServiceId;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
@@ -50,6 +51,7 @@ public record MessageEnvelope(
         Optional<Receipt> receipt,
         Optional<Typing> typing,
         Optional<Data> data,
+        Optional<Edit> edit,
         Optional<Sync> sync,
         Optional<Call> call,
         Optional<Story> story
@@ -114,7 +116,8 @@ public record MessageEnvelope(
             Optional<Sticker> sticker,
             List<SharedContact> sharedContacts,
             List<Mention> mentions,
-            List<Preview> previews
+            List<Preview> previews,
+            List<TextStyle> textStyles
     ) {
 
         static Data from(
@@ -138,7 +141,9 @@ public record MessageEnvelope(
                     dataMessage.isProfileKeyUpdate(),
                     dataMessage.getProfileKey().isPresent(),
                     dataMessage.getReaction().map(r -> Reaction.from(r, recipientResolver, addressResolver)),
-                    dataMessage.getQuote().map(q -> Quote.from(q, recipientResolver, addressResolver, fileProvider)),
+                    dataMessage.getQuote()
+                            .filter(q -> q.getAuthor() != null && q.getAuthor().isValid())
+                            .map(q -> Quote.from(q, recipientResolver, addressResolver, fileProvider)),
                     dataMessage.getPayment().map(p -> p.getPaymentNotification().isPresent() ? Payment.from(p) : null),
                     dataMessage.getAttachments()
                             .map(a -> a.stream().map(as -> Attachment.from(as, fileProvider)).toList())
@@ -155,6 +160,9 @@ public record MessageEnvelope(
                             .orElse(List.of()),
                     dataMessage.getPreviews()
                             .map(a -> a.stream().map(preview -> Preview.from(preview, fileProvider)).toList())
+                            .orElse(List.of()),
+                    dataMessage.getBodyRanges()
+                            .map(a -> a.stream().filter(r -> r.style != null).map(TextStyle::from).toList())
                             .orElse(List.of()));
         }
 
@@ -184,7 +192,7 @@ public record MessageEnvelope(
                     RecipientAddressResolver addressResolver
             ) {
                 return new StoryContext(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(
-                        storyContext.getAuthorServiceId())), storyContext.getSentTimestamp());
+                        storyContext.getAuthorServiceId())).toApiRecipientAddress(), storyContext.getSentTimestamp());
             }
         }
 
@@ -205,7 +213,8 @@ public record MessageEnvelope(
                     RecipientAddressResolver addressResolver
             ) {
                 return new Reaction(reaction.getTargetSentTimestamp(),
-                        addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(reaction.getTargetAuthor())),
+                        addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(reaction.getTargetAuthor()))
+                                .toApiRecipientAddress(),
                         reaction.getEmoji(),
                         reaction.isRemove());
             }
@@ -216,7 +225,8 @@ public record MessageEnvelope(
                 RecipientAddress author,
                 Optional<String> text,
                 List<Mention> mentions,
-                List<Attachment> attachments
+                List<Attachment> attachments,
+                List<TextStyle> textStyles
         ) {
 
             static Quote from(
@@ -226,8 +236,9 @@ public record MessageEnvelope(
                     final AttachmentFileProvider fileProvider
             ) {
                 return new Quote(quote.getId(),
-                        addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(quote.getAuthor())),
-                        Optional.ofNullable(quote.getText()),
+                        addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(quote.getAuthor()))
+                                .toApiRecipientAddress(),
+                        Optional.of(quote.getText()),
                         quote.getMentions() == null
                                 ? List.of()
                                 : quote.getMentions()
@@ -236,7 +247,14 @@ public record MessageEnvelope(
                                         .toList(),
                         quote.getAttachments() == null
                                 ? List.of()
-                                : quote.getAttachments().stream().map(a -> Attachment.from(a, fileProvider)).toList());
+                                : quote.getAttachments().stream().map(a -> Attachment.from(a, fileProvider)).toList(),
+                        quote.getBodyRanges() == null
+                                ? List.of()
+                                : quote.getBodyRanges()
+                                        .stream()
+                                        .filter(r -> r.style != null)
+                                        .map(TextStyle::from)
+                                        .toList());
             }
         }
 
@@ -255,9 +273,8 @@ public record MessageEnvelope(
                     RecipientResolver recipientResolver,
                     RecipientAddressResolver addressResolver
             ) {
-                return new Mention(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(mention.getServiceId())),
-                        mention.getStart(),
-                        mention.getLength());
+                return new Mention(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(mention.getServiceId()))
+                        .toApiRecipientAddress(), mention.getStart(), mention.getLength());
             }
         }
 
@@ -278,39 +295,45 @@ public record MessageEnvelope(
                 boolean isBorderless
         ) {
 
-            static Attachment from(SignalServiceAttachment attachment, AttachmentFileProvider fileProvider) {
-                if (attachment.isPointer()) {
-                    final var a = attachment.asPointer();
-                    return new Attachment(Optional.of(a.getRemoteId().toString()),
-                            Optional.of(fileProvider.getFile(a.getRemoteId())),
+            static Attachment from(SignalServiceAttachment signalAttachment, AttachmentFileProvider fileProvider) {
+                if (signalAttachment.isPointer()) {
+                    final var a = signalAttachment.asPointer();
+                    final var attachmentFile = fileProvider.getFile(a);
+                    return new Attachment(Optional.of(attachmentFile.getName()),
+                            Optional.of(attachmentFile),
                             a.getFileName(),
                             a.getContentType(),
                             a.getUploadTimestamp() == 0 ? Optional.empty() : Optional.of(a.getUploadTimestamp()),
                             a.getSize().map(Integer::longValue),
                             a.getPreview(),
                             Optional.empty(),
-                            a.getCaption(),
+                            a.getCaption().map(c -> c.isEmpty() ? null : c),
                             a.getWidth() == 0 ? Optional.empty() : Optional.of(a.getWidth()),
                             a.getHeight() == 0 ? Optional.empty() : Optional.of(a.getHeight()),
                             a.getVoiceNote(),
                             a.isGif(),
                             a.isBorderless());
                 } else {
-                    final var a = attachment.asStream();
-                    return new Attachment(Optional.empty(),
-                            Optional.empty(),
-                            a.getFileName(),
-                            a.getContentType(),
-                            a.getUploadTimestamp() == 0 ? Optional.empty() : Optional.of(a.getUploadTimestamp()),
-                            Optional.of(a.getLength()),
-                            a.getPreview(),
-                            Optional.empty(),
-                            a.getCaption(),
-                            a.getWidth() == 0 ? Optional.empty() : Optional.of(a.getWidth()),
-                            a.getHeight() == 0 ? Optional.empty() : Optional.of(a.getHeight()),
-                            a.getVoiceNote(),
-                            a.isGif(),
-                            a.isBorderless());
+                    Attachment attachment = null;
+                    try (final var a = signalAttachment.asStream()) {
+                        attachment = new Attachment(Optional.empty(),
+                                Optional.empty(),
+                                a.getFileName(),
+                                a.getContentType(),
+                                a.getUploadTimestamp() == 0 ? Optional.empty() : Optional.of(a.getUploadTimestamp()),
+                                Optional.of(a.getLength()),
+                                a.getPreview(),
+                                Optional.empty(),
+                                a.getCaption(),
+                                a.getWidth() == 0 ? Optional.empty() : Optional.of(a.getWidth()),
+                                a.getHeight() == 0 ? Optional.empty() : Optional.of(a.getHeight()),
+                                a.getVoiceNote(),
+                                a.isGif(),
+                                a.isBorderless());
+                        return attachment;
+                    } catch (IOException e) {
+                        return attachment;
+                    }
                 }
             }
 
@@ -367,7 +390,7 @@ public record MessageEnvelope(
             }
 
             public record Name(
-                    Optional<String> display,
+                    Optional<String> nickname,
                     Optional<String> given,
                     Optional<String> family,
                     Optional<String> prefix,
@@ -376,7 +399,7 @@ public record MessageEnvelope(
             ) {
 
                 static Name from(org.whispersystems.signalservice.api.messages.shared.SharedContact.Name name) {
-                    return new Name(name.getDisplay(),
+                    return new Name(name.getNickname(),
                             name.getGiven(),
                             name.getFamily(),
                             name.getPrefix(),
@@ -458,15 +481,15 @@ public record MessageEnvelope(
             ) {
 
                 static Address from(org.whispersystems.signalservice.api.messages.shared.SharedContact.PostalAddress address) {
-                    return new Address(Address.Type.from(address.getType()),
-                            address.getLabel(),
+                    return new Address(Type.from(address.getType()),
                             address.getLabel(),
-                            address.getLabel(),
-                            address.getLabel(),
-                            address.getLabel(),
-                            address.getLabel(),
-                            address.getLabel(),
-                            address.getLabel());
+                            address.getStreet(),
+                            address.getPobox(),
+                            address.getNeighborhood(),
+                            address.getCity(),
+                            address.getRegion(),
+                            address.getPostcode(),
+                            address.getCountry());
                 }
 
                 public enum Type {
@@ -497,6 +520,20 @@ public record MessageEnvelope(
                         preview.getImage().map(as -> Attachment.from(as, fileProvider)));
             }
         }
+
+    }
+
+    public record Edit(long targetSentTimestamp, Data dataMessage) {
+
+        public static Edit from(
+                final SignalServiceEditMessage editMessage,
+                RecipientResolver recipientResolver,
+                RecipientAddressResolver addressResolver,
+                final AttachmentFileProvider fileProvider
+        ) {
+            return new Edit(editMessage.getTargetSentTimestamp(),
+                    Data.from(editMessage.getDataMessage(), recipientResolver, addressResolver, fileProvider));
+        }
     }
 
     public record Sync(
@@ -540,6 +577,7 @@ public record MessageEnvelope(
                 Optional<RecipientAddress> destination,
                 Set<RecipientAddress> recipients,
                 Optional<Data> message,
+                Optional<Edit> editMessage,
                 Optional<Story> story
         ) {
 
@@ -552,13 +590,17 @@ public record MessageEnvelope(
                 return new Sent(sentMessage.getTimestamp(),
                         sentMessage.getExpirationStartTimestamp(),
                         sentMessage.getDestination()
-                                .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d))),
+                                .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d))
+                                        .toApiRecipientAddress()),
                         sentMessage.getRecipients()
                                 .stream()
-                                .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d)))
+                                .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d))
+                                        .toApiRecipientAddress())
                                 .collect(Collectors.toSet()),
                         sentMessage.getDataMessage()
                                 .map(message -> Data.from(message, recipientResolver, addressResolver, fileProvider)),
+                        sentMessage.getEditMessage()
+                                .map(message -> Edit.from(message, recipientResolver, addressResolver, fileProvider)),
                         sentMessage.getStoryMessage().map(s -> Story.from(s, fileProvider)));
             }
         }
@@ -572,7 +614,8 @@ public record MessageEnvelope(
             ) {
                 return new Blocked(blockedListMessage.getAddresses()
                         .stream()
-                        .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d)))
+                        .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d))
+                                .toApiRecipientAddress())
                         .toList(), blockedListMessage.getGroupIds().stream().map(GroupId::unknownVersion).toList());
             }
         }
@@ -584,8 +627,8 @@ public record MessageEnvelope(
                     RecipientResolver recipientResolver,
                     RecipientAddressResolver addressResolver
             ) {
-                return new Read(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(readMessage.getSender())),
-                        readMessage.getTimestamp());
+                return new Read(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(readMessage.getSender()))
+                        .toApiRecipientAddress(), readMessage.getTimestamp());
             }
         }
 
@@ -596,8 +639,8 @@ public record MessageEnvelope(
                     RecipientResolver recipientResolver,
                     RecipientAddressResolver addressResolver
             ) {
-                return new Viewed(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(readMessage.getSender())),
-                        readMessage.getTimestamp());
+                return new Viewed(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(readMessage.getSender()))
+                        .toApiRecipientAddress(), readMessage.getTimestamp());
             }
         }
 
@@ -609,7 +652,7 @@ public record MessageEnvelope(
                     RecipientAddressResolver addressResolver
             ) {
                 return new ViewOnceOpen(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(
-                        readMessage.getSender())), readMessage.getTimestamp());
+                        readMessage.getSender())).toApiRecipientAddress(), readMessage.getTimestamp());
             }
         }
 
@@ -637,7 +680,8 @@ public record MessageEnvelope(
                 return new MessageRequestResponse(Type.from(messageRequestResponse.getType()),
                         messageRequestResponse.getGroupId().map(GroupId::unknownVersion),
                         messageRequestResponse.getPerson()
-                                .map(p -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(p))));
+                                .map(p -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(p))
+                                        .toApiRecipientAddress()));
             }
 
             public enum Type {
@@ -646,7 +690,9 @@ public record MessageEnvelope(
                 DELETE,
                 BLOCK,
                 BLOCK_AND_DELETE,
-                UNBLOCK_AND_ACCEPT;
+                UNBLOCK_AND_ACCEPT,
+                SPAM,
+                BLOCK_AND_SPAM;
 
                 static Type from(MessageRequestResponseMessage.Type type) {
                     return switch (type) {
@@ -656,6 +702,8 @@ public record MessageEnvelope(
                         case BLOCK -> BLOCK;
                         case BLOCK_AND_DELETE -> BLOCK_AND_DELETE;
                         case UNBLOCK_AND_ACCEPT -> UNBLOCK_AND_ACCEPT;
+                        case SPAM -> SPAM;
+                        case BLOCK_AND_SPAM -> BLOCK_AND_SPAM;
                     };
                 }
             }
@@ -671,7 +719,8 @@ public record MessageEnvelope(
             Optional<Hangup> hangup,
             Optional<Busy> busy,
             List<IceUpdate> iceUpdate,
-            Optional<Opaque> opaque
+            Optional<Opaque> opaque,
+            boolean isUrgent
     ) {
 
         public static Call from(final SignalServiceCallMessage callMessage) {
@@ -685,16 +734,14 @@ public record MessageEnvelope(
                     callMessage.getIceUpdateMessages()
                             .map(m -> m.stream().map(IceUpdate::from).toList())
                             .orElse(List.of()),
-                    callMessage.getOpaqueMessage().map(Opaque::from));
+                    callMessage.getOpaqueMessage().map(Opaque::from),
+                    callMessage.isUrgent());
         }
 
-        public record Offer(long id, String sdp, Type type, byte[] opaque) {
+        public record Offer(long id, Type type, byte[] opaque) {
 
             static Offer from(OfferMessage offerMessage) {
-                return new Offer(offerMessage.getId(),
-                        offerMessage.getSdp(),
-                        Type.from(offerMessage.getType()),
-                        offerMessage.getOpaque());
+                return new Offer(offerMessage.getId(), Type.from(offerMessage.getType()), offerMessage.getOpaque());
             }
 
             public enum Type {
@@ -710,10 +757,10 @@ public record MessageEnvelope(
             }
         }
 
-        public record Answer(long id, String sdp, byte[] opaque) {
+        public record Answer(long id, byte[] opaque) {
 
             static Answer from(AnswerMessage answerMessage) {
-                return new Answer(answerMessage.getId(), answerMessage.getSdp(), answerMessage.getOpaque());
+                return new Answer(answerMessage.getId(), answerMessage.getOpaque());
             }
         }
 
@@ -724,13 +771,12 @@ public record MessageEnvelope(
             }
         }
 
-        public record Hangup(long id, Type type, int deviceId, boolean isLegacy) {
+        public record Hangup(long id, Type type, int deviceId) {
 
             static Hangup from(HangupMessage hangupMessage) {
                 return new Hangup(hangupMessage.getId(),
                         Type.from(hangupMessage.getType()),
-                        hangupMessage.getDeviceId(),
-                        hangupMessage.isLegacy());
+                        hangupMessage.getDeviceId());
             }
 
             public enum Type {
@@ -752,10 +798,10 @@ public record MessageEnvelope(
             }
         }
 
-        public record IceUpdate(long id, String sdp, byte[] opaque) {
+        public record IceUpdate(long id, byte[] opaque) {
 
             static IceUpdate from(IceUpdateMessage iceUpdateMessage) {
-                return new IceUpdate(iceUpdateMessage.getId(), iceUpdateMessage.getSdp(), iceUpdateMessage.getOpaque());
+                return new IceUpdate(iceUpdateMessage.getId(), iceUpdateMessage.getOpaque());
             }
         }
 
@@ -837,11 +883,13 @@ public record MessageEnvelope(
                 }
             }
 
-            public record Gradient(Optional<Color> startColor, Optional<Color> endColor, Optional<Integer> angle) {
+            public record Gradient(
+                    List<Color> colors, List<Float> positions, Optional<Integer> angle
+            ) {
 
                 static Gradient from(SignalServiceTextAttachment.Gradient gradient) {
-                    return new Gradient(gradient.getStartColor().map(Color::new),
-                            gradient.getEndColor().map(Color::new),
+                    return new Gradient(gradient.getColors().stream().map(Color::new).toList(),
+                            gradient.getPositions(),
                             gradient.getAngle());
                 }
             }
@@ -856,8 +904,9 @@ public record MessageEnvelope(
             final AttachmentFileProvider fileProvider,
             Exception exception
     ) {
-        final var source = !envelope.isUnidentifiedSender() && envelope.hasSourceUuid()
-                ? recipientResolver.resolveRecipient(envelope.getSourceAddress())
+        final var serviceId = envelope.getSourceServiceId().map(ServiceId::parseOrNull).orElse(null);
+        final var source = !envelope.isUnidentifiedSender() && serviceId != null
+                ? recipientResolver.resolveRecipient(serviceId)
                 : envelope.isUnidentifiedSender() && content != null
                         ? recipientResolver.resolveRecipient(content.getSender())
                         : exception instanceof ProtocolException e
@@ -872,6 +921,7 @@ public record MessageEnvelope(
         Optional<Receipt> receipt;
         Optional<Typing> typing;
         Optional<Data> data;
+        Optional<Edit> edit;
         Optional<Sync> sync;
         Optional<Call> call;
         Optional<Story> story;
@@ -880,6 +930,7 @@ public record MessageEnvelope(
             typing = content.getTypingMessage().map(Typing::from);
             data = content.getDataMessage()
                     .map(dataMessage -> Data.from(dataMessage, recipientResolver, addressResolver, fileProvider));
+            edit = content.getEditMessage().map(s -> Edit.from(s, recipientResolver, addressResolver, fileProvider));
             sync = content.getSyncMessage().map(s -> Sync.from(s, recipientResolver, addressResolver, fileProvider));
             call = content.getCallMessage().map(Call::from);
             story = content.getStoryMessage().map(s -> Story.from(s, fileProvider));
@@ -889,6 +940,7 @@ public record MessageEnvelope(
                     List.of(envelope.getTimestamp()))) : Optional.empty();
             typing = Optional.empty();
             data = Optional.empty();
+            edit = Optional.empty();
             sync = Optional.empty();
             call = Optional.empty();
             story = Optional.empty();
@@ -896,7 +948,7 @@ public record MessageEnvelope(
 
         return new MessageEnvelope(source == null
                 ? Optional.empty()
-                : Optional.of(addressResolver.resolveRecipientAddress(source)),
+                : Optional.of(addressResolver.resolveRecipientAddress(source).toApiRecipientAddress()),
                 sourceDevice,
                 envelope.getTimestamp(),
                 envelope.getServerReceivedTimestamp(),
@@ -905,6 +957,7 @@ public record MessageEnvelope(
                 receipt,
                 typing,
                 data,
+                edit,
                 sync,
                 call,
                 story);
@@ -912,6 +965,6 @@ public record MessageEnvelope(
 
     public interface AttachmentFileProvider {
 
-        File getFile(SignalServiceAttachmentRemoteId attachmentRemoteId);
+        File getFile(SignalServiceAttachmentPointer pointer);
     }
 }