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 7c8ec156f fix(ai): keep the provider token out of
LlmProperties.toString (#4472)
7c8ec156f is described below
commit 7c8ec156fc906c9cb5326d1ebdce95668720f3fb
Author: 0 <[email protected]>
AuthorDate: Mon Sep 21 20:59:51 2026 +0800
fix(ai): keep the provider token out of LlmProperties.toString (#4472)
`LlmProperties` is a Lombok `@Data` class, so its generated `toString()`
printed the configured provider `token` in clear text next to
`anthropicBaseUrl` and `cliAllowedEnvironment`.
No call site leaks it today: the three consumers —
`ClaudeCodeAgentProvider`, `CliProcessEnvironment` and `LlmConfigService` —
read the fields individually, nothing logs or interpolates the properties
object, and the actuator `configprops` endpoint serializes through Jackson
getters with its own key sanitization. This is prevention rather than the fix
for a live leak, but `token` was the one field on the class that a future debug
log, exception message or diagnostic dump would have ca [...]
It now carries `@ToString.Exclude`, matching how the login, cloud
credential and ACL types in this repo already handle theirs, and
`LlmPropertiesTest` asserts the other two fields still render while the token
value does not.
An earlier revision of this contribution also normalized and de-duplicated
agent engine names in `AgentProviderRegistry`. That half was dropped at review:
both providers' `ENGINE` constants are already lower-case, `forEngine` already
normalized on lookup, and `Collectors.toMap` already throws on a duplicate key,
so no reachable path exercised it.
---
.../rocketmq/studio/ops/ai/LlmProperties.java | 2 ++
.../rocketmq/studio/ops/ai/LlmPropertiesTest.java} | 32 +++++++++++++---------
2 files changed, 21 insertions(+), 13 deletions(-)
diff --git
a/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmProperties.java
b/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmProperties.java
index 734c02219..274c2cab3 100644
--- a/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmProperties.java
+++ b/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmProperties.java
@@ -17,6 +17,7 @@
package org.apache.rocketmq.studio.ops.ai;
import lombok.Data;
+import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.ArrayList;
@@ -29,6 +30,7 @@ import java.util.List;
@Data
@ConfigurationProperties(prefix = "studio.llm")
public class LlmProperties {
+ @ToString.Exclude
private String token;
private String anthropicBaseUrl;
private List<String> cliAllowedEnvironment = new ArrayList<>();
diff --git
a/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmProperties.java
b/server/src/test/java/org/apache/rocketmq/studio/ops/ai/LlmPropertiesTest.java
similarity index 54%
copy from
server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmProperties.java
copy to
server/src/test/java/org/apache/rocketmq/studio/ops/ai/LlmPropertiesTest.java
index 734c02219..18c60ba8d 100644
--- a/server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmProperties.java
+++
b/server/src/test/java/org/apache/rocketmq/studio/ops/ai/LlmPropertiesTest.java
@@ -16,20 +16,26 @@
*/
package org.apache.rocketmq.studio.ops.ai;
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.junit.jupiter.api.Test;
-import java.util.ArrayList;
import java.util.List;
-/**
- * LLM runtime settings supplied through the environment. Tokens and inherited
- * CLI environment values must never be persisted or logged.
- */
-@Data
-@ConfigurationProperties(prefix = "studio.llm")
-public class LlmProperties {
- private String token;
- private String anthropicBaseUrl;
- private List<String> cliAllowedEnvironment = new ArrayList<>();
+import static org.assertj.core.api.Assertions.assertThat;
+
+class LlmPropertiesTest {
+
+ @Test
+ void toStringShouldNotExposeTheProviderTokenTest() {
+ LlmProperties properties = new LlmProperties();
+ properties.setToken("studio-llm-provider-token");
+ properties.setAnthropicBaseUrl("https://llm.example");
+ properties.setCliAllowedEnvironment(List.of("ANTHROPIC_AUTH_TOKEN"));
+
+ String value = properties.toString();
+
+ assertThat(value)
+ .contains("anthropicBaseUrl=https://llm.example")
+ .contains("cliAllowedEnvironment=[ANTHROPIC_AUTH_TOKEN]")
+ .doesNotContain("studio-llm-provider-token");
+ }
}