This is an automated email from the ASF dual-hosted git repository.
xxyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kylin.git
The following commit(s) were added to refs/heads/master by this push:
new 59b0bf3 KYLIN-4617 Check whether project/jobid exists before download
diagnosis package
59b0bf3 is described below
commit 59b0bf32921afea2f85035a79744756a3602039a
Author: Zhichao Zhang <[email protected]>
AuthorDate: Thu Jul 2 11:44:54 2020 +0800
KYLIN-4617 Check whether project/jobid exists before download diagnosis
package
When download diagnosis package, it's better to check whether project/jobid
exists, if not, it raise a BadRequestException with XXX doesn't exist instead
of NPE.
---
.../kylin/common/util/CliCommandExecutor.java | 2 +-
.../kylin/rest/controller/DiagnosisController.java | 5 ++---
.../java/org/apache/kylin/rest/msg/CnMessage.java | 8 +++++++
.../java/org/apache/kylin/rest/msg/Message.java | 8 +++++++
.../kylin/rest/service/DiagnosisService.java | 22 +++++++++++++++++--
.../org/apache/kylin/rest/util/AclEvaluate.java | 25 ++++++++++++++++++----
6 files changed, 60 insertions(+), 10 deletions(-)
diff --git
a/core-common/src/main/java/org/apache/kylin/common/util/CliCommandExecutor.java
b/core-common/src/main/java/org/apache/kylin/common/util/CliCommandExecutor.java
index bb08b4c..74ea1f9 100644
---
a/core-common/src/main/java/org/apache/kylin/common/util/CliCommandExecutor.java
+++
b/core-common/src/main/java/org/apache/kylin/common/util/CliCommandExecutor.java
@@ -163,7 +163,7 @@ public class CliCommandExecutor {
}
}
- public static final String COMMAND_BLOCK_LIST = "[
&`>|{}()$;\\#~!+*\\\\]+";
+ public static final String COMMAND_BLOCK_LIST = "[
&`>|{}()$;\\-#~!+*\\\\]+";
public static final String COMMAND_WHITE_LIST = "[^\\w%,@/:=?.\"\\[\\]]";
public static final String HIVE_BLOCK_LIST = "[ <>()$;\\-#!+*\"'/=%@]+";
diff --git
a/server-base/src/main/java/org/apache/kylin/rest/controller/DiagnosisController.java
b/server-base/src/main/java/org/apache/kylin/rest/controller/DiagnosisController.java
index 6bb16fe..190ee43 100644
---
a/server-base/src/main/java/org/apache/kylin/rest/controller/DiagnosisController.java
+++
b/server-base/src/main/java/org/apache/kylin/rest/controller/DiagnosisController.java
@@ -26,7 +26,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.kylin.common.persistence.AutoDeleteDirectory;
-import org.apache.kylin.common.util.CliCommandExecutor;
import org.apache.kylin.metadata.badquery.BadQueryEntry;
import org.apache.kylin.metadata.badquery.BadQueryHistory;
import org.apache.kylin.rest.exception.InternalErrorException;
@@ -80,7 +79,7 @@ public class DiagnosisController extends BasicController {
public void dumpProjectDiagnosisInfo(@PathVariable String project, final
HttpServletRequest request,
final HttpServletResponse response) {
try (AutoDeleteDirectory diagDir = new
AutoDeleteDirectory("diag_project", "")) {
- String filePath =
dgService.dumpProjectDiagnosisInfo(CliCommandExecutor.checkParameter(project),
diagDir.getFile());
+ String filePath = dgService.dumpProjectDiagnosisInfo(project,
diagDir.getFile());
setDownloadResponse(filePath, response);
} catch (IOException e) {
throw new InternalErrorException("Failed to dump project diagnosis
info. " + e.getMessage(), e);
@@ -96,7 +95,7 @@ public class DiagnosisController extends BasicController {
public void dumpJobDiagnosisInfo(@PathVariable String jobId, final
HttpServletRequest request,
final HttpServletResponse response) {
try (AutoDeleteDirectory diagDir = new AutoDeleteDirectory("diag_job",
"")) {
- String filePath =
dgService.dumpJobDiagnosisInfo(CliCommandExecutor.checkParameter(jobId),
diagDir.getFile());
+ String filePath = dgService.dumpJobDiagnosisInfo(jobId,
diagDir.getFile());
setDownloadResponse(filePath, response);
} catch (IOException e) {
throw new InternalErrorException("Failed to dump job diagnosis
info. " + e.getMessage(), e);
diff --git a/server-base/src/main/java/org/apache/kylin/rest/msg/CnMessage.java
b/server-base/src/main/java/org/apache/kylin/rest/msg/CnMessage.java
index 4424ef9..cdf3cbb 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/msg/CnMessage.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/msg/CnMessage.java
@@ -404,6 +404,14 @@ public class CnMessage extends Message {
return "找不到诊断包, 路径: %s";
}
+ public String getDIAG_PROJECT_NOT_FOUND() {
+ return "找不到项目: %s.";
+ }
+
+ public String getDIAG_JOBID_NOT_FOUND() {
+ return "找不到任务ID: %s.";
+ }
+
// Encoding
public String getVALID_ENCODING_NOT_AVAILABLE() {
return "无法为数据类型: %s 提供合法的编码";
diff --git a/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java
b/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java
index ea23761..dbd637c 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java
@@ -417,6 +417,14 @@ public class Message {
return "Diagnosis package not found in directory: %s.";
}
+ public String getDIAG_PROJECT_NOT_FOUND() {
+ return "Can not find project: %s.";
+ }
+
+ public String getDIAG_JOBID_NOT_FOUND() {
+ return "Can not find job id: %s.";
+ }
+
// Encoding
public String getVALID_ENCODING_NOT_AVAILABLE() {
return "Can not provide valid encodings for datatype: %s.";
diff --git
a/server-base/src/main/java/org/apache/kylin/rest/service/DiagnosisService.java
b/server-base/src/main/java/org/apache/kylin/rest/service/DiagnosisService.java
index 7eb96c8..66b7ba0 100644
---
a/server-base/src/main/java/org/apache/kylin/rest/service/DiagnosisService.java
+++
b/server-base/src/main/java/org/apache/kylin/rest/service/DiagnosisService.java
@@ -30,12 +30,16 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.kylin.common.KylinConfig;
import org.apache.kylin.common.util.CliCommandExecutor;
import org.apache.kylin.common.util.Pair;
+import org.apache.kylin.job.JobInstance;
import org.apache.kylin.metadata.badquery.BadQueryEntry;
import org.apache.kylin.metadata.badquery.BadQueryHistory;
+import org.apache.kylin.metadata.project.ProjectInstance;
+import org.apache.kylin.metadata.project.ProjectManager;
import org.apache.kylin.rest.exception.BadRequestException;
import org.apache.kylin.rest.msg.Message;
import org.apache.kylin.rest.msg.MsgPicker;
import org.apache.kylin.rest.util.AclEvaluate;
+import org.apache.kylin.rest.util.ValidateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -81,14 +85,28 @@ public class DiagnosisService extends BasicService {
}
public String dumpProjectDiagnosisInfo(String project, File exportPath)
throws IOException {
- aclEvaluate.checkProjectOperationPermission(project);
+ Message msg = MsgPicker.getMsg();
+ ProjectInstance projectInstance =
+ ProjectManager.getInstance(KylinConfig.getInstanceFromEnv())
+
.getProject(ValidateUtil.convertStringToBeAlphanumericUnderscore(project));
+ if (null == projectInstance) {
+ throw new BadRequestException(
+ String.format(Locale.ROOT,
msg.getDIAG_PROJECT_NOT_FOUND(), project));
+ }
+ aclEvaluate.checkProjectOperationPermission(projectInstance);
String[] args = { project, exportPath.getAbsolutePath() };
runDiagnosisCLI(args);
return getDiagnosisPackageName(exportPath);
}
public String dumpJobDiagnosisInfo(String jobId, File exportPath) throws
IOException {
-
aclEvaluate.checkProjectOperationPermission(jobService.getJobInstance(jobId));
+ Message msg = MsgPicker.getMsg();
+ JobInstance jobInstance = jobService.getJobInstance(jobId);
+ if (null == jobInstance) {
+ throw new BadRequestException(
+ String.format(Locale.ROOT, msg.getDIAG_JOBID_NOT_FOUND(),
jobId));
+ }
+ aclEvaluate.checkProjectOperationPermission(jobInstance);
String[] args = { jobId, exportPath.getAbsolutePath() };
runDiagnosisCLI(args);
return getDiagnosisPackageName(exportPath);
diff --git
a/server-base/src/main/java/org/apache/kylin/rest/util/AclEvaluate.java
b/server-base/src/main/java/org/apache/kylin/rest/util/AclEvaluate.java
index dcd625a..3cfcfae 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/util/AclEvaluate.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/util/AclEvaluate.java
@@ -60,25 +60,42 @@ public class AclEvaluate {
return getProjectInstance(projectName);
}
+ public void checkProjectAdminPermission(ProjectInstance projectInstance) {
+ aclUtil.hasProjectAdminPermission(projectInstance);
+ }
+
+ //for raw project
+ public void checkProjectReadPermission(ProjectInstance projectInstance) {
+ aclUtil.hasProjectReadPermission(projectInstance);
+ }
+
+ public void checkProjectWritePermission(ProjectInstance projectInstance) {
+ aclUtil.hasProjectWritePermission(projectInstance);
+ }
+
+ public void checkProjectOperationPermission(ProjectInstance
projectInstance) {
+ aclUtil.hasProjectOperationPermission(projectInstance);
+ }
+
public void checkProjectAdminPermission(String projectName) {
ProjectInstance projectInstance = getProjectInstance(projectName);
- aclUtil.hasProjectAdminPermission(projectInstance);
+ checkProjectAdminPermission(projectInstance);
}
//for raw project
public void checkProjectReadPermission(String projectName) {
ProjectInstance projectInstance = getProjectInstance(projectName);
- aclUtil.hasProjectReadPermission(projectInstance);
+ checkProjectReadPermission(projectInstance);
}
public void checkProjectWritePermission(String projectName) {
ProjectInstance projectInstance = getProjectInstance(projectName);
- aclUtil.hasProjectWritePermission(projectInstance);
+ checkProjectWritePermission(projectInstance);
}
public void checkProjectOperationPermission(String projectName) {
ProjectInstance projectInstance = getProjectInstance(projectName);
- aclUtil.hasProjectOperationPermission(projectInstance);
+ checkProjectOperationPermission(projectInstance);
}
//for cube acl entity