Skip to content

Commit d54225b

Browse files
authored
fix(osc): exists horizontal overstep access data permission when swap table manual (#1405)
* fix Horizontal Permission on swap table manual * modify code for comment * Revert "modify code for comment" This reverts commit dfa766b. * modify code for comment * modify error message * dealloc flow instance
1 parent 5afcd88 commit d54225b

3 files changed

Lines changed: 31 additions & 0 deletions

File tree

server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/OnlineSchemaChangeFlowableTask.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ protected Void start(Long taskId, TaskService taskService, DelegateExecution exe
102102
// for public cloud
103103
String uid = FlowTaskUtil.getCloudMainAccountId(execution);
104104
OnlineSchemaChangeParameters parameter = FlowTaskUtil.getOnlineSchemaChangeParameter(execution);
105+
parameter.setFlowInstanceId(FlowTaskUtil.getFlowInstanceId(execution));
105106
ConnectionConfig connectionConfig = FlowTaskUtil.getConnectionConfig(execution);
106107
String schema = FlowTaskUtil.getSchemaName(execution);
107108
continueOnError = parameter.isContinueOnError();

server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/OscService.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.oceanbase.odc.service.onlineschemachange;
1818

19+
import java.util.Objects;
1920
import java.util.Optional;
2021

2122
import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +33,7 @@
3233
import com.oceanbase.odc.core.shared.constant.ErrorCodes;
3334
import com.oceanbase.odc.core.shared.constant.ResourceType;
3435
import com.oceanbase.odc.core.shared.constant.TaskType;
36+
import com.oceanbase.odc.core.shared.exception.NotFoundException;
3537
import com.oceanbase.odc.metadb.connection.DatabaseEntity;
3638
import com.oceanbase.odc.metadb.connection.DatabaseRepository;
3739
import com.oceanbase.odc.metadb.schedule.ScheduleEntity;
@@ -40,6 +42,10 @@
4042
import com.oceanbase.odc.metadb.schedule.ScheduleTaskRepository;
4143
import com.oceanbase.odc.service.connection.ConnectionService;
4244
import com.oceanbase.odc.service.connection.model.ConnectionConfig;
45+
import com.oceanbase.odc.service.flow.factory.FlowFactory;
46+
import com.oceanbase.odc.service.flow.instance.FlowInstance;
47+
import com.oceanbase.odc.service.iam.HorizontalDataPermissionValidator;
48+
import com.oceanbase.odc.service.iam.auth.AuthenticationFacade;
4349
import com.oceanbase.odc.service.onlineschemachange.model.OnlineSchemaChangeParameters;
4450
import com.oceanbase.odc.service.onlineschemachange.model.OnlineSchemaChangeScheduleTaskResult;
4551
import com.oceanbase.odc.service.onlineschemachange.model.OscLockDatabaseUserInfo;
@@ -69,6 +75,13 @@ public class OscService {
6975
private ScheduleTaskRepository scheduleTaskRepository;
7076
@Autowired
7177
private ScheduleRepository scheduleRepository;
78+
@Autowired
79+
private AuthenticationFacade authenticationFacade;
80+
@Autowired
81+
private HorizontalDataPermissionValidator permissionValidator;
82+
@Autowired
83+
private FlowFactory flowFactory;
84+
7285

7386
@SkipAuthorize("internal authenticated")
7487
public OscLockDatabaseUserInfo getOscDatabaseInfo(@NonNull Long id) {
@@ -102,6 +115,21 @@ public OscSwapTableVO swapTable(@PathVariable Long scheduleTaskId) {
102115
OnlineSchemaChangeParameters oscParameters = JsonUtils.fromJson(scheduleEntity.get().getJobParametersJson(),
103116
OnlineSchemaChangeParameters.class);
104117

118+
Optional<FlowInstance> optional = flowFactory.getFlowInstance(oscParameters.getFlowInstanceId());
119+
FlowInstance flowInstance = optional.orElseThrow(
120+
() -> new NotFoundException(ResourceType.ODC_FLOW_INSTANCE, "id", oscParameters.getFlowInstanceId()));
121+
try {
122+
permissionValidator.checkCurrentOrganization(flowInstance);
123+
} finally {
124+
flowInstance.dealloc();
125+
}
126+
127+
// check user permission, only creator can swap table manual
128+
PreConditions.validHasPermission(
129+
Objects.equals(authenticationFacade.currentUserId(), scheduleEntity.get().getCreatorId()),
130+
ErrorCodes.AccessDenied,
131+
"no permission swap table.");
132+
105133
OnlineSchemaChangeScheduleTaskResult result = JsonUtils.fromJson(scheduleTask.getResultJson(),
106134
OnlineSchemaChangeScheduleTaskResult.class);
107135

server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/model/OnlineSchemaChangeParameters.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
*/
4141
@Data
4242
public class OnlineSchemaChangeParameters implements Serializable, TaskParameters {
43+
private static final long serialVersionUID = 2870979595720162565L;
4344

4445
private OnlineSchemaChangeSqlType sqlType;
4546

@@ -56,6 +57,7 @@ public class OnlineSchemaChangeParameters implements Serializable, TaskParameter
5657

5758
private List<String> lockUsers;
5859
private SwapTableType swapTableType;
60+
private Long flowInstanceId;
5961

6062
public boolean isContinueOnError() {
6163
return this.errorStrategy == TaskErrorStrategy.CONTINUE;

0 commit comments

Comments
 (0)