|
Packit Service |
384592 |
/*
|
|
Packit Service |
384592 |
* ModSecurity for Apache 2.x, http://www.modsecurity.org/
|
|
Packit Service |
384592 |
* Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/)
|
|
Packit Service |
384592 |
*
|
|
Packit Service |
384592 |
* You may not use this file except in compliance with
|
|
Packit Service |
384592 |
* the License. You may obtain a copy of the License at
|
|
Packit Service |
384592 |
*
|
|
Packit Service |
384592 |
* http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit Service |
384592 |
*
|
|
Packit Service |
384592 |
* If any of the files related to licensing are missing or if you have any
|
|
Packit Service |
384592 |
* other questions related to licensing please contact Trustwave Holdings, Inc.
|
|
Packit Service |
384592 |
* directly using the email address security@modsecurity.org.
|
|
Packit Service |
384592 |
*/
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
#define WIN32_LEAN_AND_MEAN
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
#undef inline
|
|
Packit Service |
384592 |
#define inline inline
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// IIS7 Server API header file
|
|
Packit Service |
384592 |
#include "httpserv.h"
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Project header files
|
|
Packit Service |
384592 |
#include "mymodule.h"
|
|
Packit Service |
384592 |
#include "mymodulefactory.h"
|
|
Packit Service |
384592 |
#include "moduleconfig.h"
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
HRESULT
|
|
Packit Service |
384592 |
MODSECURITY_STORED_CONTEXT::Initialize(
|
|
Packit Service |
384592 |
IHttpContext * pW3Context,
|
|
Packit Service |
384592 |
IAppHostConfigException ** ppException
|
|
Packit Service |
384592 |
)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
HRESULT hr = S_OK;
|
|
Packit Service |
384592 |
IAppHostAdminManager *pAdminManager = NULL;
|
|
Packit Service |
384592 |
IAppHostElement *pSessionTrackingElement = NULL;
|
|
Packit Service |
384592 |
IAppHostPropertyException *pPropertyException = NULL;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
PCWSTR pszConfigPath = pW3Context->GetMetadata()->GetMetaPath();
|
|
Packit Service |
384592 |
BSTR bstrUrlPath = SysAllocString( pszConfigPath );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
pAdminManager = g_pHttpServer->GetAdminManager();
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( ( FAILED( hr ) ) || ( pAdminManager == NULL ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
hr = E_UNEXPECTED;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Get a handle to the section:
|
|
Packit Service |
384592 |
hr = pAdminManager->GetAdminSection(
|
|
Packit Service |
384592 |
MODSECURITY_SECTION,
|
|
Packit Service |
384592 |
bstrUrlPath,
|
|
Packit Service |
384592 |
&pSessionTrackingElement );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( pSessionTrackingElement == NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
hr = E_UNEXPECTED;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Get the property object for the 'enabled' attribute:
|
|
Packit Service |
384592 |
hr = GetBooleanPropertyValue(
|
|
Packit Service |
384592 |
pSessionTrackingElement,
|
|
Packit Service |
384592 |
MODSECURITY_SECTION_ENABLED,
|
|
Packit Service |
384592 |
&pPropertyException,
|
|
Packit Service |
384592 |
&m_bIsEnabled);
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// If there is a config failure, we cannot continue execution:
|
|
Packit Service |
384592 |
if ( pPropertyException != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
ppException = ( IAppHostConfigException** ) &pPropertyException;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( m_bIsEnabled == FALSE )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
// There is no point in reading any more of the config associated with the session
|
|
Packit Service |
384592 |
// tracking section, since this feature is not enabled for the current URL
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Get the property object for the 'configfile' attribute:
|
|
Packit Service |
384592 |
hr = GetStringPropertyValue(
|
|
Packit Service |
384592 |
pSessionTrackingElement,
|
|
Packit Service |
384592 |
MODSECURITY_SECTION_CONFIGFILE,
|
|
Packit Service |
384592 |
&pPropertyException,
|
|
Packit Service |
384592 |
&m_pszPath);
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// If there is a config failure, we cannot continue execution:
|
|
Packit Service |
384592 |
if ( pPropertyException != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
ppException = ( IAppHostConfigException** ) &pPropertyException;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
Failure:
|
|
Packit Service |
384592 |
SysFreeString( bstrUrlPath );
|
|
Packit Service |
384592 |
return hr;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
HRESULT
|
|
Packit Service |
384592 |
MODSECURITY_STORED_CONTEXT::GetBooleanPropertyValue(
|
|
Packit Service |
384592 |
IAppHostElement* pElement,
|
|
Packit Service |
384592 |
WCHAR* pszPropertyName,
|
|
Packit Service |
384592 |
IAppHostPropertyException** pException,
|
|
Packit Service |
384592 |
BOOL* pBoolValue )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
HRESULT hr = S_OK;
|
|
Packit Service |
384592 |
IAppHostProperty *pProperty = NULL;
|
|
Packit Service |
384592 |
VARIANT vPropertyValue;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if (
|
|
Packit Service |
384592 |
( pElement == NULL ) ||
|
|
Packit Service |
384592 |
( pszPropertyName == NULL ) ||
|
|
Packit Service |
384592 |
( pException == NULL ) ||
|
|
Packit Service |
384592 |
( pBoolValue == NULL )
|
|
Packit Service |
384592 |
)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
hr = E_INVALIDARG;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Get the property object for the BOOLEAN attribute:
|
|
Packit Service |
384592 |
hr = pElement->GetPropertyByName(
|
|
Packit Service |
384592 |
pszPropertyName,
|
|
Packit Service |
384592 |
&pProperty );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( pProperty == NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
hr = E_UNEXPECTED;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Get the attribute value:
|
|
Packit Service |
384592 |
VariantInit( &vPropertyValue );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
hr = pProperty->get_Value( &vPropertyValue );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// See it there is an exception that might be due to the actual value in the
|
|
Packit Service |
384592 |
// config not meeting validation criteria
|
|
Packit Service |
384592 |
*pException = NULL;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
hr = pProperty->get_Exception( pException );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// No need to continue if we got an exception...
|
|
Packit Service |
384592 |
if ( ( *pException ) != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Finally, get the value:
|
|
Packit Service |
384592 |
*pBoolValue = ( vPropertyValue.boolVal == VARIANT_TRUE ) ? TRUE : FALSE;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
Failure:
|
|
Packit Service |
384592 |
VariantClear( &vPropertyValue );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( pProperty != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
pProperty->Release();
|
|
Packit Service |
384592 |
pProperty = NULL;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
return hr;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
HRESULT
|
|
Packit Service |
384592 |
MODSECURITY_STORED_CONTEXT::GetDWORDPropertyValue(
|
|
Packit Service |
384592 |
IAppHostElement* pElement,
|
|
Packit Service |
384592 |
WCHAR* pszPropertyName,
|
|
Packit Service |
384592 |
IAppHostPropertyException** pException,
|
|
Packit Service |
384592 |
DWORD* pnValue )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
HRESULT hr = S_OK;
|
|
Packit Service |
384592 |
IAppHostProperty *pProperty = NULL;
|
|
Packit Service |
384592 |
VARIANT vPropertyValue;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if (
|
|
Packit Service |
384592 |
( pElement == NULL ) ||
|
|
Packit Service |
384592 |
( pszPropertyName == NULL ) ||
|
|
Packit Service |
384592 |
( pException == NULL ) ||
|
|
Packit Service |
384592 |
( pnValue == NULL )
|
|
Packit Service |
384592 |
)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
hr = E_INVALIDARG;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Get the property object for the INT attribute:
|
|
Packit Service |
384592 |
hr = pElement->GetPropertyByName(
|
|
Packit Service |
384592 |
pszPropertyName,
|
|
Packit Service |
384592 |
&pProperty );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( pProperty == NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
hr = E_UNEXPECTED;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Get the attribute value:
|
|
Packit Service |
384592 |
VariantInit( &vPropertyValue );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
hr = pProperty->get_Value( &vPropertyValue );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// See it there is an exception that might be due to the actual value in the
|
|
Packit Service |
384592 |
// config not meeting validation criteria
|
|
Packit Service |
384592 |
*pException = NULL;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
hr = pProperty->get_Exception( pException );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// No need to continue if we got an exception...
|
|
Packit Service |
384592 |
if ( ( *pException ) != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Finally, get the value:
|
|
Packit Service |
384592 |
*pnValue = vPropertyValue.ulVal;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
Failure:
|
|
Packit Service |
384592 |
VariantClear( &vPropertyValue );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( pProperty != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
pProperty->Release();
|
|
Packit Service |
384592 |
pProperty = NULL;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
return hr;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
HRESULT
|
|
Packit Service |
384592 |
MODSECURITY_STORED_CONTEXT::GetTimeSpanPropertyValue(
|
|
Packit Service |
384592 |
IAppHostElement* pElement,
|
|
Packit Service |
384592 |
WCHAR* pszPropertyName,
|
|
Packit Service |
384592 |
IAppHostPropertyException** pException,
|
|
Packit Service |
384592 |
ULONGLONG* pnValue )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
HRESULT hr = S_OK;
|
|
Packit Service |
384592 |
IAppHostProperty *pProperty = NULL;
|
|
Packit Service |
384592 |
VARIANT vPropertyValue;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if (
|
|
Packit Service |
384592 |
( pElement == NULL ) ||
|
|
Packit Service |
384592 |
( pszPropertyName == NULL ) ||
|
|
Packit Service |
384592 |
( pException == NULL ) ||
|
|
Packit Service |
384592 |
( pnValue == NULL )
|
|
Packit Service |
384592 |
)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
hr = E_INVALIDARG;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Get the property object for the INT attribute:
|
|
Packit Service |
384592 |
hr = pElement->GetPropertyByName(
|
|
Packit Service |
384592 |
pszPropertyName,
|
|
Packit Service |
384592 |
&pProperty );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( pProperty == NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
hr = E_UNEXPECTED;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Get the attribute value:
|
|
Packit Service |
384592 |
VariantInit( &vPropertyValue );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
hr = pProperty->get_Value( &vPropertyValue );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// See it there is an exception that might be due to the actual value in the
|
|
Packit Service |
384592 |
// config not meeting validation criteria
|
|
Packit Service |
384592 |
*pException = NULL;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
hr = pProperty->get_Exception( pException );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// No need to continue if we got an exception...
|
|
Packit Service |
384592 |
if ( ( *pException ) != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Finally, get the value:
|
|
Packit Service |
384592 |
*pnValue = vPropertyValue.ullVal;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
Failure:
|
|
Packit Service |
384592 |
VariantClear( &vPropertyValue );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( pProperty != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
pProperty->Release();
|
|
Packit Service |
384592 |
pProperty = NULL;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
return hr;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
HRESULT
|
|
Packit Service |
384592 |
MODSECURITY_STORED_CONTEXT::GetStringPropertyValue(
|
|
Packit Service |
384592 |
IAppHostElement* pElement,
|
|
Packit Service |
384592 |
WCHAR* pszPropertyName,
|
|
Packit Service |
384592 |
IAppHostPropertyException** pException,
|
|
Packit Service |
384592 |
WCHAR** ppszValue )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
HRESULT hr = S_OK;
|
|
Packit Service |
384592 |
IAppHostProperty *pProperty = NULL;
|
|
Packit Service |
384592 |
DWORD dwLength;
|
|
Packit Service |
384592 |
VARIANT vPropertyValue;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if (
|
|
Packit Service |
384592 |
( pElement == NULL ) ||
|
|
Packit Service |
384592 |
( pszPropertyName == NULL ) ||
|
|
Packit Service |
384592 |
( pException == NULL ) ||
|
|
Packit Service |
384592 |
( ppszValue == NULL )
|
|
Packit Service |
384592 |
)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
hr = E_INVALIDARG;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
*ppszValue = NULL;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Get the property object for the string attribute:
|
|
Packit Service |
384592 |
hr = pElement->GetPropertyByName(
|
|
Packit Service |
384592 |
pszPropertyName,
|
|
Packit Service |
384592 |
&pProperty );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( pProperty == NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
hr = E_UNEXPECTED;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Get the attribute value:
|
|
Packit Service |
384592 |
VariantInit( &vPropertyValue );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
hr = pProperty->get_Value( &vPropertyValue );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// See it there is an exception that might be due to the actual value in the
|
|
Packit Service |
384592 |
// config not meeting validation criteria
|
|
Packit Service |
384592 |
*pException = NULL;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
hr = pProperty->get_Exception( pException );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// No need to continue if we got an exception...
|
|
Packit Service |
384592 |
if ( ( *pException ) != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Finally, get the value:
|
|
Packit Service |
384592 |
dwLength = SysStringLen( vPropertyValue.bstrVal );
|
|
Packit Service |
384592 |
*ppszValue = new WCHAR[ dwLength + 1 ];
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( (*ppszValue) == NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
hr = E_OUTOFMEMORY;
|
|
Packit Service |
384592 |
goto Failure;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
wcsncpy(
|
|
Packit Service |
384592 |
*ppszValue,
|
|
Packit Service |
384592 |
vPropertyValue.bstrVal,
|
|
Packit Service |
384592 |
dwLength );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
(*ppszValue)[ dwLength ] = L'\0';
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
Failure:
|
|
Packit Service |
384592 |
VariantClear( &vPropertyValue );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( pProperty != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
pProperty->Release();
|
|
Packit Service |
384592 |
pProperty = NULL;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
return hr;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
MODSECURITY_STORED_CONTEXT::~MODSECURITY_STORED_CONTEXT()
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
if ( m_pszPath != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
delete [] m_pszPath;
|
|
Packit Service |
384592 |
m_pszPath = NULL;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
MODSECURITY_STORED_CONTEXT::MODSECURITY_STORED_CONTEXT():
|
|
Packit Service |
384592 |
m_bIsEnabled ( FALSE ),
|
|
Packit Service |
384592 |
m_pszPath( NULL ),
|
|
Packit Service |
384592 |
m_Config( NULL ),
|
|
Packit Service |
384592 |
m_dwLastCheck( 0 )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
m_LastChange.dwLowDateTime = 0;
|
|
Packit Service |
384592 |
m_LastChange.dwHighDateTime = 0;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
DWORD
|
|
Packit Service |
384592 |
MODSECURITY_STORED_CONTEXT::GlobalWideCharToMultiByte(
|
|
Packit Service |
384592 |
WCHAR* pSource,
|
|
Packit Service |
384592 |
DWORD dwLengthSource,
|
|
Packit Service |
384592 |
CHAR** ppszDestination,
|
|
Packit Service |
384592 |
USHORT* pdwLengthDestination )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
DWORD dwResult = NULL;
|
|
Packit Service |
384592 |
DWORD dwCount = 0;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if (
|
|
Packit Service |
384592 |
( pSource == NULL ) ||
|
|
Packit Service |
384592 |
( ppszDestination == NULL ) ||
|
|
Packit Service |
384592 |
( pdwLengthDestination == NULL )
|
|
Packit Service |
384592 |
)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
dwResult = ERROR_INVALID_PARAMETER;
|
|
Packit Service |
384592 |
goto Exit;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Initialize result length
|
|
Packit Service |
384592 |
*pdwLengthDestination = 0;
|
|
Packit Service |
384592 |
*ppszDestination = NULL;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
dwCount = WideCharToMultiByte(
|
|
Packit Service |
384592 |
CP_ACP,
|
|
Packit Service |
384592 |
0,
|
|
Packit Service |
384592 |
pSource,
|
|
Packit Service |
384592 |
dwLengthSource + 1,
|
|
Packit Service |
384592 |
*ppszDestination,
|
|
Packit Service |
384592 |
0,
|
|
Packit Service |
384592 |
NULL,
|
|
Packit Service |
384592 |
NULL );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( 0 == dwCount )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
dwResult = GetLastError ();
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( dwResult == 0 )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
dwResult = ERROR_INVALID_DATA;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
goto Exit;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
*ppszDestination = new CHAR[ dwCount + 1 ];
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( NULL == ( *ppszDestination ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
dwResult = ERROR_OUTOFMEMORY;
|
|
Packit Service |
384592 |
goto Exit;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
// Make sure the memory is 'clean':
|
|
Packit Service |
384592 |
SecureZeroMemory(
|
|
Packit Service |
384592 |
( *ppszDestination ),
|
|
Packit Service |
384592 |
( dwCount + 1 ) * sizeof ( CHAR ) );
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if (
|
|
Packit Service |
384592 |
0 == WideCharToMultiByte(
|
|
Packit Service |
384592 |
CP_ACP,
|
|
Packit Service |
384592 |
0,
|
|
Packit Service |
384592 |
pSource,
|
|
Packit Service |
384592 |
dwLengthSource + 1,
|
|
Packit Service |
384592 |
*ppszDestination,
|
|
Packit Service |
384592 |
dwCount,
|
|
Packit Service |
384592 |
NULL,
|
|
Packit Service |
384592 |
NULL )
|
|
Packit Service |
384592 |
)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
dwResult = GetLastError();
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
goto Exit;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
*pdwLengthDestination = ( USHORT )dwCount;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
Exit:
|
|
Packit Service |
384592 |
if ( dwResult != 0 )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
// Make sure we do the proper cleanup in the error case:
|
|
Packit Service |
384592 |
if ( pdwLengthDestination != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
*pdwLengthDestination = 0;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( ppszDestination != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
if ( ( *ppszDestination ) != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
delete [] ( *ppszDestination );
|
|
Packit Service |
384592 |
( *ppszDestination ) = NULL;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
return dwResult;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
HRESULT
|
|
Packit Service |
384592 |
MODSECURITY_STORED_CONTEXT::GetConfig(
|
|
Packit Service |
384592 |
IHttpContext * pContext,
|
|
Packit Service |
384592 |
MODSECURITY_STORED_CONTEXT ** ppModuleConfig
|
|
Packit Service |
384592 |
)
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
HRESULT hr = S_OK;
|
|
Packit Service |
384592 |
MODSECURITY_STORED_CONTEXT * pModuleConfig = NULL;
|
|
Packit Service |
384592 |
IHttpModuleContextContainer * pMetadataContainer = NULL;
|
|
Packit Service |
384592 |
IAppHostConfigException * pException = NULL;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
pMetadataContainer = pContext->GetMetadata()->GetModuleContextContainer();
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
if ( pMetadataContainer == NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
hr = E_UNEXPECTED;
|
|
Packit Service |
384592 |
return hr;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
pModuleConfig = (MODSECURITY_STORED_CONTEXT *)pMetadataContainer->GetModuleContext( g_pModuleContext );
|
|
Packit Service |
384592 |
if ( pModuleConfig != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
//
|
|
Packit Service |
384592 |
// We found stored data for this module for the metadata
|
|
Packit Service |
384592 |
// object which is different for unique configuration path
|
|
Packit Service |
384592 |
//
|
|
Packit Service |
384592 |
*ppModuleConfig = pModuleConfig;
|
|
Packit Service |
384592 |
return S_OK;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
//
|
|
Packit Service |
384592 |
// If we reach here, that means this is first request or first
|
|
Packit Service |
384592 |
// request after a configuration change IIS core will throw stored context away
|
|
Packit Service |
384592 |
// if a change notification arrives for this metadata path
|
|
Packit Service |
384592 |
//
|
|
Packit Service |
384592 |
pModuleConfig = new MODSECURITY_STORED_CONTEXT();
|
|
Packit Service |
384592 |
if ( pModuleConfig == NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
return E_OUTOFMEMORY;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
//
|
|
Packit Service |
384592 |
// Read module configuration data and store in MODSECURITY_STORED_CONTEXT
|
|
Packit Service |
384592 |
//
|
|
Packit Service |
384592 |
hr = pModuleConfig->Initialize( pContext, &pException );
|
|
Packit Service |
384592 |
if ( FAILED( hr ) || pException != NULL )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
pModuleConfig->CleanupStoredContext();
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
pModuleConfig = NULL;
|
|
Packit Service |
384592 |
hr = E_UNEXPECTED;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
return hr;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
//
|
|
Packit Service |
384592 |
// Store MODSECURITY_STORED_CONTEXT data as metadata stored context
|
|
Packit Service |
384592 |
//
|
|
Packit Service |
384592 |
hr = pMetadataContainer->SetModuleContext( pModuleConfig,
|
|
Packit Service |
384592 |
g_pModuleContext );
|
|
Packit Service |
384592 |
if ( FAILED( hr ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
pModuleConfig->CleanupStoredContext();
|
|
Packit Service |
384592 |
pModuleConfig = NULL;
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
//
|
|
Packit Service |
384592 |
// It is possible that some other thread stored context before this thread
|
|
Packit Service |
384592 |
// could do. Check returned hr and return context stored by other thread
|
|
Packit Service |
384592 |
//
|
|
Packit Service |
384592 |
if ( hr == HRESULT_FROM_WIN32( ERROR_ALREADY_ASSIGNED ) )
|
|
Packit Service |
384592 |
{
|
|
Packit Service |
384592 |
*ppModuleConfig = (MODSECURITY_STORED_CONTEXT *)pMetadataContainer->GetModuleContext( g_pModuleContext );
|
|
Packit Service |
384592 |
return S_OK;
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
}
|
|
Packit Service |
384592 |
|
|
Packit Service |
384592 |
*ppModuleConfig = pModuleConfig;
|
|
Packit Service |
384592 |
return hr;
|
|
Packit Service |
384592 |
}
|