Cleanup expiring message manager

pull/1014/head
charles 2 years ago
parent d70bfe5614
commit a4e64187f1

@ -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 {

@ -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());

@ -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<String>) {
@ -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<Pair<String, Int>> {

@ -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);

@ -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) {

@ -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)
}

Loading…
Cancel
Save