diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/DisplayString.mf b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/DisplayString.mf new file mode 100644 index 00000000000..8019bdf3d68 --- /dev/null +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/DisplayString.mf @@ -0,0 +1,4 @@ +Name: netscape/ldap/beans/DisplayString.class +Java-Bean: True + +Name: netscape/ldap/beans/DisplayStringBeanInfo.class diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPBasePropertySupport.java b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPBasePropertySupport.java index 8669e63fae8..27a6ab4b800 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPBasePropertySupport.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPBasePropertySupport.java @@ -221,7 +221,7 @@ public class LDAPBasePropertySupport implements Serializable { * @param listener a client to be notified of changes */ public void addPropertyChangeListener( PropertyChangeListener listener ) { - System.out.println( "Adding listener " + listener ); + printDebug( "Adding listener " + listener ); m_propSupport.addPropertyChangeListener( listener ); } @@ -304,6 +304,9 @@ public class LDAPBasePropertySupport implements Serializable { args[0] = new String( "UniversalConnect" ); m[i].invoke( null, args ); printDebug( "UniversalConnect enabled" ); + args[0] = new String( "UniversalPropertyRead" ); + m[i].invoke( null, args ); + printDebug( "UniversalPropertyRead enabled" ); } catch ( Exception e ) { printDebug( "Exception on invoking " + "enablePrivilege: " + @@ -320,11 +323,54 @@ public class LDAPBasePropertySupport implements Serializable { } conn.connect( host, port ); + setDefaultReferralCredentials( conn ); + } + + protected void setDefaultReferralCredentials( + LDAPConnection conn ) { + final LDAPConnection m_conn = conn; + LDAPRebind rebind = new LDAPRebind() { + public LDAPRebindAuth getRebindAuthentication( + String host, + int port ) { + return new LDAPRebindAuth( + m_conn.getAuthenticationDN(), + m_conn.getAuthenticationPassword() ); + } + }; + LDAPSearchConstraints cons = conn.getSearchConstraints(); + cons.setReferrals( true ); + cons.setRebindProc( rebind ); + } + + /** + * Utility method to convert an array of Strings to a single String + * with line feeds between elements. + * @param aResult The array of Strings to convert + * @return A String with the elements separated by line feeds + */ + public String convertToString( String[] aResult ) { + String sResult = ""; + if ( null != aResult ) { + for ( int i = 0; i < aResult.length; i++ ) { + sResult += aResult[i] + "\n"; + } + } + return sResult; } /* * Variables */ + /* Error codes from search operations, etc */ + public static final int OK = 0; + public static final int INVALID_PARAMETER = 1; + public static final int CONNECT_ERROR = 2; + public static final int AUTHENTICATION_ERROR = 3; + public static final int PROPERTY_NOT_FOUND = 4; + public static final int AMBIGUOUS_RESULTS = 5; + public static final int NO_SUCH_OBJECT = 6; + private boolean _debug = false; private int _errCode = 0; private String _host = new String("localhost"); @@ -339,3 +385,4 @@ public class LDAPBasePropertySupport implements Serializable { transient private PropertyChangeSupport m_propSupport = new PropertyChangeSupport( this ); } + diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntries.java b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntries.java index c16f2eec1c4..9912ff405fa 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntries.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntries.java @@ -87,26 +87,31 @@ public class LDAPGetEntries extends LDAPBasePropertySupport implements Serializa setScope( theScope ); } - private String convertToStrings( String[] aResult ) { - String sResult = ""; - if ( null != aResult ) { - for ( int i = 0; i < aResult.length; i++ ) { - sResult += aResult[i] + "\n"; - } - } - return sResult; - } - private void notifyResult( String error ) { firePropertyChange( "error", _errorMsg, error ); _errorMsg = error; } private void notifyResult( String[] newResult ) { - String sNewResult = convertToStrings( newResult ); - firePropertyChange( "result", result, newResult ); + String sNewResult = convertToString( newResult ); + firePropertyChange( "result", _result, newResult ); _sResult = sNewResult; - result = newResult; + _result = newResult; + } + + /** + * Returns the name of the attribute to retrieve + * @return attribute name to retrieve + */ + public String getAttribute() { + return _attribute; + } + + /** + * Sets the attribute to retrieve + */ + public void setAttribute( String attr ) { + _attribute = attr; } public void setResultString( String sNewValue ) { @@ -244,7 +249,7 @@ public class LDAPGetEntries extends LDAPBasePropertySupport implements Serializa try { printDebug("Searching " + getBase() + " for " + getFilter() + ", scope = " + getScope()); - String[] attrs = null; + String[] attrs = { _attribute }; LDAPSearchResults results = m_ldc.search( getBase(), getScope(), getFilter(), @@ -256,48 +261,56 @@ public class LDAPGetEntries extends LDAPBasePropertySupport implements Serializa LDAPEntry entry = null; while ( results.hasMoreElements() ) { try { - entry = (LDAPEntry)results.next(); - } catch (LDAPReferralException e) { - if (getDebug()) { - notifyResult("Referral URLs: "); - LDAPUrl refUrls[] = e.getURLs(); - for (int i = 0; i < refUrls.length; i++) - notifyResult(refUrls[i].getUrl()); - } - continue; + entry = results.next(); } catch (LDAPException e) { if (getDebug()) notifyResult(e.toString()); continue; } - String dn = entry.getDN(); - v.addElement( dn ); - printDebug( "... " + dn ); + // Add the DN to the list + String value = ""; + if ( _attribute.equals("dn") ) { + value = entry.getDN(); + } else { + LDAPAttribute attr = entry.getAttribute( _attribute ); + if ( attr != null ) { + Enumeration vals = attr.getStringValues(); + if ( (vals != null) && (vals.hasMoreElements()) ) { + value = (String)vals.nextElement(); + } + } + } + v.addElement( value ); + printDebug( "... " + value ); } // Pull out the DNs and create a string array if ( v.size() > 0 ) { res = new String[v.size()]; - for( int i = 0; i < v.size(); i++ ) - res[i] = (String)v.elementAt( i ); + v.copyInto( res ); + v.removeAllElements(); setErrorCode( OK ); } else { printDebug( "No entries found for " + getFilter() ); setErrorCode( PROPERTY_NOT_FOUND ); } } catch (Exception e) { - printDebug( "Failed to search for " + getFilter() + ": " + - e.toString() ); + if (getDebug()) { + printDebug( "Failed to search for " + getFilter() + ": " + + e.toString() ); + } setErrorCode( PROPERTY_NOT_FOUND ); } } catch (Exception e) { } + // Disconnect try { if ( (m_ldc != null) && m_ldc.isConnected() ) m_ldc.disconnect(); } catch ( Exception e ) { } + // Notify any clients with a PropertyChangeEvent notifyResult( res ); return res; } @@ -307,7 +320,16 @@ public class LDAPGetEntries extends LDAPBasePropertySupport implements Serializa * @param args list of arguments */ public static void main(String args[]) { - if (args.length != 5) { + String[] scope = { "base", "one", "sub" }; + int scopeIndex = -1; + for( int i = 0; (i < scope.length) && (args.length == 5); i++ ) { + if ( args[3].equalsIgnoreCase(scope[i]) ) { + scopeIndex = i; + break; + } + } + + if ( scopeIndex < 0 ) { System.out.println( "Usage: LDAPGetEntries host port base" + " scope filter" ); System.exit(1); @@ -316,7 +338,7 @@ public class LDAPGetEntries extends LDAPBasePropertySupport implements Serializa app.setHost( args[0] ); app.setPort( java.lang.Integer.parseInt( args[1] ) ); app.setBase( args[2] ); - app.setScope( Integer.parseInt(args[3]) ); + app.setScope( scopeIndex ); app.setFilter( args[4] ); String[] response = app.getEntries(); if ( response != null ) { @@ -329,13 +351,8 @@ public class LDAPGetEntries extends LDAPBasePropertySupport implements Serializa /* * Variables */ - public static final int OK = 0; - public static final int INVALID_PARAMETER = 1; - public static final int CONNECT_ERROR = 2; - public static final int AUTHENTICATION_ERROR = 3; - public static final int PROPERTY_NOT_FOUND = 4; - public static final int AMBIGUOUS_RESULTS = 5; - transient private String[] result; + private String _attribute = "dn"; + private String[] _result; private String _sResult = null; private String _errorMsg = null; } diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntries.mf b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntries.mf new file mode 100644 index 00000000000..697e94b6a14 --- /dev/null +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntries.mf @@ -0,0 +1,7 @@ +Name: netscape/ldap/beans/LDAPGetEntries.class +Java-Bean: True + +Name: netscape/ldap/beans/LDAPBasePropertySupport.class + +Name: netscape/ldap/beans/LDAPGetEntriesBeanInfo.class + diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetProperty.java b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetProperty.java index da7f110325e..befbf6f67b3 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetProperty.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetProperty.java @@ -74,37 +74,26 @@ public class LDAPGetProperty extends LDAPBasePropertySupport implements * @return attribute name to retrieve */ public String getAttribute() { - return attribute; + return _attribute; } /** * Sets the attribute to retrieve */ public void setAttribute( String attr ) { - attribute = attr; - } - - private String convertToStrings( String[] aResult ) { - String sResult = ""; - if ( null != aResult ) { - for ( int i = 0; i < aResult.length; i++ ) { - sResult += aResult[i] + "\n"; - } - } - return sResult; + _attribute = attr; } private void notifyResult( String[] newResult ) { - String sNewResult = convertToStrings( newResult ); - firePropertyChange( "result", result, newResult ); - // firePropertyChange( "resultString", _sResult, sNewResult ); + String sNewResult = convertToString( newResult ); + firePropertyChange( "result", _result, newResult ); _sResult = sNewResult; - result = newResult; + _result = newResult; } private void notifyResult( Vector newResult ) { - firePropertyChange( "result", resultV, newResult ); - resultV = (Vector)newResult.clone(); + firePropertyChange( "result", _resultV, newResult ); + _resultV = (Vector)newResult.clone(); } private void notifyResult( String error ) { @@ -154,7 +143,7 @@ public class LDAPGetProperty extends LDAPBasePropertySupport implements * @return Array of values for the property */ public String[] getProperty() { - if ( (attribute.length() < 1) || (getFilter().length() < 1) ) { + if ( (_attribute.length() < 1) || (getFilter().length() < 1) ) { printDebug( "Invalid attribute name or filter" ); setErrorCode( INVALID_PARAMETER ); notifyResult( (String[])null ); @@ -210,7 +199,7 @@ public class LDAPGetProperty extends LDAPBasePropertySupport implements // Search try { String[] attrs = new String[1]; - attrs[0] = attribute; + attrs[0] = _attribute; LDAPSearchResults results = m_ldc.search(getBase(), getScope(), getFilter(), @@ -230,14 +219,6 @@ public class LDAPGetProperty extends LDAPBasePropertySupport implements setErrorCode( AMBIGUOUS_RESULTS ); break; } - } catch (LDAPReferralException e) { - if (getDebug()) { - notifyResult("Referral URLs: "); - LDAPUrl refUrls[] = e.getURLs(); - for (int i = 0; i < refUrls.length; i++) - notifyResult(refUrls[i].getUrl()); - } - continue; } catch (LDAPException e) { if (getDebug()) notifyResult(e.toString()); @@ -248,7 +229,7 @@ public class LDAPGetProperty extends LDAPBasePropertySupport implements printDebug( "... " + entry.getDN() ); // Good - exactly one entry found; get the attribute // Treat DN as a special case - if ( attribute.equalsIgnoreCase( "dn" ) ) { + if ( _attribute.equalsIgnoreCase( "dn" ) ) { res = new String[1]; res[0] = entry.getDN(); setErrorCode( OK ); @@ -270,8 +251,7 @@ public class LDAPGetProperty extends LDAPBasePropertySupport implements printDebug( "\t\t" + val ); } res = new String[v.size()]; - for( int i = 0; i < v.size(); i++ ) - res[i] = (String)v.elementAt( i ); + v.copyInto( res ); setErrorCode( OK ); } else { Enumeration byteEnum = attr.getByteValues(); @@ -287,14 +267,16 @@ public class LDAPGetProperty extends LDAPBasePropertySupport implements } } else { printDebug( "No properties found for " + - attribute ); + _attribute ); setErrorCode( PROPERTY_NOT_FOUND ); } } } } catch (Exception e) { - printDebug( "Failed to search for " + getFilter() + ": " - + e.toString() ); + if (getDebug()) { + printDebug( "Failed to search for " + getFilter() + ": " + + e.toString() ); + } setErrorCode( PROPERTY_NOT_FOUND ); } @@ -303,6 +285,7 @@ public class LDAPGetProperty extends LDAPBasePropertySupport implements setErrorCode( PROPERTY_NOT_FOUND ); } + // Disconnect try { if ( (m_ldc != null) && m_ldc.isConnected() ) m_ldc.disconnect(); @@ -340,16 +323,10 @@ public class LDAPGetProperty extends LDAPBasePropertySupport implements /* * Variables */ - public static final int OK = 0; - public static final int INVALID_PARAMETER = 1; - public static final int CONNECT_ERROR = 2; - public static final int AUTHENTICATION_ERROR = 3; - public static final int PROPERTY_NOT_FOUND = 4; - public static final int AMBIGUOUS_RESULTS = 5; private String[] _dns = null; - private String attribute = new String("cn"); - transient private String[] result; - private Vector resultV = null; + private String _attribute = new String("cn"); + transient private String[] _result; + private Vector _resultV = null; private String _sResult = null; private String _errorMsg = null; } diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetProperty.mf b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetProperty.mf new file mode 100644 index 00000000000..d61f18737bf --- /dev/null +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetProperty.mf @@ -0,0 +1,6 @@ +Name: netscape/ldap/beans/LDAPGetProperty.class +Java-Bean: True + +Name: netscape/ldap/beans/LDAPBasePropertySupport.class + +Name: netscape/ldap/beans/LDAPGetPropertyBeanInfo.class diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMember.java b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMember.java index 5b9c76bd562..07e58d6fa0e 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMember.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMember.java @@ -18,6 +18,7 @@ package netscape.ldap.beans; import netscape.ldap.*; +import netscape.ldap.util.*; import java.util.Enumeration; import java.util.StringTokenizer; import java.io.Serializable; @@ -28,6 +29,11 @@ import java.awt.event.*; * authentication name and password, and DN of a group and another DN * which might be a member of the group, and returns true or * false, depending on whether the second DN is a member of the first. + *
+ * Also handles the case of dynamic groups by derefencing the URL + * and searching for membership based on the url search. + *
+ * It doesn't handle nested groups. *

* A false result means the member could not be identified as * belonging to the group. The exact reason is @@ -43,7 +49,8 @@ import java.awt.event.*; * NO_SUCH_OBJECT * */ -public class LDAPIsMember extends LDAPBasePropertySupport implements Serializable { +public class LDAPIsMember extends LDAPBasePropertySupport + implements Serializable { /** * Constructor with no parameters @@ -147,14 +154,16 @@ public class LDAPIsMember extends LDAPBasePropertySupport implements Serializabl int numDataEntries = 0; // Search try { - String[] attrs = new String[3]; + String[] attrs = new String[4]; attrs[0] = "member"; attrs[1] = "uniqueMember"; attrs[2] = "memberOfGroup"; - LDAPSearchResults results = m_ldc.search( group, - LDAPConnection.SCOPE_BASE, - "objectclass=*", - attrs, false); + attrs[3] = "memberurl"; + LDAPSearchResults results = + m_ldc.search( group, + LDAPConnection.SCOPE_BASE, + "objectclass=*", + attrs, false); // Should be only one result, at most LDAPEntry entry = null; @@ -194,22 +203,37 @@ public class LDAPIsMember extends LDAPBasePropertySupport implements Serializabl LDAPAttribute attr = (LDAPAttribute)attrsenum.nextElement(); printDebug( attr.getName() + " = " ); - // Get the values as strings + boolean urlHandler = + attr.getName().equalsIgnoreCase("memberurl"); + /* Get the values as strings. + The following code also handles dynamic + groups by calling URLMatch to see if an entry + DN is found via a URL search. + This is transparent to the caller of the bean. + */ Enumeration valuesenum = attr.getStringValues(); if (valuesenum != null) { while (valuesenum.hasMoreElements()) { String val = (String)valuesenum.nextElement(); + if (urlHandler) { + if ( URLMatch(m_ldc, val, normMember) ) { + isMember = true; + setErrorCode( OK ); + break; + } + } printDebug( "\t\t" + val ); String normFound = normalizeDN( val ); - if ( normMember.equalsIgnoreCase( normFound ) ) { + if ( normMember.equals( normFound ) ) { isMember = true; - setErrorCode( OK ); - break; + setErrorCode( OK ); + break; } } } else { setErrorCode(PROPERTY_NOT_FOUND); - printDebug("Failed to do string conversion for "+ attr.getName()); + printDebug("Failed to do string conversion for "+ + attr.getName()); } } if ( !isMember ) @@ -307,16 +331,69 @@ public class LDAPIsMember extends LDAPBasePropertySupport implements Serializabl } private String normalizeDN( String dn ) { - StringTokenizer st = new StringTokenizer( dn, "," ); - String norm = ""; - if( st.hasMoreTokens() ) { - norm = st.nextToken(); - while( st.hasMoreTokens() ) - norm = norm + "," + st.nextToken().trim(); - } - return norm; + return new DN( dn ).toRFCString().toUpperCase(); } + /** + * Return true if normMember is result of url search. + * Urls from dynamic groups do not typically contain + * the host and port so we need to fix them before + * constructing an LDAP URL. + * current ldap:///.... make ldap://host:port/... + **/ + private boolean URLMatch(LDAPConnection ld, String URL, + String normMemberDN) { + String cURL = URL; + boolean isMember = false; + int loc = URL.indexOf(":///"); + if ( loc > 0) { + cURL = URL.substring(0,loc) + "://" + ld.getHost() + + ":" + ld.getPort() + URL.substring(loc+3); + } + printDebug("URLMatch: url = " + cURL + + ", member DN = " + normMemberDN); + LDAPUrl ldapurl; + try { + ldapurl = new LDAPUrl(cURL); + printDebug("URL ->"+ldapurl.getUrl()); + } catch (java.net.MalformedURLException murl) { + printDebug("bad URL"); + return isMember; + } + + try { + LDAPSearchResults results = ld.search(ldapurl); + String entry = ""; + while ( results.hasMoreElements() && !isMember ) { + try { + entry = ((LDAPEntry)results.next()).getDN(); + String normEntry = normalizeDN( entry ); + if (normEntry.equals(normMemberDN)) { + isMember = true; + break; + } + } catch (LDAPReferralException e) { + if (getDebug()) { + notifyResult("Referral URLs: "); + LDAPUrl refUrls[] = e.getURLs(); + for (int i = 0; i < refUrls.length; i++) + notifyResult(refUrls[i].getUrl()); + } + continue; + } catch (LDAPException e) { + if (getDebug()) + notifyResult(e.toString()); + continue; + } + } + } catch (LDAPException lde) { + printDebug("Failed search for url " + ldapurl.getUrl()); + setErrorCode(NO_SUCH_OBJECT); + } + + return isMember; + } + /** * The main body if we run it as application instead of applet. * @param args list of arguments diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMember.mf b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMember.mf new file mode 100644 index 00000000000..1de2eefe50c --- /dev/null +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMember.mf @@ -0,0 +1,6 @@ +Name: netscape/ldap/beans/LDAPIsMember.class +Java-Bean: True + +Name: netscape/ldap/beans/LDAPBasePropertySupport.class + +Name: netscape/ldap/beans/LDAPIsMemberBeanInfo.class diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPSimpleAuth.mf b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPSimpleAuth.mf new file mode 100644 index 00000000000..65de8390903 --- /dev/null +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPSimpleAuth.mf @@ -0,0 +1,6 @@ +Name: netscape/ldap/beans/LDAPSimpleAuth.class +Java-Bean: True + +Name: netscape/ldap/beans/LDAPBasePropertySupport.class + +Name: netscape/ldap/beans/LDAPSimpleAuthBeanInfo.class diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPCompareAttrNames.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPCompareAttrNames.java index 4be84a397f9..adde7994355 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPCompareAttrNames.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPCompareAttrNames.java @@ -12,12 +12,13 @@ * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Copyright (C) 1999 Netscape Communications Corporation. All Rights * Reserved. */ package netscape.ldap; import java.util.*; +import java.text.*; import netscape.ldap.client.*; /** @@ -38,6 +39,8 @@ public class LDAPCompareAttrNames implements LDAPEntryComparator { String m_attrs[]; boolean m_ascending[]; + Locale m_locale = null; + Collator m_collator = null; /** * Constructs a comparator that compares the string values of @@ -134,7 +137,9 @@ public class LDAPCompareAttrNames implements LDAPEntryComparator { *

* * @param attribute Array of the attribute names to use for comparisons. - * @param ascendingFlags Array of boolean values specifying ascending or descending order to use for each attribute name. If true, sort the attributes in ascending order. + * @param ascendingFlags Array of boolean values specifying ascending + * or descending order to use for each attribute name. If + * true, sort the attributes in ascending order. */ public LDAPCompareAttrNames (String[] attributes, boolean[] ascendingFlags) { @@ -147,6 +152,31 @@ public class LDAPCompareAttrNames implements LDAPEntryComparator { } } + /** + * Get the locale used for collation, if any. If it is null, + * an ordinary string comparison will be used for sorting. + * + * @return The locale used for collation, or null. + */ + public Locale getLocale() { + return m_locale; + } + + /** + * Set the locale used for collation, if any. If it is null, + * an ordinary string comparison will be used for sorting. + * + * @param locale The locale used for collation, or null. + */ + public void setLocale( Locale locale ) { + m_locale = locale; + if ( m_locale == null ) { + m_collator = null; + } else { + m_collator = Collator.getInstance( m_locale ); + } + } + /** * If the value of the attribute in the first entry is greater * than the attribute in the second entry, returns true. @@ -231,10 +261,17 @@ public class LDAPCompareAttrNames implements LDAPEntryComparator { else return attrGreater (greater, less, attrPos+1); - if( ascending ) - return (greaterValue.compareTo (lessValue) > 0); - else - return (greaterValue.compareTo (lessValue) < 0); + if ( m_collator != null ) { + if ( ascending ) + return ( m_collator.compare( greaterValue, lessValue ) > 0 ); + else + return ( m_collator.compare( greaterValue, lessValue ) < 0 ); + } else { + if ( ascending ) + return (greaterValue.compareTo (lessValue) > 0); + else + return (greaterValue.compareTo (lessValue) < 0); + } } } diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java index f6064667a22..a406992ae2f 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java @@ -209,11 +209,11 @@ public class LDAPConnection implements LDAPv3, Cloneable { /** * Properties */ - private final static Float SdkVersion = new Float(3.1f); + private final static Float SdkVersion = new Float(3.2f); private final static Float ProtocolVersion = new Float(3.0f); private final static String SecurityVersion = new String("none,simple,sasl"); private final static Float MajorVersion = new Float(3.0f); - private final static Float MinorVersion = new Float(0.1f); + private final static Float MinorVersion = new Float(0.2f); private final static String DELIM = "#"; private final static String PersistSearchPackageName = "netscape.ldap.controls.LDAPPersistSearchControl"; @@ -2031,7 +2031,7 @@ public class LDAPConnection implements LDAPv3, Cloneable { int deref = cons.getDereference(); JDAPSearchRequest request = new JDAPSearchRequest (base, - scope, deref, cons.getMaxResults(), cons.getTimeLimit(), + scope, deref, cons.getMaxResults(), cons.getServerTimeLimit(), attrsOnly, filter, attrs); synchronized(myListener) { @@ -2986,7 +2986,7 @@ public class LDAPConnection implements LDAPv3, Cloneable { case LDAPv2.SIZELIMIT: return new Integer (cons.getMaxResults()); case LDAPv2.TIMELIMIT: - return new Integer (cons.getTimeLimit()); + return new Integer (cons.getServerTimeLimit()); case LDAPv2.REFERRALS: return new Boolean (cons.getReferrals()); case LDAPv2.REFERRALS_REBIND_PROC: @@ -3175,7 +3175,7 @@ public class LDAPConnection implements LDAPv3, Cloneable { cons.setMaxResults(((Integer)value).intValue()); return; case LDAPv2.TIMELIMIT: - cons.setTimeLimit(((Integer)value).intValue()); + cons.setServerTimeLimit(((Integer)value).intValue()); return; case LDAPv2.REFERRALS: cons.setReferrals(((Boolean)value).booleanValue()); diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPException.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPException.java index e1bfb1edf05..6829c489657 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPException.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPException.java @@ -151,11 +151,11 @@ public class LDAPException extends java.lang.Exception { * (3) The search operation could not be completed within * the maximum time limit. You can specify the maximum time * limit by calling the LDAPConnection.setOption - * method or the LDAPSearchConstraints.setTimeLimit + * method or the LDAPSearchConstraints.setServerTimeLimit * method.

* * @see netscape.ldap.LDAPConnection@setOption - * @see netscape.ldap.LDAPSearchConstraints@setTimeLimit + * @see netscape.ldap.LDAPSearchConstraints@setServerTimeLimit */ public final static int TIME_LIMIT_EXCEEDED = 3; diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPModificationSet.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPModificationSet.java index ba02b70ee00..b521526146a 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPModificationSet.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPModificationSet.java @@ -114,4 +114,22 @@ public class LDAPModificationSet { } } } + + /** + * Retrieves the string representation of the + * modification set. + * + * @return String representation of the modification set. + */ + public String toString() { + String s = "LDAPModificationSet: {"; + for( int i = 0; i < modifications.size(); i++ ) { + s += (LDAPModification)modifications.elementAt(i); + if ( i < modifications.size()-1 ) { + s += ", "; + } + } + s += "}"; + return s; + } } diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSchemaElement.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSchemaElement.java index a55b1e06b22..11a3db13d1e 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSchemaElement.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSchemaElement.java @@ -173,6 +173,27 @@ public abstract class LDAPSchemaElement { update( ld, LDAPModification.ADD, attrName ); } + /** + * Replace a single value of the object class, attribute type, + * or matching rule definition in the schema. Typically, most servers + * will require you to authenticate before allowing you to + * edit the schema. + * @param ld The LDAPConnection object representing + * a connection to an LDAP server. + * @param newValue The new value + * @exception LDAPException The specified definition cannot be + * modified. + */ + public void modify( LDAPConnection ld, LDAPSchemaElement newValue ) + throws LDAPException { + LDAPModificationSet mods = new LDAPModificationSet(); + mods.add( LDAPModification.DELETE, + new LDAPAttribute( attrName, getValue() ) ); + mods.add( LDAPModification.ADD, + new LDAPAttribute( attrName, newValue.getValue() ) ); + ld.modify( "cn=schema", mods ); + } + /** * Removes the current object class, attribute type, or matching rule * definition from the schema. Typically, most servers diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSearchConstraints.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSearchConstraints.java index 63edcb5c2d0..28a74baf64c 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSearchConstraints.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSearchConstraints.java @@ -30,6 +30,7 @@ package netscape.ldap; public class LDAPSearchConstraints implements Cloneable { private int timeLimit; + private int serverTimeLimit; private int deref; private int maxRes; private boolean referrals; @@ -46,6 +47,7 @@ public class LDAPSearchConstraints implements Cloneable { */ public LDAPSearchConstraints() { timeLimit = 0; + serverTimeLimit = 0; deref = 0; maxRes = 1000; referrals = false; @@ -102,6 +104,58 @@ public class LDAPSearchConstraints implements Cloneable { m_serverControls = null; } + /** + * Constructs a new LDAPSearchConstraints object and allows you + * to specify the search constraints in that object. + *

+ * @param msLimit Maximum time in milliseconds to wait for results (0 + * by default, which means that there is no maximum time limit) + * @param timeLimit Maximum time in seconds for the server to spend + * processing a search request (0 by default for no limit) + * @param dereference Either LDAPv2.DEREF_NEVER, + * LDAPv2.DEREF_FINDING, + * LDAPv2.DEREF_SEARCHING, or + * LDAPv2.DEREF_ALWAYS (see LDAPConnection.setOption). + * LDAPv2.DEREF_NEVER is the default. + * @param maxResults Maximum number of search results to return + * (1000 by default) + * @param doReferrals Specify true to follow referrals + * automatically, or False to throw an + * LDAPReferralException error if the server sends back + * a referral (False by default) + * @param batchSize Specify the number of results to return at a time + * (1 by default) + * @param rebind_proc Specifies the object of the class that + * implements the LDAPRebind interface (you need to + * define this class). The object will be using when the client + * follows referrals automatically. The object provides the client + * with a method for getting the distinguished name and password + * used to authenticate to another LDAP server during a referral. + * (This field is null by default.) + * @param hop_limit Maximum number of referrals to follow in a + * sequence when attempting to resolve a request. + * @see netscape.ldap.LDAPConnection#setOption(int, java.lang.Object) + * @see netscape.ldap.LDAPConnection#search(netscape.ldap.LDAPUrl, netscape.ldap.LDAPSearchConstraints) + * @see netscape.ldap.LDAPConnection#search(java.lang.String, int, java.lang.String, java.lang.String[], boolean, netscape.ldap.LDAPSearchConstraints) + */ + public LDAPSearchConstraints( int msLimit, int timeLimit, + int dereference, + int maxResults, boolean doReferrals, + int batchSize, + LDAPRebind rebind_proc, + int hop_limit) { + timeLimit = msLimit; + serverTimeLimit = timeLimit; + deref = dereference; + maxRes = maxResults; + referrals = doReferrals; + batch = batchSize; + m_rebind_proc = rebind_proc; + m_hop_limit = hop_limit; + m_clientControls = null; + m_serverControls = null; + } + /** * Returns the maximum number of milliseconds to wait for any operation * under these search constraints. If 0, there is no maximum time limit @@ -109,7 +163,16 @@ public class LDAPSearchConstraints implements Cloneable { * @return Maximum number of milliseconds to wait for operation results. */ public int getTimeLimit() { - return timeLimit*1000; + return timeLimit; + } + + /** + * Returns the maximum number of seconds to wait for the server to + * spend on a search operation.If 0, there is no time limit. + * @return Maximum number of seconds for the server to spend. + */ + public int getServerTimeLimit() { + return serverTimeLimit; } /** @@ -207,12 +270,22 @@ public class LDAPSearchConstraints implements Cloneable { * Sets the maximum number of milliseconds to wait for any operation * under these search constraints. If 0, there is no maximum time limit * on waiting for the operation results. - * @param msLimit Maximum number of milliseconds to wait for operation results. + * @param msLimit Maximum number of milliseconds to wait for operation + * results. * (0 by default, which means that there is no maximum time limit.) */ public void setTimeLimit( int msLimit ) { - if (msLimit != 0) - timeLimit = Math.max( 1, (msLimit + 500) / 1000 ); + timeLimit = msLimit; + } + + /** + * Sets the maximum number of seconds for the server to spend + * returning search results. If 0, there is no time limit. + * @param limit Maximum number of seconds for the server to spend. + * (0 by default, which means that there is no maximum time limit.) + */ + public void setServerTimeLimit( int limit ) { + serverTimeLimit = limit; } /** @@ -355,6 +428,7 @@ public class LDAPSearchConstraints implements Cloneable { LDAPSearchConstraints o = new LDAPSearchConstraints(); o.timeLimit = this.timeLimit; + o.serverTimeLimit = this.serverTimeLimit; o.deref = this.deref; o.maxRes = this.maxRes; o.referrals = this.referrals; diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPBindResponse.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPBindResponse.java index b300380e348..ae08c9cee6a 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPBindResponse.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPBindResponse.java @@ -57,7 +57,12 @@ public class JDAPBindResponse extends JDAPResult implements JDAPProtocolOp { return; BERElement e = s.elementAt(3); if (e.getType() == BERElement.TAG) { - BEROctetString str = (BEROctetString)((BERTag)e).getValue(); + BERElement el = ((BERTag)e).getValue(); + if (el instanceof BERSequence) + { + el = ((BERSequence)el).elementAt(0); + } + BEROctetString str = (BEROctetString)el; try{ m_credentials = new String(str.getValue(),"UTF8"); } catch(Throwable x) diff --git a/mozilla/directory/java-sdk/tools/LDAPDelete.java b/mozilla/directory/java-sdk/tools/LDAPDelete.java index d28e81bd931..a846fe4f8b0 100644 --- a/mozilla/directory/java-sdk/tools/LDAPDelete.java +++ b/mozilla/directory/java-sdk/tools/LDAPDelete.java @@ -1,19 +1,8 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. +/* ====================================================================== + * Copyright (c) 1997 Netscape Communications Corporation + * This file contains proprietary information of Netscape Communications. + * Copying or reproduction without prior written approval is prohibited. + * ====================================================================== */ import java.io.*; @@ -116,6 +105,7 @@ public class LDAPDelete extends LDAPTool { /* LDAPDelete */ System.err.println(" -M manage references (treat them "+ "as regular entries)"); + System.err.println(" -y proxy-DN DN to use for access control"); } /** @@ -179,10 +169,18 @@ public class LDAPDelete extends LDAPTool { /* LDAPDelete */ int msgid = 0; LDAPSearchConstraints cons = (LDAPSearchConstraints)m_client.getSearchConstraints().clone(); + + Vector controlVector = new Vector(); + if (m_proxyControl != null) + controlVector.addElement(m_proxyControl); if (m_ordinary) { - LDAPControl control = new LDAPControl( - LDAPControl.MANAGEDSAIT, true, null); - cons.setServerControls(control); + controlVector.addElement( new LDAPControl( + LDAPControl.MANAGEDSAIT, true, null) ); + } + if (controlVector.size() > 0) { + LDAPControl[] controls = new LDAPControl[controlVector.size()]; + controlVector.copyInto(controls); + cons.setServerControls(controls); } cons.setReferrals( m_referrals ); if ( m_referrals ) { diff --git a/mozilla/directory/java-sdk/tools/LDAPModify.java b/mozilla/directory/java-sdk/tools/LDAPModify.java index 07a0533a28f..37476ae2a23 100644 --- a/mozilla/directory/java-sdk/tools/LDAPModify.java +++ b/mozilla/directory/java-sdk/tools/LDAPModify.java @@ -1,19 +1,8 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. +/* ====================================================================== + * Copyright (c) 1997 Netscape Communications Corporation + * This file contains proprietary information of Netscape Communications. + * Copying or reproduction without prior written approval is prohibited. + * ====================================================================== */ /* * @(#) LDAPModify.java @@ -150,6 +139,7 @@ public class LDAPModify extends LDAPTool { /* LDAPModify */ "default"); System.err.println(" -e rejectfile save rejected entries in " + "\'rejfile\'"); + System.err.println(" -y proxy-DN DN to use for access control"); } /** @@ -197,19 +187,26 @@ public class LDAPModify extends LDAPTool { /* LDAPModify */ } /* extract parameters */ /** - * This class-method is used to call the JDAP Modify Operation with the + * Call the LDAPConnection modify operation with the * specified options, and/or parameters. */ private static void doModify() throws IOException { /* doModify */ - DataOutputStream reject = null; + PrintWriter reject = null; LDAPSearchConstraints cons = null; if (!m_justShow) { cons = (LDAPSearchConstraints)m_client.getSearchConstraints().clone(); + Vector controlVector = new Vector(); + if (m_proxyControl != null) + controlVector.addElement(m_proxyControl); if (m_ordinary) { - LDAPControl control = new LDAPControl( - LDAPControl.MANAGEDSAIT, true, null); - cons.setServerControls(control); + controlVector.addElement( new LDAPControl( + LDAPControl.MANAGEDSAIT, true, null) ); + } + if (controlVector.size() > 0) { + LDAPControl[] controls = new LDAPControl[controlVector.size()]; + controlVector.copyInto(controls); + cons.setServerControls(controls); } cons.setReferrals( m_referrals ); if ( m_referrals ) { @@ -360,33 +357,27 @@ public class LDAPModify extends LDAPTool { /* LDAPModify */ if ( skip && (m_rejectsFile != null) ) { try { if ( reject == null ) { - reject = new DataOutputStream( + reject = new PrintWriter( new FileOutputStream( m_rejectsFile ) ); } } catch ( Exception e ) { } if ( reject != null ) { - try { - reject.writeUTF( "dn: "+rec.getDN()+ " # Error: " + errCode + '\n' ); - if ( mods != null ) { - for( int m = 0; m < mods.length; m++ ) { - reject.writeUTF( mods[m].toString() + - '\n' ); - } - } else if ( newEntry != null ) { - reject.writeUTF( "Add " + newEntry.toString() - + '\n' ); - } else if ( doDelete ) { - reject.writeUTF( "Delete " + rec.getDN() - + '\n' ); - } else if (doModDN) { - reject.writeUTF( "ModDN "+ - ((LDIFModDNContent)content).toString()+'\n'); + reject.println( "dn: "+rec.getDN()+ " # Error: " + + errCode ); + if ( mods != null ) { + for( int m = 0; m < mods.length; m++ ) { + reject.println( mods[m].toString() ); } - } catch ( IOException ex ) { - System.err.println( ex.toString() ); - System.exit( 1 ); + } else if ( newEntry != null ) { + reject.println( "Add " + newEntry.toString() ); + } else if ( doDelete ) { + reject.println( "Delete " + rec.getDN() ); + } else if (doModDN) { + reject.println( "ModDN "+ + ((LDIFModDNContent)content).toString() ); } + reject.flush(); } } } diff --git a/mozilla/directory/java-sdk/tools/LDAPSearch.java b/mozilla/directory/java-sdk/tools/LDAPSearch.java index 98589a9e14a..6c675e479d2 100644 --- a/mozilla/directory/java-sdk/tools/LDAPSearch.java +++ b/mozilla/directory/java-sdk/tools/LDAPSearch.java @@ -1,19 +1,8 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. +/* ====================================================================== + * Copyright (c) 1997 Netscape Communications Corporation + * This file contains proprietary information of Netscape Communications. + * Copying or reproduction without prior written approval is prohibited. + * ====================================================================== */ import java.io.*; @@ -137,6 +126,7 @@ public class LDAPSearch extends LDAPTool { "where 'before' and 'after' are the number of "+ "entries surrounding 'index'. 'count' is the "+ "content count, 'value' is the search value."); + System.err.println(" -y proxy-DN DN to use for access control"); } /** @@ -372,6 +362,9 @@ public class LDAPSearch extends LDAPTool { if (vControl != null) cons.addElement(vControl); + if (m_proxyControl != null) + cons.addElement(m_proxyControl); + if (m_ordinary) { LDAPControl manageDSAITControl = new LDAPControl( LDAPControl.MANAGEDSAIT, true, null); @@ -444,6 +437,9 @@ public class LDAPSearch extends LDAPTool { for (int i=0; i