Bug 316170 Address Book LDAP Replication doesn't work for authenticated connections. r=Neil,sr=bienvenu

This commit is contained in:
bugzilla%standard8.demon.co.uk 2007-04-03 15:59:41 +00:00
Родитель e776e6606f
Коммит cd65caad1f
12 изменённых файлов: 281 добавлений и 442 удалений

Просмотреть файл

@ -40,6 +40,7 @@
interface nsIMutableArray;
interface nsIAbLDAPAttributeMap;
interface nsILDAPURL;
%{C++
#define kLDAPDirectoryRoot "moz-abldapdirectory://"
@ -50,7 +51,7 @@ interface nsIAbLDAPAttributeMap;
* XXX This should really inherit from nsIAbDirectory, and some day it will.
* But for now, doing that complicates implementation.
*/
[scriptable, uuid(9857182c-9051-4788-9393-735ae7bdd8b3)]
[scriptable, uuid(d67b4a29-10d5-4409-a693-3e8bab184948)]
interface nsIAbLDAPDirectory : nsISupports
{
/**
@ -89,5 +90,13 @@ interface nsIAbLDAPDirectory : nsISupports
* The attribute map that is associated with this directory's server.
*/
readonly attribute nsIAbLDAPAttributeMap attributeMap;
/**
* The LDAP URL for this directory. Note that this differs from
* nsIAbDirectory::URI. This attribute will give you a true ldap
* url, e.g. ldap://localhost:389/ whereas the uri will give you the
* directories rdf uri, e.g. moz-abldapdirectory://<pref base name>/.
*/
readonly attribute nsILDAPURL lDAPURL;
};

Просмотреть файл

@ -1,3 +1,4 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -35,17 +36,19 @@
* ***** END LICENSE BLOCK ***** */
#include "nsISupports.idl"
#include "nsILDAPMessageListener.idl"
interface nsIAbLDAPDirectory;
interface nsILDAPConnection;
interface nsILDAPURL;
interface nsIAbLDAPReplicationQuery;
interface nsIWebProgressListener;
/**
* this service does replication of an LDAP directory to a local Mork AB Database.
*/
[scriptable, uuid(00D568A2-3C3B-11d6-B7B9-00B0D06E5F27)]
interface nsIAbLDAPProcessReplicationData : nsILDAPMessageListener {
[scriptable, uuid(e628bbc9-8793-4f0b-bce4-990d399b1fca)]
interface nsIAbLDAPProcessReplicationData : nsISupports
{
/**
* readonly attribute giving the current replication state
*/
@ -83,16 +86,15 @@ interface nsIAbLDAPProcessReplicationData : nsILDAPMessageListener {
/**
* this method initializes the implementation
*/
void init (in nsIAbLDAPReplicationQuery query, in nsIWebProgressListener progressListener);
void init(in nsIAbLDAPDirectory directory,
in nsILDAPConnection connection,
in nsILDAPURL url,
in nsIAbLDAPReplicationQuery query,
in nsIWebProgressListener progressListener);
/**
* this method a aborts the ongoing processing
*/
void abort();
/**
* this utility method populates authentication data from Dir Server
*/
void populateAuthData();
};

Просмотреть файл

@ -1,3 +1,4 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@ -19,6 +20,7 @@
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Mark Banner <bugzilla@standard8.demon.co.uk>
*
* 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
@ -45,67 +47,53 @@ interface nsIAbLDAPDirectory;
/**
* this interface provides methods to perform LDAP Replication Queries
*/
[scriptable, uuid(91c213f7-a381-4b1d-adf3-af58a2bb95d2)]
interface nsIAbLDAPReplicationQuery : nsISupports {
readonly attribute nsILDAPURL replicationURL;
readonly attribute nsILDAPConnection connection;
readonly attribute nsILDAPOperation operation;
readonly attribute nsIAbLDAPDirectory lDAPDirectory;
/**
* initialize for the query
*/
void init (in ACString aPrefName, in nsIWebProgressListener aProgressListener);
[scriptable, uuid(6d33127c-faef-4140-bb19-bb03c1590917)]
interface nsIAbLDAPReplicationQuery : nsISupports
{
/**
* initialize for the query
*/
void init(in ACString aPrefName, in nsIWebProgressListener aProgressListener);
/**
* Starts an LDAP query to do replication as needed
*/
void doReplicationQuery();
/**
* Starts an LDAP query to do replication as needed
*/
void doReplicationQuery();
/**
* connects to an LDAP Server using a DN
*/
void connectToLDAPServer(in nsILDAPURL aURL, in AUTF8String aAuthDN);
* Cancels the currently executing query
*/
void cancelQuery();
/**
* Starts an LDAP query to replicate all entries
*/
void queryAllEntries();
/**
* Cancels the currently executing query
*/
void cancelQuery();
/**
* this method is the callback when query is done, failed or successful
*/
void done(in boolean aSuccess);
* this method is the callback when query is done, failed or successful
*/
void done(in boolean aSuccess);
};
// XXX This interface currently isn't implemented as it didn't work.
// Bug 311632 should fix it
[scriptable, uuid(126202D1-4460-11d6-B7C2-00B0D06E5F27)]
interface nsIAbLDAPChangeLogQuery : nsISupports {
interface nsIAbLDAPChangeLogQuery : nsISupports
{
/**
* Starts an LDAP query to find auth DN
*/
void queryAuthDN(in AUTF8String aValueUsedToFindDn);
* Starts an LDAP query to find auth DN
*/
void queryAuthDN(in AUTF8String aValueUsedToFindDn);
/**
* Starts an LDAP query to search server's Root DSE
*/
void queryRootDSE();
* Starts an LDAP query to search server's Root DSE
*/
void queryRootDSE();
/**
* Starts an LDAP ChangeLog query to find changelog entries
*/
void queryChangeLog(in AUTF8String aChangeLogDN, in PRInt32 aLastChangeNo);
* Starts an LDAP ChangeLog query to find changelog entries
*/
void queryChangeLog(in AUTF8String aChangeLogDN, in PRInt32 aLastChangeNo);
/**
* Starts an LDAP query to find changed entries
*/
void queryChangedEntries(in AUTF8String aChangedEntryDN);
* Starts an LDAP query to find changed entries
*/
void queryChangedEntries(in AUTF8String aChangedEntryDN);
};

Просмотреть файл

@ -77,7 +77,6 @@ public:
// nsAbLDAPDirectoryQuery methods
nsresult GetLDAPConnection (nsILDAPConnection** connection);
nsresult GetLDAPURL (nsILDAPURL** url);
nsresult CreateCard (nsILDAPURL* uri, const char* dn, nsIAbCard** card);
// nsIAbDirectorySearch methods

Просмотреть файл

@ -432,10 +432,10 @@ nsAbLDAPDirectoryQuery::~nsAbLDAPDirectoryQuery()
}
NS_IMETHODIMP nsAbLDAPDirectoryQuery::DoQuery(nsIAbDirectoryQueryArguments* arguments,
nsIAbDirectoryQueryResultListener* listener,
PRInt32 resultLimit,
PRInt32 timeOut,
PRInt32* _retval)
nsIAbDirectoryQueryResultListener* listener,
PRInt32 resultLimit,
PRInt32 timeOut,
PRInt32* _retval)
{
PRBool alreadyInitialized = mInitialized;
mInitialized = PR_TRUE;
@ -492,7 +492,10 @@ NS_IMETHODIMP nsAbLDAPDirectoryQuery::DoQuery(nsIAbDirectoryQueryArguments* argu
}
// Set up the search ldap url
rv = GetLDAPURL(getter_AddRefs(mDirectoryUrl));
nsCOMPtr<nsIAbLDAPDirectory> directory(do_QueryInterface(this, &rv));
NS_ENSURE_SUCCESS(rv, rv);
rv = directory->GetLDAPURL(getter_AddRefs(mDirectoryUrl));
NS_ENSURE_SUCCESS(rv, rv);
nsCAutoString host;

Просмотреть файл

@ -60,7 +60,6 @@ public:
void setLdapUrl (const char* aldapUrl);
virtual nsresult GetLDAPConnection (nsILDAPConnection** connection) = 0;
virtual nsresult GetLDAPURL (nsILDAPURL** url) = 0;
virtual nsresult CreateCard (nsILDAPURL* url, const char* dn, nsIAbCard** card) = 0;
protected:

Просмотреть файл

@ -67,6 +67,9 @@ nsAbLDAPListenerBase::~nsAbLDAPListenerBase()
nsresult nsAbLDAPListenerBase::Initiate()
{
if (!mConnection || !mDirectoryUrl)
return NS_ERROR_NULL_POINTER;
if (mInitialized)
return NS_OK;
@ -81,6 +84,9 @@ nsresult nsAbLDAPListenerBase::Initiate()
NS_IMETHODIMP nsAbLDAPListenerBase::OnLDAPInit(nsILDAPConnection *aConn, nsresult aStatus)
{
if (!mConnection || !mDirectoryUrl)
return NS_ERROR_NULL_POINTER;
nsresult rv;
nsXPIDLString passwd;
@ -225,6 +231,7 @@ NS_IMETHODIMP nsAbLDAPListenerBase::OnLDAPInit(nsILDAPConnection *aConn, nsresul
NS_STATIC_CAST(nsILDAPMessageListener *, this),
NS_PROXY_SYNC | NS_PROXY_ALWAYS,
getter_AddRefs(proxyListener));
NS_ENSURE_SUCCESS(rv, rv);
rv = ldapOperation->Init(mConnection, proxyListener, nsnull);
NS_ENSURE_SUCCESS(rv, rv);
@ -269,7 +276,7 @@ nsresult nsAbLDAPListenerBase::OnLDAPMessageBind(nsILDAPMessage *aMessage)
// pop up a dialog telling the user to go manually delete
// this password in the password manager.
}
}
}
// XXX this error should be propagated back to the UI somehow
return NS_ERROR_FAILURE;

Просмотреть файл

@ -53,9 +53,9 @@ class nsAbLDAPListenerBase : public nsILDAPMessageListener
public:
// Note that the directoryUrl is the details of the ldap directory
// without any search params or attributes specified.
nsAbLDAPListenerBase(nsILDAPURL* directoryUrl,
nsILDAPConnection* connection,
const nsACString &login,
nsAbLDAPListenerBase(nsILDAPURL* directoryUrl = nsnull,
nsILDAPConnection* connection = nsnull,
const nsACString &login = EmptyCString(),
const PRInt32 timeOut = 0);
virtual ~nsAbLDAPListenerBase();
@ -74,8 +74,6 @@ protected:
PRBool mBound;
PRBool mInitialized;
nsCOMPtr<nsILDAPOperation> mOperation;
PRLock* mLock;
};

Просмотреть файл

@ -56,12 +56,13 @@
// independently along with its related independent nsAbLDAPReplicationQuery object.
NS_IMPL_THREADSAFE_ISUPPORTS2(nsAbLDAPProcessReplicationData, nsIAbLDAPProcessReplicationData, nsILDAPMessageListener)
nsAbLDAPProcessReplicationData::nsAbLDAPProcessReplicationData()
: mState(kIdle),
mProtocol(-1),
mCount(0),
mDBOpen(PR_FALSE),
mInitialized(PR_FALSE)
nsAbLDAPProcessReplicationData::nsAbLDAPProcessReplicationData() :
nsAbLDAPListenerBase(),
mState(kIdle),
mProtocol(-1),
mCount(0),
mDBOpen(PR_FALSE),
mInitialized(PR_FALSE)
{
}
@ -72,35 +73,45 @@ nsAbLDAPProcessReplicationData::~nsAbLDAPProcessReplicationData()
mReplicationDB->Close(PR_FALSE);
}
NS_IMETHODIMP nsAbLDAPProcessReplicationData::Init(nsIAbLDAPReplicationQuery *query, nsIWebProgressListener *progressListener)
NS_IMETHODIMP nsAbLDAPProcessReplicationData::Init(
nsIAbLDAPDirectory *aDirectory,
nsILDAPConnection *aConnection,
nsILDAPURL* aURL,
nsIAbLDAPReplicationQuery *aQuery,
nsIWebProgressListener *aProgressListener)
{
NS_ENSURE_ARG_POINTER(query);
NS_ENSURE_ARG_POINTER(aDirectory);
NS_ENSURE_ARG_POINTER(aConnection);
NS_ENSURE_ARG_POINTER(aURL);
NS_ENSURE_ARG_POINTER(aQuery);
mQuery = query;
mDirectory = aDirectory;
mConnection = aConnection;
mDirectoryUrl = aURL;
mQuery = aQuery;
nsresult rv = mQuery->GetLDAPDirectory(getter_AddRefs(mDirectory));
if(NS_FAILED(rv)) {
mQuery = nsnull;
return rv;
}
mListener = aProgressListener;
rv = mDirectory->GetAttributeMap(getter_AddRefs(mAttrMap));
if (NS_FAILED(rv)) {
mQuery = nsnull;
return rv;
}
nsresult rv = mDirectory->GetAttributeMap(getter_AddRefs(mAttrMap));
if (NS_FAILED(rv)) {
mQuery = nsnull;
return rv;
}
mListener = progressListener;
rv = mDirectory->GetAuthDn(mLogin);
if (NS_FAILED(rv)) {
mQuery = nsnull;
return rv;
}
mInitialized = PR_TRUE;
mInitialized = PR_TRUE;
return rv;
return rv;
}
NS_IMETHODIMP nsAbLDAPProcessReplicationData::GetReplicationState(PRInt32 *aReplicationState)
{
NS_ENSURE_ARG_POINTER(aReplicationState);
*aReplicationState = mState;
return NS_OK;
}
@ -112,243 +123,165 @@ NS_IMETHODIMP nsAbLDAPProcessReplicationData::GetProtocolUsed(PRInt32 *aProtocol
return NS_OK;
}
NS_IMETHODIMP nsAbLDAPProcessReplicationData::OnLDAPInit(nsILDAPConnection *aConn, nsresult aStatus)
{
if(!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
// Make sure that the Init() worked properly
if(NS_FAILED(aStatus)) {
Done(PR_FALSE);
return NS_ERROR_FAILURE;
}
nsCOMPtr<nsILDAPMessageListener> listener;
nsresult rv = NS_GetProxyForObject(NS_PROXY_TO_CURRENT_THREAD,
NS_GET_IID(nsILDAPMessageListener),
NS_STATIC_CAST(nsILDAPMessageListener*, this),
NS_PROXY_SYNC | NS_PROXY_ALWAYS,
getter_AddRefs(listener));
if(NS_FAILED(rv)) {
Done(PR_FALSE);
return rv;
}
nsCOMPtr<nsILDAPOperation> operation;
rv = mQuery->GetOperation(getter_AddRefs(operation));
if(NS_FAILED(rv)) {
Done(PR_FALSE);
return rv;
}
nsCOMPtr<nsILDAPConnection> connection;
rv = mQuery->GetConnection(getter_AddRefs(connection));
if(NS_FAILED(rv)) {
Done(PR_FALSE);
return rv;
}
rv = operation->Init(connection, listener, nsnull);
if(NS_FAILED(rv)) {
Done(PR_FALSE);
return rv;
}
// Bind
rv = operation->SimpleBind(mAuthPswd);
mState = mAuthPswd.IsEmpty() ? kAnonymousBinding : kAuthenticatedBinding;
if(NS_FAILED(rv)) {
Done(PR_FALSE);
}
return rv;
}
NS_IMETHODIMP nsAbLDAPProcessReplicationData::OnLDAPMessage(nsILDAPMessage *aMessage)
{
NS_ENSURE_ARG_POINTER(aMessage);
if(!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
NS_ENSURE_ARG_POINTER(aMessage);
PRInt32 messageType;
nsresult rv = aMessage->GetType(&messageType);
if(NS_FAILED(rv)) {
#ifdef DEBUG_rdayal
printf("LDAP Replication : OnLDAPMessage : couldnot GetType \n");
#endif
Done(PR_FALSE);
return rv;
}
switch(messageType)
{
case nsILDAPMessage::RES_BIND:
rv = OnLDAPBind(aMessage);
break;
case nsILDAPMessage::RES_SEARCH_ENTRY:
rv = OnLDAPSearchEntry(aMessage);
break;
case nsILDAPMessage::RES_SEARCH_RESULT:
rv = OnLDAPSearchResult(aMessage);
break;
default:
// for messageTypes we do not handle return NS_OK to LDAP and move ahead.
rv = NS_OK;
break;
}
if (!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
PRInt32 messageType;
nsresult rv = aMessage->GetType(&messageType);
if (NS_FAILED(rv)) {
Done(PR_FALSE);
return rv;
}
switch (messageType)
{
case nsILDAPMessage::RES_BIND:
rv = OnLDAPMessageBind(aMessage);
if (NS_FAILED(rv))
rv = Abort();
break;
case nsILDAPMessage::RES_SEARCH_ENTRY:
rv = OnLDAPSearchEntry(aMessage);
break;
case nsILDAPMessage::RES_SEARCH_RESULT:
rv = OnLDAPSearchResult(aMessage);
break;
default:
// for messageTypes we do not handle return NS_OK to LDAP and move ahead.
rv = NS_OK;
break;
}
return rv;
}
NS_IMETHODIMP nsAbLDAPProcessReplicationData::Abort()
{
if(!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
#ifdef DEBUG_rdayal
printf ("ChangeLog Replication : ABORT called !!! \n");
#endif
nsCOMPtr<nsILDAPOperation> operation;
nsresult rv = mQuery->GetOperation(getter_AddRefs(operation));
if(operation && mState != kIdle)
{
rv = operation->AbandonExt();
if(NS_SUCCEEDED(rv))
mState = kIdle;
}
if(mReplicationDB && mDBOpen) {
mReplicationDB->ForceClosed(); // force close since we need to delete the file.
mDBOpen = PR_FALSE;
// delete the unsaved replication file
if(mReplicationFile) {
rv = mReplicationFile->Remove(PR_FALSE);
if(NS_SUCCEEDED(rv) && mDirectory) {
nsCAutoString fileName;
rv = mDirectory->GetReplicationFileName(fileName);
// now put back the backed up replicated file if aborted
if(NS_SUCCEEDED(rv) && mBackupReplicationFile)
rv = mBackupReplicationFile->MoveToNative(nsnull, fileName);
}
}
}
Done(PR_FALSE);
return rv;
}
// this should get the authDN from prefs and password from PswdMgr
NS_IMETHODIMP nsAbLDAPProcessReplicationData::PopulateAuthData()
{
if (!mDirectory)
if (!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
nsCAutoString authDn;
nsresult rv = mDirectory->GetAuthDn(authDn);
NS_ENSURE_SUCCESS(rv, rv);
nsresult rv = NS_OK;
mAuthDN.Assign(authDn);
if (mState != kIdle && mOperation) {
rv = mOperation->AbandonExt();
if (NS_SUCCEEDED(rv))
mState = kIdle;
}
nsCOMPtr <nsIPasswordManagerInternal> passwordMgrInt = do_GetService(NS_PASSWORDMANAGER_CONTRACTID, &rv);
if(NS_SUCCEEDED(rv) && passwordMgrInt) {
// Get the current server URI
nsCOMPtr<nsILDAPURL> url;
rv = mQuery->GetReplicationURL(getter_AddRefs(url));
if (NS_FAILED(rv))
return rv;
nsCAutoString serverUri;
rv = url->GetSpec(serverUri);
if (NS_FAILED(rv))
return rv;
if (mReplicationDB && mDBOpen) {
// force close since we need to delete the file.
mReplicationDB->ForceClosed();
mDBOpen = PR_FALSE;
nsCAutoString hostFound;
nsAutoString userNameFound;
nsAutoString passwordFound;
// Get password entry corresponding to the server URI we are passing in.
rv = passwordMgrInt->FindPasswordEntry(serverUri, EmptyString(),
EmptyString(), hostFound,
userNameFound, passwordFound);
if (NS_FAILED(rv))
return rv;
if (!passwordFound.IsEmpty())
CopyUTF16toUTF8(passwordFound, mAuthPswd);
// delete the unsaved replication file
if (mReplicationFile) {
rv = mReplicationFile->Remove(PR_FALSE);
if (NS_SUCCEEDED(rv) && mDirectory) {
nsCAutoString fileName;
rv = mDirectory->GetReplicationFileName(fileName);
// now put back the backed up replicated file if aborted
if (NS_SUCCEEDED(rv) && mBackupReplicationFile)
rv = mBackupReplicationFile->MoveToNative(nsnull, fileName);
}
}
}
return rv;
Done(PR_FALSE);
return rv;
}
nsresult nsAbLDAPProcessReplicationData::OnLDAPBind(nsILDAPMessage *aMessage)
nsresult nsAbLDAPProcessReplicationData::DoTask()
{
NS_ENSURE_ARG_POINTER(aMessage);
if(!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
PRInt32 errCode;
nsresult rv = aMessage->GetErrorCode(&errCode);
if(NS_FAILED(rv)) {
Done(PR_FALSE);
return rv;
}
if(errCode != nsILDAPErrors::SUCCESS) {
Done(PR_FALSE);
return NS_ERROR_FAILURE;
}
rv = OpenABForReplicatedDir(PR_TRUE);
if(NS_FAILED(rv)) {
// do not call done here since it is called by OpenABForReplicationDir
return rv;
}
rv = mQuery->QueryAllEntries();
if(NS_FAILED(rv)) {
Done(PR_FALSE);
return rv;
}
mState = kReplicatingAll;
if(mListener && NS_SUCCEEDED(rv))
mListener->OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_START, PR_TRUE);
if (!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
nsresult rv = OpenABForReplicatedDir(PR_TRUE);
if (NS_FAILED(rv))
// do not call done here since it is called by OpenABForReplicationDir
return rv;
mOperation = do_CreateInstance(NS_LDAPOPERATION_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsILDAPMessageListener> proxyListener;
rv = NS_GetProxyForObject(NS_PROXY_TO_MAIN_THREAD,
NS_GET_IID(nsILDAPMessageListener),
NS_STATIC_CAST(nsILDAPMessageListener*, this),
NS_PROXY_SYNC | NS_PROXY_ALWAYS,
getter_AddRefs(proxyListener));
NS_ENSURE_SUCCESS(rv, rv);
rv = mOperation->Init(mConnection, proxyListener, nsnull);
NS_ENSURE_SUCCESS(rv, rv);
// get the relevant attributes associated with the directory server url
nsCAutoString urlFilter;
rv = mDirectoryUrl->GetFilter(urlFilter);
if (NS_FAILED(rv))
return rv;
nsCAutoString dn;
rv = mDirectoryUrl->GetDn(dn);
if (NS_FAILED(rv))
return rv;
if (dn.IsEmpty())
return NS_ERROR_UNEXPECTED;
PRInt32 scope;
rv = mDirectoryUrl->GetScope(&scope);
if (NS_FAILED(rv))
return rv;
CharPtrArrayGuard attributes;
rv = mDirectoryUrl->GetAttributes(attributes.GetSizeAddr(),
attributes.GetArrayAddr());
if (NS_FAILED(rv))
return rv;
mState = kReplicatingAll;
if (mListener && NS_SUCCEEDED(rv))
mListener->OnStateChange(nsnull, nsnull,
nsIWebProgressListener::STATE_START, PR_TRUE);
return mOperation->SearchExt(dn, scope, urlFilter,
attributes.GetSize(), attributes.GetArray(),
0, 0);
}
nsresult nsAbLDAPProcessReplicationData::OnLDAPSearchEntry(nsILDAPMessage *aMessage)
{
NS_ENSURE_ARG_POINTER(aMessage);
if(!mInitialized)
if (!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
// since this runs on the main thread and is single threaded, this will
// take care of entries returned by LDAP Connection thread after Abort.
if(!mReplicationDB || !mDBOpen)
if (!mReplicationDB || !mDBOpen)
return NS_ERROR_FAILURE;
nsresult rv = NS_OK;
nsresult rv = NS_OK;
// Although we would may naturally create an nsIAbLDAPCard here, we don't
// need to as we are writing this straight to the database, so just create
// the database version instead.
nsCOMPtr<nsIAbMDBCard> dbCard(do_CreateInstance(NS_ABMDBCARD_CONTRACTID, &rv));
if(NS_FAILED(rv)) {
Abort();
return rv;
}
// Although we would may naturally create an nsIAbLDAPCard here, we don't
// need to as we are writing this straight to the database, so just create
// the database version instead.
nsCOMPtr<nsIAbMDBCard> dbCard(do_CreateInstance(NS_ABMDBCARD_CONTRACTID,
&rv));
if (NS_FAILED(rv)) {
Abort();
return rv;
}
nsCOMPtr<nsIAbCard> newCard(do_QueryInterface(dbCard, &rv));
if(NS_FAILED(rv)) {
Abort();
return rv;
}
nsCOMPtr<nsIAbCard> newCard(do_QueryInterface(dbCard, &rv));
if (NS_FAILED(rv)) {
Abort();
return rv;
}
rv = mAttrMap->SetCardPropertiesFromLDAPMessage(aMessage, newCard);
if (NS_FAILED(rv))
@ -403,7 +336,7 @@ nsresult nsAbLDAPProcessReplicationData::OnLDAPSearchEntry(nsILDAPMessage *aMess
mCount ++;
if(!(mCount % 10)) // inform the listener every 10 entries
if (mListener && !(mCount % 10)) // inform the listener every 10 entries
{
mListener->OnProgressChange(nsnull,nsnull,mCount, -1, mCount, -1);
// in case if the LDAP Connection thread is starved and causes problem
@ -614,8 +547,8 @@ void nsAbLDAPProcessReplicationData::Done(PRBool aSuccess)
if(mListener)
mListener->OnStateChange(nsnull, nsnull, nsIWebProgressListener::STATE_STOP, aSuccess);
// since this is called when all is done here, either on success, failure or abort
// releas the query now.
// since this is called when all is done here, either on success,
// failure or abort release the query now.
mQuery = nsnull;
}

Просмотреть файл

@ -43,6 +43,7 @@
#include "nsIAbLDAPReplicationData.h"
#include "nsIWebProgressListener.h"
#include "nsIAbLDAPReplicationQuery.h"
#include "nsAbLDAPListenerBase.h"
#include "nsIAddrDatabase.h"
#include "nsILocalFile.h"
#include "nsDirPrefs.h"
@ -50,21 +51,26 @@
#include "nsIAbLDAPDirectory.h"
#include "nsString.h"
class nsAbLDAPProcessReplicationData : public nsIAbLDAPProcessReplicationData
class nsAbLDAPProcessReplicationData : public nsIAbLDAPProcessReplicationData,
public nsAbLDAPListenerBase
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIABLDAPPROCESSREPLICATIONDATA
NS_DECL_NSILDAPMESSAGELISTENER
nsAbLDAPProcessReplicationData();
virtual ~nsAbLDAPProcessReplicationData();
// nsILDAPMessageListener
NS_IMETHOD OnLDAPMessage(nsILDAPMessage *aMessage);
protected :
nsCOMPtr<nsIAbLDAPReplicationQuery> mQuery;
virtual nsresult DoTask();
// pointer to the interfaces used by this object
nsCOMPtr<nsIWebProgressListener> mListener;
// pointer to the query to call back to once we've finished
nsCOMPtr<nsIAbLDAPReplicationQuery> mQuery;
nsCOMPtr<nsIAddrDatabase> mReplicationDB;
nsCOMPtr <nsILocalFile> mReplicationFile;
@ -78,11 +84,9 @@ protected :
PRBool mInitialized;
nsCOMPtr<nsIAbLDAPDirectory> mDirectory;
nsCString mAuthDN; // authDN of the user
nsCString mAuthPswd; // pswd of the authDN user
nsCOMPtr<nsILDAPOperation> mOperation;
nsCOMPtr<nsIAbLDAPAttributeMap> mAttrMap; // maps ab properties to ldap attrs
virtual nsresult OnLDAPBind(nsILDAPMessage *aMessage);
virtual nsresult OnLDAPSearchEntry(nsILDAPMessage *aMessage);
virtual nsresult OnLDAPSearchResult(nsILDAPMessage *aMessage);

Просмотреть файл

@ -51,7 +51,8 @@
#include "prmem.h"
#include "nsIRDFService.h"
NS_IMPL_ISUPPORTS1(nsAbLDAPReplicationQuery, nsIAbLDAPReplicationQuery)
NS_IMPL_THREADSAFE_ISUPPORTS1(nsAbLDAPReplicationQuery,
nsIAbLDAPReplicationQuery)
nsAbLDAPReplicationQuery::nsAbLDAPReplicationQuery()
: mInitialized(PR_FALSE)
@ -67,14 +68,14 @@ nsresult nsAbLDAPReplicationQuery::InitLDAPData()
nsCAutoString resourceURI(kLDAPDirectoryRoot);
resourceURI.Append(mDirPrefName);
nsCOMPtr<nsIRDFResource> resource;
rv = rdfService->GetResource(resourceURI, getter_AddRefs(resource));
NS_ENSURE_SUCCESS(rv, rv);
mDirectory = do_QueryInterface(resource, &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCAutoString fileName;
rv = mDirectory->GetReplicationFileName(fileName);
NS_ENSURE_SUCCESS(rv, rv);
@ -102,21 +103,12 @@ nsresult nsAbLDAPReplicationQuery::InitLDAPData()
rv = mDirectory->SetReplicationFileName(fileName);
NS_ENSURE_SUCCESS(rv, rv);
mURL = do_CreateInstance(NS_LDAPURL_CONTRACTID, &rv);
if (NS_FAILED(rv))
return rv;
nsCOMPtr<nsIAbDirectory> abDirectory(do_QueryInterface(mDirectory, &rv));
rv = mDirectory->GetLDAPURL(getter_AddRefs(mURL));
NS_ENSURE_SUCCESS(rv, rv);
nsCAutoString uri;
rv = abDirectory->GetURI(uri);
rv = mDirectory->GetAuthDn(mLogin);
NS_ENSURE_SUCCESS(rv, rv);
rv = mURL->SetSpec(uri);
if (NS_FAILED(rv))
return rv;
mConnection = do_CreateInstance(NS_LDAPCONNECTION_CONTRACTID, &rv);
if (NS_FAILED(rv))
return rv;
@ -126,40 +118,32 @@ nsresult nsAbLDAPReplicationQuery::InitLDAPData()
return rv;
}
nsresult nsAbLDAPReplicationQuery::CreateNewLDAPOperation()
nsresult nsAbLDAPReplicationQuery::ConnectToLDAPServer()
{
nsresult rv;
nsCOMPtr <nsILDAPMessageListener> oldListener;
mOperation->GetMessageListener(getter_AddRefs(oldListener));
// release old and create a new instance
mOperation = do_CreateInstance(NS_LDAPOPERATION_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
return mOperation->Init(mConnection, oldListener, nsnull);
}
NS_IMETHODIMP nsAbLDAPReplicationQuery::ConnectToLDAPServer(nsILDAPURL *aURL, const nsACString & aAuthDN)
{
NS_ENSURE_ARG_POINTER(aURL);
if (!mInitialized)
if (!mInitialized || !mURL)
return NS_ERROR_NOT_INITIALIZED;
nsCAutoString host;
nsresult rv = aURL->GetHost(host);
nsresult rv = mURL->GetHost(host);
if (NS_FAILED(rv))
return rv;
if (host.IsEmpty())
return NS_ERROR_UNEXPECTED;
PRInt32 port;
rv = aURL->GetPort(&port);
rv = mURL->GetPort(&port);
if (NS_FAILED(rv))
return rv;
if (!port)
return NS_ERROR_UNEXPECTED;
PRUint32 options;
rv = aURL->GetOptions(&options);
rv = mURL->GetOptions(&options);
if (NS_FAILED(rv))
return NS_ERROR_UNEXPECTED;
nsCOMPtr<nsILDAPMessageListener> mDp = do_QueryInterface(mDataProcessor,
&rv);
if (NS_FAILED(rv))
return NS_ERROR_UNEXPECTED;
@ -167,7 +151,7 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::ConnectToLDAPServer(nsILDAPURL *aURL, co
nsCOMPtr<nsILDAPMessageListener> listener;
rv = NS_GetProxyForObject(NS_PROXY_TO_CURRENT_THREAD,
NS_GET_IID(nsILDAPMessageListener),
NS_STATIC_CAST(nsILDAPMessageListener*, mDataProcessor),
mDp,
NS_PROXY_SYNC | NS_PROXY_ALWAYS,
getter_AddRefs(listener));
if (!listener)
@ -176,20 +160,9 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::ConnectToLDAPServer(nsILDAPURL *aURL, co
// this could be a rebind call
PRInt32 replicationState = nsIAbLDAPProcessReplicationData::kIdle;
rv = mDataProcessor->GetReplicationState(&replicationState);
if(NS_FAILED(rv))
if (NS_FAILED(rv) ||
replicationState != nsIAbLDAPProcessReplicationData::kIdle)
return rv;
if((replicationState != nsIAbLDAPProcessReplicationData::kIdle))
{
// release old and create a new instance
mConnection = do_CreateInstance(NS_LDAPCONNECTION_CONTRACTID, &rv);
if(NS_FAILED(rv))
return rv;
// release old and create a new instance
mOperation = do_CreateInstance(NS_LDAPOPERATION_CONTRACTID, &rv);
if(NS_FAILED(rv))
return rv;
}
PRUint32 protocolVersion;
rv = mDirectory->GetProtocolVersion(&protocolVersion);
@ -198,7 +171,7 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::ConnectToLDAPServer(nsILDAPURL *aURL, co
// initialize the LDAP connection
return mConnection->Init(host.get(), port,
(options & nsILDAPURL::OPT_SECURE) ? PR_TRUE : PR_FALSE,
aAuthDN, listener, nsnull, protocolVersion);
mLogin, listener, nsnull, protocolVersion);
}
NS_IMETHODIMP nsAbLDAPReplicationQuery::Init(const nsACString & aPrefName, nsIWebProgressListener *aProgressListener)
@ -212,55 +185,21 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::Init(const nsACString & aPrefName, nsIWe
if (NS_FAILED(rv))
return rv;
mDataProcessor = do_CreateInstance(NS_ABLDAP_PROCESSREPLICATIONDATA_CONTRACTID, &rv);
mDataProcessor =
do_CreateInstance(NS_ABLDAP_PROCESSREPLICATIONDATA_CONTRACTID, &rv);
if (NS_FAILED(rv))
return rv;
// 'this' initialized
mInitialized = PR_TRUE;
return mDataProcessor->Init(this, aProgressListener);
return mDataProcessor->Init(mDirectory, mConnection, mURL, this,
aProgressListener);
}
NS_IMETHODIMP nsAbLDAPReplicationQuery::DoReplicationQuery()
{
return ConnectToLDAPServer(mURL, EmptyCString());
}
NS_IMETHODIMP nsAbLDAPReplicationQuery::QueryAllEntries()
{
if (!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
// get the search filter associated with the directory server url;
//
nsCAutoString urlFilter;
nsresult rv = mURL->GetFilter(urlFilter);
if (NS_FAILED(rv))
return rv;
nsCAutoString dn;
rv = mURL->GetDn(dn);
if (NS_FAILED(rv))
return rv;
if (dn.IsEmpty())
return NS_ERROR_UNEXPECTED;
PRInt32 scope;
rv = mURL->GetScope(&scope);
if (NS_FAILED(rv))
return rv;
CharPtrArrayGuard attributes;
rv = mURL->GetAttributes(attributes.GetSizeAddr(), attributes.GetArrayAddr());
if (NS_FAILED(rv))
return rv;
rv = CreateNewLDAPOperation();
NS_ENSURE_SUCCESS(rv, rv);
return mOperation->SearchExt(dn, scope, urlFilter,
attributes.GetSize(), attributes.GetArray(),
0, 0);
return ConnectToLDAPServer();
}
NS_IMETHODIMP nsAbLDAPReplicationQuery::CancelQuery()
@ -275,7 +214,7 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::Done(PRBool aSuccess)
{
if (!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
nsresult rv = NS_OK;
nsCOMPtr<nsIAbLDAPReplicationService> replicationService =
do_GetService(NS_ABLDAP_REPLICATIONSERVICE_CONTRACTID, &rv);
@ -284,46 +223,3 @@ NS_IMETHODIMP nsAbLDAPReplicationQuery::Done(PRBool aSuccess)
return rv;
}
NS_IMETHODIMP nsAbLDAPReplicationQuery::GetOperation(nsILDAPOperation * *aOperation)
{
NS_ENSURE_ARG_POINTER(aOperation);
if (!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
NS_IF_ADDREF(*aOperation = mOperation);
return NS_OK;
}
NS_IMETHODIMP nsAbLDAPReplicationQuery::GetConnection(nsILDAPConnection * *aConnection)
{
NS_ENSURE_ARG_POINTER(aConnection);
if (!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
NS_IF_ADDREF(*aConnection = mConnection);
return NS_OK;
}
NS_IMETHODIMP nsAbLDAPReplicationQuery::GetReplicationURL(nsILDAPURL * *aReplicationURL)
{
NS_ENSURE_ARG_POINTER(aReplicationURL);
if (!mInitialized)
return NS_ERROR_NOT_INITIALIZED;
NS_IF_ADDREF(*aReplicationURL = mURL);
return NS_OK;
}
NS_IMETHODIMP nsAbLDAPReplicationQuery::GetLDAPDirectory(nsIAbLDAPDirectory * *aDirectory)
{
NS_ENSURE_ARG_POINTER(aDirectory);
NS_IF_ADDREF(*aDirectory = mDirectory);
return NS_OK;
}

Просмотреть файл

@ -57,7 +57,7 @@ public:
nsAbLDAPReplicationQuery();
nsresult InitLDAPData();
nsresult CreateNewLDAPOperation();
nsresult ConnectToLDAPServer();
protected :
// pointer to interfaces used by this object
@ -68,8 +68,9 @@ protected :
nsCOMPtr<nsIAbLDAPProcessReplicationData> mDataProcessor;
PRBool mInitialized;
nsCString mDirPrefName;
PRBool mInitialized;
nsCString mDirPrefName;
nsCString mLogin;
};
#endif // nsAbLDAPReplicationQuery_h__