feat: add handlers for inserting group updates of new group types

This commit is contained in:
0x330a 2023-11-23 17:22:01 +11:00
parent cb5d9c9627
commit 9dd8eef781
No known key found for this signature in database
GPG Key ID: 267811D6E6A2698C
2 changed files with 42 additions and 18 deletions

View File

@ -538,20 +538,36 @@ private fun MessageReceiver.handleGroupUpdated(message: GroupUpdated, closedGrou
inner.hasInviteResponse() -> handleInviteResponse(message, closedGroup!!) inner.hasInviteResponse() -> handleInviteResponse(message, closedGroup!!)
inner.hasPromoteMessage() -> handlePromotionMessage(message) inner.hasPromoteMessage() -> handlePromotionMessage(message)
inner.hasInfoChangeMessage() -> handleGroupInfoChange(message, closedGroup!!) inner.hasInfoChangeMessage() -> handleGroupInfoChange(message, closedGroup!!)
inner.hasMemberChangeMessage() -> handleMemberChange(message, closedGroup!!)
inner.hasMemberLeftMessage() -> handleMemberLeft(message, closedGroup!!)
} }
} }
private fun handleMemberChange(message: GroupUpdated, closedGroup: SessionId) {
val storage = MessagingModuleConfiguration.shared.storage
val memberChange = message.inner.memberChangeMessage
val type = memberChange.type.name
val timestamp = message.sentTimestamp!!
verifyAdminSignature(closedGroup, memberChange.adminSignature.toByteArray(),
"MEMBER_CHANGE$type$timestamp"
)
storage.insertGroupInfoChange(message, closedGroup)
}
private fun handleMemberLeft(message: GroupUpdated, closedGroup: SessionId) {
val storage = MessagingModuleConfiguration.shared.storage
storage.insertGroupInfoChange(message, closedGroup)
}
private fun handleGroupInfoChange(message: GroupUpdated, closedGroup: SessionId) { private fun handleGroupInfoChange(message: GroupUpdated, closedGroup: SessionId) {
val sender = message.sender!!
val storage = MessagingModuleConfiguration.shared.storage val storage = MessagingModuleConfiguration.shared.storage
val inner = message.inner val inner = message.inner
val infoChanged = inner.infoChangeMessage ?: return val infoChanged = inner.infoChangeMessage ?: return
if (!infoChanged.hasAdminSignature()) return Log.e("GroupUpdated", "Info changed message doesn't contain admin signature") if (!infoChanged.hasAdminSignature()) return Log.e("GroupUpdated", "Info changed message doesn't contain admin signature")
val adminSignature = infoChanged.adminSignature val adminSignature = infoChanged.adminSignature
val type = infoChanged.type.name val type = infoChanged.type.name
verifyAdminSignature(closedGroup, adminSignature.toByteArray(), "INFO_CHANGE"+type+message.sentTimestamp!!) val timestamp = message.sentTimestamp!!
val newName = if (infoChanged.hasUpdatedName()) infoChanged.updatedName else null verifyAdminSignature(closedGroup, adminSignature.toByteArray(), "INFO_CHANGE$type$timestamp")
val newExpiration = if (infoChanged.hasUpdatedExpiration()) infoChanged.updatedExpiration else null
storage.insertGroupInfoChange(message, closedGroup) storage.insertGroupInfoChange(message, closedGroup)
} }
@ -559,6 +575,7 @@ private fun handlePromotionMessage(message: GroupUpdated) {
val sender = message.sender!! val sender = message.sender!!
val storage = MessagingModuleConfiguration.shared.storage val storage = MessagingModuleConfiguration.shared.storage
val inner = message.inner val inner = message.inner
// TODO: set ourselves as admin and overwrite the auth data for group
} }
private fun MessageReceiver.handleInviteResponse(message: GroupUpdated, closedGroup: SessionId) { private fun MessageReceiver.handleInviteResponse(message: GroupUpdated, closedGroup: SessionId) {

View File

@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo
import com.fasterxml.jackson.core.JsonParseException import com.fasterxml.jackson.core.JsonParseException
import org.session.libsession.messaging.messages.control.GroupUpdated import org.session.libsession.messaging.messages.control.GroupUpdated
import org.session.libsignal.messages.SignalServiceGroup import org.session.libsignal.messages.SignalServiceGroup
import org.session.libsignal.protos.SignalServiceProtos.DataMessage.GroupUpdateInfoChangeMessage
import org.session.libsignal.protos.SignalServiceProtos.DataMessage.GroupUpdateMemberChangeMessage.Type import org.session.libsignal.protos.SignalServiceProtos.DataMessage.GroupUpdateMemberChangeMessage.Type
import org.session.libsignal.utilities.JsonUtil import org.session.libsignal.utilities.JsonUtil
import org.session.libsignal.utilities.Log import org.session.libsignal.utilities.Log
@ -18,19 +19,23 @@ class UpdateMessageData () {
//the annotations below are required for serialization. Any new Kind class MUST be declared as JsonSubTypes as well //the annotations below are required for serialization. Any new Kind class MUST be declared as JsonSubTypes as well
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes( @JsonSubTypes(
JsonSubTypes.Type(Kind.GroupCreation::class, name = "GroupCreation"), JsonSubTypes.Type(Kind.GroupCreation::class, name = "GroupCreation"),
JsonSubTypes.Type(Kind.GroupNameChange::class, name = "GroupNameChange"), JsonSubTypes.Type(Kind.GroupNameChange::class, name = "GroupNameChange"),
JsonSubTypes.Type(Kind.GroupMemberAdded::class, name = "GroupMemberAdded"), JsonSubTypes.Type(Kind.GroupDescriptionChange::class, name = "GroupDescriptionChange"),
JsonSubTypes.Type(Kind.GroupMemberRemoved::class, name = "GroupMemberRemoved"), JsonSubTypes.Type(Kind.GroupMemberAdded::class, name = "GroupMemberAdded"),
JsonSubTypes.Type(Kind.GroupMemberLeft::class, name = "GroupMemberLeft"), JsonSubTypes.Type(Kind.GroupMemberRemoved::class, name = "GroupMemberRemoved"),
JsonSubTypes.Type(Kind.OpenGroupInvitation::class, name = "OpenGroupInvitation"), JsonSubTypes.Type(Kind.GroupMemberLeft::class, name = "GroupMemberLeft"),
JsonSubTypes.Type(Kind.GroupAvatarUpdated::class, name = "GroupAvatarUpdated") JsonSubTypes.Type(Kind.OpenGroupInvitation::class, name = "OpenGroupInvitation"),
JsonSubTypes.Type(Kind.GroupAvatarUpdated::class, name = "GroupAvatarUpdated"),
JsonSubTypes.Type(Kind.GroupMemberUpdated::class, name = "GroupMemberUpdated"),
JsonSubTypes.Type(Kind.GroupExpirationUpdated::class, name = "GroupExpirationUpdated")
) )
sealed class Kind { sealed class Kind {
data object GroupCreation: Kind() data object GroupCreation: Kind()
class GroupNameChange(val name: String): Kind() { class GroupNameChange(val name: String): Kind() {
constructor(): this("") //default constructor required for json serialization constructor(): this("") //default constructor required for json serialization
} }
data class GroupDescriptionChange @JvmOverloads constructor(val description: String = ""): Kind()
class GroupMemberAdded(val updatedMembers: Collection<String>): Kind() { class GroupMemberAdded(val updatedMembers: Collection<String>): Kind() {
constructor(): this(Collections.emptyList()) constructor(): this(Collections.emptyList())
} }
@ -42,7 +47,7 @@ class UpdateMessageData () {
constructor(): this(emptyList(), null) constructor(): this(emptyList(), null)
} }
data object GroupAvatarUpdated: Kind() data object GroupAvatarUpdated: Kind()
class GroupExpiryUpdated @JvmOverloads constructor(val newExpiry: Int = 0): Kind() data class GroupExpirationUpdated(val updatedExpiration: Int = 0): Kind()
class OpenGroupInvitation(val groupUrl: String, val groupName: String): Kind() { class OpenGroupInvitation(val groupUrl: String, val groupName: String): Kind() {
constructor(): this("", "") constructor(): this("", "")
} }
@ -81,6 +86,7 @@ class UpdateMessageData () {
Type.ADDED -> MemberUpdateType.ADDED Type.ADDED -> MemberUpdateType.ADDED
Type.PROMOTED -> MemberUpdateType.PROMOTED Type.PROMOTED -> MemberUpdateType.PROMOTED
Type.REMOVED -> MemberUpdateType.REMOVED Type.REMOVED -> MemberUpdateType.REMOVED
null -> null
} }
val members = memberChange.memberSessionIdsList val members = memberChange.memberSessionIdsList
UpdateMessageData(Kind.GroupMemberUpdated(members, type)) UpdateMessageData(Kind.GroupMemberUpdated(members, type))
@ -88,13 +94,14 @@ class UpdateMessageData () {
inner.hasInfoChangeMessage() -> { inner.hasInfoChangeMessage() -> {
val infoChange = inner.infoChangeMessage val infoChange = inner.infoChangeMessage
val type = infoChange.type val type = infoChange.type
TODO() when (type) {
// when (type) { GroupUpdateInfoChangeMessage.Type.NAME -> Kind.GroupNameChange(infoChange.updatedName)
// GroupUpdateInfoChangeMessage.Type.NAME -> Kind.GroupNameChange(infoChange.updatedName) GroupUpdateInfoChangeMessage.Type.AVATAR -> Kind.GroupAvatarUpdated
// GroupUpdateInfoChangeMessage.Type.AVATAR -> Kind.GroupAvatarUpdated GroupUpdateInfoChangeMessage.Type.DISAPPEARING_MESSAGES -> Kind.GroupExpirationUpdated(infoChange.updatedExpiration)
// // GroupUpdateInfoChangeMessage.Type.DISAPPEARING_MESSAGES -> Kind.GroupExpirationUpdated(infoChange.updatedExpiration) else -> null
// } }?.let { UpdateMessageData(it) }
} }
inner.hasMemberLeftMessage() -> UpdateMessageData(Kind.GroupMemberLeft)
else -> null else -> null
} }
} }