Do not process messages while change number is happening.

This commit is contained in:
Greyson Parrelli 2023-04-03 16:22:49 -04:00 committed by Alex Hart
parent bbdf54097e
commit 99bd8e82ca
6 changed files with 67 additions and 4 deletions

View file

@ -0,0 +1,27 @@
package org.thoughtcrime.securesms.jobmanager.impl
import android.app.job.JobInfo
import org.thoughtcrime.securesms.jobmanager.Constraint
import org.thoughtcrime.securesms.keyvalue.SignalStore
/**
* Constraint that, when added, means that a job cannot be performed while a change number operation is in progress.
*/
object ChangeNumberConstraint : Constraint {
const val KEY = "ChangeNumberConstraint"
override fun isMet(): Boolean {
return !SignalStore.misc().isChangeNumberLocked
}
override fun getFactoryKey(): String = KEY
override fun applyToJobInfo(jobInfoBuilder: JobInfo.Builder) = Unit
class Factory : Constraint.Factory<ChangeNumberConstraint> {
override fun create(): ChangeNumberConstraint {
return ChangeNumberConstraint
}
}
}

View file

@ -0,0 +1,25 @@
package org.thoughtcrime.securesms.jobmanager.impl
import org.thoughtcrime.securesms.jobmanager.ConstraintObserver
/**
* An observer for the [ChangeNumberConstraint]. This class expects to be told when a change happens,
* since the points at which it happens are triggered by application code.
*/
object ChangeNumberConstraintObserver : ConstraintObserver {
private const val REASON = "ChangeNumberConstraint"
private var notifier: ConstraintObserver.Notifier? = null
override fun register(notifier: ConstraintObserver.Notifier) {
this.notifier = notifier
}
/**
* Let the observer know that the change number state has changed.
*/
fun onChange() {
notifier?.onConstraintMet(REASON)
}
}

View file

@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobMigration; import org.thoughtcrime.securesms.jobmanager.JobMigration;
import org.thoughtcrime.securesms.jobmanager.impl.AutoDownloadEmojiConstraint; import org.thoughtcrime.securesms.jobmanager.impl.AutoDownloadEmojiConstraint;
import org.thoughtcrime.securesms.jobmanager.impl.CellServiceConstraintObserver; import org.thoughtcrime.securesms.jobmanager.impl.CellServiceConstraintObserver;
import org.thoughtcrime.securesms.jobmanager.impl.ChangeNumberConstraint;
import org.thoughtcrime.securesms.jobmanager.impl.ChargingConstraint; import org.thoughtcrime.securesms.jobmanager.impl.ChargingConstraint;
import org.thoughtcrime.securesms.jobmanager.impl.ChargingConstraintObserver; import org.thoughtcrime.securesms.jobmanager.impl.ChargingConstraintObserver;
import org.thoughtcrime.securesms.jobmanager.impl.DecryptionsDrainedConstraint; import org.thoughtcrime.securesms.jobmanager.impl.DecryptionsDrainedConstraint;
@ -277,13 +278,14 @@ public final class JobManagerFactories {
public static Map<String, Constraint.Factory> getConstraintFactories(@NonNull Application application) { public static Map<String, Constraint.Factory> getConstraintFactories(@NonNull Application application) {
return new HashMap<String, Constraint.Factory>() {{ return new HashMap<String, Constraint.Factory>() {{
put(AutoDownloadEmojiConstraint.KEY, new AutoDownloadEmojiConstraint.Factory(application)); put(AutoDownloadEmojiConstraint.KEY, new AutoDownloadEmojiConstraint.Factory(application));
put(ChangeNumberConstraint.KEY, new ChangeNumberConstraint.Factory());
put(ChargingConstraint.KEY, new ChargingConstraint.Factory()); put(ChargingConstraint.KEY, new ChargingConstraint.Factory());
put(DecryptionsDrainedConstraint.KEY, new DecryptionsDrainedConstraint.Factory());
put(NetworkConstraint.KEY, new NetworkConstraint.Factory(application)); put(NetworkConstraint.KEY, new NetworkConstraint.Factory(application));
put(NetworkOrCellServiceConstraint.KEY, new NetworkOrCellServiceConstraint.Factory(application)); put(NetworkOrCellServiceConstraint.KEY, new NetworkOrCellServiceConstraint.Factory(application));
put(NetworkOrCellServiceConstraint.LEGACY_KEY, new NetworkOrCellServiceConstraint.Factory(application)); put(NetworkOrCellServiceConstraint.LEGACY_KEY, new NetworkOrCellServiceConstraint.Factory(application));
put(SqlCipherMigrationConstraint.KEY, new SqlCipherMigrationConstraint.Factory(application));
put(DecryptionsDrainedConstraint.KEY, new DecryptionsDrainedConstraint.Factory());
put(NotInCallConstraint.KEY, new NotInCallConstraint.Factory()); put(NotInCallConstraint.KEY, new NotInCallConstraint.Factory());
put(SqlCipherMigrationConstraint.KEY, new SqlCipherMigrationConstraint.Factory(application));
}}; }};
} }

View file

@ -13,6 +13,7 @@ import org.thoughtcrime.securesms.groups.GroupChangeBusyException;
import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.jobmanager.JsonJobData; import org.thoughtcrime.securesms.jobmanager.JsonJobData;
import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.ChangeNumberConstraint;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.messages.MessageContentProcessor; import org.thoughtcrime.securesms.messages.MessageContentProcessor;
import org.thoughtcrime.securesms.messages.MessageContentProcessor.ExceptionMetadata; import org.thoughtcrime.securesms.messages.MessageContentProcessor.ExceptionMetadata;
@ -91,7 +92,8 @@ public final class PushProcessMessageJob extends BaseJob {
Context context = ApplicationDependencies.getApplication(); Context context = ApplicationDependencies.getApplication();
String queueName = QUEUE_PREFIX; String queueName = QUEUE_PREFIX;
Parameters.Builder builder = new Parameters.Builder() Parameters.Builder builder = new Parameters.Builder()
.setMaxAttempts(Parameters.UNLIMITED); .setMaxAttempts(Parameters.UNLIMITED)
.addConstraint(ChangeNumberConstraint.KEY);
if (content != null) { if (content != null) {
SignalServiceGroupV2 signalServiceGroupContext = GroupUtil.getGroupContextIfPresent(content); SignalServiceGroupV2 signalServiceGroupContext = GroupUtil.getGroupContextIfPresent(content);

View file

@ -7,6 +7,7 @@ import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.database.SignalDatabase.Companion.groups import org.thoughtcrime.securesms.database.SignalDatabase.Companion.groups
import org.thoughtcrime.securesms.groups.GroupChangeBusyException import org.thoughtcrime.securesms.groups.GroupChangeBusyException
import org.thoughtcrime.securesms.jobmanager.Job import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.impl.ChangeNumberConstraint
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
import org.thoughtcrime.securesms.messages.MessageContentProcessorV2 import org.thoughtcrime.securesms.messages.MessageContentProcessorV2
import org.thoughtcrime.securesms.messages.SignalServiceProtoUtil.groupId import org.thoughtcrime.securesms.messages.SignalServiceProtoUtil.groupId
@ -112,7 +113,10 @@ class PushProcessMessageJobV2 private constructor(
@WorkerThread @WorkerThread
private fun createParameters(content: Content, metadata: EnvelopeMetadata): Parameters { private fun createParameters(content: Content, metadata: EnvelopeMetadata): Parameters {
val queueName: String val queueName: String
val builder = Parameters.Builder().setMaxAttempts(Parameters.UNLIMITED) val builder = Parameters.Builder()
.setMaxAttempts(Parameters.UNLIMITED)
.addConstraint(ChangeNumberConstraint.KEY)
val groupContext = GroupUtil.getGroupContextIfPresent(content) val groupContext = GroupUtil.getGroupContextIfPresent(content)
val groupId = groupContext?.groupId val groupId = groupContext?.groupId

View file

@ -4,6 +4,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.database.model.databaseprotos.PendingChangeNumberMetadata; import org.thoughtcrime.securesms.database.model.databaseprotos.PendingChangeNumberMetadata;
import org.thoughtcrime.securesms.jobmanager.impl.ChangeNumberConstraintObserver;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -110,10 +111,12 @@ public final class MiscellaneousValues extends SignalStoreValues {
public void lockChangeNumber() { public void lockChangeNumber() {
putBoolean(CHANGE_NUMBER_LOCK, true); putBoolean(CHANGE_NUMBER_LOCK, true);
ChangeNumberConstraintObserver.INSTANCE.onChange();
} }
public void unlockChangeNumber() { public void unlockChangeNumber() {
putBoolean(CHANGE_NUMBER_LOCK, false); putBoolean(CHANGE_NUMBER_LOCK, false);
ChangeNumberConstraintObserver.INSTANCE.onChange();
} }
public @Nullable PendingChangeNumberMetadata getPendingChangeNumberMetadata() { public @Nullable PendingChangeNumberMetadata getPendingChangeNumberMetadata() {