From 5cb98d8fc305def54a2ee662ec83935a41b52cb7 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 19 May 2020 13:57:47 +1000 Subject: [PATCH] Refactor & temporarily disable problematic code --- .../securesms/jobs/CleanPreKeysJob.java | 2 +- .../securesms/jobs/MmsSendJob.java | 11 +++-- .../securesms/jobs/PushDecryptJob.java | 42 +++++++++++-------- .../securesms/jobs/PushSendJob.java | 4 +- .../securesms/jobs/RefreshPreKeysJob.java | 2 +- .../jobs/RetrieveProfileAvatarJob.java | 2 +- .../securesms/jobs/RotateSignedPreKeyJob.java | 2 +- .../jobs/ServiceOutageDetectionJob.java | 5 ++- .../securesms/jobs/SmsSendJob.java | 2 +- .../securesms/jobs/UpdateApkJob.java | 9 ++-- .../loki/api/LokiPublicChatPoller.kt | 2 +- .../loki/protocol/FriendRequestProtocol.kt | 4 +- .../loki/protocol/MultiDeviceProtocol.kt | 2 + .../loki/protocol/SessionMetaProtocol.kt | 8 ++++ .../loki/shelved/LokiRSSFeedPoller.kt | 2 +- 15 files changed, 56 insertions(+), 43 deletions(-) diff --git a/src/org/thoughtcrime/securesms/jobs/CleanPreKeysJob.java b/src/org/thoughtcrime/securesms/jobs/CleanPreKeysJob.java index 464d6e6a25..987ce6e787 100644 --- a/src/org/thoughtcrime/securesms/jobs/CleanPreKeysJob.java +++ b/src/org/thoughtcrime/securesms/jobs/CleanPreKeysJob.java @@ -40,7 +40,7 @@ public class CleanPreKeysJob extends BaseJob implements InjectableType { public CleanPreKeysJob() { this(new Job.Parameters.Builder() .setQueue("CleanPreKeysJob") - .setMaxAttempts(5) + .setMaxAttempts(3) .build()); } diff --git a/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java b/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java index d3112ef61c..315e13ad64 100644 --- a/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java @@ -3,11 +3,6 @@ package org.thoughtcrime.securesms.jobs; import android.content.Context; import android.support.annotation.NonNull; import android.text.TextUtils; - -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 android.webkit.MimeTypeMap; import com.android.mms.dom.smil.parser.SmilXmlSerializer; @@ -30,6 +25,10 @@ import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.ThreadDatabase; +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.mms.CompatMmsConnection; import org.thoughtcrime.securesms.mms.MediaConstraints; import org.thoughtcrime.securesms.mms.MmsException; @@ -64,7 +63,7 @@ public class MmsSendJob extends SendJob { this(new Job.Parameters.Builder() .setQueue("mms-operation") .addConstraint(NetworkConstraint.KEY) - .setMaxAttempts(15) + .setMaxAttempts(25) .build(), messageId); } diff --git a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java index 4497915e0d..bc36be9978 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java @@ -943,13 +943,13 @@ public class PushDecryptJob extends BaseJob implements InjectableType { } else { notifyTypingStoppedFromIncomingMessage(masterRecipient, content.getSender(), content.getSenderDevice()); - Address sender = masterRecipient.getAddress(); + Address masterAddress = masterRecipient.getAddress(); if (message.isGroupMessage()) { - sender = getMessageMasterDestination(content.getSender()).getAddress(); + masterAddress = getMessageMasterDestination(content.getSender()).getAddress(); } - IncomingTextMessage tm = new IncomingTextMessage(sender, + IncomingTextMessage tm = new IncomingTextMessage(masterAddress, content.getSenderDevice(), message.getTimestamp(), body, message.getGroupInfo(), @@ -1180,16 +1180,17 @@ public class PushDecryptJob extends BaseJob implements InjectableType { @NonNull SignalServiceReceiptMessage message) { // Redirect message to master device conversation - Address sender = Address.fromSerialized(content.getSender()); - if (sender.isPhone()) { - Recipient masterDevice = getMessageMasterDestination(content.getSender()); - sender = masterDevice.getAddress(); + Address masterAddress = Address.fromSerialized(content.getSender()); + + if (masterAddress.isPhone()) { + Recipient masterRecipient = getMessageMasterDestination(content.getSender()); + masterAddress = masterRecipient.getAddress(); } for (long timestamp : message.getTimestamps()) { Log.i(TAG, String.format("Received encrypted delivery receipt: (XXXXX, %d)", timestamp)); DatabaseFactory.getMmsSmsDatabase(context) - .incrementDeliveryReceiptCount(new SyncMessageId(sender, timestamp), System.currentTimeMillis()); + .incrementDeliveryReceiptCount(new SyncMessageId(masterAddress, timestamp), System.currentTimeMillis()); } } @@ -1200,17 +1201,18 @@ public class PushDecryptJob extends BaseJob implements InjectableType { if (TextSecurePreferences.isReadReceiptsEnabled(context)) { // Redirect message to master device conversation - Address sender = Address.fromSerialized(content.getSender()); - if (sender.isPhone()) { - Recipient masterDevice = getMessageMasterDestination(content.getSender()); - sender = masterDevice.getAddress(); + Address masterAddress = Address.fromSerialized(content.getSender()); + + if (masterAddress.isPhone()) { + Recipient masterRecipient = getMessageMasterDestination(content.getSender()); + masterAddress = masterRecipient.getAddress(); } for (long timestamp : message.getTimestamps()) { Log.i(TAG, String.format("Received encrypted read receipt: (XXXXX, %d)", timestamp)); DatabaseFactory.getMmsSmsDatabase(context) - .incrementReadReceiptCount(new SyncMessageId(sender, timestamp), content.getTimestamp()); + .incrementReadReceiptCount(new SyncMessageId(masterAddress, timestamp), content.getTimestamp()); } } } @@ -1368,11 +1370,11 @@ public class PushDecryptJob extends BaseJob implements InjectableType { } private Optional insertPlaceholder(@NonNull String sender, int senderDevice, long timestamp) { - Recipient masterDevice = getMessageMasterDestination(sender); - SmsDatabase database = DatabaseFactory.getSmsDatabase(context); - IncomingTextMessage textMessage = new IncomingTextMessage(masterDevice.getAddress(), - senderDevice, timestamp, "", - Optional.absent(), 0, false); + Recipient masterRecipient = getMessageMasterDestination(sender); + SmsDatabase database = DatabaseFactory.getSmsDatabase(context); + IncomingTextMessage textMessage = new IncomingTextMessage(masterRecipient.getAddress(), + senderDevice, timestamp, "", + Optional.absent(), 0, false); textMessage = new IncomingEncryptedMessage(textMessage, ""); return database.insertMessageInbox(textMessage); @@ -1448,6 +1450,10 @@ public class PushDecryptJob extends BaseJob implements InjectableType { return true; } + if (SessionMetaProtocol.shouldIgnoreMessage(content)) { + return true; + } + Recipient sender = Recipient.from(context, Address.fromSerialized(content.getSender()), false); if (content.getDeviceLink().isPresent()) { diff --git a/src/org/thoughtcrime/securesms/jobs/PushSendJob.java b/src/org/thoughtcrime/securesms/jobs/PushSendJob.java index 591e3f43f8..5bce0332f1 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushSendJob.java @@ -9,8 +9,6 @@ import android.text.TextUtils; import com.annimon.stream.Stream; import org.greenrobot.eventbus.EventBus; -import org.signal.libsignal.metadata.certificate.InvalidCertificateException; -import org.signal.libsignal.metadata.certificate.SenderCertificate; import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.TextSecureExpiredException; import org.thoughtcrime.securesms.attachments.Attachment; @@ -68,7 +66,7 @@ public abstract class PushSendJob extends SendJob { .setQueue(destination.serialize()) .addConstraint(NetworkConstraint.KEY) .setLifespan(TimeUnit.DAYS.toMillis(1)) - .setMaxAttempts(3) + .setMaxAttempts(1) .build(); } diff --git a/src/org/thoughtcrime/securesms/jobs/RefreshPreKeysJob.java b/src/org/thoughtcrime/securesms/jobs/RefreshPreKeysJob.java index 5d9cae36ef..24518c5eb9 100644 --- a/src/org/thoughtcrime/securesms/jobs/RefreshPreKeysJob.java +++ b/src/org/thoughtcrime/securesms/jobs/RefreshPreKeysJob.java @@ -29,7 +29,7 @@ public class RefreshPreKeysJob extends BaseJob implements InjectableType { this(new Job.Parameters.Builder() .setQueue("RefreshPreKeysJob") .addConstraint(NetworkConstraint.KEY) - .setMaxAttempts(5) + .setMaxAttempts(3) .build()); } diff --git a/src/org/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob.java b/src/org/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob.java index ecfa3ecdac..a891ab1487 100644 --- a/src/org/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob.java +++ b/src/org/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob.java @@ -49,7 +49,7 @@ public class RetrieveProfileAvatarJob extends BaseJob implements InjectableType .setQueue("RetrieveProfileAvatarJob" + recipient.getAddress().serialize()) .addConstraint(NetworkConstraint.KEY) .setLifespan(TimeUnit.HOURS.toMillis(1)) - .setMaxAttempts(2) + .setMaxAttempts(3) .build(), recipient, profileAvatar); diff --git a/src/org/thoughtcrime/securesms/jobs/RotateSignedPreKeyJob.java b/src/org/thoughtcrime/securesms/jobs/RotateSignedPreKeyJob.java index aae3816e75..82b721c845 100644 --- a/src/org/thoughtcrime/securesms/jobs/RotateSignedPreKeyJob.java +++ b/src/org/thoughtcrime/securesms/jobs/RotateSignedPreKeyJob.java @@ -30,7 +30,7 @@ public class RotateSignedPreKeyJob extends BaseJob implements InjectableType { public RotateSignedPreKeyJob() { this(new Job.Parameters.Builder() .addConstraint(NetworkConstraint.KEY) - .setMaxAttempts(5) + .setMaxAttempts(3) .build()); } diff --git a/src/org/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob.java b/src/org/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob.java index e5d9120040..1a83a580e3 100644 --- a/src/org/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob.java +++ b/src/org/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob.java @@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.jobs; import android.support.annotation.NonNull; import org.greenrobot.eventbus.EventBus; -import network.loki.messenger.BuildConfig; import org.thoughtcrime.securesms.events.ReminderUpdateEvent; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; @@ -15,6 +14,8 @@ import org.thoughtcrime.securesms.util.TextSecurePreferences; import java.net.InetAddress; import java.net.UnknownHostException; +import network.loki.messenger.BuildConfig; + public class ServiceOutageDetectionJob extends BaseJob { public static final String KEY = "ServiceOutageDetectionJob"; @@ -29,7 +30,7 @@ public class ServiceOutageDetectionJob extends BaseJob { this(new Job.Parameters.Builder() .setQueue("ServiceOutageDetectionJob") .addConstraint(NetworkConstraint.KEY) - .setMaxAttempts(5) + .setMaxAttempts(3) .setMaxInstances(1) .build()); } diff --git a/src/org/thoughtcrime/securesms/jobs/SmsSendJob.java b/src/org/thoughtcrime/securesms/jobs/SmsSendJob.java index 0f33579374..282099393b 100644 --- a/src/org/thoughtcrime/securesms/jobs/SmsSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/SmsSendJob.java @@ -32,7 +32,7 @@ public class SmsSendJob extends SendJob { public static final String KEY = "SmsSendJob"; private static final String TAG = SmsSendJob.class.getSimpleName(); - private static final int MAX_ATTEMPTS = 15; + private static final int MAX_ATTEMPTS = 25; private static final String KEY_MESSAGE_ID = "message_id"; private static final String KEY_RUN_ATTEMPT = "run_attempt"; diff --git a/src/org/thoughtcrime/securesms/jobs/UpdateApkJob.java b/src/org/thoughtcrime/securesms/jobs/UpdateApkJob.java index f67381d560..4a0359c967 100644 --- a/src/org/thoughtcrime/securesms/jobs/UpdateApkJob.java +++ b/src/org/thoughtcrime/securesms/jobs/UpdateApkJob.java @@ -11,14 +11,12 @@ import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.fasterxml.jackson.annotation.JsonProperty; + 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 com.fasterxml.jackson.annotation.JsonProperty; - -import network.loki.messenger.BuildConfig; import org.thoughtcrime.securesms.service.UpdateApkReadyListener; import org.thoughtcrime.securesms.util.FileUtils; import org.thoughtcrime.securesms.util.Hex; @@ -29,6 +27,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.security.MessageDigest; +import network.loki.messenger.BuildConfig; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -43,7 +42,7 @@ public class UpdateApkJob extends BaseJob { this(new Job.Parameters.Builder() .setQueue("UpdateApkJob") .addConstraint(NetworkConstraint.KEY) - .setMaxAttempts(2) + .setMaxAttempts(3) .build()); } diff --git a/src/org/thoughtcrime/securesms/loki/api/LokiPublicChatPoller.kt b/src/org/thoughtcrime/securesms/loki/api/LokiPublicChatPoller.kt index b1b9ef5652..f0d6117c51 100644 --- a/src/org/thoughtcrime/securesms/loki/api/LokiPublicChatPoller.kt +++ b/src/org/thoughtcrime/securesms/loki/api/LokiPublicChatPoller.kt @@ -165,7 +165,7 @@ class LokiPublicChatPoller(private val context: Context, private val group: Loki } val senderHexEncodedPublicKey = masterHexEncodedPublicKey ?: message.hexEncodedPublicKey val serviceDataMessage = getDataMessage(message) - val serviceContent = SignalServiceContent(serviceDataMessage, senderHexEncodedPublicKey, SignalServiceAddress.DEFAULT_DEVICE_ID, message.timestamp, false, false) + val serviceContent = SignalServiceContent(serviceDataMessage, senderHexEncodedPublicKey, SignalServiceAddress.DEFAULT_DEVICE_ID, message.timestamp, false, false, false, false, false) if (serviceDataMessage.quote.isPresent || (serviceDataMessage.attachments.isPresent && serviceDataMessage.attachments.get().size > 0) || serviceDataMessage.previews.isPresent) { PushDecryptJob(context).handleMediaMessage(serviceContent, serviceDataMessage, Optional.absent(), Optional.of(message.serverID)) } else { diff --git a/src/org/thoughtcrime/securesms/loki/protocol/FriendRequestProtocol.kt b/src/org/thoughtcrime/securesms/loki/protocol/FriendRequestProtocol.kt index 6736102fa0..a3d3cdb7d8 100644 --- a/src/org/thoughtcrime/securesms/loki/protocol/FriendRequestProtocol.kt +++ b/src/org/thoughtcrime/securesms/loki/protocol/FriendRequestProtocol.kt @@ -28,10 +28,10 @@ object FriendRequestProtocol { val allUserDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(userPublicKey) // Accept all outstanding friend requests associated with this user and try to establish sessions with the // subset of their devices that haven't sent a friend request. - val linkedDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(recipient.address.serialize()) + val allContactDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(recipient.address.serialize()) val threadDB = DatabaseFactory.getThreadDatabase(context) val lokiThreadDB = DatabaseFactory.getLokiThreadDatabase(context) - for (device in linkedDevices) { + for (device in allContactDevices) { val deviceAsRecipient = recipient(context, device) val deviceThreadID = threadDB.getThreadIdFor(deviceAsRecipient) val deviceFRStatus = lokiThreadDB.getFriendRequestStatus(deviceThreadID) diff --git a/src/org/thoughtcrime/securesms/loki/protocol/MultiDeviceProtocol.kt b/src/org/thoughtcrime/securesms/loki/protocol/MultiDeviceProtocol.kt index 0d445e76aa..19f55a51b8 100644 --- a/src/org/thoughtcrime/securesms/loki/protocol/MultiDeviceProtocol.kt +++ b/src/org/thoughtcrime/securesms/loki/protocol/MultiDeviceProtocol.kt @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.loki.protocol import android.content.Context import android.util.Log +import network.loki.messenger.BuildConfig import nl.komponents.kovenant.Promise import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.crypto.IdentityKeyUtil @@ -54,6 +55,7 @@ object MultiDeviceProtocol { outgoingMediaMessage.body.isNotBlank() || outgoingMediaMessage.attachments.isNotEmpty() } } + if (isFRMessage && !hasVisibleContent && BuildConfig.DEBUG) { throw IllegalStateException() } val shouldSendAutoGeneratedFR = !isContactFriend && !isFRMessage && !SessionMetaProtocol.shared.isNoteToSelf(recipient.address.serialize()) && !recipient.address.isGroup // Group threads work through session requests && hasVisibleContent diff --git a/src/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt b/src/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt index 54e95082cb..e0a8ca3aef 100644 --- a/src/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt +++ b/src/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt @@ -12,6 +12,14 @@ import org.whispersystems.signalservice.loki.protocol.todo.LokiThreadFriendReque object SessionMetaProtocol { + private val timestamps = mutableSetOf() + + @JvmStatic + fun shouldIgnoreMessage(content: SignalServiceContent): Boolean { + val timestamp = content.timestamp + return timestamps.contains(timestamp) + } + @JvmStatic fun handleProfileUpdateIfNeeded(context: Context, content: SignalServiceContent) { val rawDisplayName = content.senderDisplayName.orNull() ?: return diff --git a/src/org/thoughtcrime/securesms/loki/shelved/LokiRSSFeedPoller.kt b/src/org/thoughtcrime/securesms/loki/shelved/LokiRSSFeedPoller.kt index bfce10b4c3..18e3c6e307 100644 --- a/src/org/thoughtcrime/securesms/loki/shelved/LokiRSSFeedPoller.kt +++ b/src/org/thoughtcrime/securesms/loki/shelved/LokiRSSFeedPoller.kt @@ -66,7 +66,7 @@ class LokiRSSFeedPoller(private val context: Context, private val feed: LokiRSSF val id = feed.id.toByteArray() val x1 = SignalServiceGroup(SignalServiceGroup.Type.UPDATE, id, SignalServiceGroup.GroupType.RSS_FEED, null, null, null, null) val x2 = SignalServiceDataMessage(timestamp, x1, null, body) - val x3 = SignalServiceContent(x2, "Loki", SignalServiceAddress.DEFAULT_DEVICE_ID, timestamp, false, false) + val x3 = SignalServiceContent(x2, "Loki", SignalServiceAddress.DEFAULT_DEVICE_ID, timestamp, false, false, false, false, false) PushDecryptJob(context).handleTextMessage(x3, x2, Optional.absent(), Optional.absent()) } }.fail { exception ->