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);
+ }
+}