From 29124f36b693b3e161557349947197e887541ddb Mon Sep 17 00:00:00 2001 From: Harris Date: Tue, 13 Sep 2022 14:15:35 +1000 Subject: [PATCH 1/2] Fix improperly caching `notifyType` on `Recipient`s (#965) * fix: perform clear member roles before setting new roles to clear out old members * fix: hopefully add somewhere notifyType wasn't being carried over fixes #945 --- .../securesms/database/GroupMemberDatabase.kt | 14 +++++++++++++- .../org/thoughtcrime/securesms/database/Storage.kt | 6 +++++- .../session/libsession/database/StorageProtocol.kt | 3 ++- .../sending_receiving/pollers/OpenGroupPoller.kt | 10 ++++++---- .../libsession/utilities/recipients/Recipient.java | 1 + 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupMemberDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/GroupMemberDatabase.kt index 878b8a1c09..ce2e2eba8d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupMemberDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupMemberDatabase.kt @@ -3,9 +3,9 @@ package org.thoughtcrime.securesms.database import android.content.ContentValues import android.content.Context import android.database.Cursor -import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper import org.session.libsession.messaging.open_groups.GroupMember import org.session.libsession.messaging.open_groups.GroupMemberRole +import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper class GroupMemberDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(context, helper) { @@ -69,4 +69,16 @@ class GroupMemberDatabase(context: Context, helper: SQLCipherOpenHelper) : Datab } } + fun clearGroupMemberRoles(groupId: String) { + writableDatabase.beginTransaction() + try { + val query = "$GROUP_ID = ?" + val args = arrayOf(groupId) + writableDatabase.delete(TABLE_NAME, query, args) + writableDatabase.setTransactionSuccessful() + } finally { + writableDatabase.endTransaction() + } + } + } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index ef14ed83e4..9c2cf5e9d8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -324,7 +324,11 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, return getAllOpenGroups().values.firstOrNull { it.server == server && it.room == room } } - override fun addGroupMember(member: GroupMember) { + override fun clearGroupMemberRoles(groupId: String) { + DatabaseComponent.get(context).groupMemberDatabase().clearGroupMemberRoles(groupId) + } + + override fun addGroupMemberRole(member: GroupMember) { DatabaseComponent.get(context).groupMemberDatabase().addGroupMember(member) } diff --git a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt index 8d9273a063..7dbea4deb5 100644 --- a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt +++ b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt @@ -71,7 +71,8 @@ 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 addGroupMember(member: GroupMember) + fun addGroupMemberRole(member: GroupMember) + fun clearGroupMemberRoles(groupId: String) // Open Group Public Keys fun getOpenGroupPublicKey(server: String): String? diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPoller.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPoller.kt index 5a681594d0..7bb00f8f35 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPoller.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPoller.kt @@ -134,18 +134,20 @@ 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.addGroupMember(GroupMember(groupId, it, GroupMemberRole.MODERATOR)) + storage.addGroupMemberRole(GroupMember(groupId, it, GroupMemberRole.MODERATOR)) } pollInfo.details?.hiddenModerators?.forEach { - storage.addGroupMember(GroupMember(groupId, it, GroupMemberRole.HIDDEN_MODERATOR)) + storage.addGroupMemberRole(GroupMember(groupId, it, GroupMemberRole.HIDDEN_MODERATOR)) } // - Admins pollInfo.details?.admins?.forEach { - storage.addGroupMember(GroupMember(groupId, it, GroupMemberRole.ADMIN)) + storage.addGroupMemberRole(GroupMember(groupId, it, GroupMemberRole.ADMIN)) } pollInfo.details?.hiddenAdmins?.forEach { - storage.addGroupMember(GroupMember(groupId, it, GroupMemberRole.HIDDEN_ADMIN)) + storage.addGroupMemberRole(GroupMember(groupId, it, GroupMemberRole.HIDDEN_ADMIN)) } } diff --git a/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java b/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java index d6b7938e83..a72c5d2af5 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java +++ b/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java @@ -224,6 +224,7 @@ public class Recipient implements RecipientModifiedListener { Recipient.this.profileSharing = result.profileSharing; Recipient.this.unidentifiedAccessMode = result.unidentifiedAccessMode; Recipient.this.forceSmsSelection = result.forceSmsSelection; + Recipient.this.notifyType = result.notifyType; Recipient.this.participants.clear(); Recipient.this.participants.addAll(result.participants); From bdc4f5aebe0f310161c86dcb379f784d8ec45831 Mon Sep 17 00:00:00 2001 From: Harris Date: Tue, 13 Sep 2022 14:17:47 +1000 Subject: [PATCH 2/2] Fix blinded ID moderator checks in emoji reaction popup (#964) * fix: emoji popup now uses blinded ID as well * fix: add conversation menu handling for ban and delete all actions, as well as add placeholder icons --- .../conversation/v2/ConversationActivityV2.kt | 6 ++++-- .../v2/ConversationReactionDelegate.kt | 6 ++++-- .../v2/ConversationReactionOverlay.java | 15 +++++++++------ .../v2/menus/ConversationMenuItemHelper.kt | 8 ++++---- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index dcf7f11cf6..53562d09a1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -989,7 +989,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe Log.e("Loki", "Failed to show emoji picker", e) return } - ViewUtil.hideKeyboard(this, visibleMessageView); + ViewUtil.hideKeyboard(this, visibleMessageView) binding?.reactionsShade?.isVisible = true showOrHidScrollToBottomButton(false) binding?.conversationRecyclerView?.suppressLayout(true) @@ -1020,7 +1020,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe message.isOutgoing, visibleMessageView.messageContentView ) - reactionDelegate.show(this, message, selectedConversationModel) + reactionDelegate.show(this, message, selectedConversationModel, viewModel.blindedPublicKey) } override fun dispatchTouchEvent(ev: MotionEvent): Boolean { @@ -1802,6 +1802,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe ConversationReactionOverlay.Action.VIEW_INFO -> showMessageDetail(selectedItems) ConversationReactionOverlay.Action.SELECT -> selectMessages(selectedItems) ConversationReactionOverlay.Action.DELETE -> deleteMessages(selectedItems) + ConversationReactionOverlay.Action.BAN_AND_DELETE_ALL -> banAndDeleteAll(selectedItems) + ConversationReactionOverlay.Action.BAN_USER -> banUser(selectedItems) } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationReactionDelegate.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationReactionDelegate.kt index a090462c46..fd77a3bf0f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationReactionDelegate.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationReactionDelegate.kt @@ -27,13 +27,15 @@ internal class ConversationReactionDelegate(private val overlayStub: Stub handleActionItemClicked(Action.COPY_SESSION_ID))); } // Delete message - if (ConversationMenuItemHelper.userCanDeleteSelectedItems(getContext(), message, openGroup, userPublicKey)) { + if (ConversationMenuItemHelper.userCanDeleteSelectedItems(getContext(), message, openGroup, userPublicKey, blindedPublicKey)) { items.add(new ActionItem(R.attr.menu_trash_icon, getContext().getResources().getString(R.string.delete), () -> handleActionItemClicked(Action.DELETE))); } // Ban user - if (ConversationMenuItemHelper.userCanBanSelectedUsers(getContext(), message, openGroup, userPublicKey)) { - items.add(new ActionItem(0, getContext().getResources().getString(R.string.conversation_context__menu_ban_user), () -> handleActionItemClicked(Action.BAN_USER))); + if (ConversationMenuItemHelper.userCanBanSelectedUsers(getContext(), message, openGroup, userPublicKey, blindedPublicKey)) { + items.add(new ActionItem(R.attr.menu_block_icon, getContext().getResources().getString(R.string.conversation_context__menu_ban_user), () -> handleActionItemClicked(Action.BAN_USER))); } // Ban and delete all - if (ConversationMenuItemHelper.userCanBanSelectedUsers(getContext(), message, openGroup, userPublicKey)) { - items.add(new ActionItem(0, getContext().getResources().getString(R.string.conversation_context__menu_ban_and_delete_all), () -> handleActionItemClicked(Action.BAN_AND_DELETE_ALL))); + if (ConversationMenuItemHelper.userCanBanSelectedUsers(getContext(), message, openGroup, userPublicKey, blindedPublicKey)) { + items.add(new ActionItem(R.attr.menu_trash_icon, getContext().getResources().getString(R.string.conversation_context__menu_ban_and_delete_all), () -> handleActionItemClicked(Action.BAN_AND_DELETE_ALL))); } // Message detail if (message.isFailed()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuItemHelper.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuItemHelper.kt index a72ae848fa..ffc36fddf6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuItemHelper.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuItemHelper.kt @@ -8,17 +8,17 @@ import org.thoughtcrime.securesms.groups.OpenGroupManager object ConversationMenuItemHelper { @JvmStatic - fun userCanDeleteSelectedItems(context: Context, message: MessageRecord, openGroup: OpenGroup?, userPublicKey: String): Boolean { + fun userCanDeleteSelectedItems(context: Context, message: MessageRecord, openGroup: OpenGroup?, userPublicKey: String, blindedPublicKey: String?): Boolean { if (openGroup == null) return message.isOutgoing || !message.isOutgoing if (message.isOutgoing) return true - return OpenGroupManager.isUserModerator(context, openGroup.groupId, userPublicKey) + return OpenGroupManager.isUserModerator(context, openGroup.groupId, userPublicKey, blindedPublicKey) } @JvmStatic - fun userCanBanSelectedUsers(context: Context, message: MessageRecord, openGroup: OpenGroup?, userPublicKey: String): Boolean { + fun userCanBanSelectedUsers(context: Context, message: MessageRecord, openGroup: OpenGroup?, userPublicKey: String, blindedPublicKey: String?): Boolean { if (openGroup == null) return false if (message.isOutgoing) return false // Users can't ban themselves - return OpenGroupManager.isUserModerator(context, openGroup.groupId, userPublicKey) + return OpenGroupManager.isUserModerator(context, openGroup.groupId, userPublicKey, blindedPublicKey) } }