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 056a82bc fix: redact credentials from diagnostic output (#928)
056a82bc is described below

commit 056a82bc3c4d1ac9e4118f3fa92f459aa3cf640f
Author: aias00 <[email protected]>
AuthorDate: Tue Aug 4 03:04:23 2026 -0700

    fix: redact credentials from diagnostic output (#928)
    
    * [ISSUE #819] Redact user password in toString
    
    * [ISSUE #821] Redact datasource test credentials in toString
    
    * [ISSUE #823] Redact login password in toString
    
    * [ISSUE #825] Redact login token in toString
    
    * [ISSUE #827] Redact ACL user credentials in toString
    
    * [ISSUE #838] Redact settings JSON from toString
---
 .../org/apache/rocketmq/studio/auth/LoginDTO.java  |  2 ++
 .../org/apache/rocketmq/studio/auth/LoginVO.java   |  2 ++
 .../rocketmq/studio/instance/acl/AclUserVO.java    |  3 ++
 .../org/apache/rocketmq/studio/model/User.java     |  2 +-
 .../studio/persistence/entity/RmqSettings.java     |  2 ++
 .../studio/settings/DataSourceTestDTO.java         |  3 ++
 .../apache/rocketmq/studio/auth/LoginDTOTest.java} | 34 ++++++++----------
 .../apache/rocketmq/studio/auth/LoginVOTest.java}  | 40 ++++++++++-----------
 .../studio/instance/acl/AclUserVOTest.java}        | 40 ++++++++++++---------
 .../apache/rocketmq/studio/model/UserTest.java}    | 33 +++++++----------
 .../persistence/entity/RmqSettingsTest.java}       | 27 ++++++++------
 .../studio/settings/DataSourceTestDTOTest.java}    | 41 ++++++++++++----------
 12 files changed, 122 insertions(+), 107 deletions(-)

diff --git a/server/src/main/java/org/apache/rocketmq/studio/auth/LoginDTO.java 
b/server/src/main/java/org/apache/rocketmq/studio/auth/LoginDTO.java
index cd534770..d2ae6150 100644
--- a/server/src/main/java/org/apache/rocketmq/studio/auth/LoginDTO.java
+++ b/server/src/main/java/org/apache/rocketmq/studio/auth/LoginDTO.java
@@ -18,9 +18,11 @@
 package org.apache.rocketmq.studio.auth;
 
 import lombok.Data;
+import lombok.ToString;
 
 @Data
 public class LoginDTO {
     private String username;
+    @ToString.Exclude
     private String password;
 }
diff --git a/server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java 
b/server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java
index 686ec392..98bb105c 100644
--- a/server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java
+++ b/server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java
@@ -21,12 +21,14 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import lombok.ToString;
 
 @Data
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class LoginVO {
+    @ToString.Exclude
     private String token;
     private int expiresIn;
     private UserInfo user;
diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/instance/acl/AclUserVO.java 
b/server/src/main/java/org/apache/rocketmq/studio/instance/acl/AclUserVO.java
index 9e917848..2c51c4f8 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/instance/acl/AclUserVO.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/instance/acl/AclUserVO.java
@@ -20,6 +20,7 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import lombok.ToString;
 
 import java.time.LocalDateTime;
 import java.util.List;
@@ -31,7 +32,9 @@ import java.util.List;
 public class AclUserVO {
     private String id;
     private String username;
+    @ToString.Exclude
     private String accessKey;
+    @ToString.Exclude
     private String secretKey;
     private boolean admin;
     private List<String> clusters;
diff --git a/server/src/main/java/org/apache/rocketmq/studio/model/User.java 
b/server/src/main/java/org/apache/rocketmq/studio/model/User.java
index 020aed11..6844d093 100644
--- a/server/src/main/java/org/apache/rocketmq/studio/model/User.java
+++ b/server/src/main/java/org/apache/rocketmq/studio/model/User.java
@@ -76,7 +76,7 @@ public class User {
         return "User{" +
                 "id=" + id +
                 ", name='" + name + '\'' +
-                ", password='" + password + '\'' +
+                ", password='******'" +
                 ", type=" + type +
                 '}';
     }
diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/persistence/entity/RmqSettings.java
 
b/server/src/main/java/org/apache/rocketmq/studio/persistence/entity/RmqSettings.java
index 696f7d73..270f5e73 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/persistence/entity/RmqSettings.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/persistence/entity/RmqSettings.java
@@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
+import lombok.ToString;
 
 import java.time.LocalDateTime;
 
@@ -30,6 +31,7 @@ public class RmqSettings {
     @TableId(type = IdType.ASSIGN_UUID)
     private String id;
 
+    @ToString.Exclude
     private String json;
 
     private LocalDateTime updatedAt;
diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/settings/DataSourceTestDTO.java
 
b/server/src/main/java/org/apache/rocketmq/studio/settings/DataSourceTestDTO.java
index ecfba0ec..26020877 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/settings/DataSourceTestDTO.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/settings/DataSourceTestDTO.java
@@ -21,6 +21,7 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import lombok.ToString;
 
 @Data
 @Builder
@@ -33,6 +34,8 @@ public class DataSourceTestDTO {
     private String type;
     private String auth;
     private String username;
+    @ToString.Exclude
     private String password;
+    @ToString.Exclude
     private String bearerToken;
 }
diff --git a/server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java 
b/server/src/test/java/org/apache/rocketmq/studio/auth/LoginDTOTest.java
similarity index 65%
copy from server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java
copy to server/src/test/java/org/apache/rocketmq/studio/auth/LoginDTOTest.java
index 686ec392..2316991c 100644
--- a/server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java
+++ b/server/src/test/java/org/apache/rocketmq/studio/auth/LoginDTOTest.java
@@ -14,29 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.rocketmq.studio.auth;
 
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class LoginDTOTest {
+
+    @Test
+    void toStringShouldNotExposePassword() {
+        LoginDTO request = new LoginDTO();
+        request.setUsername("admin");
+        request.setPassword("plain-secret");
 
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class LoginVO {
-    private String token;
-    private int expiresIn;
-    private UserInfo user;
+        String value = request.toString();
 
-    @Data
-    @Builder
-    @NoArgsConstructor
-    @AllArgsConstructor
-    public static class UserInfo {
-        private String username;
-        private boolean admin;
+        assertThat(value).contains("username=admin");
+        assertThat(value).doesNotContain("plain-secret");
     }
 }
diff --git a/server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java 
b/server/src/test/java/org/apache/rocketmq/studio/auth/LoginVOTest.java
similarity index 56%
copy from server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java
copy to server/src/test/java/org/apache/rocketmq/studio/auth/LoginVOTest.java
index 686ec392..db8b63b4 100644
--- a/server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java
+++ b/server/src/test/java/org/apache/rocketmq/studio/auth/LoginVOTest.java
@@ -14,29 +14,29 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.rocketmq.studio.auth;
 
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class LoginVOTest {
+
+    @Test
+    void toStringShouldNotExposeToken() {
+        LoginVO response = LoginVO.builder()
+            .token("studio-jwt-secret")
+            .expiresIn(3600)
+            .user(LoginVO.UserInfo.builder()
+                .username("admin")
+                .admin(true)
+                .build())
+            .build();
 
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class LoginVO {
-    private String token;
-    private int expiresIn;
-    private UserInfo user;
+        String value = response.toString();
 
-    @Data
-    @Builder
-    @NoArgsConstructor
-    @AllArgsConstructor
-    public static class UserInfo {
-        private String username;
-        private boolean admin;
+        assertThat(value).contains("expiresIn=3600");
+        assertThat(value).contains("username=admin");
+        assertThat(value).doesNotContain("studio-jwt-secret");
     }
 }
diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/instance/acl/AclUserVO.java 
b/server/src/test/java/org/apache/rocketmq/studio/instance/acl/AclUserVOTest.java
similarity index 54%
copy from 
server/src/main/java/org/apache/rocketmq/studio/instance/acl/AclUserVO.java
copy to 
server/src/test/java/org/apache/rocketmq/studio/instance/acl/AclUserVOTest.java
index 9e917848..facbec71 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/instance/acl/AclUserVO.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/instance/acl/AclUserVOTest.java
@@ -16,24 +16,30 @@
  */
 package org.apache.rocketmq.studio.instance.acl;
 
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import org.junit.jupiter.api.Test;
 
-import java.time.LocalDateTime;
 import java.util.List;
 
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class AclUserVO {
-    private String id;
-    private String username;
-    private String accessKey;
-    private String secretKey;
-    private boolean admin;
-    private List<String> clusters;
-    private LocalDateTime createdAt;
+import static org.assertj.core.api.Assertions.assertThat;
+
+class AclUserVOTest {
+
+    @Test
+    void toStringShouldNotExposeCredentials() {
+        AclUserVO user = AclUserVO.builder()
+            .id("user-1")
+            .username("ops-admin")
+            .accessKey("plain-access-key")
+            .secretKey("plain-secret-key")
+            .admin(true)
+            .clusters(List.of("prod"))
+            .build();
+
+        String value = user.toString();
+
+        assertThat(value).contains("username=ops-admin");
+        assertThat(value).contains("admin=true");
+        assertThat(value).doesNotContain("plain-access-key");
+        assertThat(value).doesNotContain("plain-secret-key");
+    }
 }
diff --git a/server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java 
b/server/src/test/java/org/apache/rocketmq/studio/model/UserTest.java
similarity index 62%
copy from server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java
copy to server/src/test/java/org/apache/rocketmq/studio/model/UserTest.java
index 686ec392..37a0d522 100644
--- a/server/src/main/java/org/apache/rocketmq/studio/auth/LoginVO.java
+++ b/server/src/test/java/org/apache/rocketmq/studio/model/UserTest.java
@@ -14,29 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.rocketmq.studio.model;
 
-package org.apache.rocketmq.studio.auth;
+import org.junit.jupiter.api.Test;
 
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import static org.assertj.core.api.Assertions.assertThat;
 
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class LoginVO {
-    private String token;
-    private int expiresIn;
-    private UserInfo user;
+class UserTest {
 
-    @Data
-    @Builder
-    @NoArgsConstructor
-    @AllArgsConstructor
-    public static class UserInfo {
-        private String username;
-        private boolean admin;
+    @Test
+    void toStringShouldNotExposePassword() {
+        User user = new User("admin", "plain-secret", User.SUPER);
+
+        String value = user.toString();
+
+        assertThat(value).contains("name='admin'");
+        assertThat(value).contains("password='******'");
+        assertThat(value).doesNotContain("plain-secret");
     }
 }
diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/persistence/entity/RmqSettings.java
 
b/server/src/test/java/org/apache/rocketmq/studio/persistence/entity/RmqSettingsTest.java
similarity index 56%
copy from 
server/src/main/java/org/apache/rocketmq/studio/persistence/entity/RmqSettings.java
copy to 
server/src/test/java/org/apache/rocketmq/studio/persistence/entity/RmqSettingsTest.java
index 696f7d73..a5e0f2c4 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/persistence/entity/RmqSettings.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/persistence/entity/RmqSettingsTest.java
@@ -16,21 +16,26 @@
  */
 package org.apache.rocketmq.studio.persistence.entity;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
+import org.junit.jupiter.api.Test;
 
 import java.time.LocalDateTime;
 
-@Data
-@TableName("rmq_settings")
-public class RmqSettings {
+import static org.assertj.core.api.Assertions.assertThat;
 
-    @TableId(type = IdType.ASSIGN_UUID)
-    private String id;
+class RmqSettingsTest {
 
-    private String json;
+    @Test
+    void toStringShouldNotExposePersistedSettingsJson() {
+        RmqSettings settings = new RmqSettings();
+        settings.setId("settings");
+        settings.setJson("{\"apiKey\":\"sk-secret\",\"model\":\"gpt-4o\"}");
+        settings.setUpdatedAt(LocalDateTime.of(2026, 8, 3, 12, 0));
 
-    private LocalDateTime updatedAt;
+        String text = settings.toString();
+
+        assertThat(text).contains("id=settings");
+        assertThat(text).contains("updatedAt=2026-08-03T12:00");
+        assertThat(text).doesNotContain("json");
+        assertThat(text).doesNotContain("sk-secret");
+    }
 }
diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/settings/DataSourceTestDTO.java
 
b/server/src/test/java/org/apache/rocketmq/studio/settings/DataSourceTestDTOTest.java
similarity index 51%
copy from 
server/src/main/java/org/apache/rocketmq/studio/settings/DataSourceTestDTO.java
copy to 
server/src/test/java/org/apache/rocketmq/studio/settings/DataSourceTestDTOTest.java
index ecfba0ec..c6e0970a 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/settings/DataSourceTestDTO.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/settings/DataSourceTestDTOTest.java
@@ -16,23 +16,28 @@
  */
 package org.apache.rocketmq.studio.settings;
 
-import jakarta.validation.constraints.NotBlank;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import org.junit.jupiter.api.Test;
 
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class DataSourceTestDTO {
-    @NotBlank(message = "url is required")
-    private String url;
-    @NotBlank(message = "type is required")
-    private String type;
-    private String auth;
-    private String username;
-    private String password;
-    private String bearerToken;
+import static org.assertj.core.api.Assertions.assertThat;
+
+class DataSourceTestDTOTest {
+
+    @Test
+    void toStringShouldNotExposeCredentials() {
+        DataSourceTestDTO request = DataSourceTestDTO.builder()
+            .url("http://prometheus:9090";)
+            .type("prometheus")
+            .auth("bearer token")
+            .username("prometheus-user")
+            .password("plain-password")
+            .bearerToken("plain-token")
+            .build();
+
+        String value = request.toString();
+
+        assertThat(value).contains("url=http://prometheus:9090";);
+        assertThat(value).contains("username=prometheus-user");
+        assertThat(value).doesNotContain("plain-password");
+        assertThat(value).doesNotContain("plain-token");
+    }
 }

Reply via email to