kopia lustrzana https://github.com/ryukoposting/Signal-Android
Improve handling of mismatched expiry timers on messages.
rodzic
5ed6a05eb9
commit
bb8faebc7d
|
@ -290,12 +290,12 @@ public final class MessageContentProcessor {
|
||||||
if (isInvalidMessage(message)) handleInvalidMessage(content.getSender(), content.getSenderDevice(), groupId, content.getTimestamp(), smsMessageId);
|
if (isInvalidMessage(message)) handleInvalidMessage(content.getSender(), content.getSenderDevice(), groupId, content.getTimestamp(), smsMessageId);
|
||||||
else if (message.isEndSession()) messageId = handleEndSessionMessage(content, smsMessageId, senderRecipient);
|
else if (message.isEndSession()) messageId = handleEndSessionMessage(content, smsMessageId, senderRecipient);
|
||||||
else if (message.isGroupV1Update()) handleGroupV1Message(content, message, smsMessageId, groupId.get().requireV1(), senderRecipient, threadRecipient, receivedTime);
|
else if (message.isGroupV1Update()) handleGroupV1Message(content, message, smsMessageId, groupId.get().requireV1(), senderRecipient, threadRecipient, receivedTime);
|
||||||
else if (message.isExpirationUpdate()) messageId = handleExpirationUpdate(content, message, smsMessageId, groupId, senderRecipient, threadRecipient, receivedTime);
|
else if (message.isExpirationUpdate()) messageId = handleExpirationUpdate(content, message, smsMessageId, groupId, senderRecipient, threadRecipient, receivedTime, false);
|
||||||
else if (message.getReaction().isPresent() && message.getStoryContext().isPresent()) messageId = handleStoryReaction(content, message, senderRecipient);
|
else if (message.getReaction().isPresent() && message.getStoryContext().isPresent()) messageId = handleStoryReaction(content, message, senderRecipient);
|
||||||
else if (message.getReaction().isPresent()) messageId = handleReaction(content, message, senderRecipient);
|
else if (message.getReaction().isPresent()) messageId = handleReaction(content, message, senderRecipient);
|
||||||
else if (message.getRemoteDelete().isPresent()) messageId = handleRemoteDelete(content, message, senderRecipient);
|
else if (message.getRemoteDelete().isPresent()) messageId = handleRemoteDelete(content, message, senderRecipient);
|
||||||
else if (message.getPayment().isPresent()) handlePayment(content, message, senderRecipient);
|
else if (message.getPayment().isPresent()) handlePayment(content, message, senderRecipient);
|
||||||
else if (message.getStoryContext().isPresent()) messageId = handleStoryReply(content, message, senderRecipient);
|
else if (message.getStoryContext().isPresent()) messageId = handleStoryReply(content, message, senderRecipient, receivedTime);
|
||||||
else if (message.getGiftBadge().isPresent()) messageId = handleGiftMessage(content, message, senderRecipient, threadRecipient, receivedTime);
|
else if (message.getGiftBadge().isPresent()) messageId = handleGiftMessage(content, message, senderRecipient, threadRecipient, receivedTime);
|
||||||
else if (isMediaMessage) messageId = handleMediaMessage(content, message, smsMessageId, senderRecipient, threadRecipient, receivedTime);
|
else if (isMediaMessage) messageId = handleMediaMessage(content, message, smsMessageId, senderRecipient, threadRecipient, receivedTime);
|
||||||
else if (message.getBody().isPresent()) messageId = handleTextMessage(content, message, smsMessageId, groupId, senderRecipient, threadRecipient, receivedTime);
|
else if (message.getBody().isPresent()) messageId = handleTextMessage(content, message, smsMessageId, groupId, senderRecipient, threadRecipient, receivedTime);
|
||||||
|
@ -801,9 +801,7 @@ public final class MessageContentProcessor {
|
||||||
|
|
||||||
GroupV1MessageProcessor.process(context, content, message, false);
|
GroupV1MessageProcessor.process(context, content, message, false);
|
||||||
|
|
||||||
if (message.getExpiresInSeconds() != 0 && message.getExpiresInSeconds() != threadRecipient.getExpiresInSeconds()) {
|
handlePossibleExpirationUpdate(content, message, Optional.of(groupId), senderRecipient, threadRecipient, receivedTime);
|
||||||
handleExpirationUpdate(content, message, Optional.empty(), Optional.of(groupId), senderRecipient, threadRecipient, receivedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (smsMessageId.isPresent()) {
|
if (smsMessageId.isPresent()) {
|
||||||
SignalDatabase.sms().deleteMessage(smsMessageId.get());
|
SignalDatabase.sms().deleteMessage(smsMessageId.get());
|
||||||
|
@ -837,13 +835,36 @@ public final class MessageContentProcessor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inserts an expiration update if the message timer doesn't match the thread timer.
|
||||||
|
*/
|
||||||
|
private void handlePossibleExpirationUpdate(@NonNull SignalServiceContent content,
|
||||||
|
@NonNull SignalServiceDataMessage message,
|
||||||
|
Optional<GroupId> groupId,
|
||||||
|
@NonNull Recipient senderRecipient,
|
||||||
|
@NonNull Recipient threadRecipient,
|
||||||
|
long receivedTime)
|
||||||
|
throws StorageFailedException
|
||||||
|
{
|
||||||
|
if (message.getExpiresInSeconds() != threadRecipient.getExpiresInSeconds()) {
|
||||||
|
warn(content.getTimestamp(), "Message expire time didn't match thread expire time. Handling timer update.");
|
||||||
|
handleExpirationUpdate(content, message, Optional.empty(), groupId, senderRecipient, threadRecipient, receivedTime, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param sideEffect True if the event is side effect of a different message, false if the message itself was an expiration update.
|
||||||
|
* @throws StorageFailedException
|
||||||
|
*/
|
||||||
private @Nullable MessageId handleExpirationUpdate(@NonNull SignalServiceContent content,
|
private @Nullable MessageId handleExpirationUpdate(@NonNull SignalServiceContent content,
|
||||||
@NonNull SignalServiceDataMessage message,
|
@NonNull SignalServiceDataMessage message,
|
||||||
@NonNull Optional<Long> smsMessageId,
|
@NonNull Optional<Long> smsMessageId,
|
||||||
@NonNull Optional<GroupId> groupId,
|
@NonNull Optional<GroupId> groupId,
|
||||||
@NonNull Recipient senderRecipient,
|
@NonNull Recipient senderRecipient,
|
||||||
@NonNull Recipient threadRecipient,
|
@NonNull Recipient threadRecipient,
|
||||||
long receivedTime)
|
long receivedTime,
|
||||||
|
boolean sideEffect)
|
||||||
throws StorageFailedException
|
throws StorageFailedException
|
||||||
{
|
{
|
||||||
log(content.getTimestamp(), "Expiration update.");
|
log(content.getTimestamp(), "Expiration update.");
|
||||||
|
@ -864,7 +885,7 @@ public final class MessageContentProcessor {
|
||||||
try {
|
try {
|
||||||
MessageDatabase database = SignalDatabase.mms();
|
MessageDatabase database = SignalDatabase.mms();
|
||||||
IncomingMediaMessage mediaMessage = new IncomingMediaMessage(senderRecipient.getId(),
|
IncomingMediaMessage mediaMessage = new IncomingMediaMessage(senderRecipient.getId(),
|
||||||
content.getTimestamp(),
|
content.getTimestamp() - (sideEffect ? 1 : 0),
|
||||||
content.getServerReceivedTimestamp(),
|
content.getServerReceivedTimestamp(),
|
||||||
receivedTime,
|
receivedTime,
|
||||||
StoryType.NONE,
|
StoryType.NONE,
|
||||||
|
@ -1598,7 +1619,7 @@ public final class MessageContentProcessor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private @Nullable MessageId handleStoryReply(@NonNull SignalServiceContent content, @NonNull SignalServiceDataMessage message, @NonNull Recipient senderRecipient) throws StorageFailedException {
|
private @Nullable MessageId handleStoryReply(@NonNull SignalServiceContent content, @NonNull SignalServiceDataMessage message, @NonNull Recipient senderRecipient, long receivedTime) throws StorageFailedException {
|
||||||
log(content.getTimestamp(), "Story reply.");
|
log(content.getTimestamp(), "Story reply.");
|
||||||
|
|
||||||
if (!Stories.isFeatureAvailable()) {
|
if (!Stories.isFeatureAvailable()) {
|
||||||
|
@ -1620,8 +1641,10 @@ public final class MessageContentProcessor {
|
||||||
try {
|
try {
|
||||||
MessageId storyMessageId = database.getStoryId(storyAuthorRecipient, storyContext.getSentTimestamp());
|
MessageId storyMessageId = database.getStoryId(storyAuthorRecipient, storyContext.getSentTimestamp());
|
||||||
MmsMessageRecord story = (MmsMessageRecord) database.getMessageRecord(storyMessageId.getId());
|
MmsMessageRecord story = (MmsMessageRecord) database.getMessageRecord(storyMessageId.getId());
|
||||||
Recipient threadRecipient = SignalDatabase.threads().getRecipientForThreadId(story.getThreadId());
|
Recipient threadRecipient = Objects.requireNonNull(SignalDatabase.threads().getRecipientForThreadId(story.getThreadId()));
|
||||||
boolean groupStory = threadRecipient != null && threadRecipient.isActiveGroup();
|
boolean groupStory = threadRecipient.isActiveGroup();
|
||||||
|
|
||||||
|
handlePossibleExpirationUpdate(content, message, threadRecipient.getGroupId(), senderRecipient, threadRecipient, receivedTime);
|
||||||
|
|
||||||
if (message.getGroupContext().isPresent() ) {
|
if (message.getGroupContext().isPresent() ) {
|
||||||
parentStoryId = new ParentStoryId.GroupReply(storyMessageId.getId());
|
parentStoryId = new ParentStoryId.GroupReply(storyMessageId.getId());
|
||||||
|
@ -1776,6 +1799,8 @@ public final class MessageContentProcessor {
|
||||||
Optional<List<Mention>> mentions = getMentions(message.getMentions());
|
Optional<List<Mention>> mentions = getMentions(message.getMentions());
|
||||||
Optional<Attachment> sticker = getStickerAttachment(message.getSticker());
|
Optional<Attachment> sticker = getStickerAttachment(message.getSticker());
|
||||||
|
|
||||||
|
handlePossibleExpirationUpdate(content, message, Optional.empty(), senderRecipient, threadRecipient, receivedTime);
|
||||||
|
|
||||||
IncomingMediaMessage mediaMessage = new IncomingMediaMessage(senderRecipient.getId(),
|
IncomingMediaMessage mediaMessage = new IncomingMediaMessage(senderRecipient.getId(),
|
||||||
message.getTimestamp(),
|
message.getTimestamp(),
|
||||||
content.getServerReceivedTimestamp(),
|
content.getServerReceivedTimestamp(),
|
||||||
|
@ -2139,9 +2164,7 @@ public final class MessageContentProcessor {
|
||||||
MessageDatabase database = SignalDatabase.sms();
|
MessageDatabase database = SignalDatabase.sms();
|
||||||
String body = message.getBody().isPresent() ? message.getBody().get() : "";
|
String body = message.getBody().isPresent() ? message.getBody().get() : "";
|
||||||
|
|
||||||
if (message.getExpiresInSeconds() != threadRecipient.getExpiresInSeconds()) {
|
handlePossibleExpirationUpdate(content, message, groupId, senderRecipient, threadRecipient, receivedTime);
|
||||||
handleExpirationUpdate(content, message, Optional.empty(), groupId, senderRecipient, threadRecipient, receivedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
Optional<InsertResult> insertResult;
|
Optional<InsertResult> insertResult;
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue