check permissions to channel before patching via api
This commit is contained in:
parent
805e0d93dc
commit
fe29ec8826
2 changed files with 74 additions and 0 deletions
|
@ -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
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue