Skip to content

Commit a5876c1

Browse files
doleyzidoleyzi
andauthored
[INLONG-12088][Audit] Audit routing data source management supports domain names (#12089)
Co-authored-by: doleyzi <doleyzi@tencent.com>
1 parent 5c0fec2 commit a5876c1

2 files changed

Lines changed: 113 additions & 4 deletions

File tree

inlong-audit/audit-common/src/main/java/org/apache/inlong/audit/utils/RouteUtils.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,20 @@
1919

2020
import org.apache.inlong.audit.entity.AuditRoute;
2121

22+
import org.slf4j.Logger;
23+
import org.slf4j.LoggerFactory;
24+
2225
import java.util.List;
2326
import java.util.regex.Matcher;
2427
import java.util.regex.Pattern;
2528
import java.util.regex.PatternSyntaxException;
2629

2730
public class RouteUtils {
2831

32+
private static final Logger LOG = LoggerFactory.getLogger(RouteUtils.class);
33+
private static final Pattern JDBC_ADDRESS_PATTERN = Pattern.compile("^jdbc:\\w+://([a-zA-Z0-9.-]+):(\\d+)");
34+
private static final String HOST_PORT_SEPARATOR = ":";
35+
2936
public static boolean isValidRegex(String regex) {
3037
if (regex == null || regex.isEmpty()) {
3138
return false;
@@ -63,14 +70,25 @@ public static boolean matchesAuditRoute(String auditId, String inlongGroupId, Li
6370
return false;
6471
}
6572

73+
/**
74+
* Extracts the host:port address from a JDBC URL.
75+
* Both IP addresses and domain names are supported.
76+
*
77+
* @param jdbcUrl the JDBC URL, e.g. "jdbc:mysql://127.0.0.1:3306/testdb"
78+
* or "jdbc:mysql://db.example.com:3306/testdb"
79+
* @return host:port string, or null if the URL is null, blank, or does not match
80+
*/
6681
public static String extractAddress(String jdbcUrl) {
6782
if (jdbcUrl == null || jdbcUrl.trim().isEmpty()) {
6883
return null;
6984
}
70-
Pattern pattern = Pattern.compile("^jdbc:\\w+://([\\d\\.]+):(\\d+)");
71-
Matcher matcher = pattern.matcher(jdbcUrl);
72-
if (matcher.find()) {
73-
return matcher.group(1) + ":" + matcher.group(2);
85+
try {
86+
Matcher matcher = JDBC_ADDRESS_PATTERN.matcher(jdbcUrl);
87+
if (matcher.find()) {
88+
return matcher.group(1) + HOST_PORT_SEPARATOR + matcher.group(2);
89+
}
90+
} catch (Exception e) {
91+
LOG.warn("Failed to extract address from JDBC URL: {}", jdbcUrl, e);
7492
}
7593
return null;
7694
}

inlong-audit/audit-common/src/test/java/org/apache/inlong/audit/utils/RouteUtilsTest.java

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,34 @@ public void extractAddress_ValidJdbcUrlWithDifferentProtocol() {
7272
assertEquals("192.168.1.100:5432", result);
7373
}
7474

75+
@Test
76+
public void extractAddress_ValidJdbcUrlWithLocalhost() {
77+
String jdbcUrl = "jdbc:mysql://localhost:3306/testdb";
78+
String result = RouteUtils.extractAddress(jdbcUrl);
79+
assertEquals("localhost:3306", result);
80+
}
81+
82+
@Test
83+
public void extractAddress_ValidJdbcUrlWithDomainName() {
84+
String jdbcUrl = "jdbc:mysql://db.example.com:3306/testdb";
85+
String result = RouteUtils.extractAddress(jdbcUrl);
86+
assertEquals("db.example.com:3306", result);
87+
}
88+
89+
@Test
90+
public void extractAddress_ValidJdbcUrlWithMultiLevelSubdomain() {
91+
String jdbcUrl = "jdbc:postgresql://mysql.db.example.com:5432/mydb";
92+
String result = RouteUtils.extractAddress(jdbcUrl);
93+
assertEquals("mysql.db.example.com:5432", result);
94+
}
95+
96+
@Test
97+
public void extractAddress_ValidJdbcUrlWithHyphenatedDomain() {
98+
String jdbcUrl = "jdbc:mysql://my-db-server.example.com:3306/testdb";
99+
String result = RouteUtils.extractAddress(jdbcUrl);
100+
assertEquals("my-db-server.example.com:3306", result);
101+
}
102+
75103
@Test
76104
public void matchesAuditRoute_EmptyAuditRouteList() {
77105
List<AuditRoute> auditRouteList = new ArrayList<>();
@@ -181,4 +209,67 @@ public void matchesAuditRoute_AllRegex() {
181209
result = RouteUtils.matchesAuditRoute("1", "groupIdABC", auditRouteList);
182210
assertFalse(result);
183211
}
212+
213+
@Test
214+
public void extractAddress_DomainStartingWithHyphen() {
215+
String jdbcUrl = "jdbc:mysql://-invalid.example.com:3306/testdb";
216+
String result = RouteUtils.extractAddress(jdbcUrl);
217+
assertEquals("-invalid.example.com:3306", result);
218+
}
219+
220+
@Test
221+
public void extractAddress_DomainEndingWithHyphen() {
222+
String jdbcUrl = "jdbc:mysql://invalid-.example.com:3306/testdb";
223+
String result = RouteUtils.extractAddress(jdbcUrl);
224+
assertEquals("invalid-.example.com:3306", result);
225+
}
226+
227+
@Test
228+
public void extractAddress_DomainStartingWithDot() {
229+
String jdbcUrl = "jdbc:mysql://.invalid.com:3306/testdb";
230+
String result = RouteUtils.extractAddress(jdbcUrl);
231+
assertEquals(".invalid.com:3306", result);
232+
}
233+
234+
@Test
235+
public void extractAddress_DomainEndingWithDot() {
236+
String jdbcUrl = "jdbc:mysql://invalid.com.:3306/testdb";
237+
String result = RouteUtils.extractAddress(jdbcUrl);
238+
assertEquals("invalid.com.:3306", result);
239+
}
240+
241+
@Test
242+
public void extractAddress_JdbcUrlWithQueryParameters() {
243+
String jdbcUrl = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
244+
String result = RouteUtils.extractAddress(jdbcUrl);
245+
assertEquals("localhost:3306", result);
246+
}
247+
248+
@Test
249+
public void extractAddress_JdbcUrlWithQueryParametersAndDomain() {
250+
String jdbcUrl = "jdbc:mysql://db.example.com:3306/testdb?useSSL=false&characterEncoding=utf8";
251+
String result = RouteUtils.extractAddress(jdbcUrl);
252+
assertEquals("db.example.com:3306", result);
253+
}
254+
255+
@Test
256+
public void extractAddress_IPv6Address_ReturnsNull() {
257+
String jdbcUrl = "jdbc:mysql://[::1]:3306/testdb";
258+
String result = RouteUtils.extractAddress(jdbcUrl);
259+
assertNull(result);
260+
}
261+
262+
@Test
263+
public void extractAddress_IPv6FullAddress_ReturnsNull() {
264+
String jdbcUrl = "jdbc:mysql://[2001:db8:85a3::8a2e:370:7334]:3306/testdb";
265+
String result = RouteUtils.extractAddress(jdbcUrl);
266+
assertNull(result);
267+
}
268+
269+
@Test
270+
public void extractAddress_DomainWithUnderscore_ReturnsNull() {
271+
String jdbcUrl = "jdbc:mysql://my_server.example.com:3306/testdb";
272+
String result = RouteUtils.extractAddress(jdbcUrl);
273+
assertNull(result);
274+
}
184275
}

0 commit comments

Comments
 (0)