//---------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 2000. // // File: negpols-d.c // // Contents: NegPol management for directory. // // // History: KrishnaG // AbhisheV // //---------------------------------------------------------------------------- #include "precomp.h" extern LPWSTR NegPolDNAttributes[]; DWORD DirEnumNegPolData( HLDAP hLdapBindHandle, LPWSTR pszIpsecRootContainer, PIPSEC_NEGPOL_DATA ** pppIpsecNegPolData, PDWORD pdwNumNegPolObjects ) { DWORD dwError = 0; PIPSEC_NEGPOL_OBJECT * ppIpsecNegPolObjects = NULL; PIPSEC_NEGPOL_DATA pIpsecNegPolData = NULL; PIPSEC_NEGPOL_DATA * ppIpsecNegPolData = NULL; DWORD dwNumNegPolObjects = 0; DWORD i = 0; DWORD j = 0; dwError = DirEnumNegPolObjects( hLdapBindHandle, pszIpsecRootContainer, &ppIpsecNegPolObjects, &dwNumNegPolObjects ); BAIL_ON_WIN32_ERROR(dwError); if (dwNumNegPolObjects) { ppIpsecNegPolData = (PIPSEC_NEGPOL_DATA *) AllocPolMem( dwNumNegPolObjects*sizeof(PIPSEC_NEGPOL_DATA)); if (!ppIpsecNegPolData) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } } for (i = 0; i < dwNumNegPolObjects; i++) { dwError = DirUnmarshallNegPolData( *(ppIpsecNegPolObjects + i), &pIpsecNegPolData ); if (!dwError) { *(ppIpsecNegPolData + j) = pIpsecNegPolData; j++; } } if (j == 0) { if (ppIpsecNegPolData) { FreePolMem(ppIpsecNegPolData); ppIpsecNegPolData = NULL; } } *pppIpsecNegPolData = ppIpsecNegPolData; *pdwNumNegPolObjects = j; dwError = ERROR_SUCCESS; cleanup: if (ppIpsecNegPolObjects) { FreeIpsecNegPolObjects( ppIpsecNegPolObjects, dwNumNegPolObjects ); } return(dwError); error: if (ppIpsecNegPolData) { FreeMulIpsecNegPolData( ppIpsecNegPolData, i ); } *pppIpsecNegPolData = NULL; *pdwNumNegPolObjects = 0; goto cleanup; } DWORD DirEnumNegPolObjects( HLDAP hLdapBindHandle, LPWSTR pszIpsecRootContainer, PIPSEC_NEGPOL_OBJECT ** pppIpsecNegPolObjects, PDWORD pdwNumNegPolObjects ) { LDAPMessage *res = NULL; LDAPMessage *e = NULL; DWORD dwError = 0; LPWSTR pszNegPolString = NULL; DWORD i = 0; DWORD dwCount = 0; PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject = NULL; PIPSEC_NEGPOL_OBJECT * ppIpsecNegPolObjects = NULL; DWORD dwNumNegPolObjectsReturned = 0; dwError = GenerateAllNegPolsQuery( &pszNegPolString ); BAIL_ON_WIN32_ERROR(dwError); dwError = LdapSearchST( hLdapBindHandle, pszIpsecRootContainer, LDAP_SCOPE_ONELEVEL, pszNegPolString, NegPolDNAttributes, 0, NULL, &res ); BAIL_ON_WIN32_ERROR(dwError); dwCount = LdapCountEntries( hLdapBindHandle, res ); if (!dwCount) { dwError = ERROR_DS_NO_ATTRIBUTE_OR_VALUE; BAIL_ON_WIN32_ERROR(dwError); } ppIpsecNegPolObjects = (PIPSEC_NEGPOL_OBJECT *)AllocPolMem( sizeof(PIPSEC_NEGPOL_OBJECT)*dwCount ); if (!ppIpsecNegPolObjects) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } for (i = 0; i < dwCount; i++) { if (i == 0) { dwError = LdapFirstEntry( hLdapBindHandle, res, &e ); BAIL_ON_WIN32_ERROR(dwError); } else { dwError = LdapNextEntry( hLdapBindHandle, e, &e ); BAIL_ON_WIN32_ERROR(dwError); } dwError =UnMarshallNegPolObject( hLdapBindHandle, e, &pIpsecNegPolObject ); if (dwError == ERROR_SUCCESS) { *(ppIpsecNegPolObjects + dwNumNegPolObjectsReturned) = pIpsecNegPolObject; dwNumNegPolObjectsReturned++; } } *pppIpsecNegPolObjects = ppIpsecNegPolObjects; *pdwNumNegPolObjects = dwNumNegPolObjectsReturned; dwError = ERROR_SUCCESS; cleanup: if (pszNegPolString) { FreePolMem(pszNegPolString); } if (res) { LdapMsgFree(res); } return(dwError); error: if (ppIpsecNegPolObjects) { FreeIpsecNegPolObjects( ppIpsecNegPolObjects, dwNumNegPolObjectsReturned ); } *pppIpsecNegPolObjects = NULL; *pdwNumNegPolObjects = 0; goto cleanup; } DWORD DirSetNegPolData( HLDAP hLdapBindHandle, LPWSTR pszIpsecRootContainer, PIPSEC_NEGPOL_DATA pIpsecNegPolData ) { DWORD dwError = 0; PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject = NULL; dwError = DirMarshallNegPolObject( pIpsecNegPolData, pszIpsecRootContainer, &pIpsecNegPolObject ); BAIL_ON_WIN32_ERROR(dwError); dwError = DirSetNegPolObject( hLdapBindHandle, pszIpsecRootContainer, pIpsecNegPolObject ); BAIL_ON_WIN32_ERROR(dwError); dwError = DirBackPropIncChangesForNegPolToNFA( hLdapBindHandle, pszIpsecRootContainer, pIpsecNegPolData->NegPolIdentifier ); BAIL_ON_WIN32_ERROR(dwError); error: if (pIpsecNegPolObject) { FreeIpsecNegPolObject(pIpsecNegPolObject); } return(dwError); } DWORD DirSetNegPolObject( HLDAP hLdapBindHandle, LPWSTR pszIpsecRootContainer, PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject ) { DWORD dwError = 0; LDAPModW ** ppLDAPModW = NULL; dwError = DirMarshallSetNegPolObject( hLdapBindHandle, pszIpsecRootContainer, pIpsecNegPolObject, &ppLDAPModW ); BAIL_ON_WIN32_ERROR(dwError); dwError = LdapModifyS( hLdapBindHandle, pIpsecNegPolObject->pszDistinguishedName, ppLDAPModW ); BAIL_ON_WIN32_ERROR(dwError); error: // // Free the amods structures. // if (ppLDAPModW) { FreeLDAPModWs( ppLDAPModW ); } return(dwError); } DWORD DirCreateNegPolData( HLDAP hLdapBindHandle, LPWSTR pszIpsecRootContainer, PIPSEC_NEGPOL_DATA pIpsecNegPolData ) { DWORD dwError = 0; PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject = NULL; dwError = DirMarshallNegPolObject( pIpsecNegPolData, pszIpsecRootContainer, &pIpsecNegPolObject ); BAIL_ON_WIN32_ERROR(dwError); dwError = DirCreateNegPolObject( hLdapBindHandle, pszIpsecRootContainer, pIpsecNegPolObject ); BAIL_ON_WIN32_ERROR(dwError); error: if (pIpsecNegPolObject) { FreeIpsecNegPolObject( pIpsecNegPolObject ); } return(dwError); } DWORD DirCreateNegPolObject( HLDAP hLdapBindHandle, LPWSTR pszIpsecRootContainer, PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject ) { DWORD dwError = 0; LDAPModW ** ppLDAPModW = NULL; dwError = DirMarshallAddNegPolObject( hLdapBindHandle, pszIpsecRootContainer, pIpsecNegPolObject, &ppLDAPModW ); BAIL_ON_WIN32_ERROR(dwError); dwError = LdapAddS( hLdapBindHandle, pIpsecNegPolObject->pszDistinguishedName, ppLDAPModW ); BAIL_ON_WIN32_ERROR(dwError); error: // // Free the amods structures. // if (ppLDAPModW) { FreeLDAPModWs( ppLDAPModW ); } return(dwError); } DWORD DirDeleteNegPolData( HLDAP hLdapBindHandle, LPWSTR pszIpsecRootContainer, GUID NegPolIdentifier ) { DWORD dwError = ERROR_SUCCESS; WCHAR szGuid[MAX_PATH]; WCHAR szDistinguishedName[MAX_PATH]; LPWSTR pszStringUuid = NULL; szGuid[0] = L'\0'; szDistinguishedName[0] = L'\0'; dwError = UuidToString( &NegPolIdentifier, &pszStringUuid ); BAIL_ON_WIN32_ERROR(dwError); wcscpy(szGuid, L"{"); wcscat(szGuid, pszStringUuid); wcscat(szGuid, L"}"); wcscpy(szDistinguishedName,L"CN=ipsecNegotiationPolicy"); wcscat(szDistinguishedName, szGuid); wcscat(szDistinguishedName, L","); SecStrCatW(szDistinguishedName, pszIpsecRootContainer, MAX_PATH); dwError = LdapDeleteS( hLdapBindHandle, szDistinguishedName ); BAIL_ON_WIN32_ERROR(dwError); error: if (pszStringUuid) { RpcStringFree(&pszStringUuid); } return(dwError); } DWORD DirMarshallAddNegPolObject( HLDAP hLdapBindHandle, LPWSTR pszIpsecRootContainer, PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject, LDAPModW *** pppLDAPModW ) { DWORD i = 0; LDAPModW ** ppLDAPModW = NULL; LDAPModW * pLDAPModW = NULL; DWORD dwNumAttributes = 8; DWORD dwError = 0; WCHAR Buffer[64]; if (!pIpsecNegPolObject->pszIpsecName || !*pIpsecNegPolObject->pszIpsecName) { dwNumAttributes--; } if (!pIpsecNegPolObject->pszDescription || !*pIpsecNegPolObject->pszDescription) { dwNumAttributes--; } ppLDAPModW = (LDAPModW **) AllocPolMem( (dwNumAttributes+1) * sizeof(LDAPModW*) ); if (!ppLDAPModW) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } pLDAPModW = (LDAPModW *) AllocPolMem( dwNumAttributes * sizeof(LDAPModW) ); if (!pLDAPModW) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } // // 0. objectClass // ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"objectClass", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPStringValue( L"ipsecNegotiationPolicy", (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; // // 1. ipsecName // if (pIpsecNegPolObject->pszIpsecName && *pIpsecNegPolObject->pszIpsecName) { ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"ipsecName", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPStringValue( pIpsecNegPolObject->pszIpsecName, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; } // // 2. ipsecID // ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"ipsecID", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPStringValue( pIpsecNegPolObject->pszIpsecID, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; // // 3. ipsecDataType // ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"ipsecDataType", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); _itow( pIpsecNegPolObject->dwIpsecDataType, Buffer, 10 ); dwError = AllocateLDAPStringValue( Buffer, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; // // 4. ipsecData // ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"ipsecData", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPBinaryValue( pIpsecNegPolObject->pIpsecData, pIpsecNegPolObject->dwIpsecDataLen, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW+i)->mod_op = LDAP_MOD_REPLACE | LDAP_MOD_BVALUES; i++; // // 5. description // if (pIpsecNegPolObject->pszDescription && *pIpsecNegPolObject->pszDescription) { ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"description", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPStringValue( pIpsecNegPolObject->pszDescription, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; } // // 6. ipsecNegotiationPolicyAction // ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"ipsecNegotiationPolicyAction", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPStringValue( pIpsecNegPolObject->pszIpsecNegPolAction, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; // // 7. ipsecNegotiationPolicyType // ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"ipsecNegotiationPolicyType", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPStringValue( pIpsecNegPolObject->pszIpsecNegPolType, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; *pppLDAPModW = ppLDAPModW; return(dwError); error: if (ppLDAPModW) { FreeLDAPModWs( ppLDAPModW ); } *pppLDAPModW = NULL; return(dwError); } DWORD DirMarshallSetNegPolObject( HLDAP hLdapBindHandle, LPWSTR pszIpsecRootContainer, PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject, LDAPModW *** pppLDAPModW ) { DWORD i = 0; LDAPModW ** ppLDAPModW = NULL; LDAPModW * pLDAPModW = NULL; DWORD dwNumAttributes = 7; DWORD dwError = 0; WCHAR Buffer[64]; if (!pIpsecNegPolObject->pszIpsecName || !*pIpsecNegPolObject->pszIpsecName) { dwNumAttributes--; } if (!pIpsecNegPolObject->pszDescription || !*pIpsecNegPolObject->pszDescription) { dwNumAttributes--; } ppLDAPModW = (LDAPModW **) AllocPolMem( (dwNumAttributes+1) * sizeof(LDAPModW*) ); if (!ppLDAPModW) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } pLDAPModW = (LDAPModW *) AllocPolMem( dwNumAttributes * sizeof(LDAPModW) ); if (!pLDAPModW) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } // // 1. ipsecName // if (pIpsecNegPolObject->pszIpsecName && *pIpsecNegPolObject->pszIpsecName) { ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"ipsecName", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPStringValue( pIpsecNegPolObject->pszIpsecName, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; } // // 2. ipsecID // ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"ipsecID", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPStringValue( pIpsecNegPolObject->pszIpsecID, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; // // 3. ipsecDataType // ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"ipsecDataType", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); _itow( pIpsecNegPolObject->dwIpsecDataType, Buffer, 10 ); dwError = AllocateLDAPStringValue( Buffer, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; // // 4. ipsecData // ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"ipsecData", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPBinaryValue( pIpsecNegPolObject->pIpsecData, pIpsecNegPolObject->dwIpsecDataLen, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW+i)->mod_op = LDAP_MOD_REPLACE | LDAP_MOD_BVALUES; i++; // // 5. description // if (pIpsecNegPolObject->pszDescription && *pIpsecNegPolObject->pszDescription) { ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"description", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPStringValue( pIpsecNegPolObject->pszDescription, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; } // // 6. ipsecNegotiationPolicyAction // ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"ipsecNegotiationPolicyAction", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPStringValue( pIpsecNegPolObject->pszIpsecNegPolAction, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; // // 7. ipsecNegotiationPolicyType // ppLDAPModW[i] = pLDAPModW + i; dwError = AllocatePolString( L"ipsecNegotiationPolicyType", &(pLDAPModW +i)->mod_type ); BAIL_ON_WIN32_ERROR(dwError); dwError = AllocateLDAPStringValue( pIpsecNegPolObject->pszIpsecNegPolType, (PLDAPOBJECT *)&(pLDAPModW +i)->mod_values ); BAIL_ON_WIN32_ERROR(dwError); (pLDAPModW + i)->mod_op |= LDAP_MOD_REPLACE; i++; *pppLDAPModW = ppLDAPModW; return(dwError); error: if (ppLDAPModW) { FreeLDAPModWs( ppLDAPModW ); } *pppLDAPModW = NULL; return(dwError); } DWORD GenerateAllNegPolsQuery( LPWSTR * ppszNegPolString ) { DWORD dwError = 0; DWORD dwLength = 0; LPWSTR pszNegPolString = NULL; // // Compute Length of Buffer to be allocated // dwLength = wcslen(L"(objectclass=ipsecNegotiationPolicy)"); pszNegPolString = (LPWSTR) AllocPolMem((dwLength + 1)*sizeof(WCHAR)); if (!pszNegPolString) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } // // Now fill in the buffer // wcscpy(pszNegPolString, L"(objectclass=ipsecNegotiationPolicy)"); *ppszNegPolString = pszNegPolString; return(0); error: if (pszNegPolString) { FreePolMem(pszNegPolString); } *ppszNegPolString = NULL; return(dwError); } DWORD DirUnmarshallNegPolData( PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject, PIPSEC_NEGPOL_DATA * ppIpsecNegPolData ) { DWORD dwError = 0; dwError = UnmarshallNegPolObject( pIpsecNegPolObject, ppIpsecNegPolData ); return(dwError); } DWORD DirMarshallNegPolObject( PIPSEC_NEGPOL_DATA pIpsecNegPolData, LPWSTR pszIpsecRootContainer, PIPSEC_NEGPOL_OBJECT * ppIpsecNegPolObject ) { DWORD dwError = 0; PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject = NULL; WCHAR szGuid[MAX_PATH]; WCHAR szDistinguishedName[MAX_PATH]; LPBYTE pBuffer = NULL; DWORD dwBufferLen = 0; LPWSTR pszStringUuid = NULL; LPWSTR pszNegPolActionUuid = NULL; LPWSTR pszNegPolTypeUuid = NULL; WCHAR szGuidAction[MAX_PATH]; WCHAR szGuidType[MAX_PATH]; szGuidAction[0] = L'\0'; szGuidType[0] = L'\0'; szGuid[0] = L'\0'; szDistinguishedName[0] = L'\0'; pIpsecNegPolObject = (PIPSEC_NEGPOL_OBJECT)AllocPolMem( sizeof(IPSEC_NEGPOL_OBJECT) ); if (!pIpsecNegPolObject) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } dwError = UuidToString( &pIpsecNegPolData->NegPolIdentifier, &pszStringUuid ); BAIL_ON_WIN32_ERROR(dwError); wcscpy(szGuid, L"{"); wcscat(szGuid, pszStringUuid); wcscat(szGuid, L"}"); // // Fill in the distinguishedName // wcscpy(szDistinguishedName,L"CN=ipsecNegotiationPolicy"); wcscat(szDistinguishedName, szGuid); wcscat(szDistinguishedName, L","); SecStrCatW(szDistinguishedName, pszIpsecRootContainer, MAX_PATH); pIpsecNegPolObject->pszDistinguishedName = AllocPolStr( szDistinguishedName ); if (!pIpsecNegPolObject->pszDistinguishedName) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } // // Fill in the ipsecName // if (pIpsecNegPolData->pszIpsecName && *pIpsecNegPolData->pszIpsecName) { pIpsecNegPolObject->pszIpsecName = AllocPolStr( pIpsecNegPolData->pszIpsecName ); if (!pIpsecNegPolObject->pszIpsecName) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } } if (pIpsecNegPolData->pszDescription && *pIpsecNegPolData->pszDescription) { pIpsecNegPolObject->pszDescription = AllocPolStr( pIpsecNegPolData->pszDescription ); if (!pIpsecNegPolObject->pszDescription) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } } // // Fill in the ipsecID // pIpsecNegPolObject->pszIpsecID = AllocPolStr( szGuid ); if (!pIpsecNegPolObject->pszIpsecID) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } dwError = UuidToString( &pIpsecNegPolData->NegPolAction, &pszNegPolActionUuid ); BAIL_ON_WIN32_ERROR(dwError); wcscpy(szGuidAction, L"{"); wcscat(szGuidAction, pszNegPolActionUuid); wcscat(szGuidAction, L"}"); pIpsecNegPolObject->pszIpsecNegPolAction = AllocPolStr( szGuidAction ); if (!pIpsecNegPolObject->pszIpsecNegPolAction) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } dwError = UuidToString( &pIpsecNegPolData->NegPolType, &pszNegPolTypeUuid ); BAIL_ON_WIN32_ERROR(dwError); wcscpy(szGuidType, L"{"); wcscat(szGuidType, pszNegPolTypeUuid); wcscat(szGuidType, L"}"); pIpsecNegPolObject->pszIpsecNegPolType = AllocPolStr( szGuidType ); if (!pIpsecNegPolObject->pszIpsecNegPolType) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } // // Fill in the ipsecDataType // pIpsecNegPolObject->dwIpsecDataType = 0x100; // // Marshall the pIpsecDataBuffer and the Length // dwError = MarshallNegPolBuffer( pIpsecNegPolData, &pBuffer, &dwBufferLen ); BAIL_ON_WIN32_ERROR(dwError); pIpsecNegPolObject->pIpsecData = pBuffer; pIpsecNegPolObject->dwIpsecDataLen = dwBufferLen; pIpsecNegPolObject->dwWhenChanged = 0; *ppIpsecNegPolObject = pIpsecNegPolObject; cleanup: if (pszStringUuid) { RpcStringFree( &pszStringUuid ); } if (pszNegPolActionUuid) { RpcStringFree( &pszNegPolActionUuid ); } if (pszNegPolTypeUuid) { RpcStringFree( &pszNegPolTypeUuid ); } return(dwError); error: if (pIpsecNegPolObject) { FreeIpsecNegPolObject( pIpsecNegPolObject ); } *ppIpsecNegPolObject = NULL; goto cleanup; } DWORD DirGetNegPolData( HLDAP hLdapBindHandle, LPWSTR pszIpsecRootContainer, GUID NegPolGUID, PIPSEC_NEGPOL_DATA * ppIpsecNegPolData ) { DWORD dwError = 0; PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject = NULL; PIPSEC_NEGPOL_DATA pIpsecNegPolData = NULL; dwError = DirGetNegPolObject( hLdapBindHandle, pszIpsecRootContainer, NegPolGUID, &pIpsecNegPolObject ); BAIL_ON_WIN32_ERROR(dwError); dwError = DirUnmarshallNegPolData( pIpsecNegPolObject, &pIpsecNegPolData ); BAIL_ON_WIN32_ERROR(dwError); *ppIpsecNegPolData = pIpsecNegPolData; cleanup: if (pIpsecNegPolObject) { FreeIpsecNegPolObject( pIpsecNegPolObject ); } return(dwError); error: *ppIpsecNegPolData = NULL; goto cleanup; } DWORD DirGetNegPolObject( HLDAP hLdapBindHandle, LPWSTR pszIpsecRootContainer, GUID NegPolGUID, PIPSEC_NEGPOL_OBJECT * ppIpsecNegPolObject ) { DWORD dwError = 0; LPWSTR pszNegPolString = NULL; LDAPMessage * res = NULL; DWORD dwCount = 0; LDAPMessage * e = NULL; PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject = NULL; dwError = GenerateSpecificNegPolQuery( NegPolGUID, &pszNegPolString ); BAIL_ON_WIN32_ERROR(dwError); dwError = LdapSearchST( hLdapBindHandle, pszIpsecRootContainer, LDAP_SCOPE_ONELEVEL, pszNegPolString, NegPolDNAttributes, 0, NULL, &res ); BAIL_ON_WIN32_ERROR(dwError); dwCount = LdapCountEntries( hLdapBindHandle, res ); if (!dwCount) { dwError = ERROR_DS_NO_ATTRIBUTE_OR_VALUE; BAIL_ON_WIN32_ERROR(dwError); } dwError = LdapFirstEntry( hLdapBindHandle, res, &e ); BAIL_ON_WIN32_ERROR(dwError); dwError = UnMarshallNegPolObject( hLdapBindHandle, e, &pIpsecNegPolObject ); BAIL_ON_WIN32_ERROR(dwError); *ppIpsecNegPolObject = pIpsecNegPolObject; dwError = ERROR_SUCCESS; cleanup: if (pszNegPolString) { FreePolMem(pszNegPolString); } if (res) { LdapMsgFree(res); } return(dwError); error: if (pIpsecNegPolObject) { FreeIpsecNegPolObject( pIpsecNegPolObject ); } *ppIpsecNegPolObject = NULL; goto cleanup; } DWORD GenerateSpecificNegPolQuery( GUID NegPolIdentifier, LPWSTR * ppszNegPolString ) { DWORD dwError = ERROR_SUCCESS; WCHAR szGuid[MAX_PATH]; WCHAR szCommonName[MAX_PATH]; LPWSTR pszStringUuid = NULL; DWORD dwLength = 0; LPWSTR pszNegPolString = NULL; szGuid[0] = L'\0'; szCommonName[0] = L'\0'; dwError = UuidToString( &NegPolIdentifier, &pszStringUuid ); BAIL_ON_WIN32_ERROR(dwError); wcscpy(szGuid, L"{"); wcscat(szGuid, pszStringUuid); wcscat(szGuid, L"}"); wcscpy(szCommonName, L"cn=ipsecNegotiationPolicy"); wcscat(szCommonName, szGuid); // // Compute Length of Buffer to be allocated // dwLength = wcslen(L"(&(objectclass=ipsecNegotiationPolicy)"); dwLength += wcslen(L"("); dwLength += wcslen(szCommonName); dwLength += wcslen(L"))"); pszNegPolString = (LPWSTR) AllocPolMem((dwLength + 1)*sizeof(WCHAR)); if (!pszNegPolString) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } wcscpy(pszNegPolString, L"(&(objectclass=ipsecNegotiationPolicy)"); wcscat(pszNegPolString, L"("); wcscat(pszNegPolString, szCommonName); wcscat(pszNegPolString, L"))"); *ppszNegPolString = pszNegPolString; cleanup: if (pszStringUuid) { RpcStringFree(&pszStringUuid); } return(dwError); error: if (pszNegPolString) { FreePolMem(pszNegPolString); } *ppszNegPolString = NULL; goto cleanup; }