diff --git a/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java b/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java --- a/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java +++ b/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java @@ -874,22 +874,24 @@ public class LDAPConnection * specify the preferences for the bind operation. *
* You can limit the time spent waiting for the connection to be established
* by calling setConnectTimeout
before connect
.
*
* @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
* whether connection attempts are made serially or concurrently.
*
* @param port port number of the LDAP server to which you want to connect.
* This parameter is ignored for any host in the host
* parameter which includes a colon and port number.
@@ -929,23 +931,42 @@ public class LDAPConnection
/* Parse the list of hosts */
int defaultPort = port;
StringTokenizer st = new StringTokenizer( host );
String hostList[] = new String[st.countTokens()];
int portList[] = new int[st.countTokens()];
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++;
}
/* Create the Connection Setup Manager */
m_connMgr = new LDAPConnSetupMgr(hostList, portList,
m_isTLSFactory ? null : m_factory);
m_connMgr.setConnSetupDelay(m_connSetupDelay);
@@ -1074,17 +1095,16 @@ public class LDAPConnection
if (m_connMgr == null) {
throw new LDAPException ( "no connection parameters",
LDAPException.PARAM_ERROR );
}
if (m_thread == null) {
m_thread = new LDAPConnThread(m_connMgr, m_cache, getTraceOutput());
}
-
m_thread.connect(this);
checkClientAuth();
}
/**
* Returns the trace output object if set by the user
*/
diff --git a/java-sdk/ldapjdk/netscape/ldap/LDAPUrl.java b/java-sdk/ldapjdk/netscape/ldap/LDAPUrl.java
--- a/java-sdk/ldapjdk/netscape/ldap/LDAPUrl.java
+++ b/java-sdk/ldapjdk/netscape/ldap/LDAPUrl.java
@@ -130,19 +130,20 @@ public class LDAPUrl implements java.io.
parseUrl(url);
}
/**
* Parse URL as defined in RFC 1959. Beyond the RFC, the secure ldap
* (ldaps) is also supported.
*/
private void parseUrl(String url) throws MalformedURLException {
- StringTokenizer urlParser = new StringTokenizer (url, ":/?", true);
+ StringTokenizer urlParser = new StringTokenizer (url, ":/?[]", true);
String currentToken;
String str = null;
+ boolean usingIPv6 = false;
try {
currentToken = urlParser.nextToken();
if (currentToken.equalsIgnoreCase ("LDAPS")) {
m_secure = true;
}
else if (!currentToken.equalsIgnoreCase ("LDAP")) {
throw new MalformedURLException ();
@@ -155,62 +156,76 @@ public class LDAPUrl implements java.io.
currentToken = urlParser.nextToken();
if (!currentToken.equals("/")) {
throw new MalformedURLException ();
}
currentToken = urlParser.nextToken();
if (!currentToken.equals("/")) {
throw new MalformedURLException ();
}
-
currentToken = urlParser.nextToken();
+ if (currentToken.equals("[")) {
+ usingIPv6 = true;
+ }
}
catch (NoSuchElementException e) {
throw new MalformedURLException ();
}
// host-port
if (currentToken.equals ("/")) {
m_hostName = null;
m_portNumber = m_secure ? DEFAULT_SECURE_PORT : LDAPv2.DEFAULT_PORT;
} else if (currentToken.equals (":")) {
// port number without host name is not allowed
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 "/"
+ else if (! urlParser.nextToken().equals("/")) {
+ throw new MalformedURLException ();
+ }
- 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 "/"
- throw new MalformedURLException ();
- }
+ } else if (currentToken.equals ("/")) {
+ m_portNumber = m_secure ? DEFAULT_SECURE_PORT : LDAPv2.DEFAULT_PORT;
+ } else {
+ // expecting ":" or "/"
+ throw new MalformedURLException ();
}
// DN
if (!urlParser.hasMoreTokens ()) {
return;
}
m_DN = decode(readNextConstruct(urlParser));