Prevent possibility of recursively enqueuing early message jobs.
This commit is contained in:
parent
44efda8318
commit
b109effc94
5 changed files with 32 additions and 14 deletions
|
@ -48,7 +48,7 @@ class PushProcessEarlyMessagesJob private constructor(parameters: Parameters) :
|
|||
if (contents.isPresent) {
|
||||
for (content: SignalServiceContent in contents.get()) {
|
||||
Log.i(TAG, "[${id.sentTimestamp}] Processing early content for $id")
|
||||
MessageContentProcessor(context).process(MessageContentProcessor.MessageState.DECRYPTED_OK, content, null, id.sentTimestamp, -1)
|
||||
MessageContentProcessor.forEarlyContent(context).process(MessageContentProcessor.MessageState.DECRYPTED_OK, content, null, id.sentTimestamp, -1)
|
||||
}
|
||||
} else {
|
||||
Log.w(TAG, "[${id.sentTimestamp}] Saw $id in the cache, but when we went to retrieve it, it was already gone.")
|
||||
|
|
|
@ -189,7 +189,7 @@ public final class PushProcessMessageJob extends BaseJob {
|
|||
|
||||
@Override
|
||||
public void onRun() throws Exception {
|
||||
MessageContentProcessor processor = new MessageContentProcessor(context);
|
||||
MessageContentProcessor processor = MessageContentProcessor.forNormalContent(context);
|
||||
processor.process(messageState, content, exceptionMetadata, timestamp, smsMessageId);
|
||||
}
|
||||
|
||||
|
|
|
@ -142,7 +142,7 @@ public class IncomingMessageProcessor {
|
|||
stopwatch.split("group-check");
|
||||
|
||||
try {
|
||||
MessageContentProcessor processor = new MessageContentProcessor(context);
|
||||
MessageContentProcessor processor = MessageContentProcessor.forNormalContent(context);
|
||||
processor.process(result.getState(), result.getContent(), result.getException(), envelope.getTimestamp(), -1);
|
||||
return null;
|
||||
} catch (IOException | GroupChangeBusyException e) {
|
||||
|
|
|
@ -195,9 +195,19 @@ public final class MessageContentProcessor {
|
|||
private static final String TAG = Log.tag(MessageContentProcessor.class);
|
||||
|
||||
private final Context context;
|
||||
private final boolean processingEarlyContent;
|
||||
|
||||
public MessageContentProcessor(@NonNull Context context) {
|
||||
this.context = context;
|
||||
public static MessageContentProcessor forNormalContent(@NonNull Context context) {
|
||||
return new MessageContentProcessor(context, false);
|
||||
}
|
||||
|
||||
public static MessageContentProcessor forEarlyContent(@NonNull Context context) {
|
||||
return new MessageContentProcessor(context, true);
|
||||
}
|
||||
|
||||
private MessageContentProcessor(@NonNull Context context, boolean processingEarlyContent) {
|
||||
this.context = context;
|
||||
this.processingEarlyContent = processingEarlyContent;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -895,8 +905,10 @@ public final class MessageContentProcessor {
|
|||
|
||||
if (targetMessage == null) {
|
||||
warn(String.valueOf(content.getTimestamp()), "[handleReaction] Could not find matching message! Putting it in the early message cache. timestamp: " + reaction.getTargetSentTimestamp() + " author: " + targetAuthor.getId());
|
||||
ApplicationDependencies.getEarlyMessageCache().store(targetAuthor.getId(), reaction.getTargetSentTimestamp(), content);
|
||||
PushProcessEarlyMessagesJob.enqueue();
|
||||
if (!processingEarlyContent) {
|
||||
ApplicationDependencies.getEarlyMessageCache().store(targetAuthor.getId(), reaction.getTargetSentTimestamp(), content);
|
||||
PushProcessEarlyMessagesJob.enqueue();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -952,8 +964,10 @@ public final class MessageContentProcessor {
|
|||
return new MessageId(targetMessage.getId(), targetMessage.isMms());
|
||||
} else if (targetMessage == null) {
|
||||
warn(String.valueOf(content.getTimestamp()), "[handleRemoteDelete] Could not find matching message! timestamp: " + delete.getTargetSentTimestamp() + " author: " + senderRecipient.getId());
|
||||
ApplicationDependencies.getEarlyMessageCache().store(senderRecipient.getId(), delete.getTargetSentTimestamp(), content);
|
||||
PushProcessEarlyMessagesJob.enqueue();
|
||||
if (!processingEarlyContent) {
|
||||
ApplicationDependencies.getEarlyMessageCache().store(senderRecipient.getId(), delete.getTargetSentTimestamp(), content);
|
||||
PushProcessEarlyMessagesJob.enqueue();
|
||||
}
|
||||
return null;
|
||||
} else {
|
||||
warn(String.valueOf(content.getTimestamp()), String.format(Locale.ENGLISH, "[handleRemoteDelete] Invalid remote delete! deleteTime: %d, targetTime: %d, deleteAuthor: %s, targetAuthor: %s",
|
||||
|
@ -2131,10 +2145,12 @@ public final class MessageContentProcessor {
|
|||
|
||||
for (SyncMessageId id : unhandled) {
|
||||
warn(String.valueOf(content.getTimestamp()), "[handleViewedReceipt] Could not find matching message! timestamp: " + id.getTimetamp() + " author: " + senderRecipient.getId());
|
||||
ApplicationDependencies.getEarlyMessageCache().store(senderRecipient.getId(), id.getTimetamp(), content);
|
||||
if (!processingEarlyContent) {
|
||||
ApplicationDependencies.getEarlyMessageCache().store(senderRecipient.getId(), id.getTimetamp(), content);
|
||||
}
|
||||
}
|
||||
|
||||
if (unhandled.size() > 0) {
|
||||
if (unhandled.size() > 0 && !processingEarlyContent) {
|
||||
PushProcessEarlyMessagesJob.enqueue();
|
||||
}
|
||||
}
|
||||
|
@ -2184,10 +2200,12 @@ public final class MessageContentProcessor {
|
|||
|
||||
for (SyncMessageId id : unhandled) {
|
||||
warn(String.valueOf(content.getTimestamp()), "[handleReadReceipt] Could not find matching message! timestamp: " + id.getTimetamp() + " author: " + senderRecipient.getId());
|
||||
ApplicationDependencies.getEarlyMessageCache().store(senderRecipient.getId(), id.getTimetamp(), content);
|
||||
if (!processingEarlyContent) {
|
||||
ApplicationDependencies.getEarlyMessageCache().store(senderRecipient.getId(), id.getTimetamp(), content);
|
||||
}
|
||||
}
|
||||
|
||||
if (unhandled.size() > 0) {
|
||||
if (unhandled.size() > 0 && !processingEarlyContent) {
|
||||
PushProcessEarlyMessagesJob.enqueue();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ public final class EarlyMessageCache {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns a collection of all of the {@link ServiceMessageId}s referenced in the cache at the moment of inquiry.
|
||||
* Returns a collection of all of the {@link ServiceMessageId}s referenced in the cache at the moment of inquiry.
|
||||
* Caution: There is no guarantee that this list will be relevant for any amount of time afterwards.
|
||||
*/
|
||||
public synchronized @NonNull Collection<ServiceMessageId> getAllReferencedIds() {
|
||||
|
|
Loading…
Add table
Reference in a new issue