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 87df5c22 fix: validate every resolved data source address (#1556)
87df5c22 is described below

commit 87df5c2238c2db7d1089b12693e086897f00c6b1
Author: youngkermit8-coder <[email protected]>
AuthorDate: Tue Aug 11 21:02:59 2026 +0800

    fix: validate every resolved data source address (#1556)
    
    Signed-off-by: youngkermit8-coder <[email protected]>
---
 .../rocketmq/studio/settings/SettingsService.java  | 22 +++++++++++++++++-----
 .../studio/settings/SettingsServiceTest.java       | 21 +++++++++++++++++++++
 2 files changed, 38 insertions(+), 5 deletions(-)

diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/settings/SettingsService.java 
b/server/src/main/java/org/apache/rocketmq/studio/settings/SettingsService.java
index 0845bad9..8fa14758 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/settings/SettingsService.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/settings/SettingsService.java
@@ -311,17 +311,29 @@ public class SettingsService {
             return false;
         }
         try {
-            InetAddress address = InetAddress.getByName(normalized);
-            return !address.isAnyLocalAddress()
-                    && !address.isLinkLocalAddress()
-                    && !address.isLoopbackAddress()
-                    && !isKnownCloudMetadataAddress(address);
+            return 
areAllowedDataSourceAddresses(InetAddress.getAllByName(normalized));
         } catch (UnknownHostException exception) {
             // Unresolvable host: let the connection attempt surface the real 
connectivity error.
             return true;
         }
     }
 
+    boolean areAllowedDataSourceAddresses(InetAddress[] addresses) {
+        if (addresses == null || addresses.length == 0) {
+            return false;
+        }
+        for (InetAddress address : addresses) {
+            if (address == null
+                    || address.isAnyLocalAddress()
+                    || address.isLinkLocalAddress()
+                    || address.isLoopbackAddress()
+                    || isKnownCloudMetadataAddress(address)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     private boolean isKnownCloudMetadataAddress(InetAddress address) {
         return CLOUD_METADATA_ADDRESSES.stream()
                 .anyMatch(metadataAddress -> 
Arrays.equals(address.getAddress(), metadataAddress));
diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/settings/SettingsServiceTest.java
 
b/server/src/test/java/org/apache/rocketmq/studio/settings/SettingsServiceTest.java
index 5bee1216..a821fa29 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/settings/SettingsServiceTest.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/settings/SettingsServiceTest.java
@@ -32,6 +32,7 @@ import org.springframework.http.MediaType;
 import org.springframework.test.web.client.MockRestServiceServer;
 import org.springframework.web.client.RestClient;
 
+import java.net.InetAddress;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Base64;
@@ -495,6 +496,26 @@ class SettingsServiceTest {
         assertThat(ipv4MappedResult.getMessage()).contains("local or private 
address");
     }
 
+    @Test
+    void dataSourceAddressPolicyShouldRejectMixedSafeAndLoopbackResults() 
throws Exception {
+        InetAddress[] addresses = {
+                InetAddress.getByName("192.0.2.1"),
+                InetAddress.getByName("127.0.0.1")
+        };
+
+        
assertThat(settingsService.areAllowedDataSourceAddresses(addresses)).isFalse();
+    }
+
+    @Test
+    void dataSourceAddressPolicyShouldAcceptAllSafeResults() throws Exception {
+        InetAddress[] addresses = {
+                InetAddress.getByName("192.0.2.1"),
+                InetAddress.getByName("198.51.100.1")
+        };
+
+        
assertThat(settingsService.areAllowedDataSourceAddresses(addresses)).isTrue();
+    }
+
     @Test
     void testConnectionShouldRejectIncompleteBasicAuthentication() {
         DataSourceTestResultVO result = 
settingsService.testDataSource(DataSourceTestDTO.builder()

Reply via email to