diff options
Diffstat (limited to 'source3/libaddns/dnsupdate.c')
-rw-r--r-- | source3/libaddns/dnsupdate.c | 644 |
1 files changed, 0 insertions, 644 deletions
diff --git a/source3/libaddns/dnsupdate.c b/source3/libaddns/dnsupdate.c deleted file mode 100644 index 124b627707..0000000000 --- a/source3/libaddns/dnsupdate.c +++ /dev/null @@ -1,644 +0,0 @@ -/* - Public Interface file for Linux DNS client library implementation - - Copyright (C) 2006 Krishna Ganugapati <krishnag@centeris.com> - Copyright (C) 2006 Gerald Carter <jerry@samba.org> - - ** NOTE! The following LGPL license applies to the libaddns - ** library. This does NOT imply that all of Samba is released - ** under the LGPL - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 USA -*/ - -#include "dns.h" - -/******************************************************************** -********************************************************************/ - -static int32 DNSSendUpdate1( HANDLE hDNSServer, const char *szDomainName, - char *szHost, struct in_addr *iplist, - int num_ips, - DNS_UPDATE_RESPONSE * *ppDNSUpdateResponse ) -{ - int32 dwError = 0; - DNS_UPDATE_REQUEST *pDNSUpdateRequest = NULL; - DNS_UPDATE_RESPONSE *pDNSUpdateResponse = NULL; - DNS_ZONE_RECORD *pDNSZoneRecord = NULL; - DNS_RR_RECORD *pDNSPRRecord = NULL; - int i; - - dwError = DNSUpdateCreateUpdateRequest( &pDNSUpdateRequest ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSCreateZoneRecord( szDomainName, &pDNSZoneRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSUpdateAddZoneSection( pDNSUpdateRequest, pDNSZoneRecord ); - BAIL_ON_ERROR( dwError ); - - /* Add the CNAME not in user record */ - - pDNSPRRecord = NULL; - dwError = - DNSCreateNameNotInUseRecord( szHost, QTYPE_CNAME, - &pDNSPRRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSUpdateAddPRSection( pDNSUpdateRequest, pDNSPRRecord ); - BAIL_ON_ERROR( dwError ); - - /* Add a Prerequisite for each IP address to see if everything is already setup */ - - for ( i = 0; i < num_ips; i++ ) { - DNS_RR_RECORD *pDNSPrereq = NULL; - - dwError = - DNSCreateNameInUseRecord( szHost, QTYPE_A, &iplist[i], - &pDNSPrereq ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSUpdateAddPRSection( pDNSUpdateRequest, - pDNSPrereq ); - BAIL_ON_ERROR( dwError ); - } - - dwError = - DNSUpdateSendUpdateRequest2( hDNSServer, pDNSUpdateRequest ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSUpdateReceiveUpdateResponse( hDNSServer, - &pDNSUpdateResponse ); - BAIL_ON_ERROR( dwError ); - - *ppDNSUpdateResponse = pDNSUpdateResponse; - - return dwError; - - error: - - if ( pDNSZoneRecord ) { - DNSFreeZoneRecord( pDNSZoneRecord ); - } - - if ( pDNSUpdateRequest ) { - DNSUpdateFreeRequest( pDNSUpdateRequest ); - } - - *ppDNSUpdateResponse = NULL; - return dwError; -} - -/******************************************************************** -********************************************************************/ - -static int32 DNSSendUpdate2( HANDLE hDNSServer, const char *szDomainName, - char *szHost, struct in_addr *iplist, - int num_ips, - DNS_UPDATE_RESPONSE * *ppDNSUpdateResponse ) -{ - int32 dwError = 0; - DNS_UPDATE_REQUEST *pDNSUpdateRequest = NULL; - DNS_UPDATE_RESPONSE *pDNSUpdateResponse = NULL; - DNS_ZONE_RECORD *pDNSZoneRecord = NULL; - DNS_RR_RECORD *pDNSPRRecord = NULL; - int i; - - dwError = DNSUpdateCreateUpdateRequest( &pDNSUpdateRequest ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSCreateZoneRecord( szDomainName, &pDNSZoneRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSUpdateAddZoneSection( pDNSUpdateRequest, pDNSZoneRecord ); - BAIL_ON_ERROR( dwError ); - - /* Add the CNAME not in user record */ - - pDNSPRRecord = NULL; - dwError = - DNSCreateNameNotInUseRecord( szHost, QTYPE_CNAME, - &pDNSPRRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSUpdateAddPRSection( pDNSUpdateRequest, pDNSPRRecord ); - BAIL_ON_ERROR( dwError ); - - /* Add the IN not in user record */ - - pDNSPRRecord = NULL; - dwError = - DNSCreateNameNotInUseRecord( szHost, QTYPE_A, &pDNSPRRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSUpdateAddPRSection( pDNSUpdateRequest, pDNSPRRecord ); - BAIL_ON_ERROR( dwError ); - - - for ( i = 0; i < num_ips; i++ ) { - DNS_RR_RECORD *pDNSRRAddRecord = NULL; - - dwError = - DNSCreateARecord( szHost, DNS_CLASS_IN, QTYPE_A, - ntohl( iplist[i].s_addr ), - &pDNSRRAddRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSUpdateAddUpdateSection( pDNSUpdateRequest, - pDNSRRAddRecord ); - BAIL_ON_ERROR( dwError ); - } - - dwError = - DNSUpdateSendUpdateRequest2( hDNSServer, pDNSUpdateRequest ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSUpdateReceiveUpdateResponse( hDNSServer, - &pDNSUpdateResponse ); - BAIL_ON_ERROR( dwError ); - - *ppDNSUpdateResponse = pDNSUpdateResponse; - - return dwError; - - error: - - if ( pDNSZoneRecord ) { - DNSFreeZoneRecord( pDNSZoneRecord ); - } - - if ( pDNSUpdateRequest ) { - DNSUpdateFreeRequest( pDNSUpdateRequest ); - } - - *ppDNSUpdateResponse = NULL; - return dwError; -} - -/******************************************************************** -********************************************************************/ - -static int32 DNSSendUpdate3( HANDLE hDNSServer, const char *szDomainName, - char *szHost, struct in_addr *iplist, - int num_ips, - DNS_UPDATE_RESPONSE * *ppDNSUpdateResponse ) -{ - int32 dwError = 0; - DNS_UPDATE_REQUEST *pDNSUpdateRequest = NULL; - DNS_UPDATE_RESPONSE *pDNSUpdateResponse = NULL; - DNS_ZONE_RECORD *pDNSZoneRecord = NULL; - DNS_RR_RECORD *pDNSPRRecord = NULL; - int i; - DNS_RR_RECORD *pDNSRRAddRecord = NULL; - - dwError = DNSUpdateCreateUpdateRequest( &pDNSUpdateRequest ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSCreateZoneRecord( szDomainName, &pDNSZoneRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSUpdateAddZoneSection( pDNSUpdateRequest, pDNSZoneRecord ); - BAIL_ON_ERROR( dwError ); - - /* Add the CNAME not in user record */ - - dwError = - DNSCreateNameNotInUseRecord( szHost, QTYPE_CNAME, - &pDNSPRRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSUpdateAddPRSection( pDNSUpdateRequest, pDNSPRRecord ); - BAIL_ON_ERROR( dwError ); - - /* Delete any existing A records */ - - dwError = - DNSCreateARecord( szHost, DNS_CLASS_ANY, QTYPE_A, 0, - &pDNSRRAddRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSUpdateAddUpdateSection( pDNSUpdateRequest, - pDNSRRAddRecord ); - BAIL_ON_ERROR( dwError ); - - - for ( i = 0; i < num_ips; i++ ) { - - dwError = - DNSCreateARecord( szHost, DNS_CLASS_IN, QTYPE_A, - ntohl( iplist[i].s_addr ), - &pDNSRRAddRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSUpdateAddUpdateSection( pDNSUpdateRequest, - pDNSRRAddRecord ); - BAIL_ON_ERROR( dwError ); - } - - dwError = - DNSUpdateSendUpdateRequest2( hDNSServer, pDNSUpdateRequest ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSUpdateReceiveUpdateResponse( hDNSServer, - &pDNSUpdateResponse ); - BAIL_ON_ERROR( dwError ); - - *ppDNSUpdateResponse = pDNSUpdateResponse; - - return dwError; - - error: - - if ( pDNSZoneRecord ) { - DNSFreeZoneRecord( pDNSZoneRecord ); - } - - if ( pDNSUpdateRequest ) { - DNSUpdateFreeRequest( pDNSUpdateRequest ); - } - - *ppDNSUpdateResponse = NULL; - - return dwError; -} - -/******************************************************************** -********************************************************************/ - -int32 DNSSendUpdate( HANDLE hDNSServer, const char *szDomainName, char *szHost, - struct in_addr * iplist, int num_ips, - DNS_UPDATE_RESPONSE * *ppDNSUpdateResponse ) -{ - int32 dwError = 0; - int32 dwResponseCode = 0; - DNS_UPDATE_RESPONSE *response = NULL; - - dwError = DNSSendUpdate1( hDNSServer, szDomainName, szHost, - iplist, num_ips, &response ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSUpdateGetResponseCode( response, &dwResponseCode ); - BAIL_ON_ERROR( dwError ); - - if ( ( dwResponseCode == DNS_NO_ERROR ) - || ( dwResponseCode == DNS_REFUSED ) ) { - *ppDNSUpdateResponse = response; - return dwError; - } - - response = NULL; - - dwError = DNSSendUpdate2( hDNSServer, szDomainName, szHost, - iplist, num_ips, &response ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSUpdateGetResponseCode( response, &dwResponseCode ); - BAIL_ON_ERROR( dwError ); - - if ( ( dwResponseCode == DNS_NO_ERROR ) - || ( dwResponseCode == DNS_REFUSED ) ) { - *ppDNSUpdateResponse = response; - return dwError; - } - - response = NULL; - - dwError = DNSSendUpdate3( hDNSServer, szDomainName, szHost, - iplist, num_ips, &response ); - - error: - *ppDNSUpdateResponse = response; - - return dwError; -} - -/******************************************************************** -********************************************************************/ -#ifdef HAVE_GSSAPI_SUPPORT -int32 DNSSendSecureUpdate( HANDLE hDNSServer, - gss_ctx_id_t * pGSSContext, - char *pszKeyName, - char *szDomainName, - char *szHost, - int32 dwIP, DNS_UPDATE_RESPONSE ** ppDNSUpdateResponse ) -{ - int32 dwError = 0; - DNS_UPDATE_REQUEST *pDNSUpdateRequest = NULL; - DNS_UPDATE_RESPONSE *pDNSUpdateResponse = NULL; - DNS_ZONE_RECORD *pDNSZoneRecord = NULL; - DNS_RR_RECORD *pDNSPRRecord = NULL; - DNS_RR_RECORD *pDNSARecord = NULL; - - - dwError = DNSUpdateCreateUpdateRequest( &pDNSUpdateRequest ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSCreateZoneRecord( szDomainName, &pDNSZoneRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSUpdateAddZoneSection( pDNSUpdateRequest, - pDNSZoneRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSCreateNameInUseRecord( szDomainName, - QTYPE_A, NULL, &pDNSPRRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSUpdateAddPRSection( pDNSUpdateRequest, pDNSPRRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSCreateDeleteRecord( szHost, - DNS_CLASS_ANY, - QTYPE_A, &pDNSARecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSUpdateAddUpdateSection( pDNSUpdateRequest, pDNSARecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSCreateARecord( szHost, - DNS_CLASS_IN, - QTYPE_A, dwIP, &pDNSARecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSUpdateAddUpdateSection( pDNSUpdateRequest, pDNSARecord ); - BAIL_ON_ERROR( dwError ); - - /* Now Sign the Record */ - - dwError = DNSUpdateGenerateSignature( pGSSContext, - pDNSUpdateRequest, pszKeyName ); - BAIL_ON_ERROR( dwError ); - - - dwError = - DNSUpdateSendUpdateRequest2( hDNSServer, pDNSUpdateRequest ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSUpdateReceiveUpdateResponse( hDNSServer, - &pDNSUpdateResponse ); - BAIL_ON_ERROR( dwError ); - - *ppDNSUpdateResponse = pDNSUpdateResponse; - - return dwError; - - error: - - if ( pDNSZoneRecord ) { - DNSFreeZoneRecord( pDNSZoneRecord ); - } - - if ( pDNSUpdateRequest ) { - DNSUpdateFreeRequest( pDNSUpdateRequest ); - } - - *ppDNSUpdateResponse = NULL; - - return dwError; -} - - -/********************************************************************* -*********************************************************************/ - -int32 DNSUpdateGenerateSignature( gss_ctx_id_t * pGSSContext, - DNS_UPDATE_REQUEST * pDNSUpdateRequest, - char *pszKeyName ) -{ - int32 dwError = 0; - int32 dwMinorStatus = 0; - uint8 *pMessageBuffer = NULL; - int32 dwMessageSize = 0; - int32 dwMaxSignatureSize = 0; - uint8 *pSignature = NULL; - int32 dwTimeSigned = 0; - int16 wFudge = 0; - gss_buffer_desc MsgDesc, MicDesc; - DNS_RR_RECORD *pDNSTSIGRecord = NULL; - - dwError = DNSBuildMessageBuffer( pDNSUpdateRequest, - pszKeyName, - &dwTimeSigned, - &wFudge, - &pMessageBuffer, &dwMessageSize ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSBuildSignatureBuffer( dwMaxSignatureSize, &pSignature ); - BAIL_ON_ERROR( dwError ); - - MsgDesc.value = pMessageBuffer; - MsgDesc.length = dwMessageSize; - - MicDesc.value = NULL; - MicDesc.length = 0; - - dwError = gss_get_mic( ( OM_uint32 * ) & dwMinorStatus, - *pGSSContext, 0, &MsgDesc, &MicDesc ); - display_status( "gss_init_context", dwError, dwMinorStatus ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSCreateTSIGRecord( pszKeyName, - dwTimeSigned, - wFudge, - pDNSUpdateRequest->wIdentification, - (uint8 *)MicDesc.value, - MicDesc.length, &pDNSTSIGRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSUpdateAddAdditionalSection( pDNSUpdateRequest, - pDNSTSIGRecord ); - BAIL_ON_ERROR( dwError ); - - - error: - - if ( pMessageBuffer ) { - DNSFreeMemory( pMessageBuffer ); - } - return dwError; - - if ( pSignature ) { - DNSFreeMemory( pSignature ); - } - - return dwError; -} -#endif /* HAVE_GSSAPI_SUPPORT */ - -/********************************************************************* -*********************************************************************/ - -int32 DNSBuildSignatureBuffer( int32 dwMaxSignatureSize, uint8 ** ppSignature ) -{ - int32 dwError = 0; - uint8 *pSignature = NULL; - - dwError = DNSAllocateMemory( dwMaxSignatureSize, - ( void * ) &pSignature ); - BAIL_ON_ERROR( dwError ); - - *ppSignature = pSignature; - - return dwError; - - error: - *ppSignature = NULL; - return dwError; -} - -/********************************************************************* -*********************************************************************/ - -int32 DNSBuildMessageBuffer( DNS_UPDATE_REQUEST * pDNSUpdateRequest, - char *szKeyName, - int32 * pdwTimeSigned, - int16 * pwFudge, - uint8 ** ppMessageBuffer, int32 * pdwMessageSize ) -{ - int32 dwError = 0; - uint8 *pSrcBuffer = NULL; - int32 dwReqMsgSize = 0; - int32 dwAlgorithmLen = 0; - int32 dwNameLen = 0; - uint8 *pMessageBuffer = NULL; - int32 dwMessageSize = 0; - uint8 *pOffset = NULL; - int16 wnError, wError = 0; - int16 wnFudge = 0; - int16 wFudge = DNS_TEN_HOURS_IN_SECS; - int16 wnOtherLen = 0, wOtherLen = 0; - int32 dwBytesCopied = 0; - int16 wnClass = 0, wClass = DNS_CLASS_ANY; - int32 dwnTTL = 0, dwTTL = 0; - int32 dwnTimeSigned, dwTimeSigned = 0; - HANDLE hSendBuffer = ( HANDLE ) NULL; - DNS_DOMAIN_NAME *pDomainName = NULL; - DNS_DOMAIN_NAME *pAlgorithmName = NULL; - int16 wTimePrefix = 0; - int16 wnTimePrefix = 0; - char szTsig[9]; - - dwError = DNSDomainNameFromString( szKeyName, &pDomainName ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSGetDomainNameLength( pDomainName, &dwNameLen ); - BAIL_ON_ERROR( dwError ); - - strncpy( szTsig, "gss-tsig", sizeof( szTsig ) ); - dwError = DNSDomainNameFromString( szTsig, &pAlgorithmName ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSGetDomainNameLength( pAlgorithmName, &dwAlgorithmLen ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSUpdateBuildRequestMessage( pDNSUpdateRequest, - &hSendBuffer ); - BAIL_ON_ERROR( dwError ); - - dwReqMsgSize = DNSGetSendBufferContextSize( hSendBuffer ); - dwMessageSize += dwReqMsgSize; - dwMessageSize += dwNameLen; - dwMessageSize += sizeof( int16 ); /* class */ - dwMessageSize += sizeof( int32 ); /* TTL */ - dwMessageSize += dwAlgorithmLen; - dwMessageSize += ( sizeof( int16 ) + sizeof( int32 ) ); /* Time Signed */ - dwMessageSize += sizeof( int16 ); /* Fudge */ - dwMessageSize += sizeof( int16 ); /* wError */ - dwMessageSize += sizeof( int16 ); /* Other Len */ - dwMessageSize += wOtherLen; - - dwError = - DNSAllocateMemory( dwMessageSize, - ( void * ) &pMessageBuffer ); - BAIL_ON_ERROR( dwError ); - - pOffset = pMessageBuffer; - pSrcBuffer = DNSGetSendBufferContextBuffer( hSendBuffer ); - memcpy( pOffset, pSrcBuffer, dwReqMsgSize ); - pOffset += dwReqMsgSize; - - dwError = - DNSCopyDomainName( pOffset, pAlgorithmName, &dwBytesCopied ); - BAIL_ON_ERROR( dwError ); - pOffset += dwBytesCopied; - - wnClass = htons( wClass ); - memcpy( pOffset, &wnClass, sizeof( int16 ) ); - pOffset += sizeof( int16 ); - - dwnTTL = htonl( dwTTL ); - memcpy( pOffset, &dwnTTL, sizeof( int32 ) ); - pOffset += sizeof( int32 ); - - - wnTimePrefix = htons( wTimePrefix ); - memcpy( pOffset, &wnTimePrefix, sizeof( int16 ) ); - pOffset += sizeof( int16 ); - - { - time_t t; - time(&t); - dwTimeSigned = t; - } - dwnTimeSigned = htonl( dwTimeSigned ); - memcpy( pOffset, &dwnTimeSigned, sizeof( int32 ) ); - pOffset += sizeof( int32 ); - - wnFudge = htons( wFudge ); - memcpy( pOffset, &wnFudge, sizeof( int16 ) ); - pOffset += sizeof( int16 ); - - wnError = htons( wError ); - memcpy( pOffset, &wnError, sizeof( int16 ) ); - pOffset += sizeof( int16 ); - - wnOtherLen = htons( wOtherLen ); - memcpy( pOffset, &wnOtherLen, sizeof( int16 ) ); - pOffset += sizeof( int16 ); - - *ppMessageBuffer = pMessageBuffer; - *pdwMessageSize = dwMessageSize; - - *pdwTimeSigned = dwTimeSigned; - *pwFudge = wFudge; - - return dwError; - - error: - - if ( pMessageBuffer ) { - DNSFreeMemory( pMessageBuffer ); - } - - *ppMessageBuffer = NULL; - *pdwMessageSize = 0; - *pdwTimeSigned = dwTimeSigned; - *pwFudge = wFudge; - return dwError; - -} |