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

jinsongzhou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/amoro.git


The following commit(s) were added to refs/heads/master by this push:
     new f1fbfa1e4 [Improvement] Unify the common parts of the dashboard API 
and the open API (#3014)
f1fbfa1e4 is described below

commit f1fbfa1e4de5b22b92eb9e0fbcce348dea0931ee
Author: ZhouJinsong <[email protected]>
AuthorDate: Thu Jul 11 16:52:23 2024 +0800

    [Improvement] Unify the common parts of the dashboard API and the open API 
(#3014)
    
    * Collect the api group for both dashboard and open api
    
    * Improve the definition of the apis
    
    * Improve signature checking logging message
    
    * Remove debug log message printing
---
 .../amoro-ams-dashboard/mock/modules/catalogs.js   |   2 +-
 .../src/services/setting.services.ts               |   2 +-
 .../amoro/server/dashboard/DashboardServer.java    | 386 ++++++++-------------
 .../dashboard/utils/ParamSignatureCalculator.java  |  15 +-
 .../server/exception/SignatureCheckException.java  |  13 +-
 5 files changed, 167 insertions(+), 251 deletions(-)

diff --git a/amoro-ams/amoro-ams-dashboard/mock/modules/catalogs.js 
b/amoro-ams/amoro-ams-dashboard/mock/modules/catalogs.js
index 746e21861..15623acf2 100644
--- a/amoro-ams/amoro-ams-dashboard/mock/modules/catalogs.js
+++ b/amoro-ams/amoro-ams-dashboard/mock/modules/catalogs.js
@@ -131,7 +131,7 @@ export default [
     response: () => ({ "message": "success", "code": 200, "result": true }),
   },
   {
-    url: '/mock/ams/v1/catalog/metastore/types',
+    url: '/mock/ams/v1/catalogs/metastore/types',
     method: 'get',
     response: () => ({
       "message": "success",
diff --git a/amoro-ams/amoro-ams-dashboard/src/services/setting.services.ts 
b/amoro-ams/amoro-ams-dashboard/src/services/setting.services.ts
index a22747d17..73d13f11c 100644
--- a/amoro-ams/amoro-ams-dashboard/src/services/setting.services.ts
+++ b/amoro-ams/amoro-ams-dashboard/src/services/setting.services.ts
@@ -20,7 +20,7 @@ import type { IMap } from '@/types/common.type'
 import request from '@/utils/request'
 
 export function getCatalogsTypes() {
-  return request.get('ams/v1/catalog/metastore/types')
+  return request.get('ams/v1/catalogs/metastore/types')
 }
 export function getCatalogsSetting(catalogName: string) {
   return request.get(`ams/v1/catalogs/${catalogName}`)
diff --git 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/dashboard/DashboardServer.java
 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/dashboard/DashboardServer.java
index 8d0f73789..c3b848c79 100644
--- 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/dashboard/DashboardServer.java
+++ 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/dashboard/DashboardServer.java
@@ -50,7 +50,7 @@ import org.apache.amoro.server.exception.ForbiddenException;
 import org.apache.amoro.server.exception.SignatureCheckException;
 import org.apache.amoro.server.table.TableService;
 import org.apache.amoro.server.terminal.TerminalManager;
-import org.apache.amoro.utils.JacksonUtil;
+import org.apache.amoro.shade.guava32.com.google.common.base.Preconditions;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -59,16 +59,20 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.UncheckedIOException;
 import java.nio.charset.StandardCharsets;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.function.Consumer;
 
 public class DashboardServer {
 
   public static final Logger LOG = 
LoggerFactory.getLogger(DashboardServer.class);
 
+  private static final String AUTH_TYPE_BASIC = "basic";
+
   private final CatalogController catalogController;
   private final HealthCheckController healthCheckController;
   private final LoginController loginController;
@@ -108,24 +112,29 @@ public class DashboardServer {
   private String indexHtml = "";
 
   // read index.html content
-  public String getFileContent() throws IOException {
-    if ("".equals(indexHtml)) {
-      try (InputStream fileName =
-          
DashboardServer.class.getClassLoader().getResourceAsStream("static/index.html"))
 {
-        try (InputStreamReader isr =
-                new InputStreamReader(fileName, 
StandardCharsets.UTF_8.newDecoder());
-            BufferedReader br = new BufferedReader(isr)) {
-          StringBuilder sb = new StringBuilder();
-          String line;
-          while ((line = br.readLine()) != null) {
-            // process the line
-            sb.append(line);
+  public String getIndexFileContent() {
+    try {
+      if ("".equals(indexHtml)) {
+        try (InputStream fileName =
+            
DashboardServer.class.getClassLoader().getResourceAsStream("static/index.html"))
 {
+          Preconditions.checkNotNull(fileName, "Cannot find index file.");
+          try (InputStreamReader isr =
+                  new InputStreamReader(fileName, 
StandardCharsets.UTF_8.newDecoder());
+              BufferedReader br = new BufferedReader(isr)) {
+            StringBuilder sb = new StringBuilder();
+            String line;
+            while ((line = br.readLine()) != null) {
+              // process the line
+              sb.append(line);
+            }
+            indexHtml = sb.toString();
           }
-          indexHtml = sb.toString();
         }
       }
+      return indexHtml;
+    } catch (IOException e) {
+      throw new UncheckedIOException("Load index html filed", e);
     }
-    return indexHtml;
   }
 
   public Consumer<StaticFileConfig> configStaticFiles() {
@@ -153,25 +162,26 @@ public class DashboardServer {
       path(
           "",
           () -> {
-            //  /docs/latest can't be located to the index.html, so we add 
rule to redirect to it.
-            get("/docs/latest", ctx -> 
ctx.redirect("/docs/latest/index.html"));
-            // unify all addSinglePageRoot(like /tables, /optimizers etc) 
configure here
+            // static files
             get(
                 "/{page}",
                 ctx -> {
                   String fileName = ctx.pathParam("page");
-                  if (fileName != null && fileName.endsWith("ico")) {
+                  if (fileName.endsWith("ico")) {
                     ctx.contentType(ContentType.IMAGE_ICO);
                     ctx.result(
-                        DashboardServer.class
-                            .getClassLoader()
-                            .getResourceAsStream("static/" + fileName));
+                        Objects.requireNonNull(
+                            DashboardServer.class
+                                .getClassLoader()
+                                .getResourceAsStream("static/" + fileName)));
                   } else {
-                    ctx.html(getFileContent());
+                    ctx.html(getIndexFileContent());
                   }
                 });
-            get("/hive-tables/upgrade", ctx -> ctx.html(getFileContent()));
+            get("/hive-tables/upgrade", ctx -> 
ctx.html(getIndexFileContent()));
           });
+
+      // for dashboard api
       path(
           "/ams/v1",
           () -> {
@@ -179,268 +189,179 @@ public class DashboardServer {
             get("/login/current", loginController::getCurrent);
             post("/login", loginController::login);
             post("/logout", loginController::logout);
+          });
+      path("ams/v1", apiGroup());
+
+      // for open api
+      path("/api/ams/v1", apiGroup());
+    };
+  }
 
-            // table controller
+  private EndpointGroup apiGroup() {
+    return () -> {
+      // table apis
+      path(
+          "/tables",
+          () -> {
             get(
-                "/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/details",
+                "/catalogs/{catalog}/dbs/{db}/tables/{table}/details",
                 tableController::getTableDetail);
             get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/hive/details",
+                "/catalogs/{catalog}/dbs/{db}/tables/{table}/hive/details",
                 tableController::getHiveTableDetail);
             post(
-                "/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/upgrade",
+                "/catalogs/{catalog}/dbs/{db}/tables/{table}/upgrade",
                 tableController::upgradeHiveTable);
             get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/upgrade/status",
+                "/catalogs/{catalog}/dbs/{db}/tables/{table}/upgrade/status",
                 tableController::getUpgradeStatus);
-            get("/upgrade/properties", 
tableController::getUpgradeHiveTableProperties);
             get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/optimizing-processes",
+                
"/catalogs/{catalog}/dbs/{db}/tables/{table}/optimizing-processes",
                 tableController::getOptimizingProcesses);
             get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/optimizing-processes/{processId}/tasks",
+                
"/catalogs/{catalog}/dbs/{db}/tables/{table}/optimizing-processes/{processId}/tasks",
                 tableController::getOptimizingProcessTasks);
             get(
-                "/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/snapshots",
+                "/catalogs/{catalog}/dbs/{db}/tables/{table}/snapshots",
                 tableController::getTableSnapshots);
             get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/snapshots/{snapshotId}/detail",
+                
"/catalogs/{catalog}/dbs/{db}/tables/{table}/snapshots/{snapshotId}/detail",
                 tableController::getSnapshotDetail);
             get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/partitions",
+                "/catalogs/{catalog}/dbs/{db}/tables/{table}/partitions",
                 tableController::getTablePartitions);
             get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/partitions/{partition}/files",
+                
"/catalogs/{catalog}/dbs/{db}/tables/{table}/partitions/{partition}/files",
                 tableController::getPartitionFileListInfo);
             get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/operations",
+                "/catalogs/{catalog}/dbs/{db}/tables/{table}/operations",
                 tableController::getTableOperations);
-            get("/catalogs/{catalog}/databases/{db}/tables", 
tableController::getTableList);
-            get("/catalogs/{catalog}/databases", 
tableController::getDatabaseList);
-            get("/catalogs", tableController::getCatalogs);
-            get(
-                "/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/tags",
-                tableController::getTableTags);
+            get("/catalogs/{catalog}/dbs/{db}/tables/{table}/tags", 
tableController::getTableTags);
             get(
-                "/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/branches",
+                "/catalogs/{catalog}/dbs/{db}/tables/{table}/branches",
                 tableController::getTableBranches);
             post(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/optimizing-processes/{processId}/cancel",
+                
"/catalogs/{catalog}/dbs/{db}/tables/{table}/optimizing-processes/{processId}/cancel",
                 tableController::cancelOptimizingProcess);
+          });
+      get("/upgrade/properties", 
tableController::getUpgradeHiveTableProperties);
 
-            // catalog controller
-            post("/catalogs", catalogController::createCatalog);
-            // make sure types is before
-            get("/catalogs/types", catalogController::getCatalogTypeList);
-            get("/catalog/metastore/types", 
catalogController::getCatalogTypeList);
+      // catalog apis
+      path(
+          "/catalogs",
+          () -> {
+            get("/{catalog}/databases/{db}/tables", 
tableController::getTableList);
+            get("/{catalog}/databases", tableController::getDatabaseList);
+            get("", tableController::getCatalogs);
+            post("", catalogController::createCatalog);
+            get("metastore/types", catalogController::getCatalogTypeList);
+            get("/{catalogName}", catalogController::getCatalogDetail);
+            delete("/{catalogName}", catalogController::deleteCatalog);
+            put("/{catalogName}", catalogController::updateCatalog);
+            get("/{catalogName}/delete/check", 
catalogController::catalogDeleteCheck);
+            get("/{catalogName}/config/{type}/{key}", 
catalogController::getCatalogConfFileContent);
+          });
 
-            get("/catalogs/{catalogName}", 
catalogController::getCatalogDetail);
-            delete("/catalogs/{catalogName}", 
catalogController::deleteCatalog);
-            put("/catalogs/{catalogName}", catalogController::updateCatalog);
-            get("/catalogs/{catalogName}/delete/check", 
catalogController::catalogDeleteCheck);
-            get(
-                "/catalogs/{catalogName}/config/{type}/{key}",
-                catalogController::getCatalogConfFileContent);
-            // optimize controller
+      // optimizing api
+      path(
+          "/optimize",
+          () -> {
             get(
-                "/optimize/optimizerGroups/{optimizerGroup}/tables",
+                "/optimizerGroups/{optimizerGroup}/tables",
                 optimizerController::getOptimizerTables);
+            get("/optimizerGroups/{optimizerGroup}/optimizers", 
optimizerController::getOptimizers);
+            get("/optimizerGroups", optimizerController::getOptimizerGroups);
             get(
-                "/optimize/optimizerGroups/{optimizerGroup}/optimizers",
-                optimizerController::getOptimizers);
-            get("/optimize/optimizerGroups", 
optimizerController::getOptimizerGroups);
-            get(
-                "/optimize/optimizerGroups/{optimizerGroup}/info",
+                "/optimizerGroups/{optimizerGroup}/info",
                 optimizerController::getOptimizerGroupInfo);
             delete(
-                
"/optimize/optimizerGroups/{optimizerGroup}/optimizers/{jobId}",
+                "/optimizerGroups/{optimizerGroup}/optimizers/{jobId}",
                 optimizerController::releaseOptimizer);
             post(
-                "/optimize/optimizerGroups/{optimizerGroup}/optimizers",
+                "/optimizerGroups/{optimizerGroup}/optimizers",
                 optimizerController::scaleOutOptimizer);
-            get("/optimize/resourceGroups", 
optimizerController::getResourceGroup);
-            post("/optimize/resourceGroups", 
optimizerController::createResourceGroup);
-            put("/optimize/resourceGroups", 
optimizerController::updateResourceGroup);
-            delete(
-                "/optimize/resourceGroups/{resourceGroupName}",
-                optimizerController::deleteResourceGroup);
+            get("/resourceGroups", optimizerController::getResourceGroup);
+            post("/resourceGroups", optimizerController::createResourceGroup);
+            put("/resourceGroups", optimizerController::updateResourceGroup);
+            delete("/resourceGroups/{resourceGroupName}", 
optimizerController::deleteResourceGroup);
             get(
-                "/optimize/resourceGroups/{resourceGroupName}/delete/check",
+                "/resourceGroups/{resourceGroupName}/delete/check",
                 optimizerController::deleteCheckResourceGroup);
-            get("/optimize/containers/get", 
optimizerController::getContainers);
-
-            // console controller
-            get("/terminal/examples", terminalController::getExamples);
-            get("/terminal/examples/{exampleName}", 
terminalController::getSqlExamples);
-            post("/terminal/catalogs/{catalog}/execute", 
terminalController::executeScript);
-            get("/terminal/{sessionId}/logs", terminalController::getLogs);
-            get("/terminal/{sessionId}/result", 
terminalController::getSqlResult);
-            put("/terminal/{sessionId}/stop", terminalController::stopSql);
-            get("/terminal/latestInfos/", terminalController::getLatestInfo);
-
-            // file controller
-            post("/files", platformFileInfoController::uploadFile);
-            get("/files/{fileId}", platformFileInfoController::downloadFile);
-
-            // setting controller
-            get("/settings/containers", 
settingController::getContainerSetting);
-            get("/settings/system", settingController::getSystemSetting);
-
-            // health check
-            get("/health/status", healthCheckController::healthCheck);
-
-            // version controller
-            get("/versionInfo", versionController::getVersionInfo);
+            get("/containers/get", optimizerController::getContainers);
           });
-      // for open api
+
+      // console apis
       path(
-          "/api/ams/v1",
+          "/terminal",
           () -> {
+            get("/examples", terminalController::getExamples);
+            get("/examples/{exampleName}", terminalController::getSqlExamples);
+            post("/catalogs/{catalog}/execute", 
terminalController::executeScript);
+            get("/{sessionId}/logs", terminalController::getLogs);
+            get("/{sessionId}/result", terminalController::getSqlResult);
+            put("/{sessionId}/stop", terminalController::stopSql);
+            get("/latestInfos/", terminalController::getLatestInfo);
+          });
 
-            // table controller
-            get(
-                "/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/details",
-                tableController::getTableDetail);
-            get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/hive/details",
-                tableController::getHiveTableDetail);
-            post(
-                "/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/upgrade",
-                tableController::upgradeHiveTable);
-            get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/upgrade/status",
-                tableController::getUpgradeStatus);
-            get("/upgrade/properties", 
tableController::getUpgradeHiveTableProperties);
-            get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/optimizing-processes",
-                tableController::getOptimizingProcesses);
-            post(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/optimizing-processes/{processId}/cancel",
-                tableController::cancelOptimizingProcess);
-            get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/optimizing-processes/{processId}/tasks",
-                tableController::getOptimizingProcessTasks);
-            get(
-                "/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/snapshots",
-                tableController::getTableSnapshots);
-            get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/snapshots/{snapshotId}/detail",
-                tableController::getSnapshotDetail);
-            get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/partitions",
-                tableController::getTablePartitions);
-            get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/partitions/{partition}/files",
-                tableController::getPartitionFileListInfo);
-            get(
-                
"/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/operations",
-                tableController::getTableOperations);
-            get(
-                "/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/signature",
-                tableController::getTableDetailTabToken);
-            get("/catalogs/{catalog}/databases/{db}/tables", 
tableController::getTableList);
-            get("/catalogs/{catalog}/databases", 
tableController::getDatabaseList);
-            get("/catalogs", tableController::getCatalogs);
-            get(
-                "/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/tags",
-                tableController::getTableTags);
-            get(
-                "/tables/catalogs/{catalog}/dbs/{db}/tables/{table}/branches",
-                tableController::getTableBranches);
+      // file apis
+      path(
+          "/files",
+          () -> {
+            post("", platformFileInfoController::uploadFile);
+            get("/{fileId}", platformFileInfoController::downloadFile);
+          });
 
-            // optimize controller
-            get(
-                "/optimize/optimizerGroups/{optimizerGroup}/tables",
-                optimizerController::getOptimizerTables);
-            get(
-                "/optimize/optimizerGroups/{optimizerGroup}/optimizers",
-                optimizerController::getOptimizers);
-            get("/optimize/optimizerGroups", 
optimizerController::getOptimizerGroups);
-            get(
-                "/optimize/optimizerGroups/{optimizerGroup}/info",
-                optimizerController::getOptimizerGroupInfo);
-            delete(
-                
"/optimize/optimizerGroups/{optimizerGroup}/optimizers/{jobId}",
-                optimizerController::releaseOptimizer);
-            post(
-                "/optimize/optimizerGroups/{optimizerGroup}/optimizers",
-                optimizerController::scaleOutOptimizer);
-            get("/optimize/resourceGroups", 
optimizerController::getResourceGroup);
-            post("/optimize/resourceGroups", 
optimizerController::createResourceGroup);
-            put("/optimize/resourceGroups", 
optimizerController::updateResourceGroup);
-            delete(
-                "/optimize/resourceGroups/{resourceGroupName}",
-                optimizerController::deleteResourceGroup);
-            get(
-                "/optimize/resourceGroups/{resourceGroupName}/delete/check",
-                optimizerController::deleteCheckResourceGroup);
-            get("/optimize/containers/get", 
optimizerController::getContainers);
-
-            // console controller
-            get("/terminal/examples", terminalController::getExamples);
-            get("/terminal/examples/{exampleName}", 
terminalController::getSqlExamples);
-            post("/terminal/catalogs/{catalog}/execute", 
terminalController::executeScript);
-            get("/terminal/{sessionId}/logs", terminalController::getLogs);
-            get("/terminal/{sessionId}/result", 
terminalController::getSqlResult);
-            put("/terminal/{sessionId}/stop", terminalController::stopSql);
-            get("/terminal/latestInfos/", terminalController::getLatestInfo);
-
-            // health check
-            get("/health/status", healthCheckController::healthCheck);
-
-            // version controller
-            get("/versionInfo", versionController::getVersionInfo);
+      // setting apis
+      path(
+          "/settings",
+          () -> {
+            get("/containers", settingController::getContainerSetting);
+            get("/system", settingController::getSystemSetting);
           });
+
+      // health api
+      get("/health/status", healthCheckController::healthCheck);
+
+      // version api
+      get("/versionInfo", versionController::getVersionInfo);
     };
   }
 
   public void preHandleRequest(Context ctx) {
     String uriPath = ctx.path();
     if (needApiKeyCheck(uriPath)) {
-      if ("basic".equalsIgnoreCase(authType)) {
+      if (AUTH_TYPE_BASIC.equalsIgnoreCase(authType)) {
         BasicAuthCredentials cred = ctx.basicAuthCredentials();
         if (!(basicAuthUser.equals(cred.component1())
             && basicAuthPassword.equals(cred.component2()))) {
-          LOG.debug(
-              String.format(
-                  "Failed to authenticate via basic authentication.  Request 
url: %s %s.",
-                  ctx.req.getMethod(), uriPath));
-          throw new SignatureCheckException();
+          throw new SignatureCheckException(
+              "Failed to authenticate via basic authentication for url:" + 
uriPath);
         }
       } else {
         checkApiToken(
-            ctx.method(),
-            ctx.url(),
-            ctx.queryParam("apiKey"),
-            ctx.queryParam("signature"),
-            ctx.queryParamMap());
+            ctx.url(), ctx.queryParam("apiKey"), ctx.queryParam("signature"), 
ctx.queryParamMap());
       }
     } else if (needLoginCheck(uriPath)) {
       if (null == ctx.sessionAttribute("user")) {
-        LOG.info("session info: {}", 
JacksonUtil.toJSONString(ctx.sessionAttributeMap()));
-        throw new ForbiddenException();
+        throw new ForbiddenException("User session attribute is missed for 
url: " + uriPath);
       }
     }
   }
 
   public void handleException(Exception e, Context ctx) {
     if (e instanceof ForbiddenException) {
-      try {
-        // request doesn't start with /ams is  page request. we return 
index.html
-        if (!ctx.req.getRequestURI().startsWith("/ams")) {
-          ctx.html(getFileContent());
-        } else {
-          ctx.json(new ErrorResponse(HttpCode.FORBIDDEN, "need login before 
request", ""));
-        }
-      } catch (Exception fe) {
-        LOG.error("Failed to handle request", fe);
+      // request doesn't start with /ams is  page request. we return index.html
+      if (!ctx.req.getRequestURI().startsWith("/ams")) {
+        ctx.html(getIndexFileContent());
+      } else {
+        ctx.json(new ErrorResponse(HttpCode.FORBIDDEN, "Please login first", 
""));
       }
     } else if (e instanceof SignatureCheckException) {
-      ctx.json(new ErrorResponse(HttpCode.FORBIDDEN, "Signature Exception  
before request", ""));
+      ctx.json(new ErrorResponse(HttpCode.FORBIDDEN, "Signature check failed", 
""));
     } else {
-      LOG.error("Failed to handle request", e);
       ctx.json(new ErrorResponse(HttpCode.INTERNAL_SERVER_ERROR, 
e.getMessage(), ""));
     }
+    LOG.error("An error occurred while processing the url:{}", ctx.url(), e);
   }
 
   private static final String[] urlWhiteList = {
@@ -482,22 +403,16 @@ public class DashboardServer {
   }
 
   private void checkApiToken(
-      String requestMethod,
-      String requestUrl,
-      String apiKey,
-      String signature,
-      Map<String, List<String>> params) {
+      String requestUrl, String apiKey, String signature, Map<String, 
List<String>> params) {
     String plainText;
     String encryptString;
     String signCal;
-    LOG.debug("[{}] url: {}, ", requestMethod, requestUrl);
 
-    long receive = System.currentTimeMillis();
     APITokenManager apiTokenService = new APITokenManager();
     try {
-      String secrete = apiTokenService.getSecretByKey(apiKey);
+      String secret = apiTokenService.getSecretByKey(apiKey);
 
-      if (secrete == null) {
+      if (secret == null) {
         throw new SignatureCheckException();
       }
 
@@ -516,27 +431,24 @@ public class DashboardServer {
         encryptString = paramString;
       }
 
-      plainText = String.format("%s%s%s", apiKey, encryptString, secrete);
+      plainText = String.format("%s%s%s", apiKey, encryptString, secret);
       signCal = ParamSignatureCalculator.getMD5(plainText);
-      LOG.info(
-          "calculate:  plainText:{}, signCal:{}, signFromRequest: {}",
+      LOG.debug(
+          "Calculated signature for url:{}, plain text:{}, calculated 
signature:{}, signature in request: {}",
+          requestUrl,
           plainText,
           signCal,
           signature);
 
       if (!signature.equals(signCal)) {
-        LOG.error(String.format("Signature Check Failed!!, req:%s, cal:%s", 
signature, signCal));
-        throw new SignatureCheckException();
+        throw new SignatureCheckException(
+            String.format(
+                "Check signature for url:%s failed,"
+                    + " calculated signature:%s, signature in request:%s",
+                requestUrl, signCal, signature));
       }
     } catch (Exception e) {
-      LOG.error("api doFilter error.", e);
-      throw new SignatureCheckException();
-    } finally {
-      LOG.debug(
-          "[finish] in {} ms, [{}] {}",
-          System.currentTimeMillis() - receive,
-          requestMethod,
-          requestUrl);
+      throw new SignatureCheckException("Check url signature failed", e);
     }
   }
 }
diff --git 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/dashboard/utils/ParamSignatureCalculator.java
 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/dashboard/utils/ParamSignatureCalculator.java
index f1f368337..0d4b5799d 100644
--- 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/dashboard/utils/ParamSignatureCalculator.java
+++ 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/dashboard/utils/ParamSignatureCalculator.java
@@ -51,7 +51,7 @@ public class ParamSignatureCalculator {
         str[k++] = hexDigits[byte0 & 0xf];
       }
     } catch (Exception e) {
-      LOG.error("failed", e);
+      throw new RuntimeException("Calculate md5 value failed", e);
     }
     return new String(str);
   }
@@ -63,13 +63,7 @@ public class ParamSignatureCalculator {
    * @return the MD5 hash of the given value as a string
    */
   public static String getMD5(String value) {
-    String result = "";
-    try {
-      result = getMD5(value.getBytes(StandardCharsets.UTF_8));
-    } catch (Exception e) {
-      LOG.error("get MD5 Error!!", e);
-    }
-    return result;
+    return getMD5(value.getBytes(StandardCharsets.UTF_8));
   }
 
   /**
@@ -95,8 +89,7 @@ public class ParamSignatureCalculator {
                     ? ""
                     : entry.getKey() + URLDecoder.decode(sortedValues.get(0), 
"utf-8");
               } catch (UnsupportedEncodingException e) {
-                LOG.error("Failed to calculate signature", e);
-                return null;
+                throw new RuntimeException("Calculate signature failed", e);
               }
             })
         .collect(Collectors.joining());
@@ -120,7 +113,7 @@ public class ParamSignatureCalculator {
                 try {
                   return key + URLDecoder.decode(map.get(key), "UTF-8");
                 } catch (UnsupportedEncodingException e) {
-                  LOG.error("Failed to decode url value: {}", map.get(key), e);
+                  throw new RuntimeException("Calculate signature failed", e);
                 }
               }
               return null;
diff --git 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/exception/SignatureCheckException.java
 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/exception/SignatureCheckException.java
index 9c238b2bc..3dd53034e 100644
--- 
a/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/exception/SignatureCheckException.java
+++ 
b/amoro-ams/amoro-ams-server/src/main/java/org/apache/amoro/server/exception/SignatureCheckException.java
@@ -19,4 +19,15 @@
 package org.apache.amoro.server.exception;
 
 /** SignatureCheckException */
-public class SignatureCheckException extends AmoroRuntimeException {}
+public class SignatureCheckException extends AmoroRuntimeException {
+
+  public SignatureCheckException() {}
+
+  public SignatureCheckException(String message) {
+    super(message);
+  }
+
+  public SignatureCheckException(String message, Throwable throwable) {
+    super(message, throwable);
+  }
+}

Reply via email to