package org.thoughtcrime.securesms.jobs; import android.content.Context; import android.support.annotation.NonNull; 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.jobmanager.JobParameters; import org.thoughtcrime.securesms.jobmanager.SafeData; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.util.TextSecurePreferences; 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; import androidx.work.Data; public class RotateSignedPreKeyJob extends MasterSecretJob implements InjectableType { private static final String TAG = RotateSignedPreKeyJob.class.getName(); @Inject transient SignalServiceAccountManager accountManager; public RotateSignedPreKeyJob() { super(null, null); } public RotateSignedPreKeyJob(Context context) { super(context, JobParameters.newBuilder() .withNetworkRequirement() .withMasterSecretRequirement() .withRetryCount(5) .create()); } @Override protected void initialize(@NonNull SafeData data) { } @Override protected @NonNull Data serialize(@NonNull Data.Builder dataBuilder) { return dataBuilder.build(); } @Override public void onRun(MasterSecret masterSecret) throws Exception { Log.i(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); } }