1371 lines
36 KiB
C++
1371 lines
36 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows NT **/
|
|
/** Copyright(c) Microsoft Corp., 1993 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
ftpmgr.cxx
|
|
The file contains the classes for the FTP user sessions dialog
|
|
and the security dialog.
|
|
|
|
FILE HISTORY:
|
|
YiHsinS 17-Mar-1992 Created
|
|
*/
|
|
|
|
|
|
#define INCL_NET
|
|
#define INCL_NETLIB
|
|
#define INCL_WINDOWS
|
|
#define INCL_WINDOWS_GDI
|
|
#define INCL_NETERRORS
|
|
#define INCL_DOSERRORS
|
|
#include <lmui.hxx>
|
|
|
|
#if defined(DEBUG)
|
|
static const CHAR szFileName[] = __FILE__;
|
|
#define _FILENAME_DEFINED_ONCE szFileName
|
|
#endif
|
|
|
|
#define INCL_BLT_WINDOW
|
|
#define INCL_BLT_DIALOG
|
|
#define INCL_BLT_CONTROL
|
|
#define INCL_BLT_CLIENT
|
|
#define INCL_BLT_MSGPOPUP
|
|
#define INCL_BLT_EVENT
|
|
#define INCL_BLT_MISC
|
|
#define INCL_BLT_CC
|
|
#include <blt.hxx>
|
|
|
|
#include <uiassert.hxx>
|
|
#include <uitrace.hxx>
|
|
#include <dbgstr.hxx>
|
|
|
|
extern "C"
|
|
{
|
|
#include <winsock.h> // IN_ADDR, inet_ntoa
|
|
#include <lmapibuf.h> // For NetApiBufferFree
|
|
#include <ftpd.h> // For I_Ftp... APIs
|
|
#include <mnet.h>
|
|
#include <ftpmgr.h>
|
|
}
|
|
|
|
#include <lmoloc.hxx>
|
|
#include <ftpmgr.hxx>
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_USER_LBI::FTP_USER_LBI
|
|
|
|
SYNOPSIS: Constructor. Each LBI represents a user connected
|
|
to the FTP service on the given computer.
|
|
|
|
ENTRY: pszUserName - The name of the user
|
|
ulUserID - The internal ID used by the FTP
|
|
service to represent this user
|
|
fAnonymous - TRUE if the user logged on as anonymous
|
|
FALSE otherwise.
|
|
pszInternetAddress - The address of the host the user
|
|
is connected from.
|
|
pszConnectTimeString - The duration of time the user has
|
|
been connected
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
FTP_USER_LBI::FTP_USER_LBI( const TCHAR *pszUserName,
|
|
ULONG ulUserID,
|
|
BOOL fAnonymous,
|
|
const TCHAR *pszInternetAddress,
|
|
const TCHAR *pszConnectTimeString )
|
|
: _nlsUserName ( pszUserName ),
|
|
_ulUserID ( ulUserID ),
|
|
_fAnonymous ( fAnonymous ),
|
|
_nlsInternetAddress ( pszInternetAddress ),
|
|
_nlsConnectTimeString( pszConnectTimeString )
|
|
{
|
|
if ( QueryError() )
|
|
return;
|
|
|
|
APIERR err = NERR_Success;
|
|
|
|
//
|
|
// If the user name is username@mailhost-style string,
|
|
// print only the username portion ( everything left of @ )
|
|
//
|
|
|
|
ISTR istr( _nlsUserName );
|
|
if ( _nlsUserName.strchr( &istr, TCH('@')))
|
|
_nlsUserName.DelSubStr( istr );
|
|
|
|
if ( ( err = _nlsUserName.QueryError() )
|
|
|| ( err = _nlsInternetAddress.QueryError() )
|
|
|| ( err = _nlsConnectTimeString.QueryError() )
|
|
)
|
|
{
|
|
ReportError( err? err : ERROR_NOT_ENOUGH_MEMORY );
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_USER_LBI::FTP_USER_LBI
|
|
|
|
SYNOPSIS: Destructor
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
FTP_USER_LBI::~FTP_USER_LBI()
|
|
{
|
|
// Nothing to do for now
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_USER_LBI::Paint
|
|
|
|
SYNOPSIS: Redefine Paint() method of the LBI class.
|
|
|
|
ENTRY: plb - the listbox this LBI belongs to
|
|
hdc
|
|
prect
|
|
pGUILTT
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
VOID FTP_USER_LBI::Paint( LISTBOX *plb, HDC hdc, const RECT *prect,
|
|
GUILTT_INFO *pGUILTT ) const
|
|
{
|
|
FTP_USER_LISTBOX *plbUser = ( FTP_USER_LISTBOX *) plb;
|
|
|
|
STR_DTE strdteUserName( _nlsUserName );
|
|
STR_DTE strdteInternetAddress( _nlsInternetAddress );
|
|
STR_DTE strdteConnectTime( _nlsConnectTimeString );
|
|
|
|
DISPLAY_TABLE cdt( 4, plbUser->QueryColumnWidths() );
|
|
cdt[0] = (DMID_DTE *) (IsAnonymousUser()? plbUser->QueryAnonymousBitmap()
|
|
: plbUser->QueryUserBitmap());
|
|
cdt[1] = &strdteUserName;
|
|
cdt[2] = &strdteInternetAddress;
|
|
cdt[3] = &strdteConnectTime;
|
|
|
|
cdt.Paint( plb, hdc, prect, pGUILTT );
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_USER_LBI::Compare
|
|
|
|
SYNOPSIS: Redefine Compare() method of the LBI class.
|
|
We compare the user names of the two LBIs.
|
|
|
|
ENTRY: plbi - Pointer to the LBI to compare with
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
INT FTP_USER_LBI::Compare( const LBI *plbi ) const
|
|
{
|
|
return _nlsUserName._stricmp( *( ((FTP_USER_LBI *) plbi)->QueryUserName()));
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_USER_LBI::QueryLeadingChar
|
|
|
|
SYNOPSIS: Returns the leading character of the user name
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
WCHAR FTP_USER_LBI::QueryLeadingChar( VOID ) const
|
|
{
|
|
ISTR istr( _nlsUserName );
|
|
return _nlsUserName.QueryChar( istr );
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_USER_LISTBOX::FTP_USER_LISTBOX
|
|
|
|
SYNOPSIS: Constructor
|
|
|
|
ENTRY: powOwner - pointer to the owner window
|
|
cid - resource id of the listbox
|
|
pszServer - the server name to point to
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
FTP_USER_LISTBOX::FTP_USER_LISTBOX( OWNER_WINDOW *powOwner,
|
|
CID cid,
|
|
const TCHAR *pszServer )
|
|
: BLT_LISTBOX( powOwner, cid ),
|
|
_nlsServer ( pszServer ),
|
|
_nlsUnknown( IDS_UI_UNKNOWN ),
|
|
_pdmdteUser( NULL ),
|
|
_pdmdteAnonymous( NULL ),
|
|
_intlProf()
|
|
{
|
|
if ( QueryError() )
|
|
return;
|
|
|
|
APIERR err;
|
|
if ( ( err = _nlsServer.QueryError())
|
|
|| ( err = _nlsUnknown.QueryError())
|
|
|| ( err = _intlProf.QueryError())
|
|
|| (( _pdmdteUser = new DMID_DTE( BMID_USER )) == NULL )
|
|
|| (( _pdmdteAnonymous = new DMID_DTE( BMID_ANONYMOUS)) == NULL )
|
|
|| ( err = _pdmdteUser->QueryError())
|
|
|| ( err = _pdmdteAnonymous->QueryError())
|
|
|| ( err = DISPLAY_TABLE::CalcColumnWidths( _adx, 4, powOwner, cid,TRUE))
|
|
)
|
|
{
|
|
ReportError( err? err : ERROR_NOT_ENOUGH_MEMORY );
|
|
return;
|
|
}
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_USER_LISTBOX::~FTP_USER_LISTBOX
|
|
|
|
SYNOPSIS: Destructor
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
FTP_USER_LISTBOX::~FTP_USER_LISTBOX()
|
|
{
|
|
delete _pdmdteUser;
|
|
delete _pdmdteAnonymous;
|
|
|
|
_pdmdteUser = NULL;
|
|
_pdmdteAnonymous = NULL;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_USER_LISTBOX::Fill
|
|
|
|
SYNOPSIS: This method enumerates the users connected to the
|
|
FTP service and add them to the listbox.
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS: APIERR
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR FTP_USER_LISTBOX::Fill( VOID )
|
|
{
|
|
|
|
//
|
|
// Enumerate the users connected to the FTP service on the
|
|
// given server.
|
|
//
|
|
|
|
DWORD nCount = 0;
|
|
LPFTP_USER_INFO aUserInfo = NULL;
|
|
APIERR err = ::I_FtpEnumerateUsers( (LPWSTR) _nlsServer.QueryPch(),
|
|
&nCount,
|
|
&aUserInfo );
|
|
|
|
if ( err == NERR_Success )
|
|
{
|
|
NLS_STR nlsTimeString;
|
|
NLS_STR nlsInternetAddress;
|
|
if ( (( err = nlsTimeString.QueryError()) == NERR_Success )
|
|
&& (( err = nlsInternetAddress.QueryError()) == NERR_Success )
|
|
)
|
|
{
|
|
//
|
|
// Loop through all the users, create LBIs for each of them,
|
|
// and add them to the listbox.
|
|
//
|
|
LPFTP_USER_INFO pUserInfo = aUserInfo;
|
|
for ( INT i = 0; i < (INT) nCount; i++ )
|
|
{
|
|
err = QueryTimeString( pUserInfo->tConnect, &nlsTimeString );
|
|
if ( err != NERR_Success )
|
|
break;
|
|
|
|
IN_ADDR inaddr;
|
|
inaddr.s_addr = pUserInfo->inetHost;
|
|
CHAR *pszInternetAddress = ::inet_ntoa( inaddr );
|
|
if ( err = nlsInternetAddress.MapCopyFrom( pszInternetAddress) )
|
|
break;
|
|
|
|
const TCHAR * pszDisplayName = pUserInfo->pszUser;
|
|
|
|
if( ( pszDisplayName == NULL ) || ( *pszDisplayName == '\0' ) )
|
|
{
|
|
pszDisplayName = _nlsUnknown;
|
|
}
|
|
|
|
FTP_USER_LBI *plbi = new FTP_USER_LBI( pszDisplayName,
|
|
pUserInfo->idUser,
|
|
pUserInfo->fAnonymous,
|
|
nlsInternetAddress,
|
|
nlsTimeString );
|
|
|
|
|
|
if ( ( plbi == NULL )
|
|
|| ( err = plbi->QueryError() )
|
|
|| ( AddItem( plbi ) < 0 )
|
|
)
|
|
{
|
|
delete plbi;
|
|
plbi = NULL;
|
|
err = err? err : ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
|
|
++pUserInfo;
|
|
}
|
|
}
|
|
}
|
|
|
|
::NetApiBufferFree( (LPVOID) aUserInfo );
|
|
|
|
return err;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_USER_LISTBOX::Refresh
|
|
|
|
SYNOPSIS: This method refresh the contents of the listbox.
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS: APIERR
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR FTP_USER_LISTBOX::Refresh( VOID )
|
|
{
|
|
SetRedraw( FALSE );
|
|
|
|
//
|
|
// Delete all the original items in the listbox
|
|
//
|
|
DeleteAllItems();
|
|
|
|
//
|
|
// Call Fill() to enumerate the users
|
|
//
|
|
APIERR err = Fill();
|
|
|
|
Invalidate();
|
|
SetRedraw( TRUE );
|
|
|
|
return err;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_USER_LISTBOX::QueryTimeString
|
|
|
|
SYNOPSIS: This method turns the time duration to a displayable
|
|
string that complies with the window settings.
|
|
|
|
ENTRY: ulTime - The elapsed time
|
|
|
|
EXIT: pnlsTime - Pointer to the time display string returned.
|
|
|
|
RETURNS: APIERR
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
#define SECONDS_PER_DAY 86400
|
|
#define SECONDS_PER_HOUR 3600
|
|
#define SECONDS_PER_MINUTE 60
|
|
|
|
APIERR FTP_USER_LISTBOX::QueryTimeString( ULONG ulTime, NLS_STR *pnlsTime )
|
|
{
|
|
INT nDay = (INT) ulTime / SECONDS_PER_DAY;
|
|
ulTime %= SECONDS_PER_DAY;
|
|
INT nHour = (INT) ulTime / SECONDS_PER_HOUR;
|
|
ulTime %= SECONDS_PER_HOUR;
|
|
INT nMinute = (INT) ulTime / SECONDS_PER_MINUTE;
|
|
INT nSecond = (INT) ulTime % SECONDS_PER_MINUTE;
|
|
|
|
return _intlProf.QueryDurationStr( nDay, nHour, nMinute, nSecond, pnlsTime);
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SVCMGR_DIALOG::FTP_SVCMGR_DIALOG
|
|
|
|
SYNOPSIS: Constructor. This is the user sessions dialog of
|
|
FTP service manager.
|
|
|
|
ENTRY: hwndOwner - Hwnd of the owner window
|
|
pszServer - The name of the server to point to
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
FTP_SVCMGR_DIALOG::FTP_SVCMGR_DIALOG( HWND hwndOwner,
|
|
const TCHAR *pszServer )
|
|
: DIALOG_WINDOW( MAKEINTRESOURCE( IDD_FTPSVCMGRDLG), hwndOwner ),
|
|
_nlsServer( pszServer ),
|
|
_lbUser ( this, LB_USERS, pszServer ),
|
|
_pbuttonDisconnect ( this, BUTTON_DISCONNECT ),
|
|
_pbuttonDisconnectAll( this, BUTTON_DISCONNECT_ALL )
|
|
|
|
{
|
|
if ( QueryError() != NERR_Success )
|
|
return;
|
|
|
|
//
|
|
// Call Refresh() to fill the users in the listbox
|
|
//
|
|
APIERR err = NERR_Success;
|
|
if ( ((err = _nlsServer.QueryError()) != NERR_Success )
|
|
|| ((err = Refresh()) != NERR_Success )
|
|
)
|
|
{
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Set the caption to include the server name if the given
|
|
// server name is not an empty string.
|
|
//
|
|
if ( _nlsServer.QueryTextLength() > 0 )
|
|
{
|
|
RESOURCE_STR nlsCaption( IDS_FTP_USER_SESSIONS_ON_COMPUTER );
|
|
|
|
ISTR istr ( _nlsServer );
|
|
istr += 2; // Skip the two backslashes
|
|
ALIAS_STR nlsSrvWithoutPrefix( _nlsServer.QueryPch( istr ) );
|
|
|
|
if ( ((err = nlsCaption.QueryError()) != NERR_Success )
|
|
|| ((err = nlsCaption.InsertParams( 1, &nlsSrvWithoutPrefix))
|
|
!= NERR_Success)
|
|
)
|
|
{
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
SetText( nlsCaption );
|
|
}
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SVCMGR_DIALOG::~FTP_SVCMGR_DIALOG
|
|
|
|
SYNOPSIS: Destructor
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
FTP_SVCMGR_DIALOG::~FTP_SVCMGR_DIALOG()
|
|
{
|
|
// Nothing to do for now
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SVCMGR_DIALOG::Refresh
|
|
|
|
SYNOPSIS: Refresh the contents of the user listbox
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS: APIERR
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR FTP_SVCMGR_DIALOG::Refresh( VOID )
|
|
{
|
|
AUTO_CURSOR autocur;
|
|
|
|
APIERR err = _lbUser.Refresh();
|
|
if ( err == NERR_Success )
|
|
{
|
|
//
|
|
// Enable/Disable the Disconnect/DisconnectAll button
|
|
// depending on whether there are users in the listbox
|
|
// after the refresh.
|
|
//
|
|
_pbuttonDisconnect.Enable( ( _lbUser.QueryCount() > 0 )
|
|
&& (_lbUser.QuerySelCount() > 0 ));
|
|
_pbuttonDisconnectAll.Enable( _lbUser.QueryCount() > 0 );
|
|
}
|
|
_lbUser.ClaimFocus();
|
|
|
|
return err;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SVCMGR_DIALOG::OnCommand
|
|
|
|
SYNOPSIS: Process all commands for Security, Refresh,
|
|
Disconnect, Disconnect All buttons.
|
|
|
|
ENTRY: event - The event that occurred
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
BOOL FTP_SVCMGR_DIALOG::OnCommand( const CONTROL_EVENT &event )
|
|
{
|
|
APIERR err = NERR_Success;
|
|
switch ( event.QueryCid() )
|
|
{
|
|
case BUTTON_DISCONNECT:
|
|
{
|
|
INT *paSelItems = NULL;
|
|
BOOL fAtLeastDeleteOneUser = FALSE;
|
|
|
|
do { // not a loop
|
|
|
|
INT nCount = _lbUser.QuerySelCount();
|
|
|
|
if ( nCount == 0 )
|
|
{
|
|
// If no user is selected, just ignore the command.
|
|
break;
|
|
}
|
|
else if ( nCount > 1 )
|
|
{
|
|
// If more than one user is selected in the listbox,
|
|
// give a warning to the user to see if he/she
|
|
// really wanted to disconnect the selected users.
|
|
|
|
if ( ::MsgPopup( this,
|
|
IDS_CONFIRM_DISCONNECT_SELECTED_USERS,
|
|
MPSEV_WARNING, MP_YESNO, MP_NO ) != IDYES )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Get all the items selected in the listbox
|
|
//
|
|
paSelItems = (INT *) new BYTE[ sizeof(INT) * nCount ];
|
|
if ( paSelItems == NULL )
|
|
{
|
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
|
|
if ( err = _lbUser.QuerySelItems( paSelItems, nCount ))
|
|
break;
|
|
|
|
//
|
|
// Pop up an warning containing the user name to be
|
|
// disconnected if only one user is selected. Otherwise,
|
|
// we would have already pop up the warning.
|
|
//
|
|
FTP_USER_LBI *pusrlbi = _lbUser.QueryItem( paSelItems[0] );
|
|
if ( nCount == 1 )
|
|
{
|
|
if ( IDYES != ::MsgPopup( this,
|
|
IDS_CONFIRM_DISCONNECT_ONE_USER,
|
|
MPSEV_WARNING,
|
|
MP_YESNO,
|
|
*(pusrlbi->QueryUserName()),
|
|
MP_NO ))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Disconnect the selected users one by one. If an error
|
|
// occurred while disconnecting a user, we would break out
|
|
// of the loop and the rest of the users will not be
|
|
// disconnected.
|
|
//
|
|
AUTO_CURSOR autocur;
|
|
for ( INT i = 0; i < nCount; i++ )
|
|
{
|
|
pusrlbi = _lbUser.QueryItem( paSelItems[i] );
|
|
err = ::I_FtpDisconnectUser( (LPWSTR) _nlsServer.QueryPch(),
|
|
pusrlbi->QueryUserID());
|
|
|
|
if( err == NERR_UserNotFound )
|
|
{
|
|
//
|
|
// The user is no longer connected. Since this
|
|
// is what the admin wants anyway, we'll pretend
|
|
// it succeeded.
|
|
//
|
|
|
|
err = NERR_Success;
|
|
}
|
|
|
|
if ( err != NERR_Success )
|
|
break;
|
|
|
|
fAtLeastDeleteOneUser = TRUE;
|
|
}
|
|
|
|
|
|
} while ( FALSE );
|
|
|
|
if ( err )
|
|
::MsgPopup( this, err );
|
|
|
|
//
|
|
// If at least one user has be disconnected, refresh the listbox.
|
|
//
|
|
if ( fAtLeastDeleteOneUser )
|
|
{
|
|
if ( err = Refresh() )
|
|
::MsgPopup( this, err );
|
|
}
|
|
|
|
delete paSelItems;
|
|
break;
|
|
}
|
|
|
|
case BUTTON_DISCONNECT_ALL:
|
|
{
|
|
//
|
|
// Give a warning to the user to see if he really wants to
|
|
// disconnect all users.
|
|
//
|
|
if ( IDYES == ::MsgPopup( this,
|
|
IDS_CONFIRM_DISCONNECT_ALL_USERS,
|
|
MPSEV_WARNING, MP_YESNO, MP_NO ))
|
|
{
|
|
//
|
|
// Disconnect all Users and refresh the listbox
|
|
//
|
|
AUTO_CURSOR autocur;
|
|
if ( (err = ::I_FtpDisconnectUser(
|
|
(LPWSTR) _nlsServer.QueryPch(), 0)) == NERR_Success )
|
|
{
|
|
err = Refresh();
|
|
}
|
|
|
|
if ( err != NERR_Success )
|
|
::MsgPopup( this, err );
|
|
|
|
}
|
|
break;
|
|
}
|
|
|
|
case BUTTON_SECURITY:
|
|
{
|
|
//
|
|
// Show the security dialog.
|
|
//
|
|
AUTO_CURSOR autocur;
|
|
FTP_SECURITY_DIALOG *pdlg = new FTP_SECURITY_DIALOG( QueryHwnd(),
|
|
_nlsServer );
|
|
BOOL fOK = FALSE;
|
|
if ( ( pdlg == NULL )
|
|
|| ( err = pdlg->QueryError() )
|
|
|| ( err = pdlg->Process( &fOK ) )
|
|
)
|
|
{
|
|
err = err? err: ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
else if ( fOK )
|
|
{
|
|
// If the user clicks OK in the security dialog,
|
|
// we need to refresh the listbox since the service
|
|
// might blew some users away depending on the new
|
|
// read/write access.
|
|
err = Refresh();
|
|
}
|
|
|
|
if ( err != NERR_Success )
|
|
::MsgPopup( this, err );
|
|
|
|
delete pdlg;
|
|
pdlg = NULL;
|
|
break;
|
|
}
|
|
|
|
case BUTTON_REFRESH:
|
|
{
|
|
if ( (err = Refresh()) != NERR_Success )
|
|
::MsgPopup( this, err );
|
|
break;
|
|
}
|
|
|
|
case LB_USERS:
|
|
//
|
|
// Enable the Disconnect button only if the user has a selection
|
|
// in the listbox.
|
|
//
|
|
_pbuttonDisconnect.Enable( ( _lbUser.QueryCount() > 0 )
|
|
&& (_lbUser.QuerySelCount() > 0 ));
|
|
//
|
|
// Falls through
|
|
//
|
|
|
|
default:
|
|
return DIALOG_WINDOW::OnCommand( event );
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SVCMGR_DIALOG::QueryHelpContext
|
|
|
|
SYNOPSIS: Get the help context for this dialog
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS: ULONG - The help context for this dialog
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
ULONG FTP_SVCMGR_DIALOG::QueryHelpContext( VOID )
|
|
{
|
|
return HC_FTPSVCMGR_DIALOG;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SECURITY_DIALOG::FTP_SECURITY_DIALOG
|
|
|
|
SYNOPSIS: Constructor
|
|
|
|
ENTRY: hwndOwner - Hwnd of the owner window
|
|
pszServer - The name of the server name to point to
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
FTP_SECURITY_DIALOG::FTP_SECURITY_DIALOG( HWND hwndOwner,
|
|
const TCHAR *pszServer )
|
|
: DIALOG_WINDOW( MAKEINTRESOURCE( IDD_FTPSECDLG ), hwndOwner ),
|
|
_nlsServer ( pszServer ),
|
|
_fLocal ( TRUE ),
|
|
_cbPartition ( this, CB_PARTITION ),
|
|
_sltFileSysInfo ( this, SLT_FILESYSTEMTYPE ),
|
|
_checkbReadAccess ( this, CHECKB_READ ),
|
|
_checkbWriteAccess( this, CHECKB_WRITE ),
|
|
_ulReadAccess ( 0 ),
|
|
_ulWriteAccess ( 0 ),
|
|
_nCurrentDiskIndex( 0 )
|
|
{
|
|
if ( QueryError() )
|
|
return;
|
|
|
|
//
|
|
// Get security information on all drives
|
|
//
|
|
APIERR err;
|
|
if ( ((err = _nlsServer.QueryError()) != NERR_Success )
|
|
|| ((err = ::I_FtpQueryVolumeSecurity( (LPWSTR) _nlsServer.QueryPch(),
|
|
&_ulReadAccess, &_ulWriteAccess )) != NERR_Success )
|
|
|| ((err = AddDrives()) != NERR_Success )
|
|
)
|
|
{
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
|
|
if ( _cbPartition.QueryCount() > 0 )
|
|
{
|
|
//
|
|
// Select the first partition and show its information
|
|
//
|
|
_cbPartition.SelectItem( 0 );
|
|
if ((err = ShowCurrentPartitionInfo()) != NERR_Success )
|
|
{
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Popup an error if there are not partitions on the machine to
|
|
// configure.
|
|
ReportError( IDS_NO_PARTITION );
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Set the caption to include the server name if the given server name
|
|
// is not an empty string.
|
|
//
|
|
if ( _nlsServer.QueryTextLength() > 0 )
|
|
{
|
|
RESOURCE_STR nlsCaption( IDS_FTP_SERVER_SECURITY_ON_COMPUTER );
|
|
|
|
ISTR istr ( _nlsServer );
|
|
istr += 2; // Skip the two backslashes
|
|
ALIAS_STR nlsSrvWithoutPrefix( _nlsServer.QueryPch( istr ) );
|
|
|
|
if ( ((err = nlsCaption.QueryError()) != NERR_Success )
|
|
|| ((err = nlsCaption.InsertParams( 1, &nlsSrvWithoutPrefix))
|
|
!= NERR_Success)
|
|
)
|
|
{
|
|
ReportError( err );
|
|
return;
|
|
}
|
|
SetText( nlsCaption );
|
|
}
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SECURITY_DIALOG::~FTP_SECURITY_DIALOG
|
|
|
|
SYNOPSIS: Destructor
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
FTP_SECURITY_DIALOG::~FTP_SECURITY_DIALOG()
|
|
{
|
|
// Nothing to do for now
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SECURITY_DIALOG::AddDrivers
|
|
|
|
SYNOPSIS: Get all drivers on the selected server and add
|
|
them to the partition combo
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS: APIERR
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 6-Apr-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR FTP_SECURITY_DIALOG::AddDrives( VOID )
|
|
{
|
|
APIERR err = NERR_Success;
|
|
_fLocal = TRUE;
|
|
|
|
//
|
|
// Check if the given server is the local computer
|
|
//
|
|
if ( _nlsServer.QueryTextLength() > 0 )
|
|
{
|
|
LOCATION loc; // local machine
|
|
NLS_STR nlsLocalComputer;
|
|
|
|
if ( ( (err = nlsLocalComputer.QueryError()) != NERR_Success )
|
|
|| ( (err = loc.QueryError()) != NERR_Success )
|
|
|| ( (err = loc.QueryDisplayName(&nlsLocalComputer)) != NERR_Success)
|
|
)
|
|
{
|
|
return err;
|
|
}
|
|
|
|
ISTR istr( _nlsServer );
|
|
istr += 2; // Skip the two backslashes
|
|
|
|
if ( ::I_MNetComputerNameCompare( nlsLocalComputer,
|
|
_nlsServer.QueryPch( istr)) != 0 )
|
|
_fLocal = FALSE;
|
|
}
|
|
|
|
|
|
//
|
|
// If the machine is local, use GetDriveType to get all the possible
|
|
// drives.
|
|
//
|
|
if ( _fLocal )
|
|
{
|
|
//
|
|
// Add local drive letters to the combobox
|
|
//
|
|
TCHAR szDevice[4]; // This will contain A:, B:, ...
|
|
::strcpyf( szDevice, SZ("?:\\"));
|
|
|
|
for ( INT i = TCH('Z'); i >= TCH('A'); i-- )
|
|
{
|
|
szDevice[0] = (TCHAR)i;
|
|
szDevice[2] = TCH('\\');
|
|
ULONG ulRes= ::GetDriveType( szDevice );
|
|
|
|
if ( ( ulRes == DRIVE_FIXED )
|
|
|| ( ulRes == DRIVE_REMOVABLE )
|
|
|| ( ulRes == DRIVE_CDROM )
|
|
)
|
|
{
|
|
szDevice[2] = 0; // nuke the backslash at the end
|
|
if ( _cbPartition.AddItem( szDevice ) < 0 )
|
|
{
|
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//
|
|
// If the machine is not the local one, use MNetServerDiskEnum
|
|
// to get all the drives.
|
|
//
|
|
else
|
|
{
|
|
BYTE *pbBuffer = NULL;
|
|
UINT nEntriesRead = 0;
|
|
err = ::MNetServerDiskEnum( _nlsServer,
|
|
0,
|
|
&pbBuffer,
|
|
&nEntriesRead );
|
|
|
|
if ( err == NERR_Success )
|
|
{
|
|
UIASSERT( pbBuffer != NULL );
|
|
for ( UINT i = 0; i < nEntriesRead; i++ )
|
|
{
|
|
ALIAS_STR nls( (TCHAR *) pbBuffer );
|
|
if ( _cbPartition.AddItem( nls ) < 0 )
|
|
{
|
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
pbBuffer += nls.QueryTextSize();
|
|
}
|
|
}
|
|
|
|
::MNetApiBufferFree( &pbBuffer );
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SECURITY_DIALOG::ShowCurrentPartitionInfo
|
|
|
|
SYNOPSIS: Show the information ( i.e. file system information,
|
|
read access, write access ) of the current selected
|
|
partition
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS: APIERR
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
APIERR FTP_SECURITY_DIALOG::ShowCurrentPartitionInfo( VOID )
|
|
{
|
|
APIERR err = NERR_Success;
|
|
|
|
//
|
|
// Get the selected drive
|
|
//
|
|
NLS_STR nlsSelectedDrive;
|
|
NLS_STR nlsFileSysInfo;
|
|
if ( ((err = nlsSelectedDrive.QueryError())==NERR_Success)
|
|
&& ((err = _cbPartition.QueryItemText(&nlsSelectedDrive))==NERR_Success)
|
|
&& ((err = nlsSelectedDrive.AppendChar( TCH('\\')))==NERR_Success)
|
|
)
|
|
{
|
|
//
|
|
// Update _nCurrentDiskIndex
|
|
//
|
|
ISTR istr( nlsSelectedDrive );
|
|
_nCurrentDiskIndex = nlsSelectedDrive.QueryChar( istr ) - TCH('A');
|
|
|
|
//
|
|
// Show the security information
|
|
//
|
|
_checkbWriteAccess.Enable( TRUE );
|
|
_checkbReadAccess.SetCheck( (INT) _ulReadAccess &
|
|
( 0x1 <<_nCurrentDiskIndex ));
|
|
_checkbWriteAccess.SetCheck( (INT) _ulWriteAccess &
|
|
( 0x1 <<_nCurrentDiskIndex));
|
|
|
|
if ( _fLocal )
|
|
{
|
|
//
|
|
// Show the file system information
|
|
//
|
|
ULONG ulRes = ::GetDriveType( (LPWSTR) nlsSelectedDrive.QueryPch());
|
|
if (( ulRes == DRIVE_REMOVABLE ) || ( ulRes == DRIVE_CDROM ))
|
|
{
|
|
err = nlsFileSysInfo.Load( ulRes == DRIVE_REMOVABLE
|
|
? IDS_DRIVE_REMOVABLE
|
|
: IDS_DRIVE_CDROM );
|
|
|
|
//
|
|
// Disable Allow Write checkbox when the selection is a CDROM
|
|
//
|
|
if ( ulRes == DRIVE_CDROM )
|
|
_checkbWriteAccess.Enable( FALSE );
|
|
}
|
|
else
|
|
{
|
|
err = GetFileSystemInfo( nlsSelectedDrive, &nlsFileSysInfo);
|
|
|
|
// If we cannot get the file system info,
|
|
// then just show them as unknown type.
|
|
if ( err != NERR_Success )
|
|
err = nlsFileSysInfo.Load( IDS_UI_UNKNOWN );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
err = nlsFileSysInfo.Load( IDS_UI_UNKNOWN );
|
|
}
|
|
}
|
|
|
|
if ( err == NERR_Success )
|
|
_sltFileSysInfo.SetText( nlsFileSysInfo );
|
|
|
|
return err;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SECURITY_DIALOG::GetFileSystemInfo
|
|
|
|
SYNOPSIS: Get the file system information for the given drive
|
|
|
|
ENTRY: pszDrive - The drive to get information on
|
|
|
|
EXIT: pnlsFileSysInfo - Pointer to a string describing the
|
|
file system info of pszDrive
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
#define MAX_FILE_SYSTEM_INFO_LENGTH 20
|
|
|
|
APIERR FTP_SECURITY_DIALOG::GetFileSystemInfo( const TCHAR *pszDrive,
|
|
NLS_STR *pnlsFileSysInfo )
|
|
{
|
|
TCHAR szFileSysInfo[ MAX_FILE_SYSTEM_INFO_LENGTH ];
|
|
APIERR err = NERR_Success;
|
|
if ( ::GetVolumeInformation( (LPWSTR) pszDrive,
|
|
NULL, 0, NULL, NULL, NULL,
|
|
szFileSysInfo, MAX_FILE_SYSTEM_INFO_LENGTH) )
|
|
{
|
|
err = pnlsFileSysInfo->CopyFrom( szFileSysInfo );
|
|
}
|
|
else
|
|
{
|
|
err = ::GetLastError();
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SECURITY_DIALOG::SaveDriveSecurity
|
|
|
|
SYNOPSIS: Save the read/write access indicated by the current
|
|
read/write checkbox to the drive indexed by _nCurrentDiskIndex
|
|
( 0 represents A:, 1 represents B:,...).
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
VOID FTP_SECURITY_DIALOG::SaveDriveSecurity( VOID )
|
|
{
|
|
//
|
|
// Save the read access depending on the read access checkbox
|
|
//
|
|
if ( _checkbReadAccess.QueryCheck() )
|
|
_ulReadAccess |= ( 0x1 << _nCurrentDiskIndex );
|
|
else
|
|
_ulReadAccess &= ~( 0x1 << _nCurrentDiskIndex );
|
|
|
|
//
|
|
// Save the write access depending on the write access checkbox
|
|
//
|
|
if ( _checkbWriteAccess.QueryCheck() )
|
|
_ulWriteAccess |= ( 0x1 << _nCurrentDiskIndex );
|
|
else
|
|
_ulWriteAccess &= ~( 0x1 << _nCurrentDiskIndex );
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SECURITY_DIALOG::OnOK
|
|
|
|
SYNOPSIS: Set the security (read/write access) back to the service
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
BOOL FTP_SECURITY_DIALOG::OnOK( VOID )
|
|
{
|
|
//
|
|
// Store the information of the last selected partition
|
|
//
|
|
SaveDriveSecurity();
|
|
|
|
//
|
|
// Set the Read mask and Write mask of the partitions
|
|
//
|
|
APIERR err = ::I_FtpSetVolumeSecurity( (LPWSTR) _nlsServer.QueryPch(),
|
|
_ulReadAccess,
|
|
_ulWriteAccess);
|
|
if ( err != NERR_Success )
|
|
::MsgPopup( this, err );
|
|
else
|
|
Dismiss( TRUE );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SECURITY_DIALOG::OnCommand
|
|
|
|
SYNOPSIS: When the user change selection in the partition combo,
|
|
we must save the read/write access of the previous selected
|
|
drive and show the info on the currently selected drive.
|
|
|
|
ENTRY: event - The event that occurred
|
|
|
|
EXIT:
|
|
|
|
RETURNS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
BOOL FTP_SECURITY_DIALOG::OnCommand( const CONTROL_EVENT &event )
|
|
{
|
|
if ( ( event.QueryCid() == CB_PARTITION )
|
|
&& ( event.QueryCode() == CBN_SELCHANGE )
|
|
)
|
|
{
|
|
//
|
|
// Save read/write access of the previously selected partition
|
|
// NOTE: _nCurrentDiskIndex still points to the previously selected
|
|
// partition
|
|
//
|
|
SaveDriveSecurity();
|
|
|
|
//
|
|
// Show current selected disk info
|
|
//
|
|
APIERR err = ShowCurrentPartitionInfo();
|
|
if ( err != NERR_Success )
|
|
::MsgPopup( this, err );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return DIALOG_WINDOW::OnCommand( event );
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: FTP_SECURITY_DIALOG::QueryHelpContext
|
|
|
|
SYNOPSIS: Get the help context for this dialog
|
|
|
|
ENTRY:
|
|
|
|
EXIT:
|
|
|
|
RETURNS: ULONG - The help context for this dialog
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
YiHsinS 25-Mar-1993 Created
|
|
|
|
********************************************************************/
|
|
|
|
ULONG FTP_SECURITY_DIALOG::QueryHelpContext( VOID )
|
|
{
|
|
return HC_FTPSECURITY_DIALOG;
|
|
}
|