This is an automated email from the ASF dual-hosted git repository.
lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git
The following commit(s) were added to refs/heads/rocketmq-studio by this push:
new 57818da6 fix(security): exclude credentials from request DTO toString
(#1711)
57818da6 is described below
commit 57818da6b53667af97064453fb728eb7a9600333
Author: youngkermit8-coder <[email protected]>
AuthorDate: Tue Aug 11 20:52:09 2026 +0800
fix(security): exclude credentials from request DTO toString (#1711)
Signed-off-by: youngkermit8-coder <[email protected]>
---
.../instance/acl/UpsertPlainAccessConfigDTO.java | 3 +
.../request/MetricsDataSourceQueryRequest.java | 3 +
.../rocketmq/studio/ops/ai/LlmConfigDTO.java | 2 +
.../credential/CreateCloudCredentialDTO.java | 3 +
.../credential/UpdateCloudCredentialDTO.java | 2 +
.../studio/auth/SensitiveRequestToStringTest.java | 69 ++++++++++++++++++++++
6 files changed, 82 insertions(+)
diff --git
a/server/src/main/java/org/apache/rocketmq/studio/instance/acl/UpsertPlainAccessConfigDTO.java
b/server/src/main/java/org/apache/rocketmq/studio/instance/acl/UpsertPlainAccessConfigDTO.java
index 67675645..4eb259c9 100644
---
a/server/src/main/java/org/apache/rocketmq/studio/instance/acl/UpsertPlainAccessConfigDTO.java
+++
b/server/src/main/java/org/apache/rocketmq/studio/instance/acl/UpsertPlainAccessConfigDTO.java
@@ -18,6 +18,7 @@ package org.apache.rocketmq.studio.instance.acl;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
+import lombok.ToString;
import java.util.List;
@@ -30,8 +31,10 @@ import java.util.List;
public class UpsertPlainAccessConfigDTO {
@NotBlank(message = "accessKey is required")
+ @ToString.Exclude
private String accessKey;
+ @ToString.Exclude
private String secretKey;
private String whiteRemoteAddress;
diff --git
a/server/src/main/java/org/apache/rocketmq/studio/model/request/MetricsDataSourceQueryRequest.java
b/server/src/main/java/org/apache/rocketmq/studio/model/request/MetricsDataSourceQueryRequest.java
index 61411ce6..42afb2ef 100644
---
a/server/src/main/java/org/apache/rocketmq/studio/model/request/MetricsDataSourceQueryRequest.java
+++
b/server/src/main/java/org/apache/rocketmq/studio/model/request/MetricsDataSourceQueryRequest.java
@@ -20,6 +20,7 @@ import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import org.apache.rocketmq.studio.cluster.metrics.MetricQueryDTO;
import lombok.Data;
+import lombok.ToString;
/**
* Request to run a PromQL range query against a configured data source.
@@ -40,7 +41,9 @@ public class MetricsDataSourceQueryRequest {
private String username;
+ @ToString.Exclude
private String password;
+ @ToString.Exclude
private String bearerToken;
}
diff --git
a/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmConfigDTO.java
b/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmConfigDTO.java
index d2220e6e..93831343 100644
--- a/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmConfigDTO.java
+++ b/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmConfigDTO.java
@@ -17,12 +17,14 @@
package org.apache.rocketmq.studio.ops.ai;
import lombok.Data;
+import lombok.ToString;
@Data
public class LlmConfigDTO {
private String provider;
private String engine;
+ @ToString.Exclude
private String apiKey;
private String apiBase;
private String model;
diff --git
a/server/src/main/java/org/apache/rocketmq/studio/provider/credential/CreateCloudCredentialDTO.java
b/server/src/main/java/org/apache/rocketmq/studio/provider/credential/CreateCloudCredentialDTO.java
index 077349e8..57425d99 100644
---
a/server/src/main/java/org/apache/rocketmq/studio/provider/credential/CreateCloudCredentialDTO.java
+++
b/server/src/main/java/org/apache/rocketmq/studio/provider/credential/CreateCloudCredentialDTO.java
@@ -19,6 +19,7 @@ package org.apache.rocketmq.studio.provider.credential;
import jakarta.validation.constraints.NotBlank;
import org.apache.rocketmq.studio.common.domain.enums.InstanceVendor;
import lombok.Data;
+import lombok.ToString;
import java.util.Locale;
@@ -32,9 +33,11 @@ public class CreateCloudCredentialDTO {
private String vendor;
@NotBlank(message = "credential accessKey is required")
+ @ToString.Exclude
private String accessKey;
@NotBlank(message = "credential secretKey is required")
+ @ToString.Exclude
private String secretKey;
private String remark;
diff --git
a/server/src/main/java/org/apache/rocketmq/studio/provider/credential/UpdateCloudCredentialDTO.java
b/server/src/main/java/org/apache/rocketmq/studio/provider/credential/UpdateCloudCredentialDTO.java
index 6219c5bc..9b22bd1a 100644
---
a/server/src/main/java/org/apache/rocketmq/studio/provider/credential/UpdateCloudCredentialDTO.java
+++
b/server/src/main/java/org/apache/rocketmq/studio/provider/credential/UpdateCloudCredentialDTO.java
@@ -18,6 +18,7 @@ package org.apache.rocketmq.studio.provider.credential;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
+import lombok.ToString;
@Data
public class UpdateCloudCredentialDTO {
@@ -27,6 +28,7 @@ public class UpdateCloudCredentialDTO {
private String name;
+ @ToString.Exclude
private String secretKey;
private String remark;
diff --git
a/server/src/test/java/org/apache/rocketmq/studio/auth/SensitiveRequestToStringTest.java
b/server/src/test/java/org/apache/rocketmq/studio/auth/SensitiveRequestToStringTest.java
new file mode 100644
index 00000000..a7ef476e
--- /dev/null
+++
b/server/src/test/java/org/apache/rocketmq/studio/auth/SensitiveRequestToStringTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rocketmq.studio.auth;
+
+import org.apache.rocketmq.studio.instance.acl.UpsertPlainAccessConfigDTO;
+import org.apache.rocketmq.studio.model.request.MetricsDataSourceQueryRequest;
+import org.apache.rocketmq.studio.ops.ai.LlmConfigDTO;
+import org.apache.rocketmq.studio.provider.credential.CreateCloudCredentialDTO;
+import org.apache.rocketmq.studio.provider.credential.UpdateCloudCredentialDTO;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class SensitiveRequestToStringTest {
+
+ @Test
+ void requestToStringShouldNotExposeSecrets() {
+ LlmConfigDTO llm = new LlmConfigDTO();
+ llm.setProvider("openai");
+ llm.setApiKey("llm-secret-value");
+
+ CreateCloudCredentialDTO createCredential = new
CreateCloudCredentialDTO();
+ createCredential.setName("production");
+ createCredential.setAccessKey("cloud-access-key");
+ createCredential.setSecretKey("cloud-secret-key");
+
+ UpdateCloudCredentialDTO updateCredential = new
UpdateCloudCredentialDTO();
+ updateCredential.setId("credential-1");
+ updateCredential.setSecretKey("rotated-cloud-secret");
+
+ UpsertPlainAccessConfigDTO plainAccess = new
UpsertPlainAccessConfigDTO();
+ plainAccess.setAccessKey("rocketmq-access-key");
+ plainAccess.setSecretKey("rocketmq-secret-key");
+
+ MetricsDataSourceQueryRequest metrics = new
MetricsDataSourceQueryRequest();
+ metrics.setInstanceId("instance-1");
+ metrics.setPassword("metrics-password");
+ metrics.setBearerToken("metrics-bearer-token");
+
+ assertThat(llm.toString())
+ .contains("provider=openai")
+ .doesNotContain("llm-secret-value");
+ assertThat(createCredential.toString())
+ .contains("name=production")
+ .doesNotContain("cloud-access-key", "cloud-secret-key");
+ assertThat(updateCredential.toString())
+ .contains("id=credential-1")
+ .doesNotContain("rotated-cloud-secret");
+ assertThat(plainAccess.toString())
+ .doesNotContain("rocketmq-access-key", "rocketmq-secret-key");
+ assertThat(metrics.toString())
+ .contains("instanceId=instance-1")
+ .doesNotContain("metrics-password", "metrics-bearer-token");
+ }
+}