|
|
/*++
Copyright (c) 1994-1999 Microsoft Corporation
Module Name :
w3sht.cpp
Abstract:
WWW Property Sheet
Author:
Ronald Meijer (ronaldm)
Project:
Internet Services Manager
Revision History:
--*/
//
// Include Files
//
#include "stdafx.h"
#include "common.h"
#include "inetprop.h"
#include "InetMgrApp.h"
#include "shts.h"
#include "w3sht.h"
#include "iisfilt.h"
#include "fltdlg.h"
#include "iisobj.h"
// from pshed.cpp
HRESULT CallINetCfg(BOOL Install);
//
// Help IDs
//
#define HIDD_DIRECTORY_PROPERTIES (IDD_WEB_DIRECTORY_PROPERTIES + 0x20000)
#define HIDD_HOME_DIRECTORY_PROPERTIES (HIDD_DIRECTORY_PROPERTIES + 0x20000)
#define HIDD_FS_DIRECTORY_PROPERTIES (HIDD_DIRECTORY_PROPERTIES + 0x20001)
#define HIDD_FS_FILE_PROPERTIES (HIDD_DIRECTORY_PROPERTIES + 0x20002)
//
// Metabase node ID
//
const LPCTSTR g_cszSvc = _T("W3SVC"); const LPCTSTR g_cszFilters = _T("Filters"); const LPCTSTR g_cszSSLKeys = _T("SSLKeys");
//
// Helper Functions
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
BOOL IsCertInstalledOnServer( IN CComAuthInfo * pAuthInfo, IN LPCTSTR lpszMDPath ) /*++
Routine Description:
Check to see if a certificate is installed on this virtual server. This routine only checks that the cert metabase key was read in.
by boydm
Arguments:
None
Return Value:
TRUE if a certificate are installed, FALSE otherwise
--*/ { CError err; BOOL fCertInstalled = FALSE; CW3InstanceProps * ppropInst; CString strNewPath;
//
// Get the instance properties
//
CMetabasePath::GetInstancePath(lpszMDPath,strNewPath); ppropInst = new CW3InstanceProps(pAuthInfo, strNewPath);
//
// If it succeeded, load the data, then check the answer
//
if (ppropInst) { err = ppropInst->LoadData();
if (err.Succeeded()) { fCertInstalled = !(MP_V(ppropInst->m_CertHash).IsEmpty()); } }
//
// Clean up since we don't really need the ppropInst after this.
//
if (ppropInst) { delete ppropInst; ppropInst = NULL; }
//
// if that test failed. we want to check the metabase key itself
// since the above check is all cached information and won't reflect
// any certificates which are removed/added via scripts, while mmc is open
//
if (!fCertInstalled) { CMetaKey key(pAuthInfo,strNewPath,METADATA_PERMISSION_READ); if (key.Succeeded()) { CBlob hash; if (SUCCEEDED(key.QueryValue(MD_SSL_CERT_HASH, hash))) { fCertInstalled = TRUE; } } }
//
// If that test failed, we may be admining a downlevel IIS4 machine.
// Unfortunately we can't tell by examining the capability bits,
// so look to see if the old certs are there.
//
if (!fCertInstalled) { CString strKey; CMetaEnumerator me(pAuthInfo, CMetabasePath(SZ_MBN_WEB)); HRESULT err = me.Next(strKey, g_cszSSLKeys); fCertInstalled = SUCCEEDED(err); }
return fCertInstalled; }
//
// CW3InstanceProps implementation
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
CW3InstanceProps::CW3InstanceProps( IN CComAuthInfo * pAuthInfo, IN LPCTSTR lpszMDPath ) /*++
Routine Description:
Constructor for WWW instance properties
Arguments:
CComAuthInfo * pAuthInfo : COM Authentication info LPCTSTR lpszMDPath : MD Path
Return Value:
None.
--*/ : CInstanceProps(pAuthInfo, lpszMDPath, 80U), /**/ m_nMaxConnections(INITIAL_MAX_CONNECTIONS), m_nConnectionTimeOut((LONG)900L), m_strlSecureBindings(), m_dwLogType(MD_LOG_TYPE_DISABLED), /**/ m_fUseKeepAlives(TRUE), m_fEnableCPUAccounting(FALSE), m_nServerSize(MD_SERVER_SIZE_MEDIUM), m_dwMaxBandwidth(INFINITE_BANDWIDTH), /**/ m_dwCPULimitLogEventRaw(INFINITE_CPU_RAW), m_dwCPULimitPriorityRaw(0), m_dwCPULimitPauseRaw(0), m_dwCPULimitProcStopRaw(0), /**/ m_acl(), /**/ m_dwDownlevelInstance(1), m_CertHash() { //
// Fetch everything
//
m_dwMDUserType = ALL_METADATA; m_dwMDDataType = ALL_METADATA; }
/* virtual */ void CW3InstanceProps::ParseFields() /*++
Routine Description:
Break into fields.
Arguments:
None.
Return Value:
None.
--*/ { //
// Fetch base properties
//
CInstanceProps::ParseFields();
BEGIN_PARSE_META_RECORDS(m_dwNumEntries, m_pbMDData) HANDLE_META_RECORD(MD_MAX_GLOBAL_CONNECTIONS, m_nMaxConnections) HANDLE_META_RECORD(MD_CONNECTION_TIMEOUT, m_nConnectionTimeOut) HANDLE_META_RECORD(MD_SECURE_BINDINGS, m_strlSecureBindings) HANDLE_META_RECORD(MD_LOG_TYPE, m_dwLogType) HANDLE_META_RECORD(MD_SERVER_SIZE, m_nServerSize) HANDLE_META_RECORD(MD_ALLOW_KEEPALIVES, m_fUseKeepAlives) HANDLE_META_RECORD(MD_MAX_BANDWIDTH, m_dwMaxBandwidth) HANDLE_META_RECORD(MD_MAX_GLOBAL_BANDWIDTH,m_dwMaxGlobalBandwidth) HANDLE_META_RECORD(MD_GLOBAL_LOG_IN_UTF_8, m_fLogUTF8) HANDLE_META_RECORD(MD_CPU_LIMITS_ENABLED, m_fEnableCPUAccounting) HANDLE_META_RECORD(MD_CPU_LIMIT_LOGEVENT, m_dwCPULimitLogEventRaw) HANDLE_META_RECORD(MD_CPU_LIMIT_PRIORITY, m_dwCPULimitPriorityRaw) HANDLE_META_RECORD(MD_CPU_LIMIT_PAUSE, m_dwCPULimitPauseRaw) HANDLE_META_RECORD(MD_CPU_LIMIT_PROCSTOP, m_dwCPULimitProcStopRaw) HANDLE_META_RECORD(MD_ADMIN_ACL, m_acl) HANDLE_META_RECORD(MD_DOWNLEVEL_ADMIN_INSTANCE, m_dwDownlevelInstance); HANDLE_META_RECORD(MD_SSL_CERT_HASH, m_CertHash) HANDLE_META_RECORD(MD_SSL_CERT_STORE_NAME, m_strCertStoreName) HANDLE_META_RECORD(MD_SSL_CTL_IDENTIFIER, m_strCTLIdentifier) HANDLE_META_RECORD(MD_SSL_CTL_STORE_NAME, m_strCTLStoreName) END_PARSE_META_RECORDS if (CMetabasePath::IsMasterInstance(QueryMetaRoot())) { m_dwMaxBandwidth = m_dwMaxGlobalBandwidth; } }
/* virtual */ HRESULT CW3InstanceProps::WriteDirtyProps() /*++
Routine Description:
Write the dirty properties to the metabase
Arguments:
None
Return Value:
HRESULT
--*/ { CError err(CInstanceProps::WriteDirtyProps());
if (err.Failed()) { return err; }
BEGIN_META_WRITE() META_WRITE(MD_MAX_GLOBAL_CONNECTIONS, m_nMaxConnections) META_WRITE(MD_CONNECTION_TIMEOUT, m_nConnectionTimeOut) META_WRITE(MD_SECURE_BINDINGS, m_strlSecureBindings) META_WRITE(MD_LOG_TYPE, m_dwLogType) META_WRITE(MD_SERVER_SIZE, m_nServerSize) META_WRITE(MD_ALLOW_KEEPALIVES, m_fUseKeepAlives) META_WRITE(MD_GLOBAL_LOG_IN_UTF_8, m_fLogUTF8) if (CMetabasePath::IsMasterInstance(QueryMetaRoot())) { META_WRITE(MD_MAX_GLOBAL_BANDWIDTH,m_dwMaxBandwidth) } else { META_WRITE(MD_MAX_BANDWIDTH, m_dwMaxBandwidth) } META_WRITE(MD_CPU_LIMITS_ENABLED, m_fEnableCPUAccounting) META_WRITE(MD_CPU_LIMIT_LOGEVENT, m_dwCPULimitLogEventRaw) META_WRITE(MD_CPU_LIMIT_PRIORITY, m_dwCPULimitPriorityRaw) META_WRITE(MD_CPU_LIMIT_PAUSE, m_dwCPULimitPauseRaw) META_WRITE(MD_CPU_LIMIT_PROCSTOP, m_dwCPULimitProcStopRaw) META_WRITE(MD_ADMIN_ACL, m_acl) META_WRITE(MD_DOWNLEVEL_ADMIN_INSTANCE, m_dwDownlevelInstance); //META_WRITE(MD_SSL_CERT_HASH, m_CertHash)
//META_WRITE(MD_SSL_CERT_STORE_NAME, m_strCertStoreName)
META_WRITE(MD_SSL_CTL_IDENTIFIER, m_strCTLIdentifier) META_WRITE(MD_SSL_CTL_STORE_NAME, m_strCTLStoreName) END_META_WRITE(err);
if (err.Succeeded()) { if (m_dwMaxBandwidth == INFINITE_BANDWIDTH && m_fUninstallPSHED) { err = CallINetCfg(FALSE); } else if (m_dwMaxBandwidth != INFINITE_BANDWIDTH) { err = CallINetCfg(TRUE); } } return err; }
//
// CW3DirProps Implementation
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
CW3DirProps::CW3DirProps( IN CComAuthInfo * pAuthInfo, IN LPCTSTR lpszMDPath ) /*++
Routine Description:
WWW Directory Properties Constructor
Arguments:
CComAuthInfo * pAuthInfo : COM Authentication info LPCTSTR lpszMDPath : MD Path
Return Value:
N/A
--*/ : CChildNodeProps( pAuthInfo, lpszMDPath, WITH_INHERITANCE, FALSE // Complete information
), /**/ m_strUserName(), m_strPassword(), m_strDefaultDocument(), m_strFooter(), m_dwDirBrowsing(0L), m_fEnableFooter(FALSE), m_fDontLog(FALSE), m_fIndexed(FALSE), /**/ m_strExpiration(), m_strlCustomHeaders(), /**/ m_strlCustomErrors(), /**/ m_strAnonUserName(), m_strAnonPassword(), m_fPasswordSync(TRUE), m_fU2Installed(FALSE), m_fUseNTMapper(FALSE), m_dwAuthFlags(MD_AUTH_ANONYMOUS), m_dwSSLAccessPermissions(0L), m_strBasicDomain(), m_strRealm(), m_ipl() { //
// Fetch everything
//
m_dwMDUserType = ALL_METADATA; m_dwMDDataType = ALL_METADATA; }
/* virtual */ void CW3DirProps::ParseFields() /*++
Routine Description:
Break into fields.
Arguments:
None.
Return Value:
None.
--*/ { //
// Fetch base properties
//
CChildNodeProps::ParseFields();
BEGIN_PARSE_META_RECORDS(m_dwNumEntries, m_pbMDData) //
// VDir Page
//
HANDLE_META_RECORD(MD_VR_USERNAME, m_strUserName) HANDLE_META_RECORD(MD_VR_PASSWORD, m_strPassword) HANDLE_META_RECORD(MD_DEFAULT_LOAD_FILE, m_strDefaultDocument); HANDLE_META_RECORD(MD_FOOTER_ENABLED, m_fEnableFooter); HANDLE_META_RECORD(MD_FOOTER_DOCUMENT, m_strFooter); HANDLE_META_RECORD(MD_DIRECTORY_BROWSING, m_dwDirBrowsing); HANDLE_META_RECORD(MD_DONT_LOG, m_fDontLog); HANDLE_META_RECORD(MD_IS_CONTENT_INDEXED, m_fIndexed); //
// HTTP Page
//
HANDLE_META_RECORD(MD_HTTP_EXPIRES, m_strExpiration); HANDLE_META_RECORD(MD_HTTP_CUSTOM, m_strlCustomHeaders); //
// Custom Errors
//
HANDLE_META_RECORD(MD_CUSTOM_ERROR, m_strlCustomErrors); //
// Security page
//
HANDLE_META_RECORD(MD_AUTHORIZATION, m_dwAuthFlags); HANDLE_META_RECORD(MD_SSL_ACCESS_PERM, m_dwSSLAccessPermissions); HANDLE_META_RECORD(MD_DEFAULT_LOGON_DOMAIN, m_strBasicDomain); HANDLE_META_RECORD(MD_REALM, m_strRealm); HANDLE_META_RECORD(MD_ANONYMOUS_USER_NAME, m_strAnonUserName) HANDLE_META_RECORD(MD_ANONYMOUS_PWD, m_strAnonPassword) HANDLE_META_RECORD(MD_ANONYMOUS_USE_SUBAUTH, m_fPasswordSync) HANDLE_META_RECORD(MD_U2_AUTH, m_fU2Installed) HANDLE_META_RECORD(MD_SSL_USE_DS_MAPPER, m_fUseNTMapper); HANDLE_META_RECORD(MD_IP_SEC, m_ipl); END_PARSE_META_RECORDS }
/* virtual */ HRESULT CW3DirProps::WriteDirtyProps() /*++
Routine Description:
Write the dirty properties to the metabase
Arguments:
None
Return Value:
HRESULT
--*/ { CError err(CChildNodeProps::WriteDirtyProps());
if (err.Failed()) { return err; }
//
// CODEWORK: Consider DDX/DDV like methods which do both
// ParseFields and WriteDirtyProps in a single method. Must
// take care not to write data which should only be read, not
// written
//
BEGIN_META_WRITE() //
// VDir Page
//
META_WRITE(MD_VR_USERNAME, m_strUserName) META_WRITE(MD_VR_PASSWORD, m_strPassword) META_WRITE(MD_DEFAULT_LOAD_FILE, m_strDefaultDocument) META_WRITE(MD_FOOTER_ENABLED, m_fEnableFooter) META_WRITE(MD_FOOTER_DOCUMENT, m_strFooter) META_WRITE(MD_DIRECTORY_BROWSING, m_dwDirBrowsing) META_WRITE(MD_DONT_LOG, m_fDontLog) META_WRITE(MD_IS_CONTENT_INDEXED, m_fIndexed) //
// HTTP Page
//
META_WRITE(MD_HTTP_EXPIRES, m_strExpiration) META_WRITE(MD_HTTP_CUSTOM, m_strlCustomHeaders) //
// Custom Errors
//
META_WRITE(MD_CUSTOM_ERROR, m_strlCustomErrors) //
// Security page
//
META_WRITE(MD_AUTHORIZATION, m_dwAuthFlags) META_WRITE(MD_SSL_ACCESS_PERM, m_dwSSLAccessPermissions) META_WRITE(MD_REALM, m_strRealm) META_WRITE(MD_DEFAULT_LOGON_DOMAIN, m_strBasicDomain) META_WRITE(MD_ANONYMOUS_USER_NAME, m_strAnonUserName) META_WRITE(MD_ANONYMOUS_PWD, m_strAnonPassword) META_WRITE(MD_ANONYMOUS_USE_SUBAUTH, m_fPasswordSync) META_WRITE(MD_SSL_USE_DS_MAPPER, m_fUseNTMapper) META_WRITE(MD_IP_SEC, m_ipl) END_META_WRITE(err);
return err; }
//
// CIISFilter Implementation
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
CIISFilter::CIISFilter() /*++
Routine Description:
Filter contructor for a new filter
Arguments:
None
Return Value:
N/A
--*/ : CObjectPlus(), m_strName(),
//
// Default Values
//
m_strExecutable(), m_nPriority(FLTR_PR_INVALID), m_nOrder(-1), m_dwState(MD_FILTER_STATE_UNLOADED), m_dwFlags(0L), m_hrResult(S_OK), m_dwWin32Error(ERROR_SUCCESS), m_fEnabled(TRUE), m_fDirty(FALSE), m_fFlaggedForDeletion(FALSE) { }
CIISFilter::CIISFilter( IN CMetaKey * pKey, IN LPCTSTR lpszName ) /*++
Routine Description:
Fully defined constructor
Arguments:
CMetaKey * pKey : Open key to read from LPCTSTR lpszName : Name of the filter
Return Value:
N/A
--*/ : m_strName(lpszName), //
// Default Values
//
m_strExecutable(), m_nPriority(FLTR_PR_INVALID), m_nOrder(-1), m_dwState(MD_FILTER_STATE_UNLOADED), m_dwFlags(0L), m_hrResult(S_OK), m_dwWin32Error(ERROR_SUCCESS), m_fEnabled(TRUE), m_fDirty(FALSE), m_fFlaggedForDeletion(FALSE) { ASSERT(pKey != NULL);
m_hrResult = pKey->QueryValue( MD_FILTER_IMAGE_PATH, m_strExecutable, NULL, m_strName );
pKey->QueryValue(MD_FILTER_ENABLED, m_fEnabled, NULL, m_strName); pKey->QueryValue(MD_FILTER_STATE, m_dwState, NULL, m_strName); pKey->QueryValue(MD_FILTER_FLAGS, m_dwFlags, NULL, m_strName); if (m_dwFlags & SF_NOTIFY_ORDER_HIGH) { m_nPriority = FLTR_PR_HIGH; } else if (m_dwFlags & SF_NOTIFY_ORDER_MEDIUM) { m_nPriority = FLTR_PR_MEDIUM; } else if (m_dwFlags & SF_NOTIFY_ORDER_LOW) { m_nPriority = FLTR_PR_LOW; } else { m_nPriority = FLTR_PR_INVALID; } }
CIISFilter::CIISFilter( IN const CIISFilter & flt ) /*++
Routine Description:
Copy Constructor
Arguments:
const CIISFilter & flt : Source filter object
Return Value:
N/A
--*/ : m_strName(flt.m_strName), m_strExecutable(flt.m_strExecutable), m_nPriority(flt.m_nPriority), m_nOrder(flt.m_nOrder), m_hrResult(flt.m_hrResult), m_dwState(flt.m_dwState), m_dwFlags(flt.m_dwFlags), m_dwWin32Error(flt.m_dwWin32Error), m_fEnabled(flt.m_fEnabled), m_fDirty(FALSE), m_fFlaggedForDeletion(FALSE) { }
HRESULT CIISFilter::Write( IN CMetaKey * pKey ) /*++
Routine Description:
Write the current value to the metabase
Arguments:
CMetaKey * pKey : Open key
Return Value:
HRESULT
--*/ { ASSERT(pKey != NULL);
CError err;
CString strKey(_T("IIsFilter")); err = pKey->SetValue(MD_KEY_TYPE, strKey, NULL, QueryName());
if (err.Succeeded()) { err = pKey->SetValue( MD_FILTER_IMAGE_PATH, m_strExecutable, NULL, QueryName() ); }
return err; }
int CIISFilter::OrderByPriority( IN const CObjectPlus * pobAccess ) const /*++
Routine Description:
Compare two filters against each other, and sort on priority first, and order secondarily.
Arguments:
const CObjectPlus * pobAccess : This really refers to another CIISFilter to be compared to.
Return Value:
Sort (+1, 0, -1) return value
--*/ { const CIISFilter * pob = (CIISFilter *)pobAccess;
if (pob->m_nPriority != m_nPriority) { return pob->m_nPriority - m_nPriority; }
//
// Sort by order in reverse order
//
return m_nOrder - pob->m_nOrder; }
//
// Static initialization
//
const LPCTSTR CIISFilterList::s_lpszSep = _T(",");
//
// CIISFilterList implementation
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
CIISFilterList::CIISFilterList( IN CComAuthInfo * pAuthInfo, IN LPCTSTR lpszMetaPath ) /*++
Routine Description:
Constructor for filter list
Arguments:
LPCTSTR lpszServerName : Server name DWORD dwInstance : Instance number (could be MASTER_INSTANCE)
Return Value:
N/A
--*/ : CMetaKey( pAuthInfo, CMetabasePath(FALSE, lpszMetaPath, g_cszFilters), METADATA_PERMISSION_READ ), m_hrResult(S_OK), m_strFilterOrder(), m_fFiltersLoaded(FALSE) { m_hrResult = CMetaKey::QueryResult();
if (SUCCEEDED(m_hrResult)) { m_hrResult = QueryValue(MD_FILTER_LOAD_ORDER, m_strFilterOrder); } if ( m_hrResult == CError::HResult(ERROR_PATH_NOT_FOUND) || m_hrResult == MD_ERROR_DATA_NOT_FOUND ) { //
// Harmless
//
m_hrResult = S_OK; }
if (IsOpen()) { Close(); } }
HRESULT CIISFilterList::LoadAllFilters() /*++
Routine Description:
Loop through the filter order string, and load information about each filter in turn.
Arguments:
None.
Return Value:
HRESULT. The first error stops filter loading.
--*/ { ASSERT(SUCCEEDED(m_hrResult));
if (m_fFiltersLoaded) { //
// Already done
//
return S_OK; }
int cItems = 0; CError err(ReOpen(METADATA_PERMISSION_READ));
if (err.Failed()) { return err; }
try { CString strSrc(m_strFilterOrder); LPTSTR lp = strSrc.GetBuffer(0); while (isspace(*lp) || *lp == (TCHAR)s_lpszSep) lp++; lp = _tcstok(lp, s_lpszSep);
int nOrder = 0;
while (lp) { CString str(lp); str.TrimLeft(); str.TrimRight();
TRACEEOLID("Adding filter: " << str);
CIISFilter * pFilter = new CIISFilter(this, str); err = pFilter->QueryResult();
if (err.Failed()) { break; }
pFilter->m_nOrder = nOrder++; m_oblFilters.AddTail(pFilter);
lp = _tcstok(NULL, s_lpszSep); ++cItems; }
//
// Sort filters list
//
m_oblFilters.Sort( (CObjectPlus::PCOBJPLUS_ORDER_FUNC) &CIISFilter::OrderByPriority ); } catch(CMemoryException * e) { e->Delete(); err = ERROR_NOT_ENOUGH_MEMORY; }
m_fFiltersLoaded = err.Succeeded();
if (IsOpen()) { Close(); }
return err; }
HRESULT CIISFilterList::WriteIfDirty() /*++
Routine Description:
Write all the changes in the filters list to the metabase
Arguments:
None.
Return Value:
HRESULT
--*/ { CError err;
CString strNewOrder; VERIFY(BuildFilterOrderString(strNewOrder));
//
// Check to see if this new list is different
//
if (!strNewOrder.CompareNoCase(m_strFilterOrder) && !HasDirtyFilter()) { //
// The priority list hasn't changed, and no filter is marked
// as dirty, so all done.
//
return err; }
//
// It's dirty -- save it
//
do { err = ReOpen(METADATA_PERMISSION_WRITE);
if (err.Failed()) { if (err.Win32Error() == ERROR_PATH_NOT_FOUND) { //
// Path didn't exist yet, create it and reopen
// it.
//
err = CreatePathFromFailedOpen();
if (err.Succeeded()) { err = ReOpen(METADATA_PERMISSION_WRITE); } }
if (err.Failed()) { break; } }
//
// Delete deleted filters
//
POSITION pos1, pos2;
for (pos1 = m_oblFilters.GetHeadPosition(); (pos2 = pos1) != NULL; ) { CIISFilter * pFilter = (CIISFilter *)m_oblFilters.GetNext(pos1); ASSERT(pFilter != NULL);
if (pFilter->IsFlaggedForDeletion()) { TRACEEOLID("Deleting filter " << pFilter->QueryName()); err = DeleteKey(pFilter->QueryName());
if (err.Failed()) { break; }
m_oblFilters.RemoveAt(pos2); } }
if (err.Failed()) { break; }
//
// Two passes are necessary, because the filter may
// have been re-added after it was deleted from the
// list as new entry. This could be somewhat improved
//
ResetEnumerator();
while(MoreFilters()) { CIISFilter * pFilter = GetNextFilter(); ASSERT(pFilter != NULL);
if (pFilter->IsDirty()) { TRACEEOLID("Writing filter " << pFilter->QueryName()); err = pFilter->Write(this);
if (err.Failed()) { break; }
pFilter->Dirty(FALSE); } }
if (err.Failed()) { break; }
//
// Write the new filter load order
//
err = SetValue(MD_FILTER_LOAD_ORDER, strNewOrder);
if (err.Failed()) { break; }
CString strKey(_T("IIsFilters")); err = SetValue(MD_KEY_TYPE, strKey); err = SetValue(MD_FILTER_LOAD_ORDER, strNewOrder);
m_strFilterOrder = strNewOrder; } while(FALSE);
if (IsOpen()) { Close(); }
return err; }
POSITION CIISFilterList::GetFilterPositionByIndex( IN int nSel ) /*++
Routine Description:
Return the position of a filter object by index, skipping filters marked for deletion.
Arguments:
int nSel - 0 based index into the list
Return Value:
The POSITION into the filters ObList of the filter at the index specified, or NULL if the filter is not found.
--*/ { int nIndex = -1; CIISFilter * pFilter; POSITION pos, posReturn = NULL;
pos = m_oblFilters.GetHeadPosition();
while(pos && nIndex < nSel) { posReturn = pos; pFilter = (CIISFilter *)m_oblFilters.GetNext(pos);
//
// Skipping deleted filters
//
if (!pFilter->IsFlaggedForDeletion()) { ++nIndex; } } return posReturn; }
BOOL CIISFilterList::ExchangePositions( IN int nSel1, IN int nSel2, OUT CIISFilter *& p1, OUT CIISFilter *& p2 ) /*++
Routine Description:
Exchange the positions of two filters in the list
Arguments:
int nSel1 : Item 1 int nSel2 : Item 2 CIISFilter *& p1 : Returns the item moved to position 1 CIISFilter *& p2 : Returns the item moved to position 2
Return Value:
TRUE for success, FALSE for failure.
--*/ { ASSERT(SUCCEEDED(m_hrResult));
//
// Fetch filters at the two positions (deleted filters are
// skipped in the index count)
//
POSITION pos1 = GetFilterPositionByIndex(nSel1); POSITION pos2 = GetFilterPositionByIndex(nSel2); p1 = pos2 ? (CIISFilter *)m_oblFilters.GetAt(pos2) : NULL; p2 = pos1 ? (CIISFilter *)m_oblFilters.GetAt(pos1) : NULL;
if (!p1 || !p2) { TRACEEOLID("Invalid internal state -- filter exchange impossible"); ASSERT(FALSE);
return FALSE; }
TRACEEOLID("Filter (1) name is " << p1->m_strName); TRACEEOLID("Filter (2) name is " << p2->m_strName);
//
// Exchange
//
m_oblFilters.SetAt(pos1, p1); m_oblFilters.SetAt(pos2, p2);
//
// Success
//
return TRUE; }
LPCTSTR CIISFilterList::BuildFilterOrderString( OUT CString & strFilterOrder ) /*++
Routine Description:
Convert the oblist of filters to a single filter order string fit to be stuffed into the metabase
Arguments:
CString & strFilterOrder : Output to receive the order string
Return Value:
A pointer to the new filter order string.
--*/ { BOOL fFirst = TRUE; POSITION pos = m_oblFilters.GetHeadPosition();
strFilterOrder.Empty();
while(pos) { CIISFilter * pFlt = (CIISFilter *)m_oblFilters.GetNext(pos);
if (!pFlt->IsFlaggedForDeletion()) { if (!fFirst) { strFilterOrder += s_lpszSep; } else { fFirst = FALSE; }
strFilterOrder += pFlt->m_strName; } }
return (LPCTSTR)strFilterOrder; }
BOOL CIISFilterList::HasDirtyFilter() const /*++
Routine Description:
Go through the list of filters, and return TRUE if any filter in the list is dirty or flagged for deletion
Arguments:
None
Return Value:
TRUE if any filter is dirty or flagged for deletion.
--*/ { ASSERT(SUCCEEDED(m_hrResult));
POSITION pos = m_oblFilters.GetHeadPosition();
while(pos) { CIISFilter * pFilter = (CIISFilter *)m_oblFilters.GetNext(pos);
if (pFilter->IsFlaggedForDeletion() || pFilter->IsDirty()) { return TRUE; } }
return FALSE; }
//
// CW3Sheet implementation
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
CW3Sheet::CW3Sheet( IN CComAuthInfo * pAuthInfo, IN LPCTSTR lpszMetaPath, IN DWORD dwAttributes, IN CWnd * pParentWnd, OPTIONAL IN LPARAM lParam, OPTIONAL IN LONG_PTR handle, OPTIONAL IN UINT iSelectPage ) /*++
Routine Description:
WWW Property sheet constructor
Arguments:
CComAuthInfo * pAuthInfo : Authentication information LPCTSTR lpszMetPath : Metabase path DWORD dwAttributes : File attributes CWnd * pParentWnd : Optional parent window LPARAM lParam : MMC Console parameter LONG_PTR handle : MMC Console handle UINT iSelectPage : Initial page to be selected
Return Value:
N/A
--*/ : CInetPropertySheet( pAuthInfo, lpszMetaPath, pParentWnd, lParam, handle, iSelectPage ), m_ppropInst(NULL), m_ppropDir(NULL), m_fNew(FALSE), m_dwAttributes(dwAttributes), m_fCompatMode(FALSE) { }
CW3Sheet::~CW3Sheet() /*++
Routine Description:
Sheet destructor
Arguments:
N/A
Return Value:
N/A
--*/ { FreeConfigurationParameters(); }
HRESULT CW3Sheet::SetKeyType() { CError err;
CIISObject * pNode = (CIISObject *)GetParameter(); ASSERT(pNode != NULL); if (pNode == NULL) { return E_FAIL; } CMetaKey mk(QueryAuthInfo(), m_ppropDir->QueryMetaRoot(), METADATA_PERMISSION_WRITE); err = mk.QueryResult(); if (err.Succeeded()) { err = mk.SetValue(MD_KEY_TYPE, CString(pNode->GetKeyType(m_ppropDir->QueryMetaRoot()))); } else if (err.Win32Error() == ERROR_PATH_NOT_FOUND) { err.Reset(); } return err; }
HRESULT CW3Sheet::SetSheetType(int fSheetType) { m_fSheetType = fSheetType; return S_OK; }
void CW3Sheet::WinHelp( IN DWORD dwData, IN UINT nCmd ) /*++
Routine Description:
WWW Property sheet help handler
Arguments:
DWORD dwData : WinHelp data (dialog ID) UINT nCmd : WinHelp command
Return Value:
None
Notes:
Replace the dialog ID if this is the directory tab. We have different help depending on virtual directory, home, file, directory.
--*/ { if (dwData == HIDD_DIRECTORY_PROPERTIES) { if (m_fSheetType == SHEET_TYPE_FILE) { dwData = HIDD_FS_FILE_PROPERTIES; } else if (m_fSheetType == SHEET_TYPE_DIR) { dwData = HIDD_FS_DIRECTORY_PROPERTIES; } else if (m_fSheetType == SHEET_TYPE_VDIR) { dwData = HIDD_DIRECTORY_PROPERTIES; } else if (m_fSheetType == SHEET_TYPE_SERVER) { dwData = HIDD_HOME_DIRECTORY_PROPERTIES; } else if (m_fSheetType == SHEET_TYPE_SITE) { dwData = HIDD_HOME_DIRECTORY_PROPERTIES; } else { ASSERT(m_ppropDir != NULL); if (!::lstrcmpi(m_ppropDir->m_strAlias, g_cszRoot)) { //
// It's a home virtual directory -- change the ID
//
dwData = HIDD_HOME_DIRECTORY_PROPERTIES; } }
}
CInetPropertySheet::WinHelp(dwData, nCmd); }
/* virtual */ HRESULT CW3Sheet::LoadConfigurationParameters() /*++
Routine Description:
Load configuration parameters information
Arguments:
None
Return Value:
HRESULT
--*/ { //
// Load base properties
//
CError err(CInetPropertySheet::LoadConfigurationParameters());
if (err.Failed()) { return err; }
if (m_ppropInst == NULL) { //
// First call -- load values
//
ASSERT(m_ppropDir == NULL);
m_ppropInst = new CW3InstanceProps(QueryAuthInfo(), QueryInstancePath()); m_ppropDir = new CW3DirProps(QueryAuthInfo(), QueryDirectoryPath());
if (!m_ppropInst || !m_ppropDir) { TRACEEOLID("LoadConfigurationParameters: OOM"); SAFE_DELETE(m_ppropDir); SAFE_DELETE(m_ppropInst);
err = ERROR_NOT_ENOUGH_MEMORY; return err; }
err = m_ppropInst->LoadData();
if (err.Succeeded()) { err = m_ppropDir->LoadData(); if (err.Succeeded() && QueryMajorVersion() >= 6) { CMetaKey mk(QueryAuthInfo(), QueryServicePath(), METADATA_PERMISSION_READ); err = mk.QueryResult(); if (err.Succeeded()) { err = mk.QueryValue(MD_GLOBAL_STANDARD_APP_MODE_ENABLED, m_fCompatMode); } } else if (err.Succeeded()) { // We will enable this for IIS5.1 and lower
m_fCompatMode = TRUE; }
} }
return err; }
/* virtual */ void CW3Sheet::FreeConfigurationParameters() /*++
Routine Description:
Clean up configuration data
Arguments:
None
Return Value:
None
--*/ { //
// Base class
//
CInetPropertySheet::FreeConfigurationParameters();
ASSERT(m_ppropInst != NULL); ASSERT(m_ppropDir != NULL);
SAFE_DELETE(m_ppropInst); SAFE_DELETE(m_ppropDir); }
DWORD IsSSLEnabledOnServer( IN CComAuthInfo * pAuthInfo, OUT BOOL & fInstalled, OUT BOOL & fEnabled ) /*++
Routine Description:
Determine if SSL is installed on the server.
Arguments:
LPCTSTR lpszServer : Server name BOOL & fInstalled : Returns TRUE if SSL is installed BOOL & fEnabled : Returns TRUE if SSL is enabled
Return Value:
Error return code.
--*/ { /*
LPW3_CONFIG_INFO lp = NULL; CString str; DWORD err = ::W3GetAdminInformation((LPTSTR)lpszServer, &lp); if (err != ERROR_SUCCESS) { TRACEEOLID("Failed to determine if SSL is installed");
return err; }
fInstalled = (lp->dwEncCaps & ENC_CAPS_NOT_INSTALLED) == 0; fEnabled = (lp->dwEncCaps & ENC_CAPS_DISABLED) == 0;
NETAPIBUFFERFREE(lp);
*/
//
// Above doesn't work for Beta I -- hack to assume true.
//
fInstalled = fEnabled = TRUE;
return ERROR_SUCCESS; }
//
// Message Map
//
BEGIN_MESSAGE_MAP(CW3Sheet, CInetPropertySheet) //{{AFX_MSG_MAP(CInetPropertySheet)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
HRESULT CW3Sheet::EnumAppPools(CMapStringToString& pools) { CError err; CIISMBNode * p = (CIISMBNode *)GetParameter(); ASSERT(p != NULL); CIISMachine * pMachine = p->GetOwner(); ASSERT(pMachine != NULL); IConsoleNameSpace2 * pConsole = (IConsoleNameSpace2 *)pMachine->GetConsoleNameSpace(); ASSERT(pConsole != NULL); // Get machine handle from pOwner
// then find handle to app pools container
// and use cookie from this node to enumerate pools
HSCOPEITEM hChild = NULL, hCurrent; LONG_PTR cookie; CIISMBNode * pNode = NULL; err = pConsole->GetChildItem(pMachine->QueryScopeItem(), &hChild, &cookie); while (err.Succeeded() && hChild != NULL) { pNode = (CIISMBNode *)cookie; ASSERT(pNode != NULL); if (lstrcmpi(pNode->GetNodeName(), SZ_MBN_APP_POOLS) == 0) { break; } hCurrent = hChild; err = pConsole->GetNextItem(hCurrent, &hChild, &cookie); } CAppPoolsContainer * pCont = (CAppPoolsContainer *)pNode; // expand container to enumerate pools
err = pConsole->Expand(pCont->QueryScopeItem()); // MMC returns Incorrect function error (0x80070001) instead of S_FALSE
// if (err == S_FALSE)
// {
// already expanded
err.Reset(); // }
if (err.Succeeded()) { pConsole->GetChildItem(pCont->QueryScopeItem(), &hChild, &cookie); CAppPoolNode * pPool; while (err.Succeeded() && hChild != NULL) { pPool = (CAppPoolNode *)cookie; ASSERT(pPool != NULL); pools.SetAt(pPool->QueryDisplayName(), pPool->QueryNodeName()); hCurrent = hChild; err = pConsole->GetNextItem(hCurrent, &hChild, &cookie); } }
err.Reset();
return err; }
HRESULT CW3Sheet::QueryDefaultPoolId(CString& id) { CError err; CIISMBNode * p = (CIISMBNode *)GetParameter(); ASSERT(p != NULL); CIISMachine * pMachine = p->GetOwner(); ASSERT(pMachine != NULL); IConsoleNameSpace2 * pConsole = (IConsoleNameSpace2 *)pMachine->GetConsoleNameSpace(); ASSERT(pConsole != NULL); // Get machine handle from pOwner
// then find handle to app pools container
// and use cookie from this node to enumerate pools
HSCOPEITEM hChild = NULL, hCurrent; LONG_PTR cookie; CIISMBNode * pNode = NULL; err = pConsole->GetChildItem(pMachine->QueryScopeItem(), &hChild, &cookie); while (err.Succeeded() && hChild != NULL) { pNode = (CIISMBNode *)cookie; ASSERT(pNode != NULL); if (lstrcmpi(pNode->GetNodeName(), SZ_MBN_APP_POOLS) == 0) { break; } hCurrent = hChild; err = pConsole->GetNextItem(hCurrent, &hChild, &cookie); } CAppPoolsContainer * pCont = (CAppPoolsContainer *)pNode; ASSERT(pCont != NULL); return pCont->QueryDefaultPoolId(id); }
|