Windows2003-3790/inetsrv/iis/inc/rdns.hxx
2020-09-30 16:53:55 +02:00

428 lines
11 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
rdns.hxx
Abstract:
Reverse DNS service
Author:
Philippe Choquier (phillich) 5-june-1996
--*/
#if !defined(_RDNS_INCLUDE)
#define _RDNS_INCLUDE
typedef LPVOID DNSARG;
typedef void (*DNSFUNC)( DNSARG, BOOL, LPSTR );
#define RDNS_REQUEST_TYPE_IP2DNS 0
#define RDNS_REQUEST_TYPE_DNS2IP 1
#define SIZEOF_IP_ADDRESS (4)
typedef struct _DNSFUNCDESC
{
DWORD dwRequestType;
DNSFUNC pFunc;
} DNSFUNCDESC, *PDNSFUNCDESC;
extern BOOL InitRDns();
extern void TerminateRDns();
BOOL
AsyncHostByAddr(
PDNSFUNCDESC pFunc, // will store DNS name, post dummy completion status
// if NULL ( or g_cMaxThreadLimit==0 ) then sync request
DNSARG pArg, // ptr to be passed to FUNC
struct sockaddr *pHostAddr,
BOOL *pfSync, // updated with TRUE if sync call
LPSTR pName,
DWORD dwMaxNameLen
);
BOOL
AsyncAddrByHost(
PDNSFUNCDESC pFunc, // will store DNS name, post dummy completion status
// if NULL ( or g_cMaxThreadLimit==0 ) then sync request
DNSARG pArg, // ptr to be passed to FUNC
struct sockaddr *pHostAddr,
BOOL *pfSync, // updated with TRUE if sync call
LPSTR pName
);
BOOL
FireUpNewThread(
PDNSFUNCDESC pFunc,
DNSARG pArg,
LPVOID pOvr
);
#define XAR_GRAIN 256
//
// extensible array class
//
class XAR {
public:
XAR() { m_fDidAlloc = FALSE; m_pAlloc = NULL; m_cAlloc = m_cUsed = 0; }
~XAR() { if ( m_fDidAlloc ) LocalFree( m_pAlloc ); }
BOOL Init( LPBYTE p=NULL, DWORD c=0) { m_fDidAlloc = FALSE; m_pAlloc = p; m_cAlloc = m_cUsed = c; return TRUE; }
VOID Terminate()
{
if ( m_fDidAlloc )
{
LocalFree( m_pAlloc );
}
m_fDidAlloc = FALSE;
m_pAlloc = NULL;
m_cAlloc = m_cUsed = 0;
}
BOOL Resize( DWORD dwDelta );
DWORD GetUsed() { return m_cUsed; }
VOID SetUsed( DWORD c ) { m_cUsed = c; }
VOID AdjustUsed( int c ) { m_cUsed += (DWORD)c; }
LPBYTE GetAlloc() { return m_pAlloc; }
private:
LPBYTE m_pAlloc;
DWORD m_cAlloc;
DWORD m_cUsed;
BOOL m_fDidAlloc;
} ;
//
// This type defines a relocatable index inside a dynamic array.
// to allow easy fixups when part of the array is to be extended/shrinked
// index are identified by setting bit 31 to 1. Other DWORD in the reference
// part of the array are assumed to have bit 31 set to 0.
// The size of the reference part of the array is defined by cRefSize
//
typedef DWORD SELFREFINDEX;
// combine array base address with SELFREFINDEX
#define MAKEPTR(a,b) ((LPBYTE)(a)+((b)&0x7fffffff))
// build a SELFREFINDEX from an offset in array
#define MAKEREF(a) ((a)|0x80000000)
// build an offset from a SELFREFINDEX
#define MAKEOFFSET(a) ((a)&0x7fffffff)
//
// ADDRESS_CHECK_LIST Flags. bit31 must not be used.
//
#define RDNS_FLAG_DODNS2IPCHECK 0x00000001
// uses non-standard extension : zero-sized array in struct
#pragma warning(disable:4200)
// array header
typedef struct _ADDRESS_CHECK_LIST {
SELFREFINDEX iDenyAddr; // address deny list
// points to ADDRESS_HEADER
SELFREFINDEX iGrantAddr; // address grant list
// points to ADDRESS_HEADER
SELFREFINDEX iDenyName; // DNS name deny list
// points to NAME_HEADER
SELFREFINDEX iGrantName; // DNS name grant list
// points to NAME_HEADER
DWORD dwFlags;
DWORD cRefSize; // size of reference area ( in bytes )
} ADDRESS_CHECK_LIST, *PADDRESS_CHECK_LIST;
typedef struct _ADDRESS_LIST_ENTRY {
DWORD iFamily;
DWORD cAddresses;
DWORD cFullBytes;
DWORD LastByte;
SELFREFINDEX iFirstAddress; // points to array of addresses
// which size are derived from iFamily
} ADDRESS_LIST_ENTRY, *PADDRESS_LIST_ENTRY;
typedef struct _ADDRESS_HEADER {
DWORD cEntries; // # of Entries[]
DWORD cAddresses; // total # of addresses in all
// ADDRESS_LIST_ENTRY
ADDRESS_LIST_ENTRY Entries[];
} ADDRESS_HEADER, *PADDRESS_HEADER ;
typedef struct _NAME_LIST_ENTRY {
DWORD cComponents; // # of DNS components
DWORD cNames;
SELFREFINDEX iName[]; // array of references to DNS names
} NAME_LIST_ENTRY, *PNAME_LIST_ENTRY;
typedef struct _NAME_HEADER {
DWORD cEntries;
DWORD cNames; // total # of names for all Entries[]
//NAME_LIST_ENTRY Entries[0]; // array of name classes
} NAME_HEADER, *PNAME_HEADER ;
typedef struct ADDRCMPDESC {
LPBYTE pMask;
UINT cFullBytes;
UINT LastByte;
UINT cSizeAddress;
} ADDRCMPDESC, *PADDRCMPDESC;
typedef struct NAMECMPDESC {
LPVOID pName;
LPBYTE pBase;
} NAMECMPDESC, *PNAMECMPDESC;
typedef LPVOID ADDRCHECKARG;
typedef void (*ADDRCHECKFUNC)(ADDRCHECKARG, BOOL );
typedef void (*ADDRCHECKFUNCEX)(ADDRCHECKARG, BOOL, LPSTR );
typedef int (__cdecl *CMPFUNC)(const void*, const void*, LPVOID);
#define SIZE_FAST_REVERSE_DNS 128
enum AC_RESULT {
AC_NOT_CHECKED,
AC_IN_DENY_LIST,
AC_NOT_IN_DENY_LIST, // deny list present but not in deny list
AC_IN_GRANT_LIST,
AC_NOT_IN_GRANT_LIST, // grant list present but not in grant list
AC_NO_LIST
} ;
#define DNSLIST_FLAG_NOSUBDOMAIN 0x80000000
#define DNSLIST_FLAGS 0x80000000 // bitmask of all flags
class ADDRESS_CHECK {
public:
ADDRESS_CHECK()
{
m_pszDnsName = NULL;
m_fDnsResolved = FALSE;
}
~ADDRESS_CHECK()
{
if ( m_pszDnsName != NULL )
{
LocalFree( m_pszDnsName );
m_pszDnsName = NULL;
}
}
//
BOOL BindCheckList( LPBYTE p = NULL, DWORD c = 0 );
VOID UnbindCheckList() { m_Storage.Terminate(); }
BOOL BindAddr( struct sockaddr* pAddr )
{
m_pAddr = pAddr;
m_fDnsResolved = FALSE;
m_fIpResolved = FALSE;
m_dwErrorResolving = 0;
return TRUE;
}
VOID UnbindAddr()
{
m_pAddr = NULL;
m_fDnsResolved = FALSE;
}
XAR* GetStorage() { return &m_Storage; }
AC_RESULT CheckAccess(
LPBOOL pfSync,
ADDRCHECKFUNC pFunc,
ADDRCHECKARG pArg
);
//
void AdjustRefs( LPBYTE, DWORD dwCut, DWORD dwAdj );
//
UINT GetAddrSize( DWORD );
VOID MakeAcd( PADDRCMPDESC pacd, LPBYTE pMask, UINT cLen );
// for UI, addr
BOOL AddAddr( BOOL fGrant, DWORD dwFamily, LPBYTE pMask, LPBYTE pAddr );
BOOL DeleteAddr( BOOL fGrant, DWORD iIndex );
BOOL GetAddr( BOOL fGrant, DWORD iIndex, LPDWORD pdwFamily, LPBYTE* pMask, LPBYTE* pAddr );
DWORD GetNbAddr( BOOL fGrant );
BOOL LocateAddr( BOOL fGrant, DWORD iIndex, PADDRESS_HEADER* ppHd, PADDRESS_LIST_ENTRY* pHeader, LPDWORD iIndexInHeader );
BOOL DeleteAllAddr( BOOL fGrant );
BOOL SetFlag( DWORD dwFlag, BOOL fEnable );
DWORD GetFlags();
// test all mask for this family, do bsearch on each
BOOL IsMatchAddr( BOOL fGrant, DWORD dwFamily, LPBYTE pAddr );
AC_RESULT CheckAddress(
struct sockaddr* pAddr
);
BOOL QueryDnsName(
LPBOOL pfSync,
ADDRCHECKFUNCEX pFunc,
ADDRCHECKARG pArg,
LPSTR * ppName
);
AC_RESULT CheckIpAccess( LPBOOL pfNeedDns);
AC_RESULT CheckDnsAccess()
{ return CheckName( m_pszDnsName ); }
BOOL IsDnsResolved()
{ return m_fDnsResolved; }
LPSTR QueryResolvedDnsName()
{ return m_pszDnsName; }
DWORD QueryErrorResolving()
{ return m_dwErrorResolving; }
// for UI, name
BOOL AddName( BOOL fGrant, LPSTR pName, DWORD dwFlags = 0 );
BOOL AddReversedName( BOOL fGrant, LPSTR pName );
BOOL DeleteName( BOOL fGrant, DWORD iIndex );
BOOL GetName( BOOL fGrant, DWORD iIndex, LPSTR* ppName, LPDWORD pdwFlags = NULL );
BOOL GetReversedName( BOOL fGrant, DWORD iIndex, LPSTR pName, LPDWORD pdwSize );
DWORD GetNbName( BOOL fGrant );
BOOL LocateName( BOOL fGrant, DWORD iIndex, PNAME_HEADER* ppHd, PNAME_LIST_ENTRY* pHeader, LPDWORD iIndexInHeader );
BOOL DeleteAllName( BOOL fGrant );
DWORD QueryCheckListSize() { return m_Storage.GetUsed(); }
LPBYTE QueryCheckListPtr() { return m_Storage.GetAlloc(); }
UINT GetNbComponent( LPSTR pName );
// test all classes, do bsearch on each
BOOL IsMatchName( BOOL fGrant, LPSTR pName );
BOOL CheckReversedName( LPSTR pName ); // synchronous version
AC_RESULT CheckName( LPSTR pName ); // synchronous version
LPSTR InitReverse( LPSTR pR, LPSTR pTarget, LPBOOL pfAlloc );
VOID TerminateReverse( LPSTR, BOOL );
VOID AddrCheckDnsCallBack(
BOOL fSt,
LPSTR pDns
);
VOID AddrCheckDnsCallBack2(
BOOL fSt,
struct sockaddr* pAddr
);
VOID AddrCheckDnsCallBack3(
BOOL fSt,
struct sockaddr* pAddr
);
VOID ResolveDnsCallBack(
BOOL fSt,
LPSTR pDns
);
#if DBG
VOID DumpAddrAndName( VOID );
VOID DumpAddr( BOOL );
VOID DumpName( BOOL );
#endif
private:
XAR m_Storage;
struct sockaddr * m_pAddr;
struct sockaddr m_ResolvedAddr;
LPSTR m_pszDnsName;
BOOL m_fDnsResolved;
BOOL m_fIpResolved;
DWORD m_dwErrorResolving;
ADDRCHECKFUNC m_HttpReqCallback;
ADDRCHECKFUNCEX m_HttpReqCallbackEx;
ADDRCHECKARG m_HttpReqParam;
} ;
typedef struct _SID_CACHE_ENTRY
{
DWORD tExpire; // now + TTL
DWORD dwSidLen;
BYTE Sid[0];
} SID_CACHE_ENTRY, *PSID_CACHE_ENTRY;
class CSidCache
{
public:
CSidCache() {}
~CSidCache() {}
//
BOOL Init();
VOID Terminate();
//
BOOL AddToCache( PSID, DWORD dwTTL ); // TTL in seconds
BOOL IsInCache( PSID );
BOOL CheckPresentAndResetTtl( PSID, DWORD );
//
BOOL Scavenger();
private:
XAR xaStore; // buffer of SID_CACHE_ENTRY
CRITICAL_SECTION csLock;
} ;
//
// PEN : Password Expiration Notification API
//
extern CSidCache g_scPen;
BOOL PenAddToCache( PSID, DWORD );
BOOL PenIsInCache( PSID );
BOOL PenCheckPresentAndResetTtl( PSID, DWORD );
#define PEN_TTL (10*60) // in seconds
#if DBG
extern VOID TestAPI();
#endif
#if defined(_RDNS_STANDALONE)
typedef
VOID
(* PFN_SCHED_CALLBACK)(
VOID * pContext
);
DWORD
ScheduleWorkItem(
PFN_SCHED_CALLBACK pfnCallback,
PVOID pContext,
DWORD msecTimeInterval,
BOOL fPeriodic = FALSE
)
{
return 0;
}
BOOL
RemoveWorkItem(
DWORD pdwCookie
)
{
return FALSE;
}
#endif
#endif