Ensure notifications for new users won't be generated first fetch

This commit is contained in:
Moxie Marlinspike 2017-11-21 11:54:18 -08:00
parent 66e1be1aeb
commit f855e161d9
11 changed files with 36 additions and 19 deletions

View file

@ -140,7 +140,7 @@ public abstract class ContactSelectionActivity extends PassphraseRequiredActionB
protected Void doInBackground(Context... params) { protected Void doInBackground(Context... params) {
try { try {
DirectoryHelper.refreshDirectory(params[0], masterSecret); DirectoryHelper.refreshDirectory(params[0], masterSecret, true);
} catch (IOException e) { } catch (IOException e) {
Log.w(TAG, e); Log.w(TAG, e);
} }

View file

@ -223,7 +223,7 @@ public class DatabaseUpgradeActivity extends BaseActivity {
if (params[0] < CONTACTS_ACCOUNT_VERSION) { if (params[0] < CONTACTS_ACCOUNT_VERSION) {
ApplicationContext.getInstance(getApplicationContext()) ApplicationContext.getInstance(getApplicationContext())
.getJobManager() .getJobManager()
.add(new DirectoryRefreshJob(getApplicationContext())); .add(new DirectoryRefreshJob(getApplicationContext(), false));
} }
if (params[0] < MEDIA_DOWNLOAD_CONTROLS_VERSION) { if (params[0] < MEDIA_DOWNLOAD_CONTROLS_VERSION) {
@ -236,13 +236,13 @@ public class DatabaseUpgradeActivity extends BaseActivity {
.add(new RefreshAttributesJob(getApplicationContext())); .add(new RefreshAttributesJob(getApplicationContext()));
ApplicationContext.getInstance(getApplicationContext()) ApplicationContext.getInstance(getApplicationContext())
.getJobManager() .getJobManager()
.add(new DirectoryRefreshJob(getApplicationContext())); .add(new DirectoryRefreshJob(getApplicationContext(), false));
} }
if (params[0] < PROFILES) { if (params[0] < PROFILES) {
ApplicationContext.getInstance(getApplicationContext()) ApplicationContext.getInstance(getApplicationContext())
.getJobManager() .getJobManager()
.add(new DirectoryRefreshJob(getApplicationContext())); .add(new DirectoryRefreshJob(getApplicationContext(), false));
} }
if (params[0] < SCREENSHOTS) { if (params[0] < SCREENSHOTS) {

View file

@ -391,7 +391,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements Verif
keyboard.displaySuccess().addListener(new AssertedSuccessListener<Boolean>() { keyboard.displaySuccess().addListener(new AssertedSuccessListener<Boolean>() {
@Override @Override
public void onSuccess(Boolean result) { 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); DirectoryRefreshListener.schedule(RegistrationActivity.this);
RotateSignedPreKeyListener.schedule(RegistrationActivity.this); RotateSignedPreKeyListener.schedule(RegistrationActivity.this);

View file

@ -30,7 +30,7 @@ public class ContactsSyncAdapter extends AbstractThreadedSyncAdapter {
if (TextSecurePreferences.isPushRegistered(getContext())) { if (TextSecurePreferences.isPushRegistered(getContext())) {
try { try {
DirectoryHelper.refreshDirectory(getContext(), KeyCachingService.getMasterSecret(getContext())); DirectoryHelper.refreshDirectory(getContext(), KeyCachingService.getMasterSecret(getContext()), true);
} catch (IOException e) { } catch (IOException e) {
Log.w(TAG, e); Log.w(TAG, e);
} }

View file

@ -21,22 +21,25 @@ public class DirectoryRefreshJob extends ContextJob {
@Nullable private transient Recipient recipient; @Nullable private transient Recipient recipient;
@Nullable private transient MasterSecret masterSecret; @Nullable private transient MasterSecret masterSecret;
private transient boolean notifyOfNewUsers;
public DirectoryRefreshJob(@NonNull Context context) { public DirectoryRefreshJob(@NonNull Context context, boolean notifyOfNewUsers) {
this(context, null, null); this(context, null, null, notifyOfNewUsers);
} }
public DirectoryRefreshJob(@NonNull Context context, public DirectoryRefreshJob(@NonNull Context context,
@Nullable MasterSecret masterSecret, @Nullable MasterSecret masterSecret,
@Nullable Recipient recipient) @Nullable Recipient recipient,
boolean notifyOfNewUsers)
{ {
super(context, JobParameters.newBuilder() super(context, JobParameters.newBuilder()
.withGroupId(DirectoryRefreshJob.class.getSimpleName()) .withGroupId(DirectoryRefreshJob.class.getSimpleName())
.withRequirement(new NetworkRequirement(context)) .withRequirement(new NetworkRequirement(context))
.create()); .create());
this.recipient = recipient; this.recipient = recipient;
this.masterSecret = masterSecret; this.masterSecret = masterSecret;
this.notifyOfNewUsers = notifyOfNewUsers;
} }
@Override @Override
@ -51,7 +54,7 @@ public class DirectoryRefreshJob extends ContextJob {
try { try {
wakeLock.acquire(); wakeLock.acquire();
if (recipient == null) { if (recipient == null) {
DirectoryHelper.refreshDirectory(context, KeyCachingService.getMasterSecret(context)); DirectoryHelper.refreshDirectory(context, KeyCachingService.getMasterSecret(context), notifyOfNewUsers);
} else { } else {
DirectoryHelper.refreshDirectoryFor(context, masterSecret, recipient); DirectoryHelper.refreshDirectoryFor(context, masterSecret, recipient);
} }

View file

@ -75,7 +75,7 @@ public class PushMediaSendJob extends PushSendJob implements InjectableType {
Log.w(TAG, ifae); Log.w(TAG, ifae);
database.markAsPendingInsecureSmsFallback(messageId); database.markAsPendingInsecureSmsFallback(messageId);
notifyMediaMessageDeliveryFailed(context, messageId); notifyMediaMessageDeliveryFailed(context, messageId);
ApplicationContext.getInstance(context).getJobManager().add(new DirectoryRefreshJob(context)); ApplicationContext.getInstance(context).getJobManager().add(new DirectoryRefreshJob(context, false));
} catch (UntrustedIdentityException uie) { } catch (UntrustedIdentityException uie) {
Log.w(TAG, uie); Log.w(TAG, uie);
database.addMismatchedIdentity(messageId, Address.fromSerialized(uie.getE164Number()), uie.getIdentityKey()); database.addMismatchedIdentity(messageId, Address.fromSerialized(uie.getE164Number()), uie.getIdentityKey());

View file

@ -29,7 +29,7 @@ public abstract class PushReceivedJob extends ContextJob {
if (!isActiveNumber(recipient)) { if (!isActiveNumber(recipient)) {
DatabaseFactory.getRecipientDatabase(context).setRegistered(recipient, RecipientDatabase.RegisteredState.REGISTERED); 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()) { if (envelope.isReceipt()) {

View file

@ -66,7 +66,7 @@ public class PushTextSendJob extends PushSendJob implements InjectableType {
Log.w(TAG, e); Log.w(TAG, e);
database.markAsPendingInsecureSmsFallback(record.getId()); database.markAsPendingInsecureSmsFallback(record.getId());
MessageNotifier.notifyMessageDeliveryFailed(context, record.getRecipient(), record.getThreadId()); 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) { } catch (UntrustedIdentityException e) {
Log.w(TAG, e); Log.w(TAG, e);
database.addMismatchedIdentity(record.getId(), Address.fromSerialized(e.getE164Number()), e.getIdentityKey()); database.addMismatchedIdentity(record.getId(), Address.fromSerialized(e.getE164Number()), e.getIdentityKey());

View file

@ -24,7 +24,7 @@ public class DirectoryRefreshListener extends PersistentAlarmManagerListener {
if (scheduledTime != 0 && TextSecurePreferences.isPushRegistered(context)) { if (scheduledTime != 0 && TextSecurePreferences.isPushRegistered(context)) {
ApplicationContext.getInstance(context) ApplicationContext.getInstance(context)
.getJobManager() .getJobManager()
.add(new DirectoryRefreshJob(context)); .add(new DirectoryRefreshJob(context, true));
} }
long newTime = System.currentTimeMillis() + INTERVAL; long newTime = System.currentTimeMillis() + INTERVAL;

View file

@ -47,7 +47,7 @@ public class DirectoryHelper {
private static final String TAG = DirectoryHelper.class.getSimpleName(); 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 throws IOException
{ {
if (TextUtils.isEmpty(TextSecurePreferences.getLocalNumber(context))) return; if (TextUtils.isEmpty(TextSecurePreferences.getLocalNumber(context))) return;
@ -60,7 +60,7 @@ public class DirectoryHelper {
.add(new MultiDeviceContactUpdateJob(context)); .add(new MultiDeviceContactUpdateJob(context));
} }
notifyNewUsers(context, masterSecret, newlyActiveUsers); if (notifyOfNewUsers) notifyNewUsers(context, masterSecret, newlyActiveUsers);
} }
public static @NonNull List<Address> refreshDirectory(@NonNull Context context, @NonNull SignalServiceAccountManager accountManager) public static @NonNull List<Address> refreshDirectory(@NonNull Context context, @NonNull SignalServiceAccountManager accountManager)
@ -101,7 +101,12 @@ public class DirectoryHelper {
recipientDatabase.setRegistered(activeRecipients, inactiveRecipients); recipientDatabase.setRegistered(activeRecipients, inactiveRecipients);
updateContactsDatabase(context, Stream.of(activeRecipients).map(Recipient::getAddress).toList(), true); 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<>(); return new LinkedList<>();

View file

@ -116,6 +116,15 @@ public class TextSecurePreferences {
public static final String READ_RECEIPTS_PREF = "pref_read_receipts"; public static final String READ_RECEIPTS_PREF = "pref_read_receipts";
public static final String INCOGNITO_KEYBORAD_PREF = "pref_incognito_keyboard"; public static final String INCOGNITO_KEYBORAD_PREF = "pref_incognito_keyboard";
private static final String UNAUTHORIZED_RECEIVED = "pref_unauthorized_received"; 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) { public static void setUnauthorizedReceived(Context context, boolean value) {
setBooleanPreference(context, UNAUTHORIZED_RECEIVED, value); setBooleanPreference(context, UNAUTHORIZED_RECEIVED, value);