Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

975 lines
17 KiB

  1. #ifndef _W3METADATA_HXX_
  2. #define _W3METADATA_HXX_
  3. #include "customerror.hxx"
  4. #include "usercache.hxx"
  5. // forward declaration
  6. class W3_CONTEXT;
  7. enum GATEWAY_TYPE
  8. {
  9. GATEWAY_UNKNOWN,
  10. GATEWAY_STATIC_FILE,
  11. GATEWAY_CGI,
  12. GATEWAY_ISAPI,
  13. GATEWAY_MAP
  14. };
  15. class META_SCRIPT_MAP_ENTRY
  16. {
  17. //
  18. // CODEWORK
  19. // 1. Add missing members and accsessors
  20. // 2. Handle initialization errors
  21. //
  22. friend class META_SCRIPT_MAP;
  23. public:
  24. META_SCRIPT_MAP_ENTRY()
  25. : m_fIsStarScriptMapEntry (FALSE)
  26. {
  27. InitializeListHead( &m_ListEntry );
  28. }
  29. ~META_SCRIPT_MAP_ENTRY()
  30. {
  31. }
  32. // actual ctor
  33. HRESULT
  34. Create(
  35. IN const WCHAR * szExtension,
  36. IN const WCHAR * szExecutable,
  37. IN DWORD Flags,
  38. IN const WCHAR * szVerbs,
  39. IN DWORD cbVerbs
  40. );
  41. BOOL
  42. IsVerbAllowed(
  43. IN const STRA & strVerb
  44. )
  45. {
  46. return m_Verbs.IsEmpty() || m_Verbs.FindString( strVerb.QueryStr() );
  47. }
  48. STRU *
  49. QueryExecutable()
  50. {
  51. return &m_strExecutable;
  52. }
  53. GATEWAY_TYPE
  54. QueryGateway()
  55. {
  56. return m_Gateway;
  57. }
  58. BOOL
  59. QueryIsStarScriptMap()
  60. {
  61. return m_fIsStarScriptMapEntry;
  62. }
  63. MULTISZA *
  64. QueryAllowedVerbs()
  65. {
  66. return &m_Verbs;
  67. }
  68. BOOL
  69. QueryCheckPathInfoExists()
  70. {
  71. return !!( m_Flags & MD_SCRIPTMAPFLAG_CHECK_PATH_INFO );
  72. }
  73. BOOL
  74. QueryAllowScriptAccess()
  75. {
  76. return !!( m_Flags & MD_SCRIPTMAPFLAG_SCRIPT );
  77. }
  78. private:
  79. //
  80. // Avoid c++ errors
  81. //
  82. META_SCRIPT_MAP_ENTRY( const META_SCRIPT_MAP_ENTRY & )
  83. {}
  84. META_SCRIPT_MAP_ENTRY & operator = ( const META_SCRIPT_MAP_ENTRY & )
  85. { return *this; }
  86. //
  87. // Data Members
  88. //
  89. //
  90. // META_SCRIPT_MAP maintains a list of us
  91. //
  92. LIST_ENTRY m_ListEntry;
  93. //
  94. // Data from the script map stored in the metabase
  95. //
  96. STRU m_strExtension;
  97. STRU m_strExecutable;
  98. DWORD m_Flags;
  99. MULTISZA m_Verbs;
  100. GATEWAY_TYPE m_Gateway;
  101. BOOL m_fIsStarScriptMapEntry;
  102. };
  103. class META_SCRIPT_MAP
  104. {
  105. public:
  106. META_SCRIPT_MAP()
  107. : m_StarScriptMapEntry (NULL)
  108. {
  109. InitializeListHead( &m_ListHead );
  110. }
  111. ~META_SCRIPT_MAP()
  112. {
  113. Terminate();
  114. }
  115. HRESULT
  116. Initialize(
  117. IN WCHAR * szScriptMapData
  118. );
  119. VOID
  120. Terminate( VOID );
  121. BOOL
  122. FindEntry(
  123. IN const STRU & strExtension,
  124. OUT META_SCRIPT_MAP_ENTRY * * ppScriptMapEntry
  125. );
  126. META_SCRIPT_MAP_ENTRY *
  127. QueryStarScriptMap()
  128. {
  129. return m_StarScriptMapEntry;
  130. }
  131. private:
  132. //
  133. // Avoid c++ errors
  134. //
  135. META_SCRIPT_MAP( const META_SCRIPT_MAP & )
  136. {}
  137. META_SCRIPT_MAP & operator = ( const META_SCRIPT_MAP & )
  138. { return *this; }
  139. private:
  140. //
  141. // List of META_SCRIPT_MAP_ENTRY
  142. //
  143. LIST_ENTRY m_ListHead;
  144. META_SCRIPT_MAP_ENTRY *m_StarScriptMapEntry;
  145. };
  146. class REDIRECTION_BLOB;
  147. #define EXPIRE_MODE_NONE 0
  148. #define EXPIRE_MODE_STATIC 1
  149. #define EXPIRE_MODE_DYNAMIC 2
  150. #define EXPIRE_MODE_OFF 3
  151. //
  152. // This is the maximum we allow the global expires value to be set to.
  153. // This is 1 year in seconds
  154. //
  155. #define MAX_GLOBAL_EXPIRE 0x1e13380
  156. #define W3MD_CREATE_PROCESS_AS_USER 0x00000001
  157. #define W3MD_CREATE_PROCESS_NEW_CONSOLE 0x00000002
  158. #define DEFAULT_SCRIPT_TIMEOUT (15 * 60)
  159. #define DEFAULT_ENTITY_READ_AHEAD (48 * 1024)
  160. //
  161. // W3_METADATA elements are stored in the metadata cache
  162. //
  163. class W3_METADATA_KEY : public CACHE_KEY
  164. {
  165. public:
  166. W3_METADATA_KEY()
  167. {
  168. _dwDataSetNumber = 0;
  169. }
  170. VOID
  171. SetDataSetNumber(
  172. DWORD dwDataSet
  173. )
  174. {
  175. DBG_ASSERT( dwDataSet != 0 );
  176. _dwDataSetNumber = dwDataSet;
  177. }
  178. DWORD
  179. QueryKeyHash(
  180. VOID
  181. ) const
  182. {
  183. return _dwDataSetNumber;
  184. }
  185. BOOL
  186. QueryIsEqual(
  187. const CACHE_KEY * pCacheCompareKey
  188. ) const
  189. {
  190. W3_METADATA_KEY * pMetaKey = (W3_METADATA_KEY*) pCacheCompareKey;
  191. return pMetaKey->_dwDataSetNumber == _dwDataSetNumber;
  192. }
  193. private:
  194. DWORD _dwDataSetNumber;
  195. };
  196. class W3_METADATA : public CACHE_ENTRY
  197. {
  198. public:
  199. W3_METADATA( OBJECT_CACHE * pObjectCache );
  200. virtual
  201. ~W3_METADATA();
  202. CACHE_KEY *
  203. QueryCacheKey(
  204. VOID
  205. ) const
  206. {
  207. return (CACHE_KEY*) &_cacheKey;
  208. }
  209. STRU *
  210. QueryMetadataPath(
  211. VOID
  212. )
  213. {
  214. return &_strFullMetadataPath;
  215. }
  216. BOOL
  217. QueryIsOkToFlushDirmon(
  218. WCHAR * pszPath,
  219. DWORD cchPath
  220. )
  221. {
  222. DBG_ASSERT( FALSE );
  223. return FALSE;
  224. }
  225. VOID *
  226. operator new(
  227. size_t size
  228. )
  229. {
  230. DBG_ASSERT( size == sizeof( W3_METADATA ) );
  231. DBG_ASSERT( sm_pachW3MetaData != NULL );
  232. return sm_pachW3MetaData->Alloc();
  233. }
  234. VOID
  235. operator delete(
  236. VOID * pW3MetaData
  237. )
  238. {
  239. DBG_ASSERT( pW3MetaData != NULL );
  240. DBG_ASSERT( sm_pachW3MetaData != NULL );
  241. DBG_REQUIRE( sm_pachW3MetaData->Free( pW3MetaData ) );
  242. }
  243. HRESULT
  244. ReadMetaData(
  245. const STRU & strMetabasePath,
  246. const STRU & strURL
  247. );
  248. HRESULT
  249. BuildPhysicalPath(
  250. STRU & strUrl,
  251. STRU * pstrPhysicalPath
  252. );
  253. HRESULT
  254. BuildProviderList(
  255. IN WCHAR * pszProviders
  256. );
  257. BOOL
  258. CheckAuthProvider(
  259. IN CHAR * pszPkgName
  260. );
  261. HRESULT
  262. CreateUNCVrToken(
  263. IN LPWSTR pszUserName,
  264. IN LPWSTR pszPasswd
  265. );
  266. HRESULT
  267. CreateAnonymousToken(
  268. IN LPWSTR pszUserName,
  269. IN LPWSTR pszPasswd
  270. );
  271. HRESULT
  272. ReadCustomFooter(
  273. WCHAR * pszFooter
  274. );
  275. //
  276. // Query Methods
  277. //
  278. STRU *
  279. QueryWamClsId(
  280. VOID
  281. )
  282. {
  283. return &_strWamClsId;
  284. }
  285. DWORD
  286. QueryAppIsolated(
  287. VOID
  288. ) const
  289. {
  290. return _dwAppIsolated;
  291. }
  292. BOOL
  293. QueryNoCache(
  294. VOID
  295. ) const
  296. {
  297. return _fNoCache;
  298. }
  299. DWORD QueryVrLen(
  300. VOID
  301. ) const
  302. {
  303. return _dwVrLen;
  304. }
  305. TOKEN_CACHE_ENTRY *
  306. QueryVrAccessToken(
  307. VOID
  308. )
  309. {
  310. return _pctVrToken;
  311. }
  312. TOKEN_CACHE_ENTRY *
  313. QueryAnonymousToken(
  314. VOID
  315. )
  316. {
  317. return _pctAnonymousToken;
  318. }
  319. DWORD
  320. QueryAccessPerms(
  321. VOID
  322. ) const
  323. {
  324. return _dwAccessPerm | _dwSslAccessPerm;
  325. }
  326. DWORD
  327. QuerySslAccessPerms(
  328. VOID
  329. ) const
  330. {
  331. return _dwSslAccessPerm;
  332. }
  333. DWORD
  334. QueryDirBrowseFlags(
  335. VOID
  336. ) const
  337. {
  338. return _dwDirBrowseFlags;
  339. }
  340. WCHAR *
  341. QueryDomainName(
  342. VOID
  343. )
  344. {
  345. return _strDomainName.QueryStr();
  346. }
  347. STRA *
  348. QueryCustomHeaders(
  349. VOID
  350. )
  351. {
  352. return &_strCustomHeaders;
  353. }
  354. HRESULT
  355. GetTrueRedirectionSource(
  356. LPWSTR pszURL,
  357. LPCWSTR pszMetabasePath,
  358. IN WCHAR * pszDestination,
  359. IN BOOL bIsString,
  360. OUT STRU * pstrTrueSource
  361. );
  362. STRU *
  363. QueryDefaultLoadFiles(
  364. VOID
  365. )
  366. {
  367. return &_strDefaultLoad;
  368. }
  369. STRU *
  370. QueryVrPath(
  371. VOID
  372. )
  373. {
  374. return &_strVrPath;
  375. }
  376. HRESULT
  377. FindCustomError(
  378. USHORT StatusCode,
  379. USHORT SubError,
  380. BOOL * pfIsFile,
  381. STRU * pstrFile
  382. )
  383. {
  384. return _customErrorTable.FindCustomError( StatusCode,
  385. SubError,
  386. pfIsFile,
  387. pstrFile );
  388. }
  389. DIRMON_CONFIG *
  390. QueryDirmonConfig(
  391. VOID
  392. )
  393. {
  394. return &_dirmonConfig;
  395. }
  396. STRA *
  397. QueryRedirectHeaders(
  398. VOID
  399. )
  400. {
  401. return &_strRedirectHeaders;
  402. }
  403. REDIRECTION_BLOB *
  404. QueryRedirectionBlob()
  405. {
  406. return _pRedirectBlob;
  407. }
  408. DWORD
  409. QueryAuthentication(
  410. VOID
  411. )
  412. {
  413. return _dwAuthentication;
  414. }
  415. BOOL
  416. QueryAuthTypeSupported(
  417. DWORD dwType
  418. )
  419. {
  420. if ( dwType == VROOT_MASK_MAP_CERT )
  421. {
  422. return !!( _dwSslAccessPerm & VROOT_MASK_MAP_CERT );
  423. }
  424. else
  425. {
  426. return !!( _dwAuthentication & dwType );
  427. }
  428. }
  429. META_SCRIPT_MAP *
  430. QueryScriptMap( VOID )
  431. {
  432. return &_ScriptMap;
  433. }
  434. DWORD
  435. QueryAuthPersistence(
  436. VOID
  437. )
  438. {
  439. return _dwAuthPersistence;
  440. }
  441. DWORD
  442. QueryLogonMethod(
  443. VOID
  444. )
  445. {
  446. return _dwLogonMethod;
  447. }
  448. WCHAR *
  449. QueryRealm(
  450. VOID
  451. )
  452. {
  453. return _strRealm.IsEmpty() ? NULL : _strRealm.QueryStr();
  454. }
  455. WCHAR *
  456. QueryAppPoolId(
  457. VOID
  458. )
  459. {
  460. return _strAppPoolId.QueryStr();
  461. }
  462. MULTISZA *
  463. QueryAuthProviders(
  464. VOID
  465. )
  466. {
  467. return &_mstrAuthProviders;
  468. }
  469. BYTE *
  470. QueryIpAccessCheckBuffer(
  471. VOID
  472. ) const
  473. {
  474. if ( _cbIpAccessCheck != 0 )
  475. {
  476. return (BYTE*) _buffIpAccessCheck.QueryPtr();
  477. }
  478. else
  479. {
  480. return NULL;
  481. }
  482. }
  483. DWORD
  484. QueryIpAccessCheckSize(
  485. VOID
  486. ) const
  487. {
  488. return _cbIpAccessCheck;
  489. }
  490. BOOL
  491. QueryCreateProcessAsUser(
  492. VOID
  493. ) const
  494. {
  495. return _fCreateProcessAsUser;
  496. }
  497. BOOL
  498. QueryCreateProcessNewConsole(
  499. VOID
  500. ) const
  501. {
  502. return _fCreateProcessNewConsole;
  503. }
  504. DWORD
  505. QueryScriptTimeout(
  506. VOID
  507. ) const
  508. {
  509. return _dwCGIScriptTimeout;
  510. }
  511. MIME_MAP *
  512. QueryMimeMap(
  513. VOID
  514. ) const
  515. {
  516. return _pMimeMap;
  517. }
  518. BOOL
  519. QueryDoStaticCompression(
  520. VOID
  521. ) const
  522. {
  523. return _fDoStaticCompression;
  524. }
  525. BOOL
  526. QueryDoDynamicCompression(
  527. VOID
  528. ) const
  529. {
  530. return _fDoDynamicCompression;
  531. }
  532. BOOL
  533. QueryIgnoreTranslate(
  534. VOID
  535. ) const
  536. {
  537. return _fIgnoreTranslate;
  538. }
  539. STRU *
  540. QueryAppMetaPath(
  541. VOID
  542. )
  543. {
  544. return &_strAppMetaPath;
  545. }
  546. DWORD
  547. QueryVrPassThrough(
  548. VOID
  549. ) const
  550. {
  551. return _fVrPassThrough;
  552. }
  553. BOOL
  554. QuerySSIExecDisabled(
  555. VOID
  556. ) const
  557. {
  558. return _fSSIExecDisabled;
  559. }
  560. BOOL
  561. QueryDoReverseDNS(
  562. VOID
  563. ) const
  564. {
  565. return _fDoReverseDNS;
  566. }
  567. BOOL
  568. QueryDontLog(
  569. VOID
  570. )
  571. {
  572. return _fDontLog;
  573. }
  574. BOOL
  575. QueryIsFooterEnabled(
  576. VOID
  577. )
  578. {
  579. return _fFooterEnabled;
  580. }
  581. STRA *
  582. QueryFooterString(
  583. VOID
  584. )
  585. {
  586. return &_strFooterString;
  587. }
  588. STRU *
  589. QueryFooterDocument(
  590. VOID
  591. )
  592. {
  593. return &_strFooterDocument;
  594. }
  595. DWORD
  596. QueryExpireMode(
  597. VOID
  598. ) const
  599. {
  600. return _dwExpireMode;
  601. }
  602. STRA *
  603. QueryCacheControlHeader(
  604. VOID
  605. )
  606. {
  607. return &_strCacheControlHeader;
  608. }
  609. STRA *
  610. QueryExpireHeader(
  611. VOID
  612. )
  613. {
  614. return &_strExpireHeader;
  615. }
  616. DWORD
  617. QueryEntityReadAhead(
  618. VOID
  619. ) const
  620. {
  621. return _cbEntityReadAhead;
  622. }
  623. BOOL
  624. QueryIsDavDisabled(
  625. VOID
  626. ) const
  627. {
  628. return _fDisableDav;
  629. }
  630. static
  631. HRESULT
  632. Initialize(
  633. VOID
  634. );
  635. static
  636. VOID
  637. Terminate(
  638. VOID
  639. );
  640. private:
  641. //
  642. // Set methods
  643. //
  644. HRESULT
  645. SetRedirectionBlob(
  646. STRU & strSource,
  647. STRU & strDestination
  648. );
  649. HRESULT
  650. SetExpire(
  651. WCHAR * pszExpire
  652. );
  653. HRESULT
  654. SetCacheControlHeader(
  655. VOID
  656. );
  657. HRESULT
  658. SetIpAccessCheck(
  659. LPVOID pMDData,
  660. DWORD dwDataLen
  661. );
  662. W3_METADATA_KEY _cacheKey;
  663. STRU _strVrPath;
  664. DWORD _dwAccessPerm;
  665. DWORD _dwSslAccessPerm;
  666. DWORD _dwVrLevel;
  667. DWORD _dwVrLen;
  668. REDIRECTION_BLOB * _pRedirectBlob;
  669. DWORD _dwDirBrowseFlags;
  670. STRU _strDefaultLoad;
  671. DWORD _dwAuthentication;
  672. DWORD _dwAuthPersistence;
  673. WCHAR _rgUserName[ UNLEN + 1 ];
  674. STRU _strUserName;
  675. WCHAR _rgPasswd[ PWLEN + 1 ];
  676. STRU _strPasswd;
  677. WCHAR _rgDomainName[ DNLEN + 1 ];
  678. STRU _strDomainName;
  679. STRA _strCustomHeaders;
  680. STRA _strRedirectHeaders;
  681. DWORD _dwLogonMethod;
  682. WCHAR _rgRealm[ DNLEN + 1 ];
  683. STRU _strRealm;
  684. MULTISZA _mstrAuthProviders;
  685. BOOL _fCreateProcessAsUser;
  686. BOOL _fCreateProcessNewConsole;
  687. BOOL _fDoStaticCompression;
  688. BOOL _fDoDynamicCompression;
  689. DWORD _dwCGIScriptTimeout;
  690. BOOL _fVrPassThrough;
  691. BOOL _fIgnoreTranslate;
  692. BOOL _fDontLog;
  693. BOOL _fFooterEnabled;
  694. STRA _strFooterString;
  695. STRU _strFooterDocument;
  696. DWORD _dwExpireMode;
  697. STRA _strExpireHeader;
  698. LARGE_INTEGER _liExpireTime;
  699. DWORD _dwExpireDelta;
  700. BOOL _fHaveNoCache;
  701. DWORD _dwMaxAge;
  702. BOOL _fHaveMaxAge;
  703. STRA _strCacheControlHeader;
  704. BOOL _fDisableDav;
  705. //
  706. // Script mappings defined for this metadata entry
  707. //
  708. META_SCRIPT_MAP _ScriptMap;
  709. //
  710. // The metabase path for the application that controls this url.
  711. // Corresponds to MD_APP_ROOT
  712. //
  713. STRU _strAppMetaPath;
  714. //
  715. // IP address restriction info
  716. //
  717. BUFFER _buffIpAccessCheck;
  718. DWORD _cbIpAccessCheck;
  719. //
  720. // Access token for UNC case
  721. //
  722. TOKEN_CACHE_ENTRY * _pctVrToken;
  723. //
  724. // Anonymous user token (if account valid)
  725. //
  726. TOKEN_CACHE_ENTRY * _pctAnonymousToken;
  727. //
  728. // Custom Error Table
  729. //
  730. CUSTOM_ERROR_TABLE _customErrorTable;
  731. //
  732. // Mime Map lookup table
  733. //
  734. MIME_MAP *_pMimeMap;
  735. //
  736. // SSI execution disable flag
  737. //
  738. BOOL _fSSIExecDisabled;
  739. //
  740. // Do a DNS lookup (for logging/server-variable purposes)
  741. //
  742. BOOL _fDoReverseDNS;
  743. //
  744. // Entity read ahead size
  745. //
  746. DWORD _cbEntityReadAhead;
  747. //
  748. // App Pool ID
  749. //
  750. STRU _strAppPoolId;
  751. //
  752. // Dir monitor configuration
  753. //
  754. DIRMON_CONFIG _dirmonConfig;
  755. //
  756. // Should we disable caching for this path
  757. //
  758. BOOL _fNoCache;
  759. //
  760. // Cached WAM app info stuff
  761. //
  762. DWORD _dwAppIsolated;
  763. DWORD _dwAppOopRecoverLimit;
  764. STRU _strWamClsId;
  765. //
  766. // Full metadata path for flushing purposes
  767. //
  768. STRU _strFullMetadataPath;
  769. //
  770. // Allocation cache for W3_URL_INFO's
  771. //
  772. static ALLOC_CACHE_HANDLER * sm_pachW3MetaData;
  773. };
  774. //
  775. // W3_METADATA cache
  776. //
  777. #define DEFAULT_W3_METADATA_CACHE_TTL (5*60)
  778. class W3_METADATA_CACHE : public OBJECT_CACHE
  779. {
  780. public:
  781. HRESULT
  782. GetMetaData(
  783. W3_CONTEXT * pW3Context,
  784. STRU & strUrl,
  785. W3_METADATA ** ppMetaData
  786. );
  787. WCHAR *
  788. QueryName(
  789. VOID
  790. ) const
  791. {
  792. return L"W3_METADATA_CACHE";
  793. }
  794. HRESULT
  795. Initialize(
  796. VOID
  797. );
  798. VOID
  799. Terminate(
  800. VOID
  801. )
  802. {
  803. return W3_METADATA::Terminate();
  804. }
  805. private:
  806. HRESULT
  807. GetFullMetadataPath(
  808. W3_CONTEXT * pW3Context,
  809. STRU & strUrl,
  810. STRU * pstrFullPath
  811. );
  812. HRESULT
  813. CreateNewMetaData(
  814. W3_CONTEXT * pW3Context,
  815. STRU & strUrl,
  816. STRU & strFullMetadataPath,
  817. W3_METADATA ** ppMetaData
  818. );
  819. };
  820. #endif