From 41849c2cc4c002ae021aaf9ccb26ee987f981859 Mon Sep 17 00:00:00 2001 From: "miodrag%netscape.com" Date: Fri, 12 Nov 1999 06:34:14 +0000 Subject: [PATCH] Updated ldapjdk 4.05 git-svn-id: svn://10.0.0.236/trunk@53331 18797224-902f-48f8-a5cc-f745e15eee43 --- .../netscape/ldap/beans/DisplayString.java | 2 +- .../ldap/beans/DisplayStringBeanInfo.java | 2 +- .../ldap/beans/LDAPBasePropertySupport.java | 11 +- .../netscape/ldap/beans/LDAPGetEntries.java | 2 +- .../ldap/beans/LDAPGetEntriesBeanInfo.java | 2 +- .../netscape/ldap/beans/LDAPGetProperty.java | 2 +- .../ldap/beans/LDAPGetPropertyBeanInfo.java | 2 +- .../netscape/ldap/beans/LDAPIsMember.java | 2 +- .../ldap/beans/LDAPIsMemberBeanInfo.java | 2 +- .../netscape/ldap/beans/LDAPSimpleAuth.java | 2 +- .../ldap/beans/LDAPSimpleAuthBeanInfo.java | 2 +- .../ldap/util/BadFilterException.java | 2 +- .../netscape/ldap/util/LDAPFilter.java | 6 +- .../ldap/util/LDAPFilterDescriptor.java | 2 +- .../netscape/ldap/util/LDAPFilterList.java | 2 +- .../netscape/ldap/util/LDAPIntFilterList.java | 2 +- .../netscape/ldap/util/LDAPIntFilterSet.java | 2 +- .../netscape/ldap/LDAPAttributeSchema.java | 2 +- .../netscape/ldap/LDAPAttributeSet.java | 2 +- .../ldapjdk/netscape/ldap/LDAPCache.java | 2 +- .../ldapjdk/netscape/ldap/LDAPCheckComm.java | 2 +- .../ldapjdk/netscape/ldap/LDAPConnThread.java | 10 +- .../ldapjdk/netscape/ldap/LDAPConnection.java | 168 ++-- .../ldapjdk/netscape/ldap/LDAPDN.java | 62 +- .../ldapjdk/netscape/ldap/LDAPEntry.java | 2 +- .../netscape/ldap/LDAPEntryComparator.java | 2 +- .../ldapjdk/netscape/ldap/LDAPException.java | 2 +- .../netscape/ldap/LDAPExtendedOperation.java | 2 +- .../netscape/ldap/LDAPExtendedResponse.java | 12 +- .../ldap/LDAPInterruptedException.java | 2 +- .../netscape/ldap/LDAPMatchingRuleSchema.java | 38 +- .../ldapjdk/netscape/ldap/LDAPMessage.java | 4 +- .../netscape/ldap/LDAPMessageQueue.java | 18 +- .../netscape/ldap/LDAPModification.java | 2 +- .../netscape/ldap/LDAPModificationSet.java | 2 +- .../ldapjdk/netscape/ldap/LDAPRebind.java | 2 +- .../ldapjdk/netscape/ldap/LDAPRebindAuth.java | 2 +- .../netscape/ldap/LDAPReferralException.java | 2 +- .../netscape/ldap/LDAPResourceBundle.java | 2 +- .../netscape/ldap/LDAPResponseListener.java | 23 +- .../ldap/LDAPSSLSocketFactoryExt.java | 2 +- .../ldap/LDAPSSLSocketWrapFactory.java | 2 +- .../ldapjdk/netscape/ldap/LDAPSchema.java | 14 + .../netscape/ldap/LDAPSchemaElement.java | 15 +- .../netscape/ldap/LDAPSearchListener.java | 25 +- .../netscape/ldap/LDAPSearchResults.java | 34 +- .../netscape/ldap/LDAPSocketFactory.java | 2 +- .../ldapjdk/netscape/ldap/LDAPSortKey.java | 2 +- .../ldapjdk/netscape/ldap/LDAPUrl.java | 2 +- .../ldapjdk/netscape/ldap/client/JDAPAVA.java | 2 +- .../ldap/client/JDAPBERTagDecoder.java | 2 +- .../netscape/ldap/client/JDAPFilter.java | 2 +- .../netscape/ldap/client/JDAPFilterAVA.java | 2 +- .../netscape/ldap/client/JDAPFilterAnd.java | 2 +- .../ldap/client/JDAPFilterApproxMatch.java | 2 +- .../ldap/client/JDAPFilterEqualityMatch.java | 2 +- .../ldap/client/JDAPFilterExtensible.java | 2 +- .../ldap/client/JDAPFilterGreaterOrEqual.java | 2 +- .../ldap/client/JDAPFilterLessOrEqual.java | 2 +- .../netscape/ldap/client/JDAPFilterNot.java | 2 +- .../netscape/ldap/client/JDAPFilterOpers.java | 2 +- .../netscape/ldap/client/JDAPFilterOr.java | 2 +- .../ldap/client/JDAPFilterPresent.java | 2 +- .../netscape/ldap/client/JDAPFilterSet.java | 2 +- .../ldap/client/JDAPFilterSubString.java | 2 +- .../ldap/client/opers/JDAPAbandonRequest.java | 2 +- .../ldap/client/opers/JDAPAddRequest.java | 2 +- .../ldap/client/opers/JDAPAddResponse.java | 2 +- .../ldap/client/opers/JDAPBaseDNRequest.java | 2 +- .../ldap/client/opers/JDAPBindRequest.java | 2 +- .../ldap/client/opers/JDAPBindResponse.java | 2 +- .../ldap/client/opers/JDAPCompareRequest.java | 2 +- .../client/opers/JDAPCompareResponse.java | 2 +- .../ldap/client/opers/JDAPDeleteRequest.java | 2 +- .../ldap/client/opers/JDAPDeleteResponse.java | 2 +- .../client/opers/JDAPExtendedResponse.java | 2 +- .../client/opers/JDAPModifyRDNRequest.java | 2 +- .../client/opers/JDAPModifyRDNResponse.java | 2 +- .../ldap/client/opers/JDAPModifyRequest.java | 2 +- .../ldap/client/opers/JDAPModifyResponse.java | 2 +- .../ldap/client/opers/JDAPProtocolOp.java | 2 +- .../ldap/client/opers/JDAPResult.java | 2 +- .../ldap/client/opers/JDAPSearchRequest.java | 2 +- .../ldap/client/opers/JDAPSearchResponse.java | 2 +- .../ldap/client/opers/JDAPSearchResult.java | 2 +- .../opers/JDAPSearchResultReference.java | 2 +- .../ldap/client/opers/JDAPUnbindRequest.java | 2 +- .../controls/LDAPPersistSearchControl.java | 2 +- .../ldap/controls/LDAPSortControl.java | 9 - .../ldap/controls/LDAPVirtualListControl.java | 2 +- .../ldapjdk/netscape/ldap/util/ByteBuf.java | 2 +- .../netscape/ldap/util/ConnectionPool.java | 2 +- .../netscape/ldap/util/DSMLWriter.java | 263 ++++++ .../ldapjdk/netscape/ldap/util/GetOpt.java | 2 +- .../netscape/ldap/util/LDAPWriter.java | 114 +++ .../netscape/ldap/util/LDIFContent.java | 2 +- .../netscape/ldap/util/LDIFRecord.java | 2 +- .../netscape/ldap/util/LDIFWriter.java | 179 +++++ .../netscape/ldap/util/MimeBase64Decoder.java | 2 +- .../netscape/ldap/util/MimeBase64Encoder.java | 2 +- .../netscape/ldap/util/MimeEncoder.java | 2 +- .../ldapjdk/netscape/ldap/util/RDN.java | 299 ++++++- .../com/netscape/jndi/ldap/ContextEnv.java | 2 + .../com/netscape/jndi/ldap/EventService.java | 8 +- .../jndi/ldap/LdapContextFactory.java | 3 +- .../netscape/jndi/ldap/LdapContextImpl.java | 6 + .../com/netscape/jndi/ldap/LdapService.java | 23 + .../com/netscape/jndi/ldap/ObjectMapper.java | 22 + .../controls/LdapPasswordExpiredControl.java | 2 +- .../controls/LdapPasswordExpiringControl.java | 2 +- .../jndi/ldap/controls/LdapSortControl.java | 12 +- .../controls/LdapSortResponseControl.java | 4 +- .../jndi/ldap/controls/LdapStringControl.java | 1 - .../ldap/controls/LdapVirtualListControl.java | 2 +- .../jndi/ldap/schema/SchemaAttribute.java | 2 +- .../jndi/ldap/schema/SchemaMatchingRule.java | 2 +- .../jndi/ldap/schema/SchemaObjectClass.java | 2 +- .../directory/java-sdk/ldapsp/lib/jndi.jar | Bin 97158 -> 98496 bytes .../directory/java-sdk/tools/LDAPDelete.java | 32 +- .../directory/java-sdk/tools/LDAPModify.java | 746 ++++++++++-------- .../directory/java-sdk/tools/LDAPSearch.java | 203 +++-- .../directory/java-sdk/tools/LDAPTool.java | 27 +- 122 files changed, 1817 insertions(+), 754 deletions(-) create mode 100644 mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/DSMLWriter.java create mode 100644 mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDAPWriter.java create mode 100644 mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDIFWriter.java delete mode 100644 mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapStringControl.java diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/DisplayString.java b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/DisplayString.java index 7bd25cb2146..6b8ad9d95d3 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/DisplayString.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/DisplayString.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/DisplayStringBeanInfo.java b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/DisplayStringBeanInfo.java index 2635aaeb332..cca7417bf5d 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/DisplayStringBeanInfo.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/DisplayStringBeanInfo.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): 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 667357003dc..941e50e3b6f 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPBasePropertySupport.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPBasePropertySupport.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): @@ -342,9 +342,12 @@ public class LDAPBasePropertySupport implements Serializable { m_conn.getAuthenticationPassword() ); } }; - LDAPSearchConstraints cons = conn.getSearchConstraints(); - cons.setReferrals( true ); - cons.setRebindProc( rebind ); + try { + conn.setOption(LDAPConnection.REFERRALS, Boolean.TRUE); + conn.setOption(LDAPConnection.REFERRALS_REBIND_PROC, rebind); + } catch (LDAPException e) { + //will never happen + } } /** 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 e74a7878efd..7b026f30f70 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntries.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntries.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntriesBeanInfo.java b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntriesBeanInfo.java index 358acefaa15..d56a929d4e9 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntriesBeanInfo.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetEntriesBeanInfo.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): 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 bd15b675a04..037afc4c34c 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetProperty.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetProperty.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetPropertyBeanInfo.java b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetPropertyBeanInfo.java index da9834a1e52..f5cbea303ee 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetPropertyBeanInfo.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPGetPropertyBeanInfo.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): 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 a3b85a0816b..d34eafe34e4 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMember.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMember.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMemberBeanInfo.java b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMemberBeanInfo.java index e0aee30a5a2..609434f49a7 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMemberBeanInfo.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPIsMemberBeanInfo.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPSimpleAuth.java b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPSimpleAuth.java index 5a86fa4883b..612d253447c 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPSimpleAuth.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPSimpleAuth.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPSimpleAuthBeanInfo.java b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPSimpleAuthBeanInfo.java index 06ce798c4a9..f22229e9f17 100644 --- a/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPSimpleAuthBeanInfo.java +++ b/mozilla/directory/java-sdk/ldapbeans/netscape/ldap/beans/LDAPSimpleAuthBeanInfo.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/BadFilterException.java b/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/BadFilterException.java index b0bab933cd7..7568db62aa6 100644 --- a/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/BadFilterException.java +++ b/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/BadFilterException.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPFilter.java b/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPFilter.java index 7d70590dfc4..9e24b195f5a 100644 --- a/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPFilter.java +++ b/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPFilter.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): @@ -288,6 +288,10 @@ public class LDAPFilter implements Cloneable { if ( cFilterTemplate[i] == '%' ) { i++; if ( cFilterTemplate[i] == 'v' ) { + if ( i == (cFilterTemplate.length-1) ) { + sbFilter.append ( strValue ); + break; + } i++; switch ( cFilterTemplate[i] ) { case '$': diff --git a/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPFilterDescriptor.java b/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPFilterDescriptor.java index 605bda0dba7..3c07a10db78 100644 --- a/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPFilterDescriptor.java +++ b/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPFilterDescriptor.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPFilterList.java b/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPFilterList.java index 3b8cefa0074..8923c465d16 100644 --- a/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPFilterList.java +++ b/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPFilterList.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPIntFilterList.java b/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPIntFilterList.java index 24e6a76a5b2..d90d0f5231c 100644 --- a/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPIntFilterList.java +++ b/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPIntFilterList.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPIntFilterSet.java b/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPIntFilterSet.java index d5aca4311fa..050c3585404 100644 --- a/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPIntFilterSet.java +++ b/mozilla/directory/java-sdk/ldapfilter/netscape/ldap/util/LDAPIntFilterSet.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPAttributeSchema.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPAttributeSchema.java index 7dfd5a69a38..4e37869e972 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPAttributeSchema.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPAttributeSchema.java @@ -365,6 +365,6 @@ public class LDAPAttributeSchema extends LDAPSchemaElement { NO_USER_MODIFICATION, SYNTAX}; - private LDAPSyntaxSchemaElement syntaxElement = + protected LDAPSyntaxSchemaElement syntaxElement = new LDAPSyntaxSchemaElement(); } diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPAttributeSet.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPAttributeSet.java index 17b3dde33a5..11b64a06a16 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPAttributeSet.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPAttributeSet.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPCache.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPCache.java index a0bd4a5fac2..f94b604f5ec 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPCache.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPCache.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPCheckComm.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPCheckComm.java index 0612be3cc37..11f5eb01bca 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPCheckComm.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPCheckComm.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnThread.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnThread.java index ff7940fb980..4ffdd45ab23 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnThread.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnThread.java @@ -176,12 +176,12 @@ class LDAPConnThread extends Thread { if (!(request instanceof JDAPAbandonRequest || request instanceof JDAPUnbindRequest)) { /* Only worry about toNotify if we expect a response... */ - this.m_requests.put (new Integer (msg.getID()), toNotify); + this.m_requests.put (new Integer (msg.getMessageID()), toNotify); /* Notify the backlog checker that there may be another outstanding request */ resultRetrieved(); } - toNotify.addRequest(msg.getID(), conn, this, cons.getTimeLimit()); + toNotify.addRequest(msg.getMessageID(), conn, this, cons.getTimeLimit()); } synchronized( m_sendRequestLock ) { @@ -435,7 +435,7 @@ class LDAPConnThread extends Thread { * @param msg New message from LDAP server */ private void processResponse (LDAPMessage msg, int size) { - Integer messageID = new Integer (msg.getID()); + Integer messageID = new Integer (msg.getMessageID()); LDAPMessageQueue l = (LDAPMessageQueue)m_requests.get (messageID); if (l == null) { @@ -451,7 +451,7 @@ class LDAPConnThread extends Thread { /* Were there any controls for this client? */ LDAPControl[] con = msg.getControls(); if (con != null) { - int msgid = msg.getID(); + int msgid = msg.getMessageID(); LDAPConnection ldc = l.getConnection(msgid); if (ldc != null) { ldc.setResponseControls( this, @@ -483,7 +483,7 @@ class LDAPConnThread extends Thread { * the entry size to -1. */ private synchronized void cacheSearchResult (LDAPSearchListener l, LDAPMessage msg, int size) { - Integer messageID = new Integer (msg.getID()); + Integer messageID = new Integer (msg.getMessageID()); Long key = l.getKey(); Vector v = null; diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java index 0ca1af7d9c4..1b26b25426a 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPConnection.java @@ -176,10 +176,13 @@ public class LDAPConnection * When -D command line option is used, defining the property with * no value will send the trace output to the standard error. If the * value is defined, it is assumed to be the name of an output file. + * If the file name is prefixed with a '+' character, the file is + * opened in append mode. *

* When the property is set with getProperty method, - * the property must have an output stream as the value. To stop - * tracing, null should be passed as the property value. + * the property value must be either a String (represents a file name) + * or an OutputStream. To stop tracing, null should be + * passed as the property value. * * @see netscape.ldap.LDAPConnection#setProperty(java.lang.String, java.lang.Object) */ @@ -245,15 +248,16 @@ public class LDAPConnection private Properties m_securityProperties; private Hashtable m_properties = new Hashtable(); private LDAPConnection m_referralConnection; + private String m_authMethod = "none"; /** * Properties */ - private final static Float SdkVersion = new Float(4.04f); + private final static Float SdkVersion = new Float(4.05f); 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(4.0f); - private final static Float MinorVersion = new Float(0.4f); + private final static Float MinorVersion = new Float(0.5f); private final static String DELIM = "#"; private final static String PersistSearchPackageName = "netscape.ldap.controls.LDAPPersistSearchControl"; @@ -432,18 +436,19 @@ public class LDAPConnection } else if ( name.equalsIgnoreCase( TRACE_PROPERTY ) ) { + OutputStream os = null; if (val == null) { m_properties.remove(TRACE_PROPERTY); } - else if (! (val instanceof OutputStream)) { - throw new LDAPException(TRACE_PROPERTY + " must be OutputStream" ); - } else { + if (m_thread != null) { + os = createTraceOutputStream(val); + } m_properties.put( TRACE_PROPERTY, val ); } - + if (m_thread != null) { - m_thread.setTraceOutputStream((OutputStream)val); + m_thread.setTraceOutputStream(os); } // This is used only by the ldapjdk test cases to simulate a @@ -456,6 +461,47 @@ public class LDAPConnection } } + /** + * Create output stream from the TRACE_PROPERTY value. + * The value can be either of type String or OutputStream. The + * String value represents output file name. If the name is an empty + * string, the output is sent to System.err. If the file name is + * prefixed with a '+' character, the file is opened in append mode. + * @param out Trace output specifier + */ + OutputStream createTraceOutputStream(Object out) throws LDAPException { + OutputStream os = null; + + if (out instanceof String) { // trace file name + String file = (String)out; + if (file.length() == 0) { + os = System.err; + } + else { + try { + boolean appendMode = (file.charAt(0) == '+'); + if (appendMode) { + file = file.substring(1); + } + FileOutputStream fos = new FileOutputStream(file, appendMode); + os = new BufferedOutputStream(fos); + } + catch (IOException e) { + throw new LDAPException( + "Can not open output trace file " + file + " " + e); + } + } + } + else if (out instanceof OutputStream) { + os = (OutputStream) out; + } + else { + throw new LDAPException(TRACE_PROPERTY + " must be OutputStream or String" ); + } + + return os; + } + /** * Sets the LDAP protocol version that your client prefers to use when * connecting to the LDAP server. @@ -927,33 +973,21 @@ public class LDAPConnection /** * Returns the trace output stream if set by the user */ - OutputStream getTraceOutputStream() { + OutputStream getTraceOutputStream() throws LDAPException { // Check first if trace output has been set using setProperty() - OutputStream os = (OutputStream)m_properties.get(TRACE_PROPERTY); - if (os != null) { - return os; + Object traceOut = m_properties.get(TRACE_PROPERTY); + if (traceOut != null) { + return createTraceOutputStream(traceOut); } // Check if the property has been set with java -Dcom.netscape.ldap.trace // If the property does not have a value, send the trace to the System.err, // otherwise use the value as the output file name try { - String traceProp = System.getProperty(TRACE_PROPERTY); - if (traceProp != null) { - if (traceProp.length() == 0) { - return System.err; - } - else { - try { - FileOutputStream fos = new FileOutputStream(traceProp); - return new BufferedOutputStream(fos); - } - catch (Exception e) { - System.err.println("Can not open output trace file: " + e); - return null; - } - } + traceOut = System.getProperty(TRACE_PROPERTY); + if (traceOut != null) { + return createTraceOutputStream(traceOut); } } catch (Exception e) { @@ -1073,10 +1107,10 @@ public class LDAPConnection return; } - searchResults.abandon(); - - int id = searchResults.getID(); - abandon(id); + int id = searchResults.getMessageID(); + if ( id != -1 ) { + abandon( id ); + } } /** @@ -1340,6 +1374,7 @@ public class LDAPConnection m_saslBinder = new LDAPSaslBind( dn, mechanisms, packageName, props, cbh ); m_saslBinder.bind( this ); + m_authMethod = "sasl"; m_boundDN = dn; } @@ -1594,6 +1629,7 @@ public class LDAPConnection if (!isConnected()) { m_bound = false; + m_authMethod = "none"; connect (); // special case: the connection currently is not bound, and now there is // a bind request. The connection needs to reconnect if the thread has @@ -1649,17 +1685,18 @@ public class LDAPConnection m_referralConnection.disconnect(); m_referralConnection = null; } + m_bound = false; sendRequest(new JDAPBindRequest(m_protocolVersion, m_boundDN, m_boundPasswd), myListener, cons); checkMsg( myListener.getResponse() ); + markConnAsBound(); + m_authMethod = "simple"; } catch (LDAPReferralException e) { m_referralConnection = createReferralConnection(e, cons); } finally { releaseResponseListener(myListener); } - - markConnAsBound(); } /** @@ -1722,11 +1759,22 @@ public class LDAPConnection connect(); } m_saslBinder.bind(this, false); + m_authMethod = "sasl"; } else { internalBind (m_protocolVersion, false, cons); } } + /** + * Gets the authentication method used to bind:
+ * "none", "simple", or "sasl" + * + * @return the authentication method, or "none" + */ + public String getAuthenticationMethod() { + return isConnected() ? m_authMethod : "none"; + } + /** * Disconnect from the server and then reconnect using the current * credentials and authentication method @@ -1740,6 +1788,7 @@ public class LDAPConnection if (m_saslBinder != null) { m_saslBinder.bind(this, true); + m_authMethod = "sasl"; } else { internalBind (m_protocolVersion, true, m_defaultConstraints); } @@ -2333,7 +2382,6 @@ public class LDAPConnection public LDAPSearchResults search( String base, int scope, String filter, String[] attrs, boolean attrsOnly, LDAPSearchConstraints cons ) throws LDAPException { - if (cons == null) { cons = m_defaultConstraints; } @@ -2392,9 +2440,27 @@ public class LDAPConnection throw e; } + /* Is this a persistent search? */ + boolean isPersistentSearch = false; + LDAPControl[] controls = + (LDAPControl[])getOption(LDAPv3.SERVERCONTROLS, cons); + for (int i = 0; (controls != null) && (i < controls.length); i++) { + if ( controls[i] instanceof + netscape.ldap.controls.LDAPPersistSearchControl ) { + isPersistentSearch = true; + break; + } + } - /* Synchronous search if all requested at once */ - if ( cons.getBatchSize() == 0 ) { + /* For a persistent search, don't wait for a first result, because + there may be none at this time if changesOnly was specified in + the control. + */ + if ( isPersistentSearch ) { + returnValue.associatePersistentSearch (myListener); + + } else if ( cons.getBatchSize() == 0 ) { + /* Synchronous search if all requested at once */ try { /* Block until all results are in */ LDAPMessage response = myListener.completeSearchOperation(); @@ -2432,10 +2498,10 @@ public class LDAPConnection * the search didn't fail */ LDAPMessage firstResult = myListener.nextMessage (); - if (firstResult instanceof LDAPResponse) { + if ( firstResult instanceof LDAPResponse ) { try { checkSearchMsg(returnValue, firstResult, cons, base, scope, - filter, attrs, attrsOnly); + filter, attrs, attrsOnly); } finally { releaseSearchListener (myListener); } @@ -2457,15 +2523,6 @@ public class LDAPConnection } } - LDAPControl[] controls = (LDAPControl[])getOption(LDAPv3.SERVERCONTROLS, cons); - - for (int i=0; (controls != null) && (i 0) ? " + " : "") + types[j] + "=" + + ( new String( buffer[j] ) ) ); } - return name.getType()+"="+(new String(buffer)); + return new String( retbuf ); } /** @@ -109,11 +124,11 @@ public class LDAPDN { */ public static String unEscapeRDN(String rdn) { RDN name = new RDN(rdn); - String val = name.getValue(); - if (val == null) + String[] vals = name.getValues(); + if ( (vals == null) || (vals.length < 1) ) return rdn; - StringBuffer buffer = new StringBuffer(val); + StringBuffer buffer = new StringBuffer(vals[0]); StringBuffer copy = new StringBuffer(); int i=0; while (iLDAPExtendedResponse.getID() + */ + public String getOID() { + return getID(); + } + /** * Returns the raw bytes of the value part of the response. * diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPInterruptedException.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPInterruptedException.java index 85626faa98d..b1cacd33162 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPInterruptedException.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPInterruptedException.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPMatchingRuleSchema.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPMatchingRuleSchema.java index 5480f853114..e1dac0e7b18 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPMatchingRuleSchema.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPMatchingRuleSchema.java @@ -99,7 +99,7 @@ import java.util.*; * @see netscape.ldap.LDAPSchemaElement **/ -public class LDAPMatchingRuleSchema extends LDAPSchemaElement { +public class LDAPMatchingRuleSchema extends LDAPAttributeSchema { /** * Constructs a matching rule definition, using the specified * information. @@ -171,7 +171,12 @@ public class LDAPMatchingRuleSchema extends LDAPSchemaElement { String[] attributes, String syntaxString, String[] aliases ) { - super( name, oid, description ); + if ( (oid == null) || (oid.trim().length() < 1) ) { + throw new IllegalArgumentException( "OID required" ); + } + this.name = name; + this.oid = oid; + this.description = description; attrName = "matchingrules"; syntaxElement.syntax = syntaxElement.syntaxCheck( syntaxString ); syntaxElement.syntaxString = syntaxString; @@ -235,33 +240,6 @@ public class LDAPMatchingRuleSchema extends LDAPSchemaElement { return attributes; } - /** - * Gets the syntax of the schema element - * @return One of the following values: - *

- */ - public int getSyntax() { - return syntaxElement.syntax; - } - - /** - * Gets the syntax of the attribute type in dotted-decimal format, - * for example "1.2.3.4.5" - * @return The attribute syntax in dotted-decimal format. - */ - public String getSyntaxString() { - return syntaxElement.syntaxString; - } - /** * Prepare a value in RFC 2252 format for submitting to a server * @@ -396,6 +374,4 @@ public class LDAPMatchingRuleSchema extends LDAPSchemaElement { SYNTAX }; private String[] attributes = null; - private LDAPSyntaxSchemaElement syntaxElement = - new LDAPSyntaxSchemaElement(); } diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPMessage.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPMessage.java index 83eef99b4cc..0390e734dd0 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPMessage.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPMessage.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): @@ -193,7 +193,7 @@ public class LDAPMessage { * Returns the message identifer. * @return message identifer. */ - public int getID(){ + public int getMessageID(){ return m_msgid; } diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPMessageQueue.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPMessageQueue.java index 39a9c18ce3c..6b1b7b63a2f 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPMessageQueue.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPMessageQueue.java @@ -117,7 +117,7 @@ class LDAPMessageQueue { // Is the ldap operation completed? if (msg instanceof LDAPResponse) { - removeRequest(msg.getID()); + removeRequest(msg.getMessageID()); } return msg; @@ -220,14 +220,16 @@ class LDAPMessageQueue { * requests are sent by one thread but processed by another one * * A client may be implemented in such a way that one thread makes LDAP - * requests and calls l.getIDs(), while another thread is responsible for + * requests and calls l.getMessageIDs(), while another thread is + * responsible for * processing of responses (call l.getResponse()). Both threads are using * the same listener objects. In such a case, a race * condition may occur, where a LDAP response message is retrieved and * the request terminated (request ID removed) before the first thread - * has a chance to execute l.getIDs(). + * has a chance to execute l.getMessageIDs(). * The proper way to handle this scenario is to create a separate listener - * for each new request, and after l.getIDs() has been invoked, merge the + * for each new request, and after l.getMessageIDs() has been invoked, + * merge the * new request with the existing one. * @param mq2 message queue to merge with this one */ @@ -271,7 +273,7 @@ class LDAPMessageQueue { // Mark conn as bound for asych bind operations if (isAsynchOp() && msg.getType() == msg.BIND_RESPONSE) { if (((LDAPResponse) msg).getResultCode() == 0) { - getConnection(msg.getID()).markConnAsBound(); + getConnection(msg.getMessageID()).markConnAsBound(); } } @@ -320,7 +322,7 @@ class LDAPMessageQueue { int removeCount=0; for (int i=(m_messageQueue.size()-1); i>=0; i--) { LDAPMessage msg = (LDAPMessage)m_messageQueue.elementAt(i); - if (msg.getID() == id) { + if (msg.getMessageID() == id) { m_messageQueue.removeElementAt(i); removeCount++; } @@ -377,7 +379,7 @@ class LDAPMessageQueue { * Returns message ID of the last request * @return message ID. */ - synchronized int getID() { + synchronized int getMessageID() { int reqCnt = m_requestList.size(); if ( reqCnt == 0) { return -1; @@ -392,7 +394,7 @@ class LDAPMessageQueue { * Returns a list of message IDs for all outstanding requests * @return message ID array. */ - synchronized int[] getIDs() { + synchronized int[] getMessageIDs() { int[] ids = new int[m_requestList.size()]; for (int i=0; i < ids.length; i++) { RequestEntry entry = (RequestEntry)m_requestList.elementAt(i); diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPModification.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPModification.java index a215e100443..2dd58c0870e 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPModification.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPModification.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPModificationSet.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPModificationSet.java index 4d7bc528937..cf4efc139ce 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPModificationSet.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPModificationSet.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPRebind.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPRebind.java index d96377c28b1..bbdc4676ca3 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPRebind.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPRebind.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPRebindAuth.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPRebindAuth.java index 04a4e453ab3..81fae52daaf 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPRebindAuth.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPRebindAuth.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPReferralException.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPReferralException.java index 590d39ed8be..ce5e72bcda9 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPReferralException.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPReferralException.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPResourceBundle.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPResourceBundle.java index b93d0766543..c45c7c96bef 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPResourceBundle.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPResourceBundle.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPResponseListener.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPResponseListener.java index 5548df491a7..7fdf49750a1 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPResponseListener.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPResponseListener.java @@ -54,25 +54,26 @@ public class LDAPResponseListener extends LDAPMessageQueue{ } /** - * Merge two response listeners + * Merge two response listeners. * Move/append the content from another response listener to this one. - * + *

* To be used for synchronization of asynchronous LDAP operations where - * requests are sent by one thread but processed by another one - * + * requests are sent by one thread but processed by another one. + *

* A client may be implemented in such a way that one thread makes LDAP - * requests and calls l.getIDs(), while another thread is responsible for - * processing of responses (call l.getResponse()). Both threads are using + * requests and calls l.getMessageIDs(), while another thread + * is responsible for processing of responses (call l.getResponse()). + * Both threads are using * the same listener objects. In such a case, a race * condition may occur, where a LDAP response message is retrieved and * the request terminated (request ID removed) before the first thread - * has a chance to execute l.getIDs(). + * has a chance to execute l.getMessageIDs(). * The proper way to handle this scenario is to create a separate listener - * for each new request, and after l.getIDs() has been invoked, merge the + * for each new request, and after l.getMessageIDs() has been invoked, merge the * new request with the existing one. * @param listener2 the listener with which to merge */ - public void merge(LDAPSearchListener listener2) { + public void merge(LDAPResponseListener listener2) { super.merge(listener2); } @@ -89,7 +90,7 @@ public class LDAPResponseListener extends LDAPMessageQueue{ * Returns message IDs for all outstanding requests * @return message ID array. */ - public int[] getIDs() { - return super.getIDs(); + public int[] getMessageIDs() { + return super.getMessageIDs(); } } diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSSLSocketFactoryExt.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSSLSocketFactoryExt.java index dbc22f39422..f9a45532aa2 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSSLSocketFactoryExt.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSSLSocketFactoryExt.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSSLSocketWrapFactory.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSSLSocketWrapFactory.java index 8dfd3bfb812..24329f0cd9c 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSSLSocketWrapFactory.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSSLSocketWrapFactory.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSchema.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSchema.java index 9d0755c7de2..3dc1dd9013c 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSchema.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSchema.java @@ -183,6 +183,10 @@ public class LDAPSchema { public LDAPSchema() { } + public LDAPSchema( LDAPEntry entry ) { + initialize( entry ); + } + /** * Adds an object class schema definition to the current schema. * You can also add object class schema definitions by calling the @@ -363,8 +367,18 @@ public class LDAPSchema { /* Get the entire schema definition entry */ LDAPEntry entry = readSchema( ld, entryName ); + initialize( entry ); + } + + /** + * Extract all schema elements from subschema entry + * + * @param entry entry containing schema definitions + */ + protected void initialize( LDAPEntry entry ) { /* Get all object class definitions */ LDAPAttribute attr = entry.getAttribute( "objectclasses" ); + Enumeration en; if ( attr != null ) { en = attr.getStringValues(); while( en.hasMoreElements() ) { diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSchemaElement.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSchemaElement.java index 2375fdf66b2..49d8826e01b 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSchemaElement.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSchemaElement.java @@ -1,4 +1,4 @@ - /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +/* -*- 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.1 (the "License"); you may not use this file @@ -115,10 +115,21 @@ public abstract class LDAPSchemaElement { * @return the OID of the object class, attribute type, * or matching rule. */ - public String getOID() { + public String getID() { return oid; } + /** + * Gets the object ID (OID) of the object class, attribute type, + * or matching rule in dotted-string format (for example, "1.2.3.4"). + * @return the OID of the object class, attribute type, + * or matching rule. + * @deprecated Use LDAPSchemaElement.getID() + */ + public String getOID() { + return getID(); + } + /** * Gets the description of the object class, attribute type, * or matching rule. diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSearchListener.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSearchListener.java index 341eb07609b..aa3567a96c6 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSearchListener.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSearchListener.java @@ -84,7 +84,7 @@ public class LDAPSearchListener extends LDAPMessageQueue { // Notify LDAPConnThread to wake up if backlog limit has been reached if (result instanceof LDAPSearchResult || result instanceof LDAPSearchResultReference) { - LDAPConnection ld = getConnection(result.getID()); + LDAPConnection ld = getConnection(result.getMessageID()); if (ld != null) { ld.resultRetrieved(); } @@ -94,22 +94,23 @@ public class LDAPSearchListener extends LDAPMessageQueue { } /** - * Merge two search listeners - * Move/append the content from another search listener to this one. - * + * Merge two response listeners. + * Move/append the content from another response listener to this one. + *

* To be used for synchronization of asynchronous LDAP operations where - * requests are sent by one thread but processed by another one - * + * requests are sent by one thread but processed by another one. + *

* A client may be implemented in such a way that one thread makes LDAP - * requests and calls l.getIDs(), while another thread is responsible for + * requests and calls l.getMessageIDs(), while another thread + * is responsible for * processing of responses (call l.getResponse()). Both threads are using * the same listener objects. In such a case, a race * condition may occur, where a LDAP response message is retrieved and * the request terminated (request ID removed) before the first thread - * has a chance to execute l.getIDs(). + * has a chance to execute l.getMessageIDs(). * The proper way to handle this scenario is to create a separate listener - * for each new request, and after l.getIDs() has been invoked, merge the - * new request with the existing one. + * for each new request, and after l.getMessageIDs() has been invoked, + * merge the new request with the existing one. * @param listener2 the listener with which to merge */ public void merge(LDAPSearchListener listener2) { @@ -129,8 +130,8 @@ public class LDAPSearchListener extends LDAPMessageQueue { * Returns message IDs for all outstanding requests * @return message ID array. */ - public int[] getIDs() { - return super.getIDs(); + public int[] getMessageIDs() { + return super.getMessageIDs(); } /** diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSearchResults.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSearchResults.java index 0b409cd93d9..8217a5247e9 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSearchResults.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSearchResults.java @@ -479,19 +479,10 @@ public class LDAPSearchResults implements Enumeration { * Returns message ID. * @return Message ID. */ - int getID() { + int getMessageID() { if ( resultSource == null ) return -1; - return resultSource.getID(); - } - - /** - * Terminates the iteration; called on LDAPConnection.abandon(). - */ - void abandon() { - synchronized( this ) { - searchComplete = true; - } + return resultSource.getMessageID(); } /** @@ -518,14 +509,21 @@ public class LDAPSearchResults implements Enumeration { return; } - if (msg instanceof LDAPResponse) { - try { - // check response and see if we need to do referral - // v2: referral stored in the JDAPResult - currConn.checkSearchMsg(this, msg, currCons, - currBase, currScope, currFilter, currAttrs, currAttrsOnly); + + if (msg == null) { // Request abandoned + searchComplete = true; + currConn.releaseSearchListener(resultSource); + return; + + } else if (msg instanceof LDAPResponse) { + try { + // check response and see if we need to do referral + // v2: referral stored in the JDAPResult + currConn.checkSearchMsg(this, msg, currCons, + currBase, currScope, currFilter, + currAttrs, currAttrsOnly); } catch (LDAPException e) { - System.err.println("Exception: "+e); + System.err.println("LDAPSearchResults.fetchResult: "+e); } finally { currConn.releaseSearchListener(resultSource); } diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSocketFactory.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSocketFactory.java index 89f4f3f45f8..7ce8180a3fb 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSocketFactory.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSocketFactory.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSortKey.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSortKey.java index c2646ed373e..0d6109950a7 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSortKey.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPSortKey.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPUrl.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPUrl.java index 39131bbede8..8d37ba57c3c 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPUrl.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/LDAPUrl.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPAVA.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPAVA.java index d3360a22327..316bb5ed86b 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPAVA.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPAVA.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPBERTagDecoder.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPBERTagDecoder.java index d29fc94f33e..92d328962b8 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPBERTagDecoder.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPBERTagDecoder.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilter.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilter.java index 0f9a8673f89..9ffb4080b02 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilter.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilter.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterAVA.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterAVA.java index f11b8fc6451..921c9584219 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterAVA.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterAVA.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterAnd.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterAnd.java index e9cb4d19e45..510698b463a 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterAnd.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterAnd.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterApproxMatch.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterApproxMatch.java index 7668390c2b6..b4cccd3ea9f 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterApproxMatch.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterApproxMatch.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterEqualityMatch.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterEqualityMatch.java index 9ac621d70c6..ce19404b196 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterEqualityMatch.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterEqualityMatch.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterExtensible.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterExtensible.java index 8075ef3dcea..814ce67b572 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterExtensible.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterExtensible.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterGreaterOrEqual.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterGreaterOrEqual.java index 1f74b8b6755..f05bb8a4ec9 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterGreaterOrEqual.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterGreaterOrEqual.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterLessOrEqual.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterLessOrEqual.java index 750f6b13115..d1a51824f16 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterLessOrEqual.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterLessOrEqual.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterNot.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterNot.java index 5cd98415842..2439448beab 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterNot.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterNot.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterOpers.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterOpers.java index 5a39c107477..0064129d019 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterOpers.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterOpers.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterOr.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterOr.java index 76e83d5fb24..2c701365cc5 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterOr.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterOr.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterPresent.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterPresent.java index a9405f51190..db932b8f385 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterPresent.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterPresent.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterSet.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterSet.java index e273e808158..3f405111f63 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterSet.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterSet.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterSubString.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterSubString.java index c4acb7edfc8..54009e8fc38 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterSubString.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/JDAPFilterSubString.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPAbandonRequest.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPAbandonRequest.java index b6108a69afa..205110b6277 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPAbandonRequest.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPAbandonRequest.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPAddRequest.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPAddRequest.java index e2d5a701483..7701b732980 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPAddRequest.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPAddRequest.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPAddResponse.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPAddResponse.java index f730f4df7b5..e74d06485b4 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPAddResponse.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPAddResponse.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPBaseDNRequest.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPBaseDNRequest.java index 6f5036d528c..9b7c6bd501a 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPBaseDNRequest.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPBaseDNRequest.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPBindRequest.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPBindRequest.java index e64c3facafe..33d8c2affee 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPBindRequest.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPBindRequest.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): 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 f28c43aa322..8e5bce82ea6 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 @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPCompareRequest.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPCompareRequest.java index f09db5e824a..6f832918825 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPCompareRequest.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPCompareRequest.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPCompareResponse.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPCompareResponse.java index 28499bbd643..13f35b532cc 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPCompareResponse.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPCompareResponse.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPDeleteRequest.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPDeleteRequest.java index 09d20027d8a..0a0f6301637 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPDeleteRequest.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPDeleteRequest.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPDeleteResponse.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPDeleteResponse.java index e7eade25744..bc9de5861bc 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPDeleteResponse.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPDeleteResponse.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPExtendedResponse.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPExtendedResponse.java index 4652a3336e1..1990eb2fdd3 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPExtendedResponse.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPExtendedResponse.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyRDNRequest.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyRDNRequest.java index 70ab5b20756..1a5caee13c0 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyRDNRequest.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyRDNRequest.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyRDNResponse.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyRDNResponse.java index f98d0c3eabe..3986562c5ab 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyRDNResponse.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyRDNResponse.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyRequest.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyRequest.java index f718351422c..0d9b3653f52 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyRequest.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyRequest.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyResponse.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyResponse.java index 83ad2b320b6..53019cd7f8f 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyResponse.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPModifyResponse.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPProtocolOp.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPProtocolOp.java index bd6587d67f5..df1abe8c299 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPProtocolOp.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPProtocolOp.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPResult.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPResult.java index 800d2c490c5..3f3039667ec 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPResult.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPResult.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchRequest.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchRequest.java index 9ab3cd032e0..0bca75b91bc 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchRequest.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchRequest.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchResponse.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchResponse.java index 0156b60ca70..63b76310309 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchResponse.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchResponse.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchResult.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchResult.java index 2d6939e458e..24ff1ee0b47 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchResult.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchResult.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchResultReference.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchResultReference.java index ac76585b6dc..eb00547befc 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchResultReference.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPSearchResultReference.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPUnbindRequest.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPUnbindRequest.java index 85b13a25211..e0ebf063549 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPUnbindRequest.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/client/opers/JDAPUnbindRequest.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/controls/LDAPPersistSearchControl.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/controls/LDAPPersistSearchControl.java index 501c64448e6..9bab06ac446 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/controls/LDAPPersistSearchControl.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/controls/LDAPPersistSearchControl.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/controls/LDAPSortControl.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/controls/LDAPSortControl.java index 39b65e03886..88685b601a0 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/controls/LDAPSortControl.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/controls/LDAPSortControl.java @@ -611,13 +611,4 @@ public class LDAPSortControl extends LDAPControl { return sb.toString(); } - - // register SORTRESPONSE with LDAPControl - static { - try { - LDAPControl.register( SORTRESPONSE, LDAPSortControl.class ); - } catch (LDAPException e) { - } - } } - diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/controls/LDAPVirtualListControl.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/controls/LDAPVirtualListControl.java index 539a8d8e8ca..56c13f2fb8f 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/controls/LDAPVirtualListControl.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/controls/LDAPVirtualListControl.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/ByteBuf.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/ByteBuf.java index 5232a77796d..81ec31a035a 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/ByteBuf.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/ByteBuf.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/ConnectionPool.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/ConnectionPool.java index feddd301fe1..29083f0d65e 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/ConnectionPool.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/ConnectionPool.java @@ -1,4 +1,4 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset:4 -*- +/* -*- 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.1 (the "License"); you may not use this file diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/DSMLWriter.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/DSMLWriter.java new file mode 100644 index 00000000000..427dec3916c --- /dev/null +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/DSMLWriter.java @@ -0,0 +1,263 @@ +/* -*- 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.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1999 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ +package netscape.ldap.util; + +import java.util.*; +import netscape.ldap.*; +import java.io.*; + +/** + * Class for outputting LDAP entries to a stream as DSML. + * + * @version 1.0 + */ +public class DSMLWriter extends LDAPWriter { + +// static final long serialVersionUID = -2710382547996750924L; + + /** + * Constructs a DSMLWriter object to output entries + * to a stream as DSML. + * + * @param pw output stream + */ + public DSMLWriter( PrintWriter pw ) { + super( pw ); + } + + /** + * Prints the schema from an entry containing subschema + * + * entry entry containing schema definitions + */ + public void printSchema( LDAPEntry entry ) { + LDAPSchema schema = new LDAPSchema( entry ); + printString( " " ); + printObjectClassSchema( schema ); + printAttributeSchema( schema ); + printString( " " ); + } + + + /** + * Prints the object class schema from a schema object + * + * schema schema elements + */ + protected void printObjectClassSchema( LDAPSchema schema ) { + Enumeration en = schema.getObjectClasses(); + while( en.hasMoreElements() ) { + LDAPObjectClassSchema s = (LDAPObjectClassSchema)en.nextElement(); + printString( " " ); + if ( s.isObsolete() ) { + printString( " obsolete=true" ); + } + printString( " " + s.getName() + "" ); + printString( " " + s.getDescription() + + "" ); + Enumeration attrs = s.getRequiredAttributes(); + while( attrs.hasMoreElements() ) { + printString( " " ); + } + attrs = s.getOptionalAttributes(); + while( attrs.hasMoreElements() ) { + printString( " " ); + } + printString( " " ); + } + } + + + /** + * Prints the attribute schema from a schema object + * + * schema schema elements + */ + protected void printAttributeSchema( LDAPSchema schema ) { + Enumeration en = schema.getAttributes(); + while( en.hasMoreElements() ) { + LDAPAttributeSchema s = (LDAPAttributeSchema)en.nextElement(); + printString( " 0) ) { + printString( " equality=" + vals[0] ); + } + vals = s.getQualifier( s.ORDERING ); + if ( (vals != null) && (vals.length > 0) ) { + printString( " ordering=" + vals[0] ); + } + vals = s.getQualifier( s.SUBSTR ); + if ( (vals != null) && (vals.length > 0) ) { + printString( " substring=" + vals[0] ); + } + printString( " " + s.getName() + "" ); + printString( " " + s.getDescription() + + "" ); + printString( " " + s.getSyntaxString() + + "" ); + printString( " " ); + } + } + + + /** + * Print an attribute of an entry + * + * @param attr the attribute to format to the output stream + */ + protected void printAttribute( LDAPAttribute attr ) { + String attrName = attr.getName(); + + // Object classes are treated differently in DSML. Also, they + // are always String-valued + if ( attrName.equalsIgnoreCase( "objectclass" ) ) { + Enumeration enumVals = attr.getStringValues(); + if ( enumVals != null ) { + while ( enumVals.hasMoreElements() ) { + String s = (String)enumVals.nextElement(); + printString( " " + s + + "" ); + } + } + return; + } + + printString( " " ); + + /* Loop on values for this attribute */ + Enumeration enumVals = attr.getByteValues(); + + if ( enumVals != null ) { + while ( enumVals.hasMoreElements() ) { + byte[] b = (byte[])enumVals.nextElement(); + String s; + if ( LDIF.isPrintable(b) ) { + try { + s = new String( b, "UTF8" ); + } catch ( UnsupportedEncodingException e ) { + s = ""; + } + printEscapedValue( " ", s, + "" ); + } else { + s = getPrintableValue( b ); + if ( s.length() > 0 ) { + printString( " " + + "" ); + printString( " " + s ); + printString( " " ); + } + } + } + } + printString( " " ); + } + + /** + * Print prologue to entry + * + * @param dn the DN of the entry + */ + protected void printEntryStart( String dn ) { + printString( " " ); + } + + /** + * Print epilogue to entry + * + * @param dn the DN of the entry + */ + protected void printEntryEnd( String dn ) { + printString( " " ); + } + + /** + * Print the element start, the value with escaping of special + * characters, and the element end + * + * @param prolog element start + * @param value value to be escaped + * @param epilog element end + */ + protected void printEscapedValue( String prolog, String value, + String epilog ) { + m_pw.print( prolog ); + int l = value.length(); + char[] text = new char[l]; + value.getChars( 0, l, text, 0 ); + for ( int i = 0; i < l; i++ ) { + char c = text[i]; + switch (c) { + case '<' : + m_pw.print( "<" ); + break; + case '&' : + m_pw.print( "&" ); + break; + default : + m_pw.print( c ); + } + } + m_pw.print( epilog); + m_pw.print( '\n' ); + } + + protected void printString( String value ) { + m_pw.print( value ); + m_pw.print( '\n' ); + } +} diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/GetOpt.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/GetOpt.java index 6da8dc3dff7..16ee5fd8617 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/GetOpt.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/GetOpt.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDAPWriter.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDAPWriter.java new file mode 100644 index 00000000000..f77e12c4012 --- /dev/null +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDAPWriter.java @@ -0,0 +1,114 @@ +/* -*- 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.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1999 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ +package netscape.ldap.util; + +import java.util.*; +import netscape.ldap.*; +import java.io.*; + +/** + * Abstract class for outputting LDAP entries to a stream. + * + * @version 1.0 + */ +public abstract class LDAPWriter implements Serializable { + +// static final long serialVersionUID = -2710382547996750924L; + protected PrintWriter m_pw; + private static MimeBase64Encoder m_encoder = new MimeBase64Encoder(); + + /** + * Constructs an LDAPWriter object to output entries + * to a stream. + * + * @param pw output stream + */ + public LDAPWriter( PrintWriter pw ) { + m_pw = pw; + } + + /** + * The main method of LDAPWriter. It calls printEntryIntro, + * printAttribute, and printEntryEnd of derived classes. + * + * @param entry an LDAPEntry to be formatted to the output + * stream + */ + public void printEntry( LDAPEntry entry ) throws IOException { + printEntryStart( entry.getDN() ); + /* Get the attributes of the entry */ + LDAPAttributeSet attrs = entry.getAttributeSet(); + Enumeration enumAttrs = attrs.getAttributes(); + /* Loop on attributes */ + while ( enumAttrs.hasMoreElements() ) { + LDAPAttribute anAttr = + (LDAPAttribute)enumAttrs.nextElement(); + printAttribute( anAttr ); + } + printEntryEnd( entry.getDN() ); + } + + /** + * Default schema writer - assumes an ordinary entry + * + * @param entry an LDAPEntry containing schema to be formatted + * to the output stream + */ + public void printSchema( LDAPEntry entry ) throws IOException { + printEntry( entry ); + } + + /** + * Print an attribute of an entry + * + * @param attr the attribute to format to the output stream + */ + protected abstract void printAttribute( LDAPAttribute attr ); + + /** + * Print prologue to entry + * + * @param dn the DN of the entry + */ + protected abstract void printEntryStart( String dn ); + + /** + * Print epilogue to entry + * + * @param dn the DN of the entry + */ + protected abstract void printEntryEnd( String dn ); + + protected String getPrintableValue( byte[] b ) { + String s = ""; + ByteBuf inBuf = new ByteBuf( b, 0, b.length ); + ByteBuf encodedBuf = new ByteBuf(); + // Translate to base 64 + m_encoder.translate( inBuf, encodedBuf ); + int nBytes = encodedBuf.length(); + if ( nBytes > 0 ) { + s = new String(encodedBuf.toBytes(), + 0, nBytes); + } + return s; + } +} diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDIFContent.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDIFContent.java index a56b1a5640e..512ff96fa4f 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDIFContent.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDIFContent.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDIFRecord.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDIFRecord.java index 5ddca9dbbee..bf068bf4bb8 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDIFRecord.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDIFRecord.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDIFWriter.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDIFWriter.java new file mode 100644 index 00000000000..75c3da8db80 --- /dev/null +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/LDIFWriter.java @@ -0,0 +1,179 @@ +/* -*- 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.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1999 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ +package netscape.ldap.util; + +import java.util.*; +import netscape.ldap.*; +import java.io.*; + +/** + * Class for outputting LDAP entries to a stream as LDIF. + * + * @version 1.0 + */ +public class LDIFWriter extends LDAPWriter { + +// static final long serialVersionUID = -2710382547996750924L; + private String m_sep; + private boolean m_foldLines; + private boolean m_attrsOnly; + private boolean m_toFiles; + private static final String DEFAULT_SEPARATOR = ":"; + private static final int MAX_LINE = 77; + + + /** + * Constructs an LDIFWriter object to output entries + * to a stream as LDIF. + * + * @param pw output stream + */ + public LDIFWriter( PrintWriter pw ) { + this( pw, false, DEFAULT_SEPARATOR, true, false ); + } + + /** + * Constructs an LDIFWriter object to output entries + * to a stream as LDIF. + * + * @param pw output stream + * @param attrsOnly true if only attribute names, not + * values, are to be printed + * @param separator String to use between attribute names and values; + * the default is ":" + * @param foldLines true to fold lines at 77 characters, + * false to not fold them; the default is true. + * @param toFiles true to write each attribute value to a + * file in the temp folder, false to write them to the + * output stream in printable format; the default is false. + */ + public LDIFWriter( PrintWriter pw, boolean attrsOnly, + String separator, boolean foldLines, + boolean toFiles ) { + super( pw ); + m_attrsOnly = attrsOnly; + m_sep = separator; + m_foldLines = foldLines; + m_toFiles = toFiles; + } + + /** + * Print an attribute of an entry + * + * @param attr the attribute to format to the output stream + */ + protected void printAttribute( LDAPAttribute attr ) { + String attrName = attr.getName(); + + if ( m_attrsOnly ) { + printString( attrName + m_sep ); + return; + } + + /* Loop on values for this attribute */ + Enumeration enumVals = attr.getByteValues(); + + if ( enumVals != null ) { + if ( m_toFiles ) { + try { + FileOutputStream f = getTempFile( attrName ); + f.write( (byte[])enumVals.nextElement() ); + } catch ( Exception e ) { + System.err.println( "Error writing values " + + "of " + attrName + ", " + + e.toString() ); + System.exit(1); + } + } else { + byte[] b = (byte[])enumVals.nextElement(); + String s; + if ( LDIF.isPrintable(b) ) { + try { + s = new String( b, "UTF8" ); + } catch ( UnsupportedEncodingException e ) { + s = ""; + } + printString( attrName + m_sep + " " + s ); + } else { + s = getPrintableValue( b ); + if ( s.length() > 0 ) { + printString( attrName + ":: " + s ); + } else { + printString( attrName + m_sep + ' ' ); + } + } + } + } else { + printString( attrName + m_sep + ' ' ); + } + } + + /** + * Print prologue to entry + * + * @param dn the DN of the entry + */ + protected void printEntryStart( String dn ) { + printString( "dn" + m_sep + " " + dn ); + } + + /** + * Print epilogue to entry + * + * @param dn the DN of the entry + */ + protected void printEntryEnd( String dn ) { + m_pw.println(); + } + + protected void printString( String value ) { + if ( m_foldLines ) { + LDIF.breakString( m_pw, value, MAX_LINE ); + } else { + m_pw.print( value ); + m_pw.print( '\n' ); + } + } + + /** + * Create a unique file name in the temp folder and open an + * output stream to the file + * + * @param name base name of file; an extension is appended which + * consists of a number that makes the name unique + * @return an open output stream to the file + * @exception IOException if the file couldn't be opened for output + */ + protected FileOutputStream getTempFile( String name ) + throws IOException { + int num = 0; + File f; + String filename; + do { + filename = name + '.' + num; + f = new File( filename ); + num++; + } while ( f.exists() ); + printString(name + m_sep + " " + filename); + return new FileOutputStream( f ); + } +} diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/MimeBase64Decoder.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/MimeBase64Decoder.java index 3215b4943f0..c4e01c73731 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/MimeBase64Decoder.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/MimeBase64Decoder.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/MimeBase64Encoder.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/MimeBase64Encoder.java index d274d46423d..be7f8920145 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/MimeBase64Encoder.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/MimeBase64Encoder.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/MimeEncoder.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/MimeEncoder.java index 99a56c8d98d..061e2a6265f 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/MimeEncoder.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/MimeEncoder.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/RDN.java b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/RDN.java index e80c323f751..2d5e59b405f 100644 --- a/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/RDN.java +++ b/mozilla/directory/java-sdk/ldapjdk/netscape/ldap/util/RDN.java @@ -21,7 +21,7 @@ */ package netscape.ldap.util; -import java.util.StringTokenizer; +import java.util.*; /** * Objects of this class represent the components of a distinguished @@ -50,31 +50,99 @@ public final class RDN implements java.io.Serializable { /** * List of RDNs. DN consists of one or more RDNs. */ - private String m_type = null; - private String m_value = null; + private String[] m_type = null; + private String[] m_value = null; + private boolean m_ismultivalued = false; + /** + * Hash table of case sensitive attributes + */ + private static Hashtable m_attributehash = new Hashtable(); + /** * Constructs a new RDN object from the specified * DN component. * @param rdn DN component */ - public RDN(String rdn) { - int index = rdn.indexOf("="); + public RDN( String rdn ) { + int index = rdn.indexOf( "=" ); + int next_plus; // if the rdn doesnt have = or = positions right at the beginning of the rdn if (index <= 0) return; - m_type = rdn.substring(0, index).trim(); - m_value = rdn.substring(index+1).trim(); - } + Vector values = new Vector(); + Vector types = new Vector(); + types.addElement( rdn.substring( 0, index ).trim() ); + next_plus = findNextMVSeparator( rdn, index ); + while ( next_plus != -1 ) { + m_ismultivalued = true; + values.addElement( rdn.substring( index + 1, next_plus - 1 ).trim() ); + index = rdn.indexOf( "=", next_plus + 1 ); + if ( index == -1 ) { + // malformed RDN? + return; + } + types.addElement( rdn.substring( next_plus + 1, index ).trim() ); + next_plus = findNextMVSeparator( rdn, index ); + } + values.addElement( rdn.substring( index + 1 ).trim() ); + + m_type = new String[types.size()]; + m_value = new String[values.size()]; + + for( int i = 0; i < types.size(); i++ ) { + m_type[i] = (String)types.elementAt( i ); + m_value[i] = (String)values.elementAt( i ); + } + } + + /* find the next '+' that isn't escaped or in quotes */ + int findNextMVSeparator( String str, int offset ) { + int next_plus = str.indexOf( '+', offset ); + int next_open_q = str.indexOf( '"', offset ); + int next_close_q = -1; + + if ( next_plus == offset ) { + return offset; + } + + if ( next_open_q > -1 ) { + next_close_q = str.indexOf( '"', next_open_q + 1 ); + } + + while ( next_plus != -1 ) { + if ( str.charAt( next_plus - 1 ) != '\\' && + !( next_open_q < next_plus && next_plus < next_close_q ) ) { + return next_plus; + } + + next_plus = str.indexOf( '+', next_plus + 1 ); + if ( next_open_q > -1 && next_close_q > -1 ) { + if ( next_close_q < next_plus ) { + next_open_q = str.indexOf( '"', next_close_q + 1 ); + } + } else { + next_open_q = -1; + } + + next_close_q = next_open_q > -1 ? str.indexOf( '"', next_open_q + 1 ) + : -1; + } + + return -1; + + } + /** * Returns the DN component as the first element in an * array of strings. * @param noType specify true to ignore the attribute type and * equals sign (for example, "cn=") and return only the value * @return an array of strings representing the DN component. + * @deprecated use toString or getValues instead. */ public String[] explodeRDN(boolean noType) { if (m_type == null) @@ -91,45 +159,250 @@ public final class RDN implements java.io.Serializable { /** * Returns the attribute type of the DN component. * @return rdn the attribute type of the DN component. + * @deprecated use getTypes() instead. */ public String getType() { + return m_type[0]; + } + + /** + * Returns the attribute types of the DN component. + * @return rdn the attribute types of the DN component. + */ + public String[] getTypes() { return m_type; } /** * Returns the value of the DN component. * @return rdn the value of the DN component. + * @deprecated use getValues() instead. */ public String getValue() { + return m_value[0]; + } + + /** + * Returns the values of the DN component. + * @return rdn the values of the DN component. + */ + public String[] getValues() { return m_value; } + /** + * Returns true if the RDN is multi-valued. + * @return true if the RDN is multi-valued. + */ + public boolean isMultivalued() { + return m_ismultivalued; + } + /** * Returns the string representation of the DN component. * @return the string representation of the DN component. */ public String toString() { - return m_type + "=" + m_value; + StringBuffer buf = new StringBuffer( m_type[0] + "=" + m_value[0] ); + + for ( int i = 1; i < m_type.length; i++ ) { + buf.append( " + " + m_type[i] + "=" + m_value[i] ); + } + + return buf.toString(); } /** - * Determines if the specified string is an distinguished name component. + * Determines if the specified string is a distinguished name component. * @param dn the string to check * @return true if the string is a distinguished name component. */ public static boolean isRDN(String rdn) { RDN newrdn = new RDN(rdn); - return ((newrdn.getType() != null) && (newrdn.getValue() != null)); + return ((newrdn.getTypes() != null) && (newrdn.getValues() != null)); } /** * Determines if the current DN component is equal to the specified - * DN component. + * DN component. Uses an internal table of ces (case exact string) + * attributes to determine how the attributes should be compared. * @param rdn the DN component to compare against the * current DN component. * @return true if the two DN components are equal. + * @see netscape.ldap.util.RDN#registerCesAttribute + * @see netscape.ldap.util.RDN#cesAttributeIsRegistered + * @see netscape.ldap.util.RDN#getRegisteredCesAttributes */ public boolean equals(RDN rdn) { - return(toString().toUpperCase().equals(rdn.toString().toUpperCase())); + String[] this_types = (String[])getTypes().clone(); + String[] this_values = (String[])getValues().clone(); + String[] rdn_types = (String[])rdn.getTypes().clone(); + String[] rdn_values = (String[])rdn.getValues().clone(); + + if ( this_types.length != rdn_types.length ) { + return false; + } + + sortTypesAndValues( this_types, this_values ); + sortTypesAndValues( rdn_types, rdn_values ); + + for (int i = 0; i < this_types.length; i++ ) { + + if ( !this_types[i].equalsIgnoreCase( rdn_types[i] ) ) { + return false; + } + + if ( CES_SYNTAX.equals( getAttributeSyntax( this_types[i] ) ) ) { + if ( !this_values[i].equals( rdn_values[i] ) ) { + return false; + } + } else { + if ( !this_values[i].equalsIgnoreCase( rdn_values[i] ) ) { + return false; + } + } + } + + return true; + } + + + /* sorts the rdn components by attribute to make comparison easier */ + void sortTypesAndValues( String[] types, String[] values ) { + boolean no_changes; + do { + no_changes = true; + for ( int i = 0; i < types.length - 1; i++ ) { + if ( types[i].toLowerCase().compareTo( types[i + 1].toLowerCase() ) > 0 ) { + String tmp_type = types[i]; + String tmp_value = values[i]; + types[i] = types[i + 1]; + values[i] = values[i + 1]; + types[i + 1] = tmp_type; + values[i + 1] = tmp_value; + no_changes = false; + } + } + } while ( no_changes = false ); + } + + /** + * Registers the the given attribute for the given syntax in an + * internal table. This table is used for attribute comparison in the + * equals() method. + * @param attr the attribute to register. + * @param oid the syntax to register with the attribute. + * @see netscape.ldap.util.RDN#equals + * @see netscape.ldap.util.RDN#unregisterAttributeSyntax + * @see netscape.ldap.util.RDN#getAttributeSyntax + * @see netscape.ldap.util.RDN#getAttributesForSyntax + */ + public static void registerAttributeSyntax( String attr, String oid ) { + m_attributehash.put( attr.toLowerCase(), oid ); + } + + /** + * Removes the the given attribute from the attribute syntax table. + * @param attr the attribute to remove. + * @see netscape.ldap.util.RDN#registerAttributeSyntax + * @see netscape.ldap.util.RDN#getAttributeSyntax + * @see netscape.ldap.util.RDN#getAttributesForSyntax + */ + public static void unregisterAttributeSyntax( String attr ) { + m_attributehash.remove( attr.toLowerCase() ); + } + + /** + * Returns the syntax for the attribute if the given attribute is registered + * in the internal attribute table. + * @param attr the attribute to lookup in the table. + * @returns the syntax of the attribute if found, null otherwise. + * @see netscape.ldap.util.RDN#unregisterAttributeSyntax + * @see netscape.ldap.util.RDN#registerAttributeSyntax + * @see netscape.ldap.util.RDN#getAttributesForSyntax + */ + public static String getAttributeSyntax( String attr ) { + return (String)m_attributehash.get( attr.toLowerCase() ); + } + + /** + * Returns all attributes registered for the given syntax as a + * String Array. + * @param oid the syntax to look up in the table. + * @return all attributes for the given syntax as a String[] + * @see netscape.ldap.util.RDN#unregisterAttributeSyntax + * @see netscape.ldap.util.RDN#registerAttributeSyntax + * @see netscape.ldap.util.RDN#getAttributeSyntax + */ + public static String[] getAttributesForSyntax( String oid ) { + Enumeration enum = m_attributehash.keys(); + Vector key_v = new Vector(); + String tmp_str = null; + + while ( enum.hasMoreElements() ) { + tmp_str = (String)enum.nextElement(); + if ( oid.equals( (String)m_attributehash.get( tmp_str ) ) ) { + key_v.addElement( tmp_str ); + } + } + + String[] str = new String[key_v.size()]; + for ( int i = 0; i < str.length; i++ ) { + str[i] = new String( (String)key_v.elementAt( i ) ); + } + + return str; + } + + public static final String[] _cesAttributes = { + "adminurl", + "altserver", + "automountinformation", + "bootfile", + "bootparameter", + "cirbindcredentials", + "generation", + "homedirectory", + "internationalisdnnumber", + "labeleduri", + "membercertificatedescription", + "membernisnetgroup", + "memberuid", + "memberurl", + "nismapentry", + "nisnetgrouptriple", + "nsaddressbooksyncurl", + "presentationaddress", + "ref", + "replicaentryfilter", + "searchguide", + "subtreeaci", + "vlvfilter", + "vlvname", + "x121address" + }; + + public static final String CES_SYNTAX = "1.3.6.1.4.1.1466.115.121.1.26"; + + static { + /* static initializer to fill the ces attribute hash + * this list was generated from the slapd.at.conf that + * ships with Netscape Directory Server 4.1 + */ + for ( int i = 0; i < _cesAttributes.length; i++ ) { + registerAttributeSyntax( _cesAttributes[i], CES_SYNTAX ); + } } } + + + + + + + + + + + + diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/ContextEnv.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/ContextEnv.java index efe7272280d..cf58e5abe62 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/ContextEnv.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/ContextEnv.java @@ -73,6 +73,8 @@ class ContextEnv extends ShareableEnv { private static final String SASL_PROP_PREFIX = "javax.security.sasl"; + public static final String P_TRACE = LDAPConnection.TRACE_PROPERTY; + // Possible values for the Context.REFERRAL env property private static final String V_REFERRAL_FOLLOW = "follow"; private static final String V_REFERRAL_IGNORE = "ignore"; diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/EventService.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/EventService.java index 907b2f92805..abc63f475fa 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/EventService.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/EventService.java @@ -108,7 +108,7 @@ class EventService implements Runnable{ Debug.println(1, "Do persistent search for " + base); sl = ld.search( base, scope, filter, attrs, false, /*l=*/null, cons); - int[] ids = sl.getIDs(); + int[] ids = sl.getMessageIDs(); int id = ids[ids.length-1]; event = new EventEntry(id, ctx, base, scope, filter, attrs, cons); m_eventList.addElement(event); @@ -213,14 +213,14 @@ class EventService implements Runnable{ synchronized (EventService.this) { - EventEntry eventEntry = getEventEntry(msg.getID()); + EventEntry eventEntry = getEventEntry(msg.getMessageID()); // If no listeners, abandon this message id if (eventEntry == null) { - Debug.println(1, "Received ldap msg with unknown id="+msg.getID()); + Debug.println(1, "Received ldap msg with unknown id="+msg.getMessageID()); if (! (msg instanceof LDAPResponse)) { - abandonRequest(msg.getID()); + abandonRequest(msg.getMessageID()); } continue; } diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/LdapContextFactory.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/LdapContextFactory.java index 3317ce8f9f7..20fc62f2a82 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/LdapContextFactory.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/LdapContextFactory.java @@ -37,7 +37,8 @@ public class LdapContextFactory implements InitialContextFactory { // present in the env (env has precedence over the System properties) for (Enumeration e = System.getProperties().keys(); e.hasMoreElements();) { String key = (String) e.nextElement(); - if (key.startsWith("java.naming.")) { + if (key.startsWith("java.naming.")|| + key.startsWith("com.netscape.")) { if (ctxEnv.get(key) == null) { ctxEnv.put(key,System.getProperty(key)); } diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/LdapContextImpl.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/LdapContextImpl.java index 2d62567912e..97cad0c8bc3 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/LdapContextImpl.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/LdapContextImpl.java @@ -199,10 +199,16 @@ public class LdapContextImpl implements EventDirContext, LdapContext { } public Object addToEnvironment(String propName, Object propValue) throws NamingException { + if (propName.equalsIgnoreCase(m_ctxEnv.P_TRACE)) { + m_ldapSvc.setTraceOutput(propValue); + } return m_ctxEnv.updateProperty(propName, propValue, getSearchConstraints()); } public Object removeFromEnvironment(String propName) throws NamingException { + if (propName.equalsIgnoreCase(m_ctxEnv.P_TRACE)) { + m_ldapSvc.setTraceOutput(null); + } return m_ctxEnv.removeProperty(propName); } diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/LdapService.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/LdapService.java index 191955e0fcb..f21ca32f28b 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/LdapService.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/LdapService.java @@ -26,6 +26,7 @@ import javax.naming.directory.*; import javax.naming.ldap.*; import netscape.ldap.*; import java.util.*; +import java.io.*; import com.netscape.jndi.ldap.common.*; import com.netscape.jndi.ldap.schema.SchemaRoot; @@ -91,6 +92,7 @@ class LdapService { boolean isSSLEnabled = ctx.m_ctxEnv.isSSLEnabled(); String[] saslMechanisms = ctx.m_ctxEnv.getSaslMechanisms(); LDAPControl[] ldCtrls= ctx.m_ctxEnv.getConnectControls(); + Object traceOut = ctx.m_ctxEnv.getProperty(ContextEnv.P_TRACE); // Set default ssl port if DS not specifed if (isSSLEnabled && url == null) { @@ -122,6 +124,11 @@ class LdapService { "Illegal value for java.naming.ldap.factory.socket: " + e); } } + + // Enable tracing + if (traceOut != null) { + setTraceOutput(traceOut); + } try { if (ldCtrls != null) { @@ -540,4 +547,20 @@ class LdapService { } return m_eventSvc; } + + /** + * Enable/Disable ldap message trace. + * @param out Trace output or null (disable trace). Output can + * be specified as a file name or a java OutputStream. If an + * empty string is specified, the output is sent to System.err. + * A file name prefixed with a '+' will open the file in append mode. + */ + void setTraceOutput(Object out) throws NamingException { + try { + m_ld.setProperty(m_ld.TRACE_PROPERTY, out); + } + catch (Exception e) { + throw new IllegalArgumentException("Can not open trace output " + e); + } + } } diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/ObjectMapper.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/ObjectMapper.java index 483ebb0a711..07c32237f0d 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/ObjectMapper.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/ObjectMapper.java @@ -1,3 +1,25 @@ +/* -*- 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.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1999 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + package com.netscape.jndi.ldap; import javax.naming.*; diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapPasswordExpiredControl.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapPasswordExpiredControl.java index d60ca01ab36..3ed74639ac6 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapPasswordExpiredControl.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapPasswordExpiredControl.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapPasswordExpiringControl.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapPasswordExpiringControl.java index 3efe822618f..4c24b35ec81 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapPasswordExpiringControl.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapPasswordExpiringControl.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapSortControl.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapSortControl.java index bd5e14579b4..f7c4d498852 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapSortControl.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapSortControl.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): @@ -45,8 +45,8 @@ import netscape.ldap.controls.*; * the result of the sorting operation. (The OID for this control * is 1.2.840.113556.1.4.474.) * - * @see com.netscape.jndi.ldap.LdapSortKey - * @see com.netscape.jndi.ldap.LdapSortResponseControl + * @see com.netscape.jndi.ldap.controls.LdapSortKey + * @see com.netscape.jndi.ldap.controls.LdapSortResponseControl */ public class LdapSortControl extends LDAPSortControl implements Control{ /** @@ -56,7 +56,7 @@ public class LdapSortControl extends LDAPSortControl implements Control{ * @param critical true if the LDAP operation should be * discarded when the server does not support this control (in other * words, this control is critical to the LDAP operation). - * @see com.netscape.jndi.ldap.LdapSortKey + * @see com.netscape.jndi.ldap.controls.LdapSortKey */ public LdapSortControl(LdapSortKey key, boolean critical) { @@ -70,7 +70,7 @@ public class LdapSortControl extends LDAPSortControl implements Control{ * @param critical true if the LDAP operation should be * discarded when the server does not support this control (in other * words, this control is critical to the LDAP operation). - * @see com.netscape.jndi.ldap.LdapSortKey + * @see com.netscape.jndi.ldap.controls.LdapSortKey */ public LdapSortControl(LdapSortKey[] keys, boolean critical) { @@ -93,7 +93,7 @@ public class LdapSortControl extends LDAPSortControl implements Control{ * @param critical true if the LDAP operation should be * discarded when the server does not support this control (in other * words, this control is critical to the LDAP operation). - * @see com.netscape.jndi.ldap.LdapSortKey + * @see com.netscape.jndi.ldap.controls.LdapSortKey */ public LdapSortControl(String[] keys, boolean critical) { diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapSortResponseControl.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapSortResponseControl.java index 40f51f8c0fc..51bd0e63397 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapSortResponseControl.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapSortResponseControl.java @@ -157,8 +157,8 @@ import com.netscape.jndi.ldap.common.ExceptionMapper; * * *

- * @see com.netscape.jndi.ldap.LdapSortKey - * @see com.netscape.jndi.ldap.LdapSortControl + * @see com.netscape.jndi.ldap.controls.LdapSortKey + * @see com.netscape.jndi.ldap.controls.LdapSortControl */ public class LdapSortResponseControl extends LDAPSortControl implements Control { diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapStringControl.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapStringControl.java deleted file mode 100644 index 8b137891791..00000000000 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapStringControl.java +++ /dev/null @@ -1 +0,0 @@ - diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapVirtualListControl.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapVirtualListControl.java index 3184d755347..5b8d5b3c858 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapVirtualListControl.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/controls/LdapVirtualListControl.java @@ -14,7 +14,7 @@ * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All + * Copyright (C) 1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/schema/SchemaAttribute.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/schema/SchemaAttribute.java index 796d6a8720e..36b7540104c 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/schema/SchemaAttribute.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/schema/SchemaAttribute.java @@ -145,7 +145,7 @@ public class SchemaAttribute extends SchemaElement { String val = null, multiVal[]=null; for (int i = 0; i < attrIds.length; i++) { if (attrIds[i].equals(NUMERICOID)) { - val = m_ldapAttribute.getOID(); + val = m_ldapAttribute.getID(); if (val != null) { attrs.put(new BasicAttribute(NUMERICOID, val)); } diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/schema/SchemaMatchingRule.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/schema/SchemaMatchingRule.java index bf2a82aef28..7644410f527 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/schema/SchemaMatchingRule.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/schema/SchemaMatchingRule.java @@ -107,7 +107,7 @@ public class SchemaMatchingRule extends SchemaElement { String val = null; for (int i = 0; i < attrIds.length; i++) { if (attrIds[i].equals(NUMERICOID)) { - val = m_ldapMatchingRule.getOID(); + val = m_ldapMatchingRule.getID(); if (val != null) { attrs.put(new BasicAttribute(NUMERICOID, val)); } diff --git a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/schema/SchemaObjectClass.java b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/schema/SchemaObjectClass.java index ec6bf80544a..f7faf21be5d 100644 --- a/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/schema/SchemaObjectClass.java +++ b/mozilla/directory/java-sdk/ldapsp/com/netscape/jndi/ldap/schema/SchemaObjectClass.java @@ -129,7 +129,7 @@ public class SchemaObjectClass extends SchemaElement { String val = null, multiVal[]=null; for (int i = 0; i < attrIds.length; i++) { if (attrIds[i].equals(NUMERICOID)) { - val = m_ldapObjectClass.getOID(); + val = m_ldapObjectClass.getID(); if (val != null) { attrs.put(new BasicAttribute(NUMERICOID, val)); } diff --git a/mozilla/directory/java-sdk/ldapsp/lib/jndi.jar b/mozilla/directory/java-sdk/ldapsp/lib/jndi.jar index 3e331266bc9a73d8c745a8783031971e581e50f1..52baa1cf8ccc481b12068783d1a28b0043a7795f 100644 GIT binary patch delta 48954 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

HAtZ&rVd9Ls0=|;v>bgsTJe(^|$T7zqF@6 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%0A}3oFsSGF> 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 * usage : java LDAPModify [options] - * example : java LDAPModify -w "password" -h ldap.netscape.com -p 389 - * -f modify.cfg + * example : java LDAPModify -D "uid=johnj,ou=People,o=Airius.com" + * -w "password" -h ldap.netscape.com -p 389 + * -f modify.cfg * * options: {np = no parameters, p = requires parameters} * 'D' bind DN --------------------------------------------- p + * 'w' bind password --------------------------------------- p * 'f' input file ------------------------------------------ p * 'h' LDAP host ------------------------------------------- p * 'p' LDAP port ------------------------------------------- p - * 'n' override DN to modify ------------------------------- p - * 'w' bind password --------------------------------------- p * 'e' record rejected records in a text file -------------- p - * 'c' continuous, do not stop on error - * 'a' add, if no operation is specified - * 'r' replace, if no operation is specified - * 'b' binary, read values starting with / from a file + * 'c' continuous, do not stop on error ------------------- np + * 'a' add, if no operation is specified ------------------ np + * 'r' replace, if no operation is specified -------------- np + * 'b' binary, read values starting with / from a file ---- np + * 'd' debugging level ------------------------------------- p + * 'V' version, specify LDAP protocol version (2 or 3) ----- p + * 'R' do not follow referrals ---------------------------- np + * 'O' hop limit ------------------------------------------- p + * 'H' help, display usage--------------------------------- np + * 'M' manage referrals, do not follow them --------------- np + * 'n' show what would be done but do not do it ----------- np + * 'v' verbose mode --------------------------------------- np + * 'e' reject file, where to list rejected records --------- p + * 'y' proxy DN, DN to use for access control -------------- p * - * note: '-' or '/' is used to distinct the option field. + * note: '-' or '/' is used to mark an option field. * e.g. -a -b /c /d parameter -e parameter * * @@ -49,340 +74,369 @@ public class LDAPModify extends LDAPTool { /* LDAPModify */ public static void main(String args[]) { /* main */ - /* extract parameters from the arguments list */ - extractParameters(args); + /* extract parameters from the arguments list */ + extractParameters(args); - /* perform an LDAP client connection operation */ - try { - if (!m_justShow) { - m_client = new LDAPConnection(); - m_client.connect( m_ldaphost, m_ldapport ); - } - } catch(Exception e) { - System.err.println("Error: client connection failed!"); - System.exit(0); - } + /* perform an LDAP client connection operation */ + try { + if (!m_justShow) { + m_client = new LDAPConnection(); + m_client.connect( m_ldaphost, m_ldapport ); + } + } catch(Exception e) { + System.err.println("Error: client connection failed!"); + System.exit(0); + } - /* perform an LDAP bind operation */ - try { - if (!m_justShow) - m_client.authenticate( m_version, m_binddn, m_passwd ); - } catch (Exception e) { - System.err.println( e.toString() ); - System.exit(0); - } + /* perform an LDAP bind operation */ + try { + if (!m_justShow) + m_client.authenticate( m_version, m_binddn, m_passwd ); + } catch (Exception e) { + System.err.println( e.toString() ); + System.exit(0); + } - try { - if ( m_file != null ) - m_ldif = new LDIF(m_file); - else { - m_ldif = new LDIF(); + try { + if ( m_file != null ) + m_ldif = new LDIF(m_file); + else { + m_ldif = new LDIF(); } - } catch (Exception e) { - if ( m_file == null ) - m_file = "stdin"; - System.err.println("Failed to read LDIF file " + m_file + - ", " + e.toString()); - System.exit(0); - } + } catch (Exception e) { + if ( m_file == null ) + m_file = "stdin"; + System.err.println("Failed to read LDIF file " + m_file + + ", " + e.toString()); + System.exit(0); + } - /* performs a JDAP Modify operation */ - try { - doModify(); - } catch (Exception e) { - System.err.println( e.toString() ); - } + /* performs a JDAP Modify operation */ + try { + doModify(); + } catch (Exception e) { + System.err.println( e.toString() ); + } - /* disconnect */ - try { - if (!m_justShow) - m_client.disconnect(); - } catch (Exception e) { - System.err.println( e.toString() ); - } - System.exit(0); - } /* main */ + /* disconnect */ + try { + if (!m_justShow) + m_client.disconnect(); + } catch (Exception e) { + System.err.println( e.toString() ); + } + System.exit(0); + } /* main */ - /** - * Prints usage. - */ + /** + * Prints usage. + */ private static void doUsage() { - System.err.println( "usage: LDAPModify [options]" ); - System.err.println("options"); - System.err.println(" -h host LDAP server name or IP address"); - System.err.println(" -p port LDAP server TCP port number"); - System.err.println(" -V version LDAP protocol version " + - "number (default is 3)"); - System.err.println(" -D binddn bind dn"); - System.err.println(" -w password bind passwd (for simple " + - "authentication)"); - System.err.println(" -d level set LDAP debugging level " + - "to \'level\'"); - System.err.println(" -R do not automatically follow " + - "referrals"); - System.err.println(" -O hop limit maximum number of referral " + - "hops to traverse"); - System.err.println(" -H display usage information"); - System.err.println(" -c continuous mode (do not " + - "stop on errors)"); - System.err.println(" -M manage references (treat them " + - "as regular entries)"); - System.err.println(" -f file read modifications from " + - "file instead of standard input"); - System.err.println(" -a add entries"); - System.err.println(" -b read values that start with " + - "/ from files (for bin attrs)"); - System.err.println(" -n show what would be done but " + - "don\'t actually do it"); - System.err.println(" -v run in verbose mode"); - System.err.println(" -r replace existing values by " + - "default"); - System.err.println(" -e rejectfile save rejected entries in " + - "\'rejfile\'"); - System.err.println(" -y proxy-DN DN to use for access control"); - } + System.err.println( "usage: LDAPModify [options]" ); + System.err.println("options"); + System.err.println(" -h host LDAP server name or IP address"); + System.err.println(" -p port LDAP server TCP port number"); + System.err.println(" -V version LDAP protocol version " + + "number (default is 3)"); + System.err.println(" -D binddn bind dn"); + System.err.println(" -w password bind passwd (for simple " + + "authentication)"); + System.err.println(" -d level set LDAP debugging level " + + "to \'level\'"); + System.err.println(" -R do not automatically follow " + + "referrals"); + System.err.println(" -O hop limit maximum number of referral " + + "hops to traverse"); + System.err.println(" -H display usage information"); + System.err.println(" -c continuous mode (do not " + + "stop on errors)"); + System.err.println(" -M manage references (treat them " + + "as regular entries)"); + System.err.println(" -f file read modifications from " + + "file instead of standard input"); + System.err.println(" -a add entries"); + System.err.println(" -b read values that start with " + + "/ from files (for bin attrs)"); + System.err.println(" -n show what would be done but " + + "don\'t actually do it"); + System.err.println(" -v run in verbose mode"); + System.err.println(" -r replace existing values by " + + "default"); + System.err.println(" -e rejectfile save rejected entries in " + + "\'rejfile\'"); + System.err.println(" -y proxy-DN DN to use for access control"); + } - /** - * This class-method is used to extract specified parameters from the - * arguments list. - */ + /** + * This class-method is used to extract specified parameters from the + * arguments list. + */ /* extract parameters */ protected static void extractParameters(String args[]) { - String privateOpts = "abcHFre:f:"; + String privateOpts = "abcHFre:f:"; - GetOpt options = LDAPTool.extractParameters( privateOpts, args ); + GetOpt options = LDAPTool.extractParameters( privateOpts, args ); - /* -H Help */ - if (options.hasOption('H')) { - doUsage(); - System.exit(0); - } /* Help */ + /* -H Help */ + if (options.hasOption('H')) { + doUsage(); + System.exit(0); + } /* Help */ - if (options.hasOption('F')) - m_force = true; + if (options.hasOption('F')) + m_force = true; - if (options.hasOption('a')) - m_add = true; + if (options.hasOption('a')) + m_add = true; - if (options.hasOption('c')) - m_continuous = true; + if (options.hasOption('c')) + m_continuous = true; - if (options.hasOption('r')) - m_add = false; + if (options.hasOption('r')) + m_add = false; - if (options.hasOption('b')) - m_binaryFiles = true; + if (options.hasOption('b')) + m_binaryFiles = true; - /* -f input file */ - if(options.hasOption('f')) { /* Is input file */ - m_file = (String)options.getOptionParam('f'); - } /* End Is input file */ + /* -f input file */ + if(options.hasOption('f')) { /* Is input file */ + m_file = (String)options.getOptionParam('f'); + } /* End Is input file */ - /* -e rejects file */ - if(options.hasOption('e')) { /* rejects file */ - m_rejectsFile = (String)options.getOptionParam('e'); - } /* End rejects file */ + /* -e rejects file */ + if(options.hasOption('e')) { /* rejects file */ + m_rejectsFile = (String)options.getOptionParam('e'); + } /* End rejects file */ - } /* extract parameters */ + } /* extract parameters */ - /** - * Call the LDAPConnection modify operation with the - * specified options, and/or parameters. - */ + /** + * Call the LDAPConnection modify operation with the + * specified options, and/or parameters. + */ private static void doModify() throws IOException { /* doModify */ - 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) { - 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 ) { - setDefaultReferralCredentials( cons ); - } - cons.setHopLimit( m_hopLimit ); - } + PrintWriter reject = null; + LDAPConstraints baseCons = null; + if (!m_justShow) { + baseCons = m_client.getConstraints(); + Vector controlVector = new Vector(); + if (m_proxyControl != null) + controlVector.addElement(m_proxyControl); + if (m_ordinary) { + controlVector.addElement( new LDAPControl( + LDAPControl.MANAGEDSAIT, true, null) ); + } + if (controlVector.size() > 0) { + LDAPControl[] controls = new LDAPControl[controlVector.size()]; + controlVector.copyInto(controls); + baseCons.setServerControls(controls); + } + baseCons.setReferrals( m_referrals ); + if ( m_referrals ) { + setDefaultReferralCredentials( baseCons ); + } + baseCons.setHopLimit( m_hopLimit ); + } - LDIFRecord rec = m_ldif.nextRecord(); + LDIFRecord rec = m_ldif.nextRecord(); - for (; rec != null; rec = m_ldif.nextRecord() ) { - LDIFContent content = rec.getContent(); - LDAPModification mods[] = null; - LDAPAttribute addAttrs[] = null; - boolean doDelete = false; - boolean doModDN = false; - LDAPEntry newEntry = null; + for (; rec != null; rec = m_ldif.nextRecord() ) { + LDAPConstraints cons = baseCons; + if (!m_justShow) { + // Were there any controls specified in the LDIF + // record? + LDAPControl[] newControls = rec.getControls(); + if ( newControls != null ) { + LDAPControl[] controls = newControls; + LDAPControl[] oldControls = baseCons.getServerControls(); + if ( oldControls != null ) { + // If there were already controls defined, merge in + // the new ones + controls = + new LDAPControl[oldControls.length + + newControls.length]; + for( int i = 0; i < oldControls.length; i++ ) { + controls[i] = oldControls[i]; + } + for( int i = 0; i < newControls.length; i++ ) { + controls[i+oldControls.length] = newControls[i]; + } + } + // Assign the merged controls to a copy of the constraints + cons = (LDAPSearchConstraints)baseCons.clone(); + cons.setServerControls( controls ); + } + } - /* What type of record is this? */ - if ( content instanceof LDIFModifyContent ) { - mods = ((LDIFModifyContent)content).getModifications(); - } else if ( content instanceof LDIFAddContent ) { - addAttrs = ((LDIFAddContent)content).getAttributes(); - } else if ( content instanceof LDIFAttributeContent ) { - /* No change type; decide what to do based on options */ - if ( m_add ) - addAttrs = - ((LDIFAttributeContent)content).getAttributes(); - else { - LDAPAttribute[] tmpAttrs = - ((LDIFAttributeContent)content).getAttributes(); - mods = new LDAPModification[tmpAttrs.length]; - for( int ta = 0; ta < tmpAttrs.length; ta++ ) { - mods[ta] = new LDAPModification( - LDAPModification.REPLACE, tmpAttrs[ta] ); - } - } - } else if ( content instanceof LDIFDeleteContent ) { - doDelete = true; - } else if (content instanceof LDIFModDNContent ) { - doModDN = true; - } else { - } + LDIFContent content = rec.getContent(); + LDAPModification mods[] = null; + LDAPAttribute addAttrs[] = null; + boolean doDelete = false; + boolean doModDN = false; + LDAPEntry newEntry = null; - /* Prepare for adding */ - if ( addAttrs != null ) { - LDAPAttributeSet newAttrSet = new LDAPAttributeSet(); - for( int a = 0; a < addAttrs.length; a++ ) - newAttrSet.add( addAttrs[a] ); - newEntry = new LDAPEntry( rec.getDN(), newAttrSet ); - } + /* What type of record is this? */ + if ( content instanceof LDIFModifyContent ) { + mods = ((LDIFModifyContent)content).getModifications(); + } else if ( content instanceof LDIFAddContent ) { + addAttrs = ((LDIFAddContent)content).getAttributes(); + } else if ( content instanceof LDIFAttributeContent ) { + /* No change type; decide what to do based on options */ + if ( m_add ) { + addAttrs = + ((LDIFAttributeContent)content).getAttributes(); + } else { + LDAPAttribute[] tmpAttrs = + ((LDIFAttributeContent)content).getAttributes(); + mods = new LDAPModification[tmpAttrs.length]; + for( int ta = 0; ta < tmpAttrs.length; ta++ ) { + mods[ta] = new LDAPModification( + LDAPModification.REPLACE, tmpAttrs[ta] ); + } + } + } else if ( content instanceof LDIFDeleteContent ) { + doDelete = true; + } else if (content instanceof LDIFModDNContent ) { + doModDN = true; + } else { + } - /* Get values from files? */ - boolean skip = false; - if ( m_binaryFiles ) { - /* Check each value of each attribute, to see if it - needs replacing with the contents of a file */ - if ( mods != null ) { - for( int m = 0; m < mods.length; m++ ) { - LDAPModification mod = mods[m]; - LDAPAttribute attr = mods[m].getAttribute(); + /* Prepare for adding */ + if ( addAttrs != null ) { + LDAPAttributeSet newAttrSet = new LDAPAttributeSet(); + for( int a = 0; a < addAttrs.length; a++ ) + newAttrSet.add( addAttrs[a] ); + newEntry = new LDAPEntry( rec.getDN(), newAttrSet ); + } - LDAPAttribute newAttr = checkFiles( attr ); - if ( newAttr == null ) - skip = true; - else - mods[m] = new LDAPModification( - mod.getOp(), newAttr ); - } - } else if ( addAttrs != null ) { - LDAPAttributeSet newAttrSet = new LDAPAttributeSet(); - for( int a = 0; a < addAttrs.length; a++ ) { - LDAPAttribute attr = addAttrs[a]; + /* Get values from files? */ + boolean skip = false; + if ( m_binaryFiles ) { + /* Check each value of each attribute, to see if it + needs replacing with the contents of a file */ + if ( mods != null ) { + for( int m = 0; m < mods.length; m++ ) { + LDAPModification mod = mods[m]; + LDAPAttribute attr = mods[m].getAttribute(); - LDAPAttribute newAttr = checkFiles( attr ); - if ( newAttr == null ) { - skip = true; - break; - } else { - newAttrSet.add( newAttr ); - } - } - if ( !skip ) { - newEntry = new LDAPEntry( rec.getDN(), newAttrSet ); - } - } - } + LDAPAttribute newAttr = checkFiles( attr ); + if ( newAttr == null ) + skip = true; + else + mods[m] = new LDAPModification( + mod.getOp(), newAttr ); + } + } else if ( addAttrs != null ) { + LDAPAttributeSet newAttrSet = new LDAPAttributeSet(); + for( int a = 0; a < addAttrs.length; a++ ) { + LDAPAttribute attr = addAttrs[a]; - /* Do the directory operation */ - int errCode = 0; - if ( !skip ) { - try { - if ( mods != null ) { - LDAPModificationSet modSet = - new LDAPModificationSet(); - System.out.println("\nmodifying entry "+rec.getDN() ); - for( int m = 0; m < mods.length; m++ ) { - if (m_verbose) - System.out.println("\t"+mods[m] ); - modSet.add( mods[m].getOp(), - mods[m].getAttribute() ); - } + LDAPAttribute newAttr = checkFiles( attr ); + if ( newAttr == null ) { + skip = true; + break; + } else { + newAttrSet.add( newAttr ); + } + } + if ( !skip ) { + newEntry = new LDAPEntry( rec.getDN(), newAttrSet ); + } + } + } - if (!m_justShow) - m_client.modify( rec.getDN(), modSet, cons ); - } else if ( newEntry != null ) { - System.out.println( "\nadding new entry " + newEntry.getDN() ); - if ( m_verbose ) { - LDAPAttributeSet set = newEntry.getAttributeSet(); - for( int a = 0; a < set.size(); a++ ) { - System.out.println("\t"+set.elementAt(a) ); - } - } - if (!m_justShow) - m_client.add( newEntry, cons ); - } else if ( doDelete ) { - System.out.println( "\ndeleting entry " + rec.getDN() ); - if (!m_justShow) - m_client.delete( rec.getDN(), cons ); - } else if ( doModDN) { - System.out.println( "\nmodifying RDN of entry " + - rec.getDN()+" and/or moving it beneath a new parent"); - if ( m_verbose ) { - System.out.println( "\t"+content.toString()); - } - if (!m_justShow) { - LDIFModDNContent moddnContent = (LDIFModDNContent)content; - m_client.rename( rec.getDN(), moddnContent.getRDN(), - moddnContent.getNewParent(), - moddnContent.getDeleteOldRDN(), cons ); - System.out.println( "rename completed"); - } - } - } catch (LDAPException e) { - System.err.println( rec.getDN() + ": " + - e.errorCodeToString() ); - if (e.getLDAPErrorMessage() != null) - System.err.println( "additional info: " + - e.getLDAPErrorMessage() ); - if ( !m_continuous ) - System.exit(1); - skip = true; - errCode = e.getLDAPResultCode(); - } - } + /* Do the directory operation */ + int errCode = 0; + if ( !skip ) { + try { + if ( mods != null ) { + LDAPModificationSet modSet = + new LDAPModificationSet(); + System.out.println("\nmodifying entry "+rec.getDN() ); + for( int m = 0; m < mods.length; m++ ) { + if (m_verbose) + System.out.println("\t"+mods[m] ); + modSet.add( mods[m].getOp(), + mods[m].getAttribute() ); + } - /* Write to rejects file? */ - if ( skip && (m_rejectsFile != null) ) { - try { - if ( reject == null ) { - reject = new PrintWriter( - new FileOutputStream( m_rejectsFile ) ); - } - } catch ( Exception e ) { - } - if ( reject != null ) { - reject.println( "dn: "+rec.getDN()+ " # Error: " + - errCode ); - if ( mods != null ) { - for( int m = 0; m < mods.length; m++ ) { - reject.println( mods[m].toString() ); - } - } 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(); - } - } - } - System.exit(0); - } /* doModify */ + if (!m_justShow) { + m_client.modify( rec.getDN(), modSet, cons ); + } + } else if ( newEntry != null ) { + System.out.println( "\nadding new entry " + newEntry.getDN() ); + if ( m_verbose ) { + LDAPAttributeSet set = newEntry.getAttributeSet(); + for( int a = 0; a < set.size(); a++ ) { + System.out.println("\t"+set.elementAt(a) ); + } + } + if (!m_justShow) { + m_client.add( newEntry, cons ); + } + } else if ( doDelete ) { + System.out.println( "\ndeleting entry " + rec.getDN() ); + if (!m_justShow) + m_client.delete( rec.getDN(), cons ); + } else if ( doModDN) { + System.out.println( "\nmodifying RDN of entry " + + rec.getDN()+" and/or moving it beneath a new parent"); + if ( m_verbose ) { + System.out.println( "\t"+content.toString()); + } + if (!m_justShow) { + LDIFModDNContent moddnContent = (LDIFModDNContent)content; + m_client.rename( rec.getDN(), moddnContent.getRDN(), + moddnContent.getNewParent(), + moddnContent.getDeleteOldRDN(), cons ); + System.out.println( "rename completed"); + } + } + } catch (LDAPException e) { + System.err.println( rec.getDN() + ": " + + e.errorCodeToString() ); + if (e.getLDAPErrorMessage() != null) + System.err.println( "additional info: " + + e.getLDAPErrorMessage() ); + if ( !m_continuous ) { + System.exit(1); + } + skip = true; + errCode = e.getLDAPResultCode(); + } + } + + /* Write to rejects file? */ + if ( skip && (m_rejectsFile != null) ) { + try { + if ( reject == null ) { + reject = new PrintWriter( + new FileOutputStream( m_rejectsFile ) ); + } + } catch ( Exception e ) { + } + if ( reject != null ) { + reject.println( "dn: "+rec.getDN()+ " # Error: " + + errCode ); + if ( mods != null ) { + for( int m = 0; m < mods.length; m++ ) { + reject.println( mods[m].toString() ); + } + } 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(); + } + } + } + System.exit(0); + } /* doModify */ /** @@ -391,40 +445,40 @@ public class LDAPModify extends LDAPTool { /* LDAPModify */ * @return Updated attribute. **/ private static LDAPAttribute checkFiles ( LDAPAttribute attr ) { - LDAPAttribute newAttr = - new LDAPAttribute( attr.getName() ); + LDAPAttribute newAttr = + new LDAPAttribute( attr.getName() ); - /* Check each value and see if it is a file name */ - Enumeration e = attr.getStringValues(); - if (e != null) { - while ( e.hasMoreElements() ) { - String val = (String)e.nextElement(); - if ( (val != null) && (val.length() > 1)) { - try { - File file = new File( val ); - FileInputStream fi = - new FileInputStream( file ); - byte[] bval = new byte[(int)file.length()]; - fi.read( bval, 0, (int)file.length() ); - newAttr.addValue( bval ); - } catch (FileNotFoundException ex) { - newAttr.addValue(val) ; - } catch ( IOException ex ) { - System.err.println( "Unable to read value " + - "from file " + val ); - if ( !m_continuous ) - System.exit(1); - newAttr = null; + /* Check each value and see if it is a file name */ + Enumeration e = attr.getStringValues(); + if (e != null) { + while ( e.hasMoreElements() ) { + String val = (String)e.nextElement(); + if ( (val != null) && (val.length() > 1)) { + try { + File file = new File( val ); + FileInputStream fi = + new FileInputStream( file ); + byte[] bval = new byte[(int)file.length()]; + fi.read( bval, 0, (int)file.length() ); + newAttr.addValue( bval ); + } catch (FileNotFoundException ex) { + newAttr.addValue(val) ; + } catch ( IOException ex ) { + System.err.println( "Unable to read value " + + "from file " + val ); + if ( !m_continuous ) + System.exit(1); + newAttr = null; } - } else { - newAttr.addValue( val ); - } - } - } - else - System.err.println("Failed to do string conversion for "+attr.getName()); - return newAttr; - } + } else { + newAttr.addValue( val ); + } + } + } + else + System.err.println("Failed to do string conversion for "+attr.getName()); + return newAttr; + } private static boolean m_continuous = false; private static boolean m_force = false; diff --git a/mozilla/directory/java-sdk/tools/LDAPSearch.java b/mozilla/directory/java-sdk/tools/LDAPSearch.java index 6c675e479d2..aecf408caa2 100644 --- a/mozilla/directory/java-sdk/tools/LDAPSearch.java +++ b/mozilla/directory/java-sdk/tools/LDAPSearch.java @@ -1,8 +1,23 @@ -/* ====================================================================== - * Copyright (c) 1997 Netscape Communications Corporation - * This file contains proprietary information of Netscape Communications. - * Copying or reproduction without prior written approval is prohibited. - * ====================================================================== +/* -*- 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.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1999 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): */ import java.io.*; @@ -127,6 +142,7 @@ public class LDAPSearch extends LDAPTool { "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"); + System.err.println(" -X output DSML instead of LDIF"); } /** @@ -136,7 +152,7 @@ public class LDAPSearch extends LDAPTool { */ protected static void extractParameters(String args[]) { - String privateOpts = "HATtxvna:b:F:l:s:S:z:G:"; + String privateOpts = "HATtxvnXa:b:F:l:s:S:z:G:"; GetOpt options = LDAPTool.extractParameters( privateOpts, args ); @@ -226,6 +242,9 @@ public class LDAPSearch extends LDAPTool { m_foldLine = false; } + if (options.hasOption('X')) + m_printDSML = true; + parseVlv(options); /* extract the filter string and attributes */ @@ -384,7 +403,7 @@ public class LDAPSearch extends LDAPTool { LDAPSearchResults res = null; try { LDAPSearchConstraints cons = - (LDAPSearchConstraints)m_client.getSearchConstraints().clone(); + m_client.getSearchConstraints(); cons.setServerControls(controls); cons.setDereference( m_deref ); cons.setMaxResults( m_sizelimit ); @@ -422,15 +441,26 @@ public class LDAPSearch extends LDAPTool { * @param res Search results */ private static void printResults( LDAPSearchResults res ) { + boolean isSchema = false; + boolean didEntryIntro = false; + LDAPWriter writer; + if ( m_printDSML ) { + printString( DSML_INTRO ); + writer = new DSMLWriter( m_pw ); + } else { + writer = new LDIFWriter( m_pw, m_attrsonly, m_sep, m_foldLine, + m_tempFiles ); + } + /* print out the retrieved entries */ try { /* Loop on results until finished */ while ( res.hasMoreElements() ) { - LDAPEntry findEntry = null; + LDAPEntry entry = null; try { /* Next directory entry */ - findEntry = (LDAPEntry)res.next(); + entry = (LDAPEntry)res.next(); } catch (LDAPReferralException ee) { LDAPUrl[] urls= ee.getURLs(); System.err.println("Referral entries: "); @@ -442,83 +472,42 @@ public class LDAPSearch extends LDAPTool { continue; } - String dn = findEntry.getDN(); - if (dn != null) - printString("dn" + m_sep + " " + dn); - else - printString("dn" + m_sep); - - /* Get the attributes of the entry */ - LDAPAttributeSet findAttrs = findEntry.getAttributeSet(); - Enumeration enumAttrs = findAttrs.getAttributes(); - /* Loop on attributes */ - while ( enumAttrs.hasMoreElements() ) { - LDAPAttribute anAttr = - (LDAPAttribute)enumAttrs.nextElement(); - String attrName = anAttr.getName(); - if (m_attrsonly) { - printString(attrName+":"); - continue; + if ( isSchemaEntry( entry ) ) { + writer.printSchema( entry ); + } else { + if ( m_printDSML && !didEntryIntro ) { + printString( DSML_RESULTS_INTRO ); + didEntryIntro = true; } - - /* Loop on values for this attribute */ - Enumeration enumVals; - enumVals = anAttr.getByteValues(); - - if (enumVals != null) { - while ( enumVals.hasMoreElements() ) { - if ( m_tempFiles ) { - try { - FileOutputStream f = getTempFile( attrName ); - f.write( (byte[])enumVals.nextElement() ); - } catch ( Exception e ) { - System.err.println( "Error writing values " + - "of " + attrName + ", " + - e.toString() ); - System.exit(1); - } - } else { - byte[] b = (byte[])enumVals.nextElement(); - String s = null; - if (LDIF.isPrintable(b)) { - s = new String(b, "UTF8"); - printString(attrName + m_sep + " " + s); - } else { - ByteBuf inBuf = new ByteBuf( b, 0, b.length ); - ByteBuf encodedBuf = new ByteBuf(); - // Translate to base 64 - MimeBase64Encoder encoder = new MimeBase64Encoder(); - encoder.translate( inBuf, encodedBuf ); - int nBytes = encodedBuf.length(); - if ( nBytes > 0 ) { - s = new String(encodedBuf.toBytes(), 0, nBytes); - printString( attrName + ":: " + s ); - } else { - m_pw.print( attrName + ": \n" ); - } - } - } - } - } - else - System.err.println("Failed to do string conversion for "+attrName); + writer.printEntry( entry ); } - m_pw.println(); } } catch (Exception e) { System.err.println( e.toString() ); System.exit(0); } + if ( m_printDSML ) { + if ( didEntryIntro ) { + printString( DSML_RESULTS_END ); + } + printString( DSML_END ); + } } + protected static void printString( String value ) { + m_pw.print( value ); + m_pw.print( '\n' ); + } - private static void printString( String value ) { - if (m_foldLine) - LDIF.breakString(m_pw, value, MAX_LINE); - else { - m_pw.print(value); - m_pw.print( '\n' ); - } + protected static boolean isSchemaEntry( LDAPEntry entry ) { + LDAPAttribute attr = entry.getAttribute( "objectclass" ); + String[] vals = attr.getStringValueArray(); + for( int i = 0; i < vals.length; i++ ) { + if ( vals[i].equalsIgnoreCase( "subschema" ) ) { + return true; + } + } + return false; } /** @@ -527,20 +516,35 @@ public class LDAPSearch extends LDAPTool { * @param controls Any server controls returned. **/ private static void showControls( LDAPControl[] controls ) { - if ( controls == null ) + if ( controls == null ) { return; - int[] results = new int[1]; - String bad = LDAPSortControl.parseResponse( controls, results ); - if ( results[0] != LDAPException.SUCCESS ) { - System.err.println( "Error code: " + results[0] ); - if ( bad != null ) - System.err.println( "Offending attribute: " + bad ); - else - System.err.println( "No offending attribute returned" ); - } else + } + + LDAPSortControl sControl = null; + LDAPVirtualListResponse vResponse = null; + for ( int i = 0; i < controls.length; i++ ) { + if ( controls[i] instanceof LDAPSortControl ) { + sControl = (LDAPSortControl)controls[i]; + } else if ( controls[i] instanceof LDAPVirtualListResponse ) { + vResponse = (LDAPVirtualListResponse)controls[i]; + } + } + + if (sControl != null ) { + String bad = sControl.getFailedAttribute(); + int result = sControl.getResultCode(); + if ( result != LDAPException.SUCCESS ) { + System.err.println( "Error code: " + result ); + if ( bad != null ) { + System.err.println( "Offending attribute: " + bad ); + } else { + System.err.println( "No offending attribute returned" ); + } + } else { m_pw.println("Server indicated results sorted OK"); - LDAPVirtualListResponse vResponse = - LDAPVirtualListResponse.parseResponse(controls); + } + } + if (vResponse != null) { int resultCode = vResponse.getResultCode(); if (resultCode == LDAPException.SUCCESS) { @@ -553,23 +557,16 @@ public class LDAPSearch extends LDAPTool { } } - private static FileOutputStream getTempFile( String name ) - throws IOException { - int num = 0; - File f; - String filename; - do { - filename = name + '.' + num; - f = new File( filename ); - num++; - } while ( f.exists() ); - printString(name + m_sep + " " + filename); - return new FileOutputStream( f ); - } - /** * Internal variables */ + private static final String DSML_INTRO = + ""; + private static final String DSML_END = ""; + private static final String DSML_RESULTS_INTRO = + " "; + private static final String DSML_RESULTS_END = + " "; private static boolean m_attrsonly = false; private static int m_deref = 0; private static int m_scope = 2; // default is sub search @@ -592,4 +589,6 @@ public class LDAPSearch extends LDAPTool { private static boolean m_foldLine = true; private static final int MAX_LINE = 77; private static PrintWriter m_pw = new PrintWriter(System.out); + private static MimeBase64Encoder m_encoder = new MimeBase64Encoder(); + private static boolean m_printDSML = false; } diff --git a/mozilla/directory/java-sdk/tools/LDAPTool.java b/mozilla/directory/java-sdk/tools/LDAPTool.java index 01caeb1111c..1a1f4623f3e 100644 --- a/mozilla/directory/java-sdk/tools/LDAPTool.java +++ b/mozilla/directory/java-sdk/tools/LDAPTool.java @@ -1,8 +1,23 @@ -/* ====================================================================== - * Copyright (c) 1997 Netscape Communications Corporation - * This file contains proprietary information of Netscape Communications. - * Copying or reproduction without prior written approval is prohibited. - * ====================================================================== +/* -*- 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.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1999 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): */ import netscape.ldap.*; @@ -96,7 +111,7 @@ class LDAPTool { } protected static void setDefaultReferralCredentials( - LDAPSearchConstraints cons ) { + LDAPConstraints cons ) { LDAPRebind rebind = new LDAPRebind() { public LDAPRebindAuth getRebindAuthentication( String host,