diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2004-08-03 13:38:29 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2004-08-03 13:38:29 +0000 |
commit | 4bb3709ec6fc1f6a64de04013ca9028beb527a28 (patch) | |
tree | 834eb31b3f683291e4dddfe8db272f8b68287f96 /extensions | |
parent | 4c58df1dd5e8de3fc0cee92955ca5d3877641fa9 (diff) |
INTEGRATION: CWS scmtoapoc (1.1.2); FILE ADDED
2004/04/22 09:10:38 ssmith 1.1.2.1: #115692# ldap user profile backend
Diffstat (limited to 'extensions')
-rw-r--r-- | extensions/source/config/ldap/ldapuserprof.cxx | 266 | ||||
-rw-r--r-- | extensions/source/config/ldap/ldapuserprof.hxx | 206 |
2 files changed, 472 insertions, 0 deletions
diff --git a/extensions/source/config/ldap/ldapuserprof.cxx b/extensions/source/config/ldap/ldapuserprof.cxx new file mode 100644 index 000000000000..62f0d01b6606 --- /dev/null +++ b/extensions/source/config/ldap/ldapuserprof.cxx @@ -0,0 +1,266 @@ +/************************************************************************* + * + * $RCSfile: ldapuserprof.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: hr $ $Date: 2004-08-03 14:38:18 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source 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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef EXTENSIONS_CONFIG_LDAP_LDAPUSERPROF_HXX_ +#include "ldapuserprof.hxx" +#endif // EXTENSIONS_CONFIG_LDAP_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) + { + rtl::OUString aStr = rtl::OUString::createFromAscii(*values); + if ((*values[0] != ' ') && ((*values+1) !=0)) + { + + aProfile.mProfile [i].mValue = rtl::OStringToOUString( + *values, + RTL_TEXTENCODING_ASCII_US); + 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 + diff --git a/extensions/source/config/ldap/ldapuserprof.hxx b/extensions/source/config/ldap/ldapuserprof.hxx new file mode 100644 index 000000000000..e6ee62024ec0 --- /dev/null +++ b/extensions/source/config/ldap/ldapuserprof.hxx @@ -0,0 +1,206 @@ +/************************************************************************* + * + * $RCSfile: ldapuserprof.hxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: hr $ $Date: 2004-08-03 14:38:29 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source 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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef EXTENSIONS_CONFIG_LDAP_LDAPUSERPROF_HXX_ +#define EXTENSIONS_CONFIG_LDAP_LDAPUSERPROF_HXX_ + +#ifndef _RTL_USTRING_HXX_ +#include <rtl/ustring.hxx> +#endif // _RTL_USTRING_HXX_ + +#ifndef MAP_INCLUDED +#define MAP_INCLUDED +#include <map> +#endif // MAP_INCLUDED + +#ifndef VECTOR_INCLUDED +#define VECTOR_INCLUDED +#include <vector> +#endif // VECTOR_INCLUDED + +#ifndef SET_INCLUDED +#define SET_INCLUDED +#include <set> +#endif // SET_INCLUDED + +#ifndef LDAP_INCLUDED +#define LDAP_INCLUDED +#include <mozilla/ldap/ldap.h> +#endif // LDAP_INCLUDED + + +namespace extensions { namespace config { namespace ldap { + +/** Struct containing the data associated to a UserProfile */ +struct LdapUserProfile { + /** Struct defining an entry in the profile */ + struct ProfileEntry { + rtl::OUString mAttribute ; + rtl::OUString mValue ; + } ; + /** List of attribute/value pairs */ + std::vector<ProfileEntry> mProfile ; +} ; + +/** Provider of UserProfile mapping services */ +class LdapUserProfileMap { + public : + /** Default constructor, doesn't do much. */ + LdapUserProfileMap(void) : mAttributes(NULL) {} + /** Destructor */ + ~LdapUserProfileMap(void) ; + + /** + Fills the map using a string description of the mapping. + Each possible UserProfile attribute is mapped to a list + of LDAP attributes, in order of priority. + The entry is formatted as: + <UP Attribute>=<LDAP Attr1>,...,<LDAP AttrN> + + @param aMap string description of the mapping + */ + void source(const rtl::OString& aMap) ; + /** + Returns an array of all the LDAP attribute names that may + be relevant for UserProfile mapping. + + @return array of LDAP attribute names + */ + const sal_Char **getLdapAttributes(void) const { return mAttributes ; } + /** + Returns the component name that holds the data + when presented to the outside. + + @return component name + */ + const rtl::OUString& getComponentName(void) const { + return mComponentName ; + } + /** + Returns the group name that holds the data when + presented to the outside world. + + @return group name + */ + const rtl::OUString& getGroupName(void) const { + return mGroupName ; + } + /** + Struct defining the mapping between UserProfile attributes + and LDAP ones. It also serves as a crude "schema" of the + UserProfile component, as the list of profile elements + is the list of properties in the component and the presence + or absence of LDAP mapping indicates whether the property + should be made writable or kept read-only. + */ + struct Mapping { + /** Name of the UserProfile element */ + rtl::OString mProfileElement ; + /** Corresponding LDAP attributes in order of priority */ + std::vector<rtl::OString> mLdapAttributes ; + + /** Utility to fill the mapping from a <Prof>=<Ldap1>;...;<LdapN> + description */ + sal_Bool parse(const rtl::OString& aDescription) ; + } ; + + + /** + Maps an LDAP entry to a UserProfile. + + @param aConnection LDAP connection to the repository + @param aEntry entry containing the data + @param aProfile user profile struct to fill up + */ + void ldapToUserProfile(LDAP *aConnection, + LDAPMessage *aEntry, + LdapUserProfile& aProfile) const ; + + protected : + + private : + /** Contains the mapping entries */ + std::vector<Mapping> mMapping ; + /** Contains the LDAP attributes used in a NULL terminated array */ + const sal_Char **mAttributes ; + /** User profile component name */ + rtl::OUString mComponentName ; + /** User profile storage group name */ + rtl::OUString mGroupName ; + + /** + Adds a new mapping entry to the list, and collects the + LDAP attributes involved in the mapping. + + @param aMappingDescription string describing the mapping + @param aLdapAttributes collection of LDAP attributes + @param aPrefix common prefix to the attributes + containing the component and group + name, used for validation + */ + void addNewMapping(const rtl::OString& aMappingDescription, + std::set<rtl::OString>& aLdapAttributes, + rtl::OString& aPrefix) ; +} ; + +} } } // extensions.config.ldap + +#endif // EXTENSIONS_CONFIG_LDAP_LDAPUSERPROF_HXX_ |