summaryrefslogtreecommitdiff
path: root/extensions/source/config
diff options
context:
space:
mode:
authorRĂ¼diger Timm <rt@openoffice.org>2004-10-22 07:06:00 +0000
committerRĂ¼diger Timm <rt@openoffice.org>2004-10-22 07:06:00 +0000
commit0103b12a13b9277f341c41fa7873b43effd02c38 (patch)
tree19370a76f10af8488d067a977a47eb34169886f3 /extensions/source/config
parentf15e593097c3f941efaa3d3fc456e6cd87c28051 (diff)
INTEGRATION: CWS cfgldapfix (1.3.12); FILE MERGED
2004/10/13 12:59:59 jb 1.3.12.1: #i34115# Thorough review of the LDAP backend; Fixed some problems in initialization, error handling, as well as resource leaks and exception safety issues
Diffstat (limited to 'extensions/source/config')
-rw-r--r--extensions/source/config/ldap/ldapuserprofilebe.cxx346
-rw-r--r--extensions/source/config/ldap/ldapuserprofilebe.hxx51
2 files changed, 191 insertions, 206 deletions
diff --git a/extensions/source/config/ldap/ldapuserprofilebe.cxx b/extensions/source/config/ldap/ldapuserprofilebe.cxx
index e73edf6ba722..69a41c354e25 100644
--- a/extensions/source/config/ldap/ldapuserprofilebe.cxx
+++ b/extensions/source/config/ldap/ldapuserprofilebe.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: ldapuserprofilebe.cxx,v $
*
- * $Revision: 1.3 $
+ * $Revision: 1.4 $
*
- * last change: $Author: hr $ $Date: 2004-09-08 17:49:43 $
+ * last change: $Author: rt $ $Date: 2004-10-22 08:05:46 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -59,9 +59,8 @@
*
************************************************************************/
-#ifndef EXTENSIONS_CONFIG_LDAP_LDAPUSERPROFILEBE_HXX_
#include "ldapuserprofilebe.hxx"
-#endif
+
#ifndef EXTENSIONS_CONFIG_LDAP_LADPUSERPROFILELAYER_HXX_
#include "ldapuserprofilelayer.hxx"
#endif
@@ -84,6 +83,10 @@
#include <rtl/byteseq.h>
#endif
+#ifndef INCLUDED_RTL_INSTANCE_HXX_
+#include <rtl/instance.hxx>
+#endif
+
#ifndef _COM_SUN_STAR_BEANS_NAMEDVALUE_HPP_
#include <com/sun/star/beans/NamedValue.hpp>
#endif
@@ -118,6 +121,7 @@ static void checkIOError(
}
//------------------------------------------------------------------------------
+#if 0
static rtl::OUString getCurrentModuleDirectory() // URL excluding terminating slash
{
rtl::OUString aFileURL;
@@ -132,115 +136,128 @@ static rtl::OUString getCurrentModuleDirectory() // URL excluding terminating sl
return aFileURL.copy(0, aFileURL.lastIndexOf('/') );
}
-
-bool LdapUserProfileBe::mCanReadConfiguration = true ;
-osl::Mutex LdapUserProfileBe::mReadConfigurationLock ;
-
+#endif
//------------------------------------------------------------------------------
-LdapUserProfileBe::LdapUserProfileBe(
- const uno::Reference<uno::XComponentContext>& xContext)
- throw (backend::BackendAccessException,
- backend::BackendSetupException)
- : BackendBase(mMutex),
- mFactory(xContext->getServiceManager(),uno::UNO_QUERY_THROW),
- mContext(xContext),
- mUserProfileMap(),
- mLdapConnection()
+LdapUserProfileBe::LdapUserProfileBe( const uno::Reference<uno::XComponentContext>& xContext)
+// throw (backend::BackendAccessException, backend::BackendSetupException, RuntimeException)
+: LdapProfileMutexHolder(),
+ BackendBase(mMutex),
+ mFactory(xContext->getServiceManager(),uno::UNO_QUERY_THROW),
+ mContext(xContext),
+ mLdapSource( new LdapUserProfileSource ),
+ mLoggedOnUser(),
+ mUserDN()
{
LdapDefinition aDefinition;
- bool result = false ;
// This whole rigmarole is to prevent an infinite recursion where reading
// the configuration for the backend would create another instance of the
// backend, which would try and read the configuration which would...
- mReadConfigurationLock.acquire() ;
- try
{
- if (mCanReadConfiguration)
+ osl::Mutex & aInitMutex = rtl::Static< osl::Mutex, LdapUserProfileBe >::get();
+ osl::MutexGuard aInitGuard(aInitMutex);
+
+ static bool bReentrantCall; // = false
+ OSL_ENSURE(!bReentrantCall, "configuration: Ldap Backend constructor called reentrantly - probably a registration error.");
+
+ if (!bReentrantCall)
+ try
{
- mCanReadConfiguration = false ;
- result = isLdapConfigured(aDefinition) ;
- mCanReadConfiguration = true ;
+ bReentrantCall = true ;
+ if (! readLdapConfiguration(aDefinition) )
+ {
+ throw backend::BackendSetupException(
+ rtl::OUString::createFromAscii("LdapUserProfileBe- LDAP not configured"),
+ NULL, uno::Any());
+ }
+
+ bReentrantCall = false ;
+ }
+ catch (uno::Exception&)
+ {
+ bReentrantCall = false;
+ throw;
}
}
- catch (uno::Exception& exception)
+
+ try
{
- mReadConfigurationLock.release() ;
- throw ;
+ mLdapSource->mConnection.connectSimple(aDefinition);
+ //Set the UserDN
+ mUserDN = mLdapSource->mConnection.findUserDn(
+ rtl::OUStringToOString(mLoggedOnUser, RTL_TEXTENCODING_ASCII_US));
}
- mReadConfigurationLock.release() ;
- if (result)
+ catch (lang::IllegalArgumentException& exception)
{
- try
- {
- mLdapConnection.connectSimple(aDefinition);
- //Set the UserDN
- mUserDN = mLdapConnection.findUserDn(
- rtl::OUStringToOString(mLoggedOnUser, RTL_TEXTENCODING_ASCII_US));
- }
- catch (lang::IllegalArgumentException& exception)
- {
- throw backend::BackendSetupException(exception.Message, NULL,
- uno::makeAny(exception)) ;
- }
- catch (ldap::LdapConnectionException& exception)
- {
- throw backend::BackendSetupException(exception.Message, NULL,
- uno::makeAny(exception)) ;
- }
- catch(ldap::LdapGenericException& exception)
- {
- mapGenericException(exception) ;
- }
- initializeMappingTable(
- rtl::OStringToOUString(aDefinition.mMapping,
- RTL_TEXTENCODING_ASCII_US));
+ throw backend::BackendSetupException(exception.Message, NULL,
+ uno::makeAny(exception)) ;
}
- else
+ catch (ldap::LdapConnectionException& exception)
{
- throw backend::BackendSetupException(
- rtl::OUString::createFromAscii("LdapUserProfileBe- LDAP not configured"),
- NULL, uno::Any());
+ throw backend::CannotConnectException(exception.Message, NULL,
+ uno::makeAny(exception)) ;
}
+ catch(ldap::LdapGenericException& exception)
+ {
+ mapGenericException(exception) ;
+ }
+
+ initializeMappingTable(
+ rtl::OStringToOUString(aDefinition.mMapping,
+ RTL_TEXTENCODING_ASCII_US));
+
+ OSL_POSTCOND(mLdapSource->mConnection.isConnected(),"Erroneously constructed a LdapUserProfileBackend without a LDAP connection");
}
//------------------------------------------------------------------------------
-LdapUserProfileBe::~LdapUserProfileBe(void) {
+LdapUserProfileBe::~LdapUserProfileBe()
+{
}
//------------------------------------------------------------------------------
-void LdapUserProfileBe::initializeMappingTable(
- const rtl::OUString& aFileMapName)
+void LdapUserProfileBe::initializeMappingTable(const rtl::OUString& aFileMapName)
{
- rtl::OUString aMappingFileUrl;
- getMappingFileUrl(aMappingFileUrl,aFileMapName );
+ rtl::OUString aMappingFileUrl = getMappingFileUrl(aFileMapName );
osl::File aFile (aMappingFileUrl);
+ checkIOError( aFile.open(OpenFlag_Read), aMappingFileUrl);
- checkIOError( aFile.open (OpenFlag_Read),aMappingFileUrl);
- checkIOError( aFile.setPos (Pos_End, 0),aMappingFileUrl);
+ sal_uInt64 nFileLength = 0;
+ checkIOError( aFile.getSize(nFileLength), aMappingFileUrl);
- sal_uInt64 nLength = 0;
- checkIOError( aFile.getPos (nLength),aMappingFileUrl);
- nLength = sal_uInt32(nLength);
+ sal_uInt32 nDataLength = sal_uInt32(nFileLength);
+ if (nDataLength != nFileLength)
+ {
+ throw backend::BackendSetupException(rtl::OUString::createFromAscii
+ ("LdapUserProfileBe - can not read entire Mapping File: too big"),
+ NULL, uno::Any());
+ }
+
+ struct RawBuffer
+ {
+ RawBuffer(sal_Size size) : data(rtl_allocateMemory(size)) {}
+ ~RawBuffer() { rtl_freeMemory(data); }
+
+ void * data;
+ };
+ RawBuffer buffer( nDataLength );
- checkIOError( aFile.setPos (Pos_Absolut, 0), aMappingFileUrl);
- sal_uInt8 *pBuffer = static_cast<sal_uInt8*>(rtl_allocateMemory ( sal_uInt32(nLength)));
sal_uInt64 nRead = 0;
- osl::File::RC result = aFile.read (pBuffer, nLength, nRead);
- if (result != osl::FileBase::E_None)
+ osl::File::RC result = aFile.read (static_cast<sal_uInt8*>(buffer.data), nDataLength, nRead);
+ if (result != osl::File::E_None)
{
- rtl_freeMemory (pBuffer);
checkIOError( result, aMappingFileUrl );
+ OSL_ASSERT(!"unreached");
}
- if (nRead != nLength)
+
+ if (nRead != nDataLength)
{
throw backend::BackendSetupException(rtl::OUString::createFromAscii
("LdapUserProfileBe - can not read entire Mapping File"),
NULL, uno::Any());
}
- rtl::OString aStrBuffer ( reinterpret_cast<char*>(pBuffer),sal_uInt32(nLength));
- mUserProfileMap.source(aStrBuffer);
+ rtl::OString aStrBuffer ( static_cast<char*>(buffer.data), sal_uInt32(nDataLength) );
+ mLdapSource->mProfileMap.source(aStrBuffer);
}
//------------------------------------------------------------------------------
@@ -252,23 +269,25 @@ static const rtl::OUString kMappingUrl(
RTL_CONSTASCII_USTRINGPARAM("/modules/com.sun.star.configuration/bootstrap/LdapMappingUrl"));
-static const rtl::OUString kMappingDirectory(RTL_CONSTASCII_USTRINGPARAM(
- "/share/registry/ldap"));
static const sal_Unicode kPathSeparator = '/' ;
static const rtl::OUString kBootstrapContextSingletonName(
RTL_CONSTASCII_USTRINGPARAM(
"/singletons/com.sun.star.configuration.bootstrap.theBootstrapContext"));
-void LdapUserProfileBe::getMappingFileUrl(
- rtl::OUString& aFileUrl, const rtl::OUString& aFileMapName)const
+rtl::OUString LdapUserProfileBe::getMappingFileUrl(const rtl::OUString& aFileMapName) const
{
uno::Any aContext = mContext->getValueByName(kBootstrapContextSingletonName);
uno::Reference<uno::XComponentContext> aBootStrapContext;
- aContext >>= aBootStrapContext;
- aBootStrapContext->getValueByName(kMappingUrl) >>= aFileUrl;
+
+ rtl::OUString aFileUrl;
+ if (aContext >>= aBootStrapContext)
+ aBootStrapContext->getValueByName(kMappingUrl) >>= aFileUrl;
if (aFileUrl.getLength() == 0 )
{
+#if 0
+ static const rtl::OUString kMappingDirectory(RTL_CONSTASCII_USTRINGPARAM( "/share/registry/ldap"));
+
rtl::OUString aModuleUrl = getCurrentModuleDirectory();
sal_Int32 nIndex = aModuleUrl.lastIndexOf('/');
if (nIndex == 0)
@@ -280,14 +299,18 @@ void LdapUserProfileBe::getMappingFileUrl(
rtl::OUString aMappingFileUrl = aModuleUrl.copy(0, nIndex);
aMappingFileUrl += kMappingDirectory;
aFileUrl = aMappingFileUrl;
-
+#else
+ throw backend::BackendSetupException(rtl::OUString::createFromAscii
+ ("LdapUserProfileBe - can not locate Mapping File"),
+ NULL, uno::Any());
+#endif
}
rtl::OUStringBuffer sFileBuffer(aFileUrl);
sFileBuffer.append(kPathSeparator);
sFileBuffer.append (aFileMapName);
sFileBuffer.append(kMappingFileSuffix);
- aFileUrl = sFileBuffer.makeStringAndClear();
+ return sFileBuffer.makeStringAndClear();
}
//------------------------------------------------------------------------------
void LdapUserProfileBe::mapGenericException(ldap::LdapGenericException& aException)
@@ -311,105 +334,81 @@ void LdapUserProfileBe::mapGenericException(ldap::LdapGenericException& aExcepti
}
}
//------------------------------------------------------------------------------
-static const rtl::OUString kConfigurationProviderService(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.ConfigurationProvider")) ;
-static const rtl::OUString kReadOnlyViewService(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.configuration.ConfigurationAccess")) ;
-static const rtl::OUString kComponent(
- RTL_CONSTASCII_USTRINGPARAM(
- "org.openoffice.LDAP/UserDirectory"));
-static const rtl::OUString kServerDefiniton(RTL_CONSTASCII_USTRINGPARAM
- ("ServerDefinition"));
-static const rtl::OUString kServer(RTL_CONSTASCII_USTRINGPARAM
- ("Server"));
-static const rtl::OUString kPort(RTL_CONSTASCII_USTRINGPARAM(
- "Port"));
-static const rtl::OUString kBaseDN(RTL_CONSTASCII_USTRINGPARAM(
- "BaseDN"));
-static const rtl::OUString kUser(RTL_CONSTASCII_USTRINGPARAM(
- "SearchUser"));
-static const rtl::OUString kPassword(RTL_CONSTASCII_USTRINGPARAM(
- "SearchPassword"));
-static const rtl::OUString kUserObjectClass(RTL_CONSTASCII_USTRINGPARAM(
- "UserObjectClass"));
-static const rtl::OUString kUserUniqueAttr(RTL_CONSTASCII_USTRINGPARAM(
- "UserUniqueAttribute"));
-static const rtl::OUString kMapping(RTL_CONSTASCII_USTRINGPARAM(
- "Mapping"));
-static const rtl::OString kDefaultMappingFile("oo-ldap");
-
-bool LdapUserProfileBe::isLdapConfigured(LdapDefinition& aDefinition)
+
+bool LdapUserProfileBe::readLdapConfiguration(LdapDefinition& aDefinition)
{
+ const rtl::OUString kConfigurationProviderService( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationProvider")) ;
+ const rtl::OUString kReadOnlyViewService( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationAccess")) ;
+ const rtl::OUString kComponent( RTL_CONSTASCII_USTRINGPARAM("org.openoffice.LDAP/UserDirectory"));
+ const rtl::OUString kServerDefiniton(RTL_CONSTASCII_USTRINGPARAM ("ServerDefinition"));
+ const rtl::OUString kServer(RTL_CONSTASCII_USTRINGPARAM ("Server"));
+ const rtl::OUString kPort(RTL_CONSTASCII_USTRINGPARAM("Port"));
+ const rtl::OUString kBaseDN(RTL_CONSTASCII_USTRINGPARAM("BaseDN"));
+ const rtl::OUString kUser(RTL_CONSTASCII_USTRINGPARAM("SearchUser"));
+ const rtl::OUString kPassword(RTL_CONSTASCII_USTRINGPARAM("SearchPassword"));
+ const rtl::OUString kUserObjectClass(RTL_CONSTASCII_USTRINGPARAM("UserObjectClass"));
+ const rtl::OUString kUserUniqueAttr(RTL_CONSTASCII_USTRINGPARAM("UserUniqueAttribute"));
+ const rtl::OUString kMapping(RTL_CONSTASCII_USTRINGPARAM("Mapping"));
+ const rtl::OString kDefaultMappingFile("oo-ldap");
uno::Reference< XInterface > xIface;
try
{
- uno::Reference< lang::XMultiServiceFactory > xCfgProvider
- ( mFactory->createInstance(kConfigurationProviderService), uno::UNO_QUERY);
- OSL_ASSERT(xCfgProvider.is());
+ uno::Reference< lang::XMultiServiceFactory > xCfgProvider(
+ mFactory->createInstance(kConfigurationProviderService),
+ uno::UNO_QUERY);
+ OSL_ENSURE(xCfgProvider.is(),"LdapUserProfileBe: could not create the configuration provider");
if (!xCfgProvider.is())
- {
- throw backend::BackendSetupException(
- rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
- "LdapUserProfileBe: could not create the configuration provider")),
- NULL, uno::Any()) ;
- }
- using namespace css::beans;
+ return false;
- uno::Sequence< uno::Any > aArgs(1);
- aArgs[0] <<= kComponent;
+ css::beans::NamedValue aPath(rtl::OUString::createFromAscii("nodepath"), uno::makeAny(kComponent) );
- NamedValue aPath (rtl::OUString::createFromAscii("nodepath"), aArgs[0]);
+ uno::Sequence< uno::Any > aArgs(1);
aArgs[0] <<= aPath;
- xIface = xCfgProvider->createInstanceWithArguments
- (kReadOnlyViewService,aArgs);
- }
- catch(uno::Exception& e)
- {
- OSL_ENSURE(false,"LdapUserProfileBe - Could not create Configuration Provider");
- return false;
- }
+ xIface = xCfgProvider->createInstanceWithArguments(kReadOnlyViewService, aArgs);
- uno::Reference<container::XNameAccess > xAccess(xIface, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess > xAccess(xIface, uno::UNO_QUERY_THROW);
+ xAccess->getByName(kServerDefiniton) >>= xIface;
- xAccess->getByName(kServerDefiniton) >>= xIface;
- uno::Reference<container::XNameAccess > xChildAccess(xIface, uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess > xChildAccess(xIface, uno::UNO_QUERY_THROW);
- if (!getLdapStringParam(xChildAccess, kServer, aDefinition.mServer))
- return false;
- if (!getLdapStringParam(xChildAccess, kBaseDN, aDefinition.mBaseDN))
- return false;
- aDefinition.mPort=0;
- xChildAccess->getByName(kPort) >>= aDefinition.mPort ;
- if (aDefinition.mPort == 0)
+ if (!getLdapStringParam(xChildAccess, kServer, aDefinition.mServer))
+ return false;
+ if (!getLdapStringParam(xChildAccess, kBaseDN, aDefinition.mBaseDN))
+ return false;
+
+ aDefinition.mPort=0;
+ xChildAccess->getByName(kPort) >>= aDefinition.mPort ;
+ if (aDefinition.mPort == 0)
+ return false;
+
+ if (!getLdapStringParam(xAccess, kUserObjectClass, aDefinition.mUserObjectClass))
+ return false;
+ if (!getLdapStringParam(xAccess, kUserUniqueAttr, aDefinition.mUserUniqueAttr))
+ return false;
+
+ getLdapStringParam(xAccess, kUser, aDefinition.mAnonUser);
+ getLdapStringParam(xAccess, kPassword, aDefinition.mAnonCredentials);
+
+ if (!getLdapStringParam(xAccess, kMapping, aDefinition.mMapping))
+ aDefinition.mMapping = kDefaultMappingFile;
+ }
+ catch (uno::Exception & e)
{
+ OSL_TRACE("LdapUserProfileBackend: access to configuration data failed: %s",
+ rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr() );
return false;
}
- if (!getLdapStringParam(xAccess, kUserObjectClass, aDefinition.mUserObjectClass))
- return false;
- if (!getLdapStringParam(xAccess, kUserUniqueAttr, aDefinition.mUserUniqueAttr))
- return false;
- getLdapStringParam(xAccess, kUser, aDefinition.mAnonUser);
- getLdapStringParam(xAccess, kPassword, aDefinition.mAnonCredentials);
- if (!getLdapStringParam(xAccess, kMapping, aDefinition.mMapping))
- {
- aDefinition.mMapping = kDefaultMappingFile;
- }
osl::Security aSecurityContext;
-
if (!aSecurityContext.getUserName(mLoggedOnUser))
- {
- OSL_TRACE("LdapUserProfileLayer::ReadData-could not get Logged on user from system");
- }
+ OSL_TRACE("LdapUserProfileBackend - could not get Logged on user from system");
+
sal_Int32 nIndex = mLoggedOnUser.indexOf('/');
- if (nIndex != 0)
- {
+ if (nIndex > 0)
mLoggedOnUser = mLoggedOnUser.copy(nIndex+1);
- }
+
//Remember to remove
OSL_TRACE("Logged on user is %s", rtl::OUStringToOString(mLoggedOnUser,RTL_TEXTENCODING_ASCII_US).getStr());
@@ -425,23 +424,25 @@ bool LdapUserProfileBe::getLdapStringParam(
rtl::OUString sParam;
xAccess->getByName(aLdapSetting) >>= sParam;
aServerParameter = rtl::OUStringToOString(sParam, RTL_TEXTENCODING_ASCII_US);
- if (aServerParameter.getLength()==0)
- {
- return false;
- }
- return true;
+
+ return aServerParameter.getLength() != 0;
}
//------------------------------------------------------------------------------
-static const rtl::OString kModificationAttribute = "modifyTimeStamp";
uno::Reference<backend::XLayer> SAL_CALL LdapUserProfileBe::getLayer(
const rtl::OUString& aComponent, const rtl::OUString& aTimestamp)
- throw (backend::BackendAccessException, lang::IllegalArgumentException)
+ throw (backend::BackendAccessException, lang::IllegalArgumentException,uno::RuntimeException)
{
- rtl::OString aTimeStamp = mLdapConnection.
+ OSL_PRECOND(mLdapSource->mConnection.isConnected(), "LdapUserProfileBackend invoked without a connection");
+ if (!mLdapSource->mConnection.isConnected())
+ return NULL;
+
+ const rtl::OString kModificationAttribute = "modifyTimeStamp";
+
+ rtl::OString aTimeStamp = mLdapSource->mConnection.
getSingleAttribute( mUserDN, kModificationAttribute);
return new LdapUserProfileLayer(
- mFactory, mLoggedOnUser, mUserProfileMap, mLdapConnection,
+ mFactory, mLoggedOnUser, mLdapSource,
rtl::OStringToOUString(aTimeStamp, RTL_TEXTENCODING_ASCII_US));
}
@@ -449,7 +450,7 @@ uno::Reference<backend::XLayer> SAL_CALL LdapUserProfileBe::getLayer(
uno::Reference<backend::XUpdatableLayer> SAL_CALL
LdapUserProfileBe::getUpdatableLayer(const rtl::OUString& aComponent)
throw (backend::BackendAccessException,lang::NoSupportException,
- lang::IllegalArgumentException)
+ lang::IllegalArgumentException,uno::RuntimeException)
{
throw lang::NoSupportException(
rtl::OUString::createFromAscii(
@@ -481,8 +482,7 @@ uno::Sequence<rtl::OUString> SAL_CALL LdapUserProfileBe::getLdapUserProfileBeSer
}
//------------------------------------------------------------------------------
-sal_Bool SAL_CALL LdapUserProfileBe::supportsService(
- const rtl::OUString& aServiceName)
+sal_Bool SAL_CALL LdapUserProfileBe::supportsService(const rtl::OUString& aServiceName)
throw (uno::RuntimeException)
{
uno::Sequence< rtl::OUString > const svc = getLdapUserProfileBeServiceNames();
diff --git a/extensions/source/config/ldap/ldapuserprofilebe.hxx b/extensions/source/config/ldap/ldapuserprofilebe.hxx
index 08b1c725b7de..1f94210b4cc5 100644
--- a/extensions/source/config/ldap/ldapuserprofilebe.hxx
+++ b/extensions/source/config/ldap/ldapuserprofilebe.hxx
@@ -2,9 +2,9 @@
*
* $RCSfile: ldapuserprofilebe.hxx,v $
*
- * $Revision: 1.3 $
+ * $Revision: 1.4 $
*
- * last change: $Author: hr $ $Date: 2004-09-08 17:49:54 $
+ * last change: $Author: rt $ $Date: 2004-10-22 08:06:00 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -61,12 +61,17 @@
#ifndef EXTENSIONS_CONFIG_LDAP_LDAPUSERPROFILEBE_HXX_
#define EXTENSIONS_CONFIG_LDAP_LDAPUSERPROFILEBE_HXX_
+
#ifndef EXTENSIONS_CONFIG_LDAP_LDAPUSERPROF_HXX_
#include "ldapuserprof.hxx"
#endif
#ifndef EXTENSIONS_CONFIG_LDAP_LDAPACCESS_HXX_
#include "ldapaccess.hxx"
#endif
+#ifndef EXTENSIONS_CONFIG_LDAP_LADPUSERPROFILELAYER_HXX_
+#include "ldapuserprofilelayer.hxx"
+#endif
+
#ifndef _COM_SUN_STAR_CONFIGURATION_BACKEND_XSINGLELAYERSTRATUM_HPP_
#include <com/sun/star/configuration/backend/XSingleLayerStratum.hpp>
#endif
@@ -103,11 +108,6 @@
#include <cppuhelper/compbase2.hxx>
#endif // _CPPUHELPER_COMPBASE3_HXX_
-#ifndef INCLUDED_MAP
-#include <map>
-#define INCLUDED_MAP
-#endif
-
#define CONTEXT_ITEM_PREFIX_ "/modules/com.sun.star.configuration/bootstrap/"
namespace extensions { namespace config { namespace ldap {
@@ -124,18 +124,18 @@ namespace container = css::container;
typedef cppu::WeakComponentImplHelper2<backend::XSingleLayerStratum,
lang::XServiceInfo> BackendBase ;
+struct LdapProfileMutexHolder { osl::Mutex mMutex; };
/**
Implements the PlatformBackend service, a specialization of the
SingleLayerStratum service for retreiving LDAP user profile
configuration settings from a LDAP repsoitory.
*/
-class LdapUserProfileBe : public BackendBase
+class LdapUserProfileBe : private LdapProfileMutexHolder, public BackendBase
{
public :
- LdapUserProfileBe(const uno::Reference<uno::XComponentContext>& xContext)
- throw(backend::BackendAccessException,
- backend::BackendSetupException);
+ LdapUserProfileBe(const uno::Reference<uno::XComponentContext>& xContext);
+ // throw(backend::BackendAccessException, backend::BackendSetupException, RuntimeException);
~LdapUserProfileBe(void) ;
// XServiceInfo
@@ -155,13 +155,15 @@ class LdapUserProfileBe : public BackendBase
virtual uno::Reference<backend::XLayer> SAL_CALL
getLayer( const rtl::OUString& aLayerId, const rtl::OUString& aTimestamp )
throw (backend::BackendAccessException,
- lang::IllegalArgumentException) ;
+ lang::IllegalArgumentException,
+ uno::RuntimeException) ;
virtual uno::Reference<backend::XUpdatableLayer> SAL_CALL
getUpdatableLayer( const rtl::OUString& aLayerId )
throw (backend::BackendAccessException,
lang::NoSupportException,
- lang::IllegalArgumentException) ;
+ lang::IllegalArgumentException,
+ uno::RuntimeException) ;
/**
Provides the implementation name.
@return implementation name
@@ -178,7 +180,7 @@ class LdapUserProfileBe : public BackendBase
/** Build OO/LDAP attribute mapping table */
void initializeMappingTable (const rtl::OUString& aFileMapName);
/** Check if LDAP is configured */
- bool isLdapConfigured(LdapDefinition& aDefinition);
+ bool readLdapConfiguration(LdapDefinition& aDefinition);
bool getLdapStringParam(uno::Reference<container::XNameAccess>& xAccess,
const rtl::OUString& aLdapSetting,
@@ -191,36 +193,19 @@ class LdapUserProfileBe : public BackendBase
/** Connect to LDAP server */
void connectToLdapServer(const LdapDefinition& aDefinition );
/** Get URL of OO-to-LDAP Mapping File */
- void getMappingFileUrl(rtl::OUString& aFileUrl,
- const rtl::OUString& aFileMapName)const;
+ rtl::OUString getMappingFileUrl(const rtl::OUString& aFileMapName) const;
/** Service Factory object */
uno::Reference<lang::XMultiServiceFactory> mFactory;
/** Component Context */
uno::Reference<uno::XComponentContext> mContext ;
- /** Mutex for resource protection */
- osl::Mutex mMutex ;
- /** Maping LDAP->00o */
- LdapUserProfileMap mUserProfileMap;
/** Object for LDAP functionality */
- LdapConnection mLdapConnection;
+ LdapUserProfileSourceRef mLdapSource;
/**Currently logged in user */
rtl::OUString mLoggedOnUser ;
/** DN of currently logged in user */
rtl::OString mUserDN;
-
- /**
- Because initialising the backend requires to read some configuration,
- there's a risk of infinite recursion (the backend initialisation
- taking place inside the configuration initialisation).
- To prevent this, the following members ensure access to the LDAP
- server details cannot recurse.
- */
- /** Whether we're in the constructor already. */
- static bool mCanReadConfiguration ;
- /** Access protection for mCanReadConfiguration. */
- static osl::Mutex mReadConfigurationLock ;
} ;
//------------------------------------------------------------------------------
}}}