You've already forked focalboard
							
							
				mirror of
				https://github.com/mattermost/focalboard.git
				synced 2025-10-31 00:17:42 +02:00 
			
		
		
		
	check permissions to channel before patching via api
This commit is contained in:
		| @@ -355,12 +355,15 @@ func (a *App) PatchBoard(patch *model.BoardPatch, boardID, userID string) (*mode | ||||
| 	var oldMembers []*model.BoardMember | ||||
|  | ||||
| 	if patch.Type != nil || patch.ChannelID != nil { | ||||
| 		testChannel := "" | ||||
| 		if patch.ChannelID != nil && *patch.ChannelID == "" { | ||||
| 			var err error | ||||
| 			oldMembers, err = a.GetMembersForBoard(boardID) | ||||
| 			if err != nil { | ||||
| 				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) | ||||
| @@ -372,7 +375,17 @@ func (a *App) PatchBoard(patch *model.BoardPatch, boardID, userID string) (*mode | ||||
| 		} | ||||
| 		oldChannelID = board.ChannelID | ||||
| 		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) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
|   | ||||
| @@ -399,6 +399,67 @@ func TestPatchBoard(t *testing.T) { | ||||
| 		require.NoError(t, err) | ||||
| 		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) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user