Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

707 lines
15 KiB

//---------------------------------------------------------------------------
//
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1997
//
// File: cdsobj.cxx
//
// Contents: Microsoft ADs LDAP Provider DSObject
//
//
// History: 02-20-97 yihsins Created.
//
//----------------------------------------------------------------------------
#include "ldapc.hxx"
#pragma hdrstop
class ADS_OBJECT_HANDLE
{
public:
ADS_LDP *_ld;
LPWSTR _pszADsPath;
LPWSTR _pszLDAPServer;
LPWSTR _pszLDAPDn;
CCredentials _Credentials;
LDAP_SEARCH_PREF _SearchPref;
DWORD _dwPort;
ADS_OBJECT_HANDLE( ADS_LDP *ld,
LPWSTR pszADsPath,
LPWSTR pszLDAPServer,
LPWSTR pszLDAPDn,
CCredentials Credentials,
DWORD dwPort
);
~ADS_OBJECT_HANDLE();
};
ADS_OBJECT_HANDLE::ADS_OBJECT_HANDLE( ADS_LDP *ld,
LPWSTR pszADsPath,
LPWSTR pszLDAPServer,
LPWSTR pszLDAPDn,
CCredentials Credentials,
DWORD dwPort
)
{
_ld = ld;
_pszADsPath = pszADsPath;
_pszLDAPServer = pszLDAPServer;
_pszLDAPDn = pszLDAPDn;
_Credentials = Credentials;
_dwPort = dwPort;
LdapInitializeSearchPreferences(&_SearchPref, FALSE);
}
ADS_OBJECT_HANDLE::~ADS_OBJECT_HANDLE()
{
if ( _ld )
{
LdapCloseObject( _ld);
_ld = NULL;
}
if ( _pszADsPath )
{
FreeADsStr( _pszADsPath );
_pszADsPath = NULL;
}
if (_pszLDAPServer) {
FreeADsStr(_pszLDAPServer);
_pszLDAPServer = NULL;
}
if (_pszLDAPDn) {
FreeADsStr(_pszLDAPDn);
_pszLDAPDn = NULL;
}
//
// Free sort keys if applicable.
//
if (_SearchPref._pSortKeys) {
FreeSortKeys(_SearchPref._pSortKeys, _SearchPref._nSortKeys);
}
//
// Free the VLV information if applicable
//
if (_SearchPref._pVLVInfo) {
FreeLDAPVLVInfo(_SearchPref._pVLVInfo);
}
//
// Free the attribute-scoped query information if applicable
//
if (_SearchPref._pAttribScoped) {
FreeADsStr(_SearchPref._pAttribScoped);
}
}
HRESULT
ADSIOpenDSObject(
LPWSTR pszDNName,
LPWSTR pszUserName,
LPWSTR pszPassword,
LONG lnReserved,
PHANDLE phDSObject
)
{
HRESULT hr = S_OK;
DWORD dwPort = 0;
OBJECTINFO ObjectInfo;
POBJECTINFO pObjectInfo = &ObjectInfo;
ADS_LDP *ld = NULL;
LPWSTR pszADsPath = NULL;
LPWSTR pszLDAPServer = NULL;
LPWSTR pszLDAPDn = NULL;
ADS_OBJECT_HANDLE *pADsObjectHandle = NULL;
LPWSTR szAttributes[2] = { L"objectClass", NULL };
int nCount;
LDAPMessage *res = NULL;
LONG lnFlags = lnReserved;
if (lnFlags & ADS_FAST_BIND) {
// mask it out as openobject does not know about the flag
lnFlags &= ~ADS_FAST_BIND;
}
CCredentials Credentials( pszUserName, pszPassword, lnFlags );
pszADsPath = AllocADsStr( pszDNName );
if ( pszADsPath == NULL )
{
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
hr = BuildLDAPPathFromADsPath2(
pszDNName,
&pszLDAPServer,
&pszLDAPDn,
&dwPort
);
BAIL_ON_FAILURE( hr);
if (pszLDAPDn == NULL) {
//
// LDAP://Server is not valid in ldapc
// LDAP://RootDSE is valid though
//
BAIL_ON_FAILURE(hr = E_ADS_BAD_PATHNAME);
}
if (!_wcsicmp(pszLDAPDn, L"rootdse")) {
FreeADsStr(pszLDAPDn);
pszLDAPDn = NULL;
}
hr = LdapOpenObject(
pszLDAPServer,
pszLDAPDn,
&ld,
Credentials,
dwPort
);
BAIL_ON_FAILURE(hr);
if (!(lnReserved & ADS_FAST_BIND)) {
// if fast bind is not specified we need to get the objectClass
hr = LdapSearchS(
ld,
pszLDAPDn,
LDAP_SCOPE_BASE,
L"(objectClass=*)",
szAttributes,
0,
&res
);
if ( FAILED(hr)
|| ((nCount = LdapCountEntries( ld, res)) == 0))
{
if (!FAILED(hr)) {
hr = HRESULT_FROM_WIN32(ERROR_DS_NO_SUCH_OBJECT);
}
}
// Need to free the message if one came back
if (res) {
LdapMsgFree(res);
res = NULL;
}
BAIL_ON_FAILURE(hr);
}
pADsObjectHandle = new ADS_OBJECT_HANDLE(
ld, pszADsPath,
pszLDAPServer, pszLDAPDn,
Credentials, dwPort
);
if ( pADsObjectHandle == NULL )
{
hr = E_OUTOFMEMORY;
BAIL_ON_FAILURE(hr);
}
*phDSObject = (HANDLE) pADsObjectHandle;
RRETURN(S_OK);
error:
if ( pszADsPath )
FreeADsStr( pszADsPath );
if ( pszLDAPServer )
FreeADsStr( pszLDAPServer );
if (pszLDAPDn) {
FreeADsStr(pszLDAPDn);
}
if ( ld )
LdapCloseObject( ld );
*phDSObject = NULL;
RRETURN(hr);
}
HRESULT
ADSICloseDSObject(
HANDLE hDSObject
)
{
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
delete pADsObjectHandle;
RRETURN(S_OK);
}
HRESULT
ADSISetObjectAttributes(
HANDLE hDSObject,
PADS_ATTR_INFO pAttributeEntries,
DWORD dwNumAttributes,
DWORD *pdwNumAttributesModified
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
SECURITY_INFORMATION seInfo = OWNER_SECURITY_INFORMATION
| GROUP_SECURITY_INFORMATION
| DACL_SECURITY_INFORMATION;
//
// seInfo is the default value for now anyone wanting to set
// the SACL will have to use IDirectoryObject.
//
hr = ADsSetObjectAttributes(
pADsObjectHandle->_ld,
pADsObjectHandle->_pszLDAPServer,
pADsObjectHandle->_pszLDAPDn,
pADsObjectHandle->_Credentials,
pADsObjectHandle->_dwPort,
seInfo,
pAttributeEntries,
dwNumAttributes,
pdwNumAttributesModified
);
RRETURN(hr);
}
HRESULT
ADSIGetObjectAttributes(
HANDLE hDSObject,
LPWSTR *pAttributeNames,
DWORD dwNumberAttributes,
PADS_ATTR_INFO *ppAttributeEntries,
DWORD * pdwNumAttributesReturned
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
SECURITY_INFORMATION seInfo = OWNER_SECURITY_INFORMATION
| GROUP_SECURITY_INFORMATION
| DACL_SECURITY_INFORMATION;
//
// seInfo is the default value for now anyone wanting to read
// the SACL will have to use IDirectoryObject.
//
hr = ADsGetObjectAttributes(
pADsObjectHandle->_ld,
pADsObjectHandle->_pszLDAPServer,
pADsObjectHandle->_pszLDAPDn,
pADsObjectHandle->_Credentials,
pADsObjectHandle->_dwPort,
seInfo,
pAttributeNames,
dwNumberAttributes,
ppAttributeEntries,
pdwNumAttributesReturned
);
RRETURN(hr);
}
HRESULT
ADSICreateDSObject(
HANDLE hParentDSObject,
LPWSTR pszRDNName,
PADS_ATTR_INFO pAttributeEntries,
DWORD dwNumAttributes
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hParentDSObject;
hr = ADsCreateDSObject(
pADsObjectHandle->_ld,
pADsObjectHandle->_pszADsPath,
pszRDNName,
pAttributeEntries,
dwNumAttributes
);
RRETURN(hr);
}
HRESULT
ADSIDeleteDSObject(
HANDLE hParentDSObject,
LPWSTR pszRDNName
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hParentDSObject;
hr = ADsDeleteDSObject(
pADsObjectHandle->_ld,
pADsObjectHandle->_pszADsPath,
pszRDNName
);
RRETURN(hr);
}
HRESULT
ADSISetSearchPreference(
HANDLE hDSObject,
IN PADS_SEARCHPREF_INFO pSearchPrefs,
IN DWORD dwNumPrefs
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
hr = ADsSetSearchPreference(
pSearchPrefs,
dwNumPrefs,
&(pADsObjectHandle->_SearchPref),
pADsObjectHandle->_pszLDAPServer,
pADsObjectHandle->_pszLDAPDn,
pADsObjectHandle->_Credentials,
pADsObjectHandle->_dwPort
);
RRETURN(hr);
}
HRESULT
ADSIExecuteSearch(
HANDLE hDSObject,
IN LPWSTR pszSearchFilter,
IN LPWSTR * pAttributeNames,
IN DWORD dwNumberAttributes,
OUT PADS_SEARCH_HANDLE phSearchHandle
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
hr = ADsExecuteSearch(
pADsObjectHandle->_SearchPref,
pADsObjectHandle->_pszADsPath,
pADsObjectHandle->_pszLDAPServer,
pADsObjectHandle->_pszLDAPDn,
pszSearchFilter,
pAttributeNames,
dwNumberAttributes,
phSearchHandle
);
RRETURN(hr);
}
HRESULT
ADSIAbandonSearch(
HANDLE hDSObject,
IN PADS_SEARCH_HANDLE phSearchHandle
)
{
HRESULT hr = S_OK;
ADsAssert(phSearchHandle);
hr = ADsAbandonSearch(
*phSearchHandle
);
RRETURN(hr);
}
HRESULT
ADSICloseSearchHandle (
HANDLE hDSObject,
IN ADS_SEARCH_HANDLE hSearchHandle
)
{
HRESULT hr = S_OK;
hr = ADsCloseSearchHandle(
hSearchHandle
);
RRETURN(hr);
}
HRESULT
ADSIGetFirstRow(
HANDLE hDSObject,
IN ADS_SEARCH_HANDLE hSearchHandle
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
hr = ADsGetFirstRow(
hSearchHandle,
pADsObjectHandle->_Credentials
);
RRETURN(hr);
}
HRESULT
ADSIGetNextRow(
HANDLE hDSObject,
IN ADS_SEARCH_HANDLE hSearchHandle
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
hr = ADsGetNextRow(
hSearchHandle,
pADsObjectHandle->_Credentials
);
RRETURN(hr);
}
HRESULT
ADSIGetPreviousRow(
HANDLE hDSObject,
IN ADS_SEARCH_HANDLE hSearchHandle
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
hr = ADsGetPreviousRow(
hSearchHandle,
pADsObjectHandle->_Credentials
);
RRETURN(hr);
}
HRESULT
ADSIGetColumn(
HANDLE hDSObject,
IN ADS_SEARCH_HANDLE hSearchHandle,
IN LPWSTR pszColumnName,
OUT PADS_SEARCH_COLUMN pColumn
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
hr = ADsGetColumn(
hSearchHandle,
pszColumnName,
pADsObjectHandle->_Credentials,
pADsObjectHandle->_dwPort,
pColumn
);
RRETURN(hr);
}
HRESULT
ADSIGetNextColumnName(
HANDLE hDSObject,
IN ADS_SEARCH_HANDLE hSearchHandle,
OUT LPWSTR * ppszColumnName
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
hr = ADsGetNextColumnName(
hSearchHandle,
ppszColumnName
);
RRETURN(hr);
}
HRESULT
ADSIFreeColumn(
HANDLE hDSObject,
IN PADS_SEARCH_COLUMN pColumn
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
hr = ADsFreeColumn(
pColumn
);
RRETURN(hr);
}
HRESULT
ADSIEnumAttributes(
HANDLE hDSObject,
LPWSTR * ppszAttrNames,
DWORD dwNumAttributes,
PADS_ATTR_DEF * ppAttrDefinition,
DWORD * pdwNumAttributes
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
hr = ADsEnumAttributes(
pADsObjectHandle->_pszLDAPServer,
pADsObjectHandle->_pszLDAPDn,
pADsObjectHandle->_Credentials,
pADsObjectHandle->_dwPort,
ppszAttrNames,
dwNumAttributes,
ppAttrDefinition,
pdwNumAttributes
);
RRETURN(hr);
}
HRESULT
ADSICreateAttributeDefinition(
HANDLE hDSObject,
LPWSTR pszAttributeName,
PADS_ATTR_DEF pAttributeDefinition
)
{
HRESULT hr = S_OK;
hr = ADsCreateAttributeDefinition(
pszAttributeName,
pAttributeDefinition
);
RRETURN(hr);
}
HRESULT
ADSIWriteAttributeDefinition(
HANDLE hDSObject,
LPWSTR pszAttributeName,
PADS_ATTR_DEF pAttributeDefinition
)
{
HRESULT hr = S_OK;
hr = ADsWriteAttributeDefinition(
pszAttributeName,
pAttributeDefinition
);
RRETURN(hr);
}
HRESULT
ADSIDeleteAttributeDefinition(
HANDLE hDSObject,
LPWSTR pszAttributeName
)
{
HRESULT hr = S_OK;
hr = ADsDeleteAttributeDefinition(
pszAttributeName
);
RRETURN(hr);
}
//+------------------------------------------------------------------------
//
// Function: ADSIModifyRDN
//
// Synopsis: Rename the object from the ldapc layer. This is just
// a wrapper for LDAPModRdnS.
//
//
// Arguments: Handle to the object being renamed.
// new RDN of the object.
//
//-------------------------------------------------------------------------
HRESULT
ADSIModifyRdn(
HANDLE hDSObject,
LPWSTR pszOldRdn,
LPWSTR pszNewRdn
)
{
HRESULT hr = S_OK;
ADS_OBJECT_HANDLE *pADsObjectHandle = (ADS_OBJECT_HANDLE *) hDSObject;
TCHAR *pszOldDN = NULL;
DWORD dwLen = 0;
if (!pszOldRdn || !pszNewRdn) {
RRETURN(E_ADS_BAD_PARAMETER);
}
dwLen = wcslen(pADsObjectHandle->_pszLDAPDn) + wcslen(pszOldRdn) + 2;
pszOldDN = (LPWSTR) AllocADsMem( dwLen * sizeof(WCHAR) );
if (!pszOldDN) {
RRETURN (hr = E_OUTOFMEMORY);
}
// Build the DN of the object being renamed
wsprintf(pszOldDN, L"%s,", pszOldRdn);
wcscat(pszOldDN, pADsObjectHandle->_pszLDAPDn);
hr = LdapModRdnS(
pADsObjectHandle->_ld,
pszOldDN,
pszNewRdn
);
if (pszOldDN) {
FreeADsStr(pszOldDN);
}
RRETURN(hr);
}