572 lines
15 KiB
C++
572 lines
15 KiB
C++
/*++
|
||
|
||
Copyright (c) 1994 Microsoft Corporation
|
||
|
||
Module Name :
|
||
|
||
tsvcinfo.hxx
|
||
|
||
Abstract:
|
||
|
||
Declares the Internet Publishing services information object.
|
||
It was called as TSVC_INFO object. Later on this may be renamed as
|
||
IPSVC_INFO object.
|
||
This class provides the member function for all common functions
|
||
exported from Internet Services DLL used by server dlls for
|
||
internet services.
|
||
|
||
Author:
|
||
|
||
Murali R. Krishnan ( MuraliK ) 15-Nov-1994
|
||
|
||
Project:
|
||
|
||
Internet Services Common DLL
|
||
|
||
Revision History:
|
||
|
||
MuraliK 08-March-1995 Added TS_XPORT_CONNECTIONS object
|
||
MuraliK 28-July-1995 Derived IPSVC_INFO from ISVC_INFO
|
||
|
||
--*/
|
||
|
||
# ifndef _TSVCINFO_HXX_
|
||
# define _TSVCINFO_HXX_
|
||
|
||
/************************************************************
|
||
* Include Headers
|
||
************************************************************/
|
||
|
||
# include "isvcinfo.hxx"
|
||
# include "TsCache.hxx"
|
||
# include "mimemap.hxx"
|
||
# include "ipaccess.hxx"
|
||
# include "xportcon.hxx" // define TS_XPORT_CONNECTIONS
|
||
|
||
extern "C" {
|
||
# include <winsock.h> // required for SOCKADDR_IN
|
||
# include "atq.h"
|
||
};
|
||
|
||
|
||
|
||
/************************************************************
|
||
* Private Constants
|
||
************************************************************/
|
||
|
||
#define NULL_SERVICE_STATUS_HANDLE ( (SERVICE_STATUS_HANDLE ) NULL)
|
||
#define SERVICE_START_WAIT_HINT ( 10000) // milliseconds
|
||
#define SERVICE_STOP_WAIT_HINT ( 10000) // milliseconds
|
||
|
||
#define DEF_ACCEPTEX_RECV_BUFFER_SIZE (2000) // 2000 bytes
|
||
|
||
|
||
/************************************************************
|
||
* Type Definitions
|
||
************************************************************/
|
||
|
||
//
|
||
// These functions get called back with the pointer to tsvcInfo object
|
||
// as the context parameter.
|
||
//
|
||
typedef DWORD ( *PFN_SERVICE_SPECIFIC_INITIALIZE) ( LPVOID pContext);
|
||
|
||
typedef DWORD ( *PFN_SERVICE_SPECIFIC_CLEANUP) ( LPVOID pContext);
|
||
|
||
typedef VOID ( *PFN_SERVICE_CTRL_HANDLER) ( DWORD OpCode);
|
||
|
||
|
||
|
||
|
||
|
||
class TSVC_INFO : public ISVC_INFO {
|
||
|
||
public:
|
||
|
||
//
|
||
// Initialization/Tear down related methods
|
||
//
|
||
|
||
dllexp
|
||
TSVC_INFO(
|
||
IN LPCTSTR lpszServiceName,
|
||
IN CHAR * lpszModuleName,
|
||
IN CHAR * lpszRegParamKey,
|
||
IN WCHAR * lpwszAnonPasswordSecretName,
|
||
IN WCHAR * lpwszRootPasswordSecretName,
|
||
IN DWORD dwServiceId,
|
||
IN PFN_SERVICE_SPECIFIC_INITIALIZE pfnInitialize,
|
||
IN PFN_SERVICE_SPECIFIC_CLEANUP pfnCleanup
|
||
);
|
||
|
||
dllexp ~TSVC_INFO( VOID);
|
||
|
||
|
||
//
|
||
// VIRTUAL methods
|
||
//
|
||
|
||
dllexp virtual BOOL IsValid(VOID) const
|
||
{ return ( m_fValid && ISVC_INFO::IsValid() ); }
|
||
|
||
dllexp
|
||
virtual BOOL
|
||
ReadParamsFromRegistry( IN FIELD_CONTROL fc);
|
||
|
||
dllexp
|
||
virtual BOOL SetConfiguration( IN PVOID pConfig);
|
||
|
||
dllexp
|
||
virtual BOOL GetConfiguration( IN OUT PVOID pConfig);
|
||
|
||
dllexp
|
||
virtual DWORD
|
||
QueryCurrentServiceState( VOID) const
|
||
{ return ( m_svcStatus.dwCurrentState); }
|
||
|
||
|
||
//
|
||
// Parameter access methods. Note that string or non-trivial admin data
|
||
// items must have the read lock taken.
|
||
//
|
||
|
||
dllexp WCHAR * QueryAnonPasswordSecretName( VOID ) const
|
||
{ return m_pchAnonPasswordSecretName; }
|
||
|
||
dllexp WCHAR * QueryVirtualRootsSecretName( VOID ) const
|
||
{ return m_pchVirtualRootsSecretName; }
|
||
|
||
dllexp CHAR * QueryRoot( VOID ) const
|
||
{ return "/"; }
|
||
|
||
dllexp DWORD QueryAuthentication( VOID ) const
|
||
{ return m_dwAuthentication; }
|
||
|
||
dllexp short QueryPort( VOID ) const
|
||
{ return m_sPort; }
|
||
|
||
dllexp BOOL QueryLogAnonymous( VOID ) const
|
||
{ return m_fLogAnonymous; }
|
||
|
||
dllexp BOOL QueryLogNonAnonymous( VOID ) const
|
||
{ return m_fLogNonAnonymous; }
|
||
|
||
dllexp const CHAR * QueryAnonUserName( VOID ) const
|
||
{ TCP_ASSERT( m_cReadLocks ); return m_pchAnonUserName; }
|
||
|
||
dllexp const CHAR * QueryAnonUserPwd( VOID ) const
|
||
{ TCP_ASSERT( m_cReadLocks ); return m_achAnonUserPwd; }
|
||
|
||
dllexp LPCTSTR QueryDefaultLogonDomain(VOID) const
|
||
{ TCP_ASSERT( m_cReadLocks ); return m_pchDefaultLogonDomain; }
|
||
|
||
dllexp DWORD QueryLogonMethod( VOID ) const
|
||
{ return m_dwLogonMethod; }
|
||
|
||
|
||
dllexp DWORD QueryLogFileType( VOID ) const
|
||
{ return m_dwLogFileType; }
|
||
|
||
dllexp CHAR * QueryLogFileDirectory( VOID )
|
||
{ TCP_ASSERT( m_cReadLocks ); return m_pchLogFileDirectory; }
|
||
|
||
dllexp CHAR * QueryLogFileName( VOID )
|
||
{ TCP_ASSERT( m_cReadLocks ); return m_pchLogFileName; }
|
||
|
||
|
||
//
|
||
// IP Security related methods
|
||
//
|
||
|
||
dllexp BOOL
|
||
IPAccessCheck(
|
||
IN LPSOCKADDR_IN psockAddr,
|
||
OUT BOOL * pfGranted
|
||
)
|
||
{
|
||
return ( (m_fNoIPAccessChecks) ? ((*pfGranted = TRUE), TRUE) :
|
||
IPAccessCheckEx( psockAddr, pfGranted)
|
||
);
|
||
}
|
||
|
||
|
||
dllexp BOOL
|
||
IPAccessCheckEx(
|
||
IN LPSOCKADDR_IN psockAddr,
|
||
OUT BOOL * pfGranted
|
||
);
|
||
|
||
dllexp BOOL
|
||
SetIPSecurity(
|
||
IN HKEY hkey,
|
||
IN INETA_CONFIG_INFO * pConfig
|
||
);
|
||
|
||
|
||
//
|
||
// Service control related methods
|
||
//
|
||
|
||
dllexp DWORD
|
||
QueryServiceSpecificExitCode( VOID) const
|
||
{ return ( m_svcStatus.dwServiceSpecificExitCode); }
|
||
|
||
dllexp VOID
|
||
SetServiceSpecificExitCode( DWORD err)
|
||
{ m_svcStatus.dwServiceSpecificExitCode = err; }
|
||
|
||
dllexp DWORD
|
||
DelayCurrentServiceCtrlOperation( IN DWORD dwWaitHint)
|
||
{
|
||
return
|
||
UpdateServiceStatus(m_svcStatus.dwCurrentState,
|
||
m_svcStatus.dwWin32ExitCode,
|
||
m_svcStatus.dwCheckPoint,
|
||
dwWaitHint);
|
||
}
|
||
|
||
dllexp DWORD
|
||
UpdateServiceStatus(IN DWORD State,
|
||
IN DWORD Win32ExitCode,
|
||
IN DWORD CheckPoint,
|
||
IN DWORD WaitHint );
|
||
|
||
dllexp VOID
|
||
ServiceCtrlHandler( IN DWORD dwOpCode);
|
||
|
||
dllexp DWORD
|
||
StartServiceOperation(
|
||
IN PFN_SERVICE_CTRL_HANDLER pfnCtrlHandler
|
||
);
|
||
|
||
|
||
//
|
||
// Miscellaneous methods
|
||
//
|
||
|
||
|
||
dllexp TSVC_CACHE & GetTsvcCache( VOID) { return ( m_tsCache); }
|
||
|
||
dllexp PMIME_MAP QueryMimeMap( VOID) const { return ( m_pMimeMap); }
|
||
|
||
//
|
||
// Transport independent connections related functions.
|
||
//
|
||
// InitializeConnections( VOID)
|
||
// CleanupConnections( VOID)
|
||
//
|
||
// Both these functions will be made private to TSVC_INFO and
|
||
// will be invoked as part of the initialization of service
|
||
// StartServiceOperation() once all the services
|
||
// ( ftp and web move to use GUID based connections)
|
||
// Till then these functions should be called as part of user
|
||
// supplied initialization functions.
|
||
//
|
||
|
||
dllexp
|
||
BOOL InitializeConnections( IN PFN_CONNECT_CALLBACK pfnConnect,
|
||
IN ATQ_COMPLETION pfnConnectEx,
|
||
IN ATQ_COMPLETION pfnIOCompletion,
|
||
IN USHORT AdditionalPort = 0,
|
||
IN DWORD cbReceiveBuffSize
|
||
= DEF_ACCEPTEX_RECV_BUFFER_SIZE,
|
||
IN const CHAR * pszServiceDBName = NULL);
|
||
|
||
|
||
dllexp BOOL CleanupConnections( VOID);
|
||
|
||
dllexp TS_XPORT_CONNECTIONS * QueryTsConnections( VOID)
|
||
{ return &m_tsConnections; }
|
||
|
||
//
|
||
// Functions for initializing and cleaning up sockets and
|
||
// InterProcessCommunication RPC listeners.
|
||
//
|
||
// These also can move into automatic initialization in
|
||
// StartServiceOperation(). But that has to wait till other
|
||
// services ( which are tcpsvcs.dll clients) are configured
|
||
// to work perfectly.
|
||
//
|
||
|
||
dllexp DWORD InitializeSockets( VOID);
|
||
dllexp DWORD CleanupSockets( VOID);
|
||
|
||
# if DBG
|
||
|
||
virtual VOID Print( VOID) const;
|
||
|
||
# endif // DBG
|
||
|
||
private:
|
||
|
||
BOOL m_fValid;
|
||
|
||
DWORD m_fSocketsInitialized : 1;
|
||
|
||
SERVICE_STATUS m_svcStatus;
|
||
SERVICE_STATUS_HANDLE m_hsvcStatus;
|
||
HANDLE m_hShutdownEvent;
|
||
|
||
TSVC_CACHE m_tsCache;
|
||
PMIME_MAP m_pMimeMap; // read-only pointer to mimemap
|
||
|
||
//
|
||
// Call back functions for service specific data/function
|
||
//
|
||
|
||
PFN_SERVICE_SPECIFIC_INITIALIZE m_pfnInitialize;
|
||
PFN_SERVICE_SPECIFIC_CLEANUP m_pfnCleanup;
|
||
|
||
//
|
||
// Used for IP based Security
|
||
//
|
||
|
||
IPAccessList m_ipaDenyList;
|
||
IPAccessList m_ipaGrantList;
|
||
BOOL m_fNoIPAccessChecks;
|
||
|
||
//
|
||
// Server common administrable parameters
|
||
//
|
||
|
||
DWORD m_dwAuthentication; // Types Accepted/Required
|
||
SHORT m_sPort; // Socket port (host order)
|
||
|
||
BOOL m_fLogAnonymous;
|
||
BOOL m_fLogNonAnonymous;
|
||
CHAR * m_pchAnonUserName;
|
||
CHAR m_achAnonUserPwd[PWLEN + 1];
|
||
|
||
DWORD m_dwLogFileType;
|
||
CHAR * m_pchLogFileDirectory;
|
||
CHAR * m_pchLogFileName;
|
||
|
||
//
|
||
// Contains the anonymous user name
|
||
//
|
||
|
||
WCHAR * m_pchAnonPasswordSecretName;
|
||
|
||
//
|
||
// Contains the passwords for the virtual roots
|
||
//
|
||
|
||
WCHAR * m_pchVirtualRootsSecretName;
|
||
|
||
//
|
||
// logon method ( interactive or batch )
|
||
//
|
||
|
||
DWORD m_dwLogonMethod;
|
||
|
||
//
|
||
// logon default domain
|
||
//
|
||
|
||
CHAR * m_pchDefaultLogonDomain;
|
||
|
||
//
|
||
// For transport independent connections
|
||
//
|
||
TS_XPORT_CONNECTIONS m_tsConnections;
|
||
|
||
//
|
||
// Per server Initialization methods to be called once for
|
||
// each server
|
||
//
|
||
|
||
BOOL InitializeIPSecurity( VOID);
|
||
|
||
// Temporary stubbing
|
||
BOOL InitializeNTSecurity( VOID) const { return ( TRUE); }
|
||
|
||
//
|
||
// Per server Termination methods to be called when each
|
||
// server is shutdown
|
||
//
|
||
|
||
VOID TerminateCommonParams( VOID);
|
||
|
||
VOID TerminateIPSecurity( VOID);
|
||
|
||
VOID TerminateNTSecurity( VOID) const { return; } // temporary
|
||
|
||
DWORD ReportServiceStatus( VOID);
|
||
|
||
VOID InterrogateService( VOID );
|
||
|
||
VOID StopService( VOID );
|
||
|
||
VOID PauseService( VOID );
|
||
|
||
VOID ContinueService( VOID );
|
||
|
||
VOID ShutdownService( VOID );
|
||
|
||
}; // class TSVC_INFO
|
||
|
||
typedef TSVC_INFO FAR * LPTSVC_INFO;
|
||
|
||
//
|
||
// FROM 7/28/95 the object TSVC_INFO is renamed as IPSVC_INFO.
|
||
// We will update elsewhere after beta on Aug 15, 1995
|
||
// - MuraliK
|
||
//
|
||
|
||
typedef TSVC_INFO IPSVC_INFO;
|
||
|
||
typedef IPSVC_INFO FAR * PIPSVC_INFO;
|
||
|
||
|
||
/************************************************************
|
||
* Macros
|
||
************************************************************/
|
||
|
||
|
||
//
|
||
//
|
||
// Use the following macro once in outer scope of the file
|
||
// where we construct the global TsvcInfo object.
|
||
//
|
||
// Every client of TsvcInfo should define the following macro
|
||
// passing as parameter their global pointer to TsvcInfo object
|
||
// This is required to generate certain stub functions, since
|
||
// the service controller call-back functions do not return
|
||
// the context information.
|
||
//
|
||
// Also we define
|
||
// the global g_pTsvcInfo variable
|
||
// a static variable gs_pfnSch,
|
||
// which is a pointer to the local service control handler function.
|
||
//
|
||
# define _INTERNAL_DEFINE_TSVCINFO_INTERFACE( pTsvcInfo) \
|
||
\
|
||
LPTSVC_INFO g_pTsvcInfo; \
|
||
\
|
||
static VOID ServiceCtrlHandler( DWORD OpCode) \
|
||
{ \
|
||
ASSERT( pTsvcInfo != NULL); \
|
||
\
|
||
( pTsvcInfo)->ServiceCtrlHandler( OpCode); \
|
||
\
|
||
} \
|
||
\
|
||
static PFN_SERVICE_CTRL_HANDLER gs_pfnSch = ServiceCtrlHandler;
|
||
|
||
//
|
||
// Since all the services should use the global variable called g_pTsvcInfo
|
||
// this is a convenience macro for defining the interface for services
|
||
// structure
|
||
// Also required since a lot of macros depend upon the variable g_pTsvcInfo
|
||
//
|
||
# define DEFINE_TSVC_INFO_INTERFACE() \
|
||
_INTERNAL_DEFINE_TSVCINFO_INTERFACE( g_pTsvcInfo);
|
||
|
||
//
|
||
// Use the macro SERVICE_CTRL_HANDLER() to pass the parameter for
|
||
// service control handler when we initialize the TsvcInfo object
|
||
// ( in constructor for global TsvcInfo object)
|
||
//
|
||
# define SERVICE_CTRL_HANDLER() ( gs_pfnSch)
|
||
|
||
|
||
# include "tssec.hxx" // for security related functions
|
||
|
||
//
|
||
// Virtual roots stuff
|
||
//
|
||
|
||
BOOL
|
||
TsReadVirtualRoots(
|
||
IN const TSVC_CACHE & TSvcCache,
|
||
IN HKEY hKey,
|
||
IN LPTSVC_INFO psi
|
||
);
|
||
|
||
BOOL
|
||
TsSetVirtualRootsW(
|
||
IN const TSVC_CACHE & TSvcCache,
|
||
HKEY hkey,
|
||
IN INETA_CONFIG_INFO * pConfig
|
||
);
|
||
|
||
|
||
|
||
//
|
||
// Mime related functions
|
||
//
|
||
BOOL
|
||
InitializeMimeMap( VOID);
|
||
|
||
BOOL
|
||
CleanupMimeMap( VOID);
|
||
|
||
dllexp
|
||
BOOL
|
||
SelectMimeMappingForFileExt(
|
||
IN const LPTSVC_INFO pTsvcInfo,
|
||
IN const TCHAR * pchFilePath,
|
||
OUT STR * pstrMimeType, // optional
|
||
OUT STR * pstrIconFile = NULL); // optional
|
||
|
||
|
||
//
|
||
// Opens, Reads and caches the contents of the specified file
|
||
//
|
||
|
||
class CACHE_FILE_INFO
|
||
{
|
||
public:
|
||
CACHE_FILE_INFO()
|
||
{ pbData = NULL; }
|
||
|
||
BYTE * pbData;
|
||
DWORD dwCacheFlags;
|
||
|
||
};
|
||
|
||
typedef CACHE_FILE_INFO * PCACHE_FILE_INFO;
|
||
|
||
dllexp
|
||
BOOL
|
||
CheckOutCachedFile(
|
||
IN const CHAR * pchFile,
|
||
IN TSVC_CACHE * pTsvcCache,
|
||
IN HANDLE hToken,
|
||
OUT BYTE * * ppbData,
|
||
OUT DWORD * pcbData,
|
||
#ifdef JAPAN
|
||
OUT PCACHE_FILE_INFO pCacheFileInfo,
|
||
IN int nCharset
|
||
#else
|
||
OUT PCACHE_FILE_INFO pCacheFileInfo
|
||
#endif
|
||
);
|
||
|
||
dllexp
|
||
BOOL
|
||
CheckInCachedFile(
|
||
IN TSVC_CACHE * pTsvcCache,
|
||
IN PCACHE_FILE_INFO pCacheFileInfo
|
||
);
|
||
|
||
//
|
||
// Object cache manager related stuff
|
||
//
|
||
|
||
BOOL
|
||
InitializeCacheScavenger(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
TerminateCacheScavenger(
|
||
VOID
|
||
);
|
||
|
||
# endif // _TSVCINFO_HXX_
|
||
|
||
/************************ End of File ***********************/
|
||
|
||
|