Blame iis/moduleconfig.cpp

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
}