windows-nt/Source/XPSP1/NT/net/layer2svc/wastore/dsstore.c

442 lines
9.3 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//----------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2001.
//
// File: dsstore.c
//
// Contents: Policy management for directory
//
//
// History: TaroonM
// 10/30/01
//
//----------------------------------------------------------------------------
#include "precomp.h"
LPWSTR PolicyDNAttributes[] = {
L"msieee80211-ID",
L"description",
L"msieee80211-DataType",
L"msieee80211-Data",
L"cn",
L"distinguishedName",
L"whenChanged",
NULL
};
DWORD
OpenDirectoryServerHandle(
LPWSTR pszDomainName,
DWORD dwPortNumber,
HLDAP * phLdapBindHandle
)
{
DWORD dwError = 0;
*phLdapBindHandle = NULL;
dwError = LdapOpen(
pszDomainName,
dwPortNumber,
phLdapBindHandle
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = LdapBind(
*phLdapBindHandle
);
BAIL_ON_WIN32_ERROR(dwError);
return(dwError);
error:
if (*phLdapBindHandle) {
CloseDirectoryServerHandle(
*phLdapBindHandle
);
*phLdapBindHandle = NULL;
}
return(dwError);
}
DWORD
CloseDirectoryServerHandle(
HLDAP hLdapBindHandle
)
{
int ldaperr = 0;
if (hLdapBindHandle) {
ldaperr = ldap_unbind(hLdapBindHandle);
}
return(0);
}
DWORD
ReadPolicyObjectFromDirectory(
HLDAP hLdapBindHandle,
LPWSTR pszPolicyDN,
PWIRELESS_POLICY_OBJECT * ppWirelessPolicyObject
)
{
LDAPMessage *res = NULL;
LDAPMessage *e = NULL;
LPWSTR szFilterString = L"(objectClass=*)";
DWORD dwError = 0;
PWIRELESS_POLICY_OBJECT pWirelessPolicyObject = NULL;
dwError = LdapSearchST(
hLdapBindHandle,
pszPolicyDN,
LDAP_SCOPE_BASE,
szFilterString,
PolicyDNAttributes,
0,
NULL,
&res
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = UnMarshallPolicyObject(
hLdapBindHandle,
pszPolicyDN,
&pWirelessPolicyObject,
res
);
BAIL_ON_WIN32_ERROR(dwError);
*ppWirelessPolicyObject = pWirelessPolicyObject;
cleanup:
if (res) {
LdapMsgFree(res);
}
return(dwError);
error:
if (pWirelessPolicyObject) {
FreeWirelessPolicyObject(
pWirelessPolicyObject
);
}
*ppWirelessPolicyObject = NULL;
goto cleanup;
}
DWORD
UnMarshallPolicyObject(
HLDAP hLdapBindHandle,
LPWSTR pszPolicyDN,
PWIRELESS_POLICY_OBJECT * ppWirelessPolicyObject,
LDAPMessage *res
)
{
PWIRELESS_POLICY_OBJECT pWirelessPolicyObject = NULL;
DWORD dwCount = 0;
DWORD dwLen = 0;
LPBYTE pBuffer = NULL;
DWORD i = 0;
DWORD dwError = 0;
LDAPMessage *e = NULL;
WCHAR **strvalues = NULL;
struct berval ** bvalues = NULL;
LPWSTR * ppszTemp = NULL;
pWirelessPolicyObject = (PWIRELESS_POLICY_OBJECT)AllocPolMem(
sizeof(WIRELESS_POLICY_OBJECT)
);
if (!pWirelessPolicyObject) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = LdapFirstEntry(
hLdapBindHandle,
res,
&e
);
BAIL_ON_WIN32_ERROR(dwError);
/*
strvalues = NULL;
dwError = LdapGetValues(
hLdapBindHandle,
e,
L"distinguishedName",
(WCHAR ***)&strvalues,
(int *)&dwCount
);
BAIL_ON_WIN32_ERROR(dwError);
*/
pWirelessPolicyObject->pszWirelessOwnersReference = AllocPolStr(
pszPolicyDN
);
if (!pWirelessPolicyObject->pszWirelessOwnersReference) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
strvalues = NULL;
dwError = LdapGetValues(
hLdapBindHandle,
e,
L"cn",
(WCHAR ***)&strvalues,
(int *)&dwCount
);
BAIL_ON_WIN32_ERROR(dwError);
pWirelessPolicyObject->pszWirelessName = AllocPolStr(
LDAPOBJECT_STRING((PLDAPOBJECT)strvalues)
);
if (!pWirelessPolicyObject->pszWirelessName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
LdapValueFree(strvalues);
strvalues = NULL;
dwError = LdapGetValues(
hLdapBindHandle,
e,
L"description",
(WCHAR ***)&strvalues,
(int *)&dwCount
);
// BAIL_ON_WIN32_ERROR(dwError);
if (strvalues && LDAPOBJECT_STRING((PLDAPOBJECT)strvalues)) {
pWirelessPolicyObject->pszDescription = AllocPolStr(
LDAPOBJECT_STRING((PLDAPOBJECT)strvalues)
);
if (!pWirelessPolicyObject->pszDescription) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
LdapValueFree(strvalues);
} else {
pWirelessPolicyObject->pszDescription = NULL;
}
strvalues = NULL;
dwError = LdapGetValues(
hLdapBindHandle,
e,
L"msieee80211-ID",
(WCHAR ***)&strvalues,
(int *)&dwCount
);
BAIL_ON_WIN32_ERROR(dwError);
pWirelessPolicyObject->pszWirelessID = AllocPolStr(
LDAPOBJECT_STRING((PLDAPOBJECT)strvalues)
);
if (!pWirelessPolicyObject->pszWirelessID) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
LdapValueFree(strvalues);
strvalues = NULL;
dwError = LdapGetValues(
hLdapBindHandle,
e,
L"msieee80211-DataType",
(WCHAR ***)&strvalues,
(int *)&dwCount
);
BAIL_ON_WIN32_ERROR(dwError);
pWirelessPolicyObject->dwWirelessDataType = _wtol(LDAPOBJECT_STRING((PLDAPOBJECT)strvalues));
LdapValueFree(strvalues);
strvalues = NULL;
dwError = LdapGetValues(
hLdapBindHandle,
e,
L"whenChanged",
(WCHAR ***)&strvalues,
(int *)&dwCount
);
BAIL_ON_WIN32_ERROR(dwError);
pWirelessPolicyObject->dwWhenChanged = _wtol(LDAPOBJECT_STRING((PLDAPOBJECT)strvalues));
LdapValueFree(strvalues);
//
// unmarshall the msieee80211-Data blob
//
dwError = LdapGetValuesLen(
hLdapBindHandle,
e,
L"msieee80211-Data",
(struct berval ***)&bvalues,
(int *)&dwCount
);
BAIL_ON_WIN32_ERROR(dwError);
dwLen = LDAPOBJECT_BERVAL_LEN((PLDAPOBJECT)bvalues);
pBuffer = (LPBYTE)AllocPolMem(dwLen);
if (!pBuffer) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
memcpy( pBuffer, LDAPOBJECT_BERVAL_VAL((PLDAPOBJECT)bvalues), dwLen );
pWirelessPolicyObject->pWirelessData = pBuffer;
pWirelessPolicyObject->dwWirelessDataLen = dwLen;
LdapValueFreeLen(bvalues);
*ppWirelessPolicyObject = pWirelessPolicyObject;
return(dwError);
error:
if (pWirelessPolicyObject) {
FreeWirelessPolicyObject(pWirelessPolicyObject);
}
*ppWirelessPolicyObject = NULL;
return(dwError);
}
DWORD
ComputePrelimCN(
LPWSTR szDN,
LPWSTR szCommonName
)
{
LPWSTR pszComma = NULL;
pszComma = wcschr(szDN, L',');
if (!pszComma) {
return (ERROR_INVALID_DATA);
}
*pszComma = L'\0';
wcscpy(szCommonName, szDN);
*pszComma = L',';
return(0);
}
DWORD
ComputePolicyContainerDN(
LPWSTR pszPolicyDN,
LPWSTR * ppszPolicyContainerDN
)
{
LPWSTR pszComma = NULL;
LPWSTR pszPolicyContainer = NULL;
DWORD dwError = 0;
*ppszPolicyContainerDN = NULL;
pszComma = wcschr(pszPolicyDN, L',');
pszPolicyContainer = AllocPolStr(
pszComma + 1
);
if (!pszPolicyContainer) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
*ppszPolicyContainerDN = pszPolicyContainer;
error:
return(dwError);
}
DWORD
ComputeDefaultDirectory(
LPWSTR * ppszDefaultDirectory
)
{
PDOMAIN_CONTROLLER_INFOW pDomainControllerInfo = NULL;
DWORD dwError = 0;
DWORD Flags = DS_DIRECTORY_SERVICE_REQUIRED | DS_RETURN_DNS_NAME;
LPWSTR pszDefaultDirectory = NULL;
*ppszDefaultDirectory = NULL;
dwError = DsGetDcNameW(
NULL,
NULL,
NULL,
NULL,
Flags,
&pDomainControllerInfo
) ;
BAIL_ON_WIN32_ERROR(dwError);
pszDefaultDirectory = AllocPolStr(
pDomainControllerInfo->DomainName
);
if (!pszDefaultDirectory) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
*ppszDefaultDirectory = pszDefaultDirectory;
error:
if (pDomainControllerInfo) {
(void) NetApiBufferFree(pDomainControllerInfo) ;
}
return(dwError);
}