253 lines
6.7 KiB
C
253 lines
6.7 KiB
C
|
|
/*************************************************************************
|
|
*
|
|
* QATTACH.C
|
|
*
|
|
* Do any neccessary attach user queries
|
|
*
|
|
* Copyright (c) 1995 Microsoft Corporation
|
|
*
|
|
* $Log: N:\NT\PRIVATE\NW4\NWSCRIPT\VCS\MAPLIST.C $
|
|
*
|
|
* Rev 1.1 10 Apr 1996 14:22:42 terryt
|
|
* Hotfix for 21181hq
|
|
*
|
|
* Rev 1.1 12 Mar 1996 19:53:58 terryt
|
|
* Relative NDS names and merge
|
|
*
|
|
* Rev 1.0 22 Jan 1996 16:49:24 terryt
|
|
* Initial revision.
|
|
*
|
|
*************************************************************************/
|
|
#include "common.h"
|
|
|
|
//
|
|
// 4X login script behavior for map commands to servers not in the
|
|
// logged in NDS tree that have not been ATTACH'ed is different from
|
|
// the 3X behavior.
|
|
//
|
|
// The 4X behavior is to always ask for a user name and password for
|
|
// these servers, doing the attach at that point. The user gets
|
|
// two trys.
|
|
//
|
|
// Since NT doesn't have an list of attached servers, and will try
|
|
// to connect to a volume with the default user name and password,
|
|
// a wrapper must be put around the MAP commands. This code
|
|
// must determine that a bindery connection will be made and that
|
|
// this server has not previously been MAP'ed or ATTACH'ed.
|
|
// The user will be always prompted for user name and password.
|
|
// The server will then be logged into with those credentials.
|
|
//
|
|
// One problem with the below is that it's not easy to tell that
|
|
// a connection "will be" made with the bindery, this is done in
|
|
// the redirector. So to simplify things the assumption is that
|
|
// only 3X servers use bindery connections. This means that
|
|
// 4X servers using bindery emulation on a different NDS tree will
|
|
// not always be asked for the user name and password.
|
|
//
|
|
// Already processed servers are kept in a list and marked as 4X or 3X
|
|
// for possible future use.
|
|
//
|
|
// The behavior for a 3X login depends on the LOGIN.EXE version.
|
|
// The old behavior is that you must always ATTACH before mapping.
|
|
// However, if you login to a 3X server with a 4X version LOGIN.EXE
|
|
// it will try to authenticate using your user name (and password)
|
|
// on the first attempt and ask for a password if that fails. The
|
|
// second attempt will ask for your user name. Since this 4X behavior
|
|
// is more forgiving (more scripts "work") that is the one being
|
|
// emulated.
|
|
//
|
|
|
|
typedef struct _SERVERLIST
|
|
{
|
|
char * ServerName;
|
|
unsigned int ServerType;
|
|
struct _SERVERLIST *pNextServer;
|
|
} SERVERLIST, *PSERVERLIST;
|
|
|
|
PSERVERLIST pMainList = NULL;
|
|
|
|
BOOL IsServerInAttachList( char *, unsigned int );
|
|
void AddServerToAttachList( char *, unsigned int );
|
|
int DoAttachProcessing( char * );
|
|
|
|
/*
|
|
* Scan the list for the server
|
|
*/
|
|
BOOL
|
|
IsServerInAttachList( char * Server, unsigned int ServerType )
|
|
{
|
|
PSERVERLIST pServerList = pMainList;
|
|
|
|
while ( pServerList != NULL )
|
|
{
|
|
if ( !_strcmpi( Server, pServerList->ServerName ) &&
|
|
( ServerType & pServerList->ServerType ) )
|
|
return TRUE;
|
|
pServerList = pServerList->pNextServer;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
* Add the server to the list of attached servers
|
|
*
|
|
* This is used during MAP's and ATTACH's
|
|
*/
|
|
void
|
|
AddServerToAttachList( char * Server, unsigned int ServerType )
|
|
{
|
|
PSERVERLIST pServerList;
|
|
|
|
pServerList = (PSERVERLIST) malloc( sizeof( SERVERLIST ) );
|
|
|
|
if ( pServerList == NULL )
|
|
{
|
|
DisplayMessage( IDR_NOT_ENOUGH_MEMORY );
|
|
return;
|
|
}
|
|
|
|
pServerList->ServerName = _strdup( Server );
|
|
pServerList->ServerType = ServerType;
|
|
pServerList->pNextServer = pMainList;
|
|
pMainList = pServerList;
|
|
}
|
|
|
|
/*
|
|
* Do any Attach processing
|
|
* Return error code. 0 is success.
|
|
* 880F is the special "attached failed" error
|
|
*/
|
|
|
|
int
|
|
DoAttachProcessing( char * PossibleServer )
|
|
{
|
|
unsigned int iRet = 0;
|
|
unsigned int conn;
|
|
char userName[MAX_NAME_LEN] = "";
|
|
char password[MAX_PASSWORD_LEN] = "";
|
|
BOOL AlreadyConnected = FALSE;
|
|
|
|
//
|
|
// Must have a server to process
|
|
//
|
|
if ( !*PossibleServer )
|
|
return iRet;
|
|
|
|
// See if this server has been processed before
|
|
// No since in doing a 4X server twice, and you only ask
|
|
// for the user name and password once.
|
|
|
|
if ( IsServerInAttachList( PossibleServer,
|
|
LIST_4X_SERVER | LIST_3X_SERVER ) )
|
|
return iRet;
|
|
|
|
// See if there is already a connection to the server
|
|
|
|
if ( NTIsConnected( PossibleServer ) )
|
|
AlreadyConnected = TRUE;
|
|
else
|
|
AlreadyConnected = FALSE;
|
|
|
|
// Try and attach to the server
|
|
|
|
iRet = NTAttachToFileServer( PossibleServer, &conn );
|
|
|
|
// If attach failed, return
|
|
|
|
if ( iRet )
|
|
return iRet;
|
|
|
|
// If this is a 4X server then add it to the list of attached
|
|
// servers. We don't want to do this again. 4X servers must
|
|
// use the NDS attachment anyway (or at least I don't see a
|
|
// way of telling that it's going to be a bindery emulation
|
|
// connection ahead of time).
|
|
|
|
if ( fNDS && Is40Server( conn ) )
|
|
{
|
|
AddServerToAttachList( PossibleServer, LIST_4X_SERVER );
|
|
DetachFromFileServer ( conn );
|
|
return iRet;
|
|
}
|
|
|
|
// Close that first connection
|
|
|
|
DetachFromFileServer ( conn );
|
|
|
|
// If we are already connected, don't mess with things
|
|
// The credentials can't be changed anyway
|
|
|
|
if ( AlreadyConnected )
|
|
{
|
|
AddServerToAttachList( PossibleServer, LIST_3X_SERVER );
|
|
return iRet;
|
|
}
|
|
|
|
// Ask for user name on an NDS login
|
|
//
|
|
// Use the current login name for a 3X login on the first attempt
|
|
|
|
if ( fNDS )
|
|
{
|
|
DisplayMessage(IDR_ENTER_LOGIN_NAME, PossibleServer);
|
|
if (!ReadName(userName))
|
|
return 0x880F;
|
|
}
|
|
else
|
|
{
|
|
strncpy( userName, LOGIN_NAME, sizeof( userName ) );
|
|
}
|
|
|
|
// Try to log the user in, asking for a password
|
|
|
|
iRet = Login( userName,
|
|
PossibleServer,
|
|
password,
|
|
TRUE );
|
|
|
|
// Clear out the password
|
|
// We don't need it again
|
|
|
|
memset( password, 0, sizeof( password ) );
|
|
|
|
// If failed, give the user one more chance
|
|
|
|
if ( iRet )
|
|
{
|
|
// Ask for user name
|
|
|
|
DisplayMessage(IDR_ENTER_LOGIN_NAME, PossibleServer);
|
|
if (!ReadName(userName))
|
|
return 0x880F;
|
|
|
|
// Try to log the user in
|
|
|
|
iRet = Login( userName,
|
|
PossibleServer,
|
|
password,
|
|
TRUE );
|
|
|
|
// Clear out the password
|
|
|
|
memset( password, 0, sizeof( password ) );
|
|
|
|
}
|
|
|
|
// Add servername to list of attached servers, marked as 3X
|
|
|
|
if ( !iRet )
|
|
{
|
|
AddServerToAttachList( PossibleServer, LIST_3X_SERVER );
|
|
}
|
|
else
|
|
{
|
|
iRet = 0x880F; // Special I am not attached error
|
|
}
|
|
|
|
return iRet;
|
|
|
|
}
|
|
|