diff --git a/mozilla/directory/xpcom/base/public/nsILDAPConnection.idl b/mozilla/directory/xpcom/base/public/nsILDAPConnection.idl index 2254127922b..c1112724ac7 100644 --- a/mozilla/directory/xpcom/base/public/nsILDAPConnection.idl +++ b/mozilla/directory/xpcom/base/public/nsILDAPConnection.idl @@ -68,8 +68,10 @@ interface nsILDAPConnection : nsISupports * @param aBindName DN to bind as * @param aMessageListener Callback for DNS resolution completion * @param aClosure private parameter (anything caller desires) + * @param aVersion LDAP version to use (currently VERSION2 or + * VERSION3) * - * @exception NS_ERROR_ILLEGAL_VALUE null pointer passed in + * @exception NS_ERROR_ILLEGAL_VALUE null pointer or invalid version * @exception NS_ERROR_OUT_OF_MEMORY ran out of memory * @exception NS_ERROR_OFFLINE we are in off-line mode * @exception NS_ERROR_FAILURE @@ -78,7 +80,10 @@ interface nsILDAPConnection : nsISupports void init(in string aHost, in long aPort, in boolean aSSL, in AUTF8String aBindName, in nsILDAPMessageListener aMessageListener, - in nsISupports aClosure); + in nsISupports aClosure, in unsigned long aVersion); + + const unsigned long VERSION2 = 2; + const unsigned long VERSION3 = 3; /** * Get information about the last error that occured on this connection. diff --git a/mozilla/directory/xpcom/base/public/nsILDAPServer.idl b/mozilla/directory/xpcom/base/public/nsILDAPServer.idl index e64fb942c99..793f54cadde 100644 --- a/mozilla/directory/xpcom/base/public/nsILDAPServer.idl +++ b/mozilla/directory/xpcom/base/public/nsILDAPServer.idl @@ -33,6 +33,8 @@ */ #include "nsISupports.idl" +#include "nsILDAPConnection.idl" + interface nsILDAPURL; /** @@ -100,4 +102,13 @@ interface nsILDAPServer : nsISupports { * @exception NS_ERROR_NULL_POINTER NULL pointer to GET method */ attribute nsILDAPURL url; + + /** + * protocol version to be used (see nsILDAPConnection.idl for constants) + * Defaults to 3. + * + * @exception NS_ERROR_NULL_POINTER NULL pointer passed to getter + * @exception NS_ERROR_INVALID_ARG Invalid version passed to setter + */ + attribute unsigned long protocolVersion; }; diff --git a/mozilla/directory/xpcom/base/src/nsLDAPConnection.cpp b/mozilla/directory/xpcom/base/src/nsLDAPConnection.cpp index 27c38368865..a3862fdf963 100644 --- a/mozilla/directory/xpcom/base/src/nsLDAPConnection.cpp +++ b/mozilla/directory/xpcom/base/src/nsLDAPConnection.cpp @@ -63,6 +63,7 @@ nsLDAPConnection::nsLDAPConnection() mPendingOperations(0), mRunnable(0), mSSL(PR_FALSE), + mVersion(nsILDAPConnection::VERSION3), mDNSRequest(0) { } @@ -167,7 +168,7 @@ NS_IMETHODIMP nsLDAPConnection::Init(const char *aHost, PRInt32 aPort, PRBool aSSL, const nsACString& aBindName, nsILDAPMessageListener *aMessageListener, - nsISupports *aClosure) + nsISupports *aClosure, PRUint32 aVersion) { nsCOMPtr selfProxy; nsresult rv; @@ -186,13 +187,17 @@ nsLDAPConnection::Init(const char *aHost, PRInt32 aPort, PRBool aSSL, mClosure = aClosure; - // Save the port number for later use, once the DNS server(s) has - // resolved the host part. + // Save the port number, SSL flag, and protocol version for later + // use, once the DNS server(s) has resolved the host part. // mPort = aPort; - - // Save the SSL flag for later use mSSL = aSSL; + if (aVersion != nsILDAPConnection::VERSION2 && + aVersion != nsILDAPConnection::VERSION3) { + NS_ERROR("nsLDAPConnection::Init(): illegal version"); + return NS_ERROR_ILLEGAL_VALUE; + } + mVersion = aVersion; // Save the Init listener reference, we need it when the async // DNS resolver has finished. @@ -901,30 +906,49 @@ nsLDAPConnection::OnLookupComplete(nsIDNSRequest *aRequest, const int lDebug = 0; ldap_set_option(mConnectionHandle, LDAP_OPT_DEBUG_LEVEL, &lDebug); #endif - } + + // the C SDK currently defaults to v2. if we're to use v3, + // tell it so. + // + int version; + switch (mVersion) { + case 2: + break; + case 3: + version = LDAP_VERSION3; + ldap_set_option(mConnectionHandle, LDAP_OPT_PROTOCOL_VERSION, + &version); + break; + default: + NS_ERROR("nsLDAPConnection::OnLookupComplete(): mVersion" + " invalid"); + } #ifdef MOZ_PSM - // This code sets up the current connection to use PSM for SSL - // functionality. Making this use libssldap instead for - // non-browser user shouldn't be hard. + // This code sets up the current connection to use PSM for SSL + // functionality. Making this use libssldap instead for + // non-browser user shouldn't be hard. - extern nsresult nsLDAPInstallSSL(LDAP *ld, const char *aHostName); + extern nsresult nsLDAPInstallSSL(LDAP *ld, const char *aHostName); - if (mSSL) { - if (ldap_set_option(mConnectionHandle, LDAP_OPT_SSL, LDAP_OPT_ON) - != LDAP_SUCCESS ) { - NS_ERROR("nsLDAPConnection::OnStopLookup(): Error configuring" - " connection to use SSL"); - rv = NS_ERROR_UNEXPECTED; + if (mSSL) { + if (ldap_set_option(mConnectionHandle, LDAP_OPT_SSL, + LDAP_OPT_ON) != LDAP_SUCCESS ) { + NS_ERROR("nsLDAPConnection::OnStopLookup(): Error" + " configuring connection to use SSL"); + rv = NS_ERROR_UNEXPECTED; + } + + rv = nsLDAPInstallSSL(mConnectionHandle, mDNSHost.get()); + if (NS_FAILED(rv)) { + NS_ERROR("nsLDAPConnection::OnStopLookup(): Error" + " installing secure LDAP routines for" + " connection"); + } } - - rv = nsLDAPInstallSSL(mConnectionHandle, mDNSHost.get()); - if (NS_FAILED(rv)) { - NS_ERROR("nsLDAPConnection::OnStopLookup(): Error installing" - " secure LDAP routines for connection"); - } - } #endif + } + // Create a new runnable object, and increment the refcnt. The // thread will also hold a strong ref to the runnable, but we need // to make sure it doesn't get destructed until we are done with diff --git a/mozilla/directory/xpcom/base/src/nsLDAPConnection.h b/mozilla/directory/xpcom/base/src/nsLDAPConnection.h index cf553dec63d..bbdb1dac637 100644 --- a/mozilla/directory/xpcom/base/src/nsLDAPConnection.h +++ b/mozilla/directory/xpcom/base/src/nsLDAPConnection.h @@ -121,6 +121,7 @@ class nsLDAPConnection : public nsILDAPConnection, PRInt32 mPort; // The LDAP port we're binding to PRBool mSSL; // the options + PRUint32 mVersion; // LDAP protocol version nsCString mResolvedIP; // Preresolved list of host IPs nsCOMPtr mInitListener; // Init callback diff --git a/mozilla/directory/xpcom/base/src/nsLDAPServer.cpp b/mozilla/directory/xpcom/base/src/nsLDAPServer.cpp index 7168ced6640..45bba08c28c 100644 --- a/mozilla/directory/xpcom/base/src/nsLDAPServer.cpp +++ b/mozilla/directory/xpcom/base/src/nsLDAPServer.cpp @@ -18,6 +18,7 @@ * Rights Reserved. * * Contributor(s): Leif Hedstrom + * Dan Mosedale * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the @@ -38,9 +39,9 @@ NS_IMPL_THREADSAFE_ISUPPORTS1(nsLDAPServer, nsILDAPServer) nsLDAPServer::nsLDAPServer() + : mSizeLimit(0), + mProtocolVersion(nsILDAPConnection::VERSION3) { - - mSizeLimit = 0; } nsLDAPServer::~nsLDAPServer() @@ -137,3 +138,26 @@ NS_IMETHODIMP nsLDAPServer::SetUrl(nsILDAPURL *aURL) mURL = aURL; return NS_OK; } + +// attribute long protocolVersion +NS_IMETHODIMP nsLDAPServer::GetProtocolVersion(PRUint32 *_retval) +{ + if (!_retval) { + NS_ERROR("nsLDAPServer::GetProtocolVersion: null pointer "); + return NS_ERROR_NULL_POINTER; + } + + *_retval = mProtocolVersion; + return NS_OK; +} +NS_IMETHODIMP nsLDAPServer::SetProtocolVersion(PRUint32 aVersion) +{ + if (aVersion != nsILDAPConnection::VERSION2 && + aVersion != nsILDAPConnection::VERSION3) { + NS_ERROR("nsLDAPServer::SetProtocolVersion: invalid version"); + return NS_ERROR_INVALID_ARG; + } + + mProtocolVersion = aVersion; + return NS_OK; +} diff --git a/mozilla/directory/xpcom/base/src/nsLDAPServer.h b/mozilla/directory/xpcom/base/src/nsLDAPServer.h index 3761cdd540b..caea06a9f6f 100644 --- a/mozilla/directory/xpcom/base/src/nsLDAPServer.h +++ b/mozilla/directory/xpcom/base/src/nsLDAPServer.h @@ -60,7 +60,7 @@ class nsLDAPServer : public nsILDAPServer nsCString mPassword; // Password to bind with nsCString mBindDN; // DN associated with the UID above PRUint32 mSizeLimit; // Limit the LDAP search to this # of entries - + PRUint32 mProtocolVersion; // What version of LDAP to use? // This "links" to a LDAP URL object, which holds further information // related to the LDAP server. Like Host, port, base-DN and scope. nsCOMPtr mURL; diff --git a/mozilla/directory/xpcom/base/src/nsLDAPService.cpp b/mozilla/directory/xpcom/base/src/nsLDAPService.cpp index cf4fa335fb2..46e954c8893 100644 --- a/mozilla/directory/xpcom/base/src/nsLDAPService.cpp +++ b/mozilla/directory/xpcom/base/src/nsLDAPService.cpp @@ -708,6 +708,7 @@ nsLDAPService::EstablishConnection(nsLDAPServiceEntry *aEntry, nsCAutoString password; PRInt32 port; PRUint32 options; + PRUint32 protocolVersion; nsresult rv; server = aEntry->GetServer(); @@ -715,7 +716,7 @@ nsLDAPService::EstablishConnection(nsLDAPServiceEntry *aEntry, return NS_ERROR_FAILURE; } - // Get username and password from the server entry. + // Get username, password, and protocol version from the server entry. // rv = server->GetBinddn(binddn); if (NS_FAILED(rv)) { @@ -725,7 +726,11 @@ nsLDAPService::EstablishConnection(nsLDAPServiceEntry *aEntry, if (NS_FAILED(rv)) { return NS_ERROR_FAILURE; } - + rv = server->GetProtocolVersion(&protocolVersion); + if (NS_FAILED(rv)) { + return NS_ERROR_FAILURE; + } + // Get the host and port out of the URL, which is in the server entry. // rv = server->GetUrl(getter_AddRefs(url)); @@ -758,7 +763,7 @@ nsLDAPService::EstablishConnection(nsLDAPServiceEntry *aEntry, // rv = conn->Init(host.get(), port, (options & nsILDAPURL::OPT_SECURE) ? PR_TRUE : PR_FALSE, - binddn, this, nsnull); + binddn, this, nsnull, protocolVersion); if (NS_FAILED(rv)) { switch (rv) { // Only pass along errors we are aware of diff --git a/mozilla/directory/xpcom/base/src/nsLDAPService.h b/mozilla/directory/xpcom/base/src/nsLDAPService.h index 461d3bf5982..9d9bd9cbe8c 100644 --- a/mozilla/directory/xpcom/base/src/nsLDAPService.h +++ b/mozilla/directory/xpcom/base/src/nsLDAPService.h @@ -89,7 +89,7 @@ class nsLDAPServiceEntry inline PRBool DeleteEntry(); protected: - PRUint32 mLeases; // The number of leases currently granted + PRUint32 mLeases; // The number of leases currently granted PRTime mTimestamp; // Last time this server was "used" PRBool mDelete; // This entry is due for deletion PRBool mRebinding; // Keep state if we are rebinding or not diff --git a/mozilla/directory/xpcom/datasource/nsLDAPDataSource.js b/mozilla/directory/xpcom/datasource/nsLDAPDataSource.js index 0d888cbb65c..de0099cf044 100644 --- a/mozilla/directory/xpcom/datasource/nsLDAPDataSource.js +++ b/mozilla/directory/xpcom/datasource/nsLDAPDataSource.js @@ -1279,7 +1279,8 @@ nsLDAPMessageRDFDelegateFactory.prototype = ["@mozilla.org/network/ldap-connection;1"]. createInstance(Components.interfaces.nsILDAPConnection); connection.init(queryURL.host, queryURL.port, null, - generateGetTargetsBoundCallback(), null) + generateGetTargetsBoundCallback(), null, + Components.interfaces.nsILDAPConnection.VERSION3); // XXXdmose - in this case, we almost certainly shouldn't be // falling through to an error case, but instead returning diff --git a/mozilla/mail/components/compose/content/MsgComposeCommands.js b/mozilla/mail/components/compose/content/MsgComposeCommands.js index 21f4fd5416e..d7fb15b3eb8 100644 --- a/mozilla/mail/components/compose/content/MsgComposeCommands.js +++ b/mozilla/mail/components/compose/content/MsgComposeCommands.js @@ -793,6 +793,19 @@ function setupLdapAutocompleteSession() // if we don't have this pref, no big deal } + // set the LDAP protocol version correctly + var protocolVersion; + try { + protocolVersion = sPrefs.getCharPref(autocompleteDirectory + + ".protocolVersion"); + } catch (ex) { + // if we don't have this pref, no big deal + } + if (protocolVersion == "2") { + LDAPSession.login = + Components.interfaces.nsILDAPConnection.VERSION2; + } + // find out if we need to authenticate, and if so, tell the LDAP // autocomplete session how to prompt for a password. This window // (the compose window) is being used to parent the authprompter. diff --git a/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp b/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp index fe23985e114..845d3f13c8e 100644 --- a/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp +++ b/mozilla/mailnews/addrbook/src/nsAbLDAPDirectory.cpp @@ -135,12 +135,14 @@ nsresult nsAbLDAPDirectory::InitiateConnection () * change. * * But the uri value was also the means by which third-party - * products could integrate with Mozilla's LDAP Address Books without - * necessarily having an entry in the preferences file or more importantly - * needing to be able to change the preferences entries. Thus to set the - * URI Spec now, it is only necessary to read the uri pref entry, while in the case - * where it is not a preference, we need to replace the "moz-abldapdirectory". - */ + * products could integrate with Mozilla's LDAP Address Books + * without necessarily having an entry in the preferences file + * or more importantly needing to be able to change the + * preferences entries. Thus to set the URI Spec now, it is + * only necessary to read the uri pref entry, while in the + * case where it is not a preference, we need to replace the + * "moz-abldapdirectory". + */ nsCAutoString tempLDAPURL(mURINoQuery); tempLDAPURL.ReplaceSubstring("moz-abldapdirectory:", "ldap:"); rv = mURL->SetSpec(tempLDAPURL); @@ -163,6 +165,24 @@ nsresult nsAbLDAPDirectory::InitiateConnection () mLogin.Truncate(); // zero out mLogin } + // get the protocol version, if there is any. using a string pref + // here instead of an int, as protocol versions sometimes have names like + // "4bis". + // + nsXPIDLCString protocolVersion; + rv = prefs->GetCharPref( + PromiseFlatCString( + Substring(mURINoQuery, kLDAPDirectoryRootLen, + mURINoQuery.Length() - kLDAPDirectoryRootLen) + + NS_LITERAL_CSTRING(".protocolVersion")).get(), + getter_Copies(protocolVersion)); + + if (NS_SUCCEEDED(rv) && protocolVersion.Equals("2")) { + mProtocolVersion = nsILDAPConnection::VERSION2; + } + // otherwise we leave mProtocolVersion as the default (see the initializers + // for the nsAbLDAPDirectoryQuery class). + mConnection = do_CreateInstance(NS_LDAPCONNECTION_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); diff --git a/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp b/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp index ff97ca5ee48..8507f1612bb 100644 --- a/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp +++ b/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.cpp @@ -631,6 +631,7 @@ nsresult nsAbQueryLDAPMessageListener::QueryResultStatus (nsISupportsArray* prop NS_IMPL_THREADSAFE_ISUPPORTS1(nsAbLDAPDirectoryQuery, nsIAbDirectoryQuery) nsAbLDAPDirectoryQuery::nsAbLDAPDirectoryQuery() : + mProtocolVersion (nsILDAPConnection::VERSION3), mInitialized(PR_FALSE), mCounter (1), mLock (nsnull) @@ -825,7 +826,7 @@ NS_IMETHODIMP nsAbLDAPDirectoryQuery::DoQuery(nsIAbDirectoryQueryArguments* argu // Now lets initialize the LDAP connection properly. We'll kick // off the bind operation in the callback function, |OnLDAPInit()|. rv = ldapConnection->Init(host.get(), port, options, mLogin, - messageListener, nsnull); + messageListener, nsnull, mProtocolVersion); NS_ENSURE_SUCCESS(rv, rv); return rv; diff --git a/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h b/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h index 635fd586382..ea85898ac8d 100644 --- a/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h +++ b/mozilla/mailnews/addrbook/src/nsAbLDAPDirectoryQuery.h @@ -21,6 +21,7 @@ * * Contributor(s): * Created by: Paul Sandoz + * Dan Mosedale * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -74,6 +75,7 @@ protected: nsresult Initiate (); nsXPIDLCString mLogin; // authenticate to the LDAP server as... nsCOMPtr mDirectoryUrl; // the URL for the server + PRUint32 mProtocolVersion; // version of LDAP (see nsILDAPConnection.idl) private: nsHashtable mListeners; diff --git a/mozilla/mailnews/addrbook/src/nsAbLDAPReplicationQuery.cpp b/mozilla/mailnews/addrbook/src/nsAbLDAPReplicationQuery.cpp index 20289e83245..1eb5a479d52 100644 --- a/mozilla/mailnews/addrbook/src/nsAbLDAPReplicationQuery.cpp +++ b/mozilla/mailnews/addrbook/src/nsAbLDAPReplicationQuery.cpp @@ -164,10 +164,17 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::ConnectToLDAPServer(nsILDAPURL *aURL, co return rv; } + PRUint32 protocolVersion; + if (DIR_TestFlag(mDirServer, DIR_LDAP_VERSION3)) { + protocolVersion = nsILDAPConnection::VERSION3; + } else { + protocolVersion = nsILDAPConnection::VERSION2; + } + // initialize the LDAP connection return mConnection->Init(host.get(), port, (options & nsILDAPURL::OPT_SECURE) ? PR_TRUE : PR_FALSE, - aAuthDN, listener, nsnull); + aAuthDN, listener, nsnull, protocolVersion); } NS_IMETHODIMP nsAbLDAPReplicationQuery::Init(const nsACString & aPrefName, nsIWebProgressListener *aProgressListener) diff --git a/mozilla/mailnews/addrbook/src/nsDirPrefs.cpp b/mozilla/mailnews/addrbook/src/nsDirPrefs.cpp index c6eea833bf7..d0dc98552ea 100644 --- a/mozilla/mailnews/addrbook/src/nsDirPrefs.cpp +++ b/mozilla/mailnews/addrbook/src/nsDirPrefs.cpp @@ -21,6 +21,7 @@ * * Contributor(s): * Seth Spitzer + * Dan Mosedale * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -1457,6 +1458,8 @@ DIR_PrefId DIR_AtomizePrefName(const char *prefname) break; } break; + case 'r': /* protocolVersion */ + rc = idProtocolVersion; } break; @@ -2974,6 +2977,11 @@ void DIR_GetPrefsForOneServer (DIR_Server *server, PRBool reinitialize, PRBool o if (server->savePassword) server->password = DIR_GetStringPref (prefstring, "auth.password", tempstring, ""); + char *versionString = DIR_GetStringPref(prefstring, "protocolVersion", + tempstring, "3"); + DIR_ForceFlag(server, DIR_LDAP_VERSION3, !strcmp(versionString, "3")); + nsCRT::free(versionString); + prefBool = DIR_GetBoolPref (prefstring, "autoComplete.enabled", tempstring, kDefaultAutoCompleteEnabled); DIR_ForceFlag (server, DIR_AUTO_COMPLETE_ENABLED, prefBool); prefBool = DIR_GetBoolPref (prefstring, "autoComplete.never", tempstring, kDefaultAutoCompleteNever); @@ -3840,6 +3848,10 @@ void DIR_SavePrefsForOneServer(DIR_Server *server) DIR_SetBoolPref (prefstring, "vlvDisabled", tempstring, DIR_TestFlag(server, DIR_LDAP_VLV_DISABLED), kDefaultVLVDisabled); + DIR_SetStringPref(prefstring, "protocolVersion", tempstring, + DIR_TestFlag(server, DIR_LDAP_VERSION3) ? "3" : "2", + "3"); + DIR_SaveCustomAttributes (prefstring, tempstring, server); DIR_SaveCustomFilters (prefstring, tempstring, server); diff --git a/mozilla/mailnews/addrbook/src/nsDirPrefs.h b/mozilla/mailnews/addrbook/src/nsDirPrefs.h index 6ad20d561f2..74f3cc4cc8d 100644 --- a/mozilla/mailnews/addrbook/src/nsDirPrefs.h +++ b/mozilla/mailnews/addrbook/src/nsDirPrefs.h @@ -180,7 +180,8 @@ typedef enum idReplExcludedAttributes, idReplExcludedAttributesCount, idPalmCategory, - idPalmSyncTimeStamp + idPalmSyncTimeStamp, + idProtocolVersion } DIR_PrefId; @@ -403,7 +404,7 @@ PRBool DIR_SetServerStringPref(DIR_Server *server, DIR_PrefId prefid, char * #define DIR_IS_SECURE 0x00000008 #define DIR_SAVE_RESULTS 0x00000010 /* not used by the FEs */ #define DIR_EFFICIENT_WILDCARDS 0x00000020 /* not used by the FEs */ -#define DIR_LDAP_VERSION3 0x00000040 /* not used by the FEs */ +#define DIR_LDAP_VERSION3 0x00000040 #define DIR_LDAP_VLV_DISABLED 0x00000080 /* not used by the FEs */ #define DIR_LDAP_VLV_SUPPORTED 0x00000100 /* not used by the FEs */ #define DIR_LDAP_ROOTDSE_PARSED 0x00000200 /* not used by the FEs */ diff --git a/mozilla/xpfe/components/autocomplete/public/nsILDAPAutoCompleteSession.idl b/mozilla/xpfe/components/autocomplete/public/nsILDAPAutoCompleteSession.idl index 54ee36457ad..cb0b64a5812 100644 --- a/mozilla/xpfe/components/autocomplete/public/nsILDAPAutoCompleteSession.idl +++ b/mozilla/xpfe/components/autocomplete/public/nsILDAPAutoCompleteSession.idl @@ -113,4 +113,13 @@ interface nsILDAPAutoCompleteSession : nsIAutoCompleteSession { * If set, use this object to get a password for logging in to the server. */ attribute nsIAuthPrompt authPrompter; + + /** + * What version of the LDAP protocol should be used? Allowed version + * number constants are defined in nsILDAPConnection.idl. + * + * @exception NS_ERROR_ILLEGAL_VALUE illegal version num passed to setter + * @exception NS_ERROR_NULL_POINTER null pointer passed to getter + */ + attribute unsigned long version; }; diff --git a/mozilla/xpfe/components/autocomplete/src/nsLDAPAutoCompleteSession.cpp b/mozilla/xpfe/components/autocomplete/src/nsLDAPAutoCompleteSession.cpp index 327491949e8..20d80090d40 100644 --- a/mozilla/xpfe/components/autocomplete/src/nsLDAPAutoCompleteSession.cpp +++ b/mozilla/xpfe/components/autocomplete/src/nsLDAPAutoCompleteSession.cpp @@ -67,7 +67,7 @@ nsLDAPAutoCompleteSession::nsLDAPAutoCompleteSession() : mState(UNBOUND), mFilterTemplate("(|(cn=%v1*%v2-*)(mail=%v1*%v2-*)(sn=%v1*%v2-*))"), mMaxHits(100), mMinStringLength(2), mCjkMinStringLength(0), - mSearchAttrs(0), mSearchAttrsSize(0) + mSearchAttrs(0), mSearchAttrsSize(0), mVersion(nsILDAPConnection::VERSION3) { } @@ -860,7 +860,7 @@ nsLDAPAutoCompleteSession::StartLDAPSearch() // rv = NS_GetProxyForObject(NS_UI_THREAD_EVENTQ, NS_GET_IID(nsILDAPMessageListener), - NS_STATIC_CAST(nsILDAPMessageListener *, this), + NS_STATIC_CAST(nsILDAPMessageListener *, this), PROXY_ASYNC | PROXY_ALWAYS, getter_AddRefs(selfProxy)); if (NS_FAILED(rv)) { @@ -1141,7 +1141,7 @@ nsLDAPAutoCompleteSession::InitConnection() // rv = mConnection->Init(host.get(), port, (options & nsILDAPURL::OPT_SECURE) ? PR_TRUE - : PR_FALSE, mLogin, selfProxy, nsnull); + : PR_FALSE, mLogin, selfProxy, nsnull, mVersion); if NS_FAILED(rv) { switch (rv) { @@ -1546,4 +1546,28 @@ nsLDAPAutoCompleteSession::SetAuthPrompter(nsIAuthPrompt *aAuthPrompter) mAuthPrompter = aAuthPrompter; return NS_OK; } + +// attribute unsigned long version; +NS_IMETHODIMP +nsLDAPAutoCompleteSession::GetVersion(PRUint32 *aVersion) +{ + if (!aVersion) { + return NS_ERROR_NULL_POINTER; + } + + *aVersion = mVersion; + return NS_OK; +} +NS_IMETHODIMP +nsLDAPAutoCompleteSession::SetVersion(PRUint32 aVersion) +{ + if ( mVersion != nsILDAPConnection::VERSION2 && + mVersion != nsILDAPConnection::VERSION3) { + return NS_ERROR_ILLEGAL_VALUE; + } + + mVersion = aVersion; + return NS_OK; +} + #endif diff --git a/mozilla/xpfe/components/autocomplete/src/nsLDAPAutoCompleteSession.h b/mozilla/xpfe/components/autocomplete/src/nsLDAPAutoCompleteSession.h index 02a8ce6c214..2733acdbc01 100644 --- a/mozilla/xpfe/components/autocomplete/src/nsLDAPAutoCompleteSession.h +++ b/mozilla/xpfe/components/autocomplete/src/nsLDAPAutoCompleteSession.h @@ -76,6 +76,8 @@ class nsLDAPAutoCompleteSession : public nsILDAPMessageListener, char **mSearchAttrs; // outputFormat search attrs for SearchExt call PRUint32 mSearchAttrsSize; // size of above array nsCOMPtr mAuthPrompter; // used to prompt for the password + PRUint32 mVersion; // version of LDAP to use + // XXX hack until nsUTF8String exists #define nsUTF8String nsCString nsUTF8String mLogin; // authenticate as this user