[SES-3183] - Delete existing expiring settings message when receiving new ones (#891)

pull/1709/head
SessionHero01 3 months ago committed by GitHub
parent 0663876230
commit db4e384cd5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -35,6 +35,7 @@ import org.session.libsession.messaging.sending_receiving.attachments.Attachment
import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment
import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview
import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel
import org.session.libsession.messaging.utilities.UpdateMessageData
import org.session.libsession.snode.SnodeAPI
import org.session.libsession.utilities.Address
import org.session.libsession.utilities.Address.Companion.UNKNOWN
@ -47,6 +48,7 @@ import org.session.libsession.utilities.NetworkFailure
import org.session.libsession.utilities.NetworkFailureList
import org.session.libsession.utilities.TextSecurePreferences.Companion.isReadReceiptsEnabled
import org.session.libsession.utilities.recipients.Recipient
import org.session.libsignal.utilities.AccountId
import org.session.libsignal.utilities.JsonUtil
import org.session.libsignal.utilities.Log
import org.session.libsignal.utilities.ThreadUtils.queue

@ -31,8 +31,10 @@ import net.zetetic.database.sqlcipher.SQLiteDatabase;
import net.zetetic.database.sqlcipher.SQLiteQueryBuilder;
import org.jetbrains.annotations.NotNull;
import org.session.libsession.messaging.utilities.UpdateMessageData;
import org.session.libsession.utilities.Address;
import org.session.libsession.utilities.Util;
import org.session.libsignal.utilities.AccountId;
import org.session.libsignal.utilities.Log;
import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId;
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
@ -381,6 +383,24 @@ public class MmsSmsDatabase extends Database {
}
}
public void deleteGroupInfoMessage(AccountId groupId, Class<? extends UpdateMessageData.Kind> kind) {
long threadId = DatabaseComponent.get(context).threadDatabase().getThreadIdIfExistsFor(groupId.getHexString());
if (threadId == -1) {
Log.d(TAG, "No thread found for group info message deletion");
return;
}
Object[] bindArgs = { threadId, kind.getSimpleName() };
for (String table : new String[]{ MmsDatabase.TABLE_NAME, SmsDatabase.TABLE_NAME }) {
// Delete messages with body that is a valid JSON object and .kind.@type == kind
getWritableDatabase().execSQL(
"DELETE FROM " + table + " WHERE " + MmsSmsColumns.THREAD_ID + " = ? AND json_valid(" + MmsSmsColumns.BODY + ") AND json_extract(" + MmsSmsColumns.BODY + ", '$.kind.@type') = ?",
bindArgs
);
}
}
public long getConversationCount(long threadId) {
long count = DatabaseComponent.get(context).smsDatabase().getMessageCountForThread(threadId);
count += DatabaseComponent.get(context).mmsDatabase().getMessageCountForThread(threadId);

@ -1062,6 +1062,10 @@ open class Storage @Inject constructor(
mmsDB.updateInfoMessage(messageId, newMessage.toJSON())
}
override fun deleteGroupInfoMessages(groupId: AccountId, kind: Class<out UpdateMessageData.Kind>) {
mmsSmsDatabase.deleteGroupInfoMessage(groupId, kind)
}
override fun insertGroupInviteControlMessage(sentTimestamp: Long, senderPublicKey: String, senderName: String?, closedGroup: AccountId, groupName: String): Long? {
val updateData = UpdateMessageData(UpdateMessageData.Kind.GroupInvitation(
groupAccountId = closedGroup.hexString,

@ -36,6 +36,7 @@ import org.session.libsession.messaging.utilities.MessageAuthentication.buildDel
import org.session.libsession.messaging.utilities.MessageAuthentication.buildInfoChangeSignature
import org.session.libsession.messaging.utilities.MessageAuthentication.buildMemberChangeSignature
import org.session.libsession.messaging.utilities.SodiumUtilities
import org.session.libsession.messaging.utilities.UpdateMessageData
import org.session.libsession.snode.OwnedSwarmAuth
import org.session.libsession.snode.SnodeAPI
import org.session.libsession.snode.SnodeClock
@ -1101,6 +1102,15 @@ class GroupManagerV2Impl @Inject constructor(
}
}
override fun handleGroupInfoChange(message: GroupUpdated, groupId: AccountId) {
if (message.inner.hasInfoChangeMessage() && message.inner.infoChangeMessage.hasUpdatedExpiration()) {
// If we receive a disappearing message update, we need to remove the existing timer control message
storage.deleteGroupInfoMessages(groupId, UpdateMessageData.Kind.GroupExpirationUpdated::class.java)
}
storage.insertGroupInfoChange(message, groupId)
}
override fun onBlocked(groupAccountId: AccountId) {
scope.launch(groupAccountId, "On blocked") {
respondToInvitation(groupAccountId, false)
@ -1139,6 +1149,8 @@ class GroupManagerV2Impl @Inject constructor(
}
MessageSender.send(message, Destination.ClosedGroup(groupId.hexString), false)
storage.deleteGroupInfoMessages(groupId, UpdateMessageData.Kind.GroupExpirationUpdated::class.java)
storage.insertGroupInfoChange(message, groupId)
}

@ -177,6 +177,7 @@ interface StorageProtocol {
groupName: String
): Long?
fun updateGroupInfoChange(messageId: Long, newType: UpdateMessageData.Kind)
fun deleteGroupInfoMessages(groupId: AccountId, kind: Class<out UpdateMessageData.Kind>)
// Groups
fun getAllGroups(includeInactive: Boolean): List<GroupRecord>

@ -1,8 +1,10 @@
package org.session.libsession.messaging.groups
import network.loki.messenger.libsession_util.util.ExpiryMode
import org.session.libsession.messaging.messages.control.GroupUpdated
import org.session.libsession.utilities.recipients.Recipient
import org.session.libsignal.protos.SignalServiceProtos.DataMessage.GroupUpdateDeleteMemberContentMessage
import org.session.libsignal.protos.SignalServiceProtos.DataMessage.GroupUpdateMessage
import org.session.libsignal.utilities.AccountId
/**
@ -100,6 +102,8 @@ interface GroupManagerV2 {
fun setExpirationTimer(groupId: AccountId, mode: ExpiryMode, expiryChangeTimestampMs: Long)
fun handleGroupInfoChange(message: GroupUpdated, groupId: AccountId)
/**
* Should be called whenever a group invite is blocked
*/

@ -705,7 +705,6 @@ private fun handleMemberLeftNotification(message: GroupUpdated, closedGroup: Acc
}
private fun handleGroupInfoChange(message: GroupUpdated, closedGroup: AccountId) {
val storage = MessagingModuleConfiguration.shared.storage
val inner = message.inner
val infoChanged = inner.infoChangeMessage ?: return
if (!infoChanged.hasAdminSignature()) return Log.e("GroupUpdated", "Info changed message doesn't contain admin signature")
@ -714,7 +713,7 @@ private fun handleGroupInfoChange(message: GroupUpdated, closedGroup: AccountId)
val timestamp = message.sentTimestamp!!
verifyAdminSignature(closedGroup, adminSignature.toByteArray(), buildInfoChangeSignature(type, timestamp))
storage.insertGroupInfoChange(message, closedGroup)
MessagingModuleConfiguration.shared.groupManagerV2.handleGroupInfoChange(message, closedGroup)
}
private fun handlePromotionMessage(message: GroupUpdated) {

Loading…
Cancel
Save