You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
544 lines
13 KiB
544 lines
13 KiB
/*++
|
|
|
|
Copyright (c) 1999-2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
w3site.h
|
|
|
|
Abstract:
|
|
|
|
Type definition for worker process implementation of IIS.
|
|
|
|
Author:
|
|
|
|
Taylor Weiss (TaylorW) 16-Dec-1999
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _W3SITE_H_
|
|
#define _W3SITE_H_
|
|
|
|
/************************************************************
|
|
* Include Headers
|
|
************************************************************/
|
|
|
|
/************************************************************
|
|
* Type Definitions
|
|
************************************************************/
|
|
|
|
/*++
|
|
|
|
class W3_SITE
|
|
|
|
Encapsulates site level settings for an HTTP server run in
|
|
a duct-tape worker process.
|
|
|
|
Condenses the relevant functionality exposed in IIS
|
|
through the IIS_SERVER_INSTANCE and W3_SERVER_INSTANCE.
|
|
|
|
--*/
|
|
|
|
#define W3_SITE_SIGNATURE (DWORD)' ISW'
|
|
#define W3_SITE_SIGNATURE_FREE (DWORD)'fISW'
|
|
|
|
#define MAX_SITEID_LENGTH 10
|
|
|
|
class FILTER_LIST;
|
|
|
|
class W3_SITE
|
|
{
|
|
|
|
public:
|
|
|
|
//
|
|
// Construction and Initialization
|
|
//
|
|
|
|
W3_SITE(DWORD SiteId);
|
|
|
|
// global initialization and cleanup
|
|
static HRESULT W3SiteInitialize()
|
|
{
|
|
INITIALIZE_CRITICAL_SECTION( &sm_csIISCertMapLock );
|
|
return S_OK;
|
|
}
|
|
|
|
static VOID W3SiteTerminate()
|
|
{
|
|
DeleteCriticalSection( &sm_csIISCertMapLock );
|
|
}
|
|
|
|
// global lock & unlock for iis certmap
|
|
|
|
VOID GlobalLockIISCertMap()
|
|
{
|
|
EnterCriticalSection( &sm_csIISCertMapLock );
|
|
}
|
|
|
|
VOID GlobalUnlockIISCertMap()
|
|
{
|
|
LeaveCriticalSection( &sm_csIISCertMapLock );
|
|
}
|
|
|
|
HRESULT Initialize(LOGGING *pLogging = NULL,
|
|
FILTER_LIST *pFilterList = NULL);
|
|
|
|
DWORD QueryId() const
|
|
{
|
|
return m_SiteId;
|
|
}
|
|
|
|
BOOL QueryUseDSMapper() const
|
|
{
|
|
return m_fUseDSMapper;
|
|
}
|
|
|
|
void ReferenceSite()
|
|
{
|
|
InterlockedIncrement( &m_cRefs );
|
|
}
|
|
|
|
void DereferenceSite()
|
|
{
|
|
DBG_ASSERT( m_cRefs > 0 );
|
|
|
|
if ( InterlockedDecrement( &m_cRefs ) == 0 )
|
|
{
|
|
delete this;
|
|
}
|
|
}
|
|
|
|
FILTER_LIST *QueryFilterList() const
|
|
{
|
|
return m_pInstanceFilterList;
|
|
}
|
|
|
|
STRA *QueryName()
|
|
{
|
|
return &m_SiteName;
|
|
}
|
|
|
|
STRU *QueryMBRoot()
|
|
{
|
|
return &m_SiteMBRoot;
|
|
}
|
|
|
|
STRU *QueryMBPath()
|
|
{
|
|
return &m_SiteMBPath;
|
|
}
|
|
|
|
HRESULT
|
|
HandleMetabaseChange(
|
|
const MD_CHANGE_OBJECT &ChangeObject,
|
|
IN W3_SITE_LIST *pTempSiteList = NULL);
|
|
|
|
BOOL QueryDoUlLogging() const
|
|
{
|
|
return m_pLogging->QueryDoUlLogging();
|
|
}
|
|
|
|
BOOL QueryDoCustomLogging() const
|
|
{
|
|
return m_pLogging->QueryDoCustomLogging();
|
|
}
|
|
|
|
BOOL IsRequiredExtraLoggingFields() const
|
|
{
|
|
return m_pLogging->IsRequiredExtraLoggingFields();
|
|
}
|
|
|
|
const MULTISZA *QueryExtraLoggingFields() const
|
|
{
|
|
return m_pLogging->QueryExtraLoggingFields();
|
|
}
|
|
|
|
void LogInformation(LOG_CONTEXT *pLogData)
|
|
{
|
|
m_pLogging->LogInformation(pLogData);
|
|
}
|
|
|
|
BOOL QueryAllowPathInfoForScriptMappings() const
|
|
{
|
|
return m_fAllowPathInfoForScriptMappings;
|
|
}
|
|
|
|
VOID GetStatistics(IISWPSiteCounters *pCounterData)
|
|
{
|
|
PBYTE pSrc = (PBYTE)&m_PerfCounters;
|
|
PBYTE pDest = (PBYTE)pCounterData;
|
|
|
|
//
|
|
// Set the site id for the counters we
|
|
// are sending.
|
|
//
|
|
pCounterData->SiteID = m_SiteId;
|
|
|
|
for (DWORD i=0; i< WPSiteCtrsMaximum; i++)
|
|
{
|
|
// I am assuming all WP site counters are DWORDs and will
|
|
// remain so, if not this code needs changing at that point
|
|
DBG_ASSERT(aIISWPSiteDescription[i].Size == sizeof(DWORD));
|
|
|
|
if (aIISWPSiteDescription[i].WPZeros)
|
|
{
|
|
//
|
|
// For the total counters, we pass on the increment since
|
|
// the last collection, so we need to zero them
|
|
//
|
|
|
|
*(DWORD *)(pDest + aIISWPSiteDescription[i].Offset) =
|
|
InterlockedExchange(
|
|
(LPLONG)(pSrc + aIISWPSiteDescription[i].Offset),
|
|
0);
|
|
}
|
|
else
|
|
{
|
|
*(DWORD *)(pDest + aIISWPSiteDescription[i].Offset) =
|
|
*(DWORD *)(pSrc + aIISWPSiteDescription[i].Offset);
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID IncFilesSent()
|
|
{
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.FilesSent);
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.FilesTransferred);
|
|
}
|
|
|
|
VOID IncFilesRecvd()
|
|
{
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.FilesReceived);
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.FilesTransferred);
|
|
}
|
|
|
|
VOID IncAnonUsers()
|
|
{
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.AnonUsers);
|
|
DWORD currAnons = InterlockedIncrement((LPLONG)&m_PerfCounters.CurrentAnonUsers);
|
|
|
|
DWORD currMaxAnons;
|
|
while ((currMaxAnons = m_PerfCounters.MaxAnonUsers) <
|
|
currAnons)
|
|
{
|
|
InterlockedCompareExchange((LPLONG)&m_PerfCounters.MaxAnonUsers,
|
|
currAnons,
|
|
currMaxAnons);
|
|
}
|
|
}
|
|
|
|
VOID DecAnonUsers()
|
|
{
|
|
InterlockedDecrement((LPLONG)&m_PerfCounters.CurrentAnonUsers);
|
|
}
|
|
|
|
VOID IncNonAnonUsers()
|
|
{
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.NonAnonUsers);
|
|
DWORD currNonAnons = InterlockedIncrement((LPLONG)&m_PerfCounters.CurrentNonAnonUsers);
|
|
|
|
DWORD currMaxNonAnons;
|
|
while ((currMaxNonAnons = m_PerfCounters.MaxNonAnonUsers) <
|
|
currNonAnons)
|
|
{
|
|
InterlockedCompareExchange((LPLONG)&m_PerfCounters.MaxNonAnonUsers,
|
|
currNonAnons,
|
|
currMaxNonAnons);
|
|
}
|
|
}
|
|
|
|
VOID DecNonAnonUsers()
|
|
{
|
|
InterlockedDecrement((LPLONG)&m_PerfCounters.CurrentNonAnonUsers);
|
|
}
|
|
|
|
VOID IncLogonAttempts()
|
|
{
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.LogonAttempts);
|
|
}
|
|
|
|
VOID IncReqType(HTTP_VERB VerbType)
|
|
{
|
|
switch (VerbType)
|
|
{
|
|
case HttpVerbOPTIONS:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.OptionsReqs);
|
|
return;
|
|
|
|
case HttpVerbGET:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.GetReqs);
|
|
return;
|
|
|
|
case HttpVerbHEAD:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.HeadReqs);
|
|
return;
|
|
|
|
case HttpVerbPOST:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.PostReqs);
|
|
return;
|
|
|
|
case HttpVerbPUT:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.PutReqs);
|
|
IncFilesRecvd();
|
|
return;
|
|
|
|
case HttpVerbDELETE:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.DeleteReqs);
|
|
return;
|
|
|
|
case HttpVerbTRACE:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.TraceReqs);
|
|
return;
|
|
|
|
case HttpVerbMOVE:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.MoveReqs);
|
|
return;
|
|
|
|
case HttpVerbCOPY:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.CopyReqs);
|
|
return;
|
|
|
|
case HttpVerbPROPFIND:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.PropfindReqs);
|
|
return;
|
|
|
|
case HttpVerbPROPPATCH:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.ProppatchReqs);
|
|
return;
|
|
|
|
case HttpVerbMKCOL:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.MkcolReqs);
|
|
return;
|
|
|
|
case HttpVerbLOCK:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.LockReqs);
|
|
return;
|
|
|
|
case HttpVerbUNLOCK:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.UnlockReqs);
|
|
return;
|
|
|
|
case HttpVerbSEARCH:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.SearchReqs);
|
|
return;
|
|
|
|
default:
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.OtherReqs);
|
|
return;
|
|
}
|
|
}
|
|
|
|
VOID IncCgiReqs()
|
|
{
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.CgiReqs);
|
|
DWORD currCgis = InterlockedIncrement((LPLONG)&m_PerfCounters.CurrentCgiReqs);
|
|
|
|
DWORD currMaxCgis;
|
|
while ((currMaxCgis = m_PerfCounters.MaxCgiReqs) <
|
|
currCgis)
|
|
{
|
|
InterlockedCompareExchange((LPLONG)&m_PerfCounters.MaxCgiReqs,
|
|
currCgis,
|
|
currMaxCgis);
|
|
}
|
|
}
|
|
|
|
VOID DecCgiReqs()
|
|
{
|
|
InterlockedDecrement((LPLONG)&m_PerfCounters.CurrentCgiReqs);
|
|
}
|
|
|
|
VOID IncIsapiExtReqs()
|
|
{
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.IsapiExtReqs);
|
|
DWORD currIsapiExts = InterlockedIncrement((LPLONG)&m_PerfCounters.CurrentIsapiExtReqs);
|
|
|
|
DWORD currMaxIsapiExts;
|
|
while ((currMaxIsapiExts = m_PerfCounters.MaxIsapiExtReqs) <
|
|
currIsapiExts)
|
|
{
|
|
InterlockedCompareExchange((LPLONG)&m_PerfCounters.MaxIsapiExtReqs,
|
|
currIsapiExts,
|
|
currMaxIsapiExts);
|
|
}
|
|
}
|
|
|
|
VOID DecIsapiExtReqs()
|
|
{
|
|
InterlockedDecrement((LPLONG)&m_PerfCounters.CurrentIsapiExtReqs);
|
|
}
|
|
|
|
VOID IncNotFound()
|
|
{
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.NotFoundErrors);
|
|
}
|
|
|
|
VOID IncLockedError()
|
|
{
|
|
InterlockedIncrement((LPLONG)&m_PerfCounters.LockedErrors);
|
|
}
|
|
|
|
BOOL
|
|
IsAuthPwdChangeEnabled(
|
|
VOID
|
|
)
|
|
{
|
|
return !( m_dwAuthChangeFlags & MD_AUTH_CHANGE_DISABLE );
|
|
}
|
|
BOOL
|
|
IsAuthPwdChangeNotificationEnabled(
|
|
VOID
|
|
)
|
|
{
|
|
return !( m_dwAuthChangeFlags & MD_AUTH_ADVNOTIFY_DISABLE );
|
|
}
|
|
|
|
STRU *
|
|
QueryAuthChangeUrl(
|
|
VOID
|
|
)
|
|
{
|
|
return &m_strAuthChangeUrl;
|
|
}
|
|
|
|
STRU *
|
|
QueryAuthExpiredUrl(
|
|
VOID
|
|
)
|
|
{
|
|
if ( m_dwAuthChangeFlags & MD_AUTH_CHANGE_DISABLE )
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
if ( m_dwAuthChangeFlags & MD_AUTH_CHANGE_UNSECURE )
|
|
{
|
|
return &m_strAuthExpiredUnsecureUrl;
|
|
}
|
|
else
|
|
{
|
|
return &m_strAuthExpiredUrl;
|
|
}
|
|
}
|
|
|
|
STRU *
|
|
QueryAdvNotPwdExpUrl(
|
|
VOID
|
|
)
|
|
{
|
|
if ( m_dwAuthChangeFlags & MD_AUTH_ADVNOTIFY_DISABLE )
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
if ( m_dwAuthChangeFlags & MD_AUTH_CHANGE_UNSECURE )
|
|
{
|
|
return &m_strAdvNotPwdExpUnsecureUrl;
|
|
}
|
|
else
|
|
{
|
|
return &m_strAdvNotPwdExpUrl;
|
|
}
|
|
}
|
|
|
|
DWORD
|
|
QueryAdvNotPwdExpInDays(
|
|
VOID
|
|
)
|
|
{
|
|
return m_dwAdvNotPwdExpInDays;
|
|
}
|
|
|
|
DWORD
|
|
QueryAdvCacheTTL(
|
|
VOID
|
|
)
|
|
{
|
|
return m_dwAdvCacheTTL;
|
|
}
|
|
|
|
BOOL
|
|
QuerySSLSupported(
|
|
VOID
|
|
)
|
|
{
|
|
return m_fSSLSupported;
|
|
}
|
|
|
|
HRESULT
|
|
GetIISCertificateMapping(
|
|
IIS_CERTIFICATE_MAPPING ** ppIISCertificateMapping
|
|
);
|
|
|
|
HRESULT
|
|
GetDataSetCache(
|
|
DATA_SET_CACHE ** ppDataSetCache
|
|
);
|
|
|
|
VOID
|
|
RemoveDataSetCache(
|
|
VOID
|
|
);
|
|
|
|
private:
|
|
|
|
~W3_SITE();
|
|
|
|
HRESULT ReadPrivateProperties();
|
|
|
|
DWORD m_Signature;
|
|
LONG m_cRefs;
|
|
DWORD m_SiteId;
|
|
STRA m_SiteName;
|
|
STRU m_SiteMBPath;
|
|
STRU m_SiteMBRoot;
|
|
|
|
FILTER_LIST *m_pInstanceFilterList;
|
|
|
|
LOGGING *m_pLogging;
|
|
|
|
BOOL m_fAllowPathInfoForScriptMappings;
|
|
BOOL m_fUseDSMapper;
|
|
IISWPSiteCounters m_PerfCounters;
|
|
|
|
//
|
|
// OWA related variables
|
|
//
|
|
|
|
STRU m_strAuthChangeUrl;
|
|
STRU m_strAuthExpiredUrl;
|
|
STRU m_strAdvNotPwdExpUrl;
|
|
STRU m_strAuthExpiredUnsecureUrl;
|
|
STRU m_strAdvNotPwdExpUnsecureUrl;
|
|
DWORD m_dwAdvNotPwdExpInDays;
|
|
DWORD m_dwAuthChangeFlags;
|
|
DWORD m_dwAdvCacheTTL;
|
|
|
|
//
|
|
// Data set cache management
|
|
//
|
|
|
|
CReaderWriterLock3 m_DataSetCacheLock;
|
|
DATA_SET_CACHE * m_pDataSetCache;
|
|
|
|
//
|
|
// Does this site support SSL
|
|
//
|
|
BOOL m_fSSLSupported;
|
|
|
|
//
|
|
// IIS certificate mapping
|
|
// It is loaded on demand on first request to content
|
|
// that enable IIS cert mapping
|
|
//
|
|
|
|
IIS_CERTIFICATE_MAPPING * m_pIISCertMap;
|
|
BOOL m_fAlreadyAttemptedToLoadIISCertMap;
|
|
static CRITICAL_SECTION sm_csIISCertMapLock;
|
|
|
|
}; // W3_SITE
|
|
|
|
#endif // _W3SITE_H_
|