Blob Blame History Raw
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
-     * <I>hostname:portnumber</I>). For example, you can specify
-     * the following values for the <CODE>host</CODE> argument:<BR>
+     * <I>hostname:portnumber</I>). For IPv6 enclose the address in square brackets.
+     * For example, you can specify the following values for the 
+     * <CODE>host</CODE> argument:<BR>
      *<PRE>
      *   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
      *</PRE>
      * If multiple servers are specified in the <CODE>host</CODE> list, the connection
      *  setup policy specified with the <CODE>ConnSetupDelay</CODE> 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 ();
         }