You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by si...@apache.org on 2026/10/27 20:47:13 UTC
(hadoop) 01/06: HADOOP-19958. Support IPv6 delegation token service addresses (#8669)
This is an automated email from the ASF dual-hosted git repository.
smengcl pushed a commit to branch branch-3.4
in repository https://gitbox.apache.org/repos/asf/hadoop.git
commit 1aedf86cbf37b921ce63cbfad3ae74d01b3ffd05
Author: Siyao Meng <50...@users.noreply.github.com>
AuthorDate: Fri Oct 2 08:15:35 2026 -0700
HADOOP-19958. Support IPv6 delegation token service addresses (#8669)
Merged after local build and TestNetUtils/TestSecurityUtil passed on PR branch.
(cherry picked from commit ea26edd8cfcc7ab10f5cb71b7a662f91a88e1af2)
---
.../main/java/org/apache/hadoop/net/NetUtils.java | 33 +++++++++++++++++++---
.../org/apache/hadoop/security/SecurityUtil.java | 4 +--
.../java/org/apache/hadoop/net/TestNetUtils.java | 16 +++++++++++
.../apache/hadoop/security/TestSecurityUtil.java | 10 ++++++-
4 files changed, 56 insertions(+), 7 deletions(-)
diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java
index 3a4f4fd37d3..d3abcbd2f2b 100644
--- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java
+++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/net/NetUtils.java
@@ -242,6 +242,9 @@ public static InetSocketAddress createSocketAddr(
URI uri = createURI(target, hasScheme, helpText, useCacheIfPresent);
String host = uri.getHost();
+ if (host != null && host.startsWith("[") && host.endsWith("]")) {
+ host = host.substring(1, host.length() - 1);
+ }
int port = uri.getPort();
if (port == -1) {
port = defaultPort;
@@ -764,21 +767,43 @@ public static String getHostname() {
* Compose a "host:port" string from the address.
*
* @param addr address.
- * @return hort port string.
+ * @return host port string.
*/
public static String getHostPortString(InetSocketAddress addr) {
- return addr.getHostName() + ":" + addr.getPort();
+ return getHostPortString(addr.getHostName(), addr.getPort());
}
/**
- * Get port as integer from host port string like host:port.
+ * Compose a "host:port" string, bracketing IPv6 literals.
*
- * @param addr host + port string like host:port.
+ * @param host host name or IP address.
+ * @param port port number.
+ * @return host port string.
+ */
+ public static String getHostPortString(String host, int port) {
+ String normalizedHost = host;
+ if (normalizedHost != null && normalizedHost.startsWith("[")
+ && normalizedHost.endsWith("]")) {
+ normalizedHost = normalizedHost.substring(1, normalizedHost.length() - 1);
+ }
+ if (normalizedHost != null && normalizedHost.contains(":")) {
+ return "[" + normalizedHost + "]:" + port;
+ }
+ return normalizedHost + ":" + port;
+ }
+
+ /**
+ * Get port as integer from a host:port or [IPv6]:port string.
+ *
+ * @param addr host and port string, with brackets around IPv6 literals.
* @return an integer value representing the port.
* @throws IllegalArgumentException if the input is not in the correct format.
*/
public static int getPortFromHostPortString(String addr)
throws IllegalArgumentException {
+ if (addr.startsWith("[")) {
+ return createSocketAddrUnresolved(addr).getPort();
+ }
String[] hostport = addr.split(":");
if (hostport.length != 2) {
String errorMsg = "Address should be <host>:<port>, but it is " + addr;
diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/SecurityUtil.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/SecurityUtil.java
index fd3030e8a97..ca2631a4cc5 100644
--- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/SecurityUtil.java
+++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/SecurityUtil.java
@@ -472,7 +472,7 @@ public static void setTokenService(Token<?> token, InetSocketAddress addr) {
* hadoop.security.token.service.use_ip
*/
public static Text buildTokenService(InetSocketAddress addr) {
- String host = null;
+ String host;
if (useIpForTokenService) {
if (addr.isUnresolved()) { // host has no ip address
throw new IllegalArgumentException(
@@ -483,7 +483,7 @@ public static Text buildTokenService(InetSocketAddress addr) {
} else {
host = StringUtils.toLowerCase(addr.getHostName());
}
- return new Text(host + ":" + addr.getPort());
+ return new Text(NetUtils.getHostPortString(host, addr.getPort()));
}
/**
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetUtils.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetUtils.java
index 4b18d74d9b7..df450383c72 100644
--- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetUtils.java
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/TestNetUtils.java
@@ -773,16 +773,32 @@ public void testTrimCreateSocketAddress() {
assertEquals(defaultAddr.trim(), NetUtils.getHostPortString(addr));
}
+ @Test
+ public void testIPv6HostPortString() {
+ assertEquals("[::1]:123", NetUtils.getHostPortString("::1", 123));
+ assertEquals("[::1]:123", NetUtils.getHostPortString("[::1]", 123));
+
+ InetSocketAddress addr = NetUtils.createSocketAddrUnresolved("[::1]:123");
+ assertEquals("::1", addr.getHostString());
+ assertEquals(123, addr.getPort());
+
+ assertThrows(IllegalArgumentException.class,
+ () -> NetUtils.createSocketAddr("::1:123"));
+ }
+
@Test
public void testGetPortFromHostPortString() throws Exception {
assertEquals(1002, NetUtils.getPortFromHostPortString("testHost:1002"));
+ assertEquals(123, NetUtils.getPortFromHostPortString(NetUtils.getHostPortString("::1", 123)));
LambdaTestUtils.intercept(IllegalArgumentException.class,
() -> NetUtils.getPortFromHostPortString("testHost"));
LambdaTestUtils.intercept(IllegalArgumentException.class,
() -> NetUtils.getPortFromHostPortString("testHost:randomString"));
+ LambdaTestUtils.intercept(IllegalArgumentException.class,
+ () -> NetUtils.getPortFromHostPortString("::1:123"));
}
@Test
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/TestSecurityUtil.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/TestSecurityUtil.java
index b6b96844453..554515ad64b 100644
--- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/TestSecurityUtil.java
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/TestSecurityUtil.java
@@ -287,7 +287,7 @@ void runBadPortPermutes(String arg, boolean validIfPosPort) {
String serviceHost = useIp ? ip : StringUtils.toLowerCase(host);
Token<?> token = new Token<TokenIdentifier>();
- Text service = new Text(serviceHost+":"+port);
+ Text service = new Text(NetUtils.getHostPortString(serviceHost, port));
assertEquals(service, SecurityUtil.buildTokenService(addr));
SecurityUtil.setTokenService(token, addr);
@@ -356,6 +356,14 @@ public void testSocketAddrWithIP() {
verifyServiceAddr(staticHost, "127.0.0.1");
}
+ @Test
+ public void testSocketAddrWithIPv6() throws Exception {
+ String host = "::1";
+ NetUtils.addStaticResolution(host, host);
+ InetSocketAddress addr = NetUtils.createSocketAddr("[::1]:123");
+ verifyAddress(addr, host, InetAddress.getByName(host).getHostAddress(), 123);
+ }
+
@Test
public void testSocketAddrWithNameToStaticName() {
String staticHost = "host1";
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org