From 9cb8fc8ef5c04b9c9c885bb867c44b5bd761ccd7 Mon Sep 17 00:00:00 2001 From: Clark Date: Mon, 24 Apr 2023 11:19:07 -0400 Subject: [PATCH] Fix edit message when editing message sent to self. --- .../securesms/jobs/IndividualSendJob.java | 15 ++++++++--- .../jobs/MultiDeviceStorySendSyncJob.kt | 3 ++- .../api/SignalServiceMessageSender.java | 27 +++++++++++++++++-- .../api/messages/SignalServiceContent.java | 4 ++- .../multidevice/SentTranscriptMessage.java | 10 ++++++- 5 files changed, 51 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java index 5bc5878ec6..d140b18235 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java @@ -42,6 +42,7 @@ import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; import org.whispersystems.signalservice.api.messages.SendMessageResult; import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; +import org.whispersystems.signalservice.api.messages.SignalServiceEditMessage; import org.whispersystems.signalservice.api.messages.SignalServicePreview; import org.whispersystems.signalservice.api.messages.shared.SharedContact; import org.whispersystems.signalservice.api.push.SignalServiceAddress; @@ -288,10 +289,18 @@ public class IndividualSendJob extends PushSendJob { SignalServiceDataMessage mediaMessage = mediaMessageBuilder.build(); if (originalEditedMessage != null) { - SendMessageResult result = messageSender.sendEditMessage(address, UnidentifiedAccessUtil.getAccessFor(context, messageRecipient), ContentHint.RESENDABLE, mediaMessage, IndividualSendEvents.EMPTY, message.isUrgent(), originalEditedMessage.getDateSent()); - SignalDatabase.messageLog().insertIfPossible(messageRecipient.getId(), message.getSentTimeMillis(), result, ContentHint.RESENDABLE, new MessageId(messageId), false); + if (Util.equals(SignalStore.account().getAci(), address.getServiceId())) { + Optional syncAccess = UnidentifiedAccessUtil.getAccessForSync(context); + SendMessageResult result = messageSender.sendSelfSyncEditMessage(new SignalServiceEditMessage(originalEditedMessage.getDateSent(), mediaMessage)); + SignalDatabase.messageLog().insertIfPossible(messageRecipient.getId(), message.getSentTimeMillis(), result, ContentHint.RESENDABLE, new MessageId(messageId), false); - return result.getSuccess().isUnidentified(); + return syncAccess.isPresent(); + } else { + SendMessageResult result = messageSender.sendEditMessage(address, UnidentifiedAccessUtil.getAccessFor(context, messageRecipient), ContentHint.RESENDABLE, mediaMessage, IndividualSendEvents.EMPTY, message.isUrgent(), originalEditedMessage.getDateSent()); + SignalDatabase.messageLog().insertIfPossible(messageRecipient.getId(), message.getSentTimeMillis(), result, ContentHint.RESENDABLE, new MessageId(messageId), false); + + return result.getSuccess().isUnidentified(); + } } else if (Util.equals(SignalStore.account().getAci(), address.getServiceId())) { Optional syncAccess = UnidentifiedAccessUtil.getAccessForSync(context); SendMessageResult result = messageSender.sendSyncMessage(mediaMessage); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStorySendSyncJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStorySendSyncJob.kt index 93ca4b5674..a456ff9435 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStorySendSyncJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStorySendSyncJob.kt @@ -81,7 +81,8 @@ class MultiDeviceStorySendSyncJob private constructor(parameters: Parameters, pr emptyMap(), true, Optional.empty(), - recipientsSet + recipientsSet, + Optional.empty() ) } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index 78bdfcd3b9..afaa671a26 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -644,6 +644,12 @@ public class SignalServiceMessageSender { return sendSyncMessage(createSelfSendSyncMessage(dataMessage), Optional.empty()); } + public SendMessageResult sendSelfSyncEditMessage(SignalServiceEditMessage editMessage) + throws IOException, UntrustedIdentityException + { + return sendSyncMessage(createSelfSendSyncEditMessage(editMessage), Optional.empty()); + } + public SendMessageResult sendSyncMessage(SignalServiceSyncMessage message, Optional unidentifiedAccess) throws IOException, UntrustedIdentityException { @@ -958,6 +964,8 @@ public class SignalServiceMessageSender { return createStoryContent(transcriptMessage.getStoryMessage().get()); } else if (transcriptMessage.getDataMessage().isPresent()) { return createMessageContent(transcriptMessage.getDataMessage().get()); + } else if (transcriptMessage.getEditMessage().isPresent()) { + return createEditMessageContent(transcriptMessage.getEditMessage().get()); } else { return null; } @@ -1790,7 +1798,8 @@ public class SignalServiceMessageSender { Collections.singletonMap(localAddress.getServiceId(), false), isRecipientUpdate, Optional.of(message), - manifest); + manifest, + Optional.empty()); return SignalServiceSyncMessage.forSentTranscript(transcript); } @@ -1803,7 +1812,21 @@ public class SignalServiceMessageSender { Collections.singletonMap(localAddress.getServiceId(), false), false, Optional.empty(), - Collections.emptySet()); + Collections.emptySet(), + Optional.empty()); + return SignalServiceSyncMessage.forSentTranscript(transcript); + } + + private SignalServiceSyncMessage createSelfSendSyncEditMessage(SignalServiceEditMessage message) { + SentTranscriptMessage transcript = new SentTranscriptMessage(Optional.of(localAddress), + message.getDataMessage().getTimestamp(), + Optional.empty(), + message.getDataMessage().getExpiresInSeconds(), + Collections.singletonMap(localAddress.getServiceId(), false), + false, + Optional.empty(), + Collections.emptySet(), + Optional.of(message)); return SignalServiceSyncMessage.forSentTranscript(transcript); } 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 b8ff4ede8a..b32d4d709c 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 @@ -825,6 +825,7 @@ public final class SignalServiceContent { SignalServiceProtos.SyncMessage.Sent sentContent = content.getSent(); Optional dataMessage = sentContent.hasMessage() ? Optional.of(createSignalServiceDataMessage(metadata, sentContent.getMessage())) : Optional.empty(); Optional storyMessage = sentContent.hasStoryMessage() ? Optional.of(createStoryMessage(sentContent.getStoryMessage())) : Optional.empty(); + Optional editMessage = sentContent.hasEditMessage() ? Optional.of(createEditMessage(metadata, sentContent.getEditMessage())) : Optional.empty(); Optional address = SignalServiceAddress.isValidAddress(sentContent.getDestinationUuid()) ? Optional.of(new SignalServiceAddress(ServiceId.parseOrThrow(sentContent.getDestinationUuid()), sentContent.getDestinationE164())) : Optional.empty(); @@ -856,7 +857,8 @@ public final class SignalServiceContent { unidentifiedStatuses, sentContent.getIsRecipientUpdate(), storyMessage, - recipientManifest)); + recipientManifest, + editMessage)); } if (content.hasRequest()) { diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/SentTranscriptMessage.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/SentTranscriptMessage.java index ddd795ad47..2c46d1f8f1 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/SentTranscriptMessage.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/SentTranscriptMessage.java @@ -8,6 +8,7 @@ package org.whispersystems.signalservice.api.messages.multidevice; import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; +import org.whispersystems.signalservice.api.messages.SignalServiceEditMessage; import org.whispersystems.signalservice.api.messages.SignalServiceStoryMessage; import org.whispersystems.signalservice.api.messages.SignalServiceStoryMessageRecipient; import org.whispersystems.signalservice.api.push.ServiceId; @@ -29,6 +30,7 @@ public class SentTranscriptMessage { private final boolean isRecipientUpdate; private final Optional storyMessage; private final Set storyMessageRecipients; + private final Optional editMessage; public SentTranscriptMessage(Optional destination, long timestamp, @@ -37,7 +39,8 @@ public class SentTranscriptMessage { Map unidentifiedStatus, boolean isRecipientUpdate, Optional storyMessage, - Set storyMessageRecipients) + Set storyMessageRecipients, + Optional editMessage) { this.destination = destination; this.timestamp = timestamp; @@ -48,6 +51,7 @@ public class SentTranscriptMessage { this.isRecipientUpdate = isRecipientUpdate; this.storyMessage = storyMessage; this.storyMessageRecipients = storyMessageRecipients; + this.editMessage = editMessage; } public Optional getDestination() { @@ -66,6 +70,10 @@ public class SentTranscriptMessage { return message; } + public Optional getEditMessage() { + return editMessage; + } + public Optional getStoryMessage() { return storyMessage; }