From 99e9bcb0e8466a8e032df6cdb13009a5374947ee Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Mon, 9 May 2022 18:37:26 +0200 Subject: [PATCH 01/15] add different types of permissions add different types of permissions to Conversation.java and Participant.java (though they are not used yet) For conversation see https://nextcloud-talk.readthedocs.io/en/latest/conversation/#get-user-s-conversations For Participant see https://nextcloud-talk.readthedocs.io/en/latest/participant/#get-list-of-participants-in-a-conversation Signed-off-by: Marcel Hibbe --- .../models/json/conversations/Conversation.java | 13 +++++++++++++ .../talk/models/json/participants/Participant.java | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.java b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.java index 2888d105d..922a522ef 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.java @@ -111,6 +111,19 @@ public class Conversation { @JsonField(name = "notificationCalls") public Integer notificationCalls; + @JsonField(name = "permissions") + public int permissions; + + @JsonField(name = "attendeePermissions") + public int attendeePermissions; + + @JsonField(name = "callPermissions") + public int callPermissions; + + @JsonField(name = "defaultPermissions") + public int defaultPermissions; + + public boolean isPublic() { return (ConversationType.ROOM_PUBLIC_CALL.equals(type)); } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java b/app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java index 9465e0936..8dafe049d 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java @@ -87,6 +87,12 @@ public class Participant { @JsonField(name = "statusMessage") public String statusMessage; + @JsonField(name = "permissions") + public int permissions; + + @JsonField(name = "attendeePermissions") + public int attendeePermissions; + public String source; public boolean selected; From d9d6af2b99869802305482e525e436a6ca6dd5d7 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 10 May 2022 14:11:39 +0200 Subject: [PATCH 02/15] add util for permissions util uses bitwise operations to access every single permission via variable Signed-off-by: Marcel Hibbe --- .../talk/utils/AttendeePermissionsUtil.kt | 42 +++++++++++++++++++ .../talk/utils/AttendeePermissionsUtilTest.kt | 27 ++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt create mode 100644 app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt diff --git a/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt b/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt new file mode 100644 index 000000000..b21da74fe --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt @@ -0,0 +1,42 @@ +package com.nextcloud.talk.utils + +/** + * see https://nextcloud-talk.readthedocs.io/en/latest/constants/#attendee-permissions + */ +class AttendeePermissionsUtil(flag: Int) { + + var isDefault: Boolean = false + var isCustom: Boolean = false + var canStartCall: Boolean = false + var canJoinCall: Boolean = false + var canIgnoreLobby: Boolean = false + var canPublishAudio: Boolean = false + var canPublishVideo: Boolean = false + var canPublishScreen: Boolean = false + var canPostChatShareItemsDoReaction: Boolean = false + + init { + isDefault = (flag and DEFAULT) == DEFAULT + isCustom = (flag and CUSTOM) == CUSTOM + canStartCall = (flag and START_CALL) == START_CALL + canJoinCall = (flag and JOIN_CALL) == JOIN_CALL + canIgnoreLobby = (flag and CAN_IGNORE_LOBBY) == CAN_IGNORE_LOBBY + canPublishAudio = (flag and PUBLISH_AUDIO) == PUBLISH_AUDIO + canPublishVideo = (flag and PUBLISH_VIDEO) == PUBLISH_VIDEO + canPublishScreen = (flag and PUBLISH_SCREEN) == PUBLISH_SCREEN + canPostChatShareItemsDoReaction = + (flag and POST_CHAT_SHARE_ITEMS_DO_REACTIONS) == POST_CHAT_SHARE_ITEMS_DO_REACTIONS + } + + companion object { + const val DEFAULT = 0 + const val CUSTOM = 1 + const val START_CALL = 2 + const val JOIN_CALL = 4 + const val CAN_IGNORE_LOBBY = 8 + const val PUBLISH_AUDIO = 16 + const val PUBLISH_VIDEO = 32 + const val PUBLISH_SCREEN = 64 + const val POST_CHAT_SHARE_ITEMS_DO_REACTIONS = 128 + } +} \ No newline at end of file diff --git a/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt b/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt new file mode 100644 index 000000000..c3dfe268f --- /dev/null +++ b/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt @@ -0,0 +1,27 @@ +package com.nextcloud.talk.utils + +import junit.framework.TestCase +import org.junit.Test + +class AttendeePermissionsUtilTest : TestCase() { + + @Test + fun test_areFlagsSet() { + val attendeePermissionsUtil = AttendeePermissionsUtil( + AttendeePermissionsUtil.PUBLISH_SCREEN + or AttendeePermissionsUtil.JOIN_CALL + or AttendeePermissionsUtil.DEFAULT) + + assert(attendeePermissionsUtil.canPublishScreen) + assert(attendeePermissionsUtil.canJoinCall) + assert(attendeePermissionsUtil.isDefault) // if AttendeePermissionsUtil.DEFAULT is not set with setFlags and + // checked with assertFalse, the logic fails somehow?! + + assertFalse(attendeePermissionsUtil.isCustom) + assertFalse(attendeePermissionsUtil.canStartCall) + assertFalse(attendeePermissionsUtil.canIgnoreLobby) + assertFalse(attendeePermissionsUtil.canPublishAudio) + assertFalse(attendeePermissionsUtil.canPublishVideo) + assertFalse(attendeePermissionsUtil.canPostChatShareItemsDoReaction) + } +} \ No newline at end of file From cc6f582ee2ce91c173a2ded16504ea9ab05ff211 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 10 May 2022 15:28:58 +0200 Subject: [PATCH 03/15] check capability and permission to delete message Signed-off-by: Marcel Hibbe --- .../nextcloud/talk/controllers/ChatController.kt | 3 +++ .../talk/utils/AttendeePermissionsUtil.kt | 15 +++++++++++++-- .../talk/utils/AttendeePermissionsUtilTest.kt | 3 ++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 9b7b457ff..10d395472 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -147,6 +147,7 @@ import com.nextcloud.talk.ui.dialog.ShowReactionsDialog import com.nextcloud.talk.ui.recyclerview.MessageSwipeActions import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.utils.AttendeePermissionsUtil import com.nextcloud.talk.utils.ConductorRemapping import com.nextcloud.talk.utils.ConductorRemapping.remapChatController import com.nextcloud.talk.utils.ContactUtils @@ -2831,6 +2832,8 @@ class ChatController(args: Bundle) : if (!CapabilitiesUtil.hasSpreedFeatureCapability(conversationUser, "delete-messages")) return false + if (AttendeePermissionsUtil(currentConversation!!.permissions).canPostChatShareItemsDoReaction(conversationUser)) return true + return true } diff --git a/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt b/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt index b21da74fe..61f8a5491 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt @@ -1,10 +1,12 @@ package com.nextcloud.talk.utils +import com.nextcloud.talk.models.database.CapabilitiesUtil +import com.nextcloud.talk.models.database.UserEntity + /** * see https://nextcloud-talk.readthedocs.io/en/latest/constants/#attendee-permissions */ class AttendeePermissionsUtil(flag: Int) { - var isDefault: Boolean = false var isCustom: Boolean = false var canStartCall: Boolean = false @@ -13,7 +15,7 @@ class AttendeePermissionsUtil(flag: Int) { var canPublishAudio: Boolean = false var canPublishVideo: Boolean = false var canPublishScreen: Boolean = false - var canPostChatShareItemsDoReaction: Boolean = false + private var canPostChatShareItemsDoReaction: Boolean = false init { isDefault = (flag and DEFAULT) == DEFAULT @@ -28,7 +30,16 @@ class AttendeePermissionsUtil(flag: Int) { (flag and POST_CHAT_SHARE_ITEMS_DO_REACTIONS) == POST_CHAT_SHARE_ITEMS_DO_REACTIONS } + fun canPostChatShareItemsDoReaction(user: UserEntity): Boolean { + if (CapabilitiesUtil.hasSpreedFeatureCapability(user, "chat-permission")) { + return canPostChatShareItemsDoReaction + } + // if capability is not available the spreed version doesn't support to restrict this + return true + } + companion object { + val TAG = AttendeePermissionsUtil::class.simpleName const val DEFAULT = 0 const val CUSTOM = 1 const val START_CALL = 2 diff --git a/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt b/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt index c3dfe268f..9ac9e23ab 100644 --- a/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt +++ b/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt @@ -22,6 +22,7 @@ class AttendeePermissionsUtilTest : TestCase() { assertFalse(attendeePermissionsUtil.canIgnoreLobby) assertFalse(attendeePermissionsUtil.canPublishAudio) assertFalse(attendeePermissionsUtil.canPublishVideo) - assertFalse(attendeePermissionsUtil.canPostChatShareItemsDoReaction) + + // canPostChatShareItemsDoReaction() is not possible to test because userEntity is necessary } } \ No newline at end of file From 7cf18923b59d630d8d6694c73d33218a6f7d943d Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 10 May 2022 16:08:18 +0200 Subject: [PATCH 04/15] add check if delete message is allowed to be executed Signed-off-by: Marcel Hibbe --- .../talk/controllers/ChatController.kt | 88 +++++++++++-------- .../talk/utils/AttendeePermissionsUtil.kt | 2 +- 2 files changed, 50 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 10d395472..8c55ab763 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -2513,50 +2513,60 @@ class ChatController(args: Bundle) : } fun deleteMessage(message: IMessage?) { - var apiVersion = 1 - // FIXME Fix API checking with guests? - if (conversationUser != null) { - apiVersion = ApiUtils.getChatApiVersion(conversationUser, intArrayOf(1)) - } - - ncApi?.deleteChatMessage( - credentials, - ApiUtils.getUrlForChatMessage( - apiVersion, - conversationUser?.baseUrl, - roomToken, - message?.id + if (!AttendeePermissionsUtil(currentConversation!!.permissions) + .canPostChatShareItemsDoReaction(conversationUser!!) + ) { + Log.e( + TAG, "Deletion of message is skipped because of restrictions by permissions. " + + "This method should not have been called!" ) - )?.subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(object : Observer { - override fun onSubscribe(d: Disposable) { - // unused atm - } + Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() + } else { + var apiVersion = 1 + // FIXME Fix API checking with guests? + if (conversationUser != null) { + apiVersion = ApiUtils.getChatApiVersion(conversationUser, intArrayOf(1)) + } - override fun onNext(t: ChatOverallSingleMessage) { - if (t.ocs.meta.statusCode == HttpURLConnection.HTTP_ACCEPTED) { - Toast.makeText( - context, R.string.nc_delete_message_leaked_to_matterbridge, - Toast.LENGTH_LONG - ).show() + ncApi?.deleteChatMessage( + credentials, + ApiUtils.getUrlForChatMessage( + apiVersion, + conversationUser?.baseUrl, + roomToken, + message?.id + ) + )?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(object : Observer { + override fun onSubscribe(d: Disposable) { + // unused atm } - } - override fun onError(e: Throwable) { - Log.e( - TAG, - "Something went wrong when trying to delete message with id " + - message?.id, - e - ) - Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() - } + override fun onNext(t: ChatOverallSingleMessage) { + if (t.ocs.meta.statusCode == HttpURLConnection.HTTP_ACCEPTED) { + Toast.makeText( + context, R.string.nc_delete_message_leaked_to_matterbridge, + Toast.LENGTH_LONG + ).show() + } + } - override fun onComplete() { - // unused atm - } - }) + override fun onError(e: Throwable) { + Log.e( + TAG, + "Something went wrong when trying to delete message with id " + + message?.id, + e + ) + Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() + } + + override fun onComplete() { + // unused atm + } + }) + } } fun replyPrivately(message: IMessage?) { diff --git a/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt b/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt index 61f8a5491..60fcdf304 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt @@ -34,7 +34,7 @@ class AttendeePermissionsUtil(flag: Int) { if (CapabilitiesUtil.hasSpreedFeatureCapability(user, "chat-permission")) { return canPostChatShareItemsDoReaction } - // if capability is not available the spreed version doesn't support to restrict this + // if capability is not available then the spreed version doesn't support to restrict this return true } From bae65ebbe9022480b70ca96ef787099cccc91a5c Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 10 May 2022 16:51:47 +0200 Subject: [PATCH 05/15] rename canPostChatShareItemsDoReaction to hasChatPermission Signed-off-by: Marcel Hibbe --- .../talk/controllers/ChatController.kt | 31 ++++++++++++++----- .../talk/utils/AttendeePermissionsUtil.kt | 11 +++---- .../talk/utils/AttendeePermissionsUtilTest.kt | 2 +- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 8c55ab763..cd57dd912 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -274,6 +274,8 @@ class ChatController(args: Bundle) : lateinit var mediaPlayerHandler: Handler var currentlyPlayedVoiceMessage: ChatMessage? = null + var hasChatPermission: Boolean = false + init { Log.d(TAG, "init ChatController: " + System.identityHashCode(this).toString()) @@ -307,6 +309,9 @@ class ChatController(args: Bundle) : } this.voiceOnly = args.getBoolean(BundleKeys.KEY_CALL_VOICE_ONLY, false) + + hasChatPermission = + AttendeePermissionsUtil(currentConversation!!.permissions).hasChatPermission(conversationUser) } private fun getRoomInfo() { @@ -342,7 +347,8 @@ class ChatController(args: Bundle) : setTitle() try { setupMentionAutocomplete() - checkReadOnlyState() + checkShowCallButtons() + checkShowMessageInputView() checkLobbyState() if (!inConversation) { @@ -1159,13 +1165,24 @@ class ChatController(args: Bundle) : ) } - private fun checkReadOnlyState() { + private fun checkShowCallButtons() { if (isAlive()) { if (isReadOnlyConversation() || shouldShowLobby()) { disableCallButtons() - binding.messageInputView.visibility = View.GONE } else { enableCallButtons() + } + } + } + + private fun checkShowMessageInputView() { + if (isAlive()) { + if (isReadOnlyConversation() + || shouldShowLobby() + || !hasChatPermission + ) { + binding.messageInputView.visibility = View.GONE + } else { binding.messageInputView.visibility = View.VISIBLE } } @@ -2350,7 +2367,7 @@ class ChatController(args: Bundle) : super.onPrepareOptionsMenu(menu) conversationUser?.let { if (CapabilitiesUtil.hasSpreedFeatureCapability(it, "read-only-rooms")) { - checkReadOnlyState() + checkShowCallButtons() } } } @@ -2513,9 +2530,7 @@ class ChatController(args: Bundle) : } fun deleteMessage(message: IMessage?) { - if (!AttendeePermissionsUtil(currentConversation!!.permissions) - .canPostChatShareItemsDoReaction(conversationUser!!) - ) { + if (!hasChatPermission) { Log.e( TAG, "Deletion of message is skipped because of restrictions by permissions. " + "This method should not have been called!" @@ -2842,7 +2857,7 @@ class ChatController(args: Bundle) : if (!CapabilitiesUtil.hasSpreedFeatureCapability(conversationUser, "delete-messages")) return false - if (AttendeePermissionsUtil(currentConversation!!.permissions).canPostChatShareItemsDoReaction(conversationUser)) return true + if (!hasChatPermission) return false return true } diff --git a/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt b/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt index 60fcdf304..b7b431deb 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt @@ -15,7 +15,7 @@ class AttendeePermissionsUtil(flag: Int) { var canPublishAudio: Boolean = false var canPublishVideo: Boolean = false var canPublishScreen: Boolean = false - private var canPostChatShareItemsDoReaction: Boolean = false + private var hasChatPermission: Boolean = false init { isDefault = (flag and DEFAULT) == DEFAULT @@ -26,13 +26,12 @@ class AttendeePermissionsUtil(flag: Int) { canPublishAudio = (flag and PUBLISH_AUDIO) == PUBLISH_AUDIO canPublishVideo = (flag and PUBLISH_VIDEO) == PUBLISH_VIDEO canPublishScreen = (flag and PUBLISH_SCREEN) == PUBLISH_SCREEN - canPostChatShareItemsDoReaction = - (flag and POST_CHAT_SHARE_ITEMS_DO_REACTIONS) == POST_CHAT_SHARE_ITEMS_DO_REACTIONS + hasChatPermission = (flag and CHAT) == CHAT } - fun canPostChatShareItemsDoReaction(user: UserEntity): Boolean { + fun hasChatPermission(user: UserEntity): Boolean { if (CapabilitiesUtil.hasSpreedFeatureCapability(user, "chat-permission")) { - return canPostChatShareItemsDoReaction + return hasChatPermission } // if capability is not available then the spreed version doesn't support to restrict this return true @@ -48,6 +47,6 @@ class AttendeePermissionsUtil(flag: Int) { const val PUBLISH_AUDIO = 16 const val PUBLISH_VIDEO = 32 const val PUBLISH_SCREEN = 64 - const val POST_CHAT_SHARE_ITEMS_DO_REACTIONS = 128 + const val CHAT = 128 } } \ No newline at end of file diff --git a/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt b/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt index 9ac9e23ab..bd9d29aa7 100644 --- a/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt +++ b/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt @@ -23,6 +23,6 @@ class AttendeePermissionsUtilTest : TestCase() { assertFalse(attendeePermissionsUtil.canPublishAudio) assertFalse(attendeePermissionsUtil.canPublishVideo) - // canPostChatShareItemsDoReaction() is not possible to test because userEntity is necessary + // hasChatPermission() is not possible to test because userEntity is necessary } } \ No newline at end of file From 36383dfcc6a4672233614f24d79431ad23c49603 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 10 May 2022 17:07:56 +0200 Subject: [PATCH 06/15] don't allow to post/delete reaction without permission Signed-off-by: Marcel Hibbe --- .../java/com/nextcloud/talk/controllers/ChatController.kt | 2 ++ .../com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt | 8 +++++--- .../com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index cd57dd912..70e999f8c 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -2492,6 +2492,7 @@ class ChatController(args: Bundle) : currentConversation, chatMessage, conversationUser, + hasChatPermission, ncApi!! ).show() } @@ -2519,6 +2520,7 @@ class ChatController(args: Bundle) : conversationUser, currentConversation, isShowMessageDeletionButton(message), + hasChatPermission, ncApi!! ).show() } diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt index da085c583..38ffb2a8d 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt @@ -58,6 +58,7 @@ class MessageActionsDialog( private val user: UserEntity?, private val currentConversation: Conversation?, private val showMessageDeletionButton: Boolean, + private val hasChatPermission: Boolean, private val ncApi: NcApi ) : BottomSheetDialog(chatController.activity!!, R.style.BottomSheetDialogThemeNoFloating) { @@ -71,7 +72,7 @@ class MessageActionsDialog( setContentView(dialogMessageActionsBinding.root) window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) - initEmojiBar() + initEmojiBar(hasChatPermission) initMenuItemCopy(!message.isDeleted) initMenuReplyToMessage(message.replyable) initMenuReplyPrivately( @@ -160,8 +161,9 @@ class MessageActionsDialog( } } - private fun initEmojiBar() { - if (CapabilitiesUtil.hasSpreedFeatureCapability(user, "reactions") && + private fun initEmojiBar(hasChatPermission: Boolean) { + if (hasChatPermission && + CapabilitiesUtil.hasSpreedFeatureCapability(user, "reactions") && Conversation.ConversationReadOnlyState.CONVERSATION_READ_ONLY != currentConversation?.conversationReadOnlyState && isReactableMessageType(message) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt index a9711ec24..d28fb9220 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt @@ -63,6 +63,7 @@ class ShowReactionsDialog( private val currentConversation: Conversation?, private val chatMessage: ChatMessage, private val userEntity: UserEntity?, + private val hasChatPermission: Boolean, private val ncApi: NcApi ) : BottomSheetDialog(activity), ReactionItemClickListener { @@ -183,7 +184,7 @@ class ShowReactionsDialog( } override fun onClick(reactionItem: ReactionItem) { - if (reactionItem.reactionVoter.actorId?.equals(userEntity?.userId) == true) { + if (hasChatPermission && reactionItem.reactionVoter.actorId?.equals(userEntity?.userId) == true) { deleteReaction(chatMessage, reactionItem.reaction!!) dismiss() } From 96721a2df6413c3438b3f9895c34a3cf465471e9 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 10 May 2022 17:48:08 +0200 Subject: [PATCH 07/15] delete parsing of unused permissions add getter,setter,hashCode,toString for "permissions" in Conversation.java Signed-off-by: Marcel Hibbe --- .../json/conversations/Conversation.java | 22 ++++++++++--------- .../models/json/participants/Participant.java | 6 ----- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.java b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.java index 922a522ef..13bd0f41c 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.java @@ -114,16 +114,6 @@ public class Conversation { @JsonField(name = "permissions") public int permissions; - @JsonField(name = "attendeePermissions") - public int attendeePermissions; - - @JsonField(name = "callPermissions") - public int callPermissions; - - @JsonField(name = "defaultPermissions") - public int defaultPermissions; - - public boolean isPublic() { return (ConversationType.ROOM_PUBLIC_CALL.equals(type)); } @@ -294,6 +284,10 @@ public class Conversation { public Integer getNotificationCalls() { return notificationCalls; } + public int getPermissions() { + return permissions; + } + public void setRoomId(String roomId) { this.roomId = roomId; } @@ -411,6 +405,9 @@ public class Conversation { this.unreadMentionDirect = unreadMentionDirect; } + public void setPermissions(int permissions) { + this.permissions = permissions; + } @Override public boolean equals(Object o) { @@ -513,6 +510,9 @@ public class Conversation { if (!Objects.equals(notificationCalls, that.notificationCalls)) { return false; } + if (permissions != that.permissions) { + return false; + } return Objects.equals(canDeleteConversation, that.canDeleteConversation); } @@ -553,6 +553,7 @@ public class Conversation { result = 31 * result + (canLeaveConversation != null ? canLeaveConversation.hashCode() : 0); result = 31 * result + (canDeleteConversation != null ? canDeleteConversation.hashCode() : 0); result = 31 * result + (notificationCalls != null ? notificationCalls.hashCode() : 0); + result = 31 * result + permissions; return result; } @@ -590,6 +591,7 @@ public class Conversation { ", canLeaveConversation=" + canLeaveConversation + ", canDeleteConversation=" + canDeleteConversation + ", notificationCalls=" + notificationCalls + + ", permissions=" + permissions + '}'; } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java b/app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java index 8dafe049d..9465e0936 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java @@ -87,12 +87,6 @@ public class Participant { @JsonField(name = "statusMessage") public String statusMessage; - @JsonField(name = "permissions") - public int permissions; - - @JsonField(name = "attendeePermissions") - public int attendeePermissions; - public String source; public boolean selected; From b603031011c5fef7f1bfceb6f275e2fde0017566 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 10 May 2022 18:08:07 +0200 Subject: [PATCH 08/15] hide "reply" and "forward" when chatPermission is missing "forward" is also hidden because this would need bigger changes regarding the state of the hasChatPermission variable inside the ChatController.kt Signed-off-by: Marcel Hibbe --- .../java/com/nextcloud/talk/controllers/ChatController.kt | 2 +- .../com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 70e999f8c..2d67c5b12 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -587,7 +587,7 @@ class ChatController(args: Bundle) : } } - if (context != null) { + if (context != null && hasChatPermission && !isReadOnlyConversation()) { val messageSwipeController = MessageSwipeCallback( activity!!, object : MessageSwipeActions { diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt index 38ffb2a8d..44f0e0130 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt @@ -74,7 +74,7 @@ class MessageActionsDialog( initEmojiBar(hasChatPermission) initMenuItemCopy(!message.isDeleted) - initMenuReplyToMessage(message.replyable) + initMenuReplyToMessage(message.replyable && hasChatPermission) initMenuReplyPrivately( message.replyable && hasUserId(user) && @@ -83,7 +83,8 @@ class MessageActionsDialog( ) initMenuDeleteMessage(showMessageDeletionButton) initMenuForwardMessage( - ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getMessageType() && + hasChatPermission && + ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getMessageType() && !(message.isDeletedCommentMessage || message.isDeleted) ) initMenuMarkAsUnread( From be29459955233a51f5202b0e6971cc7746b695d0 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 10 May 2022 18:21:07 +0200 Subject: [PATCH 09/15] fix klint warnings Signed-off-by: Marcel Hibbe --- .../talk/controllers/ChatController.kt | 9 +++-- .../talk/utils/AttendeePermissionsUtil.kt | 22 ++++++++++- .../talk/utils/AttendeePermissionsUtilTest.kt | 37 ++++++++++++++----- 3 files changed, 54 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 2d67c5b12..537de9726 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -1177,9 +1177,9 @@ class ChatController(args: Bundle) : private fun checkShowMessageInputView() { if (isAlive()) { - if (isReadOnlyConversation() - || shouldShowLobby() - || !hasChatPermission + if (isReadOnlyConversation() || + shouldShowLobby() || + !hasChatPermission ) { binding.messageInputView.visibility = View.GONE } else { @@ -2534,7 +2534,8 @@ class ChatController(args: Bundle) : fun deleteMessage(message: IMessage?) { if (!hasChatPermission) { Log.e( - TAG, "Deletion of message is skipped because of restrictions by permissions. " + + TAG, + "Deletion of message is skipped because of restrictions by permissions. " + "This method should not have been called!" ) Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() diff --git a/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt b/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt index b7b431deb..e1e291b6f 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/AttendeePermissionsUtil.kt @@ -1,3 +1,23 @@ +/* + * Nextcloud Talk application + * + * @author Marcel Hibbe + * Copyright (C) 2022 Marcel Hibbe + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package com.nextcloud.talk.utils import com.nextcloud.talk.models.database.CapabilitiesUtil @@ -49,4 +69,4 @@ class AttendeePermissionsUtil(flag: Int) { const val PUBLISH_SCREEN = 64 const val CHAT = 128 } -} \ No newline at end of file +} diff --git a/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt b/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt index bd9d29aa7..6ce41bd3c 100644 --- a/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt +++ b/app/src/test/java/com/nextcloud/talk/utils/AttendeePermissionsUtilTest.kt @@ -1,3 +1,23 @@ +/* + * Nextcloud Talk application + * + * @author Marcel Hibbe + * Copyright (C) 2022 Marcel Hibbe + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package com.nextcloud.talk.utils import junit.framework.TestCase @@ -7,22 +27,21 @@ class AttendeePermissionsUtilTest : TestCase() { @Test fun test_areFlagsSet() { - val attendeePermissionsUtil = AttendeePermissionsUtil( - AttendeePermissionsUtil.PUBLISH_SCREEN - or AttendeePermissionsUtil.JOIN_CALL - or AttendeePermissionsUtil.DEFAULT) + val attendeePermissionsUtil = + AttendeePermissionsUtil( + AttendeePermissionsUtil.PUBLISH_SCREEN or + AttendeePermissionsUtil.JOIN_CALL or + AttendeePermissionsUtil.DEFAULT + ) assert(attendeePermissionsUtil.canPublishScreen) assert(attendeePermissionsUtil.canJoinCall) - assert(attendeePermissionsUtil.isDefault) // if AttendeePermissionsUtil.DEFAULT is not set with setFlags and - // checked with assertFalse, the logic fails somehow?! + assert(attendeePermissionsUtil.isDefault) assertFalse(attendeePermissionsUtil.isCustom) assertFalse(attendeePermissionsUtil.canStartCall) assertFalse(attendeePermissionsUtil.canIgnoreLobby) assertFalse(attendeePermissionsUtil.canPublishAudio) assertFalse(attendeePermissionsUtil.canPublishVideo) - - // hasChatPermission() is not possible to test because userEntity is necessary } -} \ No newline at end of file +} From 7c4e7c22dfabf3a740f0f8e932cb15c0de6b4f81 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Wed, 11 May 2022 09:59:40 +0200 Subject: [PATCH 10/15] update permissions in getRoomInfo so they are updated on the fly.. Signed-off-by: Marcel Hibbe --- .../java/com/nextcloud/talk/controllers/ChatController.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 537de9726..2d4b2fbc1 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -343,8 +343,11 @@ class ChatController(args: Bundle) : " sessionId: " + currentConversation?.sessionId ) loadAvatarForStatusBar() - setTitle() + + hasChatPermission = + AttendeePermissionsUtil(currentConversation!!.permissions).hasChatPermission(conversationUser) + try { setupMentionAutocomplete() checkShowCallButtons() From d76e833d7431850d1ff7a2c89845ba58b7f3cb46 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Wed, 11 May 2022 16:06:57 +0200 Subject: [PATCH 11/15] fix to show share-to screen fix to show share-to screen another time when sending was not confirmed. Signed-off-by: Marcel Hibbe --- .../talk/controllers/ConversationsListController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index f2732e726..8779a67c5 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -930,7 +930,8 @@ public class ConversationsListController extends BaseController implements Searc .setNegativeButton(R.string.nc_no, new View.OnClickListener() { @Override public void onClick(View v) { - Log.d(TAG, "sharing files aborted"); + Log.d(TAG, "sharing files aborted, going back to share-to screen"); + showShareToScreen = true; } }) .show(); From 8b3d32584ce9c0a0169e0f3cc93a63cec2238829 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Wed, 11 May 2022 16:12:19 +0200 Subject: [PATCH 12/15] restrict to share content without permissions Signed-off-by: Marcel Hibbe --- .../talk/controllers/ChatController.kt | 10 ++++++- .../ConversationsListController.java | 27 +++++++++++++++---- app/src/main/res/values/strings.xml | 2 ++ 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 2d4b2fbc1..caa519d79 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -346,7 +346,9 @@ class ChatController(args: Bundle) : setTitle() hasChatPermission = - AttendeePermissionsUtil(currentConversation!!.permissions).hasChatPermission(conversationUser) + AttendeePermissionsUtil(currentConversation!!.permissions).hasChatPermission( + conversationUser + ) try { setupMentionAutocomplete() @@ -1458,6 +1460,12 @@ class ChatController(args: Bundle) : private fun uploadFiles(files: MutableList, isVoiceMessage: Boolean) { var metaData = "" + + if (!hasChatPermission) { + Log.e(TAG, "uploading file(s) is forbidden because of missing attendee permissions") + return + } + if (isVoiceMessage) { metaData = VOICE_MESSAGE_META_DATA } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index 8779a67c5..4d0f893a5 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -86,6 +86,7 @@ import com.nextcloud.talk.models.json.statuses.StatusesOverall; import com.nextcloud.talk.ui.dialog.ChooseAccountDialogFragment; import com.nextcloud.talk.ui.dialog.ConversationsListBottomDialog; import com.nextcloud.talk.utils.ApiUtils; +import com.nextcloud.talk.utils.AttendeePermissionsUtil; import com.nextcloud.talk.utils.ClosedInterfaceImpl; import com.nextcloud.talk.utils.ConductorRemapping; import com.nextcloud.talk.utils.DisplayUtils; @@ -359,7 +360,6 @@ public class ConversationsListController extends BaseController implements Searc showShareToScreen = !showShareToScreen && hasActivityActionSendIntent(); - if (showShareToScreen) { hideSearchBar(); getActionBar().setTitle(R.string.send_to_three_dots); @@ -867,13 +867,25 @@ public class ConversationsListController extends BaseController implements Searc public boolean onItemClick(View view, int position) { try { selectedConversation = ((ConversationItem) Objects.requireNonNull(adapter.getItem(position))).getModel(); + if (selectedConversation != null && getActivity() != null) { + boolean hasChatPermission = + new AttendeePermissionsUtil(selectedConversation.permissions).hasChatPermission(currentUser); + if (showShareToScreen) { - handleSharedData(); - showShareToScreen = false; + if (hasChatPermission && !isReadOnlyConversation(selectedConversation)) { + handleSharedData(); + showShareToScreen = false; + } else { + Toast.makeText(context, R.string.send_to_forbidden, Toast.LENGTH_LONG).show(); + } } else if (forwardMessage) { - openConversation(bundle.getString(BundleKeys.INSTANCE.getKEY_FORWARD_MSG_TEXT())); - forwardMessage = false; + if (hasChatPermission && !isReadOnlyConversation(selectedConversation)) { + openConversation(bundle.getString(BundleKeys.INSTANCE.getKEY_FORWARD_MSG_TEXT())); + forwardMessage = false; + } else { + Toast.makeText(context, R.string.send_to_forbidden, Toast.LENGTH_LONG).show(); + } } else { openConversation(); } @@ -885,6 +897,11 @@ public class ConversationsListController extends BaseController implements Searc return true; } + private Boolean isReadOnlyConversation(Conversation conversation) { + return conversation.conversationReadOnlyState == + Conversation.ConversationReadOnlyState.CONVERSATION_READ_ONLY; + } + private void handleSharedData() { collectDataFromIntent(); if (!textToPaste.isEmpty()) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ba1df70e9..b94aa7bd1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -392,6 +392,8 @@ Send to … Sharing files from storage is not possible without permissions Open in Files app + You are not allowed to share content to this chat + Add to conversation From a1b7a52b241cae5a27c142931371eac39409777c Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 12 May 2022 13:43:44 +0200 Subject: [PATCH 13/15] set log level of permission checks to "warning" Signed-off-by: Marcel Hibbe --- .../java/com/nextcloud/talk/controllers/ChatController.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index caa519d79..44f378e33 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -1462,7 +1462,7 @@ class ChatController(args: Bundle) : var metaData = "" if (!hasChatPermission) { - Log.e(TAG, "uploading file(s) is forbidden because of missing attendee permissions") + Log.w(TAG, "uploading file(s) is forbidden because of missing attendee permissions") return } @@ -2544,7 +2544,7 @@ class ChatController(args: Bundle) : fun deleteMessage(message: IMessage?) { if (!hasChatPermission) { - Log.e( + Log.w( TAG, "Deletion of message is skipped because of restrictions by permissions. " + "This method should not have been called!" From 681dbfa02542af74288a3058d2eafbf72071c9fb Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 12 May 2022 14:18:27 +0200 Subject: [PATCH 14/15] allow to show "forward" option in chats with restricted permission this reverts one condition from commit b603031. I can't think about any reason why "forward" should be hidden. Signed-off-by: Marcel Hibbe --- .../java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt index 44f0e0130..3090858ed 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt @@ -83,8 +83,7 @@ class MessageActionsDialog( ) initMenuDeleteMessage(showMessageDeletionButton) initMenuForwardMessage( - hasChatPermission && - ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getMessageType() && + ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getMessageType() && !(message.isDeletedCommentMessage || message.isDeleted) ) initMenuMarkAsUnread( From 729e30d25b50214c7ae3ad279bd31b59b1b2602f Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 12 May 2022 14:44:33 +0200 Subject: [PATCH 15/15] use "return when" in isShowMessageDeletionButton() Signed-off-by: Marcel Hibbe --- .../talk/controllers/ChatController.kt | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 44f378e33..4bec27819 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -2849,31 +2849,27 @@ class ChatController(args: Bundle) : private fun isShowMessageDeletionButton(message: ChatMessage): Boolean { if (conversationUser == null) return false - if (message.systemMessageType != ChatMessage.SystemMessageType.DUMMY) return false - - if (message.isDeleted) return false - - if (message.hasFileAttachment()) return false - - if (OBJECT_MESSAGE.equals(message.message)) return false - - val isOlderThanSixHours = message - .createdAt - ?.before(Date(System.currentTimeMillis() - AGE_THREHOLD_FOR_DELETE_MESSAGE)) == true - if (isOlderThanSixHours) return false - val isUserAllowedByPrivileges = if (message.actorId == conversationUser.userId) { true } else { currentConversation!!.canModerate(conversationUser) } - if (!isUserAllowedByPrivileges) return false - if (!CapabilitiesUtil.hasSpreedFeatureCapability(conversationUser, "delete-messages")) return false + val isOlderThanSixHours = message + .createdAt + ?.before(Date(System.currentTimeMillis() - AGE_THREHOLD_FOR_DELETE_MESSAGE)) == true - if (!hasChatPermission) return false - - return true + return when { + !isUserAllowedByPrivileges -> false + isOlderThanSixHours -> false + message.systemMessageType != ChatMessage.SystemMessageType.DUMMY -> false + message.isDeleted -> false + message.hasFileAttachment() -> false + OBJECT_MESSAGE == message.message -> false + !CapabilitiesUtil.hasSpreedFeatureCapability(conversationUser, "delete-messages") -> false + !hasChatPermission -> false + else -> true + } } override fun hasContentFor(message: ChatMessage, type: Byte): Boolean {