Convert and store new group changes in MessageExtras.

This commit is contained in:
Clark
2024-02-26 10:43:51 -05:00
committed by Alex Hart
parent cc25f0685c
commit 1ade8b502f
17 changed files with 933 additions and 56 deletions

View File

@@ -8,7 +8,9 @@ import org.thoughtcrime.securesms.database.model.ParentStoryId
import org.thoughtcrime.securesms.database.model.StoryType
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList
import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context
import org.thoughtcrime.securesms.database.model.databaseprotos.GV2UpdateDescription
import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge
import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExtras
import org.thoughtcrime.securesms.groups.GroupId
import org.thoughtcrime.securesms.linkpreview.LinkPreview
import org.thoughtcrime.securesms.recipients.RecipientId
@@ -36,7 +38,8 @@ class IncomingMessage(
sharedContacts: List<Contact> = emptyList(),
linkPreviews: List<LinkPreview> = emptyList(),
mentions: List<Mention> = emptyList(),
val giftBadge: GiftBadge? = null
val giftBadge: GiftBadge? = null,
val messageExtras: MessageExtras? = null
) {
val attachments: List<Attachment> = ArrayList(attachments)
@@ -104,9 +107,8 @@ class IncomingMessage(
serverTimeMillis = timestamp,
groupId = groupId,
groupContext = messageGroupContext,
serverGuid = serverGuid,
body = messageGroupContext.encodedGroupContext,
type = MessageType.GROUP_UPDATE
type = MessageType.GROUP_UPDATE,
messageExtras = MessageExtras(gv2UpdateDescription = GV2UpdateDescription(gv2ChangeDescription = groupContext, groupChangeUpdate = null))
)
}
}

View File

@@ -11,6 +11,7 @@ import org.signal.storageservice.protos.groups.local.DecryptedGroup;
import org.signal.storageservice.protos.groups.local.DecryptedGroupChange;
import org.signal.storageservice.protos.groups.local.DecryptedMember;
import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context;
import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExtras;
import org.thoughtcrime.securesms.messages.SignalServiceProtoUtil;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
@@ -30,7 +31,6 @@ import java.util.List;
*/
public final class MessageGroupContext {
@NonNull private final String encodedGroupContext;
@NonNull private final GroupProperties group;
@Nullable private final GroupV1Properties groupV1;
@Nullable private final GroupV2Properties groupV2;
@@ -38,7 +38,6 @@ public final class MessageGroupContext {
public MessageGroupContext(@NonNull String encodedGroupContext, boolean v2)
throws IOException
{
this.encodedGroupContext = encodedGroupContext;
if (v2) {
this.groupV1 = null;
this.groupV2 = new GroupV2Properties(DecryptedGroupV2Context.ADAPTER.decode(Base64.decode(encodedGroupContext)));
@@ -50,15 +49,25 @@ public final class MessageGroupContext {
}
}
public MessageGroupContext(@NonNull MessageExtras messageExtras, boolean v2) {
if (v2) {
this.groupV1 = null;
this.groupV2 = new GroupV2Properties(messageExtras.gv2UpdateDescription.gv2ChangeDescription);
this.group = groupV2;
} else {
this.groupV1 = new GroupV1Properties(messageExtras.gv1Context);
this.groupV2 = null;
this.group = groupV1;
}
}
public MessageGroupContext(@NonNull GroupContext group) {
this.encodedGroupContext = Base64.encodeWithPadding(group.encode());
this.groupV1 = new GroupV1Properties(group);
this.groupV2 = null;
this.group = groupV1;
}
public MessageGroupContext(@NonNull DecryptedGroupV2Context group) {
this.encodedGroupContext = Base64.encodeWithPadding(group.encode());
this.groupV1 = null;
this.groupV2 = new GroupV2Properties(group);
this.group = groupV2;
@@ -82,10 +91,6 @@ public final class MessageGroupContext {
return groupV2 != null;
}
public @NonNull String getEncodedGroupContext() {
return encodedGroupContext;
}
public String getName() {
return group.getName();
}

View File

@@ -9,8 +9,9 @@ import org.thoughtcrime.securesms.database.model.Mention
import org.thoughtcrime.securesms.database.model.ParentStoryId
import org.thoughtcrime.securesms.database.model.StoryType
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList
import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context
import org.thoughtcrime.securesms.database.model.databaseprotos.GV2UpdateDescription
import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge
import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExtras
import org.thoughtcrime.securesms.linkpreview.LinkPreview
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.sms.GroupV2UpdateMessageUtil
@@ -52,7 +53,8 @@ data class OutgoingMessage(
val scheduledDate: Long = -1,
val messageToEdit: Long = 0,
val isReportSpam: Boolean = false,
val isMessageRequestAccept: Boolean = false
val isMessageRequestAccept: Boolean = false,
val messageExtras: MessageExtras? = null
) {
val isV2Group: Boolean = messageGroupContext != null && GroupV2UpdateMessageUtil.isGroupV2(messageGroupContext)
@@ -228,17 +230,18 @@ data class OutgoingMessage(
* Helper for creating a group update message when a state change occurs and needs to be sent to others.
*/
@JvmStatic
fun groupUpdateMessage(threadRecipient: Recipient, group: DecryptedGroupV2Context, sentTimeMillis: Long): OutgoingMessage {
val groupContext = MessageGroupContext(group)
fun groupUpdateMessage(threadRecipient: Recipient, update: GV2UpdateDescription, sentTimeMillis: Long): OutgoingMessage {
val messageExtras = MessageExtras(gv2UpdateDescription = update)
val groupContext = MessageGroupContext(update.gv2ChangeDescription!!)
return OutgoingMessage(
threadRecipient = threadRecipient,
body = groupContext.encodedGroupContext,
sentTimeMillis = sentTimeMillis,
messageGroupContext = groupContext,
isGroup = true,
isGroupUpdate = true,
isSecure = true
isSecure = true,
messageExtras = messageExtras
)
}
@@ -260,7 +263,6 @@ data class OutgoingMessage(
): OutgoingMessage {
return OutgoingMessage(
threadRecipient = threadRecipient,
body = groupContext.encodedGroupContext,
isGroup = true,
isGroupUpdate = true,
messageGroupContext = groupContext,