From 24d36158ae2be1514b52f3af600ccbf57b98ba15 Mon Sep 17 00:00:00 2001 From: Anton Chekulaev Date: Wed, 16 Dec 2020 13:36:20 +1100 Subject: [PATCH] Job cleanup. --- .../database/helpers/SQLCipherOpenHelper.java | 7 ++ .../SignalCommunicationModule.java | 4 - .../migration/WorkManagerFactoryMappings.java | 83 ---------------- .../securesms/jobs/AttachmentDownloadJob.java | 34 ++++--- .../securesms/jobs/JobManagerFactories.java | 2 - .../securesms/jobs/RefreshAttributesJob.java | 83 ---------------- .../securesms/jobs/RotateProfileKeyJob.java | 96 ------------------- 7 files changed, 30 insertions(+), 279 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/jobmanager/migration/WorkManagerFactoryMappings.java delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/jobs/RotateProfileKeyJob.java diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java index 1fa0ccedd2..d343c2a4c1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java @@ -56,6 +56,7 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper { //TODO Merge all "refactor" migrations to one before pushing to the main repo. private static final int lokiV19_REFACTOR0 = 40; private static final int lokiV19_REFACTOR1 = 41; + private static final int lokiV19_REFACTOR2 = 42; // Loki - onUpgrade(...) must be updated to use Loki version numbers if Signal makes any database changes private static final int DATABASE_VERSION = lokiV19_REFACTOR1; @@ -223,6 +224,12 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper { db.execSQL("DROP TABLE identities"); deleteJobRecords(db, "RetrieveProfileJob"); } + if (oldVersion < lokiV19_REFACTOR2) { + deleteJobRecords(db, + "RefreshAttributesJob", + "RotateProfileKeyJob" + ); + } db.setTransactionSuccessful(); } finally { diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/SignalCommunicationModule.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/SignalCommunicationModule.java index 127b0f390a..9f6f51044b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/SignalCommunicationModule.java +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/SignalCommunicationModule.java @@ -22,12 +22,10 @@ import org.thoughtcrime.securesms.jobs.PushGroupUpdateJob; import org.thoughtcrime.securesms.jobs.PushMediaSendJob; import org.thoughtcrime.securesms.jobs.PushNotificationReceiveJob; import org.thoughtcrime.securesms.jobs.PushTextSendJob; -import org.thoughtcrime.securesms.jobs.RefreshAttributesJob; import org.thoughtcrime.securesms.jobs.RefreshUnidentifiedDeliveryAbilityJob; import org.thoughtcrime.securesms.jobs.RequestGroupInfoJob; import org.thoughtcrime.securesms.jobs.RetrieveProfileAvatarJob; import org.thoughtcrime.securesms.jobs.RotateCertificateJob; -import org.thoughtcrime.securesms.jobs.RotateProfileKeyJob; import org.thoughtcrime.securesms.jobs.SendDeliveryReceiptJob; import org.thoughtcrime.securesms.jobs.SendReadReceiptJob; import org.thoughtcrime.securesms.jobs.StickerDownloadJob; @@ -55,7 +53,6 @@ import network.loki.messenger.BuildConfig; AttachmentDownloadJob.class, IncomingMessageObserver.class, PushNotificationReceiveJob.class, - RefreshAttributesJob.class, RequestGroupInfoJob.class, PushGroupUpdateJob.class, AvatarDownloadJob.class, @@ -64,7 +61,6 @@ import network.loki.messenger.BuildConfig; AppProtectionPreferenceFragment.class, RotateCertificateJob.class, SendDeliveryReceiptJob.class, - RotateProfileKeyJob.class, RefreshUnidentifiedDeliveryAbilityJob.class, TypingSendJob.class, AttachmentUploadJob.class, diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/migration/WorkManagerFactoryMappings.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/migration/WorkManagerFactoryMappings.java deleted file mode 100644 index 6594b4210b..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/migration/WorkManagerFactoryMappings.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.thoughtcrime.securesms.jobmanager.migration; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.thoughtcrime.securesms.jobs.AttachmentDownloadJob; -import org.thoughtcrime.securesms.jobs.AttachmentUploadJob; -import org.thoughtcrime.securesms.jobs.AvatarDownloadJob; -import org.thoughtcrime.securesms.jobs.LocalBackupJob; -import org.thoughtcrime.securesms.jobs.MmsDownloadJob; -import org.thoughtcrime.securesms.jobs.MmsReceiveJob; -import org.thoughtcrime.securesms.jobs.MmsSendJob; -import org.thoughtcrime.securesms.jobs.PushContentReceiveJob; -import org.thoughtcrime.securesms.jobs.PushDecryptJob; -import org.thoughtcrime.securesms.jobs.PushGroupSendJob; -import org.thoughtcrime.securesms.jobs.PushGroupUpdateJob; -import org.thoughtcrime.securesms.jobs.PushMediaSendJob; -import org.thoughtcrime.securesms.jobs.PushNotificationReceiveJob; -import org.thoughtcrime.securesms.jobs.PushTextSendJob; -import org.thoughtcrime.securesms.jobs.RefreshAttributesJob; -import org.thoughtcrime.securesms.jobs.RefreshUnidentifiedDeliveryAbilityJob; -import org.thoughtcrime.securesms.jobs.RequestGroupInfoJob; -import org.thoughtcrime.securesms.jobs.RetrieveProfileAvatarJob; -import org.thoughtcrime.securesms.jobs.RotateCertificateJob; -import org.thoughtcrime.securesms.jobs.RotateProfileKeyJob; -import org.thoughtcrime.securesms.jobs.SendDeliveryReceiptJob; -import org.thoughtcrime.securesms.jobs.SendReadReceiptJob; -import org.thoughtcrime.securesms.jobs.SmsReceiveJob; -import org.thoughtcrime.securesms.jobs.SmsSendJob; -import org.thoughtcrime.securesms.jobs.SmsSentJob; -import org.thoughtcrime.securesms.jobs.TrimThreadJob; -import org.thoughtcrime.securesms.jobs.TypingSendJob; -import org.thoughtcrime.securesms.jobs.UpdateApkJob; -import org.thoughtcrime.securesms.loki.api.PrepareAttachmentAudioExtrasJob; -import org.thoughtcrime.securesms.loki.api.ResetThreadSessionJob; -import org.thoughtcrime.securesms.loki.protocol.ClosedGroupUpdateMessageSendJob; -import org.thoughtcrime.securesms.loki.protocol.NullMessageSendJob; - -import java.util.HashMap; -import java.util.Map; - -//TODO AC: Looks like we don't use it anymore. Make sure it's abandoned and delete. -public class WorkManagerFactoryMappings { - - private static final Map FACTORY_MAP = new HashMap() {{ - put(AttachmentDownloadJob.class.getName(), AttachmentDownloadJob.KEY); - put(AttachmentUploadJob.class.getName(), AttachmentUploadJob.KEY); - put(AvatarDownloadJob.class.getName(), AvatarDownloadJob.KEY); - put(ClosedGroupUpdateMessageSendJob.class.getName(), ClosedGroupUpdateMessageSendJob.KEY); - put(LocalBackupJob.class.getName(), LocalBackupJob.KEY); - put(MmsDownloadJob.class.getName(), MmsDownloadJob.KEY); - put(MmsReceiveJob.class.getName(), MmsReceiveJob.KEY); - put(MmsSendJob.class.getName(), MmsSendJob.KEY); - put(NullMessageSendJob.class.getName(), NullMessageSendJob.KEY); - put(PushContentReceiveJob.class.getName(), PushContentReceiveJob.KEY); - put(PushDecryptJob.class.getName(), PushDecryptJob.KEY); - put(PushGroupSendJob.class.getName(), PushGroupSendJob.KEY); - put(PushGroupUpdateJob.class.getName(), PushGroupUpdateJob.KEY); - put(PushMediaSendJob.class.getName(), PushMediaSendJob.KEY); - put(PushNotificationReceiveJob.class.getName(), PushNotificationReceiveJob.KEY); - put(PushTextSendJob.class.getName(), PushTextSendJob.KEY); - put(RefreshAttributesJob.class.getName(), RefreshAttributesJob.KEY); - put(RefreshUnidentifiedDeliveryAbilityJob.class.getName(), RefreshUnidentifiedDeliveryAbilityJob.KEY); - put(RequestGroupInfoJob.class.getName(), RequestGroupInfoJob.KEY); - put(RetrieveProfileAvatarJob.class.getName(), RetrieveProfileAvatarJob.KEY); - put(RotateCertificateJob.class.getName(), RotateCertificateJob.KEY); - put(RotateProfileKeyJob.class.getName(), RotateProfileKeyJob.KEY); - put(SendDeliveryReceiptJob.class.getName(), SendDeliveryReceiptJob.KEY); - put(SendReadReceiptJob.class.getName(), SendReadReceiptJob.KEY); - put(SmsReceiveJob.class.getName(), SmsReceiveJob.KEY); - put(SmsSendJob.class.getName(), SmsSendJob.KEY); - put(SmsSentJob.class.getName(), SmsSentJob.KEY); - put(TrimThreadJob.class.getName(), TrimThreadJob.KEY); - put(TypingSendJob.class.getName(), TypingSendJob.KEY); - put(UpdateApkJob.class.getName(), UpdateApkJob.KEY); - put(PrepareAttachmentAudioExtrasJob.class.getName(), PrepareAttachmentAudioExtrasJob.KEY); - put(ResetThreadSessionJob.class.getName(), ResetThreadSessionJob.KEY); - }}; - - public static @Nullable String getFactoryKey(@NonNull String workManagerClass) { - return FACTORY_MAP.get(workManagerClass); - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java index c563f42cf9..63eecd7796 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java @@ -6,6 +6,13 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import org.greenrobot.eventbus.EventBus; +import org.session.libsignal.libsignal.InvalidMessageException; +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.crypto.AttachmentCipherInputStream; +import org.session.libsignal.service.api.messages.SignalServiceAttachmentPointer; +import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException; +import org.session.libsignal.service.api.push.exceptions.PushNetworkException; +import org.session.libsignal.service.loki.utilities.DownloadUtilities; import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.attachments.AttachmentId; @@ -23,19 +30,12 @@ import org.thoughtcrime.securesms.util.AttachmentUtil; import org.thoughtcrime.securesms.util.Base64; import org.thoughtcrime.securesms.util.Hex; import org.thoughtcrime.securesms.util.Util; -import org.session.libsignal.libsignal.InvalidMessageException; -import org.session.libsignal.libsignal.util.guava.Optional; -import org.session.libsignal.service.api.SignalServiceMessageReceiver; -import org.session.libsignal.service.api.messages.SignalServiceAttachmentPointer; -import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException; -import org.session.libsignal.service.api.push.exceptions.PushNetworkException; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import javax.inject.Inject; - public class AttachmentDownloadJob extends BaseJob implements InjectableType { public static final String KEY = "AttachmentDownloadJob"; @@ -48,8 +48,6 @@ public class AttachmentDownloadJob extends BaseJob implements InjectableType { private static final String KEY_PAR_UNIQUE_ID = "part_unique_id"; private static final String KEY_MANUAL = "part_manual"; - @Inject SignalServiceMessageReceiver messageReceiver; - private long messageId; private long partRowId; private long partUniqueId; @@ -166,7 +164,21 @@ public class AttachmentDownloadJob extends BaseJob implements InjectableType { attachmentFile = createTempFile(); SignalServiceAttachmentPointer pointer = createAttachmentPointer(attachment); - InputStream stream = messageReceiver.retrieveAttachment(pointer, attachmentFile, MAX_ATTACHMENT_SIZE, (total, progress) -> EventBus.getDefault().postSticky(new PartProgressEvent(attachment, total, progress))); +// InputStream stream = messageReceiver.retrieveAttachment(pointer, attachmentFile, MAX_ATTACHMENT_SIZE, (total, progress) -> EventBus.getDefault().postSticky(new PartProgressEvent(attachment, total, progress))); + + if (pointer.getUrl().isEmpty()) throw new InvalidMessageException("Missing attachment URL."); + + DownloadUtilities.downloadFile(attachmentFile, pointer.getUrl(), MAX_ATTACHMENT_SIZE, (total, progress) -> { + EventBus.getDefault().postSticky(new PartProgressEvent(attachment, total, progress)); + }); + + final InputStream stream; + // Assume we're retrieving an attachment for an open group server if the digest is not set + if (!pointer.getDigest().isPresent()) { + stream = new FileInputStream(attachmentFile); + } else { + stream = AttachmentCipherInputStream.createForAttachment(attachmentFile, pointer.getSize().or(0), pointer.getKey(), pointer.getDigest().get()); + } database.insertAttachmentsForPlaceholder(messageId, attachmentId, stream); } catch (InvalidPartException | NonSuccessfulResponseCodeException | InvalidMessageException | MmsException e) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java index ae90710cb1..3cc50b068d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java @@ -44,12 +44,10 @@ public final class JobManagerFactories { put(PushMediaSendJob.KEY, new PushMediaSendJob.Factory()); put(PushNotificationReceiveJob.KEY, new PushNotificationReceiveJob.Factory()); put(PushTextSendJob.KEY, new PushTextSendJob.Factory()); - put(RefreshAttributesJob.KEY, new RefreshAttributesJob.Factory()); put(RefreshUnidentifiedDeliveryAbilityJob.KEY, new RefreshUnidentifiedDeliveryAbilityJob.Factory()); put(RequestGroupInfoJob.KEY, new RequestGroupInfoJob.Factory()); put(RetrieveProfileAvatarJob.KEY, new RetrieveProfileAvatarJob.Factory(application)); put(RotateCertificateJob.KEY, new RotateCertificateJob.Factory()); - put(RotateProfileKeyJob.KEY, new RotateProfileKeyJob.Factory()); put(SendDeliveryReceiptJob.KEY, new SendDeliveryReceiptJob.Factory()); put(SendReadReceiptJob.KEY, new SendReadReceiptJob.Factory()); put(SmsReceiveJob.KEY, new SmsReceiveJob.Factory()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java deleted file mode 100644 index ecafc01fff..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.thoughtcrime.securesms.jobs; - -import androidx.annotation.NonNull; - -import org.thoughtcrime.securesms.ApplicationContext; -import org.thoughtcrime.securesms.jobmanager.Data; -import org.thoughtcrime.securesms.jobmanager.Job; -import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; -import org.thoughtcrime.securesms.logging.Log; - -import org.thoughtcrime.securesms.dependencies.InjectableType; - -import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; -import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.session.libsignal.service.api.SignalServiceAccountManager; -import org.session.libsignal.service.api.push.exceptions.NetworkFailureException; - -import java.io.IOException; - -import javax.inject.Inject; - -//TODO AC: Delete -public class RefreshAttributesJob extends BaseJob implements InjectableType { - - public static final String KEY = "RefreshAttributesJob"; - - private static final String TAG = RefreshAttributesJob.class.getSimpleName(); - - @Inject SignalServiceAccountManager signalAccountManager; - - public RefreshAttributesJob() { - this(new Job.Parameters.Builder() - .addConstraint(NetworkConstraint.KEY) - .setQueue("RefreshAttributesJob") - .build()); - } - - private RefreshAttributesJob(@NonNull Job.Parameters parameters) { - super(parameters); - } - - @Override - public @NonNull Data serialize() { - return Data.EMPTY; - } - - @Override - public @NonNull String getFactoryKey() { - return KEY; - } - - @Override - public void onRun() throws IOException { - int registrationId = TextSecurePreferences.getLocalRegistrationId(context); - boolean fetchesMessages = TextSecurePreferences.isFcmDisabled(context); - byte[] unidentifiedAccessKey = UnidentifiedAccessUtil.getSelfUnidentifiedAccessKey(context); - boolean universalUnidentifiedAccess = TextSecurePreferences.isUniversalUnidentifiedAccess(context); - - signalAccountManager.setAccountAttributes(null, registrationId, fetchesMessages, "", - unidentifiedAccessKey, universalUnidentifiedAccess); - - ApplicationContext.getInstance(context) - .getJobManager() - .add(new RefreshUnidentifiedDeliveryAbilityJob()); - } - - @Override - public boolean onShouldRetry(@NonNull Exception e) { - return e instanceof NetworkFailureException; - } - - @Override - public void onCanceled() { - Log.w(TAG, "Failed to update account attributes!"); - } - - public static class Factory implements Job.Factory { - @Override - public @NonNull RefreshAttributesJob create(@NonNull Parameters parameters, @NonNull org.thoughtcrime.securesms.jobmanager.Data data) { - return new RefreshAttributesJob(parameters); - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateProfileKeyJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateProfileKeyJob.java deleted file mode 100644 index 75d1cc552e..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateProfileKeyJob.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.thoughtcrime.securesms.jobs; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.thoughtcrime.securesms.ApplicationContext; -import org.thoughtcrime.securesms.crypto.ProfileKeyUtil; -import org.thoughtcrime.securesms.database.Address; -import org.thoughtcrime.securesms.dependencies.InjectableType; -import org.thoughtcrime.securesms.jobmanager.Data; -import org.thoughtcrime.securesms.jobmanager.Job; -import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; -import org.thoughtcrime.securesms.profiles.AvatarHelper; -import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.session.libsignal.service.api.SignalServiceAccountManager; -import org.session.libsignal.service.api.push.exceptions.PushNetworkException; -import org.session.libsignal.service.api.util.StreamDetails; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - -import javax.inject.Inject; - -public class RotateProfileKeyJob extends BaseJob implements InjectableType { - - public static String KEY = "RotateProfileKeyJob"; - - @Inject SignalServiceAccountManager accountManager; - - public RotateProfileKeyJob() { - this(new Job.Parameters.Builder() - .setQueue("__ROTATE_PROFILE_KEY__") - .addConstraint(NetworkConstraint.KEY) - .setMaxAttempts(25) - .setMaxInstances(1) - .build()); - } - - private RotateProfileKeyJob(@NonNull Job.Parameters parameters) { - super(parameters); - } - - @Override - public @NonNull Data serialize() { - return Data.EMPTY; - } - - @Override - public @NonNull String getFactoryKey() { - return KEY; - } - - @Override - public void onRun() throws Exception { - byte[] profileKey = ProfileKeyUtil.rotateProfileKey(context); - - accountManager.setProfileName(profileKey, TextSecurePreferences.getProfileName(context)); - accountManager.setProfileAvatar(profileKey, getProfileAvatar()); - - ApplicationContext.getInstance(context) - .getJobManager() - .add(new RefreshAttributesJob()); - } - - @Override - public void onCanceled() { - - } - - @Override - protected boolean onShouldRetry(@NonNull Exception exception) { - return exception instanceof PushNetworkException; - } - - private @Nullable StreamDetails getProfileAvatar() { - try { - Address localAddress = Address.fromSerialized(TextSecurePreferences.getLocalNumber(context)); - File avatarFile = AvatarHelper.getAvatarFile(context, localAddress); - - if (avatarFile.exists()) { - return new StreamDetails(new FileInputStream(avatarFile), "image/jpeg", avatarFile.length()); - } - } catch (IOException e) { - return null; - } - return null; - } - - public static final class Factory implements Job.Factory { - @Override - public @NonNull RotateProfileKeyJob create(@NonNull Parameters parameters, @NonNull Data data) { - return new RotateProfileKeyJob(parameters); - } - } -}