Fix moderator race condition (#975)

* fix: race condition in clear all / add new members

* fix: max width emoji text view on smaller devices

* fix: add extra widths and reduce the original again

* fix: quoted messages for blinded servers, remove unused add group member function

* fix: quote sending and resending using blinded IDs in quotes

* build: update build number
This commit is contained in:
Harris
2022-09-26 11:44:59 +10:00
committed by GitHub
parent 3fcd972c2a
commit d2dc86de88
16 changed files with 109 additions and 53 deletions

View File

@@ -71,8 +71,7 @@ interface StorageProtocol {
fun hasBackgroundGroupAddJob(groupJoinUrl: String): Boolean
fun setOpenGroupServerMessageID(messageID: Long, serverID: Long, threadID: Long, isSms: Boolean)
fun getOpenGroup(room: String, server: String): OpenGroup?
fun addGroupMemberRole(member: GroupMember)
fun clearGroupMemberRoles(groupId: String)
fun setGroupMemberRoles(members: List<GroupMember>)
// Open Group Public Keys
fun getOpenGroupPublicKey(server: String): String?

View File

@@ -231,12 +231,18 @@ fun MessageReceiver.handleVisibleMessage(message: VisibleMessage,
throw MessageReceiver.Error.NoThread
}
val threadRecipient = storage.getRecipientForThread(threadID)
val userBlindedKey = openGroupID?.let {
val openGroup = storage.getOpenGroup(threadID) ?: return@let null
val blindedKey = SodiumUtilities.blindedKeyPair(openGroup.publicKey, MessagingModuleConfiguration.shared.getUserED25519KeyPair()!!) ?: return@let null
SessionId(
IdPrefix.BLINDED, blindedKey.publicKey.asBytes
).hexString
}
// Update profile if needed
val recipient = Recipient.from(context, Address.fromSerialized(messageSender!!), false)
if (runProfileUpdate) {
val profile = message.profile
val isUserBlindedSender = messageSender == storage.getOpenGroup(threadID)?.publicKey?.let { SodiumUtilities.blindedKeyPair(it, MessagingModuleConfiguration.shared.getUserED25519KeyPair()!!) }?.let { SessionId(
IdPrefix.BLINDED, it.publicKey.asBytes).hexString }
val isUserBlindedSender = messageSender == userBlindedKey
if (profile != null && userPublicKey != messageSender && !isUserBlindedSender) {
val profileManager = SSKEnvironment.shared.profileManager
val name = profile.displayName!!
@@ -260,7 +266,13 @@ fun MessageReceiver.handleVisibleMessage(message: VisibleMessage,
var quoteModel: QuoteModel? = null
if (message.quote != null && proto.dataMessage.hasQuote()) {
val quote = proto.dataMessage.quote
val author = Address.fromSerialized(quote.author)
val author = if (quote.author == userBlindedKey) {
Address.fromSerialized(userPublicKey!!)
} else {
Address.fromSerialized(quote.author)
}
val messageDataProvider = MessagingModuleConfiguration.shared.messageDataProvider
val messageInfo = messageDataProvider.getMessageForQuote(quote.id, author)
quoteModel = if (messageInfo != null) {

View File

@@ -134,20 +134,26 @@ class OpenGroupPoller(private val server: String, private val executorService: S
storage.setUserCount(roomToken, server, pollInfo.activeUsers)
// - Moderators
storage.clearGroupMemberRoles(groupId)
pollInfo.details?.moderators?.forEach {
storage.addGroupMemberRole(GroupMember(groupId, it, GroupMemberRole.MODERATOR))
pollInfo.details?.moderators?.let { moderatorList ->
storage.setGroupMemberRoles(moderatorList.map {
GroupMember(groupId, it, GroupMemberRole.MODERATOR)
})
}
pollInfo.details?.hiddenModerators?.forEach {
storage.addGroupMemberRole(GroupMember(groupId, it, GroupMemberRole.HIDDEN_MODERATOR))
pollInfo.details?.hiddenModerators?.let { moderatorList ->
storage.setGroupMemberRoles(moderatorList.map {
GroupMember(groupId, it, GroupMemberRole.HIDDEN_MODERATOR)
})
}
// - Admins
pollInfo.details?.admins?.forEach {
storage.addGroupMemberRole(GroupMember(groupId, it, GroupMemberRole.ADMIN))
pollInfo.details?.admins?.let { moderatorList ->
storage.setGroupMemberRoles(moderatorList.map {
GroupMember(groupId, it, GroupMemberRole.ADMIN)
})
}
pollInfo.details?.hiddenAdmins?.forEach {
storage.addGroupMemberRole(GroupMember(groupId, it, GroupMemberRole.HIDDEN_ADMIN))
pollInfo.details?.hiddenAdmins?.let { moderatorList ->
storage.setGroupMemberRoles(moderatorList.map {
GroupMember(groupId, it, GroupMemberRole.HIDDEN_ADMIN)
})
}
}

View File

@@ -3,7 +3,7 @@ package org.session.libsession.messaging.sending_receiving.quotes
import org.session.libsession.messaging.sending_receiving.attachments.Attachment
import org.session.libsession.utilities.Address
class QuoteModel(val id: Long,
data class QuoteModel(val id: Long,
val author: Address,
val text: String?,
val missing: Boolean,