windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/nntp/adminsso/sessions.cpp
2020-09-26 16:20:57 +08:00

447 lines
9.5 KiB
C++

// sessions.cpp : Implementation of CnntpadmApp and DLL registration.
#include "stdafx.h"
#include "nntpcmn.h"
#include "oleutil.h"
#include "sessions.h"
#include "nntptype.h"
#include "nntpapi.h"
#include <lmapibuf.h>
// Must define THIS_FILE_* macros to use NntpCreateException()
#define THIS_FILE_HELP_CONTEXT 0
#define THIS_FILE_PROG_ID _T("Nntpadm.Sessions.1")
#define THIS_FILE_IID IID_INntpAdminSessions
/////////////////////////////////////////////////////////////////////////////
//
//
// Use a macro to define all the default methods
//
DECLARE_METHOD_IMPLEMENTATION_FOR_STANDARD_EXTENSION_INTERFACES(NntpAdminSessions, CNntpAdminSessions, IID_INntpAdminSessions)
STDMETHODIMP CNntpAdminSessions::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_INntpAdminSessions,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
CNntpAdminSessions::CNntpAdminSessions () :
m_cCount ( 0 ),
m_dwIpAddress ( 0 ),
m_dwPort ( 0 ),
m_dwAuthenticationType ( 0 ),
m_fIsAnonymous ( FALSE ),
m_dateStartTime ( 0 ),
m_pSessionInfo ( NULL ),
m_fSetCursor ( FALSE )
// CComBSTR's are initialized to NULL by default.
{
InitAsyncTrace ( );
m_iadsImpl.SetService ( MD_SERVICE_NAME );
m_iadsImpl.SetName ( _T("Sessions") );
m_iadsImpl.SetClass ( _T("IIsNntpSessions") );
}
CNntpAdminSessions::~CNntpAdminSessions ()
{
if ( m_pSessionInfo ) {
NetApiBufferFree ( m_pSessionInfo );
}
// All CComBSTR's are freed automatically.
TermAsyncTrace ( );
}
//
// IADs methods:
//
DECLARE_SIMPLE_IADS_IMPLEMENTATION(CNntpAdminSessions,m_iadsImpl)
//
// Properties:
//
STDMETHODIMP CNntpAdminSessions::get_Count ( long * plCount )
{
// Count should check to be sure the client enumerated.
return StdPropertyGet ( m_cCount, plCount );
}
STDMETHODIMP CNntpAdminSessions::get_Username ( BSTR * pstrUsername )
{
return StdPropertyGet ( m_strUsername, pstrUsername );
}
STDMETHODIMP CNntpAdminSessions::put_Username ( BSTR strUsername )
{
_ASSERT ( strUsername );
_ASSERT ( IS_VALID_STRING ( strUsername ) );
if ( strUsername == NULL ) {
return E_POINTER;
}
if ( lstrcmp ( strUsername, _T("") ) == 0 ) {
m_strUsername.Empty();
return NOERROR;
}
else {
return StdPropertyPut ( &m_strUsername, strUsername );
}
}
STDMETHODIMP CNntpAdminSessions::get_IpAddress ( BSTR * pstrIpAddress )
{
return StdPropertyGet ( m_strIpAddress, pstrIpAddress );
}
STDMETHODIMP CNntpAdminSessions::put_IpAddress ( BSTR strIpAddress )
{
_ASSERT ( strIpAddress );
_ASSERT ( IS_VALID_STRING ( strIpAddress ) );
if ( strIpAddress == NULL ) {
return E_POINTER;
}
if ( lstrcmp ( strIpAddress, _T("") ) == 0 ) {
m_strIpAddress.Empty();
m_dwIpAddress = 0;
return NOERROR;
}
else {
// The IP Address value has two properties, so keep them in sync.
StringToInetAddress ( strIpAddress, &m_dwIpAddress );
return StdPropertyPut ( &m_strIpAddress, strIpAddress );
}
}
STDMETHODIMP CNntpAdminSessions::get_IntegerIpAddress ( long * plIpAddress )
{
return StdPropertyGet ( m_dwIpAddress, plIpAddress );
}
STDMETHODIMP CNntpAdminSessions::put_IntegerIpAddress ( long lIpAddress )
{
HRESULT hr = NOERROR;
WCHAR wszAddress[100];
DWORD dwOldIpAddress = m_dwIpAddress;
hr = StdPropertyPut ( &m_dwIpAddress, lIpAddress );
if ( FAILED (hr) ) {
goto Exit;
}
// The IP Address value has two properties, so keep them in sync.
if ( !InetAddressToString ( lIpAddress, wszAddress, 100 ) ) {
hr = E_FAIL;
goto Exit;
}
m_strIpAddress = wszAddress;
if ( m_strIpAddress == NULL ) {
hr = E_OUTOFMEMORY;
goto Exit;
}
Exit:
if ( FAILED (hr) ) {
// We failed, so put back the old IP address:
m_dwIpAddress = dwOldIpAddress;
}
return hr;
}
STDMETHODIMP CNntpAdminSessions::get_Port ( long * plPort )
{
CHECK_FOR_SET_CURSOR ( m_pSessionInfo != NULL, m_fSetCursor );
return StdPropertyGet ( m_dwPort, plPort );
}
STDMETHODIMP CNntpAdminSessions::get_AuthenticationType ( long * plAuthenticationType )
{
CHECK_FOR_SET_CURSOR ( m_pSessionInfo != NULL, m_fSetCursor );
return StdPropertyGet ( m_dwAuthenticationType, plAuthenticationType );
}
STDMETHODIMP CNntpAdminSessions::get_IsAnonymous ( BOOL * pfAnonymous )
{
CHECK_FOR_SET_CURSOR ( m_pSessionInfo != NULL, m_fSetCursor );
return StdPropertyGet ( m_fIsAnonymous, pfAnonymous );
}
STDMETHODIMP CNntpAdminSessions::get_StartTime ( DATE * pdateStart )
{
CHECK_FOR_SET_CURSOR ( m_pSessionInfo != NULL, m_fSetCursor );
return StdPropertyGet ( m_dateStartTime, pdateStart );
}
//////////////////////////////////////////////////////////////////////
// Methods:
//////////////////////////////////////////////////////////////////////
STDMETHODIMP CNntpAdminSessions::Enumerate ( )
{
TraceFunctEnter ( "CNntpAdminSessions::Enumerate" );
// Variables:
HRESULT hr = NOERROR;
NET_API_STATUS err;
// Validate Server & Service Instance:
if ( m_iadsImpl.QueryInstance() == 0 ) {
return NntpCreateException ( IDS_NNTPEXCEPTION_SERVICE_INSTANCE_CANT_BE_ZERO );
}
// Enumerating loses the cursor:
m_fSetCursor = FALSE;
if ( m_pSessionInfo ) {
NetApiBufferFree ( m_pSessionInfo );
}
// Call the enumerate sessions RPC:
err = NntpEnumerateSessions (
m_iadsImpl.QueryComputer(),
m_iadsImpl.QueryInstance(),
&m_cCount,
&m_pSessionInfo
);
if ( err != NOERROR ) {
hr = RETURNCODETOHRESULT ( err );
goto Exit;
}
Exit:
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CNntpAdminSessions::GetNth ( long lIndex )
{
TraceFunctEnter ( "CNntpAdminSessions::GetNth" );
HRESULT hr = NOERROR;
FILETIME ftLocal;
SYSTEMTIME st;
WCHAR wszUsername[MAX_USER_NAME_LENGTH + 1];
WCHAR wszIpAddress[256];
DWORD cchCopied;
*wszUsername = NULL;
// Did we enumerate first?
if ( m_pSessionInfo == NULL ) {
return NntpCreateException ( IDS_NNTPEXCEPTION_DIDNT_ENUMERATE );
}
// Is the index valid?
if ( lIndex < 0 || (DWORD) lIndex >= m_cCount ) {
return NntpCreateException ( IDS_NNTPEXCEPTION_INVALID_INDEX );
}
//
// Copy the properties from m_pSessionInfo [ lIndex ] to member variables:
//
// ( CComBSTR handles free-ing of old properties )
FileTimeToLocalFileTime ( &m_pSessionInfo[ lIndex ].SessionStartTime, &ftLocal );
FileTimeToSystemTime ( &ftLocal, &st );
SystemTimeToVariantTime ( &st, &m_dateStartTime );
m_dwIpAddress = m_pSessionInfo[ lIndex ].IPAddress;
m_dwAuthenticationType = m_pSessionInfo[ lIndex ].AuthenticationType;
m_dwPort = m_pSessionInfo[ lIndex ].PortConnected;
m_fIsAnonymous = m_pSessionInfo[ lIndex ].fAnonymous;
cchCopied = MultiByteToWideChar (
CP_ACP,
MB_PRECOMPOSED | MB_USEGLYPHCHARS,
m_pSessionInfo[ lIndex ].UserName,
-1,
wszUsername,
MAX_USER_NAME_LENGTH
);
m_strUsername = wszUsername;
if ( m_strUsername == NULL ) {
hr = E_OUTOFMEMORY;
goto Exit;
}
InetAddressToString ( m_dwIpAddress, wszIpAddress, 256 );
m_strIpAddress = wszIpAddress;
if ( m_strIpAddress == NULL ) {
hr = E_OUTOFMEMORY;
goto Exit;
}
// GetNth sets the cursor:
m_fSetCursor = TRUE;
Exit:
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CNntpAdminSessions::Terminate ( )
{
TraceFunctEnter ( "CNntpAdminSessions::Terminate" );
HRESULT hr = NOERROR;
DWORD err = NOERROR;
char szAnsiUsername[ MAX_USER_NAME_LENGTH + 1];
char szAnsiIpAddress[ 50 ];
DWORD cchCopied;
szAnsiUsername[0] = NULL;
szAnsiIpAddress[0] = NULL;
// Validate Server & Service Instance:
if ( m_iadsImpl.QueryInstance() == 0 ) {
return NntpCreateException ( IDS_NNTPEXCEPTION_SERVICE_INSTANCE_CANT_BE_ZERO );
}
// Check Username & IpAddress parameters:
if ( m_strUsername == NULL && m_strIpAddress == NULL ) {
return NntpCreateException ( IDS_NNTPEXCEPTION_MUST_SUPPLY_USERNAME_OR_IPADDRESS );
}
// Translate the username & ipaddress to ANSI.
if ( m_strUsername != NULL ) {
cchCopied = WideCharToMultiByte (
CP_ACP,
0,
m_strUsername,
-1,
szAnsiUsername,
MAX_USER_NAME_LENGTH,
NULL,
NULL
);
}
if ( m_strIpAddress != NULL ) {
cchCopied = WideCharToMultiByte (
CP_ACP,
0,
m_strIpAddress,
-1,
szAnsiIpAddress,
50,
NULL,
NULL
);
}
// Call the TerminateSession RPC:
err = NntpTerminateSession (
m_iadsImpl.QueryComputer(),
m_iadsImpl.QueryInstance(),
m_strUsername ? szAnsiUsername : NULL,
m_strIpAddress ? szAnsiIpAddress : NULL
);
if ( err != NOERROR ) {
hr = RETURNCODETOHRESULT ( err );
goto Exit;
}
Exit:
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CNntpAdminSessions::TerminateAll ( )
{
TraceFunctEnter ( "CNntpAdminSessions::TerminateAll" );
// Did we enumerate first?
HRESULT hr = NOERROR;
DWORD ErrResult = NOERROR;
DWORD Err = NOERROR;
DWORD i;
// Validate Server & Service Instance:
if ( m_iadsImpl.QueryInstance() == 0 ) {
return NntpCreateException ( IDS_NNTPEXCEPTION_SERVICE_INSTANCE_CANT_BE_ZERO );
}
#if 0
// Make sure the user has enumerated:
if ( m_pSessionInfo == NULL ) {
return NntpCreateException ( IDS_NNTPEXCEPTION_DIDNT_ENUMERATE );
}
#endif
// For Each Session:
for ( i = 0; i < m_cCount; i++ ) {
// Call the terminate session RPC:
Err = NntpTerminateSession (
m_iadsImpl.QueryComputer(),
m_iadsImpl.QueryInstance(),
m_pSessionInfo[ i ].UserName,
NULL
);
if ( Err != 0 && ErrResult == 0 ) {
ErrResult = Err;
}
}
if ( ErrResult != NOERROR ) {
hr = RETURNCODETOHRESULT ( ErrResult );
goto Exit;
}
Exit:
TRACE_HRESULT(hr);
TraceFunctLeave ();
return hr;
}