office-gobmx/extensions/source/config/ldap/ldapuserprof.cxx
Rüdiger Timm 73dd055184 INTEGRATION: CWS changefileheader (1.5.276); FILE MERGED
2008/04/01 12:29:42 thb 1.5.276.2: #i85898# Stripping all external header guards
2008/03/31 12:31:25 rt 1.5.276.1: #i87441# Change license header to LPGL v3.
2008-04-11 08:46:22 +00:00

229 lines
7.8 KiB
C++

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: ldapuserprof.cxx,v $
* $Revision: 1.6 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_extensions.hxx"
#include "ldapuserprof.hxx"
namespace extensions { namespace config { namespace ldap {
//==============================================================================
//------------------------------------------------------------------------------
/**
Finds the next line in a buffer and returns it, along with a
modified version of the buffer with the line removed.
@param aString string to extract the next line from
@param aLine next line
@return sal_True if a line has been extracted, sal_False otherwise
*/
static sal_Bool getNextLine(rtl::OString& aString,
rtl::OString& aLine)
{
aString = aString.trim() ;
const sal_Char *currentChar = aString ;
const sal_Char *endChar = currentChar + aString.getLength() ;
sal_Int32 lineThreshold = 0 ;
while (currentChar < endChar &&
*currentChar != '\r' && *currentChar != '\n') { ++ currentChar ; }
lineThreshold = currentChar - static_cast<const sal_Char *>(aString) ;
if (lineThreshold == 0) { return sal_False ; }
aLine = aString.copy(0, lineThreshold) ;
aString = aString.copy(lineThreshold) ;
return sal_True ;
}
//------------------------------------------------------------------------------
LdapUserProfileMap::~LdapUserProfileMap(void)
{
// No need to delete the contents of the mAttributes array,
// since they refer to rtl::OStrings stored in the mLdapAttributes
// array.
if (mAttributes != NULL)
{
delete [] mAttributes ;
}
}
//------------------------------------------------------------------------------
void LdapUserProfileMap::source(const rtl::OString& aMap)
{
if (mAttributes != NULL)
{
delete [] mAttributes ; mAttributes = NULL ;
mMapping.clear() ;
}
rtl::OString currentLine ;
rtl::OString buffer = aMap ;
std::set<rtl::OString> attributes ;
rtl::OString prefix ;
// First, parse the buffer to find all the mapping definitions.
// While we're at it, we collect the list of unique LDAP attributes
// involved in the mapping.
while (getNextLine(buffer, currentLine))
{
addNewMapping(currentLine, attributes, prefix) ;
}
// Now we use the list of attributes to build mAttributes
mAttributes = new const sal_Char * [attributes.size() + 1] ;
std::set<rtl::OString>::const_iterator attribute ;
sal_Int32 i = 0 ;
for (attribute = attributes.begin() ;
attribute != attributes.end() ; ++ attribute)
{
mAttributes [i ++] = static_cast<const sal_Char *>(*attribute) ;
}
mAttributes [i] = NULL ;
}
//------------------------------------------------------------------------------
void LdapUserProfileMap::ldapToUserProfile(LDAP *aConnection,
LDAPMessage *aEntry,
LdapUserProfile& aProfile) const
{
if (aEntry == NULL) { return ; }
// Ensure return value has proper size
aProfile.mProfile.resize(mMapping.size()) ;
sal_Char **values = NULL ;
for (sal_uInt32 i = 0 ; i < mMapping.size() ; ++ i)
{
aProfile.mProfile [i].mAttribute = rtl::OStringToOUString(
mMapping [i].mProfileElement,
RTL_TEXTENCODING_ASCII_US);
rtl::OUString debugStr = aProfile.mProfile [i].mAttribute;
for (sal_uInt32 j = 0 ;
j < mMapping [i].mLdapAttributes.size() ; ++ j)
{
values = ldap_get_values(aConnection, aEntry,
mMapping [i].mLdapAttributes [j]) ;
if (values != NULL)
{
aProfile.mProfile[i].mValue = rtl::OStringToOUString(
*values, RTL_TEXTENCODING_UTF8);
ldap_value_free(values);
break;
}
}
}
}
//------------------------------------------------------------------------------
void LdapUserProfileMap::addNewMapping(const rtl::OString& aLine,
std::set<rtl::OString>& aLdapAttributes,
rtl::OString& aPrefix)
{
if (aLine.getStr() [0] == '#') { return ; }
sal_Int32 prefixLength = aPrefix.getLength() ;
if (prefixLength == 0)
{
sal_Int32 firstSlash = aLine.indexOf('/') ;
if (firstSlash == -1) { return ; }
sal_Int32 secondSlash = aLine.indexOf('/', firstSlash + 1) ;
if (secondSlash == -1){ return; }
mComponentName =
rtl::OUString::createFromAscii(aLine.copy(0, firstSlash)) ;
mGroupName =
rtl::OUString::createFromAscii(aLine.copy(firstSlash + 1,
secondSlash - firstSlash - 1)) ;
aPrefix = aLine.copy(0, secondSlash + 1) ;
prefixLength = secondSlash + 1 ;
}
else if (aLine.compareTo(aPrefix, prefixLength) != 0)
{
return ;
}
mMapping.push_back(Mapping()) ;
if (!mMapping.back().parse(aLine.copy(prefixLength)))
{
mMapping.pop_back() ;
}
else
{
const std::vector<rtl::OString>& attributes =
mMapping.back().mLdapAttributes ;
std::vector<rtl::OString>::const_iterator ldapAttribute ;
for (ldapAttribute = attributes.begin() ;
ldapAttribute != attributes.end() ; ++ ldapAttribute)
{
aLdapAttributes.insert(*ldapAttribute) ;
}
}
}
//------------------------------------------------------------------------------
static sal_Char kMappingSeparator = '=' ;
static sal_Char kLdapMapSeparator = ',' ;
sal_Bool LdapUserProfileMap::Mapping::parse(const rtl::OString& aLine)
{
sal_Int32 index = aLine.indexOf(kMappingSeparator) ;
if (index == -1)
{
// Imparsable line
return sal_False ;
}
sal_Int32 oldIndex = index + 1 ;
mProfileElement = aLine.copy(0, index).trim() ;
mLdapAttributes.clear() ;
index = aLine.indexOf(kLdapMapSeparator, oldIndex) ;
while (index != -1)
{
mLdapAttributes.push_back(
aLine.copy(oldIndex, index - oldIndex).trim()) ;
oldIndex = index + 1 ;
index = aLine.indexOf(kLdapMapSeparator, oldIndex) ;
}
rtl::OString endOfLine = aLine.copy(oldIndex).trim() ;
if (endOfLine.getLength() > 0)
{
mLdapAttributes.push_back(endOfLine) ;
}
return sal_True ;
}
//------------------------------------------------------------------------------
} } } // extensiond.config.ldap