#ifndef _W3METADATA_HXX_ #define _W3METADATA_HXX_ #include "customerror.hxx" #include "usercache.hxx" // forward declaration class W3_CONTEXT; enum GATEWAY_TYPE { GATEWAY_UNKNOWN, GATEWAY_STATIC_FILE, GATEWAY_CGI, GATEWAY_ISAPI, GATEWAY_MAP }; class META_SCRIPT_MAP_ENTRY { // // CODEWORK // 1. Add missing members and accsessors // 2. Handle initialization errors // friend class META_SCRIPT_MAP; public: META_SCRIPT_MAP_ENTRY() : m_fIsStarScriptMapEntry (FALSE) { InitializeListHead( &m_ListEntry ); } ~META_SCRIPT_MAP_ENTRY() { } // actual ctor HRESULT Create( IN const WCHAR * szExtension, IN const WCHAR * szExecutable, IN DWORD Flags, IN const WCHAR * szVerbs, IN DWORD cbVerbs ); BOOL IsVerbAllowed( IN const STRA & strVerb ) { return m_Verbs.IsEmpty() || m_Verbs.FindString( strVerb.QueryStr() ); } STRU * QueryExecutable() { return &m_strExecutable; } GATEWAY_TYPE QueryGateway() { return m_Gateway; } BOOL QueryIsStarScriptMap() { return m_fIsStarScriptMapEntry; } MULTISZA * QueryAllowedVerbs() { return &m_Verbs; } BOOL QueryCheckPathInfoExists() { return !!( m_Flags & MD_SCRIPTMAPFLAG_CHECK_PATH_INFO ); } BOOL QueryAllowScriptAccess() { return !!( m_Flags & MD_SCRIPTMAPFLAG_SCRIPT ); } private: // // Avoid c++ errors // META_SCRIPT_MAP_ENTRY( const META_SCRIPT_MAP_ENTRY & ) {} META_SCRIPT_MAP_ENTRY & operator = ( const META_SCRIPT_MAP_ENTRY & ) { return *this; } // // Data Members // // // META_SCRIPT_MAP maintains a list of us // LIST_ENTRY m_ListEntry; // // Data from the script map stored in the metabase // STRU m_strExtension; STRU m_strExecutable; DWORD m_Flags; MULTISZA m_Verbs; GATEWAY_TYPE m_Gateway; BOOL m_fIsStarScriptMapEntry; }; class META_SCRIPT_MAP { public: META_SCRIPT_MAP() : m_StarScriptMapEntry (NULL) { InitializeListHead( &m_ListHead ); } ~META_SCRIPT_MAP() { Terminate(); } HRESULT Initialize( IN WCHAR * szScriptMapData ); VOID Terminate( VOID ); BOOL FindEntry( IN const STRU & strExtension, OUT META_SCRIPT_MAP_ENTRY * * ppScriptMapEntry ); META_SCRIPT_MAP_ENTRY * QueryStarScriptMap() { return m_StarScriptMapEntry; } private: // // Avoid c++ errors // META_SCRIPT_MAP( const META_SCRIPT_MAP & ) {} META_SCRIPT_MAP & operator = ( const META_SCRIPT_MAP & ) { return *this; } private: // // List of META_SCRIPT_MAP_ENTRY // LIST_ENTRY m_ListHead; META_SCRIPT_MAP_ENTRY *m_StarScriptMapEntry; }; class REDIRECTION_BLOB; #define EXPIRE_MODE_NONE 0 #define EXPIRE_MODE_STATIC 1 #define EXPIRE_MODE_DYNAMIC 2 #define EXPIRE_MODE_OFF 3 // // This is the maximum we allow the global expires value to be set to. // This is 1 year in seconds // #define MAX_GLOBAL_EXPIRE 0x1e13380 #define W3MD_CREATE_PROCESS_AS_USER 0x00000001 #define W3MD_CREATE_PROCESS_NEW_CONSOLE 0x00000002 #define DEFAULT_SCRIPT_TIMEOUT (15 * 60) #define DEFAULT_ENTITY_READ_AHEAD (48 * 1024) // // W3_METADATA elements are stored in the metadata cache // class W3_METADATA_KEY : public CACHE_KEY { public: W3_METADATA_KEY() { _dwDataSetNumber = 0; } VOID SetDataSetNumber( DWORD dwDataSet ) { DBG_ASSERT( dwDataSet != 0 ); _dwDataSetNumber = dwDataSet; } DWORD QueryKeyHash( VOID ) const { return _dwDataSetNumber; } BOOL QueryIsEqual( const CACHE_KEY * pCacheCompareKey ) const { W3_METADATA_KEY * pMetaKey = (W3_METADATA_KEY*) pCacheCompareKey; return pMetaKey->_dwDataSetNumber == _dwDataSetNumber; } private: DWORD _dwDataSetNumber; }; class W3_METADATA : public CACHE_ENTRY { public: W3_METADATA( OBJECT_CACHE * pObjectCache ); virtual ~W3_METADATA(); CACHE_KEY * QueryCacheKey( VOID ) const { return (CACHE_KEY*) &_cacheKey; } STRU * QueryMetadataPath( VOID ) { return &_strFullMetadataPath; } BOOL QueryIsOkToFlushDirmon( WCHAR * pszPath, DWORD cchPath ) { DBG_ASSERT( FALSE ); return FALSE; } VOID * operator new( size_t size ) { DBG_ASSERT( size == sizeof( W3_METADATA ) ); DBG_ASSERT( sm_pachW3MetaData != NULL ); return sm_pachW3MetaData->Alloc(); } VOID operator delete( VOID * pW3MetaData ) { DBG_ASSERT( pW3MetaData != NULL ); DBG_ASSERT( sm_pachW3MetaData != NULL ); DBG_REQUIRE( sm_pachW3MetaData->Free( pW3MetaData ) ); } HRESULT ReadMetaData( const STRU & strMetabasePath, const STRU & strURL ); HRESULT BuildPhysicalPath( STRU & strUrl, STRU * pstrPhysicalPath ); HRESULT BuildProviderList( IN WCHAR * pszProviders ); BOOL CheckAuthProvider( IN CHAR * pszPkgName ); HRESULT CreateUNCVrToken( IN LPWSTR pszUserName, IN LPWSTR pszPasswd ); HRESULT CreateAnonymousToken( IN LPWSTR pszUserName, IN LPWSTR pszPasswd ); HRESULT ReadCustomFooter( WCHAR * pszFooter ); // // Query Methods // STRU * QueryWamClsId( VOID ) { return &_strWamClsId; } DWORD QueryAppIsolated( VOID ) const { return _dwAppIsolated; } BOOL QueryNoCache( VOID ) const { return _fNoCache; } DWORD QueryVrLen( VOID ) const { return _dwVrLen; } TOKEN_CACHE_ENTRY * QueryVrAccessToken( VOID ) { return _pctVrToken; } TOKEN_CACHE_ENTRY * QueryAnonymousToken( VOID ) { return _pctAnonymousToken; } DWORD QueryAccessPerms( VOID ) const { return _dwAccessPerm | _dwSslAccessPerm; } DWORD QuerySslAccessPerms( VOID ) const { return _dwSslAccessPerm; } DWORD QueryDirBrowseFlags( VOID ) const { return _dwDirBrowseFlags; } WCHAR * QueryDomainName( VOID ) { return _strDomainName.QueryStr(); } STRA * QueryCustomHeaders( VOID ) { return &_strCustomHeaders; } HRESULT GetTrueRedirectionSource( LPWSTR pszURL, LPCWSTR pszMetabasePath, IN WCHAR * pszDestination, IN BOOL bIsString, OUT STRU * pstrTrueSource ); STRU * QueryDefaultLoadFiles( VOID ) { return &_strDefaultLoad; } STRU * QueryVrPath( VOID ) { return &_strVrPath; } HRESULT FindCustomError( USHORT StatusCode, USHORT SubError, BOOL * pfIsFile, STRU * pstrFile ) { return _customErrorTable.FindCustomError( StatusCode, SubError, pfIsFile, pstrFile ); } DIRMON_CONFIG * QueryDirmonConfig( VOID ) { return &_dirmonConfig; } STRA * QueryRedirectHeaders( VOID ) { return &_strRedirectHeaders; } REDIRECTION_BLOB * QueryRedirectionBlob() { return _pRedirectBlob; } DWORD QueryAuthentication( VOID ) { return _dwAuthentication; } BOOL QueryAuthTypeSupported( DWORD dwType ) { if ( dwType == VROOT_MASK_MAP_CERT ) { return !!( _dwSslAccessPerm & VROOT_MASK_MAP_CERT ); } else { return !!( _dwAuthentication & dwType ); } } META_SCRIPT_MAP * QueryScriptMap( VOID ) { return &_ScriptMap; } DWORD QueryAuthPersistence( VOID ) { return _dwAuthPersistence; } DWORD QueryLogonMethod( VOID ) { return _dwLogonMethod; } WCHAR * QueryRealm( VOID ) { return _strRealm.IsEmpty() ? NULL : _strRealm.QueryStr(); } WCHAR * QueryAppPoolId( VOID ) { return _strAppPoolId.QueryStr(); } MULTISZA * QueryAuthProviders( VOID ) { return &_mstrAuthProviders; } BYTE * QueryIpAccessCheckBuffer( VOID ) const { if ( _cbIpAccessCheck != 0 ) { return (BYTE*) _buffIpAccessCheck.QueryPtr(); } else { return NULL; } } DWORD QueryIpAccessCheckSize( VOID ) const { return _cbIpAccessCheck; } BOOL QueryCreateProcessAsUser( VOID ) const { return _fCreateProcessAsUser; } BOOL QueryCreateProcessNewConsole( VOID ) const { return _fCreateProcessNewConsole; } DWORD QueryScriptTimeout( VOID ) const { return _dwCGIScriptTimeout; } MIME_MAP * QueryMimeMap( VOID ) const { return _pMimeMap; } BOOL QueryDoStaticCompression( VOID ) const { return _fDoStaticCompression; } BOOL QueryDoDynamicCompression( VOID ) const { return _fDoDynamicCompression; } BOOL QueryIgnoreTranslate( VOID ) const { return _fIgnoreTranslate; } STRU * QueryAppMetaPath( VOID ) { return &_strAppMetaPath; } DWORD QueryVrPassThrough( VOID ) const { return _fVrPassThrough; } BOOL QuerySSIExecDisabled( VOID ) const { return _fSSIExecDisabled; } BOOL QueryDoReverseDNS( VOID ) const { return _fDoReverseDNS; } BOOL QueryDontLog( VOID ) { return _fDontLog; } BOOL QueryIsFooterEnabled( VOID ) { return _fFooterEnabled; } STRA * QueryFooterString( VOID ) { return &_strFooterString; } STRU * QueryFooterDocument( VOID ) { return &_strFooterDocument; } DWORD QueryExpireMode( VOID ) const { return _dwExpireMode; } STRA * QueryCacheControlHeader( VOID ) { return &_strCacheControlHeader; } STRA * QueryExpireHeader( VOID ) { return &_strExpireHeader; } DWORD QueryEntityReadAhead( VOID ) const { return _cbEntityReadAhead; } BOOL QueryIsDavDisabled( VOID ) const { return _fDisableDav; } static HRESULT Initialize( VOID ); static VOID Terminate( VOID ); private: // // Set methods // HRESULT SetRedirectionBlob( STRU & strSource, STRU & strDestination ); HRESULT SetExpire( WCHAR * pszExpire ); HRESULT SetCacheControlHeader( VOID ); HRESULT SetIpAccessCheck( LPVOID pMDData, DWORD dwDataLen ); W3_METADATA_KEY _cacheKey; STRU _strVrPath; DWORD _dwAccessPerm; DWORD _dwSslAccessPerm; DWORD _dwVrLevel; DWORD _dwVrLen; REDIRECTION_BLOB * _pRedirectBlob; DWORD _dwDirBrowseFlags; STRU _strDefaultLoad; DWORD _dwAuthentication; DWORD _dwAuthPersistence; WCHAR _rgUserName[ UNLEN + 1 ]; STRU _strUserName; WCHAR _rgPasswd[ PWLEN + 1 ]; STRU _strPasswd; WCHAR _rgDomainName[ DNLEN + 1 ]; STRU _strDomainName; STRA _strCustomHeaders; STRA _strRedirectHeaders; DWORD _dwLogonMethod; WCHAR _rgRealm[ DNLEN + 1 ]; STRU _strRealm; MULTISZA _mstrAuthProviders; BOOL _fCreateProcessAsUser; BOOL _fCreateProcessNewConsole; BOOL _fDoStaticCompression; BOOL _fDoDynamicCompression; DWORD _dwCGIScriptTimeout; BOOL _fVrPassThrough; BOOL _fIgnoreTranslate; BOOL _fDontLog; BOOL _fFooterEnabled; STRA _strFooterString; STRU _strFooterDocument; DWORD _dwExpireMode; STRA _strExpireHeader; LARGE_INTEGER _liExpireTime; DWORD _dwExpireDelta; BOOL _fHaveNoCache; DWORD _dwMaxAge; BOOL _fHaveMaxAge; STRA _strCacheControlHeader; BOOL _fDisableDav; // // Script mappings defined for this metadata entry // META_SCRIPT_MAP _ScriptMap; // // The metabase path for the application that controls this url. // Corresponds to MD_APP_ROOT // STRU _strAppMetaPath; // // IP address restriction info // BUFFER _buffIpAccessCheck; DWORD _cbIpAccessCheck; // // Access token for UNC case // TOKEN_CACHE_ENTRY * _pctVrToken; // // Anonymous user token (if account valid) // TOKEN_CACHE_ENTRY * _pctAnonymousToken; // // Custom Error Table // CUSTOM_ERROR_TABLE _customErrorTable; // // Mime Map lookup table // MIME_MAP *_pMimeMap; // // SSI execution disable flag // BOOL _fSSIExecDisabled; // // Do a DNS lookup (for logging/server-variable purposes) // BOOL _fDoReverseDNS; // // Entity read ahead size // DWORD _cbEntityReadAhead; // // App Pool ID // STRU _strAppPoolId; // // Dir monitor configuration // DIRMON_CONFIG _dirmonConfig; // // Should we disable caching for this path // BOOL _fNoCache; // // Cached WAM app info stuff // DWORD _dwAppIsolated; DWORD _dwAppOopRecoverLimit; STRU _strWamClsId; // // Full metadata path for flushing purposes // STRU _strFullMetadataPath; // // Allocation cache for W3_URL_INFO's // static ALLOC_CACHE_HANDLER * sm_pachW3MetaData; }; // // W3_METADATA cache // #define DEFAULT_W3_METADATA_CACHE_TTL (5*60) class W3_METADATA_CACHE : public OBJECT_CACHE { public: HRESULT GetMetaData( W3_CONTEXT * pW3Context, STRU & strUrl, W3_METADATA ** ppMetaData ); WCHAR * QueryName( VOID ) const { return L"W3_METADATA_CACHE"; } HRESULT Initialize( VOID ); VOID Terminate( VOID ) { return W3_METADATA::Terminate(); } private: HRESULT GetFullMetadataPath( W3_CONTEXT * pW3Context, STRU & strUrl, STRU * pstrFullPath ); HRESULT CreateNewMetaData( W3_CONTEXT * pW3Context, STRU & strUrl, STRU & strFullMetadataPath, W3_METADATA ** ppMetaData ); }; #endif