/************************************************************************* * * 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; }