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