void cleanup() { if ( pElemProp != NULL ) { pElemProp->Release(); pElemProp = NULL; } if ( pElemProps != NULL ) { pElemProps->Release(); pElemProps = NULL; } if ( pElem != NULL ) { pElem->Release(); pElem = NULL; } if ( pElemColl != NULL ) { pElemColl->Release(); pElemColl = NULL; } if ( pParentElem != NULL ) { pParentElem->Release(); pParentElem = NULL; } if ( pMgr != NULL ) { pMgr->Release(); pMgr = NULL; } SysFreeString( bstrConfigCommitPath ); SysFreeString( bstrSectionName ); SysFreeString( bstrPropertyName ); CoUninitialize(); }
HRESULT MODSECURITY_STORED_CONTEXT::Initialize( IHttpContext * pW3Context, IAppHostConfigException ** ppException ) { HRESULT hr = S_OK; IAppHostAdminManager *pAdminManager = NULL; IAppHostElement *pSessionTrackingElement = NULL; IAppHostPropertyException *pPropertyException = NULL; PCWSTR pszConfigPath = pW3Context->GetMetadata()->GetMetaPath(); BSTR bstrUrlPath = SysAllocString( pszConfigPath ); pAdminManager = g_pHttpServer->GetAdminManager(); if ( ( FAILED( hr ) ) || ( pAdminManager == NULL ) ) { hr = E_UNEXPECTED; goto Failure; } // Get a handle to the section: hr = pAdminManager->GetAdminSection( MODSECURITY_SECTION, bstrUrlPath, &pSessionTrackingElement ); if ( FAILED( hr ) ) { goto Failure; } if ( pSessionTrackingElement == NULL ) { hr = E_UNEXPECTED; goto Failure; } // Get the property object for the 'enabled' attribute: hr = GetBooleanPropertyValue( pSessionTrackingElement, MODSECURITY_SECTION_ENABLED, &pPropertyException, &m_bIsEnabled); if ( FAILED( hr ) ) { goto Failure; } // If there is a config failure, we cannot continue execution: if ( pPropertyException != NULL ) { ppException = ( IAppHostConfigException** ) &pPropertyException; goto Failure; } if ( m_bIsEnabled == FALSE ) { // There is no point in reading any more of the config associated with the session // tracking section, since this feature is not enabled for the current URL goto Failure; } // Get the property object for the 'configfile' attribute: hr = GetStringPropertyValue( pSessionTrackingElement, MODSECURITY_SECTION_CONFIGFILE, &pPropertyException, &m_pszPath); if ( FAILED( hr ) ) { goto Failure; } // If there is a config failure, we cannot continue execution: if ( pPropertyException != NULL ) { ppException = ( IAppHostConfigException** ) &pPropertyException; goto Failure; } Failure: SysFreeString( bstrUrlPath ); return hr; }
REQUEST_NOTIFICATION_STATUS OnSendResponse( IN IHttpContext * pHttpContext, IN ISendResponseProvider * pProvider ) { UNREFERENCED_PARAMETER( pProvider ); pMgr = NULL; pParentElem = NULL; pElemColl = NULL; pElem = NULL; pElemProps = NULL; pElemProp = NULL; hr = S_OK; bstrConfigCommitPath = SysAllocString( L"MACHINE/WEBROOT/APPHOST" ); bstrSectionName = SysAllocString( L"system.webServer/stripHeaders" ); bstrPropertyName = SysAllocString( L"name" ); dwElementCount = 0; vtPropertyName.vt = VT_BSTR; vtPropertyName.bstrVal = bstrPropertyName; // Initialize hr = CoInitializeEx( NULL, COINIT_MULTITHREADED ); if ( FAILED( hr ) ) { // Set the error status. pProvider->SetErrorStatus( hr ); // cleanup cleanup(); // End additional processing. return RQ_NOTIFICATION_FINISH_REQUEST; } // Create hr = CoCreateInstance( __uuidof( AppHostAdminManager ), NULL, CLSCTX_INPROC_SERVER, __uuidof( IAppHostAdminManager ), (void**) &pMgr ); if( FAILED( hr ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Get the admin section hr = pMgr->GetAdminSection( bstrSectionName, bstrConfigCommitPath, &pParentElem ); if ( FAILED( hr ) || ( &pParentElem == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Get the site collection hr = pParentElem->get_Collection( &pElemColl ); if ( FAILED ( hr ) || ( &pElemColl == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Get the elements hr = pElemColl->get_Count( &dwElementCount ); for ( USHORT i = 0; i < dwElementCount; i++ ) { VARIANT vtItemIndex; vtItemIndex.vt = VT_I2; vtItemIndex.iVal = i; // Add a new section group hr = pElemColl->get_Item( vtItemIndex, &pElem ); if ( FAILED( hr ) || ( &pElem == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Get the child elements hr = pElem->get_Properties( &pElemProps ); if ( FAILED( hr ) || ( &pElemProps == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } hr = pElemProps->get_Item( vtPropertyName, &pElemProp ); if ( FAILED( hr ) || ( pElemProp == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } hr = pElemProp->get_Value( &vtValue ); if ( FAILED( hr ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Retrieve a pointer to the response. IHttpResponse * pHttpResponse = pHttpContext->GetResponse(); // Test for an error. if ( pHttpResponse != NULL ) { // convert bstr to string in order to delete header _bstr_t header( vtValue.bstrVal ); // delete header hr = pHttpResponse->DeleteHeader( (char *)header ); // Test for an error. if ( FAILED( hr ) ) { // Set the error status. pProvider->SetErrorStatus( hr ); // cleanup cleanup(); // End additional processing. return RQ_NOTIFICATION_FINISH_REQUEST; } } // loop_cleanup if ( pElem != NULL ) { pElem->Release(); pElem = NULL; } } cleanup(); // Return processing to the pipeline. return RQ_NOTIFICATION_CONTINUE; }
HRESULT GetSharedConfigEnabled( BOOL * pfIsSharedConfig ) /*++ Routine Description: Search the configuration for the shared configuration property. Arguments: pfIsSharedConfig - true if shared configuration is enabled Return Value: HRESULT --*/ { HRESULT hr = S_OK; IAppHostAdminManager *pAdminManager = NULL; BSTR bstrSectionName = NULL; BSTR bstrConfigPath = NULL; IAppHostElement * pConfigRedirSection = NULL; bstrSectionName = SysAllocString( L"configurationRedirection" ); if ( bstrSectionName == NULL ) { hr = E_OUTOFMEMORY; DBGERROR_HR(hr); goto exit; } bstrConfigPath = SysAllocString( L"MACHINE/REDIRECTION" ); if ( bstrConfigPath == NULL ) { hr = E_OUTOFMEMORY; DBGERROR_HR(hr); goto exit; } hr = CoCreateInstance( CLSID_AppHostAdminManager, NULL, CLSCTX_INPROC_SERVER, IID_IAppHostAdminManager, (VOID **)&pAdminManager ); if( FAILED(hr) ) { DBGERROR_HR(hr); goto exit; } hr = pAdminManager->GetAdminSection( bstrSectionName, bstrConfigPath, &pConfigRedirSection ); if( FAILED(hr) ) { DBGERROR_HR(hr); goto exit; } hr = GetElementBoolProperty( pConfigRedirSection, L"enabled", pfIsSharedConfig ); if ( FAILED( hr ) ) { DBGERROR_HR(hr); goto exit; } pConfigRedirSection->Release(); pConfigRedirSection = NULL; exit: // // dump config exception to setup log file (if available) // if ( pConfigRedirSection != NULL ) { pConfigRedirSection->Release(); } if ( pAdminManager != NULL ) { pAdminManager->Release(); } if ( bstrConfigPath != NULL ) { SysFreeString( bstrConfigPath ); } if ( bstrSectionName != NULL ) { SysFreeString( bstrSectionName ); } return hr; }
HRESULT ScaWebSearch7( __in SCA_WEB7* psw, __deref_out_z_opt LPWSTR* pswWeb, __out_opt BOOL* pfFound ) { HRESULT hr = S_OK; BOOL fInitializedCom = FALSE; BSTR bstrSites = NULL; BSTR bstrAppHostRoot = NULL; IAppHostAdminManager *pAdminMgr = NULL; IAppHostElement *pSites = NULL; IAppHostElementCollection *pCollection = NULL; IAppHostElement *pSite = NULL; if (NULL != pswWeb) { ReleaseNullStr(*pswWeb); } if (NULL != pfFound) { *pfFound = FALSE; } hr = ::CoInitialize(NULL); ExitOnFailure(hr, "Failed to initialize COM"); fInitializedCom = TRUE; hr = CoCreateInstance(__uuidof(AppHostAdminManager), NULL, CLSCTX_INPROC_SERVER, __uuidof(IAppHostAdminManager), reinterpret_cast<void**> (&pAdminMgr)); if (REGDB_E_CLASSNOTREG == hr) { WcaLog(LOGMSG_VERBOSE, "AppHostAdminManager was not registered, cannot find site."); hr = S_OK; ExitFunction(); } ExitOnFailure(hr, "Failed to CoCreate IAppHostAdminManager"); bstrSites = ::SysAllocString(IIS_CONFIG_SITES_SECTION); ExitOnNull(bstrSites, hr, E_OUTOFMEMORY, "Failed to allocate sites string."); bstrAppHostRoot = ::SysAllocString(IIS_CONFIG_APPHOST_ROOT); ExitOnNull(bstrAppHostRoot, hr, E_OUTOFMEMORY, "Failed to allocate host root string."); hr = pAdminMgr->GetAdminSection(bstrSites, bstrAppHostRoot, &pSites); ExitOnFailure(hr, "Failed get sites section"); ExitOnNull(pSites, hr, ERROR_FILE_NOT_FOUND, "Failed get sites section object"); hr = pSites->get_Collection(&pCollection); ExitOnFailure(hr, "Failed get sites collection"); // not explicitly doing a Description search if (-1 != psw->iSiteId) { if (MSI_NULL_INTEGER == psw->iSiteId) { // Enumerate sites & determine if the binding matches hr = Iis7EnumAppHostElements(pCollection, EnumSiteCompareBinding, psw, &pSite, NULL); ExitOnFailure(hr, "Failed locate site by ID"); } else { // Find a site with ID matches hr = Iis7FindAppHostElementInteger(pCollection, IIS_CONFIG_SITE, IIS_CONFIG_ID, psw->iSiteId, &pSite, NULL); ExitOnFailure(hr, "Failed locate site by ID"); } } if (NULL == pSite) { // Find a site with Name that matches hr = Iis7FindAppHostElementString(pCollection, IIS_CONFIG_SITE, IIS_CONFIG_NAME, psw->wzDescription, &pSite, NULL); ExitOnFailure(hr, "Failed locate site by ID"); } if (NULL != pSite) { if (NULL != pfFound) { *pfFound = TRUE; } if (NULL != pswWeb) { // We found a site, return its description hr = Iis7GetPropertyString(pSite, IIS_CONFIG_NAME, pswWeb); ExitOnFailure(hr, "Failed get site name"); } } LExit: ReleaseNullObject(pAdminMgr); ReleaseNullObject(pSites); ReleaseNullObject(pCollection); ReleaseNullObject(pSite); ReleaseBSTR(bstrAppHostRoot); ReleaseBSTR(bstrSites); if (fInitializedCom) { ::CoUninitialize(); } return hr; }