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;
import java.util.stream.Collectors;
-import static org.whispersystems.signalservice.internal.push.SignalServiceProtos.BodyRange;
-
public record MessageEnvelope(
Optional<RecipientAddress> sourceAddress,
int sourceDevice,
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())
.map(a -> a.stream().map(preview -> Preview.from(preview, fileProvider)).toList())
.orElse(List.of()),
dataMessage.getBodyRanges()
- .map(a -> a.stream().filter(BodyRange::hasStyle).map(TextStyle::from).toList())
+ .map(a -> a.stream().filter(r -> r.style != null).map(TextStyle::from).toList())
.orElse(List.of()));
}
return new Quote(quote.getId(),
addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(quote.getAuthor()))
.toApiRecipientAddress(),
- Optional.ofNullable(quote.getText()),
+ Optional.of(quote.getText()),
quote.getMentions() == null
? List.of()
: quote.getMentions()
? List.of()
: quote.getBodyRanges()
.stream()
- .filter(BodyRange::hasStyle)
+ .filter(r -> r.style != null)
.map(TextStyle::from)
.toList());
}
boolean isBorderless
) {
- static Attachment from(SignalServiceAttachment attachment, AttachmentFileProvider fileProvider) {
- if (attachment.isPointer()) {
- final var a = attachment.asPointer();
+ 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.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;
+ }
}
}
static Attachment from(
- SignalServiceDataMessage.Quote.QuotedAttachment a, final AttachmentFileProvider fileProvider
+ SignalServiceDataMessage.Quote.QuotedAttachment a,
+ final AttachmentFileProvider fileProvider
) {
return new Attachment(Optional.empty(),
Optional.empty(),
}
public record Name(
- Optional<String> display,
+ Optional<String> nickname,
Optional<String> given,
Optional<String> family,
Optional<String> prefix,
) {
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(),
) {
static Address from(org.whispersystems.signalservice.api.messages.shared.SharedContact.PostalAddress address) {
- return new Address(Address.Type.from(address.getType()),
- address.getLabel(),
- address.getLabel(),
- address.getLabel(),
- address.getLabel(),
+ return new Address(Type.from(address.getType()),
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 {
public record Preview(String title, String description, long date, String url, Optional<Attachment> image) {
- static Preview from(
- SignalServicePreview preview, final AttachmentFileProvider fileProvider
- ) {
+ static Preview from(SignalServicePreview preview, final AttachmentFileProvider fileProvider) {
return new Preview(preview.getTitle(),
preview.getDescription(),
preview.getDate(),
DELETE,
BLOCK,
BLOCK_AND_DELETE,
- UNBLOCK_AND_ACCEPT;
+ UNBLOCK_AND_ACCEPT,
+ SPAM,
+ BLOCK_AND_SPAM;
static Type from(MessageRequestResponseMessage.Type type) {
return switch (type) {
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;
};
}
}
Optional<Busy> busy,
List<IceUpdate> iceUpdate,
Optional<Opaque> opaque,
- boolean isMultiRing,
boolean isUrgent
) {
.map(m -> m.stream().map(IceUpdate::from).toList())
.orElse(List.of()),
callMessage.getOpaqueMessage().map(Opaque::from),
- callMessage.isMultiRing(),
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 {
}
}
- 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());
}
}
}
}
- 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 {
}
}
- 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());
}
}
Optional<TextAttachment> textAttachment
) {
- public static Story from(
- SignalServiceStoryMessage storyMessage, final AttachmentFileProvider fileProvider
- ) {
+ public static Story from(SignalServiceStoryMessage storyMessage, final AttachmentFileProvider fileProvider) {
return new Story(storyMessage.getAllowsReplies().orElse(false),
storyMessage.getGroupContext().map(c -> GroupUtils.getGroupIdV2(c.getMasterKey())),
storyMessage.getFileAttachment().map(f -> Data.Attachment.from(f, fileProvider)),
) {
static TextAttachment from(
- SignalServiceTextAttachment textAttachment, final AttachmentFileProvider fileProvider
+ SignalServiceTextAttachment textAttachment,
+ final AttachmentFileProvider fileProvider
) {
return new TextAttachment(textAttachment.getText(),
textAttachment.getStyle().map(Style::from),
final AttachmentFileProvider fileProvider,
Exception exception
) {
- final var source = !envelope.isUnidentifiedSender() && envelope.hasSourceServiceId()
- ? 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