From 72a5d2a21ccec31b830e13da1cd2bb654a336a93 Mon Sep 17 00:00:00 2001 From: etherge Date: Thu, 25 Jan 2018 14:51:10 +0800 Subject: [PATCH] KYLIN-3193, prevent cloning models across projects --- .../kylin/rest/controller/ModelController.java | 26 +++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java b/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java index cc4b736..c2f38cd 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java +++ b/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java @@ -26,6 +26,7 @@ import java.util.UUID; import org.apache.commons.lang.StringUtils; import org.apache.kylin.common.KylinConfig; import org.apache.kylin.common.util.JsonUtil; +import org.apache.kylin.common.util.StringUtil; import org.apache.kylin.metadata.model.DataModelDesc; import org.apache.kylin.metadata.model.DataModelManager; import org.apache.kylin.metadata.project.ProjectInstance; @@ -65,7 +66,8 @@ import com.fasterxml.jackson.databind.JsonMappingException; public class ModelController extends BasicController { private static final Logger logger = LoggerFactory.getLogger(ModelController.class); - private static final char[] VALID_MODELNAME = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_".toCharArray(); + private static final char[] VALID_MODELNAME = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_" + .toCharArray(); @Autowired @Qualifier("modelMgmtService") @@ -83,7 +85,10 @@ public class ModelController extends BasicController { @RequestMapping(value = "", method = { RequestMethod.GET }, produces = { "application/json" }) @ResponseBody - public List getModels(@RequestParam(value = "modelName", required = false) String modelName, @RequestParam(value = "projectName", required = false) String projectName, @RequestParam(value = "limit", required = false) Integer limit, @RequestParam(value = "offset", required = false) Integer offset) { + public List getModels(@RequestParam(value = "modelName", required = false) String modelName, + @RequestParam(value = "projectName", required = false) String projectName, + @RequestParam(value = "limit", required = false) Integer limit, + @RequestParam(value = "offset", required = false) Integer offset) { try { return modelService.getModels(modelName, projectName, limit, offset); } catch (IOException e) { @@ -117,7 +122,8 @@ public class ModelController extends BasicController { try { modelDesc.setUuid(UUID.randomUUID().toString()); - String projectName = (null == modelRequest.getProject()) ? ProjectInstance.DEFAULT_PROJECT_NAME : modelRequest.getProject(); + String projectName = (null == modelRequest.getProject()) ? ProjectInstance.DEFAULT_PROJECT_NAME + : modelRequest.getProject(); modelService.createModelDesc(projectName, modelDesc); } catch (IOException e) { @@ -176,27 +182,27 @@ public class ModelController extends BasicController { @RequestMapping(value = "/{modelName}/clone", method = { RequestMethod.PUT }, produces = { "application/json" }) @ResponseBody public ModelRequest cloneModel(@PathVariable String modelName, @RequestBody ModelRequest modelRequest) { - String project = modelRequest.getProject(); + String project = StringUtils.trimToNull(modelRequest.getProject()); DataModelManager metaManager = DataModelManager.getInstance(KylinConfig.getInstanceFromEnv()); DataModelDesc modelDesc = metaManager.getDataModelDesc(modelName); String newModelName = modelRequest.getModelName(); - if (StringUtils.isEmpty(project)) { - logger.info("Project name should not be empty."); + if (null == project) { throw new BadRequestException("Project name should not be empty."); } if (modelDesc == null || StringUtils.isEmpty(modelName)) { - logger.info("Model does not exist."); throw new BadRequestException("Model does not exist."); } + if (!project.equals(modelDesc.getProject())) { + throw new BadRequestException("Cloning model across projects is not supported."); + } + if (StringUtils.isEmpty(newModelName)) { - logger.info("New model name is empty."); - throw new BadRequestException("New model name is empty."); + throw new BadRequestException("New model name should not be empty."); } if (!StringUtils.containsOnly(newModelName, VALID_MODELNAME)) { - logger.info("Invalid Model name {}, only letters, numbers and underline supported.", newModelName); throw new BadRequestException("Invalid Model name, only letters, numbers and underline supported."); } -- 2.9.3 (Apple Git-75)