/*++ Copyright (c) 1996 Microsoft Corporation Module Name: ism.hxx Abstract: HTML administrator include file Author: Philippe Choquier (phillich) 10-january-1996 Revision History: --*/ # ifndef _HTMLA_HXX_ # define _HTMLA_HXX_ /************************************************************ * Symbolic Constants ************************************************************/ // // HTTP Server response status codes // #define HT_OK 200 //#define HT_CREATED 201 //#define HT_ACCEPTED 202 //#define HT_PARTIAL 203 //#define HT_MULT_CHOICE 300 #define HT_MOVED 301 #define HT_REDIRECT 302 #define HT_REDIRECT_METHOD 303 #define HT_NOT_MODIFIED 304 #define HT_REDIRECTH 380 #define HT_BAD_REQUEST 400 #define HT_DENIED 401 //#define HT_PAYMENT_REQ 402 #define HT_FORBIDDEN 403 #define HT_NOT_FOUND 404 //#define HT_METHOD_NOT_ALLOWED 405 #define HT_NONE_ACCEPTABLE 406 #define HT_PROXY_AUTH_REQ 407 //#define HT_REQUEST_TIMEOUT 408 //#define HT_CONFLICT 409 //#define HT_GONE 410 #define HT_SERVER_ERROR 500 #define HT_NOT_SUPPORTED 501 #define HT_BAD_GATEWAY 502 //#define HT_SVC_UNAVAILABLE 503 #define HT_GATEWAY_TIMOUE 504 // some values not conflicting with their respective domain ranges #define HT_REPROCESS 0x10000000 #define HSE_REPROCESS 0x10000000 #define INET_DIR 0xffff0000 #define INET_LOG_INVALID_TO_FILE 4 // // script execution status // #define HTR_OK 0 #define HTR_OUT_OF_RESOURCE 1000 #define HTR_COM_CONFIG_ACCESS_ERROR 2000 #define HTR_USER_ENUM_ACCESS_ERROR 2010 #define HTR_USER_DISCONNECT_ERROR 2020 #define HTR_CONFIG_ACCESS_ERROR 2100 #define HTR_W3_CONFIG_ACCESS_ERROR 2200 #define HTR_FTP_CONFIG_ACCESS_ERROR 2300 #define HTR_GD_CONFIG_ACCESS_ERROR 2400 #define HTR_CONFIG_WRITE_ERROR 2500 #define HTR_W3_CONFIG_WRITE_ERROR 2600 #define HTR_FTP_CONFIG_WRITE_ERROR 2700 #define HTR_GD_CONFIG_WRITE_ERROR 2800 #define HTR_COM_CONFIG_WRITE_ERROR 2900 #define HTR_REF_NOT_FOUND 4000 #define HTR_BAD_PARAM 5000 // invalid syntax in param #define HTR_INVALID_VAR_TYPE 6000 #define HTR_INVALID_FORM_PARAM_NAME 7000 #define HTR_INVALID_FORM_PARAM 8000 #define HTR_VAR_NOT_FOUND 9000 #define HTR_TOO_MANY_NESTED_IF 10000 #define HTR_IF_UNDERFLOW 11000 #define HTR_VALIDATION_FAILED 12000 // Update indication rejected #define HTR_ACCESS_DENIED 13000 #define HTR_DIR_SAME_NAME 14000 #define IP_ADDR_BYTE_SIZE 4 #define MAX_SIZE_OF_DWORD_AS_STRING 32 #define INET_LOG_PERIOD_ON_SIZE 5 // next value in INET_LOG_PERIOD_* #define HOME_DIR_PATH L"/" // // max size DNS name // #define MAX_DOMAIN_LENGTH 128 // // max error code length [when converted to a string] // #define MAX_ERROR_CODE_LENGTH 32 // // HTMLA variables types // // Some types are defined to enable specific validation / alteration // even if their storage convention is the same as already available // types. // enum INET_ELEM_TYPE { ITYPE_BOOL, // 0 ( FALSE) or 1 ( TRUE ), in a DWORD ITYPE_LPWSTR, // pointer to UNICODE ITYPE_LPSTR, // pointer to ASCII ITYPE_AWCHAR, // array of UNICODE ITYPE_DWORD, // 32 bits unsigned ITYPE_SHORT, // 16 bits ITYPE_IP_ADDR, // array of bytes ( len is IP_ADDR_BYTE_SIZE ) ITYPE_IP_MASK, // array of bytes ( len is IP_ADDR_BYTE_SIZE ) ITYPE_1K, // as DWORD, scaled 1024 ITYPE_TIME, // seconds, in a DWORD ITYPE_PARAM_LIT_STRING, // as LPSTR ITYPE_VIRT_DIR_LPWSTR, // virtual root name, as a LPWSTR ITYPE_SHORTDW, // 16 significant bits in a DWORD ITYPE_1M, // as DWORD, scaled 1024*1024 ITYPE_PATH_LPWSTR // directory path as LPWSTR }; #define HEXDIGIT( nDigit ) \ (TCHAR)((nDigit) > 9 ? \ (nDigit) - 10 + 'A' \ : (nDigit) + '0') // // Status of HTML script parsing // enum HTR_SKIP_STATUS { HSS_NO_SKIP, HSS_SKIP_ITER=1, HSS_SKIP_IF=2, HSS_SKIP_GOTO=4, HSS_WAIT_ENDIF=8 }; #define MAX_NESTED_IF 16 // // type of command for the HandleVirtDirRequest() functions // #define _VIRT_DIR_REQ_CHECK 0 #define _VIRT_DIR_REQ_ALIAS 1 extern DWORD g_dwZero; extern DWORD g_dwOne; extern LPSTR g_pszIPNullAddr; #if defined(IISv1) extern OSVERSIONINFO g_OSVersion; extern DWORD g_dwCap1Flag; extern DWORD g_dwCap1Mask; #endif // //DLLs to look in for error codes // LPSTR g_apszErrorCodeDlls[] = { "KERNEL32.DLL", "NETMSG.DLL", "NTDLL.DLL" }; #define NUM_ERROR_CODE_DLLS (sizeof(g_apszErrorCodeDlls)/sizeof(g_apszErrorCodeDlls[0])) class CInetInfoMap; // // Global functions // BOOL SortVirtualRoots( LPINET_INFO_VIRTUAL_ROOT_LIST pL ); BOOL SortIpSecList( LPINET_INFO_IP_SEC_LIST pL ); // // Dynamic string // class CDStr { public: CDStr(); ~CDStr(); BOOL Init(); // returns pointer to string, always zero-delimited LPSTR GetString(); // return string length ( excluding delimiter ) DWORD GetLen() { return m_dwLen; } // add a zero-delimited string BOOL Add( LPSTR ); // add a byte range BOOL AddRange( LPSTR, DWORD ); // add a byte range // reset content to NULL void Reset(); private: DWORD m_dwAlloc; // # of alloc'ed bytes DWORD m_dwLen; // string length LPSTR m_pStr; // pointer to buffer } ; #if defined(GENERATE_AUTH_HEADERS) // // Maintains a list of authentication schemes supported // by the Web server // class CAuthenticationReqs { public: CAuthenticationReqs(); ~CAuthenticationReqs(); // BOOL Init(); // Retrieve list of authentication methods as a W3 header // i.e. each method is prefixed with WWW-Authenticate // and "\r\n" is appended to the list. // returns NULL if no supported authentication methods. LPSTR GetAuthenticationListHeader(); // To be used while accessing the LPSTR returned // by GetAuthenticationListHeader() void Lock() { EnterCriticalSection( &m_csR ); } void UnLock() { LeaveCriticalSection( &m_csR ); } // BOOL UpdateMethodsIndication(); BOOL UpdateNTAuthenticationProvidersIndication(); // Request termination of this object ( will terminate // notification thread ) BOOL Terminate(); // DWORD UpdateIndication(); private: BOOL BuildListHeader(); private: HANDLE m_hNotifyEvent; BOOL m_fRequestTerminate; HANDLE m_hThread; CDStr m_dsH; // WWW-Authenticate list DWORD m_dwMethods; // bitmask from INET_INFO_AUTH_* LPSTR m_pszProviders; CRITICAL_SECTION m_csR; HKEY m_hKey; } ; #endif // // Memory allocation node, used by CInetInfoConfigInfoMapper to maintain // a list of all allocations made during a request to allow them to be // freed at the end of the request. // // The memory block is initialized to all 0. // class CAllocNode { public: // constructor allocates requested memory block CAllocNode( DWORD dwL ) { if ( m_pBuff = new BYTE[ dwL ] ) { memset( m_pBuff, '\0', dwL ); } m_pNext = NULL; } ~CAllocNode() { delete [] m_pBuff; } void SetNext( CAllocNode* pN ) { m_pNext = pN; } CAllocNode* GetNext() { return m_pNext; } LPBYTE GetBuff() { return m_pBuff; } private: LPBYTE m_pBuff; // pointer to buffer CAllocNode* m_pNext; // pointer to next alloc node } ; class CInetInfoConfigInfoMapper; // // Give access to the list of currently connected users for a given // servive ( as specified by the CInetInfoConfigInfoMapper given // at Init() time ) // class CUserEnum { public: CUserEnum(); ~CUserEnum(); // BOOL Init( CInetInfoConfigInfoMapper* ); void Reset(); // Get count of connected users as a .htr variable BOOL GetCount( LPVOID* ); // Retrieve info about the current index in the user array // as a .htr variable // the index is specified by the bound CInetInfoConfigInfoMapper // via the GetIter() function. Returns FALSE if invalid/out of range BOOL GetName( LPVOID* ); BOOL GetAnonymous( LPVOID* ); BOOL GetAddr( LPVOID* ); BOOL GetTime( LPVOID* ); BOOL GetID( LPVOID* ); // same as GetID but as a DWORD BOOL GetIDAsDWORD( LPDWORD ); // Get count of connected users as a DWORD BOOL GetCountAsDWORD( LPDWORD ); private: BOOL InsureLoaded(); private: CInetInfoConfigInfoMapper* m_pMapper; DWORD m_dwCount; W3_USER_INFO *m_pUsers; } ; // Directory & drive list management class CDriveView { public: CDriveView(); ~CDriveView(); // BOOL Init( CInetInfoConfigInfoMapper* ); BOOL Reset(); BOOL Entry( UINT i, UINT cMax, CDStr &dsList, PVOID pRes ); // BOOL GenerateDirList( LPSTR pDir ); BOOL ValidateDir( LPSTR pDir ); BOOL CreateDir( LPSTR pPath, LPSTR pNewDir ); // BOOL RootDir( LPSTR *pV ) { *pV = m_achRootDir; return TRUE; } BOOL BaseDir( LPSTR *pV ) { *pV = m_achBaseDir; return TRUE; } BOOL DirCount( LPDWORD *pV ) { *pV = &m_cDirs; return TRUE; } BOOL DirEntry( UINT i, LPVOID pV ) { return Entry( i, m_cDirs, m_dsDirs, pV); } BOOL DirCompCount( LPDWORD *pV ) { *pV = &m_cComp; return TRUE; } BOOL DirCompEntry( UINT i, LPVOID pV ) { return Entry( i, m_cComp, m_dsComp, pV); } BOOL DirFCompEntry( UINT i, LPVOID pV ) { return Entry( i, m_cComp, m_dsFComp, pV); } BOOL DriveCount( LPDWORD *pV ) { *pV = &m_cDrives; return TRUE; } BOOL DriveNameEntry( UINT i, LPVOID pV ) { return Entry( i, m_cDrives, m_dsDriveName, pV); } BOOL DriveLabelEntry( UINT i, LPVOID pV ) { return Entry( i, m_cDrives, m_dsDriveLabel, pV); } BOOL DriveTypeEntry( UINT i, LPVOID pV ) { if (i < m_cDrives ) { *(LPDWORD*)pV = (DWORD*)(m_dsDriveType.GetString()+sizeof(DWORD)*i); return TRUE;} else return FALSE; } private: CInetInfoConfigInfoMapper* m_pMapper; CDStr m_dsDirs; CDStr m_dsDriveName; CDStr m_dsDriveLabel; CDStr m_dsDriveType; // as array of DWORD CDStr m_dsComp; CDStr m_dsFComp; DWORD m_cDirs; DWORD m_cDrives; DWORD m_cComp; char m_achRootDir[MAX_PATH]; char m_achBaseDir[MAX_PATH]; // cache info DWORD m_dwCachedDrive; time_t m_tmCacheExpire; } ; // expiration time for drive cache ( in second ) #define DRIVE_CACHE_EXPIRE 30 // // Entry describing a service using its name and type // class CServType { public: LPSTR GetName() { return pszName; } DWORD GetType() { return dwType; } public: LPSTR pszName; DWORD dwType; } ; // // Mapper between service names and types // class CServTypeEnum { public: CServType* GetServByName( LPSTR pName ); CServType* GetServByType( DWORD dwT ); } ; class CInetInfoRequest; // // Provides access to all .htr variables // Handles RPC access ( get/put ) // and provides set functions for non-RPC variables to make them // accessible to a .htr script. // Also handles !Functions // class CInetInfoConfigInfoMapper { public: CInetInfoConfigInfoMapper(); ~CInetInfoConfigInfoMapper(); BOOL Init( CInetInfoMap*, int, DWORD ); DWORD GetType() { return m_dwCurrentServerType; } LPWSTR GetComputerName() { return m_achComputerName; } DWORD GetRPCStatus() { return m_dwRPCStatus; } VOID SetRPCStatus( DWORD dwS ) { m_dwRPCStatus = dwS; SetRPCStatusString(dwS); } // return addr of HTMLA script variable BOOL RequestStatus( LPVOID *pV ) { *pV = (LPVOID)&m_dwRequestStatus; return TRUE; } BOOL RPCStatus( LPVOID *pV ) { *pV = (LPVOID)&m_dwRPCStatus; return TRUE; } BOOL RPCStatusString( LPVOID *pV ) { *pV = (LPVOID)&m_pszRPCStatusString; return TRUE; } BOOL HttpStatus( LPVOID *pV ) { *pV = (LPVOID)&m_dwHttpStatus; return TRUE; } BOOL FtpStatus( LPVOID *pV ) { *pV = (LPVOID)&m_dwFtpStatus; return TRUE; } BOOL GopherStatus( LPVOID *pV ) { *pV = (LPVOID)&m_dwGopherStatus; return TRUE; } BOOL OSMajorVersion( LPVOID *pV ) #if defined(IISv1) {*pV = (LPVOID)&g_OSVersion.dwMajorVersion; return TRUE;} #else { if ( m_pServerCaps != NULL ) { *pV = (LPVOID) &m_pServerCaps->MajorVersion; return TRUE; } else {*pV = (LPVOID)&g_dwZero; return FALSE;} } #endif BOOL OSMinorVersion( LPVOID *pV ) #if defined(IISv1) {*pV = (LPVOID)&g_OSVersion.dwMinorVersion; return TRUE;} #else { if ( m_pServerCaps != NULL ) { *pV = (LPVOID) &m_pServerCaps->MinorVersion; return TRUE; } else {*pV = (LPVOID)&g_dwZero; return FALSE;} } #endif BOOL OSBuildNumber( LPVOID *pV ) #if defined(IISv1) {*pV = (LPVOID)&g_OSVersion.dwBuildNumber; return TRUE;} #else { if ( m_pServerCaps != NULL ) { *pV = (LPVOID) &m_pServerCaps->BuildNumber; return TRUE; } else {*pV = (LPVOID)&g_dwZero; return FALSE;} } #endif BOOL MajorVersion( LPVOID *pV ) { *pV = (LPVOID)&m_dwMajorVersion; return TRUE; } BOOL MinorVersion( LPVOID *pV ) { *pV = (LPVOID)&m_dwMinorVersion; return TRUE; } BOOL W3Version( LPVOID *pV ) { *pV = (LPVOID)&m_pszW3Version; return TRUE; } BOOL Cap1Flag( LPVOID *pV ) #if defined(IISv1) {*pV = (LPVOID)&g_dwCap1Flag; return TRUE;} #else { if ( m_pServerCaps != NULL && m_pServerCaps->NumCapFlags > 0) { *pV = (LPVOID)&m_pServerCaps->CapFlags[0].Flag; return TRUE; } else {*pV = (LPVOID)&g_dwZero; return FALSE;} } #endif BOOL Cap1Mask( LPVOID *pV ) #if defined(IISv1) {*pV = (LPVOID)&g_dwCap1Mask; return TRUE;} #else { if ( m_pServerCaps != NULL && m_pServerCaps->NumCapFlags > 0) { *pV = (LPVOID)&m_pServerCaps->CapFlags[0].Mask; return TRUE; } else {*pV = (LPVOID)&g_dwZero; return FALSE;} } #endif BOOL URLParam( LPVOID *pV ) { *pV = (LPVOID)&m_pszURLParam; return TRUE; } BOOL PlatformType( LPVOID *pV ) #if defined(IISv1) {*pV = (LPVOID)&g_dwZero; return TRUE;} #else { if ( m_pServerCaps != NULL ) { *pV = (LPVOID)&m_pServerCaps->ProductType; return TRUE; } else {*pV = (LPVOID)&g_dwOne; return TRUE;} } #endif BOOL ServName( LPVOID *pV ); BOOL ServIdx( LPVOID *pV ) { *pV = (LPVOID)&m_dwCurrentServerType; return TRUE; } BOOL Iter( LPVOID *pV ) { *pV = (LPVOID)&m_iIter; return TRUE; } BOOL ReqParam( LPVOID *pV ) { *pV = (LPVOID)&m_pszReqParam; return TRUE; } BOOL RemoteAddr( LPVOID *pV ) { *pV = (LPVOID)&m_pszRemoteAddr; return TRUE; } BOOL IPNullAddr( LPVOID *pV ) { *pV = (LPVOID)&g_pszIPNullAddr; return TRUE; } BOOL HostName( LPVOID *pV ) { *pV = (LPVOID)&m_pszHostName; return TRUE; } BOOL HtmlaPath( LPVOID *pV ) { *pV = (LPVOID)&m_pszHtmlaPath; return TRUE; } BOOL Arg1( LPVOID *pV ) { *pV = (LPVOID)&m_pszArg1; return m_dwCurrentServerType == INET_DIR; } BOOL Arg2( LPVOID *pV ) { *pV = (LPVOID)&m_pszArg2; return m_dwCurrentServerType == INET_DIR; } BOOL Arg3( LPVOID *pV ) { *pV = (LPVOID)&m_pszArg3; return m_dwCurrentServerType == INET_DIR; } BOOL UserFlags( LPVOID *pV ) { *pV = (LPVOID)&m_dwUserFlags; return TRUE; } // BOOL CommTimeout( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = (LPVOID)&m_pConfig->dwConnectionTimeout; return TRUE;} else return FALSE; } BOOL MaxConn( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = (LPVOID)&m_pConfig->dwMaxConnections; return TRUE;} else return FALSE; } BOOL AdminName( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = (LPVOID)&m_pConfig->lpszAdminName; return TRUE;} else return FALSE; } BOOL AdminEmail( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = (LPVOID)&m_pConfig->lpszAdminEmail; return TRUE;} else return FALSE; } BOOL ServerComment( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = (LPVOID)&m_pConfig->lpszServerComment; return TRUE;} else return FALSE; } // BOOL LogSrc( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = (LPVOID)&m_pConfig->lpLogConfig->rgchDataSource; return TRUE;} else return FALSE; } BOOL LogName( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = (LPVOID)&m_pConfig->lpLogConfig->rgchTableName; return TRUE;} else return FALSE; } BOOL LogUser( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = (LPVOID)&m_pConfig->lpLogConfig->rgchUserName; return TRUE;} else return FALSE; } BOOL LogPw( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = (LPVOID)&m_pConfig->lpLogConfig->rgchPassword; return TRUE;} else return FALSE; } BOOL LogDir( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = (LPVOID) &m_pConfig->lpLogConfig->rgchLogFileDirectory; return TRUE;} else return FALSE; } // BOOL LogAnonymous( LPVOID *pV ) { *pV = (LPVOID)&m_pConfig->fLogAnonymous; return m_pConfig ? TRUE : FALSE; } BOOL LogNonAnonymous( LPVOID *pV ) { *pV = (LPVOID)&m_pConfig->fLogNonAnonymous; return m_pConfig ? TRUE : FALSE; } BOOL AnonUserName( LPVOID *pV ) { *pV = (LPVOID)&m_pConfig->lpszAnonUserName; return m_pConfig ? TRUE : FALSE; } BOOL AnonUserPw( LPVOID *pV ) { *pV = (LPVOID)m_pConfig->szAnonPassword; return m_pConfig ? TRUE : FALSE; } BOOL DirBrowseEnab( LPVOID *pV ); BOOL DefFileEnab( LPVOID *pV ); BOOL AuthAnon( LPVOID *pV ); BOOL AuthBasic( LPVOID *pV ); BOOL AuthNT( LPVOID *pV ); BOOL SPort( LPVOID *pV ) { *pV = (LPVOID)&m_pConfig->sPort; return m_pConfig ? TRUE : FALSE; } // BOOL DenyIPCount( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = m_pConfig->DenyIPList ? (LPVOID)&m_pConfig->DenyIPList->cEntries : (LPVOID)&g_dwZero; return TRUE;} else return FALSE; } BOOL DenyIsIPSingle( LPVOID *pV ); BOOL DenyIPAddr( LPVOID *pV ) { if ( m_pConfig!=NULL && m_pConfig->DenyIPList && m_iIter < m_pConfig->DenyIPList->cEntries ) { *pV = (LPVOID)&m_pConfig->DenyIPList->aIPSecEntry[m_iIter].dwNetwork; return TRUE;} else return FALSE; } BOOL DenyIPMask( LPVOID *pV ) { if ( m_pConfig!=NULL && m_pConfig->DenyIPList && m_iIter < m_pConfig->DenyIPList->cEntries ) { *pV = (LPVOID)&m_pConfig->DenyIPList->aIPSecEntry[m_iIter].dwMask; return TRUE;} else return FALSE; } BOOL GrantIPCount( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = m_pConfig->GrantIPList ? (LPVOID)&m_pConfig->GrantIPList->cEntries : (LPVOID)&g_dwZero; return TRUE;} else return FALSE; } BOOL GrantIsIPSingle( LPVOID *pV ); BOOL GrantIPAddr( LPVOID *pV ) { if ( m_pConfig!=NULL && m_pConfig->GrantIPList && m_iIter < m_pConfig->GrantIPList->cEntries ) { *pV = (LPVOID)&m_pConfig->GrantIPList->aIPSecEntry[m_iIter].dwNetwork; return TRUE;} else return FALSE; } BOOL GrantIPMask( LPVOID *pV ) { if ( m_pConfig!=NULL && m_pConfig->GrantIPList && m_iIter < m_pConfig->GrantIPList->cEntries ) { *pV = (LPVOID)&m_pConfig->GrantIPList->aIPSecEntry[m_iIter].dwMask; return TRUE;} else return FALSE; } BOOL IPDenyRef( LPVOID *pV ); BOOL IPGrantRef( LPVOID *pV ); BOOL IPRef( LPVOID *pV, INET_INFO_IP_SEC_LIST*, LPSTR* ); void AdjustFromIPSingle( LPBYTE ); void AdjustIPSingle( LPBYTE ); void InvalidateIPSingle() { m_dwIsIPSingle = 2; } // BOOL RootCount( LPVOID *pV ) { if ( m_pConfig!=NULL ) { *pV = m_pConfig->VirtualRoots ? (LPVOID)&m_pConfig->VirtualRoots->cEntries : (LPVOID)&g_dwZero; return TRUE;} else return FALSE; } BOOL RootName( LPVOID *pV ); BOOL RootAddr( LPVOID *pV ) { if ( m_pConfig!=NULL && m_pConfig->VirtualRoots && m_iIter < m_pConfig->VirtualRoots->cEntries ) { *pV = (LPVOID)&m_pConfig->VirtualRoots->aVirtRootEntry[m_iIter].pszAddress; return TRUE;} else return FALSE; } BOOL RootDir( LPVOID *pV ) { if ( m_pConfig!=NULL && m_pConfig->VirtualRoots && m_iIter < m_pConfig->VirtualRoots->cEntries ) { *pV = (LPVOID)&m_pConfig->VirtualRoots->aVirtRootEntry[m_iIter].pszDirectory; return TRUE;} else return FALSE; } BOOL RootAcctName( LPVOID *pV ) { if ( m_pConfig!=NULL && m_pConfig->VirtualRoots && m_iIter < m_pConfig->VirtualRoots->cEntries ) { *pV = (LPVOID) &m_pConfig->VirtualRoots->aVirtRootEntry[m_iIter].pszAccountName; return TRUE;} else return FALSE; } BOOL RootAcctPw( LPVOID *pV ) { if ( m_pConfig!=NULL && m_pConfig->VirtualRoots && m_iIter < m_pConfig->VirtualRoots->cEntries ) { *pV = (LPVOID) m_pConfig->VirtualRoots->aVirtRootEntry[m_iIter].AccountPassword; return TRUE;} else return FALSE; } BOOL RootError( LPVOID *pV ) { if ( m_pConfig!=NULL && m_pConfig->VirtualRoots && m_iIter < m_pConfig->VirtualRoots->cEntries ) { *pV = (LPVOID) &m_pConfig->VirtualRoots->aVirtRootEntry[m_iIter].dwError; return TRUE;} else return FALSE; } BOOL RootIsHome( LPVOID *pV ); BOOL RootIsRead( LPVOID *pV ); BOOL RootIsWrite( LPVOID *pV ); BOOL RootIsExec( LPVOID *pV ); BOOL RootIsSSL( LPVOID *pV ); BOOL RootRef( LPVOID *pV ); BOOL SetRootEntryVars(); // BOOL DefFile( LPVOID *pV ) { if ( m_pW3Config!=NULL ) { *pV = (LPVOID) &m_pW3Config->lpszDefaultLoadFile; return TRUE;} else return FALSE; } BOOL SSIEnabled( LPVOID *pV ) { if ( m_pW3Config!=NULL ) { *pV = (LPVOID)&m_pW3Config->fSSIEnabled; return TRUE;} else return FALSE; } BOOL SSIExt( LPVOID *pV ) { if ( m_pW3Config!=NULL ) { *pV = (LPVOID) &m_pW3Config->lpszSSIExtension; return TRUE;} else return FALSE; } BOOL CryptCapable( LPVOID *pV ); // BOOL EnableLog( LPVOID *pV ); BOOL EnableNewLog( LPVOID *pV ); BOOL LogType( LPVOID *pV ) { if ( m_pConfig!= NULL ) {*pV = &m_pConfig->lpLogConfig->inetLogType; return TRUE;} else return FALSE; } BOOL LogSize( LPVOID *pV ) { if ( m_pConfig!= NULL ) {*pV = &m_pConfig->lpLogConfig->cbSizeForTruncation; return TRUE;} else return FALSE; } BOOL LogPeriod( LPVOID *pV ); BOOL LogFormat( LPVOID *pV ); BOOL SetLogEntryVars(); BOOL InvalidLogUpdate( LPVOID *pV ); // // Gopher variables // BOOL GopherSite( LPVOID *pV ) { if ( m_pGdConfig!= NULL ) {*pV = &m_pGdConfig->lpszSite; return TRUE;} else return FALSE; } BOOL GopherOrg( LPVOID *pV ) { if ( m_pGdConfig!= NULL ) {*pV = &m_pGdConfig->lpszOrganization; return TRUE;} else return FALSE; } BOOL GopherLoc( LPVOID *pV ) { if ( m_pGdConfig!= NULL ) {*pV = &m_pGdConfig->lpszLocation; return TRUE;} else return FALSE; } BOOL GopherGeo( LPVOID *pV ) { if ( m_pGdConfig!= NULL ) {*pV = &m_pGdConfig->lpszGeography; return TRUE;} else return FALSE; } BOOL GopherLang( LPVOID *pV ) { if ( m_pGdConfig!= NULL ) {*pV = &m_pGdConfig->lpszLanguage; return TRUE;} else return FALSE; } // // FTP variables // BOOL FTPIsAnon( LPVOID *pV ) { if ( m_pFtpConfig!= NULL ) {*pV = &m_pFtpConfig->fAllowAnonymous; return TRUE;} else return FALSE; } BOOL FTPIsGuest( LPVOID *pV ) { if ( m_pFtpConfig!= NULL ) {*pV = &m_pFtpConfig->fAllowGuestAccess; return TRUE;} else return FALSE; } BOOL FTPIsAnotDir( LPVOID *pV ) { if ( m_pFtpConfig!= NULL ) {*pV = &m_pFtpConfig->fAnnotateDirectories; return TRUE;} else return FALSE; } BOOL FTPIsAnonOnly( LPVOID *pV ) { if ( m_pFtpConfig!= NULL ) {*pV = &m_pFtpConfig->fAnonymousOnly; return TRUE;} else return FALSE; } BOOL FTPExitMsg( LPVOID *pV ) { if ( m_pFtpConfig!= NULL ) {*pV = &m_pFtpConfig->lpszExitMessage; return TRUE;} else return FALSE; } BOOL FTPGreetMsg( LPVOID *pV ) { if ( m_pFtpConfig!= NULL ) {*pV = &m_pFtpConfig->lpszGreetingMessage; return TRUE;} else return FALSE; } BOOL FTPHomeDir( LPVOID *pV ) { if ( m_pFtpConfig!= NULL ) {*pV = &m_pFtpConfig->lpszHomeDirectory; return TRUE;} else return FALSE; } BOOL FTPMaxClMsg( LPVOID *pV ) { if ( m_pFtpConfig!= NULL ) {*pV = &m_pFtpConfig->lpszMaxClientsMessage; return TRUE;} else return FALSE; } BOOL FTPIsMsdos( LPVOID *pV ) { if ( m_pFtpConfig!= NULL ) {*pV = &m_pFtpConfig->fMsdosDirOutput; return TRUE;} else return FALSE; } // // User enumeration ( for all services ) // BOOL UCount( LPVOID *pV ) { return m_Users.GetCount( pV ); } BOOL UName( LPVOID *pV ) { return m_Users.GetName( pV ); } BOOL UAnonymous( LPVOID *pV ) { return m_Users.GetAnonymous( pV ); } BOOL UAddr( LPVOID *pV ) { return m_Users.GetAddr( pV ); } BOOL UTime( LPVOID *pV ) { return m_Users.GetTime( pV ); } BOOL UID( LPVOID *pV ) { return m_Users.GetID( pV ); } // // Global information // BOOL GlobalBandwidth( LPVOID *pV ) { if ( m_pGlobalConfig!= NULL ) {*pV = &m_pGlobalConfig->BandwidthLevel; return TRUE;} else return FALSE; } BOOL GlobalCache( LPVOID *pV ) { if ( m_pGlobalConfig!= NULL ) {*pV = &m_pGlobalConfig->cbMemoryCacheSize; return TRUE;} else return FALSE; } BOOL GlobalIsBandwidthLimited( LPVOID *pV ); // // Directory browsing // // these functions are a shell around the m_Drive object // BOOL DirRootDir( LPVOID *pV ) { return m_Drive.RootDir( (LPSTR*)(*pV = (LPVOID*)&m_pszRootDir ) ); } BOOL DirBaseDir( LPVOID *pV ) { return m_Drive.BaseDir( (LPSTR*)(*pV = (LPVOID*)&m_pszBaseDir ) ); } BOOL DirCount( LPVOID *pV ) { return m_Drive.DirCount( (LPDWORD*)pV ); } BOOL DirEntry( LPVOID *pV ) { return m_Drive.DirEntry( m_iIter, *pV = (LPVOID*)&m_pszDirEntry ); } BOOL DirCompCount( LPVOID *pV ) { return m_Drive.DirCompCount( (LPDWORD*)pV ); } BOOL DirCompEntry( LPVOID *pV ) { return m_Drive.DirCompEntry( m_iIter, *pV = (LPVOID*)&m_pszDirCompEntry ); } BOOL DirFCompEntry( LPVOID *pV ) { return m_Drive.DirFCompEntry( m_iIter, *pV = (LPVOID*)&m_pszDirFCompEntry ); } BOOL DriveCount( LPVOID *pV ) { return m_Drive.DriveCount( (LPDWORD*)pV ); } BOOL DriveNameEntry( LPVOID *pV ) { return m_Drive.DriveNameEntry( m_iIter, *pV = (LPVOID*)&m_pszDriveNameEntry ); } BOOL DriveLabelEntry( LPVOID *pV ) { return m_Drive.DriveLabelEntry( m_iIter, *pV = (LPVOID*)&m_pszDriveLabelEntry ); } BOOL DriveTypeEntry( LPVOID *pV ) { return m_Drive.DriveTypeEntry( m_iIter, pV ); } // // Function called to validate a HTMLA variable update. // if return FALSE then update is invalidated, and a error condition // will be generated at the HTMLA script level // // These functions have to set the relevant bit in the appropriate // FieldControl of the various RPC structures in order to request // the server to update its internal state. // BOOL UpdateCommTimeout() { if ( m_pConfig!=NULL ) { SetField( m_pConfig->FieldControl, FC_INET_INFO_CONNECTION_TIMEOUT); return TRUE;} else return FALSE; } BOOL UpdateMaxConn() { if ( m_pConfig!=NULL ) { SetField( m_pConfig->FieldControl, FC_INET_INFO_MAX_CONNECTIONS); return TRUE;} else return FALSE; } BOOL UpdateAdminName() { if ( m_pConfig!=NULL ) { SetField( m_pConfig->FieldControl, FC_INET_INFO_ADMIN_NAME); return TRUE;} else return FALSE; } BOOL UpdateAdminEmail() { if ( m_pConfig!=NULL ) { SetField( m_pConfig->FieldControl, FC_INET_INFO_ADMIN_EMAIL); return TRUE;} else return FALSE; } BOOL UpdateServerComment() { if ( m_pConfig!=NULL ) { SetField( m_pConfig->FieldControl, FC_INET_INFO_SERVER_COMMENT); return TRUE;} else return FALSE; } // Triggers error to indicates the associated variable // should not be updated BOOL DenyUpdate() { return FALSE; } BOOL IgnoreUpdate() { return TRUE; } BOOL UpdateLogAnonymous() { if ( m_pConfig ) {SetField( m_pConfig->FieldControl, FC_INET_INFO_LOG_ANONYMOUS); return TRUE;} else return FALSE;} BOOL UpdateLogNonAnonymous() { if ( m_pConfig ) {SetField( m_pConfig->FieldControl, FC_INET_INFO_LOG_NONANONYMOUS); return TRUE;} else return FALSE;} BOOL UpdateAnonUserName() { if ( m_pConfig ) {SetField( m_pConfig->FieldControl, FC_INET_INFO_ANON_USER_NAME); return TRUE;} else return FALSE; } BOOL UpdateAnonUserPw() { if ( m_pConfig ) {SetField( m_pConfig->FieldControl, FC_INET_INFO_ANON_PASSWORD); return TRUE;} else return FALSE; } BOOL UpdateSPort() { if ( m_pConfig ) {SetField( m_pConfig->FieldControl, FC_INET_INFO_PORT_NUMBER); return TRUE;} else return FALSE; } // BOOL UpdateDenyIsIPSingle(); BOOL UpdateGrantIsIPSingle(); BOOL UpdateIP() { if ( m_pConfig ) { SetField( m_pConfig->FieldControl, FC_INET_INFO_SITE_SECURITY); return TRUE;} else return FALSE; } BOOL UpdateDirControl(); BOOL UpdateRoot() { if ( m_pConfig ) { SetField( m_pConfig->FieldControl, FC_INET_INFO_VIRTUAL_ROOTS); return TRUE;} else return FALSE; } BOOL UpdateRootName(); BOOL UpdateRootMask(); BOOL UpdateAuth(); BOOL UpdateLog(); BOOL UpdateNewLog(); BOOL UpdateLogType(); BOOL UpdateLogPeriod(); BOOL UpdateLogFormat(); BOOL UpdateLogSize(); BOOL UpdateLogInfo() { if ( m_pConfig!=NULL ) {SetField( m_pConfig->FieldControl, FC_INET_INFO_ALL ); return TRUE;} else return FALSE; } BOOL UpdateLogFileInfo(); BOOL UpdateLogODBCInfo(); // // W3 variables // BOOL UpdateDefFile() { if ( m_pW3Config!=NULL ) { SetField( m_pW3Config->FieldControl, FC_W3_DEFAULT_LOAD_FILE ); return TRUE;} else return FALSE; } BOOL UpdateSSIEnabled() { if ( m_pW3Config!=NULL ) { SetField( m_pW3Config->FieldControl, FC_W3_SSI_ENABLED ); return TRUE;} else return FALSE; } BOOL UpdateSSIExt() { if ( m_pW3Config!=NULL ) { SetField( m_pW3Config->FieldControl, FC_W3_SSI_EXTENSION ); return TRUE;} else return FALSE; } // // Gopher variables // BOOL UpdateGopherSite() { if ( m_pGdConfig!=NULL ) { SetField( m_pGdConfig->FieldControl, GDA_SITE ); return TRUE;} else return FALSE; } BOOL UpdateGopherOrg() { if ( m_pGdConfig!=NULL ) { SetField( m_pGdConfig->FieldControl, GDA_ORGANIZATION ); return TRUE;} else return FALSE; } BOOL UpdateGopherLoc() { if ( m_pGdConfig!=NULL ) { SetField( m_pGdConfig->FieldControl, GDA_LOCATION ); return TRUE;} else return FALSE; } BOOL UpdateGopherGeo() { if ( m_pGdConfig!=NULL ) { SetField( m_pGdConfig->FieldControl, GDA_GEOGRAPHY ); return TRUE;} else return FALSE; } BOOL UpdateGopherLang() { if ( m_pGdConfig!=NULL ) { SetField( m_pGdConfig->FieldControl, GDA_LANGUAGE ); return TRUE;} else return FALSE; } // // FTP variables // BOOL UpdateFTPIsAnon() { if ( m_pFtpConfig!=NULL ) { SetField( m_pFtpConfig->FieldControl, FC_FTP_ALLOW_ANONYMOUS ); return TRUE;} else return FALSE; } BOOL UpdateFTPIsGuest() { if ( m_pFtpConfig!=NULL ) { SetField( m_pFtpConfig->FieldControl, FC_FTP_ALLOW_GUEST_ACCESS ); return TRUE;} else return FALSE; } BOOL UpdateFTPIsAnotDir() { if ( m_pFtpConfig!=NULL ) { SetField( m_pFtpConfig->FieldControl, FC_FTP_ANNOTATE_DIRECTORIES ); return TRUE;} else return FALSE; } BOOL UpdateFTPIsAnonOnly() { if ( m_pFtpConfig!=NULL ) { SetField( m_pFtpConfig->FieldControl, FC_FTP_ANONYMOUS_ONLY ); return TRUE;} else return FALSE; } BOOL UpdateFTPExitMsg() { if ( m_pFtpConfig!=NULL ) { SetField( m_pFtpConfig->FieldControl, FC_FTP_EXIT_MESSAGE ); return TRUE;} else return FALSE; } BOOL UpdateFTPGreetMsg() { if ( m_pFtpConfig!=NULL ) { SetField( m_pFtpConfig->FieldControl, FC_FTP_GREETING_MESSAGE ); return TRUE;} else return FALSE; } BOOL UpdateFTPHomeDir() { if ( m_pFtpConfig!=NULL ) { SetField( m_pFtpConfig->FieldControl, FC_FTP_HOME_DIRECTORY ); return TRUE;} else return FALSE; } BOOL UpdateFTPMaxClMsg() { if ( m_pFtpConfig!=NULL ) { SetField( m_pFtpConfig->FieldControl, FC_FTP_MAX_CLIENTS_MESSAGE ); return TRUE;} else return FALSE; } BOOL UpdateFTPIsMsdos() { if ( m_pFtpConfig!=NULL ) { SetField( m_pFtpConfig->FieldControl, FC_FTP_MSDOS_DIR_OUTPUT ); return TRUE;} else return FALSE; } // // Global configuration variables // BOOL UpdateGlobal() { if ( m_pGlobalConfig != NULL ) { SetField( m_pGlobalConfig->FieldControl, FC_GINET_INFO_ALL ); return TRUE;} else return FALSE; } BOOL UpdateGlobalBandwidth(); BOOL UpdateGlobalIsBandwidthLimited(); // // variables linked to current client request // void SetRequestStatus ( DWORD dwS ) { m_dwRequestStatus = dwS; } void SetReqParam( LPSTR pszP, CInetInfoRequest* pR, LPSTR pszPRaw ) { m_pszReqParam = pszP; m_piiR = pR; m_pszReqParamRaw = pszPRaw; } DWORD GetRequestStatus () { return m_dwRequestStatus; } void SetURLParam( LPSTR pszP ) { m_pszURLParam = pszP; } BOOL SetRemoteAddr( LPSTR pR ); VOID SetUserFlags( DWORD dw ) { m_dwUserFlags = dw; } // // Structure management // BOOL GetCurrentConfig(); BOOL Update(); BOOL FreeInfo(); // based on SetField() info LPVOID Alloc( DWORD ); void Lock( ); void UnLock( ); // Map a variable name to a variable descriptor BOOL Map( LPBYTE pName, DWORD dwNameLen, CInetInfoMap** ); // return to be deleted depending on fFree BOOL GetString( CInetInfoMap*, LPSTR *pResult, DWORD *pdwResLen, BOOL *pfFree ); BOOL EscapeString( LPSTR *pResult, DWORD *pdwResLen, BOOL fFree ); BOOL GetString( LPBYTE pName, DWORD dwNameLen, LPSTR *pResult, DWORD *pdwResLen, BOOL *pfFree ); BOOL PutString( CInetInfoMap *pMap, LPSTR pSet ); void ResetIter() { m_iIter = 0; m_fInvEntry = TRUE; } void IncIter() { ++m_iIter; m_fInvEntry = TRUE; } void SetIter( DWORD dwI ) { ++m_iIter = dwI; m_fInvEntry = TRUE; } DWORD GetIter() { return m_iIter; } BOOL GetFromMsgBody( LPSTR pName, DWORD dwNameLen, LPSTR *pResult, DWORD *pdwResLen ); BOOL GetFromServer( LPSTR pName, DWORD dwNameLen, LPSTR *pResult, DWORD *pdwResLen ); // // HTMLA Verbs // // // Directory management // BOOL GenerateDirList( LPSTR pV ) { return m_Drive.GenerateDirList( pV ); } BOOL ValidateDir( LPSTR pV ) { return m_Drive.ValidateDir( pV ); } BOOL CreateDir( LPSTR pV, LPSTR pV2 ) { return m_Drive.CreateDir( pV, pV2 ); } // // IP access list management // BOOL AddIPAccess( BOOL ); BOOL DeleteIPAccess( BOOL, LPSTR pID ); BOOL PositionIPAccess( BOOL, LPSTR pID ); BOOL CloneIPAccesses( BOOL, BOOL fExtend, BOOL fDel, DWORD dwToDel ); BOOL SetIPAccessDefault( BOOL fIsDeny ); BOOL BuildIPUniqueID( LPSTR, INET_INFO_IP_SEC_ENTRY* ); // // Virtual directories list management // BOOL AddVirtDir(); BOOL DeleteVirtDir( LPSTR pID ); BOOL PositionVirtDir( LPSTR pID ); BOOL CloneVirtDirs( BOOL fExtend, BOOL fDel, DWORD dwToDel ); BOOL BuildVirtDirUniqueID( LPSTR, INET_INFO_VIRTUAL_ROOT_ENTRY* ); BOOL VirtDirCmp( INET_INFO_VIRTUAL_ROOT_ENTRY* p1, INET_INFO_VIRTUAL_ROOT_ENTRY* p2, BOOL ); BOOL HandleVirtDirRequest( LPSTR, LPSTR, int ); BOOL AliasVirtDir( INET_INFO_VIRTUAL_ROOT_ENTRY *pU ); // // Disconnect User management // BOOL DisconnectUser( LPSTR ); BOOL DisconnectAll(); // // Password management // BOOL ChangePassword(); // BOOL GetStatus(); // LPSTR IPToMultiByte( LPBYTE pB ); BOOL MultiByteToIP( LPSTR *pS, LPBYTE pB ); private: void SetRPCStatusString(DWORD dwS); //should only be called from SetRPCStatus() CInetInfoMap *m_pMap; // map name to member int m_cNbMap; CInetInfoRequest *m_piiR; INET_INFO_GLOBAL_CONFIG_INFO *m_pGlobalConfig; INET_INFO_CONFIG_INFO *m_pConfig; // W3_CONFIG_INFO *m_pW3Config; FTP_CONFIG_INFO *m_pFtpConfig; GOPHERD_CONFIG_INFO *m_pGdConfig; LPINET_INFO_CAPABILITIES m_pServerCaps; CUserEnum m_Users; DWORD m_dwCurrentServerType; // type of bind pConfig DWORD m_dwUserFlags; // DWORD m_iIter; // index in iterated sub-struc CRITICAL_SECTION m_csLock; LPSTR m_pszURLParam; LPSTR m_pszReqParamRaw; DWORD m_dwRequestStatus; DWORD m_dwRPCStatus; LPTSTR m_pszRPCStatusString; DWORD m_dwHttpStatus; DWORD m_dwFtpStatus; DWORD m_dwGopherStatus; // memory allocation support for RPC structure update CAllocNode *m_pFirstAlloc; CAllocNode *m_pLastAlloc; // WCHAR m_achComputerName[MAX_COMPUTERNAME_LENGTH+1]; // virtual vars BOOL m_DirBrowseEnab; BOOL m_DefFileEnab; BOOL m_fRootIsRead; BOOL m_fRootIsWrite; BOOL m_fRootIsExec; BOOL m_fRootIsSSL; BOOL m_fRootIsHome; BOOL m_fAuthAnon; BOOL m_fAuthBasic; BOOL m_fAuthNT; BOOL m_fEnableLog; BOOL m_fEnableNewLog; DWORD m_dwLogPeriod; DWORD m_dwLogFormat; LPSTR m_pDenyRef; LPSTR m_pGrantRef; LPSTR m_pRootRef; LPSTR m_pszVarServName; DWORD m_dwIsBandwidthLimited; DWORD m_dwIsIPSingle; LPSTR m_pszReqParam; BOOL m_fInvEntry; LPBYTE m_pRemoteAddr; LPSTR m_pszRemoteAddr; CHAR m_achHostName[MAX_DOMAIN_LENGTH + 1]; LPSTR m_pszHtmlaPath; LPSTR m_pszHostName; DWORD m_dwInvalidLogUpdate; BOOL m_fLogFileUpdate; BOOL m_fLogODBCUpdate; DWORD m_dwWasLogPeriod; DWORD m_dwWasLogType; DWORD m_dwWasSizeForTruncation; // directory browsing CDriveView m_Drive; DWORD m_dwDirCount; DWORD m_dwDirCompCount; DWORD m_dwDriveCount; LPSTR m_pszRootDir; LPSTR m_pszBaseDir; LPSTR m_pszDirEntry; LPSTR m_pszDirCompEntry; LPSTR m_pszDirFCompEntry; LPSTR m_pszDriveNameEntry; LPSTR m_pszDriveLabelEntry; LPSTR m_pszArg1; LPSTR m_pszArg2; LPSTR m_pszArg3; // DWORD m_dwCryptCapable; BOOL m_fGotServerCapsAndVersion; DWORD m_dwMajorVersion; DWORD m_dwMinorVersion; LPSTR m_pszW3Version; //For dealing with RPC error strings BOOL m_fAllocatedRPCStatusString; TCHAR m_achRPCErrorCodeBuffer[MAX_ERROR_CODE_LENGTH]; } ; // Description for an .htr variable class CInetInfoMap { public: LPSTR pName; INET_ELEM_TYPE iType; BOOL (CInetInfoConfigInfoMapper::*GetAddr)(LPVOID*); // called to indicate received update from client BOOL (CInetInfoConfigInfoMapper::*UpdateIndication)(); DWORD dwParam; // type dependant, used as size for AWCHAR } ; // // Dynamic buffer // class CExtBuff { public: CExtBuff::CExtBuff(); CExtBuff::~CExtBuff(); // Reset buffer : free memory, set length to 0 void Reset(); // Add a byte range BOOL CopyBuff( LPBYTE pB, UINT cNb ); // Reserve a byte range, returns ptr to start of range LPBYTE ReserveRange( UINT cNb ) { Extend( cNb ); return m_pB+m_cCurrent; } // Declare # of bytes consumed in the previously reserved range void SkipRange( UINT cNb ) { m_cCurrent += cNb; } // Declare that a zero-delimited string worth of bytes // was consumed in the previously reserved range void SkipString() { m_cCurrent += lstrlen((char*)m_pB+m_cCurrent); } // returns ptr to the buffer LPBYTE GetPtr() { return m_pB; } // returns length of the buffer UINT GetLen() { return m_cCurrent; } private: BOOL Extend( UINT ); LPBYTE m_pB; UINT m_cCurrent; UINT m_cAlloc; } ; #define EXTBUFF_INCALLOC 4096 class CInetInfoVerbMap; // Contains !Function execution context ( parameters ) class CVerbContext { public: CVerbContext(); ~CVerbContext(); CInetInfoMap* GetInfoMap( DWORD dwI ); DWORD GetNbInfoMap() { return m_cNbInfoMap; } LPSTR GetVerbName() { return m_pszVerbName; } DWORD Parse( CInetInfoConfigInfoMapper*, LPBYTE, DWORD ); private: BOOL AddInfoMap( CInetInfoMap* pI ); private: LPSTR m_pszVerbName; DWORD m_cNbInfoMap; DWORD m_cAllocedInfoMap; CInetInfoMap **m_pMaps; } ; // // Information specific to a given HTTP request // Handles data writes to the client // class CInetInfoRequest { public: CInetInfoRequest( EXTENSION_CONTROL_BLOCK*, CInetInfoConfigInfoMapper*, LPSTR, LPSTR ); ~CInetInfoRequest(); EXTENSION_CONTROL_BLOCK* GetECB() { return m_pECB; } CInetInfoConfigInfoMapper* GetMapper() { return m_pMapper; } LPSTR GetScr() { return m_pScr; } LPSTR GetParam() { return m_pParam; } LPSTR GetData() { return m_pData; } LPSTR GetDataRaw() { return m_pDataRaw; } CExtBuff* GetBuffer() { return &m_eb; } BOOL Init( LPSTR, int ); DWORD Done(); void SetHTTPStatus( DWORD dwS ) { m_dwHTTPStatus = dwS; } LPSTR HTTPStatusStringFromCode(); LPWSTR AnsiToUnicode( LPSTR ); // BOOL DoVerb( CVerbContext * ); LPSTR GetVarAsString( DWORD, BOOL* ); // BOOL AddDenyIPAccess(); BOOL DeleteDenyIPAccess(); BOOL PositionDenyIPAccess(); BOOL DefaultIsDenyIPAccess(); BOOL AddGrantIPAccess(); BOOL DeleteGrantIPAccess(); BOOL PositionGrantIPAccess(); BOOL DefaultIsGrantIPAccess(); // BOOL AddVirtDir(); BOOL DeleteVirtDir(); BOOL PositionVirtDir(); BOOL ChangePassword(); BOOL GetUserFlags(); BOOL SetHttpStatus(); // Default update function, no validation BOOL Update(); // clear var BOOL Clear(); // BOOL DisconnectUser(); BOOL DisconnectAll(); // BOOL GetStatus(); // BOOL ValidateDir(); BOOL CreateDir(); BOOL GenerateDirList(); // BOOL CheckForVirtDir(); BOOL AliasVirtDir(); BOOL HandleVirtDirRequest( int ); // private: EXTENSION_CONTROL_BLOCK *m_pECB; CExtBuff m_eb; // for result CInetInfoConfigInfoMapper *m_pMapper; LPSTR m_pScr; LPSTR m_pParam; // request body LPSTR m_pData; DWORD m_dwDataLen; LPSTR m_pDataRaw; DWORD m_dwDataRawLen; DWORD m_dwHTTPStatus; // CInetInfoVerbMap *m_apV; UINT m_cV; CVerbContext *m_pVerbContext; LPSTR m_pHeader; } ; class CInetInfoVerbMap { public: LPSTR pszName; BOOL (CInetInfoRequest::*pHandler)(); } ; class CStatusStringAndCode { public: DWORD dwStatus; UINT dwID; CHAR achStatus[128]; } ; // // Parse a .htr script, using a CInetInfoConfigInfoMapper object // to access variables and !Functions // class CInetInfoMerger { public: CInetInfoMerger(); ~CInetInfoMerger(); // BOOL Init(); BOOL Merge( CInetInfoRequest* ); private: BOOL GetToken( LPBYTE pVS, DWORD dwSize, LPBYTE* pStart, DWORD* dwL ); LPSTR AllocDup( CInetInfoConfigInfoMapper *pM, LPBYTE pDup, DWORD dwL ); CInetInfoMap *GetVarMap( CInetInfoConfigInfoMapper *pM, LPBYTE pVS, DWORD dwSize ); } ; class CInetInfoRequestMap; // Map an incoming request to a CInetInfoConfigInfoMapper, then // calls CInetInfoMerger class CInetInfoDispatcher { public: CInetInfoDispatcher(); ~CInetInfoDispatcher(); BOOL Init(); DWORD Invoke( EXTENSION_CONTROL_BLOCK* ); CInetInfoConfigInfoMapper* GetMapperFromString( LPSTR pszServ ); UINT GetNbH( VOID ) { return m_cH; } // Handle display for all screens BOOL HandleDisplay( CInetInfoRequest* ); // private: // maintain mapper, merger // CInetInfoConfigInfoMapper m_MapperHTTP; CInetInfoConfigInfoMapper m_MapperFTP; CInetInfoConfigInfoMapper m_MapperGOPHER; CInetInfoConfigInfoMapper m_MapperDNS; CInetInfoConfigInfoMapper m_MapperDIR; CInetInfoMerger m_IFMerger; CInetInfoRequestMap *m_apH; UINT m_cH; } ; class CInetInfoRequestMap { public: LPSTR pszName; BOOL (CInetInfoDispatcher::*pHandler)(CInetInfoRequest*); BOOL fIsStd; } ; // // .htr expression handling // class CExpr { public: CExpr( CInetInfoConfigInfoMapper*pM ) { m_pMap = pM; m_fMustFree = FALSE; m_pV = NULL; } ~CExpr() { if ( m_fMustFree ) delete [] m_pV; } DWORD Get( LPBYTE, DWORD ); LPSTR GetAsStr() { return m_pV; } DWORD GetAsDWORD(); INET_ELEM_TYPE GetType() { return m_iType; } private: CInetInfoConfigInfoMapper *m_pMap; LPSTR m_pV; DWORD m_dwV; INET_ELEM_TYPE m_iType; BOOL m_fMustFree; } ; // // relational operator mapping for the CRelop class // enum RELOP_TYPE { RELOP_INV, // invalid, must be present in front of array RELOP_EQ, // equal RELOP_NE, // not equal RELOP_GT, // greater than RELOP_LT, // less than RELOP_GE, // greater or equal RELOP_LE, // less or equal RELOP_RF, // reference RELOP_BA // bitwise AND }; // // .htr relational operator ( for %if constructs ) // class CRelop { public: CRelop( ) { m_iType = RELOP_INV; } ~CRelop() {} DWORD Get( LPBYTE, DWORD ); BOOL IsTrue( CExpr& v1, CExpr& v2, BOOL * pfValid ); private: RELOP_TYPE m_iType; } ; BOOL InlineFromTransparent( LPBYTE pData, DWORD *pdwDataLen, BOOL ); #endif