check permissions to channel before patching via api

This commit is contained in:
Scott Bishel 2023-03-06 12:26:39 -07:00
parent 805e0d93dc
commit fe29ec8826
2 changed files with 74 additions and 0 deletions

View file

@ -355,12 +355,15 @@ func (a *App) PatchBoard(patch *model.BoardPatch, boardID, userID string) (*mode
var oldMembers []*model.BoardMember var oldMembers []*model.BoardMember
if patch.Type != nil || patch.ChannelID != nil { if patch.Type != nil || patch.ChannelID != nil {
testChannel := ""
if patch.ChannelID != nil && *patch.ChannelID == "" { if patch.ChannelID != nil && *patch.ChannelID == "" {
var err error var err error
oldMembers, err = a.GetMembersForBoard(boardID) oldMembers, err = a.GetMembersForBoard(boardID)
if err != nil { if err != nil {
a.logger.Error("Unable to get the board members", mlog.Err(err)) a.logger.Error("Unable to get the board members", mlog.Err(err))
} }
} else if patch.ChannelID != nil && *patch.ChannelID != "" {
testChannel = *patch.ChannelID
} }
board, err := a.store.GetBoard(boardID) board, err := a.store.GetBoard(boardID)
@ -372,7 +375,17 @@ func (a *App) PatchBoard(patch *model.BoardPatch, boardID, userID string) (*mode
} }
oldChannelID = board.ChannelID oldChannelID = board.ChannelID
isTemplate = board.IsTemplate isTemplate = board.IsTemplate
if testChannel == "" {
testChannel = oldChannelID
}
if testChannel != "" {
if !a.permissions.HasPermissionToChannel(userID, testChannel, model.PermissionCreatePost) {
return nil, model.NewErrPermission("access denied to channel")
}
}
} }
updatedBoard, err := a.store.PatchBoard(boardID, patch, userID) updatedBoard, err := a.store.PatchBoard(boardID, patch, userID)
if err != nil { if err != nil {
return nil, err return nil, err

View file

@ -399,6 +399,67 @@ func TestPatchBoard(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, boardID, patchedBoard.ID) require.Equal(t, boardID, patchedBoard.ID)
}) })
t.Run("patch type channel, user without post permissions", func(t *testing.T) {
const boardID = "board_id_1"
const userID = "user_id_2"
const teamID = "team_id_1"
channelID := "myChannel"
patchType := model.BoardTypeOpen
patch := &model.BoardPatch{
Type: &patchType,
ChannelID: &channelID,
}
// Type not nil, will cause board to be reteived
// to check isTemplate
th.Store.EXPECT().GetBoard(boardID).Return(&model.Board{
ID: boardID,
TeamID: teamID,
IsTemplate: true,
}, nil).Times(1)
th.API.EXPECT().HasPermissionToChannel(userID, channelID, model.PermissionCreatePost).Return(false).Times(1)
_, err := th.App.PatchBoard(patch, boardID, userID)
require.Error(t, err)
})
t.Run("patch type remove channel, user without post permissions", func(t *testing.T) {
const boardID = "board_id_1"
const userID = "user_id_2"
const teamID = "team_id_1"
channelID := "myChannel"
clearChannel := ""
patchType := model.BoardTypeOpen
patch := &model.BoardPatch{
Type: &patchType,
ChannelID: &clearChannel,
}
// Type not nil, will cause board to be reteived
// to check isTemplate
th.Store.EXPECT().GetBoard(boardID).Return(&model.Board{
ID: boardID,
TeamID: teamID,
IsTemplate: true,
ChannelID: channelID,
}, nil).Times(2)
th.API.EXPECT().HasPermissionToChannel(userID, channelID, model.PermissionCreatePost).Return(false).Times(1)
th.API.EXPECT().HasPermissionToTeam(userID, teamID, model.PermissionManageTeam).Return(false).Times(1)
// Should call GetMembersForBoard 2 times
// for WS BroadcastBoardChange
// for AddTeamMembers check
// We are returning the user as a direct Board Member, so BroadcastMemberDelete won't be called
th.Store.EXPECT().GetMembersForBoard(boardID).Return([]*model.BoardMember{{BoardID: boardID, UserID: userID, SchemeEditor: true}}, nil).Times(1)
_, err := th.App.PatchBoard(patch, boardID, userID)
require.Error(t, err)
})
} }
func TestGetBoardCount(t *testing.T) { func TestGetBoardCount(t *testing.T) {