CLDAPv3Configs.cpp [plain text]
#include "CLDAPv3Configs.h"
#include <DirectoryServiceCore/CSharedData.h>
#include <CoreFoundation/CFPriv.h> // used for ::CFCopySearchPathForDirectoriesInDomains
#include <string.h> //used for strcpy, etc.
#include <stdlib.h> //used for malloc
#include <sys/types.h>
#include <sys/stat.h> //used for mkdir and stat
#include <syslog.h> //error logging
#include <DirectoryServiceCore/PrivateTypes.h> // try and catch macros
#include <DirectoryService/DirServices.h>
#include <DirectoryService/DirServicesUtils.h>
#include <DirectoryService/DirServicesConst.h>
#define kAllocatorDefault NULL
CLDAPv3Configs::CLDAPv3Configs ( void )
{
pConfigTable = nil;
fConfigTableLen = 0;
fXMLData = nil;
pXMLConfigLock = new DSMutexSemaphore();
}
CLDAPv3Configs::~CLDAPv3Configs ( void )
{
uInt32 iTableIndex = 0;
sLDAPConfigData *pConfig = nil;
for (iTableIndex=0; iTableIndex<fConfigTableLen; iTableIndex++)
{
pConfig = (sLDAPConfigData *)pConfigTable->GetItemData( iTableIndex );
if (pConfig != nil)
{
CleanLDAPConfigData( pConfig );
delete( pConfig );
pConfig = nil;
pConfigTable->RemoveItem( iTableIndex );
}
}
fConfigTableLen = 0;
if ( pConfigTable != nil)
{
delete ( pConfigTable );
pConfigTable = nil;
}
if (pXMLConfigLock != nil)
{
delete(pXMLConfigLock);
pXMLConfigLock = nil;
}
if (fXMLData != nil)
{
CFRelease(fXMLData);
fXMLData = nil;
}
}
sInt32 CLDAPv3Configs::Init ( CPlugInRef *inConfigTable, uInt32 &inConfigTableLen, sMapTuple **inStdAttributeMapTuple, sMapTuple **inStdRecordMapTuple )
{
sInt32 siResult = eDSNoErr;
sLDAPConfigData *pConfig = nil;
uInt32 sIndex = 0;
uInt32 iTableIndex = 0;
if (inConfigTableLen != 0)
{
fConfigTableLen = inConfigTableLen;
}
if ( inConfigTable == nil )
{
inConfigTable = new CPlugInRef( nil );
}
pConfigTable = inConfigTable;
if (!CheckForConfig((char *)"unknown", sIndex))
{
pConfig = MakeLDAPConfigData((char *)"Generic",(char *)"unknown",true,120,2,120,120,389,false, 0, 0, false, false, false);
pConfigTable->AddItem( fConfigTableLen, pConfig );
fConfigTableLen++;
}
XMLConfigLock();
if (fXMLData != nil)
{
CFRelease(fXMLData);
fXMLData = nil;
}
siResult = ReadXMLConfig();
XMLConfigUnlock();
if (siResult == eDSNoErr)
{
if (inConfigTableLen != 0)
{
for (iTableIndex=0; iTableIndex<fConfigTableLen; iTableIndex++)
{
pConfig = (sLDAPConfigData *)pConfigTable->GetItemData( iTableIndex );
if (pConfig != nil)
{
pConfig->bUpdated = false;
}
}
}
XMLConfigLock();
siResult = ConfigLDAPServers();
XMLConfigUnlock();
}
inConfigTableLen = fConfigTableLen;
return( siResult );
}
sInt32 CLDAPv3Configs::BuildDefaultStdAttributeMap ( void )
{
sInt32 siResult = eDSNoErr;
sMapTuple *pAttrMapTuple = nil;
sPtrString *tempPtrString = nil;
if (pStdAttributeMapTuple != nil)
{
CleanMapTuple(pStdAttributeMapTuple);
pStdAttributeMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrVFSOpts)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrVFSOpts);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("vfsopts")];
::strcpy(pAttrMapTuple->fNative->fName,"vfsopts");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDS1AttrVFSLinkDir)];
::strcpy(pAttrMapTuple->fStandard,kDS1AttrVFSLinkDir);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("vfsdir")];
::strcpy(pAttrMapTuple->fNative->fName,"vfsdir");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDS1AttrVFSDumpFreq)];
::strcpy(pAttrMapTuple->fStandard,kDS1AttrVFSDumpFreq);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("vfsdumpfreq")];
::strcpy(pAttrMapTuple->fNative->fName,"vfsdumpfreq");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDS1AttrVFSPassNo)];
::strcpy(pAttrMapTuple->fStandard,kDS1AttrVFSPassNo);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("passno")];
::strcpy(pAttrMapTuple->fNative->fName,"passno");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDS1AttrVFSType)];
::strcpy(pAttrMapTuple->fStandard,kDS1AttrVFSType);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("vfstype")];
::strcpy(pAttrMapTuple->fNative->fName,"vfstype");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrIPAddress)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrIPAddress);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("ipaddress")];
::strcpy(pAttrMapTuple->fNative->fName,"ipaddress");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrDNSName)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrDNSName);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("dnsname")];
::strcpy(pAttrMapTuple->fNative->fName,"dnsname");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrURLForNSL)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrURLForNSL);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("networklocurl")];
::strcpy(pAttrMapTuple->fNative->fName,"networklocurl");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrURL)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrURL);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("urldata")];
::strcpy(pAttrMapTuple->fNative->fName,"urldata");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrNBPEntry)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrNBPEntry);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("nbpdata")];
::strcpy(pAttrMapTuple->fNative->fName,"nbpdata");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrPhoneNumber)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrPhoneNumber);
tempPtrString = new sPtrString;
if ( tempPtrString != nil )
{
::memset( tempPtrString, 0, sizeof( sPtrString ) );
tempPtrString->fName = new char[1+::strlen("phone")];
::strcpy(tempPtrString->fName,"phone");
tempPtrString->pNext = nil;
}
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("telephone")];
::strcpy(pAttrMapTuple->fNative->fName,"telephone");
pAttrMapTuple->fNative->pNext = tempPtrString;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrRecordAlias)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrRecordAlias);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("aliasdata")];
::strcpy(pAttrMapTuple->fNative->fName,"aliasdata");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrGroupMembership)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrGroupMembership);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("userlist")];
::strcpy(pAttrMapTuple->fNative->fName,"userlist");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrGroup)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrGroup);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("grouplist")];
::strcpy(pAttrMapTuple->fNative->fName,"grouplist");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDS1AttrAuthenticationHint)];
::strcpy(pAttrMapTuple->fStandard,kDS1AttrAuthenticationHint);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("hint")];
::strcpy(pAttrMapTuple->fNative->fName,"hint");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrEMailAddress)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrEMailAddress);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("mail")];
::strcpy(pAttrMapTuple->fNative->fName,"mail");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDS1AttrMailAttribute)];
::strcpy(pAttrMapTuple->fStandard,kDS1AttrMailAttribute);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("applemail")];
::strcpy(pAttrMapTuple->fNative->fName,"applemail");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDS1AttrUserShell)];
::strcpy(pAttrMapTuple->fStandard,kDS1AttrUserShell);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("shell")];
::strcpy(pAttrMapTuple->fNative->fName,"shell");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrHomeDirectory)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrHomeDirectory);
tempPtrString = new sPtrString;
if ( tempPtrString != nil )
{
::memset( tempPtrString, 0, sizeof( sPtrString ) );
tempPtrString->fName = new char[1+::strlen("home")];
::strcpy(tempPtrString->fName,"home");
tempPtrString->pNext = nil;
}
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("homeloc")];
::strcpy(pAttrMapTuple->fNative->fName,"homeloc");
pAttrMapTuple->fNative->pNext = tempPtrString;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDS1AttrNFSHomeDirectory)];
::strcpy(pAttrMapTuple->fStandard,kDS1AttrNFSHomeDirectory);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("nfshome")];
::strcpy(pAttrMapTuple->fNative->fName,"nfshome");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDS1AttrPrimaryGroupID)];
::strcpy(pAttrMapTuple->fStandard,kDS1AttrPrimaryGroupID);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("groupid")];
::strcpy(pAttrMapTuple->fNative->fName,"groupid");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDS1AttrPassword)];
::strcpy(pAttrMapTuple->fStandard,kDS1AttrPassword);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("passwd")];
::strcpy(pAttrMapTuple->fNative->fName,"passwd");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDS1AttrUniqueID)];
::strcpy(pAttrMapTuple->fStandard,kDS1AttrUniqueID);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("unixid")];
::strcpy(pAttrMapTuple->fNative->fName,"unixid");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDS1AttrDistinguishedName)];
::strcpy(pAttrMapTuple->fStandard,kDS1AttrDistinguishedName);
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("realname")];
::strcpy(pAttrMapTuple->fNative->fName,"realname");
pAttrMapTuple->fNative->pNext = nil;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
pAttrMapTuple = new sMapTuple;
if ( pAttrMapTuple != nil )
{
::memset( pAttrMapTuple, 0, sizeof( sMapTuple ) );
pAttrMapTuple->fStandard = new char[1+::strlen(kDSNAttrRecordName)];
::strcpy(pAttrMapTuple->fStandard,kDSNAttrRecordName);
tempPtrString = new sPtrString;
if ( tempPtrString != nil )
{
::memset( tempPtrString, 0, sizeof( sPtrString ) );
tempPtrString->fName = new char[1+::strlen("sn")];
::strcpy(tempPtrString->fName,"sn");
tempPtrString->pNext = nil;
}
pAttrMapTuple->fNative = new sPtrString;
if ( pAttrMapTuple->fNative != nil )
{
::memset( pAttrMapTuple->fNative, 0, sizeof( sPtrString ) );
pAttrMapTuple->fNative->fName = new char[1+::strlen("cn")];
::strcpy(pAttrMapTuple->fNative->fName,"cn");
pAttrMapTuple->fNative->pNext = tempPtrString;
}
tempPtrString = new sPtrString;
if ( tempPtrString != nil )
{
::memset( tempPtrString, 0, sizeof( sPtrString ) );
tempPtrString->fName = new char[1+::strlen("dn")];
::strcpy(tempPtrString->fName,"dn");
tempPtrString->pNext = nil;
pAttrMapTuple->fNative->pNext->pNext = tempPtrString;
}
pAttrMapTuple->pNext = pStdAttributeMapTuple;
pStdAttributeMapTuple = pAttrMapTuple;
pAttrMapTuple = nil;
}
return( siResult );
}
sInt32 CLDAPv3Configs::BuildDefaultStdRecordMap ( void )
{
sInt32 siResult = eDSNoErr;
sMapTuple *pRecMapTuple = nil;
if (pStdRecordMapTuple != nil)
{
CleanMapTuple(pStdRecordMapTuple);
pStdRecordMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeQTSServer)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeQTSServer);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=qtsserver, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=qtsserver, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeLDAPServer)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeLDAPServer);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=ldapserver, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=ldapserver, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeWebServer)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeWebServer);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=webserver, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=webserver, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeNFS)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeNFS);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=nfs, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=nfs, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeSMBServer)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeSMBServer);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=smbserver, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=smbserver, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeFTPServer)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeFTPServer);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=ftpserver, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=ftpserver, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeAFPServer)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeAFPServer);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=afpserver, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=afpserver, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypePrinters)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypePrinters);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=printers, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=printers, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeMachines)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeMachines);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=machines, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=machines, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeMounts)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeMounts);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=mounts, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=mounts, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeGroupAliases)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeGroupAliases);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=groupaliases, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=groupaliases, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeUserAliases)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeUserAliases);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=peoplealiases, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=peoplealiases, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeGroups)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeGroups);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=groups, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=groups, o=company name");
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
pRecMapTuple = new sMapTuple;
if ( pRecMapTuple != nil )
{
::memset( pRecMapTuple, 0, sizeof( sMapTuple ) );
pRecMapTuple->fStandard = new char[1+::strlen(kDSStdRecordTypeUsers)];
::strcpy(pRecMapTuple->fStandard,kDSStdRecordTypeUsers);
pRecMapTuple->fNative = new sPtrString;
if ( pRecMapTuple->fNative != nil )
{
::memset( pRecMapTuple->fNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fName = new char[1+::strlen("ou=people, o=company name")];
::strcpy(pRecMapTuple->fNative->fName,"ou=people, o=company name");
pRecMapTuple->fNative->fSubNative = new sPtrString;
if ( pRecMapTuple->fNative->fSubNative != nil )
{
::memset( pRecMapTuple->fNative->fSubNative, 0, sizeof( sPtrString ) );
pRecMapTuple->fNative->fSubNative->fName = new char[1+::strlen("*")];
::strcpy(pRecMapTuple->fNative->fSubNative->fName,"*");
pRecMapTuple->fNative->fSubNative->pNext = nil;
}
pRecMapTuple->fNative->pNext = nil;
}
pRecMapTuple->pNext = pStdRecordMapTuple;
pStdRecordMapTuple = pRecMapTuple;
pRecMapTuple = nil;
}
return( siResult );
}
sInt32 CLDAPv3Configs::CleanMapTuple ( sMapTuple *inMapTuple )
{
sInt32 siResult = eDSNoErr;
sMapTuple *pMapTuple = nil;
sPtrString *pPtrString = nil;
sPtrString *pSubPtrString = nil;
pMapTuple = inMapTuple;
while (pMapTuple != nil)
{
inMapTuple = pMapTuple->pNext;
if (pMapTuple->fStandard != nil)
{
delete( pMapTuple->fStandard );
}
pPtrString = pMapTuple->fNative;
while (pPtrString != nil)
{
pMapTuple->fNative = pPtrString->pNext;
pPtrString->fGroupSubNative = 0;
while (pPtrString->fSubNative != nil)
{
pSubPtrString = pPtrString->fSubNative;
pPtrString->fSubNative = pSubPtrString->pNext;
if (pSubPtrString->fName != nil)
{
delete(pSubPtrString->fName);
}
delete(pSubPtrString);
}
if (pPtrString->fName != nil)
{
delete( pPtrString->fName );
}
pPtrString->pNext = nil;
delete( pPtrString );
pPtrString = pMapTuple->fNative;
}
pMapTuple->pNext = nil;
delete( pMapTuple );
pMapTuple = inMapTuple;
}
return( siResult );
}
sInt32 CLDAPv3Configs::ReadXMLConfig ( void )
{
sInt32 siResult = eDSNoErr;
CFURLRef configFileURL = nil;
CFURLRef configFileCorruptedURL = nil;
CFDataRef xmlData;
bool bReadFile = false;
bool bCorruptedFile = false;
bool bWroteFile = false;
register CFIndex iPath;
CFArrayRef aPaths = nil;
char string[ PATH_MAX ];
char string2[ PATH_MAX ];
struct stat statResult;
CFMutableDictionaryRef configDict;
CFStringRef cfStringRef;
sInt32 errorCode = 0;
CFStringRef sBase = nil;
CFStringRef sPath = nil;
CFStringRef sCorruptedPath;
aPaths = ::CFCopySearchPathForDirectoriesInDomains( kCFLibraryDirectory, kCFLocalDomainMask, true );
if ( aPaths != nil )
{
iPath = ::CFArrayGetCount( aPaths );
if ( iPath != 0 )
{
while (( iPath-- ) && (!bReadFile))
{
configFileURL = (CFURLRef)::CFArrayGetValueAtIndex( aPaths, iPath );
sBase = ::CFURLCopyFileSystemPath( configFileURL, kCFURLPOSIXPathStyle );
sPath = ::CFStringCreateWithFormat( kCFAllocatorDefault, NULL, CFSTR( "%@/%s" ), sBase, "/Preferences/DirectoryService/DSLDAPv3PlugInConfig.plist" );
::memset(string,0,PATH_MAX);
::CFStringGetCString( sPath, string, sizeof( string ), kCFStringEncodingUTF8 );
CShared::LogIt( 0x0F, (char *)"Checking for LDAP XML config file:" );
CShared::LogIt( 0x0F, string );
configFileURL = ::CFURLCreateWithFileSystemPath( kCFAllocatorDefault, sPath, kCFURLPOSIXPathStyle, false );
CFRelease( sPath ); sPath = nil;
siResult = ::stat( string, &statResult );
if (siResult != eDSNoErr)
{
sPath = ::CFStringCreateWithFormat( kCFAllocatorDefault, NULL, CFSTR( "%@/%s" ), sBase, "/Preferences" );
::memset(string2,0,PATH_MAX);
::CFStringGetCString( sPath, string2, sizeof( string2 ), kCFStringEncodingUTF8 );
siResult = ::stat( string2, &statResult );
if (siResult != eDSNoErr)
{
::mkdir( string2 , 0775 );
::chmod( string2, 0775 ); }
CFRelease( sPath ); sPath = nil;
sPath = ::CFStringCreateWithFormat( kCFAllocatorDefault, NULL, CFSTR( "%@/%s" ), sBase, "/Preferences/DirectoryService" );
::memset(string2,0,PATH_MAX);
::CFStringGetCString( sPath, string2, sizeof( string2 ), kCFStringEncodingUTF8 );
siResult = ::stat( string2, &statResult );
if (siResult != eDSNoErr)
{
::mkdir( string2 , 0775 );
::chmod( string2, 0775 ); }
CFRelease( sPath ); sPath = nil;
configDict = CFDictionaryCreateMutable( kCFAllocatorDefault,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks );
cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, "DSLDAPv3PlugIn Version 1.5", kCFStringEncodingUTF8);
CFDictionarySetValue( configDict, CFSTR( kXMLLDAPVersionKey ), cfStringRef );
CFRelease(cfStringRef);
cfStringRef = nil;
CShared::LogIt( 0x0F, (char *)"Created a new LDAP XML config file since it did not exist" );
xmlData = CFPropertyListCreateXMLData( kCFAllocatorDefault, configDict);
siResult = CFURLWriteDataAndPropertiesToResource( configFileURL,
xmlData,
NULL,
&errorCode);
CFRelease(configDict);
configDict = nil;
CFRelease(xmlData);
xmlData = nil;
} chmod( string, S_IRUSR | S_IWUSR );
bReadFile = CFURLCreateDataAndPropertiesFromResource(
kAllocatorDefault,
configFileURL,
&xmlData, NULL,
NULL,
&siResult);
} }
CFRelease(aPaths); aPaths = nil;
}
if (bReadFile)
{
fXMLData = xmlData;
if (!VerifyXML())
{
CShared::LogIt( 0x0F, (char *)"LDAP XML config file is corrupted" );
bCorruptedFile = true;
sCorruptedPath = ::CFStringCreateWithFormat( kCFAllocatorDefault, NULL, CFSTR( "%@/%s" ), sBase, "/Preferences/DirectoryService/DSLDAPv3PlugInConfigCorrupted.plist" );
configFileCorruptedURL = ::CFURLCreateWithFileSystemPath( kCFAllocatorDefault, sCorruptedPath, kCFURLPOSIXPathStyle, false );
CFRelease( sCorruptedPath ); sCorruptedPath = nil;
bWroteFile = CFURLWriteDataAndPropertiesToResource( configFileCorruptedURL,
xmlData,
NULL,
&errorCode);
CFRelease(xmlData);
xmlData = nil;
}
}
else {
CShared::LogIt( 0x0F, (char *)"LDAP XML config file is unreadable" );
bCorruptedFile = true;
}
if (bCorruptedFile)
{
configDict = CFDictionaryCreateMutable( kCFAllocatorDefault,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks );
cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, "DSLDAPv3PlugIn Version 1.5", kCFStringEncodingUTF8);
CFDictionarySetValue( configDict, CFSTR( kXMLLDAPVersionKey ), cfStringRef );
CFRelease(cfStringRef);
cfStringRef = nil;
CShared::LogIt( 0x0F, (char *)"Writing a new LDAP XML config file" );
xmlData = CFPropertyListCreateXMLData( kCFAllocatorDefault, configDict);
fXMLData = xmlData;
siResult = CFURLWriteDataAndPropertiesToResource( configFileURL,
xmlData,
NULL,
&errorCode);
CFRelease(configDict);
configDict = nil;
}
if (configFileURL != nil)
{
CFRelease(configFileURL); configFileURL = nil;
}
if (configFileCorruptedURL != nil)
{
CFRelease(configFileCorruptedURL); configFileCorruptedURL = nil;
}
if (sBase != nil)
{
CFRelease( sBase ); sBase = nil;
}
return( siResult );
}
sInt32 CLDAPv3Configs::WriteXMLConfig ( void )
{
sInt32 siResult = eDSNoErr;
CFURLRef configFileURL;
bool bWroteFile = false;
register CFIndex iPath;
CFArrayRef aPaths = nil;
char string[ PATH_MAX ];
struct stat statResult;
sInt32 errorCode = 0;
aPaths = ::CFCopySearchPathForDirectoriesInDomains( kCFLibraryDirectory, kCFLocalDomainMask, true );
if ( aPaths != nil )
{
iPath = ::CFArrayGetCount( aPaths );
if ( iPath != 0 )
{
while (( iPath-- ) && (!bWroteFile))
{
configFileURL = (CFURLRef)::CFArrayGetValueAtIndex( aPaths, iPath );
CFStringRef sBase, sPath;
sBase = ::CFURLCopyFileSystemPath( configFileURL, kCFURLPOSIXPathStyle );
sPath = ::CFStringCreateWithFormat( kCFAllocatorDefault, NULL, CFSTR( "%@/%s" ), sBase, "/Preferences/DirectoryService/DSLDAPv3PlugInConfig.plist" );
::memset(string,0,PATH_MAX);
::CFStringGetCString( sPath, string, sizeof( string ), kCFStringEncodingUTF8 );
CShared::LogIt( 0x0F, (char *)"Checking for LDAP XML config file:" );
CShared::LogIt( 0x0F, string );
configFileURL = ::CFURLCreateWithFileSystemPath( kCFAllocatorDefault, sPath, kCFURLPOSIXPathStyle, false );
CFRelease( sPath ); sPath = nil;
siResult = ::stat( string, &statResult );
if (siResult != eDSNoErr)
{
siResult = eDSNoErr;
sPath = ::CFStringCreateWithFormat( kCFAllocatorDefault, NULL, CFSTR( "%@/%s" ), sBase, "/Preferences" );
::memset(string,0,PATH_MAX);
::CFStringGetCString( sPath, string, sizeof( string ), kCFStringEncodingUTF8 );
siResult = ::stat( string, &statResult );
if (siResult != eDSNoErr)
{
siResult = eDSNoErr;
::mkdir( string , 0775 );
::chmod( string, 0775 ); }
CFRelease( sPath ); sPath = nil;
sPath = ::CFStringCreateWithFormat( kCFAllocatorDefault, NULL, CFSTR( "%@/%s" ), sBase, "/Preferences/DirectoryService" );
::memset(string,0,PATH_MAX);
::CFStringGetCString( sPath, string, sizeof( string ), kCFStringEncodingUTF8 );
siResult = ::stat( string, &statResult );
if (siResult != eDSNoErr)
{
siResult = eDSNoErr;
::mkdir( string , 0775 );
::chmod( string, 0775 ); }
CFRelease( sPath ); sPath = nil;
}
if (fXMLData != nil)
{
bWroteFile = CFURLWriteDataAndPropertiesToResource( configFileURL,
fXMLData,
NULL,
&errorCode);
}
CFRelease( sBase ); sBase = nil;
CFRelease(configFileURL); configFileURL = nil;
} }
CFRelease(aPaths); aPaths = nil;
}
if (bWroteFile)
{
CShared::LogIt( 0x0F, (char *)"Have written the LDAP XML config file:" );
CShared::LogIt( 0x0F, string );
siResult = eDSNoErr;
}
else
{
CShared::LogIt( 0x0F, (char *)"LDAP XML config file has NOT been written" );
CShared::LogIt( 0x0F, (char *)"Update to LDAP Config File Failed" );
siResult = eDSPlugInConfigFileError;
}
return( siResult );
}
sInt32 CLDAPv3Configs::SetXMLConfig ( CFDataRef xmlData )
{
CFDataRef currentXMLData = fXMLData;
fXMLData = xmlData;
if (VerifyXML())
{
if (currentXMLData != nil)
{
CFRelease(currentXMLData);
currentXMLData = nil;
}
CFRetain(fXMLData);
return eDSNoErr;
}
else
{
fXMLData = currentXMLData;
return eDSInvalidPlugInConfigData;
}
}
CFDataRef CLDAPv3Configs::GetXMLConfig ( void )
{
return fXMLData;
}
sInt32 CLDAPv3Configs::AddDefaultArrays ( CFMutableDictionaryRef inDict )
{
CFMutableArrayRef cfArrayRef = nil;
CFMutableDictionaryRef cfDictRef = nil;
CFIndex cfMapCount = 0;
CFIndex cfNativeMapCount = 0;
CFIndex cfSubNativeMapCount = 0;
CFStringRef cfStringRef = nil;
CFMutableArrayRef cfNativeArrayRef = nil;
CFMutableArrayRef cfSubNativeArrayRef = nil;
sMapTuple *pMapTuple = nil;
sInt32 siResult = eDSNoErr;
sPtrString *pPtrString = nil;
sPtrString *pSubPtrString = nil;
CFMutableDictionaryRef cfSubDictRef = nil;
if ( CFDictionaryContainsKey( inDict, CFSTR( kXMLDefaultAttrTypeMapArrayKey ) ) )
{
CFDictionaryRemoveValue( inDict, CFSTR( kXMLDefaultAttrTypeMapArrayKey ) );
}
if ( !CFDictionaryContainsKey( inDict, CFSTR( kXMLDefaultAttrTypeMapArrayKey ) ) )
{
cfArrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
CFDictionarySetValue( inDict, CFSTR(kXMLDefaultAttrTypeMapArrayKey), cfArrayRef);
CFRelease(cfArrayRef);
cfArrayRef = nil;
cfArrayRef = (CFMutableArrayRef)CFDictionaryGetValue( inDict, CFSTR( kXMLDefaultAttrTypeMapArrayKey ) );
cfMapCount = 0;
pMapTuple = pStdAttributeMapTuple;
while (pMapTuple != nil)
{
cfDictRef = CFDictionaryCreateMutable( kCFAllocatorDefault,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks );
CFArrayInsertValueAtIndex(cfArrayRef, cfMapCount, cfDictRef);
if (pMapTuple->fStandard != nil)
{
cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, pMapTuple->fStandard, kCFStringEncodingUTF8);
CFDictionarySetValue( cfDictRef, CFSTR(kXMLStdNameKey), cfStringRef);
CFRelease(cfStringRef);
cfStringRef = nil;
cfMapCount++;
}
cfNativeArrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
CFDictionarySetValue( cfDictRef, CFSTR(kXMLNativeMapArrayKey), cfNativeArrayRef);
CFRelease(cfNativeArrayRef);
cfNativeArrayRef = nil;
cfNativeArrayRef = (CFMutableArrayRef)CFDictionaryGetValue( cfDictRef, CFSTR( kXMLNativeMapArrayKey ) );
cfNativeMapCount = 0;
pPtrString = pMapTuple->fNative;
while (pPtrString != nil)
{
if (pPtrString->fName != nil)
{
cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, pPtrString->fName, kCFStringEncodingUTF8);
CFArrayInsertValueAtIndex(cfNativeArrayRef, cfNativeMapCount, cfStringRef);
CFRelease(cfStringRef);
cfStringRef = nil;
cfNativeMapCount++;
}
pPtrString = pPtrString->pNext;
}
pMapTuple = pMapTuple->pNext;
if (cfDictRef != nil)
{
CFRelease(cfDictRef);
cfDictRef = nil;
}
}
}
if ( CFDictionaryContainsKey( inDict, CFSTR( kXMLDefaultRecordTypeMapArrayKey ) ) )
{
CFDictionaryRemoveValue( inDict, CFSTR( kXMLDefaultRecordTypeMapArrayKey ) );
}
if ( !CFDictionaryContainsKey( inDict, CFSTR( kXMLDefaultRecordTypeMapArrayKey ) ) )
{
cfArrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
CFDictionarySetValue( inDict, CFSTR(kXMLDefaultRecordTypeMapArrayKey), cfArrayRef);
CFRelease(cfArrayRef);
cfArrayRef = nil;
cfArrayRef = (CFMutableArrayRef)CFDictionaryGetValue( inDict, CFSTR( kXMLDefaultRecordTypeMapArrayKey ) );
cfMapCount = 0;
pMapTuple = pStdRecordMapTuple;
while (pMapTuple != nil)
{
cfDictRef = CFDictionaryCreateMutable( kCFAllocatorDefault,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks );
CFArrayInsertValueAtIndex(cfArrayRef, cfMapCount, cfDictRef);
if (pMapTuple->fStandard != nil)
{
cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, pMapTuple->fStandard, kCFStringEncodingUTF8);
CFDictionarySetValue( cfDictRef, CFSTR(kXMLStdNameKey), cfStringRef);
CFRelease(cfStringRef);
cfStringRef = nil;
cfMapCount++;
}
cfNativeArrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
CFDictionarySetValue( cfDictRef, CFSTR(kXMLNativeMapArrayKey), cfNativeArrayRef);
CFRelease(cfNativeArrayRef);
cfNativeArrayRef = nil;
cfNativeArrayRef = (CFMutableArrayRef)CFDictionaryGetValue( cfDictRef, CFSTR( kXMLNativeMapArrayKey ) );
cfNativeMapCount = 0;
pPtrString = pMapTuple->fNative;
while (pPtrString != nil)
{
if (pPtrString->fSubNative != nil) {
cfSubDictRef = CFDictionaryCreateMutable( kCFAllocatorDefault,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks );
if (pPtrString->fName != nil)
{
cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, pPtrString->fName, kCFStringEncodingUTF8);
CFDictionarySetValue( cfSubDictRef, CFSTR(kXMLSearchBase), cfStringRef);
CFRelease(cfStringRef);
cfStringRef = nil;
}
cfSubNativeArrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
CFDictionarySetValue( cfSubDictRef, CFSTR(kXMLObjectClasses), cfSubNativeArrayRef);
CFRelease(cfSubNativeArrayRef);
cfSubNativeArrayRef = nil;
cfSubNativeArrayRef = (CFMutableArrayRef)CFDictionaryGetValue( cfSubDictRef, CFSTR( kXMLObjectClasses ) );
cfSubNativeMapCount = 0;
pSubPtrString = pPtrString->fSubNative;
if( pSubPtrString != nil)
{
if (pSubPtrString->fGroupSubNative != 0) {
cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, "OR", kCFStringEncodingUTF8);
CFDictionarySetValue( cfSubDictRef, CFSTR(kXMLGroupObjectClasses), cfStringRef);
CFRelease(cfStringRef);
cfStringRef = nil;
}
}
while( pSubPtrString != nil)
{
if (pSubPtrString->fName != nil)
{
cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, pSubPtrString->fName, kCFStringEncodingUTF8);
CFArrayInsertValueAtIndex(cfSubNativeArrayRef, cfSubNativeMapCount, cfStringRef);
CFRelease(cfStringRef);
cfStringRef = nil;
cfSubNativeMapCount++;
}
pSubPtrString = pSubPtrString->pNext;
}
CFArrayInsertValueAtIndex(cfNativeArrayRef, cfNativeMapCount, cfSubDictRef);
CFRelease(cfSubDictRef);
cfSubDictRef = nil;
cfNativeMapCount++;
}
else
{
if (pPtrString->fName != nil)
{
cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, pPtrString->fName, kCFStringEncodingUTF8);
CFArrayInsertValueAtIndex(cfNativeArrayRef, cfNativeMapCount, cfStringRef);
CFRelease(cfStringRef);
cfStringRef = nil;
cfNativeMapCount++;
}
}
pPtrString = pPtrString->pNext;
}
pMapTuple = pMapTuple->pNext;
if (cfDictRef != nil)
{
CFRelease(cfDictRef);
cfDictRef = nil;
}
}
}
return siResult;
}
bool CLDAPv3Configs::VerifyXML ( void )
{
bool verified = false;
CFStringRef errorString;
CFPropertyListRef configPropertyList;
if (fXMLData != nil)
{
configPropertyList = CFPropertyListCreateFromXMLData( kAllocatorDefault,
fXMLData,
kCFPropertyListImmutable,
&errorString);
if (configPropertyList != nil )
{
if ( CFDictionaryGetTypeID() == CFGetTypeID( configPropertyList ) )
{
verified = true;
}
CFRelease(configPropertyList);
configPropertyList = nil;
}
}
return( verified);
}
void CLDAPv3Configs::ConfigDHCPObtainedLDAPServer ( char *inServer, char *inMapSearchBase, int inPortNumber, bool inIsSSL, uInt32 &inConfigTableLen )
{
sInt32 siResult = eDSNoErr;
CFDataRef ourXMLData = nil;
CFDataRef newXMLData = nil;
ourXMLData = RetrieveServerMappings( inServer, inMapSearchBase, inPortNumber, inIsSSL );
if (ourXMLData != nil)
{
newXMLData = VerifyAndUpdateServerLocation(inServer, inPortNumber, inIsSSL, ourXMLData);
if (newXMLData != nil)
{
CFRelease(ourXMLData);
ourXMLData = newXMLData;
newXMLData = nil;
}
siResult = AddDefaultLDAPServer(ourXMLData);
if (siResult != eDSNoErr)
{
syslog(LOG_INFO,"DSLDAPv3PlugIn: DHCP option 95 obtained [%s] LDAP server not added to search policy due to server mappings format error.", inServer);
}
inConfigTableLen = fConfigTableLen;
}
else
{
syslog(LOG_INFO,"DSLDAPv3PlugIn: DHCP option 95 obtained [%s] LDAP server not added to search policy due to server mappings error.", inServer);
}
}
sInt32 CLDAPv3Configs::ConfigLDAPServers ( void )
{
sInt32 siResult = eDSNoErr;
CFStringRef errorString;
CFPropertyListRef configPropertyList = nil;
CFMutableDictionaryRef configDict = nil;
CFArrayRef cfArrayRef = nil;
CFIndex cfConfigCount = 0;
CFDataRef xmlData = nil;
char *configVersion = nil;
CFStringRef cfStringRef;
try
{
if (fXMLData != nil)
{
configPropertyList = CFPropertyListCreateFromXMLData( kAllocatorDefault,
fXMLData,
kCFPropertyListImmutable, &errorString);
if (configPropertyList != nil )
{
if ( CFDictionaryGetTypeID() == CFGetTypeID( configPropertyList ) )
{
configDict = (CFMutableDictionaryRef) configPropertyList;
}
if (configDict != nil)
{
configVersion = GetVersion(configDict);
if ( configVersion == nil ) throw( (sInt32)eDSVersionMismatch ); if (configVersion != nil)
{
CShared::LogIt( 0x0F, (char *)"Have successfully read the LDAP XML config file:" );
if (strcmp(configVersion,"DSLDAPv3PlugIn Version 1.5") == 0)
{
}
else
{
CFDictionaryRemoveValue( configDict, CFSTR( kXMLLDAPVersionKey ) );
cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, "DSLDAPv3PlugIn Version 1.5", kCFStringEncodingUTF8);
CFDictionarySetValue( configDict, CFSTR( kXMLLDAPVersionKey ), cfStringRef );
CFRelease(cfStringRef);
cfStringRef = nil;
xmlData = CFPropertyListCreateXMLData( kCFAllocatorDefault, configDict);
siResult = SetXMLConfig(xmlData);
CFRelease(xmlData);
xmlData = nil;
if (siResult == eDSNoErr)
{
WriteXMLConfig();
}
}
cfArrayRef = nil;
cfArrayRef = GetConfigArray(configDict);
if (cfArrayRef != nil)
{
cfConfigCount = ::CFArrayGetCount( cfArrayRef );
for (sInt32 iConfigIndex = 0; iConfigIndex < cfConfigCount; iConfigIndex++)
{
CFDictionaryRef serverConfigDict = nil;
CFDictionaryRef suppliedServerDict = nil;
serverConfigDict = (CFDictionaryRef)::CFArrayGetValueAtIndex( cfArrayRef, iConfigIndex );
if ( serverConfigDict != nil )
{
suppliedServerDict = CheckForServerMappings(serverConfigDict);
if (suppliedServerDict != nil)
{
siResult = MakeLDAPConfig(suppliedServerDict, fConfigTableLen);
CFRelease(suppliedServerDict);
suppliedServerDict = nil;
}
else
{
siResult = MakeLDAPConfig(serverConfigDict, fConfigTableLen);
}
}
}
}
delete(configVersion);
}
}
CFRelease(configPropertyList); configPropertyList = nil;
} }
} catch ( sInt32 err )
{
siResult = err;
if (configPropertyList != nil)
{
CFRelease(configPropertyList); configPropertyList = nil;
}
}
return( siResult );
}
CFDataRef CLDAPv3Configs::RetrieveServerMappings ( char *inServer, char *inMapSearchBase, int inPortNumber, bool inIsSSL )
{
sInt32 siResult = eDSNoErr;
bool bResultFound = false;
int ldapMsgId = -1;
LDAPMessage *result = nil;
int ldapReturnCode = 0;
char *attrs[2] = {"description",NULL};
BerElement *ber;
struct berval **bValues;
char *pAttr = nil;
LDAP *serverHost = nil;
CFDataRef ourMappings = nil;
if ( (inServer != nil) && (inPortNumber != 0) )
{
serverHost = ldap_init( inServer, inPortNumber );
if (serverHost != nil)
{
if (inIsSSL)
{
int ldapOptVal = LDAP_OPT_X_TLS_HARD;
ldap_set_option(serverHost, LDAP_OPT_X_TLS, &ldapOptVal);
}
if (inMapSearchBase == nil)
{
ldapMsgId = ldap_search( serverHost, "", LDAP_SCOPE_SUBTREE, "(&(objectclass=*)(ou=macosxodconfig))", attrs, 0);
}
else
{
ldapMsgId = ldap_search( serverHost, inMapSearchBase, LDAP_SCOPE_SUBTREE, "(&(objectclass=*)(ou=macosxodconfig))", attrs, 0);
}
if ( ldapMsgId == -1 )
{
bResultFound = false;
}
else
{
bResultFound = true;
struct timeval tv;
tv.tv_sec = 60;
tv.tv_usec = 0;
ldapReturnCode = ldap_result(serverHost, ldapMsgId, 0, &tv, &result);
}
if ( ( bResultFound ) && ( ldapReturnCode == LDAP_RES_SEARCH_ENTRY ) )
{
for ( pAttr = ldap_first_attribute (serverHost, result, &ber );
pAttr != NULL; pAttr = ldap_next_attribute(serverHost, result, ber ) )
{
if (( bValues = ldap_get_values_len (serverHost, result, pAttr )) != NULL)
{
if ( bValues[0] != NULL )
{
ourMappings = CFDataCreate(NULL,(UInt8 *)(bValues[0]->bv_val), bValues[0]->bv_len);
}
ldap_value_free_len(bValues);
}
if (pAttr != nil)
{
ldap_memfree( pAttr );
}
}
if (ber != nil)
{
ber_free( ber, 0 );
}
ldap_msgfree( result );
result = nil;
siResult = eDSNoErr;
}
else if (ldapReturnCode == LDAP_TIMEOUT)
{
siResult = eDSServerTimeout;
syslog(LOG_INFO,"DSLDAPv3PlugIn: Retrieval of Server Mappings for [%s] LDAP server has timed out.", inServer);
if ( result != nil )
{
ldap_msgfree( result );
result = nil;
}
}
else
{
siResult = eDSRecordNotFound;
syslog(LOG_INFO,"DSLDAPv3PlugIn: Server Mappings for [%s] LDAP server not found.", inServer);
if ( result != nil )
{
ldap_msgfree( result );
result = nil;
}
}
ldap_unbind( serverHost );
} }
return( ourMappings );
}
sInt32 CLDAPv3Configs::WriteServerMappings ( char* userName, char* password, CFDataRef inMappings )
{
sInt32 siResult = eDSNoErr;
LDAP *serverHost = nil;
CFStringRef errorString;
CFPropertyListRef configPropertyList = nil;
CFMutableDictionaryRef serverConfigDict = nil;
char *server = nil;
int portNumber = 389;
char *tmpBuff = nil;
CFIndex cfBuffSize = 1024;
CFStringRef cfStringRef = nil;
CFBooleanRef cfBool = nil;
CFNumberRef cfNumber = nil;
bool cfNumBool = false;
char *mapSearchBase = nil;
bool bIsSSL = false;
int ldapReturnCode = 0;
int bindMsgId = 0;
LDAPMessage *result = nil;
char *ldapDNString = nil;
uInt32 ldapDNLength = 0;
char *ourXMLBlob = nil;
char *ouvals[2];
char *mapvals[2];
char *ocvals[3];
LDAPMod oumod;
LDAPMod mapmod;
LDAPMod ocmod;
LDAPMod *mods[4];
try
{
if (inMappings != nil)
{
configPropertyList = CFPropertyListCreateFromXMLData( kAllocatorDefault,
inMappings,
kCFPropertyListImmutable,
&errorString);
if (configPropertyList != nil )
{
if ( CFDictionaryGetTypeID() == CFGetTypeID( configPropertyList ) )
{
serverConfigDict = (CFMutableDictionaryRef) configPropertyList; }
if (serverConfigDict != nil)
{
tmpBuff = (char *)::calloc(1, 1024);
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLServerKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLServerKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
server = (char *)::calloc(1+strlen(tmpBuff),1);
::strcpy(server, tmpBuff);
}
}
}
}
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLIsSSLFlagKey ) ) )
{
cfBool= (CFBooleanRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLIsSSLFlagKey ) );
if (cfBool != nil)
{
bIsSSL = CFBooleanGetValue( cfBool );
if (bIsSSL)
{
portNumber = 636;
}
}
}
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLPortNumberKey ) ) )
{
cfNumber = (CFNumberRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLPortNumberKey ) );
if ( cfNumber != nil )
{
cfNumBool = CFNumberGetValue(cfNumber, kCFNumberIntType, &portNumber);
}
}
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLMapSearchBase ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLMapSearchBase ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
mapSearchBase = (char *)::calloc(1+strlen(tmpBuff),1);
::strcpy(mapSearchBase, tmpBuff);
}
}
}
}
free( tmpBuff );
tmpBuff = nil;
}
CFRelease(configPropertyList); configPropertyList = nil;
}
serverHost = ldap_init( server, portNumber );
if ( serverHost == nil ) throw( (sInt32)eDSCannotAccessSession );
if ( bIsSSL )
{
int ldapOptVal = LDAP_OPT_X_TLS_HARD;
ldap_set_option(serverHost, LDAP_OPT_X_TLS, &ldapOptVal);
}
bindMsgId = ldap_bind( serverHost, userName, password, LDAP_AUTH_SIMPLE );
if ( bindMsgId == -1 )
{
throw( (sInt32)eDSCannotAccessSession );
}
{
struct timeval tv;
tv.tv_sec = 120; tv.tv_usec = 0;
ldapReturnCode = ldap_result(serverHost, bindMsgId, 0, &tv, &result);
}
if ( ldapReturnCode == -1 )
{
throw( (sInt32)eDSCannotAccessSession );
}
else if ( ldapReturnCode == 0 )
{
ldap_unbind( serverHost );
serverHost = NULL;
throw( (sInt32)eDSCannotAccessSession );
}
else if ( ldap_result2error(serverHost, result, 1) != LDAP_SUCCESS )
{
throw( (sInt32)eDSCannotAccessSession );
}
if ( (serverHost != nil) && (mapSearchBase != nil) )
{
ldapDNLength = 21 + strlen(mapSearchBase);
ldapDNString = (char *)calloc(1, ldapDNLength + 1);
strcpy(ldapDNString,"ou = macosxodconfig, ");
strcat(ldapDNString,mapSearchBase);
ldapReturnCode = ldap_delete_s( serverHost, ldapDNString);
if ( ( ldapReturnCode == LDAP_INSUFFICIENT_ACCESS ) || ( ldapReturnCode == LDAP_INVALID_CREDENTIALS ) )
{
siResult = eDSPermissionError;
}
else if ( ldapReturnCode == LDAP_NO_SUCH_OBJECT )
{
siResult = eDSRecordNotFound;
}
else if ( ldapReturnCode != LDAP_SUCCESS )
{
siResult = eDSBogusServer;
}
if ( (siResult == eDSRecordNotFound) || (siResult == eDSNoErr) )
{
CFRange aRange;
aRange.location = 0;
aRange.length = CFDataGetLength(inMappings);
ourXMLBlob = (char *) calloc(1, aRange.length + 1);
CFDataGetBytes( inMappings, aRange, (UInt8*)ourXMLBlob );
ouvals[0] = "macosxodconfig";
ouvals[1] = NULL;
oumod.mod_op = 0;
oumod.mod_type = "ou";
oumod.mod_values = ouvals;
mapvals[0] = ourXMLBlob;
mapvals[1] = NULL;
mapmod.mod_op = 0;
mapmod.mod_type = "description";
mapmod.mod_values = mapvals;
ocvals[0] = "top";
ocvals[1] = "organizationalUnit";
ocvals[2] = NULL;
ocmod.mod_op = 0;
ocmod.mod_type = "objectclass";
ocmod.mod_values = ocvals;
mods[0] = &oumod;
mods[1] = &mapmod;
mods[2] = &ocmod;
mods[3] = NULL;
ldapReturnCode = 0;
siResult = eDSNoErr;
ldapReturnCode = ldap_add_s( serverHost, ldapDNString, mods);
if ( ( ldapReturnCode == LDAP_INSUFFICIENT_ACCESS ) || ( ldapReturnCode == LDAP_INVALID_CREDENTIALS ) )
{
siResult = eDSPermissionError;
}
else if ( ldapReturnCode == LDAP_ALREADY_EXISTS )
{
siResult = eDSRecordAlreadyExists;
}
else if ( ldapReturnCode == LDAP_NO_SUCH_OBJECT )
{
siResult = eDSRecordNotFound;
}
else if ( ldapReturnCode != LDAP_SUCCESS )
{
siResult = eDSBogusServer;
}
} } }
} catch ( sInt32 err )
{
siResult = err;
if (configPropertyList != nil)
{
CFRelease(configPropertyList); configPropertyList = nil;
}
}
if ( serverHost != nil )
{
ldap_unbind( serverHost );
serverHost = nil;
}
if ( mapSearchBase != nil )
{
free( mapSearchBase );
mapSearchBase = nil;
}
if ( ourXMLBlob != nil )
{
free( ourXMLBlob );
ourXMLBlob = nil;
}
if ( ldapDNString != nil )
{
free( ldapDNString );
ldapDNString = nil;
}
return( siResult );
}
CFDataRef CLDAPv3Configs::ReadServerMappings ( LDAP *serverHost, CFDataRef inMappings )
{
sInt32 siResult = eDSNoErr;
CFStringRef errorString;
CFPropertyListRef configPropertyList = nil;
CFMutableDictionaryRef serverConfigDict = nil;
char *configVersion = nil;
char *tmpBuff = nil;
CFIndex cfBuffSize = 1024;
CFStringRef cfStringRef = nil;
CFBooleanRef cfBool = false;
char *mapSearchBase = nil;
bool bIsSSL = false;
bool bServerMappings = false;
bool bUseConfig = false;
unsigned char cfNumBool = false;
CFNumberRef cfNumber = 0;
char *server = nil;
int portNumber = 389;
CFDataRef outMappings = nil;
try
{
if (inMappings != nil)
{
configPropertyList = CFPropertyListCreateFromXMLData( kAllocatorDefault,
inMappings,
kCFPropertyListImmutable,
&errorString);
if (configPropertyList != nil )
{
if ( CFDictionaryGetTypeID() == CFGetTypeID( configPropertyList ) )
{
serverConfigDict = (CFMutableDictionaryRef) configPropertyList; }
if (serverConfigDict != nil)
{
configVersion = GetVersion(serverConfigDict);
if ( configVersion == nil ) throw( (sInt32)eDSVersionMismatch ); if (configVersion != nil)
{
if (strcmp(configVersion,"DSLDAPv3PlugIn Version 1.5") == 0)
{
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLEnableUseFlagKey ) ) )
{
tmpBuff = (char *)::calloc(1, 1024);
cfBool = (CFBooleanRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLEnableUseFlagKey ) );
if (cfBool != nil)
{
bUseConfig = CFBooleanGetValue( cfBool );
}
if ( bUseConfig )
{
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLServerMappingsFlagKey ) ) )
{
cfBool = (CFBooleanRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLServerMappingsFlagKey ) );
if (cfBool != nil)
{
bServerMappings = CFBooleanGetValue( cfBool );
}
}
if (bServerMappings)
{
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLServerKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLServerKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
server = (char *)::calloc(1+strlen(tmpBuff),1);
::strcpy(server, tmpBuff);
}
}
}
}
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLIsSSLFlagKey ) ) )
{
cfBool= (CFBooleanRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLIsSSLFlagKey ) );
if (cfBool != nil)
{
bIsSSL = CFBooleanGetValue( cfBool );
if (bIsSSL)
{
portNumber = 636; }
}
}
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLPortNumberKey ) ) )
{
cfNumber = (CFNumberRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLPortNumberKey ) );
if ( cfNumber != nil )
{
cfNumBool = CFNumberGetValue(cfNumber, kCFNumberIntType, &portNumber);
}
}
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLMapSearchBase ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLMapSearchBase ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
mapSearchBase = (char *)::calloc(1+strlen(tmpBuff),1);
::strcpy(mapSearchBase, tmpBuff);
}
}
}
}
}
}
free( tmpBuff );
tmpBuff = nil;
} }
free( configVersion );
configVersion = nil;
}
}
CFRelease(configPropertyList); configPropertyList = nil;
}
outMappings = RetrieveServerMappings( server, mapSearchBase, portNumber, bIsSSL );
}
} catch ( sInt32 err )
{
siResult = err;
if (configPropertyList != nil)
{
CFRelease(configPropertyList); configPropertyList = nil;
}
}
if ( server != nil )
{
free( server );
server = nil;
}
if ( mapSearchBase != nil )
{
free( mapSearchBase );
mapSearchBase = nil;
}
return( outMappings );
}
CFDataRef CLDAPv3Configs::VerifyAndUpdateServerLocation( char *inServer, int inPortNumber, bool inIsSSL, CFDataRef inXMLData )
{
CFStringRef errorString = nil;
CFPropertyListRef configPropertyList = nil;
CFMutableDictionaryRef serverConfigDict = nil;
char *configVersion = nil;
char *server = nil;
int portNumber = 389;
bool bIsSSL = false;
char *tmpBuff = nil;
CFStringRef cfStringRef = nil;
bool bUpdate = false;
CFBooleanRef cfBool = false;
CFNumberRef cfNumber = 0;
CFIndex cfBuffSize = 1024;
unsigned char cfNumBool = false;
CFDataRef outXMLData = nil;
if (inXMLData != nil)
{
configPropertyList = CFPropertyListCreateFromXMLData( kAllocatorDefault,
inXMLData,
kCFPropertyListMutableContainers,
&errorString);
if (configPropertyList != nil )
{
if ( CFDictionaryGetTypeID() == CFGetTypeID( configPropertyList ) )
{
serverConfigDict = (CFMutableDictionaryRef) configPropertyList; }
if (serverConfigDict != nil)
{
configVersion = GetVersion(serverConfigDict);
if ( configVersion == nil )
{
CFRelease(configPropertyList); configPropertyList = nil;
return nil;
}
else
{
CShared::LogIt( 0x0F, (char *)"Have successfully read the LDAP XML config data" );
if (strcmp(configVersion,"DSLDAPv3PlugIn Version 1.5") == 0)
{
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLServerKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLServerKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
tmpBuff = (char *)::calloc(1, 1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
server = (char *)::calloc(1+strlen(tmpBuff),1);
::strcpy(server, tmpBuff);
if (strcmp(server,inServer) != 0)
{
bUpdate = true;
cfStringRef = CFStringCreateWithCString(kCFAllocatorDefault, inServer, kCFStringEncodingUTF8);
CFDictionaryReplaceValue(serverConfigDict, CFSTR( kXMLServerKey ), cfStringRef);
CFRelease(cfStringRef);
cfStringRef = nil;
}
free(server);
server = nil;
}
free(tmpBuff);
tmpBuff = nil;
}
}
}
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLPortNumberKey ) ) )
{
cfNumber = (CFNumberRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLPortNumberKey ) );
if ( cfNumber != nil )
{
cfNumBool = CFNumberGetValue(cfNumber, kCFNumberIntType, &portNumber);
if (portNumber != inPortNumber)
{
bUpdate = true;
cfNumber = CFNumberCreate(NULL,kCFNumberIntType,&inPortNumber);
CFDictionaryReplaceValue(serverConfigDict, CFSTR( kXMLPortNumberKey ), cfNumber);
CFRelease(cfNumber);
cfNumber = 0;
}
}
}
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLIsSSLFlagKey ) ) )
{
cfBool= (CFBooleanRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLIsSSLFlagKey ) );
if (cfBool != nil)
{
bIsSSL = CFBooleanGetValue( cfBool );
if (bIsSSL != inIsSSL)
{
bUpdate = true;
if (inIsSSL)
{
cfBool = kCFBooleanTrue;
}
else
{
cfBool = kCFBooleanFalse;
}
CFDictionaryReplaceValue(serverConfigDict, CFSTR( kXMLIsSSLFlagKey ), cfBool);
}
}
}
if ( CFDictionaryContainsKey( serverConfigDict, CFSTR( kXMLMakeDefLDAPFlagKey ) ) )
{
cfBool = (CFBooleanRef)CFDictionaryGetValue( serverConfigDict, CFSTR( kXMLMakeDefLDAPFlagKey ) );
if (cfBool == kCFBooleanFalse)
{
bUpdate = true;
CFDictionaryReplaceValue(serverConfigDict, CFSTR( kXMLMakeDefLDAPFlagKey ), kCFBooleanTrue);
}
}
else
{
bUpdate = true;
CFDictionarySetValue(serverConfigDict, CFSTR( kXMLMakeDefLDAPFlagKey ), kCFBooleanTrue);
}
if (bUpdate)
{
outXMLData = CFPropertyListCreateXMLData( kCFAllocatorDefault, serverConfigDict);
}
}
delete(configVersion);
} }
CFRelease(configPropertyList); configPropertyList = nil;
} }
return( outXMLData );
}
sInt32 CLDAPv3Configs::AddDefaultLDAPServer( CFDataRef inXMLData )
{
sInt32 siResult = eDSNoErr;
CFStringRef errorString = nil;
CFPropertyListRef configPropertyList = nil;
CFMutableDictionaryRef serverConfigDict = nil;
char *configVersion = nil;
try
{
if (inXMLData != nil)
{
configPropertyList = CFPropertyListCreateFromXMLData( kAllocatorDefault,
inXMLData,
kCFPropertyListImmutable,
&errorString);
if (configPropertyList != nil )
{
if ( CFDictionaryGetTypeID() == CFGetTypeID( configPropertyList ) )
{
serverConfigDict = (CFMutableDictionaryRef) configPropertyList; }
if (serverConfigDict != nil)
{
configVersion = GetVersion(serverConfigDict);
if ( configVersion == nil )
{
syslog(LOG_INFO,"DSLDAPv3PlugIn: DHCP option 95 obtained LDAP server mappings is missing the version string.");
throw( (sInt32)eDSVersionMismatch ); }
if (configVersion != nil)
{
CShared::LogIt( 0x0F, (char *)"Have successfully read the LDAP XML config data" );
if (strcmp(configVersion,"DSLDAPv3PlugIn Version 1.5") == 0)
{
siResult = MakeLDAPConfig(serverConfigDict, fConfigTableLen);
}
else
{
syslog(LOG_INFO,"DSLDAPv3PlugIn: DHCP option 95 obtained LDAP server mappings contains incorrect version string [%s] instead of [DSLDAPv3PlugIn Version 1.5].", configVersion);
}
delete(configVersion);
}
}
CFRelease(configPropertyList); configPropertyList = nil;
} }
} catch ( sInt32 err )
{
siResult = err;
if (configPropertyList != nil)
{
CFRelease(configPropertyList); configPropertyList = nil;
}
}
return( siResult );
}
CFDictionaryRef CLDAPv3Configs::CheckForServerMappings ( CFDictionaryRef ldapDict )
{
char *tmpBuff = nil;
CFIndex cfBuffSize = 1024;
CFStringRef cfStringRef = nil;
CFBooleanRef cfBool = false;
unsigned char cfNumBool = false;
CFNumberRef cfNumber = 0;
char *server = nil;
char *mapSearchBase = nil;
int portNumber = 389;
bool bIsSSL = false;
bool bServerMappings = false;
bool bUseConfig = false;
CFDictionaryRef outDict = nil;
CFStringRef errorString;
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLEnableUseFlagKey ) ) )
{
tmpBuff = (char *)::calloc(1, 1024);
cfBool = (CFBooleanRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLEnableUseFlagKey ) );
if (cfBool != nil)
{
bUseConfig = CFBooleanGetValue( cfBool );
}
if ( bUseConfig )
{
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLServerMappingsFlagKey ) ) )
{
cfBool = (CFBooleanRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLServerMappingsFlagKey ) );
if (cfBool != nil)
{
bServerMappings = CFBooleanGetValue( cfBool );
}
}
if (bServerMappings)
{
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLServerKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLServerKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
server = (char *)::calloc(1+strlen(tmpBuff),1);
::strcpy(server, tmpBuff);
}
}
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLIsSSLFlagKey ) ) )
{
cfBool= (CFBooleanRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLIsSSLFlagKey ) );
if (cfBool != nil)
{
bIsSSL = CFBooleanGetValue( cfBool );
if (bIsSSL)
{
portNumber = 636; }
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLPortNumberKey ) ) )
{
cfNumber = (CFNumberRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLPortNumberKey ) );
if ( cfNumber != nil )
{
cfNumBool = CFNumberGetValue(cfNumber, kCFNumberIntType, &portNumber);
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLMapSearchBase ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLMapSearchBase ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
mapSearchBase = (char *)::calloc(1+strlen(tmpBuff),1);
::strcpy(mapSearchBase, tmpBuff);
}
}
}
}
CFDataRef ourXMLData = nil;
ourXMLData = RetrieveServerMappings( server, mapSearchBase, portNumber, bIsSSL );
if (ourXMLData != nil)
{
CFPropertyListRef configPropertyList = nil;
configPropertyList = CFPropertyListCreateFromXMLData( kAllocatorDefault,
ourXMLData,
kCFPropertyListImmutable,
&errorString);
if (configPropertyList != nil )
{
if ( CFDictionaryGetTypeID() == CFGetTypeID( configPropertyList ) )
{
outDict = (CFDictionaryRef) configPropertyList;
}
}
CFRelease(ourXMLData);
ourXMLData = nil;
}
}
if ( server != nil )
{
free( server );
server = nil;
}
if ( mapSearchBase != nil )
{
free( mapSearchBase );
mapSearchBase = nil;
}
}
delete( tmpBuff );
}
return( outDict );
}
sInt32 CLDAPv3Configs::MakeLDAPConfig ( CFDictionaryRef ldapDict, sInt32 inIndex )
{
sInt32 siResult = eDSNoErr;
char *tmpBuff = nil;
CFIndex cfBuffSize = 1024;
CFStringRef cfStringRef = nil;
CFDataRef cfDataRef = nil;
CFBooleanRef cfBool = false;
unsigned char cfNumBool = false;
CFNumberRef cfNumber = 0;
char *uiName = nil;
char *server = nil;
char *account = nil;
char *password = nil;
int passwordLen = 0;
int opencloseTO = 120;
int idleTO = 2;
int delayRebindTry = 120;
int searchTO = 120;
int portNumber = 389;
bool bIsSSL = false;
bool bServerMappings = false;
bool bMakeDefLDAP= false;
bool bUseStdMap = false;
bool bUseSecure = false;
bool bUseConfig = false;
sLDAPConfigData *pConfig = nil;
sLDAPConfigData *xConfig = nil;
uInt32 serverIndex = 0;
bool reuseEntry = false;
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLEnableUseFlagKey ) ) )
{
tmpBuff = (char *)::calloc(1, 1024);
cfBool = (CFBooleanRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLEnableUseFlagKey ) );
if (cfBool != nil)
{
bUseConfig = CFBooleanGetValue( cfBool );
}
if ( bUseConfig )
{
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLServerKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLServerKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
server = (char *)::calloc(1+strlen(tmpBuff),1);
::strcpy(server, tmpBuff);
}
}
}
}
if (CheckForConfig(server, serverIndex))
{
reuseEntry = true;
xConfig = (sLDAPConfigData *)pConfigTable->GetItemData( serverIndex );
if (xConfig != nil)
{
CleanLDAPConfigData( xConfig );
delete( xConfig );
xConfig = nil;
pConfigTable->RemoveItem( serverIndex );
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLIsSSLFlagKey ) ) )
{
cfBool= (CFBooleanRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLIsSSLFlagKey ) );
if (cfBool != nil)
{
bIsSSL = CFBooleanGetValue( cfBool );
if (bIsSSL)
{
portNumber = 636; }
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLPortNumberKey ) ) )
{
cfNumber = (CFNumberRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLPortNumberKey ) );
if ( cfNumber != nil )
{
cfNumBool = CFNumberGetValue(cfNumber, kCFNumberIntType, &portNumber);
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLServerMappingsFlagKey ) ) )
{
cfBool = (CFBooleanRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLServerMappingsFlagKey ) );
if (cfBool != nil)
{
bServerMappings = CFBooleanGetValue( cfBool );
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLOpenCloseTimeoutSecsKey ) ) )
{
cfNumber = (CFNumberRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLOpenCloseTimeoutSecsKey ) );
if ( cfNumber != nil )
{
cfNumBool = CFNumberGetValue(cfNumber, kCFNumberIntType, &opencloseTO);
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLIdleTimeoutMinsKey ) ) )
{
cfNumber = (CFNumberRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLIdleTimeoutMinsKey ) );
if ( cfNumber != nil )
{
cfNumBool = CFNumberGetValue(cfNumber, kCFNumberIntType, &idleTO);
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLDelayedRebindTrySecsKey ) ) )
{
cfNumber = (CFNumberRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLDelayedRebindTrySecsKey ) );
if ( cfNumber != nil )
{
cfNumBool = CFNumberGetValue(cfNumber, kCFNumberIntType, &delayRebindTry);
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLSearchTimeoutSecsKey ) ) )
{
cfNumber = (CFNumberRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLSearchTimeoutSecsKey ) );
if ( cfNumber != nil )
{
cfNumBool = CFNumberGetValue(cfNumber, kCFNumberIntType, &searchTO);
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLSecureUseFlagKey ) ) )
{
cfBool= (CFBooleanRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLSecureUseFlagKey ) );
if (cfBool != nil)
{
bUseSecure = CFBooleanGetValue( cfBool );
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLUserDefinedNameKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLUserDefinedNameKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
uiName = (char *)::calloc(1+strlen(tmpBuff),1);
::strcpy(uiName, tmpBuff);
}
}
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLServerAccountKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLServerAccountKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
account = (char *)::calloc(1+strlen(tmpBuff),1);
::strcpy(account, tmpBuff);
}
}
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLServerPasswordKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLServerPasswordKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFDataGetTypeID() )
{
cfDataRef = (CFDataRef)cfStringRef;
passwordLen = CFDataGetLength(cfDataRef);
password = (char*)::calloc(1+passwordLen,1);
CFDataGetBytes(cfDataRef, CFRangeMake(0,passwordLen), (UInt8*)password);
}
else if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
password = (char *)::calloc(1+strlen(tmpBuff),1);
::strcpy(password, tmpBuff);
}
}
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLStdMapUseFlagKey ) ) )
{
cfBool = (CFBooleanRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLStdMapUseFlagKey ) );
if (cfBool != nil)
{
bUseStdMap = CFBooleanGetValue( cfBool );
}
}
if ( CFDictionaryContainsKey( ldapDict, CFSTR( kXMLMakeDefLDAPFlagKey ) ) )
{
cfBool = (CFBooleanRef)CFDictionaryGetValue( ldapDict, CFSTR( kXMLMakeDefLDAPFlagKey ) );
if (cfBool != nil)
{
bMakeDefLDAP = CFBooleanGetValue( cfBool );
}
}
pConfig = MakeLDAPConfigData( uiName, server, bUseStdMap, opencloseTO, idleTO, delayRebindTry, searchTO, portNumber, bUseSecure, account, password, bMakeDefLDAP, bServerMappings, bIsSSL );
if (!bUseStdMap) {
BuildLDAPMap( pConfig, ldapDict );
}
if ( uiName != nil )
{
free( uiName );
uiName = nil;
}
if ( server != nil )
{
free( server );
server = nil;
}
if ( account != nil )
{
free( account );
account = nil;
}
if ( password != nil )
{
free( password );
password = nil;
}
if (reuseEntry)
{
pConfigTable->AddItem( serverIndex, pConfig );
}
else
{
pConfigTable->AddItem( inIndex, pConfig );
fConfigTableLen++;
}
}
delete( tmpBuff );
}
return( siResult );
}
bool CLDAPv3Configs::CheckForConfig ( char *inServerName, uInt32 &inConfigTableIndex )
{
bool result = false;
uInt32 iTableIndex = 0;
sLDAPConfigData *pConfig = nil;
if (inServerName != nil)
{
for (iTableIndex=0; iTableIndex<fConfigTableLen; iTableIndex++)
{
pConfig = (sLDAPConfigData *)pConfigTable->GetItemData( iTableIndex );
if (pConfig != nil)
{
if (pConfig->fServerName != nil)
{
if (::strcmp(pConfig->fServerName, inServerName) == 0 )
{
result = true;
inConfigTableIndex = iTableIndex;
break;
}
}
}
}
}
return(result);
}
sInt32 CLDAPv3Configs::BuildLDAPMap ( sLDAPConfigData *inConfig, CFDictionaryRef ldapDict )
{
sInt32 siResult = eDSNoErr; CFArrayRef cfArrayRef = nil;
cfArrayRef = nil;
cfArrayRef = GetRecordTypeMapArray(ldapDict);
if (cfArrayRef != nil)
{
inConfig->fRecordTypeMapCFArray = CFArrayCreateCopy(kCFAllocatorDefault, cfArrayRef);
}
cfArrayRef = nil;
cfArrayRef = GetAttributeTypeMapArray(ldapDict);
if (cfArrayRef != nil)
{
inConfig->fAttrTypeMapCFArray = CFArrayCreateCopy(kCFAllocatorDefault, cfArrayRef);
}
return( siResult );
}
sMapTuple *CLDAPv3Configs::BuildMapTuple ( CFArrayRef inArray )
{
CFArrayRef cfArrayRef = nil;
CFIndex cfMapCount = 0;
CFIndex cfNativeMapCount = 0;
CFIndex cfSubNativeMapCount = 0;
sInt32 iMapIndex = 0;
sInt32 iNativeMapIndex = 0;
sInt32 iSubNativeMapIndex = 0;
bool bUseMap = false;
CFStringRef cfStringRef = nil;
char *tmpBuff = nil;
CFIndex cfBuffSize = 1024;
char *stdMapType = nil;
char *nativeMapType = nil;
CFArrayRef cfNativeArrayRef = nil;
sMapTuple *pMapTuple = nil;
sMapTuple *currentMapTuple = nil;
sPtrString *currentNativeMap = nil;
sPtrString *currentSubNativeMap = nil;
sInt32 siResult = eDSNoErr;
char *objectClass = nil;
cfArrayRef = inArray;
if (cfArrayRef != nil)
{
cfMapCount = ::CFArrayGetCount( cfArrayRef );
if (cfMapCount != 0)
{
tmpBuff = (char *) calloc(1, 1024);
for (iMapIndex = 0; iMapIndex < cfMapCount; iMapIndex++)
{
CFDictionaryRef typeMapDict;
typeMapDict = (CFDictionaryRef)::CFArrayGetValueAtIndex( cfArrayRef, iMapIndex );
if ( typeMapDict != nil )
{
if ( CFDictionaryContainsKey( typeMapDict, CFSTR( kXMLStdNameKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( typeMapDict, CFSTR( kXMLStdNameKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
stdMapType = new char[1+strlen(tmpBuff)];
::strcpy(stdMapType, tmpBuff);
}
}
}
}
cfNativeArrayRef = nil;
cfNativeArrayRef = GetNativeTypeMapArray(typeMapDict);
if (cfNativeArrayRef != nil)
{
cfNativeMapCount = ::CFArrayGetCount( cfNativeArrayRef );
if ((cfNativeMapCount != 0) && (stdMapType != nil))
{
if (pMapTuple == nil)
{
pMapTuple = new sMapTuple;
currentMapTuple = pMapTuple;
}
else
{
currentMapTuple->pNext = new sMapTuple;
currentMapTuple = currentMapTuple->pNext;
}
if ( currentMapTuple != nil )
{
::memset( currentMapTuple, 0, sizeof( sMapTuple ) );
currentMapTuple->fStandard = stdMapType;
currentMapTuple->pNext = nil;
}
for (iNativeMapIndex = 0; iNativeMapIndex < cfNativeMapCount; iNativeMapIndex++)
{
if (CFGetTypeID(CFArrayGetValueAtIndex( cfNativeArrayRef, iNativeMapIndex )) == CFStringGetTypeID())
{
CFStringRef nativeMapString;
nativeMapString = (CFStringRef)::CFArrayGetValueAtIndex( cfNativeArrayRef, iNativeMapIndex );
if ( nativeMapString != nil )
{
if ( CFGetTypeID( nativeMapString ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(nativeMapString, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
nativeMapType = new char[1+strlen(tmpBuff)];
::strcpy(nativeMapType, tmpBuff);
if (currentMapTuple->fNative == nil)
{
currentMapTuple->fNative = new sPtrString;
currentNativeMap = currentMapTuple->fNative;
}
else
{
currentNativeMap->pNext = new sPtrString;
currentNativeMap = currentNativeMap->pNext;
}
if ( currentNativeMap != nil )
{
::memset( currentNativeMap, 0, sizeof( sPtrString ) );
currentNativeMap->fName = nativeMapType;
currentNativeMap->pNext = nil;
bUseMap = true;
}
}
}
} } else {
CFDictionaryRef subNativeDict;
subNativeDict = (CFDictionaryRef)CFArrayGetValueAtIndex( cfNativeArrayRef, iNativeMapIndex );
if (subNativeDict != nil)
{
if ( CFGetTypeID( subNativeDict ) == CFDictionaryGetTypeID() )
{
CFStringRef searchBase;
searchBase = (CFStringRef)CFDictionaryGetValue( subNativeDict, CFSTR( kXMLSearchBase ) );
if (searchBase != nil)
{
if ( CFGetTypeID( searchBase ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(searchBase, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
nativeMapType = new char[1+strlen(tmpBuff)];
::strcpy(nativeMapType, tmpBuff);
if (currentMapTuple->fNative == nil)
{
currentMapTuple->fNative = new sPtrString;
currentNativeMap = currentMapTuple->fNative;
}
else
{
currentNativeMap->pNext = new sPtrString;
currentNativeMap = currentNativeMap->pNext;
}
if ( currentNativeMap != nil )
{
::memset( currentNativeMap, 0, sizeof( sPtrString ) );
currentNativeMap->fName = nativeMapType;
currentNativeMap->pNext = nil;
bUseMap = true;
CFArrayRef objectClasses;
objectClasses = (CFArrayRef)CFDictionaryGetValue( subNativeDict, CFSTR( kXMLObjectClasses ) );
if (objectClasses != nil)
{
if ( CFGetTypeID( objectClasses ) == CFArrayGetTypeID() )
{
CFStringRef groupOCString = nil;
groupOCString = (CFStringRef)CFDictionaryGetValue( subNativeDict, CFSTR( kXMLGroupObjectClasses ) );
if ( groupOCString != nil )
{
if ( CFGetTypeID( groupOCString ) == CFStringGetTypeID() )
{
if (CFStringCompare( groupOCString, CFSTR("AND"), 0 ) == kCFCompareEqualTo)
{
currentNativeMap->fGroupSubNative = 0;
}
else
{
currentNativeMap->fGroupSubNative = 1;
}
}
}
cfSubNativeMapCount = ::CFArrayGetCount( objectClasses );
for (iSubNativeMapIndex = 0; iSubNativeMapIndex < cfSubNativeMapCount; iSubNativeMapIndex++)
{
CFStringRef objectClassString = nil;
objectClassString = (CFStringRef)::CFArrayGetValueAtIndex( objectClasses, iSubNativeMapIndex );
if ( objectClassString != nil )
{
if ( CFGetTypeID( objectClassString ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(objectClassString, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
objectClass = new char[1+strlen(tmpBuff)];
::strcpy(objectClass, tmpBuff);
if (currentNativeMap->fSubNative == nil)
{
currentNativeMap->fSubNative = new sPtrString;
currentSubNativeMap = currentNativeMap->fSubNative;
}
else
{
currentSubNativeMap->pNext = new sPtrString;
currentSubNativeMap = currentSubNativeMap->pNext;
}
if ( currentSubNativeMap != nil )
{
::memset( currentSubNativeMap, 0, sizeof( sPtrString ) );
currentSubNativeMap->fName = objectClass;
currentSubNativeMap->pNext = nil;
}
} } } } } } } } } }
}
}
}
}
} else if (stdMapType != nil)
{
free( stdMapType );
stdMapType = nil;
}
}
}
}
delete( tmpBuff );
}
}
if (!bUseMap)
{
siResult = CleanMapTuple(pMapTuple);
}
return( pMapTuple );
}
char *CLDAPv3Configs::GetVersion ( CFDictionaryRef configDict )
{
char *outVersion = nil;
CFStringRef cfStringRef = nil;
char *tmpBuff = nil;
CFIndex cfBuffSize = 1024;
if ( CFDictionaryContainsKey( configDict, CFSTR( kXMLLDAPVersionKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( configDict, CFSTR( kXMLLDAPVersionKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
tmpBuff = new char[1024];
::memset(tmpBuff,0,1024);
if (CFStringGetCString(cfStringRef, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
outVersion = new char[1+strlen(tmpBuff)];
::strcpy(outVersion, tmpBuff);
}
delete( tmpBuff );
}
}
}
return( outVersion );
}
CFArrayRef CLDAPv3Configs::GetConfigArray ( CFDictionaryRef configDict )
{
CFArrayRef cfArrayRef = nil;
if ( CFDictionaryContainsKey( configDict, CFSTR( kXMLConfigArrayKey ) ) )
{
cfArrayRef = (CFArrayRef)CFDictionaryGetValue( configDict, CFSTR( kXMLConfigArrayKey ) );
}
return( cfArrayRef );
}
CFArrayRef CLDAPv3Configs::GetDefaultRecordTypeMapArray ( CFDictionaryRef configDict )
{
CFArrayRef cfArrayRef = nil;
if ( CFDictionaryContainsKey( configDict, CFSTR( kXMLDefaultRecordTypeMapArrayKey ) ) )
{
cfArrayRef = (CFArrayRef)CFDictionaryGetValue( configDict, CFSTR( kXMLDefaultRecordTypeMapArrayKey ) );
}
return( cfArrayRef );
}
CFArrayRef CLDAPv3Configs::GetDefaultAttrTypeMapArray ( CFDictionaryRef configDict )
{
CFArrayRef cfArrayRef = nil;
if ( CFDictionaryContainsKey( configDict, CFSTR( kXMLDefaultAttrTypeMapArrayKey ) ) )
{
cfArrayRef = (CFArrayRef)CFDictionaryGetValue( configDict, CFSTR( kXMLDefaultAttrTypeMapArrayKey ) );
}
return( cfArrayRef );
}
CFArrayRef CLDAPv3Configs::GetRecordTypeMapArray ( CFDictionaryRef configDict )
{
CFArrayRef cfArrayRef = nil;
if ( CFDictionaryContainsKey( configDict, CFSTR( kXMLRecordTypeMapArrayKey ) ) )
{
cfArrayRef = (CFArrayRef)CFDictionaryGetValue( configDict, CFSTR( kXMLRecordTypeMapArrayKey ) );
}
return( cfArrayRef );
}
CFArrayRef CLDAPv3Configs::GetAttributeTypeMapArray ( CFDictionaryRef configDict )
{
CFArrayRef cfArrayRef = nil;
if ( CFDictionaryContainsKey( configDict, CFSTR( kXMLAttrTypeMapArrayKey ) ) )
{
cfArrayRef = (CFArrayRef)CFDictionaryGetValue( configDict, CFSTR( kXMLAttrTypeMapArrayKey ) );
}
return( cfArrayRef );
}
CFArrayRef CLDAPv3Configs::GetNativeTypeMapArray ( CFDictionaryRef configDict )
{
CFArrayRef cfArrayRef = nil;
if ( CFDictionaryContainsKey( configDict, CFSTR( kXMLNativeMapArrayKey ) ) )
{
cfArrayRef = (CFArrayRef)CFDictionaryGetValue( configDict, CFSTR( kXMLNativeMapArrayKey ) );
}
return( cfArrayRef );
}
sLDAPConfigData *CLDAPv3Configs::MakeLDAPConfigData ( char *inName, char *inServerName, bool inUseStd,
int inOpenCloseTO, int inIdleTO, int inDelayRebindTry,
int inSearchTO, int inPortNum,
bool inUseSecure,
char *inAccount, char *inPassword,
bool inMakeDefLDAP,
bool inServerMappings,
bool inIsSSL )
{
sInt32 siResult = eDSNoErr;
sLDAPConfigData *configOut = nil;
if (inServerName != nil)
{
configOut = new sLDAPConfigData;
if ( configOut != nil )
{
::memset( configOut, 0, sizeof( sLDAPConfigData ) );
siResult = CleanLDAPConfigData(configOut);
if (inName != nil)
{
configOut->fName = new char[1+::strlen( inName )];
::strcpy(configOut->fName, inName);
}
configOut->fServerName = new char[1+::strlen( inServerName )];
::strcpy(configOut->fServerName, inServerName);
configOut->bUseStdMapping = inUseStd;
configOut->fOpenCloseTimeout = inOpenCloseTO;
configOut->fIdleTimeout = inIdleTO;
configOut->fDelayRebindTry = inDelayRebindTry;
configOut->fSearchTimeout = inSearchTO;
configOut->fServerPort = inPortNum;
configOut->bSecureUse = inUseSecure;
configOut->bUpdated = true;
configOut->bUseAsDefaultLDAP = inMakeDefLDAP;
configOut->bServerMappings = inServerMappings;
configOut->bIsSSL = inIsSSL;
if (inAccount != nil)
{
configOut->fServerAccount = new char[1+::strlen( inAccount )];
::strcpy(configOut->fServerAccount, inAccount);
}
if (inPassword != nil)
{
configOut->fServerPassword = new char[1+::strlen( inPassword )];
::strcpy(configOut->fServerPassword, inPassword);
}
configOut->fRecordTypeMapCFArray = 0;
configOut->fAttrTypeMapCFArray = 0;
}
}
return( configOut );
}
sInt32 CLDAPv3Configs::CleanLDAPConfigData ( sLDAPConfigData *inConfig )
{
sInt32 siResult = eDSNoErr;
if ( inConfig == nil )
{
siResult = eDSBadContextData; }
else
{
if (inConfig->fName != nil)
{
delete ( inConfig->fName );
}
if (inConfig->fServerName != nil)
{
delete ( inConfig->fServerName );
}
if (inConfig->fServerAccount != nil)
{
delete ( inConfig->fServerAccount );
}
if (inConfig->fServerPassword != nil)
{
delete ( inConfig->fServerPassword );
}
inConfig->fName = nil;
inConfig->fServerName = nil;
inConfig->fServerAccount = nil;
inConfig->fServerPassword = nil;
if (inConfig->fRecordTypeMapCFArray != 0)
{
CFRelease(inConfig->fRecordTypeMapCFArray);
inConfig->fRecordTypeMapCFArray = 0;
}
if (inConfig->fAttrTypeMapCFArray != 0)
{
CFRelease(inConfig->fAttrTypeMapCFArray);
inConfig->fAttrTypeMapCFArray = 0;
}
inConfig->bUseStdMapping = true;
inConfig->fOpenCloseTimeout = 120;
inConfig->fIdleTimeout = 2;
inConfig->fDelayRebindTry = 120;
inConfig->fSearchTimeout = 120;
inConfig->fServerPort = 389;
inConfig->bSecureUse = false;
inConfig->bAvail = false;
inConfig->bUpdated = false;
inConfig->bUseAsDefaultLDAP = false;
inConfig->bServerMappings = false;
inConfig->bIsSSL = false;
if (inConfig->fObjectClassSchema != nil)
{
inConfig->fObjectClassSchema->clear();
}
}
return( siResult );
}
char* CLDAPv3Configs::ExtractRecMap( char *inRecType, CFArrayRef inRecordTypeMapCFArray, int inIndex, bool *outOCGroup, CFArrayRef *outOCListCFArray, ber_int_t* outScope )
{
char *outResult = nil;
CFIndex cfMapCount = 0;
CFIndex cfNativeMapCount = 0;
sInt32 iMapIndex = 0;
CFStringRef cfStringRef = nil;
CFStringRef cfRecTypeRef = nil;
CFBooleanRef cfBoolRef = nil;
char *tmpBuff = nil;
CFIndex cfBuffSize = 1024;
CFArrayRef cfNativeArrayRef = nil;
if ( (inRecordTypeMapCFArray != nil) && (inRecType != nil) )
{
cfRecTypeRef = CFStringCreateWithCString(kCFAllocatorDefault, inRecType, kCFStringEncodingUTF8);
cfMapCount = ::CFArrayGetCount( inRecordTypeMapCFArray );
if (cfMapCount != 0)
{
for (iMapIndex = 0; iMapIndex < cfMapCount; iMapIndex++)
{
CFDictionaryRef typeMapDict;
typeMapDict = (CFDictionaryRef)::CFArrayGetValueAtIndex( inRecordTypeMapCFArray, iMapIndex );
if ( typeMapDict != nil )
{
if ( CFDictionaryContainsKey( typeMapDict, CFSTR( kXMLStdNameKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( typeMapDict, CFSTR( kXMLStdNameKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
if (CFStringCompare(cfStringRef, cfRecTypeRef, 0) == kCFCompareEqualTo)
{
cfNativeArrayRef = GetNativeTypeMapArray(typeMapDict);
if (cfNativeArrayRef != nil)
{
cfNativeMapCount = ::CFArrayGetCount( cfNativeArrayRef );
if (cfNativeMapCount != 0)
{
if ( (inIndex >= 1) && (inIndex <= cfNativeMapCount) )
{
tmpBuff = (char *) calloc(1, 1024);
if (CFGetTypeID(CFArrayGetValueAtIndex( cfNativeArrayRef, inIndex-1 )) == CFStringGetTypeID())
{
CFStringRef nativeMapString;
nativeMapString = (CFStringRef)::CFArrayGetValueAtIndex( cfNativeArrayRef, inIndex-1 );
if ( nativeMapString != nil )
{
if (CFStringGetCString(nativeMapString, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
outResult = (char *) calloc(1, 1+strlen(tmpBuff));
::strcpy(outResult, tmpBuff);
}
} if ( outScope != nil )
{
*outScope = LDAP_SCOPE_SUBTREE;
}
} else {
CFDictionaryRef subNativeDict;
subNativeDict = (CFDictionaryRef)CFArrayGetValueAtIndex( cfNativeArrayRef, inIndex-1 );
if (subNativeDict != nil)
{
if ( CFGetTypeID( subNativeDict ) == CFDictionaryGetTypeID() )
{
CFStringRef searchBase;
searchBase = (CFStringRef)CFDictionaryGetValue( subNativeDict, CFSTR( kXMLSearchBase ) );
if (searchBase != nil)
{
if ( CFGetTypeID( searchBase ) == CFStringGetTypeID() )
{
::memset(tmpBuff,0,1024);
if (CFStringGetCString(searchBase, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
outResult = (char *) calloc(1, 1+strlen(tmpBuff));
::strcpy(outResult, tmpBuff);
CFArrayRef objectClasses;
objectClasses = (CFArrayRef)CFDictionaryGetValue( subNativeDict, CFSTR( kXMLObjectClasses ) );
if ( (objectClasses != nil) && (outOCListCFArray != nil) && (outOCGroup != nil) )
{
if ( CFGetTypeID( objectClasses ) == CFArrayGetTypeID() )
{
*outOCGroup = 0;
CFStringRef groupOCString = nil;
groupOCString = (CFStringRef)CFDictionaryGetValue( subNativeDict, CFSTR( kXMLGroupObjectClasses ) );
if ( groupOCString != nil )
{
if ( CFGetTypeID( groupOCString ) == CFStringGetTypeID() )
{
if (CFStringCompare( groupOCString, CFSTR("AND"), 0 ) == kCFCompareEqualTo)
{
*outOCGroup = 1;
}
}
}
*outOCListCFArray = CFArrayCreateCopy(kCFAllocatorDefault, objectClasses);
} } } } }
if (outScope != nil)
{
cfBoolRef = (CFBooleanRef)CFDictionaryGetValue( subNativeDict, CFSTR( kXMLOneLevelSearchScope ) );
if (cfBoolRef != nil)
{
if (CFBooleanGetValue(cfBoolRef))
{
*outScope = LDAP_SCOPE_ONELEVEL;
}
else
{
*outScope = LDAP_SCOPE_SUBTREE;
}
}
else
{
*outScope = LDAP_SCOPE_SUBTREE;
}
}
}
}
}
free(tmpBuff);
}
} } break;
}
}
}
}
}
}
}
CFRelease(cfRecTypeRef);
}
return( outResult );
}
char* CLDAPv3Configs::ExtractAttrMap( char *inRecType, char *inAttrType, CFArrayRef inRecordTypeMapCFArray, CFArrayRef inAttrTypeMapCFArray, int inIndex )
{
char *outResult = nil;
CFIndex cfMapCount = 0;
sInt32 iMapIndex = 0;
CFStringRef cfStringRef = nil;
CFStringRef cfRecTypeRef = nil;
CFStringRef cfAttrTypeRef = nil;
CFArrayRef cfAttrMapArrayRef = nil;
bool bNoRecSpecificAttrMap = true;
if ( (inRecordTypeMapCFArray != nil) && (inRecType != nil) && (inAttrType != nil) )
{
cfRecTypeRef = CFStringCreateWithCString(kCFAllocatorDefault, inRecType, kCFStringEncodingUTF8);
cfAttrTypeRef = CFStringCreateWithCString(kCFAllocatorDefault, inAttrType, kCFStringEncodingUTF8);
cfMapCount = ::CFArrayGetCount( inRecordTypeMapCFArray );
if (cfMapCount != 0)
{
for (iMapIndex = 0; iMapIndex < cfMapCount; iMapIndex++)
{
CFDictionaryRef typeMapDict;
typeMapDict = (CFDictionaryRef)::CFArrayGetValueAtIndex( inRecordTypeMapCFArray, iMapIndex );
if ( typeMapDict != nil )
{
if ( CFDictionaryContainsKey( typeMapDict, CFSTR( kXMLStdNameKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( typeMapDict, CFSTR( kXMLStdNameKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
if (CFStringCompare(cfStringRef, cfRecTypeRef, 0) == kCFCompareEqualTo)
{
cfAttrMapArrayRef = GetAttributeTypeMapArray(typeMapDict);
outResult = ExtractAttrMapFromArray( cfAttrTypeRef, cfAttrMapArrayRef, inIndex, &bNoRecSpecificAttrMap );
if (bNoRecSpecificAttrMap)
{
outResult = ExtractAttrMapFromArray( cfAttrTypeRef, inAttrTypeMapCFArray, inIndex, &bNoRecSpecificAttrMap ); }
break;
}
}
}
}
}
}
}
CFRelease(cfRecTypeRef);
CFRelease(cfAttrTypeRef);
}
return( outResult );
}
char* CLDAPv3Configs::ExtractAttrMapFromArray( CFStringRef inAttrTypeRef, CFArrayRef inAttrTypeMapCFArray, int inIndex, bool *bNoRecSpecificAttrMap )
{
char *outResult = nil;
CFIndex cfAttrMapCount = 0;
CFIndex cfNativeMapCount = 0;
sInt32 iAttrMapIndex = 0;
CFStringRef cfAttrStringRef = nil;
char *tmpBuff = nil;
CFIndex cfBuffSize = 1024;
CFArrayRef cfNativeMapArrayRef = nil;
if ( (inAttrTypeRef != nil) && (inAttrTypeMapCFArray != nil) )
{
cfAttrMapCount = ::CFArrayGetCount( inAttrTypeMapCFArray );
if (cfAttrMapCount != 0)
{
for (iAttrMapIndex = 0; iAttrMapIndex < cfAttrMapCount; iAttrMapIndex++)
{
CFDictionaryRef typeAttrMapDict;
typeAttrMapDict = (CFDictionaryRef)::CFArrayGetValueAtIndex( inAttrTypeMapCFArray, iAttrMapIndex );
if ( typeAttrMapDict != nil )
{
if ( CFDictionaryContainsKey( typeAttrMapDict, CFSTR( kXMLStdNameKey ) ) )
{
cfAttrStringRef = (CFStringRef)CFDictionaryGetValue( typeAttrMapDict, CFSTR( kXMLStdNameKey ) );
if ( cfAttrStringRef != nil )
{
if ( CFGetTypeID( cfAttrStringRef ) == CFStringGetTypeID() )
{
if (CFStringCompare(cfAttrStringRef, inAttrTypeRef, 0) == kCFCompareEqualTo)
{
*bNoRecSpecificAttrMap = false;
cfNativeMapArrayRef = GetNativeTypeMapArray(typeAttrMapDict);
if (cfNativeMapArrayRef != nil)
{
cfNativeMapCount = ::CFArrayGetCount( cfNativeMapArrayRef );
if (cfNativeMapCount != 0)
{
if ( (inIndex >= 1) && (inIndex <= cfNativeMapCount) )
{
tmpBuff = (char *) calloc(1, 1024);
if (CFGetTypeID(CFArrayGetValueAtIndex( cfNativeMapArrayRef, inIndex-1 )) == CFStringGetTypeID())
{
CFStringRef nativeMapString;
nativeMapString = (CFStringRef)::CFArrayGetValueAtIndex( cfNativeMapArrayRef, inIndex-1 );
if ( nativeMapString != nil )
{
if (CFStringGetCString(nativeMapString, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
outResult = (char *) calloc(1, 1+strlen(tmpBuff));
::strcpy(outResult, tmpBuff);
}
} }
free(tmpBuff);
} } } break;
}
}
}
}
} } } }
return(outResult);
}
char* CLDAPv3Configs::ExtractStdAttr( char *inRecType, CFArrayRef inRecordTypeMapCFArray, CFArrayRef inAttrTypeMapCFArray, int &inputIndex )
{
char *outResult = nil;
CFIndex cfMapCount = 0;
CFIndex cfAttrMapCount = 0;
CFIndex cfAttrMapCount2 = 0;
sInt32 iMapIndex = 0;
CFStringRef cfStringRef = nil;
CFStringRef cfRecTypeRef = nil;
CFArrayRef cfAttrMapArrayRef = nil;
bool bUsedIndex = false;
char *tmpBuff = nil;
CFIndex cfBuffSize = 1024;
int inIndex = inputIndex;
if ( (inRecordTypeMapCFArray != nil) && (inRecType != nil) )
{
cfRecTypeRef = CFStringCreateWithCString(kCFAllocatorDefault, inRecType, kCFStringEncodingUTF8);
cfMapCount = ::CFArrayGetCount( inRecordTypeMapCFArray );
if (cfMapCount != 0)
{
for (iMapIndex = 0; iMapIndex < cfMapCount; iMapIndex++)
{
CFDictionaryRef typeMapDict;
typeMapDict = (CFDictionaryRef)::CFArrayGetValueAtIndex( inRecordTypeMapCFArray, iMapIndex );
if ( typeMapDict != nil )
{
if ( CFDictionaryContainsKey( typeMapDict, CFSTR( kXMLStdNameKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( typeMapDict, CFSTR( kXMLStdNameKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
if (CFStringCompare(cfStringRef, cfRecTypeRef, 0) == kCFCompareEqualTo)
{
cfAttrMapArrayRef = GetAttributeTypeMapArray(typeMapDict);
if (cfAttrMapArrayRef != nil)
{
cfAttrMapCount = ::CFArrayGetCount( cfAttrMapArrayRef );
if (cfAttrMapCount != 0)
{
if ( (inIndex >= 1) && (inIndex <= cfAttrMapCount) )
{
bUsedIndex = true;
tmpBuff = (char *) calloc(1, 1024);
if (CFGetTypeID(CFArrayGetValueAtIndex( cfAttrMapArrayRef, inIndex-1 )) == CFDictionaryGetTypeID())
{
CFDictionaryRef stdAttrTypeDict;
stdAttrTypeDict = (CFDictionaryRef)CFArrayGetValueAtIndex( cfAttrMapArrayRef, inIndex-1 );
if ( stdAttrTypeDict != nil )
{
if ( CFDictionaryContainsKey( stdAttrTypeDict, CFSTR( kXMLStdNameKey ) ) )
{
CFStringRef attrMapString;
attrMapString = (CFStringRef)CFDictionaryGetValue( stdAttrTypeDict, CFSTR( kXMLStdNameKey ) );
if ( attrMapString != nil )
{
if (CFStringGetCString(attrMapString, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
outResult = (char *) calloc(1, 1+strlen(tmpBuff));
::strcpy(outResult, tmpBuff);
}
} } } }
free(tmpBuff);
} } }
while (!bUsedIndex)
{
bUsedIndex = true;
if (inAttrTypeMapCFArray != nil)
{
CFIndex commonIndex = inIndex - cfAttrMapCount;
cfAttrMapCount2 = ::CFArrayGetCount( inAttrTypeMapCFArray );
if (cfAttrMapCount2 != 0)
{
if ( (commonIndex >= 1) && (commonIndex <= cfAttrMapCount2) )
{
tmpBuff = (char *) calloc(1, 1024);
if (CFGetTypeID(CFArrayGetValueAtIndex( inAttrTypeMapCFArray, commonIndex-1 )) == CFDictionaryGetTypeID())
{
CFDictionaryRef stdAttrTypeDict;
stdAttrTypeDict = (CFDictionaryRef)CFArrayGetValueAtIndex( inAttrTypeMapCFArray, commonIndex-1 );
if ( stdAttrTypeDict != nil )
{
if ( CFDictionaryContainsKey( stdAttrTypeDict, CFSTR( kXMLStdNameKey ) ) )
{
CFStringRef attrMapString;
attrMapString = (CFStringRef)CFDictionaryGetValue( stdAttrTypeDict, CFSTR( kXMLStdNameKey ) );
if ( attrMapString != nil )
{
bool bNoDuplicate = true;
if ( (cfAttrMapArrayRef != NULL) && (cfAttrMapCount != 0) )
{
for (sInt32 aIndex = 0; aIndex < cfAttrMapCount; aIndex++)
{
if (CFGetTypeID(CFArrayGetValueAtIndex( cfAttrMapArrayRef, aIndex )) == CFDictionaryGetTypeID())
{
CFDictionaryRef stdAttrTypeDict;
stdAttrTypeDict = (CFDictionaryRef)CFArrayGetValueAtIndex( cfAttrMapArrayRef, aIndex );
if ( stdAttrTypeDict != nil )
{
if ( CFDictionaryContainsKey( stdAttrTypeDict, CFSTR( kXMLStdNameKey ) ) )
{
CFStringRef attrMapStringOld;
attrMapStringOld = (CFStringRef)CFDictionaryGetValue( stdAttrTypeDict, CFSTR( kXMLStdNameKey ) );
if ( attrMapStringOld != nil )
{
if (CFStringCompare(attrMapStringOld, attrMapString, 0) == kCFCompareEqualTo)
{
bNoDuplicate = false;
bUsedIndex = false;
inIndex++;
break;
}
} } } }
} }
if (bNoDuplicate)
{
if (CFStringGetCString(attrMapString, tmpBuff, cfBuffSize, kCFStringEncodingUTF8))
{
outResult = (char *) calloc(1, 1+strlen(tmpBuff));
::strcpy(outResult, tmpBuff);
}
}
} } } }
free(tmpBuff);
} } } } break;
}
}
}
}
}
}
}
CFRelease(cfRecTypeRef);
}
if (inIndex != inputIndex)
{
inputIndex = inIndex;
}
return( outResult );
}
int CLDAPv3Configs::AttrMapsCount( char *inRecType, char *inAttrType, CFArrayRef inRecordTypeMapCFArray, CFArrayRef inAttrTypeMapCFArray )
{
int outCount = 0;
CFIndex cfMapCount = 0;
sInt32 iMapIndex = 0;
CFStringRef cfStringRef = nil;
CFStringRef cfRecTypeRef = nil;
CFStringRef cfAttrTypeRef = nil;
CFArrayRef cfAttrMapArrayRef = nil;
bool bNoRecSpecificAttrMap = true;
if ( (inRecordTypeMapCFArray != nil) && (inRecType != nil) && (inAttrType != nil) )
{
cfRecTypeRef = CFStringCreateWithCString(kCFAllocatorDefault, inRecType, kCFStringEncodingUTF8);
cfAttrTypeRef = CFStringCreateWithCString(kCFAllocatorDefault, inAttrType, kCFStringEncodingUTF8);
cfMapCount = ::CFArrayGetCount( inRecordTypeMapCFArray );
if (cfMapCount != 0)
{
for (iMapIndex = 0; iMapIndex < cfMapCount; iMapIndex++)
{
CFDictionaryRef typeMapDict;
typeMapDict = (CFDictionaryRef)::CFArrayGetValueAtIndex( inRecordTypeMapCFArray, iMapIndex );
if ( typeMapDict != nil )
{
if ( CFDictionaryContainsKey( typeMapDict, CFSTR( kXMLStdNameKey ) ) )
{
cfStringRef = (CFStringRef)CFDictionaryGetValue( typeMapDict, CFSTR( kXMLStdNameKey ) );
if ( cfStringRef != nil )
{
if ( CFGetTypeID( cfStringRef ) == CFStringGetTypeID() )
{
if (CFStringCompare(cfStringRef, cfRecTypeRef, 0) == kCFCompareEqualTo)
{
cfAttrMapArrayRef = GetAttributeTypeMapArray(typeMapDict);
outCount = AttrMapFromArrayCount( cfAttrTypeRef, cfAttrMapArrayRef, &bNoRecSpecificAttrMap );
if (bNoRecSpecificAttrMap)
{
outCount = AttrMapFromArrayCount( cfAttrTypeRef, inAttrTypeMapCFArray, &bNoRecSpecificAttrMap ); }
break;
}
}
}
}
}
}
}
CFRelease(cfRecTypeRef);
CFRelease(cfAttrTypeRef);
}
return( outCount );
}
int CLDAPv3Configs::AttrMapFromArrayCount( CFStringRef inAttrTypeRef, CFArrayRef inAttrTypeMapCFArray, bool *bNoRecSpecificAttrMap )
{
int outCount = 0;
CFIndex cfAttrMapCount = 0;
sInt32 iAttrMapIndex = 0;
CFStringRef cfAttrStringRef = nil;
CFArrayRef cfNativeMapArrayRef = nil;
if ( (inAttrTypeRef != nil) && (inAttrTypeMapCFArray != nil) )
{
cfAttrMapCount = ::CFArrayGetCount( inAttrTypeMapCFArray );
if (cfAttrMapCount != 0)
{
for (iAttrMapIndex = 0; iAttrMapIndex < cfAttrMapCount; iAttrMapIndex++)
{
CFDictionaryRef typeAttrMapDict;
typeAttrMapDict = (CFDictionaryRef)::CFArrayGetValueAtIndex( inAttrTypeMapCFArray, iAttrMapIndex );
if ( typeAttrMapDict != nil )
{
if ( CFDictionaryContainsKey( typeAttrMapDict, CFSTR( kXMLStdNameKey ) ) )
{
cfAttrStringRef = (CFStringRef)CFDictionaryGetValue( typeAttrMapDict, CFSTR( kXMLStdNameKey ) );
if ( cfAttrStringRef != nil )
{
if ( CFGetTypeID( cfAttrStringRef ) == CFStringGetTypeID() )
{
if (CFStringCompare(cfAttrStringRef, inAttrTypeRef, 0) == kCFCompareEqualTo)
{
*bNoRecSpecificAttrMap = false;
cfNativeMapArrayRef = GetNativeTypeMapArray(typeAttrMapDict);
if (cfNativeMapArrayRef != nil)
{
outCount = ::CFArrayGetCount( cfNativeMapArrayRef );
} break;
}
}
}
}
} } } }
return(outCount);
}
void CLDAPv3Configs::XMLConfigLock( void )
{
if (pXMLConfigLock != nil)
{
pXMLConfigLock->Wait();
}
}
void CLDAPv3Configs::XMLConfigUnlock( void )
{
if (pXMLConfigLock != nil)
{
pXMLConfigLock->Signal();
}
}