#ifndef _IMPLDEF_H_ #define _IMPLDEF_H_ // Implementation defined items ---------------------------------------------- // // The following must be DEFINED by the IMPL for use by the PARSER. // // Allow header items -------------------------------------------------------- // // The impl. needs to define the following set of strings that identify the // methods supported by the impl. for particular resources. // extern const CHAR gc_szHttpBase[]; extern const CHAR gc_szHttpDelete[]; extern const CHAR gc_szHttpPut[]; extern const CHAR gc_szHttpPost[]; extern const CHAR gc_szDavCopy[]; extern const CHAR gc_szDavMove[]; extern const CHAR gc_szDavMkCol[]; extern const CHAR gc_szDavPropfind[]; extern const CHAR gc_szDavProppatch[]; extern const CHAR gc_szDavLocks[]; extern const CHAR gc_szDavSearch[]; extern const CHAR gc_szDavNotif[]; extern const CHAR gc_szDavBatchDelete[]; extern const CHAR gc_szDavBatchCopy[]; extern const CHAR gc_szDavBatchMove[]; extern const CHAR gc_szDavBatchProppatch[]; extern const CHAR gc_szDavBatchPropfind[]; extern const CHAR gc_szDavPublic[]; extern const CHAR gc_szCompliance[]; extern const UINT gc_cbszDavPublic; // Storage paths and urls ---------------------------------------------------- // // The storage path for a resource is no-different that the path as translated // by IIS. This has not always been true, and there is code in the DAV source // tree that expects the path to have some sort of a prefix. // // At the beginning of NT beta3 work, we are removing the idea that a storage // path in DAV looks any different than a storage path in IIS. This is a very // important idea. Otherwise, there could be items accessible via DAV that // are not accessible via IIS -- and visa versa. // // Keeping this in mind... There are several places where we have url's that // are a part of a DAV request that are not pre-handled for us by IIS. Some // examples are the url's in the destination header of MOVE/COPY, the url's in // the scope of a SEARCH request, and the url's embedded in "if" headers. // // There are also several instances where we may have to generate a url from // a storage path -- as in the case of location headers and XML response // references. // // The translation of those items uses only common elements. So there is no // implementation specifc work that needs to be done here. // class IMethUtilBase; class CMethUtil; typedef CMethUtil IMethUtil; // The call to be used for proper conversion to unicode // SCODE __fastcall ScConvertToWide(/* [in] */ LPCSTR pszSource, /* [in/out] */ UINT * pcchDest, /* [out] */ LPWSTR pwszDest, /* [in] */ LPCSTR pszAcceptLang, /* [in] */ BOOL fUrlConversion); // The call to be used for canonicalization of URL // SCODE __fastcall ScCanonicalizeURL( /* [in] */ LPCWSTR pwszSrc, /* [in/out] */ LPWSTR pwszDest, /* [out] */ UINT * pcch ); // The call to be used for canonicalization of URL, // taking into account if it is fully qualified // SCODE __fastcall ScCanonicalizePrefixedURL( /* [in] */ LPCWSTR pwszSrc, /* [in/out] */ LPWSTR pwszDest, /* [out] */ UINT * pcch ); // These are the calls to be used to normalize URL // // Normalization consists of 3 steps: // a) escaping of skinny version // b) conversion to unicode // c) canonicalization // SCODE __fastcall ScNormalizeUrl ( /* [in] */ LPCWSTR pwszSourceUrl, /* [in/out] */ UINT * pcchNormalizedUrl, /* [out] */ LPWSTR pwszNormalizedUrl, /* [in] */ LPCSTR pszAcceptLang); SCODE __fastcall ScNormalizeUrl ( /* [in] */ LPCSTR pszSourceUrl, /* [in/out] */ UINT * pcchNormalizedUrl, /* [out] */ LPWSTR pwszNormalizedUrl, /* [in] */ LPCSTR pszAcceptLang); SCODE __fastcall ScStoragePathFromUrl ( /* [in] */ const IEcb& ecb, /* [in] */ LPCWSTR pwszUrl, /* [out] */ LPWSTR wszStgID, /* [in/out] */ UINT* pcch, /* [out] */ CVRoot** ppcvr = NULL); SCODE __fastcall ScUrlFromStoragePath ( /* [in] */ const IEcbBase& ecb, /* [in] */ LPCWSTR pwszPath, /* [out] */ LPWSTR pwszUrl, /* [in/out] */ UINT * pcb, /* [in] */ LPCWSTR pwszServer = NULL); SCODE __fastcall ScUrlFromSpannedStoragePath ( /* [in] */ LPCWSTR pwszPath, /* [in] */ CVRoot& vr, /* [in] */ LPWSTR pwszUrl, /* [in/out] */ UINT* pcch); // Wire urls ----------------------------------------------------------------- // // A note about a wire url. IIS translate all its urls into CP_ACP. So, to // keep consistant behavior in HTTPEXT, we also keep all local urls in CP_ACP. // However, for DAVEX, we don't hold to this. We deal exclusively in CP_UTF8 // style URLs. // // However, when we spit the url back out over the wire. The url must be in // UTF8. Anytime a url goes back over the wire from IIS to client, it must be // sanitized via these calls. // SCODE __fastcall ScWireUrlFromWideLocalUrl ( /* [in] */ UINT cchLocal, /* [in] */ LPCWSTR pwszLocalUrl, /* [in/out] */ auto_heap_ptr& pszWireUrl); SCODE __fastcall ScWireUrlFromStoragePath ( /* [in] */ IMethUtilBase* pmu, /* [in] */ LPCWSTR pwszStoragePath, /* [in] */ BOOL fCollection, /* [in] */ CVRoot* pcvrTranslate, /* [in/out] */ auto_heap_ptr& pszWireUrl); BOOL __fastcall FIsUTF8Url (/* [in] */ LPCSTR pszUrl); // Child ISAPI aux. access check --------------------------------------------- // // On both HTTPEXT and DAVEX, we have an additional stipulation that needs // satisfaction before we can hand back the source of an scriptmapped item. // We want to see if it has NT write access. // Note that among the parameters, pwszPath is used by HTTPEXT only and // pbSD is used by DAVEX only // SCODE __fastcall ScChildISAPIAccessCheck ( /* [in] */ const IEcb& ecb, /* [in] */ LPCWSTR pwszPath, /* [in] */ DWORD dwAccess, /* [in] */ LPBYTE pbSD); // Supported lock types ------------------------------------------------------ // // Return the supported locktype flags for the resource type. HTTPEXT only // supports documents and collections. DavEX, on the other hand, understands // structured documents. // DWORD __fastcall DwGetSupportedLockType (RESOURCE_TYPE rtResource); // Access perm hack for DAVEX ------------------------------------------------ // //$SECURITY // In DAVEX only, if either a VR_USERNAME or VR_PASSWORD is set then // to avoid a security problem, shut off all access. // VOID ImplHackAccessPerms( LPCWSTR pwszVRUserName, LPCWSTR pwszVRPassword, DWORD * pdwAccessPerms ); // DLL instance refcounting -------------------------------------------------- // VOID AddRefImplInst(); VOID ReleaseImplInst(); // Exception safe DLL instance refcounting ----------------------------------- // typedef enum { ADD_REF = 0, TAKE_OWNERSHIP } REF_ACTION; class safeImplInstRef { BOOL m_fRelease; // NOT IMPLEMENTED // safeImplInstRef( const safeImplInstRef& ); safeImplInstRef& operator=( const safeImplInstRef& ); public: // CREATORS // safeImplInstRef(REF_ACTION ra) : m_fRelease(TRUE) { if (ADD_REF == ra) AddRefImplInst(); } // DESTRUCTOR // ~safeImplInstRef() { if (m_fRelease) ReleaseImplInst(); } // MANIPULATOR // VOID relinquish() { m_fRelease = FALSE; } }; BOOL FSucceededColonColonCheck( /* [in] */ LPCWSTR pwszURI); #endif // _IMPLDEF_H_