From 47863cae3eea8f68f2dd0f96f6a94535e0ebf8ab Mon Sep 17 00:00:00 2001 From: Martin Kraft Date: Tue, 23 Jun 2020 16:09:44 -0400 Subject: [PATCH] MM-11713: Allows edit others posts to function without edit own posts. (#4406) * MM-11713: Allows edit others posts to function without edit own posts. * MM-11713: Switches branching statement to ternary. * MM-11713: Default to false expclicitly. * MM-11713: Uses old logic for server versions prior to v5.26. --- app/mm-redux/utils/post_utils.test.js | 14 +++++++------- app/mm-redux/utils/post_utils.ts | 14 +++++++++++--- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/app/mm-redux/utils/post_utils.test.js b/app/mm-redux/utils/post_utils.test.js index 55cfef27e..99c87409f 100644 --- a/app/mm-redux/utils/post_utils.test.js +++ b/app/mm-redux/utils/post_utils.test.js @@ -135,7 +135,7 @@ describe('PostUtils', () => { const newVersionState = { entities: { general: { - serverVersion: '4.9.0', + serverVersion: '5.26.0', }, users: { currentUserId: userId, @@ -231,8 +231,8 @@ describe('PostUtils', () => { assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: -1}, licensed, teamId, channelId, userId, {user_id: userId})); assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: userId, create_at: Date.now() - 100})); assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: userId, create_at: Date.now() - 6000000})); - assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: -1}, licensed, teamId, channelId, userId, {user_id: 'other'})); - assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: 'other', create_at: Date.now() - 100})); + assert.ok(canEditPost(newVersionState, {PostEditTimeLimit: -1}, licensed, teamId, channelId, userId, {user_id: 'other'})); + assert.ok(canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: 'other', create_at: Date.now() - 100})); assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: 'other', create_at: Date.now() - 6000000})); newVersionState.entities.roles = { @@ -245,8 +245,8 @@ describe('PostUtils', () => { assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: -1}, licensed, teamId, channelId, userId, {user_id: userId})); assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: userId, create_at: Date.now() - 100})); assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: userId, create_at: Date.now() - 6000000})); - assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: -1}, licensed, teamId, channelId, userId, {user_id: 'other'})); - assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: 'other', create_at: Date.now() - 100})); + assert.ok(canEditPost(newVersionState, {PostEditTimeLimit: -1}, licensed, teamId, channelId, userId, {user_id: 'other'})); + assert.ok(canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: 'other', create_at: Date.now() - 100})); assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: 'other', create_at: Date.now() - 6000000})); newVersionState.entities.roles = { @@ -259,8 +259,8 @@ describe('PostUtils', () => { assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: -1}, licensed, teamId, channelId, userId, {user_id: userId})); assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: userId, create_at: Date.now() - 100})); assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: userId, create_at: Date.now() - 6000000})); - assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: -1}, licensed, teamId, channelId, userId, {user_id: 'other'})); - assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: 'other', create_at: Date.now() - 100})); + assert.ok(canEditPost(newVersionState, {PostEditTimeLimit: -1}, licensed, teamId, channelId, userId, {user_id: 'other'})); + assert.ok(canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: 'other', create_at: Date.now() - 100})); assert.ok(!canEditPost(newVersionState, {PostEditTimeLimit: 300}, licensed, teamId, channelId, userId, {user_id: 'other', create_at: Date.now() - 6000000})); newVersionState.entities.roles = { diff --git a/app/mm-redux/utils/post_utils.ts b/app/mm-redux/utils/post_utils.ts index 03b558fdd..5cca5671f 100644 --- a/app/mm-redux/utils/post_utils.ts +++ b/app/mm-redux/utils/post_utils.ts @@ -11,6 +11,7 @@ import {UserProfile} from '@mm-redux/types/users'; import {Team} from '@mm-redux/types/teams'; import {Channel} from '@mm-redux/types/channels'; import {$ID} from '@mm-redux/types/utilities'; +import {isMinimumServerVersion} from '@mm-redux/utils/helpers'; import {getPreferenceKey} from './preference_utils'; @@ -86,10 +87,17 @@ export function canEditPost(state: GlobalState, config: any, license: any, teamI let canEdit = true; if (hasNewPermissions(state)) { - canEdit = canEdit && haveIChannelPermission(state, {team: teamId, channel: channelId, permission: Permissions.EDIT_POST}); - if (!isOwner) { - canEdit = canEdit && haveIChannelPermission(state, {team: teamId, channel: channelId, permission: Permissions.EDIT_OTHERS_POSTS}); + const {serverVersion} = state.entities.general; + let permissions = []; + if (isOwner) { + permissions = [Permissions.EDIT_POST]; + } else { + // prior to v5.26, the server used to require edit_own_posts and + // edit_others_posts permissions to be able to edit a post by a + // different author. + permissions = isMinimumServerVersion(serverVersion, 5, 26) ? [Permissions.EDIT_OTHERS_POSTS] : [Permissions.EDIT_POST, Permissions.EDIT_OTHERS_POSTS]; } + canEdit = permissions.every((permission) => haveIChannelPermission(state, {team: teamId, channel: channelId, permission, default: false})); if (license.IsLicensed === 'true' && config.PostEditTimeLimit !== '-1' && config.PostEditTimeLimit !== -1) { const timeLeft = (post.create_at + (config.PostEditTimeLimit * 1000)) - Date.now(); if (timeLeft <= 0) {