From a4e64187f17f535cffdff0bc267ab638355ac32e Mon Sep 17 00:00:00 2001 From: charles Date: Fri, 9 Dec 2022 13:51:44 +1100 Subject: [PATCH] Cleanup expiring message manager --- .../ExpirationConfigurationDatabase.kt | 2 +- .../securesms/database/RecipientDatabase.java | 10 ------ .../securesms/database/Storage.kt | 8 +++-- .../service/ExpiringMessageManager.java | 36 +++++++++---------- .../ReceivedMessageHandler.kt | 12 ++++--- .../libsession/utilities/SSKEnvironment.kt | 5 ++- 6 files changed, 34 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ExpirationConfigurationDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ExpirationConfigurationDatabase.kt index 2223f67699..a7c3bf252e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ExpirationConfigurationDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ExpirationConfigurationDatabase.kt @@ -72,7 +72,7 @@ class ExpirationConfigurationDatabase(context: Context, helper: SQLCipherOpenHel return mappings.firstOrNull() } - fun addExpirationConfiguration(configuration: ExpirationConfiguration) { + fun setExpirationConfiguration(configuration: ExpirationConfiguration) { writableDatabase.beginTransaction() try { val values = ContentValues().apply { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java index 0e97ac3188..d3510c082a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java @@ -317,16 +317,6 @@ public class RecipientDatabase extends Database { notifyRecipientListeners(); } - public void setExpireMessages(@NonNull Recipient recipient, int expiration) { - recipient.setExpireMessages(expiration); - - ContentValues values = new ContentValues(1); - values.put(EXPIRE_MESSAGES, expiration); - updateOrInsert(recipient.getAddress(), values); - recipient.resolve().setExpireMessages(expiration); - notifyRecipientListeners(); - } - public void setUnidentifiedAccessMode(@NonNull Recipient recipient, @NonNull UnidentifiedAccessMode unidentifiedAccessMode) { ContentValues values = new ContentValues(1); values.put(UNIDENTIFIED_ACCESS_MODE, unidentifiedAccessMode.getMode()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index f56028968d..39a068f085 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -48,6 +48,7 @@ import org.session.libsession.utilities.recipients.Recipient import org.session.libsignal.crypto.ecc.ECKeyPair import org.session.libsignal.messages.SignalServiceAttachmentPointer import org.session.libsignal.messages.SignalServiceGroup +import org.session.libsignal.protos.SignalServiceProtos.Content.ExpirationType import org.session.libsignal.utilities.IdPrefix import org.session.libsignal.utilities.KeyHelper import org.session.libsignal.utilities.guava.Optional @@ -541,7 +542,10 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, override fun setExpirationTimer(groupID: String, duration: Int) { val recipient = Recipient.from(context, fromSerialized(groupID), false) - DatabaseComponent.get(context).recipientDatabase().setExpireMessages(recipient, duration); + val threadId = DatabaseComponent.get(context).threadDatabase().getThreadIdIfExistsFor(recipient) + DatabaseComponent.get(context).expirationConfigurationDatabase().setExpirationConfiguration( + ExpirationConfiguration(threadId, duration, ExpirationType.DELETE_AFTER_SEND, System.currentTimeMillis()) + ) } override fun setServerCapabilities(server: String, capabilities: List) { @@ -968,7 +972,7 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, } override fun addExpirationConfiguration(config: ExpirationConfiguration) { - DatabaseComponent.get(context).expirationConfigurationDatabase().addExpirationConfiguration(config) + DatabaseComponent.get(context).expirationConfigurationDatabase().setExpirationConfiguration(config) } override fun getExpiringMessages(messageIds: LongArray): List> { diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java index b6d2e2bc57..64819aedd0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java @@ -3,6 +3,8 @@ package org.thoughtcrime.securesms.service; import android.content.Context; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.session.libsession.messaging.messages.ExpirationConfiguration; import org.session.libsession.messaging.messages.control.ExpirationTimerUpdate; import org.session.libsession.messaging.messages.signal.IncomingMediaMessage; import org.session.libsession.messaging.messages.signal.OutgoingExpirationUpdateMessage; @@ -12,6 +14,7 @@ import org.session.libsession.utilities.SSKEnvironment; import org.session.libsession.utilities.TextSecurePreferences; import org.session.libsession.utilities.recipients.Recipient; import org.session.libsignal.messages.SignalServiceGroup; +import org.session.libsignal.protos.SignalServiceProtos; import org.session.libsignal.utilities.Log; import org.session.libsignal.utilities.guava.Optional; import org.thoughtcrime.securesms.database.MmsDatabase; @@ -66,7 +69,19 @@ public class ExpiringMessageManager implements SSKEnvironment.MessageExpirationM } @Override - public void setExpirationTimer(@NotNull ExpirationTimerUpdate message) { + public void setExpirationTimer(@NotNull ExpirationTimerUpdate message, @Nullable SignalServiceProtos.Content.ExpirationType type) { + try { + long threadId = message.getThreadID(); + if (message.getGroupPublicKey() != null) { + Recipient recipient = Recipient.from(context, Address.fromSerialized(GroupUtil.doubleEncodeGroupID(message.getGroupPublicKey())), false); + threadId = DatabaseComponent.get(context).threadDatabase().getOrCreateThreadIdFor(recipient); + } + DatabaseComponent.get(context).expirationConfigurationDatabase().setExpirationConfiguration( + new ExpirationConfiguration(threadId, message.getDuration(), type, System.currentTimeMillis()) + ); + } catch (Exception e) { + Log.e("Loki", "Failed to update expiration configuration."); + } String userPublicKey = TextSecurePreferences.getLocalNumber(context); String senderPublicKey = message.getSender(); @@ -120,10 +135,6 @@ public class ExpiringMessageManager implements SSKEnvironment.MessageExpirationM Optional.absent()); //insert the timer update message database.insertSecureDecryptedMessageInbox(mediaMessage, -1, true, true); - - //set the timer to the conversation - DatabaseComponent.get(context).recipientDatabase().setExpireMessages(recipient, duration); - } catch (IOException | MmsException ioe) { Log.e("Loki", "Failed to insert expiration update message."); } @@ -142,24 +153,11 @@ public class ExpiringMessageManager implements SSKEnvironment.MessageExpirationM try { OutgoingExpirationUpdateMessage timerUpdateMessage = new OutgoingExpirationUpdateMessage(recipient, sentTimestamp, duration * 1000L, groupId); database.insertSecureDecryptedMessageOutbox(timerUpdateMessage, -1, sentTimestamp, true); - - if (groupId != null) { - // we need the group ID as recipient for setExpireMessages below - recipient = Recipient.from(context, Address.fromSerialized(GroupUtil.doubleEncodeGroupID(groupId)), false); - } - //set the timer to the conversation - DatabaseComponent.get(context).recipientDatabase().setExpireMessages(recipient, duration); - - } catch (MmsException | IOException ioe) { + } catch (MmsException e) { Log.e("Loki", "Failed to insert expiration update message."); } } - @Override - public void disableExpirationTimer(@NotNull ExpirationTimerUpdate message) { - setExpirationTimer(message); - } - @Override public void startAnyExpiration(long timestamp, @NotNull String author) { MessageRecord messageRecord = DatabaseComponent.get(context).mmsSmsDatabase().getMessageFor(timestamp, author); diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt index 61dbead5da..e3cb7f924d 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt @@ -45,6 +45,7 @@ import org.session.libsignal.crypto.ecc.DjbECPublicKey import org.session.libsignal.crypto.ecc.ECKeyPair import org.session.libsignal.messages.SignalServiceGroup import org.session.libsignal.protos.SignalServiceProtos +import org.session.libsignal.protos.SignalServiceProtos.Content.ExpirationType import org.session.libsignal.utilities.Base64 import org.session.libsignal.utilities.IdPrefix import org.session.libsignal.utilities.Log @@ -156,11 +157,14 @@ fun MessageReceiver.cancelTypingIndicatorsIfNeeded(senderPublicKey: String) { } private fun MessageReceiver.handleExpirationTimerUpdate(message: ExpirationTimerUpdate) { - if (message.duration!! > 0) { - SSKEnvironment.shared.messageExpirationManager.setExpirationTimer(message) - } else { - SSKEnvironment.shared.messageExpirationManager.disableExpirationTimer(message) + if (ExpirationConfiguration.isNewConfigEnabled) return + val recipient = Recipient.from(MessagingModuleConfiguration.shared.context, Address.fromSerialized(message.sender!!), false) + val type = when { + recipient.isLocalNumber -> ExpirationType.DELETE_AFTER_READ + recipient.isContactRecipient || recipient.isGroupRecipient -> ExpirationType.DELETE_AFTER_SEND + else -> null } + SSKEnvironment.shared.messageExpirationManager.setExpirationTimer(message, type) } private fun MessageReceiver.handleDataExtractionNotification(message: DataExtractionNotification) { diff --git a/libsession/src/main/java/org/session/libsession/utilities/SSKEnvironment.kt b/libsession/src/main/java/org/session/libsession/utilities/SSKEnvironment.kt index 0374b9c001..bac6d4a7b4 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/SSKEnvironment.kt +++ b/libsession/src/main/java/org/session/libsession/utilities/SSKEnvironment.kt @@ -3,8 +3,8 @@ package org.session.libsession.utilities import android.content.Context import org.session.libsession.messaging.messages.control.ExpirationTimerUpdate import org.session.libsession.messaging.sending_receiving.notifications.MessageNotifier -import org.session.libsession.utilities.Address import org.session.libsession.utilities.recipients.Recipient +import org.session.libsignal.protos.SignalServiceProtos.Content.ExpirationType class SSKEnvironment( val typingIndicators: TypingIndicatorsProtocol, @@ -37,8 +37,7 @@ class SSKEnvironment( } interface MessageExpirationManagerProtocol { - fun setExpirationTimer(message: ExpirationTimerUpdate) - fun disableExpirationTimer(message: ExpirationTimerUpdate) + fun setExpirationTimer(message: ExpirationTimerUpdate, type: ExpirationType?) fun startAnyExpiration(timestamp: Long, author: String) }