diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java index 71c61cc6b..16c5a1113 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java @@ -132,10 +132,20 @@ public class ConversationMessage { */ @WorkerThread public static @NonNull ConversationMessage createWithUnresolvedData(@NonNull Context context, @NonNull MessageRecord messageRecord) { + return createWithUnresolvedData(context, messageRecord, messageRecord.getDisplayBody(context)); + } + + /** + * Creates a {@link ConversationMessage} wrapping the provided MessageRecord and body, and will query for potential mentions. If mentions + * are found, the body of the provided message will be updated and modified to match actual mentions. This will perform + * database operations to query for mentions and then to resolve mentions to display names. + */ + @WorkerThread + public static @NonNull ConversationMessage createWithUnresolvedData(@NonNull Context context, @NonNull MessageRecord messageRecord, @NonNull CharSequence body) { if (messageRecord.isMms()) { List mentions = DatabaseFactory.getMentionDatabase(context).getMentionsForMessage(messageRecord.getId()); if (!mentions.isEmpty()) { - MentionUtil.UpdatedBodyAndMentions updated = MentionUtil.updateBodyAndMentionsWithDisplayNames(context, messageRecord, mentions); + MentionUtil.UpdatedBodyAndMentions updated = MentionUtil.updateBodyAndMentionsWithDisplayNames(context, body, mentions); return new ConversationMessage(messageRecord, updated.getBody(), updated.getMentions()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MentionUtil.java b/app/src/main/java/org/thoughtcrime/securesms/database/MentionUtil.java index 85fe60ce9..ed1799f5d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MentionUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MentionUtil.java @@ -77,7 +77,7 @@ public final class MentionUtil { for (Mention mention : sortedMentions) { if (invalidMention(body, mention)) { - return new UpdatedBodyAndMentions(body, Collections.emptyList()); + continue; } updatedBody.append(body.subSequence(bodyIndex, mention.getStart())); diff --git a/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessage.java b/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessage.java index bd9e4460c..5ff3fd86e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessage.java +++ b/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessage.java @@ -15,11 +15,9 @@ import org.thoughtcrime.securesms.database.model.MessageRecord; class LongMessage { private final ConversationMessage conversationMessage; - private final String fullBody; - LongMessage(@NonNull ConversationMessage conversationMessage, @NonNull String fullBody) { + LongMessage(@NonNull ConversationMessage conversationMessage) { this.conversationMessage = conversationMessage; - this.fullBody = fullBody; } @NonNull MessageRecord getMessageRecord() { @@ -27,6 +25,6 @@ class LongMessage { } @NonNull CharSequence getFullBody(@NonNull Context context) { - return !TextUtils.isEmpty(fullBody) ? fullBody : conversationMessage.getDisplayBody(context); + return conversationMessage.getDisplayBody(context); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageRepository.java b/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageRepository.java index 5931eacc5..24ca5cb33 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageRepository.java @@ -54,9 +54,9 @@ class LongMessageRepository { TextSlide textSlide = record.get().getSlideDeck().getTextSlide(); if (textSlide != null && textSlide.getUri() != null) { - return Optional.of(new LongMessage(ConversationMessageFactory.createWithUnresolvedData(context, record.get()), readFullBody(context, textSlide.getUri()))); + return Optional.of(new LongMessage(ConversationMessageFactory.createWithUnresolvedData(context, record.get(), readFullBody(context, textSlide.getUri())))); } else { - return Optional.of(new LongMessage(ConversationMessageFactory.createWithUnresolvedData(context, record.get()), "")); + return Optional.of(new LongMessage(ConversationMessageFactory.createWithUnresolvedData(context, record.get()))); } } else { return Optional.absent(); @@ -68,7 +68,7 @@ class LongMessageRepository { Optional record = getSmsMessage(smsDatabase, messageId); if (record.isPresent()) { - return Optional.of(new LongMessage(ConversationMessageFactory.createWithUnresolvedData(context, record.get()), "")); + return Optional.of(new LongMessage(ConversationMessageFactory.createWithUnresolvedData(context, record.get()))); } else { return Optional.absent(); } @@ -89,7 +89,7 @@ class LongMessageRepository { } } - private String readFullBody(@NonNull Context context, @NonNull Uri uri) { + private @NonNull String readFullBody(@NonNull Context context, @NonNull Uri uri) { try (InputStream stream = PartAuthority.getAttachmentStream(context, uri)) { return StreamUtil.readFullyAsString(stream); } catch (IOException e) { diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceContent.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceContent.java index b900ee692..8f035a040 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceContent.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceContent.java @@ -951,7 +951,6 @@ public final class SignalServiceContent { for (SignalServiceProtos.DataMessage.BodyRange bodyRange : bodyRanges) { if (bodyRange.hasMentionUuid()) { try { - validateBodyRange(body, bodyRange); mentions.add(new SignalServiceDataMessage.Mention(UuidUtil.parseOrThrow(bodyRange.getMentionUuid()), bodyRange.getStart(), bodyRange.getLength())); } catch (IllegalArgumentException e) { throw new ProtocolInvalidMessageException(new InvalidMessageException(e), null, 0); @@ -966,16 +965,6 @@ public final class SignalServiceContent { return mentions; } - private static void validateBodyRange(String body, SignalServiceProtos.DataMessage.BodyRange bodyRange) throws ProtocolInvalidMessageException { - int incomingBodyLength = body != null ? body.length() : -1; - int start = bodyRange.hasStart() ? bodyRange.getStart() : -1; - int length = bodyRange.hasLength() ? bodyRange.getLength() : -1; - - if (start < 0 || length < 0 || (start + length) > incomingBodyLength) { - throw new ProtocolInvalidMessageException(new InvalidMessageException("Incoming body range has out-of-bound range"), null, 0); - } - } - private static SignalServiceDataMessage.Sticker createSticker(SignalServiceProtos.DataMessage content) throws ProtocolInvalidMessageException { if (!content.hasSticker() || !content.getSticker().hasPackId() ||