401 lines
9 KiB
C++
401 lines
9 KiB
C++
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name :
|
|
|
|
metacach.cxx
|
|
|
|
Abstract:
|
|
|
|
Declares the constants, data strutcures and function prototypes
|
|
available for metadata cache management from Tsunami.lib
|
|
|
|
Author:
|
|
|
|
Phillich ( extracted from tsunami.hxx )
|
|
|
|
Project:
|
|
|
|
Internet Services Common Functionality ( Tsunami Library)
|
|
|
|
--*/
|
|
|
|
# ifndef _METACACH_HXX_
|
|
# define _METACACH_HXX_
|
|
|
|
|
|
/************************************************************
|
|
* Symbolic Constants
|
|
************************************************************/
|
|
|
|
#define METACACHE_W3_SERVER_ID 1
|
|
#define METACACHE_FTP_SERVER_ID 2
|
|
#define METACACHE_SMTP_SERVER_ID 3
|
|
#define METACACHE_NNTP_SERVER_ID 4
|
|
#define METACACHE_POP3_SERVER_ID 5
|
|
#define METACACHE_IMAP_SERVER_ID 6
|
|
|
|
//
|
|
// Define the type of a metadata free routine.
|
|
//
|
|
typedef void (*PMDFREERTN)(PVOID pMetaData);
|
|
|
|
class COMMON_METADATA;
|
|
|
|
extern
|
|
dllexp
|
|
PVOID TsAddMetaData(
|
|
|
|
IN COMMON_METADATA *pMetaData,
|
|
IN PMDFREERTN pFreeRoutine,
|
|
IN DWORD dwDataSetNumber,
|
|
IN DWORD dwServiceID
|
|
|
|
);
|
|
|
|
extern
|
|
dllexp
|
|
PVOID TsFindMetaData(
|
|
|
|
IN DWORD dwDataSetNumber,
|
|
IN DWORD dwServiceID
|
|
|
|
);
|
|
|
|
extern
|
|
dllexp
|
|
VOID TsFreeMetaData(
|
|
|
|
IN PVOID pCacheEntry
|
|
|
|
);
|
|
|
|
extern
|
|
dllexp
|
|
VOID TsAddRefMetaData(
|
|
|
|
IN PVOID pCacheEntry
|
|
|
|
);
|
|
|
|
extern
|
|
dllexp
|
|
VOID
|
|
TsFlushMetaCache(
|
|
DWORD dwService,
|
|
BOOL bTerminating
|
|
);
|
|
|
|
extern
|
|
dllexp
|
|
VOID
|
|
TsReferenceMetaData(
|
|
IN PVOID pEntry
|
|
);
|
|
|
|
extern
|
|
dllexp
|
|
VOID
|
|
_TsValidateMetaCache(
|
|
VOID
|
|
);
|
|
|
|
#if DBG
|
|
|
|
#define TsValidateMetaCache _TsValidateMetaCache
|
|
|
|
#else
|
|
|
|
#define TsValidateMetaCache()
|
|
|
|
#endif
|
|
|
|
#define CMD_SIG 0x20444D43 // 'CMD '
|
|
|
|
#define METADATA_ERROR_TYPE 0
|
|
#define METADATA_ERROR_VALUE 1
|
|
#define METADATA_ERROR_WIN32 2
|
|
|
|
typedef struct _METADATA_ERROR_INFO
|
|
{
|
|
BOOL IsValid;
|
|
DWORD ErrorParameter;
|
|
DWORD ErrorReason;
|
|
DWORD Win32Error;
|
|
|
|
} METADATA_ERROR_INFO, *PMETADATA_ERROR_INFO;
|
|
|
|
class COMMON_METADATA {
|
|
|
|
public:
|
|
|
|
|
|
dllexp
|
|
COMMON_METADATA(VOID);
|
|
|
|
|
|
dllexp
|
|
virtual ~COMMON_METADATA(VOID);
|
|
|
|
dllexp
|
|
BOOL ReadMetaData(
|
|
PIIS_SERVER_INSTANCE pInstance,
|
|
MB * pmb,
|
|
LPSTR pszURL,
|
|
PMETADATA_ERROR_INFO pError
|
|
);
|
|
|
|
dllexp
|
|
BOOL BuildPhysicalPath(
|
|
LPSTR pszURL,
|
|
STR * pstrPhysicalPath
|
|
);
|
|
|
|
dllexp
|
|
BOOL BuildPhysicalPathWithAltRoot(
|
|
LPSTR pszURL,
|
|
STR * pstrPhysicalPath,
|
|
PCSTR pstrAltRoot
|
|
);
|
|
|
|
dllexp
|
|
BOOL BuildApplPhysicalPath(
|
|
MB * pmb,
|
|
STR * pstrApplPhysicalPath
|
|
) const;
|
|
|
|
dllexp
|
|
virtual BOOL HandlePrivateProperty(
|
|
LPSTR pszURL,
|
|
PIIS_SERVER_INSTANCE pInstance,
|
|
METADATA_GETALL_INTERNAL_RECORD *pMDRecord,
|
|
PVOID pDataPointer,
|
|
BUFFER *pBuffer,
|
|
DWORD *pdwBytesUsed,
|
|
PMETADATA_ERROR_INFO pError
|
|
|
|
)
|
|
{ return TRUE; }
|
|
|
|
dllexp
|
|
virtual BOOL FinishPrivateProperties(
|
|
BUFFER *pBuffer,
|
|
DWORD dwBytesUsed,
|
|
BOOL bSucceeded
|
|
)
|
|
{ return TRUE; }
|
|
|
|
//
|
|
// This is not inline to avoid pulling-in metadata & mb declaration in
|
|
// this header file.
|
|
//
|
|
|
|
dllexp
|
|
VOID FreeMdTag( DWORD dwTag );
|
|
|
|
//
|
|
// Query Methods
|
|
//
|
|
|
|
STR * QueryVrPath( VOID )
|
|
{ return &m_strVrPath; }
|
|
|
|
STR * QueryAppPath( VOID )
|
|
{ return &m_strAppPath; }
|
|
|
|
DWORD QueryAccessPerms( VOID ) const
|
|
{ return m_dwAccessPerm | m_dwSslAccessPerm; }
|
|
|
|
DWORD QuerySslAccessPerms( VOID ) const
|
|
{ return m_dwSslAccessPerm; }
|
|
|
|
PVOID QueryCacheInfo(VOID) const
|
|
{ return m_pCacheCookie; }
|
|
|
|
BOOL DontLog( VOID ) const
|
|
{ return m_fDontLog; }
|
|
|
|
PVOID QueryAcl(VOID) const
|
|
{ return m_pAcl; }
|
|
|
|
LPVOID QueryIpDnsAccessCheckPtr()
|
|
{ return m_IpDnsAccessCheckPtr; }
|
|
|
|
DWORD QueryIpDnsAccessCheckSize()
|
|
{ return m_IpDnsAccessCheckSize; }
|
|
|
|
BOOL IsIpDnsAccessCheckPresent()
|
|
{ return m_IpDnsAccessCheckSize; }
|
|
|
|
DWORD QueryVrLevel() const
|
|
{ return m_dwVrLevel; }
|
|
|
|
DWORD QueryVrLen() const
|
|
{ return m_dwVrLen; }
|
|
|
|
HANDLE QueryVrAccessToken()
|
|
{ return m_hVrToken ? TsTokenToImpHandle( m_hVrToken ) : NULL; }
|
|
|
|
HANDLE QueryVrPrimaryAccessToken()
|
|
{ return m_hVrToken ? TsTokenToHandle( m_hVrToken ) : NULL; }
|
|
|
|
BOOL QueryDoCache() const
|
|
{ return m_fDoCache; }
|
|
|
|
BOOL ImpersonateVrAccessToken()
|
|
{ return m_hVrToken ? TsImpersonateUser( m_hVrToken ) : NULL; }
|
|
|
|
BOOL QueryVrPassThrough()
|
|
{ return m_fVrPassThrough; }
|
|
|
|
DWORD QueryVrError()
|
|
{ return m_dwVrError; }
|
|
|
|
//
|
|
// Set Methods
|
|
//
|
|
|
|
dllexp
|
|
VOID SetAccessPerms( DWORD dwAccessPerm )
|
|
{ m_dwAccessPerm = dwAccessPerm /*& MD_NONSLL_ACCESS_MASK*/; }
|
|
|
|
VOID SetSslAccessPerms( DWORD dwAccessPerm )
|
|
{ m_dwSslAccessPerm = dwAccessPerm & MD_SSL_ACCESS_MASK; }
|
|
|
|
VOID SetCacheInfo( PVOID CacheInfo )
|
|
{ m_pCacheCookie = CacheInfo; }
|
|
|
|
BOOL SetIpDnsAccessCheck( LPVOID pV, DWORD dwV, DWORD dwTag )
|
|
{
|
|
if ( dwTag == 0 )
|
|
{
|
|
// If tag is 0, then the property didn't have the REFERENCE
|
|
// attribute set. Allocate memory and copy the data.
|
|
|
|
m_IpDnsAccessCheckPtr = LocalAlloc( LPTR, dwV );
|
|
if ( m_IpDnsAccessCheckPtr == NULL )
|
|
{
|
|
return FALSE;
|
|
}
|
|
memcpy( m_IpDnsAccessCheckPtr, pV, dwV );
|
|
}
|
|
else
|
|
{
|
|
m_IpDnsAccessCheckPtr = pV;
|
|
}
|
|
m_IpDnsAccessCheckSize = dwV;
|
|
m_IpDnsAccessCheckTag = dwTag;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
VOID SetAcl( LPVOID pV, DWORD dwV, DWORD dwTag )
|
|
{
|
|
if ( dwV )
|
|
{
|
|
m_pAcl = pV;
|
|
m_dwAclTag = dwTag;
|
|
}
|
|
else
|
|
{
|
|
FreeMdTag( dwTag );
|
|
}
|
|
}
|
|
|
|
VOID SetDontLogFlag( BOOL fDontLog )
|
|
{ m_fDontLog = fDontLog; }
|
|
|
|
VOID SetVrLevelAndLen( DWORD dwL, DWORD dwVrLen )
|
|
{ m_dwVrLevel = dwL; m_dwVrLen = dwVrLen; }
|
|
|
|
BOOL SetVrUserNameAndPassword( PIIS_SERVER_INSTANCE, LPSTR pszUserName, LPSTR pszPassword );
|
|
|
|
VOID SetVrPassThrough( BOOL f ) { m_fVrPassThrough = f; }
|
|
|
|
VOID SetDoCache( BOOL f ) { m_fDoCache = f; }
|
|
|
|
VOID CheckSignature(VOID) const {DBG_ASSERT(m_Signature == CMD_SIG); }
|
|
|
|
private:
|
|
DWORD m_Signature;
|
|
STR m_strVrPath;
|
|
STR m_strAppPath;
|
|
DWORD m_dwAccessPerm;
|
|
DWORD m_dwSslAccessPerm;
|
|
PVOID m_pCacheCookie;
|
|
LPVOID m_IpDnsAccessCheckPtr;
|
|
DWORD m_IpDnsAccessCheckSize;
|
|
DWORD m_IpDnsAccessCheckTag;
|
|
BOOL m_fDontLog;
|
|
LPVOID m_pAcl;
|
|
DWORD m_dwAclTag;
|
|
DWORD m_dwVrLevel;
|
|
DWORD m_dwVrLen;
|
|
TS_TOKEN m_hVrToken;
|
|
BOOL m_fVrPassThrough;
|
|
DWORD m_dwVrError;
|
|
BOOL m_fDoCache;
|
|
PIIS_SERVER_INSTANCE m_pInstance;
|
|
};
|
|
|
|
typedef COMMON_METADATA *PCOMMON_METADATA;
|
|
|
|
|
|
class METADATA_REF_HANDLER {
|
|
public:
|
|
METADATA_REF_HANDLER()
|
|
{
|
|
m_dwMdDataTag = 0;
|
|
m_pvMdData = NULL;
|
|
}
|
|
~METADATA_REF_HANDLER() {}
|
|
VOID Set( LPVOID pV, DWORD dwS, DWORD dwR )
|
|
{
|
|
m_dwMdDataTag = dwR;
|
|
m_pvMdData = pV;
|
|
m_dwMdDataSize = dwS;
|
|
m_fIsCopy = FALSE;
|
|
}
|
|
VOID Reset( IMDCOM* pIMDCOM )
|
|
{
|
|
if ( m_dwMdDataTag )
|
|
{
|
|
HRESULT hRes;
|
|
if ( !m_fIsCopy )
|
|
{
|
|
hRes = pIMDCOM->ComMDReleaseReferenceData( m_dwMdDataTag );
|
|
}
|
|
else
|
|
{
|
|
m_fIsCopy = FALSE;
|
|
}
|
|
m_dwMdDataTag = 0;
|
|
m_pvMdData = NULL;
|
|
}
|
|
}
|
|
BOOL CopyFrom( METADATA_REF_HANDLER* pSrc )
|
|
{
|
|
m_dwMdDataTag = pSrc->m_dwMdDataTag;
|
|
m_pvMdData = pSrc->m_pvMdData;
|
|
m_dwMdDataSize = pSrc->m_dwMdDataSize;
|
|
m_fIsCopy = TRUE;
|
|
|
|
return TRUE;
|
|
}
|
|
LPVOID GetPtr() { return m_pvMdData; }
|
|
DWORD GetSize() { return m_dwMdDataSize; }
|
|
|
|
private:
|
|
DWORD m_dwMdDataTag;
|
|
LPVOID m_pvMdData;
|
|
DWORD m_dwMdDataSize;
|
|
BOOL m_fIsCopy;
|
|
} ;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|