Start increasing frequency of signed prekey rotation

// FREEBIE
This commit is contained in:
Moxie Marlinspike
2017-01-06 09:19:58 -08:00
parent 884d8b7f72
commit bb5dcb7131
19 changed files with 299 additions and 85 deletions

View File

@@ -1,64 +1,39 @@
package org.thoughtcrime.securesms.service;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import org.thoughtcrime.securesms.ApplicationContext;
import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
public class DirectoryRefreshListener extends BroadcastReceiver {
import java.util.concurrent.TimeUnit;
private static final String TAG = DirectoryRefreshListener.class.getSimpleName();
public class DirectoryRefreshListener extends PersistentAlarmManagerListener {
private static final String REFRESH_EVENT = "org.whispersystems.whisperpush.DIRECTORY_REFRESH";
private static final String BOOT_EVENT = "android.intent.action.BOOT_COMPLETED";
private static final long INTERVAL = 12 * 60 * 60 * 1000; // 12 hours.
private static final long INTERVAL = TimeUnit.HOURS.toMillis(12);
@Override
public void onReceive(Context context, Intent intent) {
if (REFRESH_EVENT.equals(intent.getAction())) handleRefreshAction(context);
else if (BOOT_EVENT.equals(intent.getAction())) handleBootEvent(context);
protected long getNextScheduledExecutionTime(Context context) {
return TextSecurePreferences.getDirectoryRefreshTime(context);
}
private void handleBootEvent(Context context) {
schedule(context);
}
@Override
protected long onAlarm(Context context, long scheduledTime) {
if (scheduledTime != 0 && TextSecurePreferences.isPushRegistered(context)) {
ApplicationContext.getInstance(context)
.getJobManager()
.add(new DirectoryRefreshJob(context));
}
private void handleRefreshAction(Context context) {
schedule(context);
long newTime = System.currentTimeMillis() + INTERVAL;
TextSecurePreferences.setDirectoryRefreshTime(context, newTime);
return newTime;
}
public static void schedule(Context context) {
if (!TextSecurePreferences.isPushRegistered(context)) return;
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(DirectoryRefreshListener.REFRESH_EVENT);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
long time = TextSecurePreferences.getDirectoryRefreshTime(context);
if (time <= System.currentTimeMillis()) {
if (time != 0) {
ApplicationContext.getInstance(context)
.getJobManager()
.add(new DirectoryRefreshJob(context));
}
time = System.currentTimeMillis() + INTERVAL;
}
Log.w(TAG, "Scheduling for: " + time);
alarmManager.cancel(pendingIntent);
alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
TextSecurePreferences.setDirectoryRefreshTime(context, time);
new DirectoryRefreshListener().onReceive(context, new Intent());
}
}

View File

@@ -0,0 +1,34 @@
package org.thoughtcrime.securesms.service;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public abstract class PersistentAlarmManagerListener extends BroadcastReceiver {
private static final String TAG = PersistentAlarmManagerListener.class.getSimpleName();
protected abstract long getNextScheduledExecutionTime(Context context);
protected abstract long onAlarm(Context context, long scheduledTime);
@Override
public void onReceive(Context context, Intent intent) {
long scheduledTime = getNextScheduledExecutionTime(context);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(context, getClass());
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
if (System.currentTimeMillis() >= scheduledTime) {
scheduledTime = onAlarm(context, scheduledTime);
}
Log.w(TAG, getClass() + " scheduling for: " + scheduledTime);
alarmManager.cancel(pendingIntent);
alarmManager.set(AlarmManager.RTC_WAKEUP, scheduledTime, pendingIntent);
}
}

View File

@@ -239,7 +239,7 @@ public class RegistrationService extends Service {
IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(this);
List<PreKeyRecord> records = PreKeyUtil.generatePreKeys(this);
PreKeyRecord lastResort = PreKeyUtil.generateLastResortKey(this);
SignedPreKeyRecord signedPreKey = PreKeyUtil.generateSignedPreKey(this, identityKey);
SignedPreKeyRecord signedPreKey = PreKeyUtil.generateSignedPreKey(this, identityKey, true);
accountManager.setPreKeys(identityKey.getPublicKey(),lastResort, signedPreKey, records);
setState(new RegistrationState(RegistrationState.STATE_GCM_REGISTERING, number));
@@ -261,6 +261,7 @@ public class RegistrationService extends Service {
redPhoneAccountManager.createAccount(verificationToken, new RedPhoneAccountAttributes(signalingKey, gcmRegistrationId));
DirectoryRefreshListener.schedule(this);
RotateSignedPreKeyListener.schedule(this);
}
private synchronized String waitForChallenge() throws AccountVerificationTimeoutException {

View File

@@ -0,0 +1,39 @@
package org.thoughtcrime.securesms.service;
import android.content.Context;
import android.content.Intent;
import org.thoughtcrime.securesms.ApplicationContext;
import org.thoughtcrime.securesms.jobs.RotateSignedPreKeyJob;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import java.util.concurrent.TimeUnit;
public class RotateSignedPreKeyListener extends PersistentAlarmManagerListener {
private static final long INTERVAL = TimeUnit.DAYS.toMillis(2);
@Override
protected long getNextScheduledExecutionTime(Context context) {
return TextSecurePreferences.getSignedPreKeyRotationTime(context);
}
@Override
protected long onAlarm(Context context, long scheduledTime) {
if (scheduledTime != 0 && TextSecurePreferences.isPushRegistered(context)) {
ApplicationContext.getInstance(context)
.getJobManager()
.add(new RotateSignedPreKeyJob(context));
}
long nextTime = System.currentTimeMillis() + INTERVAL;
TextSecurePreferences.setSignedPreKeyRotationTime(context, nextTime);
return nextTime;
}
public static void schedule(Context context) {
new RotateSignedPreKeyListener().onReceive(context, new Intent());
}
}