This is an automated email from the ASF dual-hosted git repository.

SbloodyS pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 3f90d20db0 [Fix-18283][API] Add project permission check on workflow 
lineage and workflow-definition list endpoints (#18284)
3f90d20db0 is described below

commit 3f90d20db0d2b057857bc70b91451a73c79cbe43
Author: Wenjun Ruan <[email protected]>
AuthorDate: Sun May 24 10:10:05 2026 +0800

    [Fix-18283][API] Add project permission check on workflow lineage and 
workflow-definition list endpoints (#18284)
---
 .../controller/WorkflowDefinitionController.java   |  5 ++-
 .../api/controller/WorkflowLineageController.java  | 12 +++---
 .../api/service/WorkflowDefinitionService.java     |  4 +-
 .../api/service/WorkflowLineageService.java        | 13 ++++---
 .../impl/WorkflowDefinitionServiceImpl.java        | 25 +++++++-----
 .../service/impl/WorkflowLineageServiceImpl.java   | 30 ++++++++++++---
 .../WorkflowTaskLineageControllerTest.java         |  2 +-
 .../api/service/WorkflowDefinitionServiceTest.java |  8 ++--
 .../service/WorkflowTaskLineageServiceTest.java    | 45 +++++++++++++++++++---
 9 files changed, 106 insertions(+), 38 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionController.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionController.java
index 925921ead3..29885ed4ac 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionController.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionController.java
@@ -568,7 +568,8 @@ public class WorkflowDefinitionController extends 
BaseController {
     @ApiException(GET_TASKS_LIST_BY_WORKFLOW_DEFINITION_CODE_ERROR)
     public Result<List<DependentSimplifyDefinition>> 
getWorkflowListByProjectCode(@Parameter(hidden = true) @RequestAttribute(value 
= Constants.SESSION_USER) User loginUser,
                                                                                
   @Parameter(name = "projectCode", description = "PROJECT_CODE", required = 
true) @PathVariable long projectCode) {
-        return 
Result.success(workflowDefinitionService.queryWorkflowDefinitionListByProjectCode(projectCode));
+        return Result.success(
+                
workflowDefinitionService.queryWorkflowDefinitionListByProjectCode(loginUser, 
projectCode));
     }
 
     /**
@@ -590,7 +591,7 @@ public class WorkflowDefinitionController extends 
BaseController {
                                                                                
          @Parameter(name = "projectCode", description = "PROJECT_CODE", 
required = true) @PathVariable long projectCode,
                                                                                
          @RequestParam(value = "workflowDefinitionCode") Long 
workflowDefinitionCode) {
         return Result.success(workflowDefinitionService
-                .queryTaskDefinitionListByWorkflowDefinitionCode(projectCode, 
workflowDefinitionCode));
+                .queryTaskDefinitionListByWorkflowDefinitionCode(loginUser, 
projectCode, workflowDefinitionCode));
     }
 
     @Operation(summary = "deleteByWorkflowDefinitionCode", description = 
"DELETE_WORKFLOW_DEFINITION_BY_ID_NOTES")
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowLineageController.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowLineageController.java
index c5e87baa4e..1d56abbbc1 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowLineageController.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowLineageController.java
@@ -75,7 +75,7 @@ public class WorkflowLineageController extends BaseController 
{
                                                                            
@RequestParam(value = "workflowDefinitionName", required = false) String 
workflowDefinitionName) {
         workflowDefinitionName = 
ParameterUtils.handleEscapes(workflowDefinitionName);
         List<WorkFlowRelationDetail> workFlowLineages =
-                workflowLineageService.queryWorkFlowLineageByName(projectCode, 
workflowDefinitionName);
+                workflowLineageService.queryWorkFlowLineageByName(loginUser, 
projectCode, workflowDefinitionName);
         return Result.success(workFlowLineages);
     }
 
@@ -86,7 +86,8 @@ public class WorkflowLineageController extends BaseController 
{
     public Result<Map<String, Object>> 
queryWorkFlowLineageByCode(@Parameter(hidden = true) @RequestAttribute(value = 
SESSION_USER) User loginUser,
                                                                   
@Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) 
@PathVariable long projectCode,
                                                                   
@PathVariable(value = "workFlowCode") long workFlowCode) {
-        WorkFlowLineage workFlowLineage = 
workflowLineageService.queryWorkFlowLineageByCode(projectCode, workFlowCode);
+        WorkFlowLineage workFlowLineage =
+                workflowLineageService.queryWorkFlowLineageByCode(loginUser, 
projectCode, workFlowCode);
         Map<String, Object> result = new HashMap<>();
         result.put(Constants.DATA_LIST, workFlowLineage);
         return Result.success(result);
@@ -100,7 +101,7 @@ public class WorkflowLineageController extends 
BaseController {
                                                             @Parameter(name = 
"projectCode", description = "PROJECT_CODE", required = true) @PathVariable 
long projectCode) {
         try {
             Map<String, Object> result = new HashMap<>();
-            WorkFlowLineage workFlowLineage = 
workflowLineageService.queryWorkFlowLineage(projectCode);
+            WorkFlowLineage workFlowLineage = 
workflowLineageService.queryWorkFlowLineage(loginUser, projectCode);
             result.put(Constants.DATA_LIST, workFlowLineage);
             return Result.success(result);
         } catch (Exception e) {
@@ -133,7 +134,7 @@ public class WorkflowLineageController extends 
BaseController {
                                                            @RequestParam(value 
= "taskCode") long taskCode) {
         Result<Map<String, Object>> result = new Result<>();
         Optional<String> taskDepMsg =
-                workflowLineageService.taskDependentMsg(projectCode, 
workflowDefinitionCode, taskCode);
+                workflowLineageService.taskDependentMsg(loginUser, 
projectCode, workflowDefinitionCode, taskCode);
         if (taskDepMsg.isPresent()) {
             throw new ServiceException(taskDepMsg.get());
         }
@@ -158,7 +159,8 @@ public class WorkflowLineageController extends 
BaseController {
                                                            @RequestParam(value 
= "taskCode", required = false) Long taskCode) {
         Map<String, Object> result = new HashMap<>();
         List<DependentLineageTask> dependentLineageTaskList =
-                
workflowLineageService.queryDependentWorkflowDefinitions(projectCode, 
workFlowCode, taskCode);
+                
workflowLineageService.queryDependentWorkflowDefinitions(loginUser, 
projectCode, workFlowCode,
+                        taskCode);
         result.put(Constants.DATA_LIST, dependentLineageTaskList);
         return Result.success(result);
     }
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionService.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionService.java
index 7113f806eb..5f404e75ae 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionService.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionService.java
@@ -171,12 +171,12 @@ public interface WorkflowDefinitionService {
     /**
      * query workflow definition list by project code (simplified records used 
for dependent task picker)
      */
-    List<DependentSimplifyDefinition> 
queryWorkflowDefinitionListByProjectCode(long projectCode);
+    List<DependentSimplifyDefinition> 
queryWorkflowDefinitionListByProjectCode(User loginUser, long projectCode);
 
     /**
      * query task definition list (simplified records) by workflow definition 
code
      */
-    List<DependentSimplifyDefinition> 
queryTaskDefinitionListByWorkflowDefinitionCode(long projectCode,
+    List<DependentSimplifyDefinition> 
queryTaskDefinitionListByWorkflowDefinitionCode(User loginUser, long 
projectCode,
                                                                                
       Long workflowDefinitionCode);
 
     /**
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowLineageService.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowLineageService.java
index 676c78863e..64629118ce 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowLineageService.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowLineageService.java
@@ -19,6 +19,7 @@ package org.apache.dolphinscheduler.api.service;
 
 import org.apache.dolphinscheduler.dao.entity.DependentLineageTask;
 import org.apache.dolphinscheduler.dao.entity.DependentWorkflowDefinition;
+import org.apache.dolphinscheduler.dao.entity.User;
 import org.apache.dolphinscheduler.dao.entity.WorkFlowLineage;
 import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail;
 import org.apache.dolphinscheduler.dao.entity.WorkflowDefinition;
@@ -29,11 +30,12 @@ import java.util.Optional;
 
 public interface WorkflowLineageService {
 
-    List<WorkFlowRelationDetail> queryWorkFlowLineageByName(long projectCode, 
String workflowDefinitionName);
+    List<WorkFlowRelationDetail> queryWorkFlowLineageByName(User loginUser, 
long projectCode,
+                                                            String 
workflowDefinitionName);
 
-    WorkFlowLineage queryWorkFlowLineageByCode(long projectCode, long 
workflowDefinitionCode);
+    WorkFlowLineage queryWorkFlowLineageByCode(User loginUser, long 
projectCode, long workflowDefinitionCode);
 
-    WorkFlowLineage queryWorkFlowLineage(long projectCode);
+    WorkFlowLineage queryWorkFlowLineage(User loginUser, long projectCode);
 
     /**
      * Query downstream tasks depend on a workflow definition or a task
@@ -70,9 +72,10 @@ public interface WorkflowLineageService {
      * @param taskCode              Task code want to query tasks dependence
      * @return dependent workflow definition
      */
-    Optional<String> taskDependentMsg(long projectCode, long 
workflowDefinitionCode, long taskCode);
+    Optional<String> taskDependentMsg(User loginUser, long projectCode, long 
workflowDefinitionCode, long taskCode);
 
-    List<DependentLineageTask> queryDependentWorkflowDefinitions(long 
projectCode, long workflowDefinitionCode,
+    List<DependentLineageTask> queryDependentWorkflowDefinitions(User 
loginUser, long projectCode,
+                                                                 long 
workflowDefinitionCode,
                                                                  Long 
taskCode);
 
     /**
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java
index 8609057f87..fecf8ec406 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java
@@ -665,7 +665,7 @@ public class WorkflowDefinitionServiceImpl extends 
BaseServiceImpl implements Wo
      * @param workflowDefinition WorkflowDefinition you change task definition 
and task relation
      * @param taskRelationList  All the latest task relation list from 
workflow definition
      */
-    private void taskUsedInOtherTaskValid(WorkflowDefinition 
workflowDefinition,
+    private void taskUsedInOtherTaskValid(User loginUser, WorkflowDefinition 
workflowDefinition,
                                           List<WorkflowTaskRelationLog> 
taskRelationList) {
         List<WorkflowTaskRelation> oldWorkflowTaskRelationList =
                 
workflowTaskRelationDao.queryByWorkflowDefinitionCode(workflowDefinition.getCode());
@@ -677,7 +677,8 @@ public class WorkflowDefinitionServiceImpl extends 
BaseServiceImpl implements Wo
                     .anyMatch(relation -> 
oldWorkflowTaskRelation.getPostTaskCode() == relation.getPostTaskCode());
             if (!oldTaskExists) {
                 Optional<String> taskDepMsg = 
workflowLineageService.taskDependentMsg(
-                        workflowDefinition.getProjectCode(), 
oldWorkflowTaskRelation.getWorkflowDefinitionCode(),
+                        loginUser, workflowDefinition.getProjectCode(),
+                        oldWorkflowTaskRelation.getWorkflowDefinitionCode(),
                         oldWorkflowTaskRelation.getPostTaskCode());
                 taskDepMsg.ifPresent(sb::append);
             }
@@ -745,7 +746,7 @@ public class WorkflowDefinitionServiceImpl extends 
BaseServiceImpl implements Wo
                 workflowDefinition.getCode(), insertVersion);
         workflowDefinition.setVersion(insertVersion);
 
-        taskUsedInOtherTaskValid(workflowDefinition, taskRelationList);
+        taskUsedInOtherTaskValid(loginUser, workflowDefinition, 
taskRelationList);
         int insertResult = processService.saveTaskRelation(loginUser, 
workflowDefinition.getProjectCode(),
                 workflowDefinition.getCode(), insertVersion, taskRelationList, 
taskDefinitionLogs, Boolean.TRUE);
         if (insertResult != Constants.EXIT_CODE_SUCCESS) {
@@ -833,7 +834,7 @@ public class WorkflowDefinitionServiceImpl extends 
BaseServiceImpl implements Wo
      *
      * @param workflowDefinition WorkflowDefinition you change task definition 
and task relation
      */
-    private void workflowDefinitionUsedInOtherTaskValid(WorkflowDefinition 
workflowDefinition) {
+    private void workflowDefinitionUsedInOtherTaskValid(User loginUser, 
WorkflowDefinition workflowDefinition) {
         // check workflow definition is already online
         if (workflowDefinition.getReleaseState() == ReleaseState.ONLINE) {
             throw new ServiceException(Status.WORKFLOW_DEFINE_STATE_ONLINE, 
workflowDefinition.getName());
@@ -847,8 +848,8 @@ public class WorkflowDefinitionServiceImpl extends 
BaseServiceImpl implements Wo
         }
 
         // check workflow used by other task, including sub workflow and 
dependent task type
-        Optional<String> taskDepMsg = 
workflowLineageService.taskDependentMsg(workflowDefinition.getProjectCode(),
-                workflowDefinition.getCode(), 0);
+        Optional<String> taskDepMsg = 
workflowLineageService.taskDependentMsg(loginUser,
+                workflowDefinition.getProjectCode(), 
workflowDefinition.getCode(), 0);
 
         if (taskDepMsg.isPresent()) {
             String errorMeg = "workflow definition cannot be deleted because 
it has dependent, " + taskDepMsg.get();
@@ -870,7 +871,7 @@ public class WorkflowDefinitionServiceImpl extends 
BaseServiceImpl implements Wo
             throw new ServiceException(Status.USER_NO_OPERATION_PERM);
         }
 
-        workflowDefinitionUsedInOtherTaskValid(workflowDefinition);
+        workflowDefinitionUsedInOtherTaskValid(loginUser, workflowDefinition);
 
         // get the timing according to the workflow definition
         Schedule scheduleObj = scheduleDao.queryByWorkflowDefinitionCode(code);
@@ -1050,7 +1051,10 @@ public class WorkflowDefinitionServiceImpl extends 
BaseServiceImpl implements Wo
      * @return workflow definition list in the project
      */
     @Override
-    public List<DependentSimplifyDefinition> 
queryWorkflowDefinitionListByProjectCode(long projectCode) {
+    public List<DependentSimplifyDefinition> 
queryWorkflowDefinitionListByProjectCode(User loginUser,
+                                                                               
       long projectCode) {
+        Project project = projectDao.queryByCode(projectCode);
+        projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_DEFINITION);
         return 
workflowDefinitionDao.queryDefinitionListByProjectCodeAndWorkflowDefinitionCodes(projectCode,
 null);
     }
 
@@ -1062,8 +1066,11 @@ public class WorkflowDefinitionServiceImpl extends 
BaseServiceImpl implements Wo
      * @return task definition list in the workflow definition
      */
     @Override
-    public List<DependentSimplifyDefinition> 
queryTaskDefinitionListByWorkflowDefinitionCode(long projectCode,
+    public List<DependentSimplifyDefinition> 
queryTaskDefinitionListByWorkflowDefinitionCode(User loginUser,
+                                                                               
              long projectCode,
                                                                                
              Long workflowDefinitionCode) {
+        Project project = projectDao.queryByCode(projectCode);
+        projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_DEFINITION);
         Set<Long> definitionCodesSet = new HashSet<>();
         definitionCodesSet.add(workflowDefinitionCode);
         List<DependentSimplifyDefinition> workflowDefinitions = 
workflowDefinitionDao
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowLineageServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowLineageServiceImpl.java
index 44241590d0..3df93b3dfa 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowLineageServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowLineageServiceImpl.java
@@ -17,8 +17,11 @@
 
 package org.apache.dolphinscheduler.api.service.impl;
 
+import static 
org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.WORKFLOW_DEFINITION;
+
 import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.exceptions.ServiceException;
+import org.apache.dolphinscheduler.api.service.ProjectService;
 import org.apache.dolphinscheduler.api.service.WorkflowLineageService;
 import org.apache.dolphinscheduler.common.constants.Constants;
 import org.apache.dolphinscheduler.common.enums.ReleaseState;
@@ -26,6 +29,7 @@ import 
org.apache.dolphinscheduler.dao.entity.DependentLineageTask;
 import org.apache.dolphinscheduler.dao.entity.DependentWorkflowDefinition;
 import org.apache.dolphinscheduler.dao.entity.Project;
 import org.apache.dolphinscheduler.dao.entity.TaskDefinition;
+import org.apache.dolphinscheduler.dao.entity.User;
 import org.apache.dolphinscheduler.dao.entity.WorkFlowLineage;
 import org.apache.dolphinscheduler.dao.entity.WorkFlowRelation;
 import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail;
@@ -75,21 +79,28 @@ public class WorkflowLineageServiceImpl extends 
BaseServiceImpl implements Workf
     @Autowired
     private WorkflowDefinitionDao workflowDefinitionDao;
 
+    @Autowired
+    private ProjectService projectService;
+
     @Override
-    public List<WorkFlowRelationDetail> queryWorkFlowLineageByName(long 
projectCode, String workflowDefinitionName) {
+    public List<WorkFlowRelationDetail> queryWorkFlowLineageByName(User 
loginUser, long projectCode,
+                                                                   String 
workflowDefinitionName) {
         Project project = projectDao.queryByCode(projectCode);
         if (project == null) {
             throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode);
         }
+        projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_DEFINITION);
         return workflowTaskLineageDao.queryWorkFlowLineageByName(projectCode, 
workflowDefinitionName);
     }
 
     @Override
-    public WorkFlowLineage queryWorkFlowLineageByCode(long projectCode, long 
workflowDefinitionCode) {
+    public WorkFlowLineage queryWorkFlowLineageByCode(User loginUser, long 
projectCode,
+                                                      long 
workflowDefinitionCode) {
         Project project = projectDao.queryByCode(projectCode);
         if (project == null) {
             throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode);
         }
+        projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_DEFINITION);
         List<WorkflowTaskLineage> upstreamWorkflowTaskLineageList =
                 
workflowTaskLineageDao.queryByWorkflowDefinitionCode(workflowDefinitionCode);
         List<WorkflowTaskLineage> downstreamWorkflowTaskLineageList =
@@ -117,11 +128,12 @@ public class WorkflowLineageServiceImpl extends 
BaseServiceImpl implements Workf
     }
 
     @Override
-    public WorkFlowLineage queryWorkFlowLineage(long projectCode) {
+    public WorkFlowLineage queryWorkFlowLineage(User loginUser, long 
projectCode) {
         Project project = projectDao.queryByCode(projectCode);
         if (project == null) {
             throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode);
         }
+        projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_DEFINITION);
         List<WorkflowTaskLineage> workflowTaskLineageList = 
workflowTaskLineageDao.queryByProjectCode(projectCode);
         List<WorkFlowRelation> workFlowRelationList = 
getWorkFlowRelations(workflowTaskLineageList);
         List<WorkFlowRelationDetail> workFlowRelationDetailList =
@@ -174,7 +186,13 @@ public class WorkflowLineageServiceImpl extends 
BaseServiceImpl implements Workf
      * @return Optional of formatter message
      */
     @Override
-    public Optional<String> taskDependentMsg(long projectCode, long 
workflowDefinitionCode, long taskCode) {
+    public Optional<String> taskDependentMsg(User loginUser, long projectCode, 
long workflowDefinitionCode,
+                                             long taskCode) {
+        Project project = projectDao.queryByCode(projectCode);
+        if (project == null) {
+            throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode);
+        }
+        projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_DEFINITION);
         long queryTaskCode = 0;
         if (taskCode != 0) {
             queryTaskCode = taskCode;
@@ -285,12 +303,14 @@ public class WorkflowLineageServiceImpl extends 
BaseServiceImpl implements Workf
     }
 
     @Override
-    public List<DependentLineageTask> queryDependentWorkflowDefinitions(long 
projectCode, long workflowDefinitionCode,
+    public List<DependentLineageTask> queryDependentWorkflowDefinitions(User 
loginUser, long projectCode,
+                                                                        long 
workflowDefinitionCode,
                                                                         Long 
taskCode) {
         Project project = projectDao.queryByCode(projectCode);
         if (project == null) {
             throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode);
         }
+        projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_DEFINITION);
         List<DependentLineageTask> dependentLineageTaskList = new 
ArrayList<>();
         List<WorkflowTaskLineage> workflowTaskLineageList =
                 workflowTaskLineageDao.queryWorkFlowLineageByDept(projectCode,
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowTaskLineageControllerTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowTaskLineageControllerTest.java
index 4d637c5675..5884d508ac 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowTaskLineageControllerTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowTaskLineageControllerTest.java
@@ -73,7 +73,7 @@ public class WorkflowTaskLineageControllerTest {
     public void testQueryWorkFlowLineageByName() {
         long projectCode = 1L;
         String searchVal = "test";
-        
Mockito.when(workFlowLineageService.queryWorkFlowLineageByName(projectCode, 
searchVal))
+        Mockito.when(workFlowLineageService.queryWorkFlowLineageByName(user, 
projectCode, searchVal))
                 .thenReturn(Collections.emptyList());
         assertDoesNotThrow(() -> 
workflowLineageController.queryWorkFlowLineageByName(user, projectCode, 
searchVal));
     }
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java
index f3d129d8d3..3ea6da8fb3 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java
@@ -581,7 +581,7 @@ public class WorkflowDefinitionServiceTest extends 
BaseServiceTestTool {
         
when(workflowDefinitionDao.queryByCode(46L)).thenReturn(Optional.of(workflowDefinition));
         
when(scheduleDao.queryByWorkflowDefinitionCode(46L)).thenReturn(getSchedule());
         when(scheduleDao.deleteById(46)).thenReturn(true);
-        when(workflowLineageService.taskDependentMsg(project.getCode(), 
workflowDefinition.getCode(), 0))
+        when(workflowLineageService.taskDependentMsg(user, project.getCode(), 
workflowDefinition.getCode(), 0))
                 .thenReturn(Optional.empty());
         
when(workflowLineageService.deleteWorkflowLineage(anyList())).thenReturn(1);
         workflowDefinitionService.deleteWorkflowDefinitionByCode(user, 46L);
@@ -597,7 +597,7 @@ public class WorkflowDefinitionServiceTest extends 
BaseServiceTestTool {
         // process used by other task, sub process
         user.setUserType(UserType.ADMIN_USER);
         TaskMainInfo taskMainInfo = getTaskMainInfo().get(0);
-        when(workflowLineageService.taskDependentMsg(project.getCode(), 
workflowDefinition.getCode(), 0))
+        when(workflowLineageService.taskDependentMsg(user, project.getCode(), 
workflowDefinition.getCode(), 0))
                 .thenReturn(Optional.of(taskMainInfo.getTaskName()));
         exception = Assertions.assertThrows(ServiceException.class,
                 () -> 
workflowDefinitionService.deleteWorkflowDefinitionByCode(user, 46L));
@@ -606,7 +606,7 @@ public class WorkflowDefinitionServiceTest extends 
BaseServiceTestTool {
         schedule.setReleaseState(ReleaseState.OFFLINE);
         
when(scheduleDao.queryByWorkflowDefinitionCode(46L)).thenReturn(getSchedule());
         when(scheduleDao.deleteById(schedule.getId())).thenReturn(true);
-        when(workflowLineageService.taskDependentMsg(project.getCode(), 
workflowDefinition.getCode(), 0))
+        when(workflowLineageService.taskDependentMsg(user, project.getCode(), 
workflowDefinition.getCode(), 0))
                 .thenReturn(Optional.empty());
         
when(workflowLineageService.deleteWorkflowLineage(anyList())).thenReturn(1);
         Assertions.assertDoesNotThrow(() -> 
workflowDefinitionService.deleteWorkflowDefinitionByCode(user, 46L));
@@ -661,7 +661,7 @@ public class WorkflowDefinitionServiceTest extends 
BaseServiceTestTool {
         // delete success
         process.setReleaseState(ReleaseState.OFFLINE);
         
when(workflowDefinitionDao.queryByCode(processDefinitionCode)).thenReturn(Optional.of(process));
-        when(workflowLineageService.taskDependentMsg(project.getCode(), 
process.getCode(), 0))
+        when(workflowLineageService.taskDependentMsg(user, project.getCode(), 
process.getCode(), 0))
                 .thenReturn(Optional.empty());
         Assertions.assertDoesNotThrow(
                 () -> 
workflowDefinitionService.batchDeleteWorkflowDefinitionByCodes(user, 
projectCode, singleCodes));
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowTaskLineageServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowTaskLineageServiceTest.java
index f391360f4a..32ed1703b9 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowTaskLineageServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowTaskLineageServiceTest.java
@@ -27,6 +27,7 @@ import 
org.apache.dolphinscheduler.api.exceptions.ServiceException;
 import org.apache.dolphinscheduler.api.service.impl.WorkflowLineageServiceImpl;
 import org.apache.dolphinscheduler.dao.entity.Project;
 import org.apache.dolphinscheduler.dao.entity.TaskDefinition;
+import org.apache.dolphinscheduler.dao.entity.User;
 import org.apache.dolphinscheduler.dao.entity.WorkFlowLineage;
 import org.apache.dolphinscheduler.dao.entity.WorkFlowRelation;
 import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail;
@@ -69,6 +70,9 @@ public class WorkflowTaskLineageServiceTest {
     @Mock
     private WorkflowDefinitionDao workflowDefinitionDao;
 
+    @Mock
+    private ProjectService projectService;
+
     /**
      * get mock Project
      *
@@ -84,17 +88,41 @@ public class WorkflowTaskLineageServiceTest {
         return project;
     }
 
+    private User getLoginUser() {
+        User user = new User();
+        user.setId(1);
+        user.setUserName("admin");
+        return user;
+    }
+
     @Test
     public void testQueryWorkFlowLineageByName() {
         Project project = getProject("test");
+        User loginUser = getLoginUser();
         String name = "test";
         when(projectDao.queryByCode(1L)).thenReturn(project);
         
when(workflowTaskLineageDao.queryWorkFlowLineageByName(Mockito.anyLong(), 
Mockito.any()))
                 .thenReturn(getWorkFlowLineages());
-        List<WorkFlowRelationDetail> workFlowLineages = 
workflowLineageService.queryWorkFlowLineageByName(1L, name);
+        List<WorkFlowRelationDetail> workFlowLineages =
+                workflowLineageService.queryWorkFlowLineageByName(loginUser, 
1L, name);
         Assertions.assertTrue(CollectionUtils.isNotEmpty(workFlowLineages));
     }
 
+    @Test
+    public void testQueryWorkFlowLineageByNameWithoutProjectPerm() {
+        Project project = getProject("test");
+        User loginUser = getLoginUser();
+        when(projectDao.queryByCode(1L)).thenReturn(project);
+        Mockito.doThrow(new 
ServiceException(Status.USER_NO_OPERATION_PROJECT_PERM, loginUser.getUserName(),
+                project.getCode())).when(projectService)
+                .checkProjectAndAuthThrowException(Mockito.eq(loginUser), 
Mockito.eq(project), Mockito.anyString());
+        ServiceException exception = 
Assertions.assertThrows(ServiceException.class,
+                () -> 
workflowLineageService.queryWorkFlowLineageByName(loginUser, 1L, "test"));
+        
Assertions.assertEquals(Status.USER_NO_OPERATION_PROJECT_PERM.getCode(), 
exception.getCode());
+        Mockito.verify(workflowTaskLineageDao, Mockito.never())
+                .queryWorkFlowLineageByName(Mockito.anyLong(), Mockito.any());
+    }
+
     @Test
     public void testQueryWorkFlowLineage() {
         Project project = getProject("test");
@@ -116,12 +144,13 @@ public class WorkflowTaskLineageServiceTest {
         workFlowRelationDetail.setWorkFlowName("testProcessDefinitionName");
         workFlowRelationDetailList.add(workFlowRelationDetail);
 
+        User loginUser = getLoginUser();
         when(projectDao.queryByCode(1L)).thenReturn(project);
         
when(workflowTaskLineageDao.queryByProjectCode(project.getCode())).thenReturn(workflowTaskLineages);
         
when(workflowTaskLineageDao.queryWorkFlowLineageByCode(workflowTaskLineage.getWorkflowDefinitionCode()))
                 .thenReturn(workFlowRelationDetailList);
 
-        WorkFlowLineage workFlowLineage = 
workflowLineageService.queryWorkFlowLineage(1L);
+        WorkFlowLineage workFlowLineage = 
workflowLineageService.queryWorkFlowLineage(loginUser, 1L);
 
         List<WorkFlowRelationDetail> workFlowLineageList =
                 workFlowLineage.getWorkFlowRelationDetailList();
@@ -146,6 +175,7 @@ public class WorkflowTaskLineageServiceTest {
         long projectCode = 1L;
         long workflowDefinitionCode = 100L;
         long taskCode = 200L;
+        User loginUser = getLoginUser();
 
         // Create orphaned lineage record (taskDefinitionCode exists but 
taskDefinition is null)
         List<WorkflowTaskLineage> dependentWorkflowList = new ArrayList<>();
@@ -159,6 +189,7 @@ public class WorkflowTaskLineageServiceTest {
         workflowDefinition.setCode(50L);
         workflowDefinition.setName("TestWorkflow");
 
+        
when(projectDao.queryByCode(projectCode)).thenReturn(getProject("test"));
         when(workflowTaskLineageDao.queryWorkFlowLineageByDept(projectCode, 
workflowDefinitionCode, taskCode))
                 .thenReturn(dependentWorkflowList);
         
when(workflowDefinitionDao.queryByCode(50L)).thenReturn(Optional.of(workflowDefinition));
@@ -166,7 +197,7 @@ public class WorkflowTaskLineageServiceTest {
 
         // Should return Optional.empty() because all records are orphaned
         Optional<String> result =
-                workflowLineageService.taskDependentMsg(projectCode, 
workflowDefinitionCode, taskCode);
+                workflowLineageService.taskDependentMsg(loginUser, 
projectCode, workflowDefinitionCode, taskCode);
         Assertions.assertFalse(result.isPresent());
     }
 
@@ -176,6 +207,7 @@ public class WorkflowTaskLineageServiceTest {
         long projectCode = 1L;
         long workflowDefinitionCode = 100L;
         long taskCode = 200L;
+        User loginUser = getLoginUser();
 
         List<WorkflowTaskLineage> dependentWorkflowList = new ArrayList<>();
 
@@ -205,6 +237,7 @@ public class WorkflowTaskLineageServiceTest {
         validTaskDefinition.setCode(300L);
         validTaskDefinition.setName("ValidTask");
 
+        
when(projectDao.queryByCode(projectCode)).thenReturn(getProject("test"));
         when(workflowTaskLineageDao.queryWorkFlowLineageByDept(projectCode, 
workflowDefinitionCode, taskCode))
                 .thenReturn(dependentWorkflowList);
         
when(workflowDefinitionDao.queryByCode(50L)).thenReturn(Optional.of(workflowDefinition1));
@@ -219,7 +252,7 @@ public class WorkflowTaskLineageServiceTest {
 
         // Should return a message with only the valid record, skipping the 
orphaned one
         Optional<String> result =
-                workflowLineageService.taskDependentMsg(projectCode, 
workflowDefinitionCode, taskCode);
+                workflowLineageService.taskDependentMsg(loginUser, 
projectCode, workflowDefinitionCode, taskCode);
         Assertions.assertTrue(result.isPresent());
         String message = result.get();
         Assertions.assertTrue(message.contains("ValidWorkflow"));
@@ -234,6 +267,7 @@ public class WorkflowTaskLineageServiceTest {
         long projectCode = 1L;
         long workflowDefinitionCode = 100L;
         long taskCode = 0L; // No specific task code
+        User loginUser = getLoginUser();
 
         List<WorkflowTaskLineage> dependentWorkflowList = new ArrayList<>();
         WorkflowTaskLineage orphanedLineage = new WorkflowTaskLineage();
@@ -246,6 +280,7 @@ public class WorkflowTaskLineageServiceTest {
         workflowDefinition.setCode(50L);
         workflowDefinition.setName("TestWorkflow");
 
+        
when(projectDao.queryByCode(projectCode)).thenReturn(getProject("test"));
         when(workflowTaskLineageDao.queryWorkFlowLineageByDept(projectCode, 
workflowDefinitionCode, 0L))
                 .thenReturn(dependentWorkflowList);
         
when(workflowDefinitionDao.queryByCode(50L)).thenReturn(Optional.of(workflowDefinition));
@@ -253,7 +288,7 @@ public class WorkflowTaskLineageServiceTest {
 
         // Should return Optional.empty() because all records are orphaned
         Optional<String> result =
-                workflowLineageService.taskDependentMsg(projectCode, 
workflowDefinitionCode, taskCode);
+                workflowLineageService.taskDependentMsg(loginUser, 
projectCode, workflowDefinitionCode, taskCode);
         Assertions.assertFalse(result.isPresent());
     }
 


Reply via email to