From f855e161d9bcf0dc68ac6e4c97e10c07e1f019c7 Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Tue, 21 Nov 2017 11:54:18 -0800 Subject: [PATCH] Ensure notifications for new users won't be generated first fetch --- .../securesms/ContactSelectionActivity.java | 2 +- .../securesms/DatabaseUpgradeActivity.java | 6 +++--- .../securesms/RegistrationActivity.java | 2 +- .../securesms/contacts/ContactsSyncAdapter.java | 2 +- .../securesms/jobs/DirectoryRefreshJob.java | 15 +++++++++------ .../securesms/jobs/PushMediaSendJob.java | 2 +- .../securesms/jobs/PushReceivedJob.java | 2 +- .../securesms/jobs/PushTextSendJob.java | 2 +- .../service/DirectoryRefreshListener.java | 2 +- .../securesms/util/DirectoryHelper.java | 11 ++++++++--- .../securesms/util/TextSecurePreferences.java | 9 +++++++++ 11 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ContactSelectionActivity.java b/src/org/thoughtcrime/securesms/ContactSelectionActivity.java index 2dde655b4..e50b8d491 100644 --- a/src/org/thoughtcrime/securesms/ContactSelectionActivity.java +++ b/src/org/thoughtcrime/securesms/ContactSelectionActivity.java @@ -140,7 +140,7 @@ public abstract class ContactSelectionActivity extends PassphraseRequiredActionB protected Void doInBackground(Context... params) { try { - DirectoryHelper.refreshDirectory(params[0], masterSecret); + DirectoryHelper.refreshDirectory(params[0], masterSecret, true); } catch (IOException e) { Log.w(TAG, e); } diff --git a/src/org/thoughtcrime/securesms/DatabaseUpgradeActivity.java b/src/org/thoughtcrime/securesms/DatabaseUpgradeActivity.java index 4535a8ec7..318cab510 100644 --- a/src/org/thoughtcrime/securesms/DatabaseUpgradeActivity.java +++ b/src/org/thoughtcrime/securesms/DatabaseUpgradeActivity.java @@ -223,7 +223,7 @@ public class DatabaseUpgradeActivity extends BaseActivity { if (params[0] < CONTACTS_ACCOUNT_VERSION) { ApplicationContext.getInstance(getApplicationContext()) .getJobManager() - .add(new DirectoryRefreshJob(getApplicationContext())); + .add(new DirectoryRefreshJob(getApplicationContext(), false)); } if (params[0] < MEDIA_DOWNLOAD_CONTROLS_VERSION) { @@ -236,13 +236,13 @@ public class DatabaseUpgradeActivity extends BaseActivity { .add(new RefreshAttributesJob(getApplicationContext())); ApplicationContext.getInstance(getApplicationContext()) .getJobManager() - .add(new DirectoryRefreshJob(getApplicationContext())); + .add(new DirectoryRefreshJob(getApplicationContext(), false)); } if (params[0] < PROFILES) { ApplicationContext.getInstance(getApplicationContext()) .getJobManager() - .add(new DirectoryRefreshJob(getApplicationContext())); + .add(new DirectoryRefreshJob(getApplicationContext(), false)); } if (params[0] < SCREENSHOTS) { diff --git a/src/org/thoughtcrime/securesms/RegistrationActivity.java b/src/org/thoughtcrime/securesms/RegistrationActivity.java index d25f3324f..a064b511b 100644 --- a/src/org/thoughtcrime/securesms/RegistrationActivity.java +++ b/src/org/thoughtcrime/securesms/RegistrationActivity.java @@ -391,7 +391,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements Verif keyboard.displaySuccess().addListener(new AssertedSuccessListener() { @Override public void onSuccess(Boolean result) { - ApplicationContext.getInstance(RegistrationActivity.this).getJobManager().add(new DirectoryRefreshJob(RegistrationActivity.this)); + ApplicationContext.getInstance(RegistrationActivity.this).getJobManager().add(new DirectoryRefreshJob(RegistrationActivity.this, false)); DirectoryRefreshListener.schedule(RegistrationActivity.this); RotateSignedPreKeyListener.schedule(RegistrationActivity.this); diff --git a/src/org/thoughtcrime/securesms/contacts/ContactsSyncAdapter.java b/src/org/thoughtcrime/securesms/contacts/ContactsSyncAdapter.java index e2e798a8c..25f8f215a 100644 --- a/src/org/thoughtcrime/securesms/contacts/ContactsSyncAdapter.java +++ b/src/org/thoughtcrime/securesms/contacts/ContactsSyncAdapter.java @@ -30,7 +30,7 @@ public class ContactsSyncAdapter extends AbstractThreadedSyncAdapter { if (TextSecurePreferences.isPushRegistered(getContext())) { try { - DirectoryHelper.refreshDirectory(getContext(), KeyCachingService.getMasterSecret(getContext())); + DirectoryHelper.refreshDirectory(getContext(), KeyCachingService.getMasterSecret(getContext()), true); } catch (IOException e) { Log.w(TAG, e); } diff --git a/src/org/thoughtcrime/securesms/jobs/DirectoryRefreshJob.java b/src/org/thoughtcrime/securesms/jobs/DirectoryRefreshJob.java index 3c2221b7e..e1a9fffa3 100644 --- a/src/org/thoughtcrime/securesms/jobs/DirectoryRefreshJob.java +++ b/src/org/thoughtcrime/securesms/jobs/DirectoryRefreshJob.java @@ -21,22 +21,25 @@ public class DirectoryRefreshJob extends ContextJob { @Nullable private transient Recipient recipient; @Nullable private transient MasterSecret masterSecret; + private transient boolean notifyOfNewUsers; - public DirectoryRefreshJob(@NonNull Context context) { - this(context, null, null); + public DirectoryRefreshJob(@NonNull Context context, boolean notifyOfNewUsers) { + this(context, null, null, notifyOfNewUsers); } public DirectoryRefreshJob(@NonNull Context context, @Nullable MasterSecret masterSecret, - @Nullable Recipient recipient) + @Nullable Recipient recipient, + boolean notifyOfNewUsers) { super(context, JobParameters.newBuilder() .withGroupId(DirectoryRefreshJob.class.getSimpleName()) .withRequirement(new NetworkRequirement(context)) .create()); - this.recipient = recipient; - this.masterSecret = masterSecret; + this.recipient = recipient; + this.masterSecret = masterSecret; + this.notifyOfNewUsers = notifyOfNewUsers; } @Override @@ -51,7 +54,7 @@ public class DirectoryRefreshJob extends ContextJob { try { wakeLock.acquire(); if (recipient == null) { - DirectoryHelper.refreshDirectory(context, KeyCachingService.getMasterSecret(context)); + DirectoryHelper.refreshDirectory(context, KeyCachingService.getMasterSecret(context), notifyOfNewUsers); } else { DirectoryHelper.refreshDirectoryFor(context, masterSecret, recipient); } diff --git a/src/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java b/src/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java index ddd75dab0..1eb3e1cb8 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java @@ -75,7 +75,7 @@ public class PushMediaSendJob extends PushSendJob implements InjectableType { Log.w(TAG, ifae); database.markAsPendingInsecureSmsFallback(messageId); notifyMediaMessageDeliveryFailed(context, messageId); - ApplicationContext.getInstance(context).getJobManager().add(new DirectoryRefreshJob(context)); + ApplicationContext.getInstance(context).getJobManager().add(new DirectoryRefreshJob(context, false)); } catch (UntrustedIdentityException uie) { Log.w(TAG, uie); database.addMismatchedIdentity(messageId, Address.fromSerialized(uie.getE164Number()), uie.getIdentityKey()); diff --git a/src/org/thoughtcrime/securesms/jobs/PushReceivedJob.java b/src/org/thoughtcrime/securesms/jobs/PushReceivedJob.java index 918b938b8..d25f4c4e0 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushReceivedJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushReceivedJob.java @@ -29,7 +29,7 @@ public abstract class PushReceivedJob extends ContextJob { if (!isActiveNumber(recipient)) { DatabaseFactory.getRecipientDatabase(context).setRegistered(recipient, RecipientDatabase.RegisteredState.REGISTERED); - ApplicationContext.getInstance(context).getJobManager().add(new DirectoryRefreshJob(context, KeyCachingService.getMasterSecret(context), recipient)); + ApplicationContext.getInstance(context).getJobManager().add(new DirectoryRefreshJob(context, KeyCachingService.getMasterSecret(context), recipient, false)); } if (envelope.isReceipt()) { diff --git a/src/org/thoughtcrime/securesms/jobs/PushTextSendJob.java b/src/org/thoughtcrime/securesms/jobs/PushTextSendJob.java index 011d48951..be5936a62 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushTextSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushTextSendJob.java @@ -66,7 +66,7 @@ public class PushTextSendJob extends PushSendJob implements InjectableType { Log.w(TAG, e); database.markAsPendingInsecureSmsFallback(record.getId()); MessageNotifier.notifyMessageDeliveryFailed(context, record.getRecipient(), record.getThreadId()); - ApplicationContext.getInstance(context).getJobManager().add(new DirectoryRefreshJob(context)); + ApplicationContext.getInstance(context).getJobManager().add(new DirectoryRefreshJob(context, false)); } catch (UntrustedIdentityException e) { Log.w(TAG, e); database.addMismatchedIdentity(record.getId(), Address.fromSerialized(e.getE164Number()), e.getIdentityKey()); diff --git a/src/org/thoughtcrime/securesms/service/DirectoryRefreshListener.java b/src/org/thoughtcrime/securesms/service/DirectoryRefreshListener.java index 53300b07a..d31aff40d 100644 --- a/src/org/thoughtcrime/securesms/service/DirectoryRefreshListener.java +++ b/src/org/thoughtcrime/securesms/service/DirectoryRefreshListener.java @@ -24,7 +24,7 @@ public class DirectoryRefreshListener extends PersistentAlarmManagerListener { if (scheduledTime != 0 && TextSecurePreferences.isPushRegistered(context)) { ApplicationContext.getInstance(context) .getJobManager() - .add(new DirectoryRefreshJob(context)); + .add(new DirectoryRefreshJob(context, true)); } long newTime = System.currentTimeMillis() + INTERVAL; diff --git a/src/org/thoughtcrime/securesms/util/DirectoryHelper.java b/src/org/thoughtcrime/securesms/util/DirectoryHelper.java index c8ec529f1..856602a73 100644 --- a/src/org/thoughtcrime/securesms/util/DirectoryHelper.java +++ b/src/org/thoughtcrime/securesms/util/DirectoryHelper.java @@ -47,7 +47,7 @@ public class DirectoryHelper { private static final String TAG = DirectoryHelper.class.getSimpleName(); - public static void refreshDirectory(@NonNull Context context, @Nullable MasterSecret masterSecret) + public static void refreshDirectory(@NonNull Context context, @Nullable MasterSecret masterSecret, boolean notifyOfNewUsers) throws IOException { if (TextUtils.isEmpty(TextSecurePreferences.getLocalNumber(context))) return; @@ -60,7 +60,7 @@ public class DirectoryHelper { .add(new MultiDeviceContactUpdateJob(context)); } - notifyNewUsers(context, masterSecret, newlyActiveUsers); + if (notifyOfNewUsers) notifyNewUsers(context, masterSecret, newlyActiveUsers); } public static @NonNull List
refreshDirectory(@NonNull Context context, @NonNull SignalServiceAccountManager accountManager) @@ -101,7 +101,12 @@ public class DirectoryHelper { recipientDatabase.setRegistered(activeRecipients, inactiveRecipients); updateContactsDatabase(context, Stream.of(activeRecipients).map(Recipient::getAddress).toList(), true); - return newlyActiveAddresses; + if (TextSecurePreferences.hasSuccessfullyRetrievedDirectory(context)) { + return newlyActiveAddresses; + } else { + TextSecurePreferences.setHasSuccessfullyRetrievedDirectory(context, true); + return new LinkedList<>(); + } } return new LinkedList<>(); diff --git a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java index e7fc6307e..389e540d0 100644 --- a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java +++ b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java @@ -116,6 +116,15 @@ public class TextSecurePreferences { public static final String READ_RECEIPTS_PREF = "pref_read_receipts"; public static final String INCOGNITO_KEYBORAD_PREF = "pref_incognito_keyboard"; private static final String UNAUTHORIZED_RECEIVED = "pref_unauthorized_received"; + private static final String SUCCESSFUL_DIRECTORY_PREF = "pref_successful_directory"; + + public static void setHasSuccessfullyRetrievedDirectory(Context context, boolean value) { + setBooleanPreference(context, SUCCESSFUL_DIRECTORY_PREF, value); + } + + public static boolean hasSuccessfullyRetrievedDirectory(Context context) { + return getBooleanPreference(context, SUCCESSFUL_DIRECTORY_PREF, false); + } public static void setUnauthorizedReceived(Context context, boolean value) { setBooleanPreference(context, UNAUTHORIZED_RECEIVED, value);