fix: boolean logic for denying closed group messages

This commit is contained in:
0x330a 2023-11-23 16:13:46 +11:00
parent 06b879057f
commit cb5d9c9627
No known key found for this signature in database
GPG Key ID: 267811D6E6A2698C
5 changed files with 50 additions and 26 deletions

View File

@ -1127,7 +1127,7 @@ open class Storage(
val group = SignalServiceGroup(type, GroupUtil.getDecodedGroupIDAsData(groupID), SignalServiceGroup.GroupType.SIGNAL, name, members.toList(), null, admins.toList())
val m = IncomingTextMessage(fromSerialized(senderPublicKey), 1, sentTimestamp, "", Optional.of(group), 0, true, false)
val updateData = UpdateMessageData.buildGroupUpdate(type, name, members)?.toJSON()
val infoMessage = IncomingGroupMessage(m, groupID, updateData, true)
val infoMessage = IncomingGroupMessage(m, updateData, true)
val smsDB = DatabaseComponent.get(context).smsDatabase()
smsDB.insertMessageInbox(infoMessage, true)
}
@ -1145,11 +1145,6 @@ open class Storage(
mmsDB.markAsSent(infoMessageID, true)
}
// override fun insertGroupUpdatedControlMessage(groupSessionId: SessionId,
// controlMessage) {
//
// }
override fun isLegacyClosedGroup(publicKey: String): Boolean {
return DatabaseComponent.get(context).lokiAPIDatabase().isClosedGroup(publicKey)
}
@ -1370,6 +1365,17 @@ open class Storage(
}
override fun insertGroupInfoChange(message: GroupUpdated, closedGroup: SessionId) {
val sentTimestamp = message.sentTimestamp ?: return
val senderPublicKey = message.sender ?: return
val group = SignalServiceGroup(Hex.fromStringCondensed(closedGroup.hexString()), SignalServiceGroup.GroupType.SIGNAL)
val m = IncomingTextMessage(fromSerialized(senderPublicKey), 1, sentTimestamp, "", Optional.of(group), 0, true, false)
val updateData = UpdateMessageData.buildGroupUpdate(message)?.toJSON() ?: return
val infoMessage = IncomingGroupMessage(m, updateData, true)
val smsDB = DatabaseComponent.get(context).smsDatabase()
smsDB.insertMessageInbox(infoMessage, true)
}
override fun setServerCapabilities(server: String, capabilities: List<String>) {
return DatabaseComponent.get(context).lokiAPIDatabase().setServerCapabilities(server, capabilities)
}

View File

@ -14,6 +14,7 @@ import org.session.libsession.messaging.jobs.MessageSendJob
import org.session.libsession.messaging.messages.Destination
import org.session.libsession.messaging.messages.Message
import org.session.libsession.messaging.messages.control.ConfigurationMessage
import org.session.libsession.messaging.messages.control.GroupUpdated
import org.session.libsession.messaging.messages.control.MessageRequestResponse
import org.session.libsession.messaging.messages.visible.Attachment
import org.session.libsession.messaging.messages.visible.Profile
@ -166,6 +167,7 @@ interface StorageProtocol {
fun getLibSessionClosedGroup(groupSessionId: String): GroupInfo.ClosedGroupInfo?
fun getClosedGroupDisplayInfo(groupSessionId: String): GroupDisplayInfo?
fun inviteClosedGroupMembers(groupSessionId: String, invitees: List<String>)
fun insertGroupInfoChange(message: GroupUpdated, closedGroup: SessionId)
// Groups
fun getAllGroups(includeInactive: Boolean): List<GroupRecord>

View File

@ -2,12 +2,10 @@ package org.session.libsession.messaging.messages.signal;
public class IncomingGroupMessage extends IncomingTextMessage {
private final String groupID;
private final boolean updateMessage;
public IncomingGroupMessage(IncomingTextMessage base, String groupID, String body, boolean updateMessage) {
public IncomingGroupMessage(IncomingTextMessage base, String body, boolean updateMessage) {
super(base, body);
this.groupID = groupID;
this.updateMessage = updateMessage;
}

View File

@ -530,7 +530,7 @@ private fun ClosedGroupControlMessage.getPublicKey(): String = kind!!.let { when
private fun MessageReceiver.handleGroupUpdated(message: GroupUpdated, closedGroup: SessionId?) {
val inner = message.inner
if (closedGroup == null &&
(!inner.hasInviteMessage()) || !inner.hasPromoteMessage()) { // TODO: add all the cases for this
!inner.hasInviteMessage() && !inner.hasPromoteMessage()) {
throw NullPointerException("Message wasn't polled from a closed group!")
}
when {
@ -552,7 +552,7 @@ private fun handleGroupInfoChange(message: GroupUpdated, closedGroup: SessionId)
verifyAdminSignature(closedGroup, adminSignature.toByteArray(), "INFO_CHANGE"+type+message.sentTimestamp!!)
val newName = if (infoChanged.hasUpdatedName()) infoChanged.updatedName else null
val newExpiration = if (infoChanged.hasUpdatedExpiration()) infoChanged.updatedExpiration else null
// storage.insertIncomingInfoMessage()
storage.insertGroupInfoChange(message, closedGroup)
}
private fun handlePromotionMessage(message: GroupUpdated) {

View File

@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo
import com.fasterxml.jackson.core.JsonParseException
import org.session.libsession.messaging.messages.control.GroupUpdated
import org.session.libsignal.messages.SignalServiceGroup
import org.session.libsignal.protos.SignalServiceProtos.DataMessage.GroupUpdateMemberChangeMessage.Type
import org.session.libsignal.utilities.JsonUtil
import org.session.libsignal.utilities.Log
import java.util.Collections
@ -22,10 +23,11 @@ class UpdateMessageData () {
JsonSubTypes.Type(Kind.GroupMemberAdded::class, name = "GroupMemberAdded"),
JsonSubTypes.Type(Kind.GroupMemberRemoved::class, name = "GroupMemberRemoved"),
JsonSubTypes.Type(Kind.GroupMemberLeft::class, name = "GroupMemberLeft"),
JsonSubTypes.Type(Kind.OpenGroupInvitation::class, name = "OpenGroupInvitation")
JsonSubTypes.Type(Kind.OpenGroupInvitation::class, name = "OpenGroupInvitation"),
JsonSubTypes.Type(Kind.GroupAvatarUpdated::class, name = "GroupAvatarUpdated")
)
sealed class Kind() {
class GroupCreation(): Kind()
sealed class Kind {
data object GroupCreation: Kind()
class GroupNameChange(val name: String): Kind() {
constructor(): this("") //default constructor required for json serialization
}
@ -35,10 +37,12 @@ class UpdateMessageData () {
class GroupMemberRemoved(val updatedMembers: Collection<String>): Kind() {
constructor(): this(Collections.emptyList())
}
class GroupMemberLeft(): Kind()
data object GroupMemberLeft: Kind()
class GroupMemberUpdated(val sessionIds: List<String>, val type: MemberUpdateType?): Kind() {
constructor(): this(emptyList(), null)
}
data object GroupAvatarUpdated: Kind()
class GroupExpiryUpdated @JvmOverloads constructor(val newExpiry: Int = 0): Kind()
class OpenGroupInvitation(val groupUrl: String, val groupName: String): Kind() {
constructor(): this("", "")
}
@ -59,26 +63,40 @@ class UpdateMessageData () {
fun buildGroupUpdate(type: SignalServiceGroup.Type, name: String, members: Collection<String>): UpdateMessageData? {
return when(type) {
SignalServiceGroup.Type.CREATION -> UpdateMessageData(Kind.GroupCreation())
SignalServiceGroup.Type.CREATION -> UpdateMessageData(Kind.GroupCreation)
SignalServiceGroup.Type.NAME_CHANGE -> UpdateMessageData(Kind.GroupNameChange(name))
SignalServiceGroup.Type.MEMBER_ADDED -> UpdateMessageData(Kind.GroupMemberAdded(members))
SignalServiceGroup.Type.MEMBER_REMOVED -> UpdateMessageData(Kind.GroupMemberRemoved(members))
SignalServiceGroup.Type.QUIT -> UpdateMessageData(Kind.GroupMemberLeft())
SignalServiceGroup.Type.QUIT -> UpdateMessageData(Kind.GroupMemberLeft)
else -> null
}
}
fun buildGroupUpdate(groupUpdated: GroupUpdated): UpdateMessageData? {
val inner = groupUpdated.inner
TODO()
// return when {
// inner.hasMemberChangeMessage() -> {
// val memberChange = inner.memberChangeMessage
// val type = memberChange.type
// memberChange.memberSessionIdsList
// }
// else -> null
// }
return when {
inner.hasMemberChangeMessage() -> {
val memberChange = inner.memberChangeMessage
val type = when (memberChange.type) {
Type.ADDED -> MemberUpdateType.ADDED
Type.PROMOTED -> MemberUpdateType.PROMOTED
Type.REMOVED -> MemberUpdateType.REMOVED
}
val members = memberChange.memberSessionIdsList
UpdateMessageData(Kind.GroupMemberUpdated(members, type))
}
inner.hasInfoChangeMessage() -> {
val infoChange = inner.infoChangeMessage
val type = infoChange.type
TODO()
// when (type) {
// GroupUpdateInfoChangeMessage.Type.NAME -> Kind.GroupNameChange(infoChange.updatedName)
// GroupUpdateInfoChangeMessage.Type.AVATAR -> Kind.GroupAvatarUpdated
// // GroupUpdateInfoChangeMessage.Type.DISAPPEARING_MESSAGES -> Kind.GroupExpirationUpdated(infoChange.updatedExpiration)
// }
}
else -> null
}
}
fun buildOpenGroupInvitation(url: String, name: String): UpdateMessageData {