parent
884d8b7f72
commit
bb5dcb7131
@ -0,0 +1,69 @@
|
|||||||
|
package org.thoughtcrime.securesms.jobs;
|
||||||
|
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.ApplicationContext;
|
||||||
|
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil;
|
||||||
|
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||||
|
import org.thoughtcrime.securesms.crypto.PreKeyUtil;
|
||||||
|
import org.thoughtcrime.securesms.dependencies.InjectableType;
|
||||||
|
import org.thoughtcrime.securesms.jobs.requirements.MasterSecretRequirement;
|
||||||
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
|
import org.whispersystems.jobqueue.JobParameters;
|
||||||
|
import org.whispersystems.jobqueue.requirements.NetworkRequirement;
|
||||||
|
import org.whispersystems.libsignal.IdentityKeyPair;
|
||||||
|
import org.whispersystems.libsignal.state.SignedPreKeyRecord;
|
||||||
|
import org.whispersystems.signalservice.api.SignalServiceAccountManager;
|
||||||
|
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
public class RotateSignedPreKeyJob extends MasterSecretJob implements InjectableType {
|
||||||
|
|
||||||
|
private static final String TAG = RotateSignedPreKeyJob.class.getName();
|
||||||
|
|
||||||
|
@Inject transient SignalServiceAccountManager accountManager;
|
||||||
|
|
||||||
|
public RotateSignedPreKeyJob(Context context) {
|
||||||
|
super(context, JobParameters.newBuilder()
|
||||||
|
.withRequirement(new NetworkRequirement(context))
|
||||||
|
.withRequirement(new MasterSecretRequirement(context))
|
||||||
|
.withRetryCount(5)
|
||||||
|
.create());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAdded() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRun(MasterSecret masterSecret) throws Exception {
|
||||||
|
Log.w(TAG, "Rotating signed prekey...");
|
||||||
|
|
||||||
|
IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(context);
|
||||||
|
SignedPreKeyRecord signedPreKeyRecord = PreKeyUtil.generateSignedPreKey(context, identityKey, false);
|
||||||
|
|
||||||
|
accountManager.setSignedPreKey(signedPreKeyRecord);
|
||||||
|
|
||||||
|
PreKeyUtil.setActiveSignedPreKeyId(context, signedPreKeyRecord.getId());
|
||||||
|
TextSecurePreferences.setSignedPreKeyRegistered(context, true);
|
||||||
|
TextSecurePreferences.setSignedPreKeyFailureCount(context, 0);
|
||||||
|
|
||||||
|
ApplicationContext.getInstance(context)
|
||||||
|
.getJobManager()
|
||||||
|
.add(new CleanPreKeysJob(context));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onShouldRetryThrowable(Exception exception) {
|
||||||
|
return exception instanceof PushNetworkException;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCanceled() {
|
||||||
|
TextSecurePreferences.setSignedPreKeyFailureCount(context, TextSecurePreferences.getSignedPreKeyFailureCount(context) + 1);
|
||||||
|
}
|
||||||
|
}
|
@ -1,64 +1,39 @@
|
|||||||
package org.thoughtcrime.securesms.service;
|
package org.thoughtcrime.securesms.service;
|
||||||
|
|
||||||
|
|
||||||
import android.app.AlarmManager;
|
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.ApplicationContext;
|
import org.thoughtcrime.securesms.ApplicationContext;
|
||||||
import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob;
|
import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
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 long INTERVAL = TimeUnit.HOURS.toMillis(12);
|
||||||
private static final String BOOT_EVENT = "android.intent.action.BOOT_COMPLETED";
|
|
||||||
|
|
||||||
private static final long INTERVAL = 12 * 60 * 60 * 1000; // 12 hours.
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
protected long getNextScheduledExecutionTime(Context context) {
|
||||||
if (REFRESH_EVENT.equals(intent.getAction())) handleRefreshAction(context);
|
return TextSecurePreferences.getDirectoryRefreshTime(context);
|
||||||
else if (BOOT_EVENT.equals(intent.getAction())) handleBootEvent(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void handleBootEvent(Context context) {
|
|
||||||
schedule(context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleRefreshAction(Context context) {
|
@Override
|
||||||
schedule(context);
|
protected long onAlarm(Context context, long scheduledTime) {
|
||||||
}
|
if (scheduledTime != 0 && TextSecurePreferences.isPushRegistered(context)) {
|
||||||
|
ApplicationContext.getInstance(context)
|
||||||
public static void schedule(Context context) {
|
.getJobManager()
|
||||||
if (!TextSecurePreferences.isPushRegistered(context)) return;
|
.add(new DirectoryRefreshJob(context));
|
||||||
|
|
||||||
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);
|
long newTime = System.currentTimeMillis() + INTERVAL;
|
||||||
|
TextSecurePreferences.setDirectoryRefreshTime(context, newTime);
|
||||||
|
|
||||||
alarmManager.cancel(pendingIntent);
|
return newTime;
|
||||||
alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
|
|
||||||
|
|
||||||
TextSecurePreferences.setDirectoryRefreshTime(context, time);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void schedule(Context context) {
|
||||||
|
new DirectoryRefreshListener().onReceive(context, new Intent());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue