diff -r 0f7c3698a961 java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java Fri Feb 27 03:58:00 2015 -0500 +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java Mon Aug 08 12:01:38 2016 -0400 @@ -879,12 +879,14 @@ * @param host host name of the LDAP server to which you want to connect. * This value can also be a space-delimited list of hostnames or * hostnames and port numbers (using the syntax - * hostname:portnumber). For example, you can specify - * the following values for the host argument:
+ * hostname:portnumber). For IPv6 enclose the address in square brackets. + * For example, you can specify the following values for the + * host argument:
*
      *   myhost
      *   myhost hishost:389 herhost:5000 whathost
      *   myhost:686 myhost:389 hishost:5000 whathost:1024
+     *   [::1]:389 [2620:52:0:102f:5054:1ff:fe2c:e12d]:636
      *
* If multiple servers are specified in the host list, the connection * setup policy specified with the ConnSetupDelay property controls @@ -934,13 +936,32 @@ int i = 0; while( st.hasMoreTokens() ) { String s = st.nextToken(); - int colon = s.indexOf( ':' ); - if ( colon > 0 ) { - hostList[i] = s.substring( 0, colon ); - portList[i] = Integer.parseInt( s.substring( colon+1 ) ); + int colon; + + if ( s.startsWith( "[" ) ) { + // We have an ipv6 address + int end = s.indexOf( ']' ); + if ( end == -1 ) { + throw new LDAPException ( "invalid URL for IPv6 address", + LDAPException.PARAM_ERROR ); + } + String remainder = s.substring( end+1 ); + hostList[i] = s.substring( 0, end+1 ); + colon = remainder.indexOf( ':' ); + if ( colon >= 0 ){ + portList[i] = Integer.parseInt( remainder.substring( colon+1 ) ); + } else { + portList[i] = defaultPort; + } } else { - hostList[i] = s; - portList[i] = defaultPort; + colon = s.indexOf( ':' ); + if ( colon > 0 ) { + hostList[i] = s.substring( 0, colon ); + portList[i] = Integer.parseInt( s.substring( colon+1 ) ); + } else { + hostList[i] = s; + portList[i] = defaultPort; + } } i++; } diff -r 0f7c3698a961 java-sdk/ldapjdk/netscape/ldap/LDAPUrl.java --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPUrl.java Fri Feb 27 03:58:00 2015 -0500 +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPUrl.java Mon Aug 08 12:01:38 2016 -0400 @@ -135,9 +135,11 @@ * (ldaps) is also supported. */ private void parseUrl(String url) throws MalformedURLException { - StringTokenizer urlParser = new StringTokenizer (url, ":/?", true); + StringTokenizer urlParser = new StringTokenizer (url, ":/?[]", true); + StringTokenizer markParser = new StringTokenizer (url, ":/?[]", true); String currentToken; String str = null; + boolean usingIPv6 = false; try { currentToken = urlParser.nextToken(); @@ -160,8 +162,10 @@ if (!currentToken.equals("/")) { throw new MalformedURLException (); } - currentToken = urlParser.nextToken(); + if (currentToken.equals("[")) { + usingIPv6 = true; + } } catch (NoSuchElementException e) { throw new MalformedURLException (); @@ -176,36 +180,48 @@ throw new MalformedURLException ("No hostname"); } else if (currentToken.equals ("?")) { throw new MalformedURLException ("No host[:port]"); + } else if (usingIPv6){ + StringBuilder sb = new StringBuilder(); + while (urlParser.hasMoreElements()) { + currentToken = urlParser.nextToken(); + if (currentToken.equals("]")) { + break; + } + sb.append(currentToken); + } + m_hostName = sb.toString(); } else { m_hostName = currentToken; + } + + // Set the port + if (urlParser.countTokens() == 0) { + m_portNumber = m_secure ? DEFAULT_SECURE_PORT : LDAPv2.DEFAULT_PORT; + return; + } + currentToken = urlParser.nextToken (); // either ":" or "/" + + if (currentToken.equals (":")) { + try { + m_portNumber = Integer.parseInt (urlParser.nextToken()); + } catch (NumberFormatException nf) { + throw new MalformedURLException ("Port not a number"); + } catch (NoSuchElementException ex) { + throw new MalformedURLException ("No port number"); + } + if (urlParser.countTokens() == 0) { - m_portNumber = m_secure ? DEFAULT_SECURE_PORT : LDAPv2.DEFAULT_PORT; return; } - currentToken = urlParser.nextToken (); // either ":" or "/" - - if (currentToken.equals (":")) { - try { - m_portNumber = Integer.parseInt (urlParser.nextToken()); - } catch (NumberFormatException nf) { - throw new MalformedURLException ("Port not a number"); - } catch (NoSuchElementException ex) { - throw new MalformedURLException ("No port number"); - } - - if (urlParser.countTokens() == 0) { - return; - } - else if (! urlParser.nextToken().equals("/")) { - throw new MalformedURLException (); - } - - } else if (currentToken.equals ("/")) { - m_portNumber = m_secure ? DEFAULT_SECURE_PORT : LDAPv2.DEFAULT_PORT; - } else { - // expecting ":" or "/" + else if (! urlParser.nextToken().equals("/")) { throw new MalformedURLException (); } + + } else if (currentToken.equals ("/")) { + m_portNumber = m_secure ? DEFAULT_SECURE_PORT : LDAPv2.DEFAULT_PORT; + } else { + // expecting ":" or "/" + throw new MalformedURLException (); }