You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2020/06/11 10:56:14 UTC

[kylin] branch 3.0.x updated: Minor, refactor

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

shaofengshi pushed a commit to branch 3.0.x
in repository https://gitbox.apache.org/repos/asf/kylin.git


The following commit(s) were added to refs/heads/3.0.x by this push:
     new d7b73e3  Minor, refactor
d7b73e3 is described below

commit d7b73e311dc665585245a4870d0022e190eaf197
Author: rupengwang <wa...@live.cn>
AuthorDate: Thu Jun 11 13:54:59 2020 +0800

    Minor, refactor
    
    - disbale setting kylin config
    - add check for database name
    - add check for command parameter
---
 .../main/java/org/apache/kylin/common/KylinConfigBase.java  |  6 +++++-
 .../org/apache/kylin/common/util/CliCommandExecutor.java    | 12 +++++++++---
 .../apache/kylin/common/util/CliCommandExecutorTest.java    | 13 +++++++++++++
 .../org/apache/kylin/rest/controller/AdminController.java   |  4 ++++
 .../apache/kylin/rest/controller/DiagnosisController.java   |  5 +++--
 .../java/org/apache/kylin/rest/service/AdminService.java    |  5 +++++
 6 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
index 7953807..86fd831 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
@@ -955,7 +955,7 @@ public abstract class KylinConfigBase implements Serializable {
     }
 
     public String getHiveDatabaseForIntermediateTable() {
-        return this.getOptional("kylin.source.hive.database-for-flat-table", DEFAULT);
+        return CliCommandExecutor.checkHiveProperty(this.getOptional("kylin.source.hive.database-for-flat-table", DEFAULT));
     }
 
     public String getFlatTableStorageFormat() {
@@ -1950,6 +1950,10 @@ public abstract class KylinConfigBase implements Serializable {
         return Boolean.parseBoolean(getOptional("kylin.web.dashboard-enabled", FALSE));
     }
 
+    public boolean isWebConfigEnabled() {
+        return Boolean.parseBoolean(getOptional("kylin.web.set-config-enable", FALSE));
+    }
+
     public String getPropertiesWhiteList() {
         return getOptional("kylin.web.properties.whitelist", "kylin.web.timezone,kylin.query.cache-enabled,kylin.env,"
                 + "kylin.web.hive-limit,kylin.storage.default,"
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 c7600fd..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,8 +163,10 @@ public class CliCommandExecutor {
         }
     }
 
-    public static final String COMMAND_INJECT_REX = "[ &`>|{}()$;\\-#~!+*”\\\\]+";
+    public static final String COMMAND_BLOCK_LIST = "[ &`>|{}()$;\\-#~!+*\\\\]+";
     public static final String COMMAND_WHITE_LIST = "[^\\w%,@/:=?.\"\\[\\]]";
+    public static final String HIVE_BLOCK_LIST = "[ <>()$;\\-#!+*\"'/=%@]+";
+
 
     /**
      * <pre>
@@ -188,17 +190,21 @@ public class CliCommandExecutor {
      * </pre>
      */
     public static String checkParameter(String commandParameter) {
-        return checkParameter(commandParameter, COMMAND_INJECT_REX);
+        return checkParameter(commandParameter, COMMAND_BLOCK_LIST);
     }
 
     public static String checkParameterWhiteList(String commandParameter) {
         return checkParameter(commandParameter, COMMAND_WHITE_LIST);
     }
 
+    public static String checkHiveProperty(String hiveProperty) {
+        return checkParameter(hiveProperty, HIVE_BLOCK_LIST);
+    }
+
     private static String checkParameter(String commandParameter, String rex) {
         String repaired = commandParameter.replaceAll(rex, "");
         if (repaired.length() != commandParameter.length()) {
-            logger.info("Detected illegal character in command {} by {} , replace it to {}.", commandParameter, rex, repaired);
+            logger.warn("Detected illegal character in command {} by {} , replace it to {}.", commandParameter, rex, repaired);
         }
         return repaired;
     }
diff --git a/core-common/src/test/java/org/apache/kylin/common/util/CliCommandExecutorTest.java b/core-common/src/test/java/org/apache/kylin/common/util/CliCommandExecutorTest.java
index 043e4b5..18aea77 100644
--- a/core-common/src/test/java/org/apache/kylin/common/util/CliCommandExecutorTest.java
+++ b/core-common/src/test/java/org/apache/kylin/common/util/CliCommandExecutorTest.java
@@ -35,6 +35,12 @@ public class CliCommandExecutorTest {
             {"c1 | ${c2}", "c1c2"},
     };
 
+    private String[][] properties = {
+            {"default;show tables", "defaultshowtables"},
+            {"default_kylin;drop tables;", "default_kylindroptables"},
+            {"db and 1=2", "dband12"}
+    };
+
     @Test
     public void testCmd() {
         for (String[] pair : commands) {
@@ -48,4 +54,11 @@ public class CliCommandExecutorTest {
             assertEquals(pair[1], CliCommandExecutor.checkParameterWhiteList(pair[0]));
         }
     }
+
+    @Test
+    public void testHiveProperties() {
+        for (String[] pair : properties) {
+            assertEquals(pair[1], CliCommandExecutor.checkHiveProperty(pair[0]));
+        }
+    }
 }
diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller/AdminController.java b/server-base/src/main/java/org/apache/kylin/rest/controller/AdminController.java
index 843c609..2529c93 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/controller/AdminController.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/controller/AdminController.java
@@ -25,6 +25,7 @@ import org.apache.commons.configuration.ConfigurationException;
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.KylinVersion;
 import org.apache.kylin.common.util.VersionUtil;
+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.request.MetricsRequest;
@@ -120,6 +121,9 @@ public class AdminController extends BasicController {
 
     @RequestMapping(value = "/config", method = { RequestMethod.PUT }, produces = { "application/json" })
     public void updateKylinConfig(@RequestBody UpdateConfigRequest updateConfigRequest) {
+        if (!adminService.configWritableStatus()) {
+            throw new BadRequestException("Update configuration from API is not allowed.");
+        }
         adminService.updateConfig(updateConfigRequest.getKey(), updateConfigRequest.getValue());
     }
 
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 dd9eb44..6d22df9 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,6 +26,7 @@ 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;
@@ -79,7 +80,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(project, diagDir.getFile());
+            String filePath = dgService.dumpProjectDiagnosisInfo(CliCommandExecutor.checkParameter(project), diagDir.getFile());
             setDownloadResponse(filePath, response);
         } catch (IOException e) {
             throw new InternalErrorException("Failed to dump project diagnosis info. " + e.getMessage(), e);
@@ -95,7 +96,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(jobId, diagDir.getFile());
+            String filePath = dgService.dumpJobDiagnosisInfo(CliCommandExecutor.checkParameter(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/service/AdminService.java b/server-base/src/main/java/org/apache/kylin/rest/service/AdminService.java
index 6abbe98..d10ee44 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/AdminService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/AdminService.java
@@ -91,6 +91,11 @@ public class AdminService extends BasicService {
     }
 
     @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN)
+    public boolean configWritableStatus() {
+        return KylinConfig.getInstanceFromEnv().isWebConfigEnabled();
+    }
+
+    @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN)
     public void cleanupStorage() {
         StorageCleanupJob job = null;
         try {