447 lines
9.5 KiB
C++
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;
|
|
}
|
|
|