//**************************************************************************** // // Module: ISIGNUP.EXE // File: import.c // Content: This file contains all the functions that handle importing // connection information. // History: // Sat 10-Mar-1996 23:50:40 -by- Mark MacLin [mmaclin] // this code started its life as ixport.c in RNAUI.DLL // my thanks to viroont // // Copyright (c) Microsoft Corporation 1991-1996 // //**************************************************************************** #include "isignup.h" #define MAXNAME 80 #define MAXIPADDRLEN 20 #define SIZE_ReadBuf 0x00008000 // 32K buffer size //#pragma data_seg(".rdata") static const TCHAR cszEntrySection[] = TEXT("Entry"); static const TCHAR cszEntryName[] = TEXT("Entry_Name"); static const TCHAR cszAlias[] = TEXT("Import_Name"); static const TCHAR cszML[] = TEXT("Multilink"); static const TCHAR cszPhoneSection[] = TEXT("Phone"); static const TCHAR cszDialAsIs[] = TEXT("Dial_As_Is"); static const TCHAR cszPhone[] = TEXT("Phone_Number"); static const TCHAR cszAreaCode[] = TEXT("Area_Code"); static const TCHAR cszCountryCode[] = TEXT("Country_Code"); static const TCHAR cszCountryID[] = TEXT("Country_ID"); static const TCHAR cszDeviceSection[] = TEXT("Device"); static const TCHAR cszDeviceType[] = TEXT("Type"); static const TCHAR cszDeviceName[] = TEXT("Name"); static const TCHAR cszDevCfgSize[] = TEXT("Settings_Size"); static const TCHAR cszDevCfg[] = TEXT("Settings"); static const TCHAR cszServerSection[] = TEXT("Server"); static const TCHAR cszServerType[] = TEXT("Type"); static const TCHAR cszSWCompress[] = TEXT("SW_Compress"); static const TCHAR cszPWEncrypt[] = TEXT("PW_Encrypt"); static const TCHAR cszNetLogon[] = TEXT("Network_Logon"); static const TCHAR cszSWEncrypt[] = TEXT("SW_Encrypt"); static const TCHAR cszNetBEUI[] = TEXT("Negotiate_NetBEUI"); static const TCHAR cszIPX[] = TEXT("Negotiate_IPX/SPX"); static const TCHAR cszIP[] = TEXT("Negotiate_TCP/IP"); static TCHAR cszDisableLcp[] = TEXT("Disable_LCP"); static const TCHAR cszIPSection[] = TEXT("TCP/IP"); static const TCHAR cszIPSpec[] = TEXT("Specify_IP_Address"); static const TCHAR cszIPAddress[] = TEXT("IP_address"); static const TCHAR cszServerSpec[] = TEXT("Specify_Server_Address"); static const TCHAR cszDNSAddress[] = TEXT("DNS_address"); static const TCHAR cszDNSAltAddress[] = TEXT("DNS_Alt_address"); static const TCHAR cszWINSAddress[] = TEXT("WINS_address"); static const TCHAR cszWINSAltAddress[]= TEXT("WINS_Alt_address"); static const TCHAR cszIPCompress[] = TEXT("IP_Header_Compress"); static const TCHAR cszWanPri[] = TEXT("Gateway_On_Remote"); static const TCHAR cszMLSection[] = TEXT("Multilink"); static const TCHAR cszLinkIndex[] = TEXT("Line_%s"); static const TCHAR cszScriptingSection[] = TEXT("Scripting"); static const TCHAR cszScriptName[] = TEXT("Name"); static const TCHAR cszScriptSection[] = TEXT("Script_File"); #if !defined(WIN16) static const TCHAR cszCustomDialerSection[] = TEXT("Custom_Dialer"); static const TCHAR cszAutoDialDLL[] = TEXT("Auto_Dial_DLL"); static const TCHAR cszAutoDialFunc[] = TEXT("Auto_Dial_Function"); #endif //!WIN16 static const TCHAR cszYes[] = TEXT("yes"); static const TCHAR cszNo[] = TEXT("no"); static const TCHAR cszUserSection[] = TEXT("User"); static const TCHAR cszUserName[] = TEXT("Name"); static const TCHAR cszPassword[] = TEXT("Password"); static const TCHAR cszNull[] = TEXT(""); struct { TCHAR *szType; DWORD dwType; DWORD dwfOptions; } aServerTypes[] = { {TEXT("PPP"), RASFP_Ppp, 0}, {TEXT("SLIP"), RASFP_Slip, 0}, {TEXT("CSLIP"), RASFP_Slip, RASEO_IpHeaderCompression}, {TEXT("RAS"), RASFP_Ras, 0} }; //#pragma data_seg() #define myisdigit(ch) (((ch) >= '0') && ((ch) <= '9')) #if !defined(WIN16) //+---------------------------------------------------------------------------- // // Function: ImportCustomDialer // // Synopsis: Import custom dialer information from the specified file // and save the information in the RASENTRY // // Arguments: lpRasEntry - pointer to a valid RASENTRY structure // szFileName - text file (in .ini file format) containing the // Custom Dialer information // // Returns: ERROR_SUCCESS - success otherwise a Win32 error // // History: ChrisK Created 7/11/96 // 8/12/96 ChrisK Ported from \\trango // //----------------------------------------------------------------------------- DWORD ImportCustomDialer(LPRASENTRY lpRasEntry, LPCTSTR szFileName) { // If there is an error reading the information from the file, or the entry // missing or blank, the default value (cszNull) will be used. GetPrivateProfileString(cszCustomDialerSection, cszAutoDialDLL, cszNull, lpRasEntry->szAutodialDll, MAX_PATH, szFileName); GetPrivateProfileString(cszCustomDialerSection, cszAutoDialFunc, cszNull, lpRasEntry->szAutodialFunc, MAX_PATH, szFileName); return ERROR_SUCCESS; } #endif //!WIN16 //**************************************************************************** // DWORD NEAR PASCAL StrToip (LPTSTR szIPAddress, LPDWORD lpdwAddr) // // This function converts a IP address string to an IP address structure. // // History: // Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont] // Cloned from SMMSCRPT. //**************************************************************************** LPCTSTR NEAR PASCAL StrToSubip (LPCTSTR szIPAddress, LPBYTE pVal) { LPCTSTR pszIP = szIPAddress; BYTE val = 0; // skip separators (non digits) while (*pszIP && !myisdigit(*pszIP)) { ++pszIP; } while (myisdigit(*pszIP)) { val = (val * 10) + (BYTE)(*pszIP - '0'); ++pszIP; } *pVal = val; return pszIP; } DWORD NEAR PASCAL StrToip (LPCTSTR szIPAddress, RASIPADDR *ipAddr) { LPCTSTR pszIP = szIPAddress; pszIP = StrToSubip(pszIP, &ipAddr->a); pszIP = StrToSubip(pszIP, &ipAddr->b); pszIP = StrToSubip(pszIP, &ipAddr->c); pszIP = StrToSubip(pszIP, &ipAddr->d); return ERROR_SUCCESS; } //**************************************************************************** // DWORD NEAR PASCAL ImportPhoneInfo(PPHONENUM ppn, LPCTSTR szFileName) // // This function imports the phone number. // // History: // Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** DWORD NEAR PASCAL ImportPhoneInfo(LPRASENTRY lpRasEntry, LPCTSTR szFileName) { TCHAR szYesNo[MAXNAME]; if (GetPrivateProfileString(cszPhoneSection, cszPhone, cszNull, lpRasEntry->szLocalPhoneNumber, RAS_MaxPhoneNumber, szFileName) == 0) { return ERROR_BAD_PHONE_NUMBER; }; lpRasEntry->dwfOptions &= ~RASEO_UseCountryAndAreaCodes; GetPrivateProfileString(cszPhoneSection, cszDialAsIs, cszNo, szYesNo, MAXNAME, szFileName); // Do we have to get country code and area code? // if (!lstrcmpi(szYesNo, cszNo)) { // If we cannot get the country ID or it is zero, default to dial as is // if ((lpRasEntry->dwCountryID = GetPrivateProfileInt(cszPhoneSection, cszCountryID, 0, szFileName)) != 0) { lpRasEntry->dwCountryCode = GetPrivateProfileInt(cszPhoneSection, cszCountryCode, 1, szFileName); GetPrivateProfileString(cszPhoneSection, cszAreaCode, cszNull, lpRasEntry->szAreaCode, RAS_MaxAreaCode, szFileName); lpRasEntry->dwfOptions |= RASEO_UseCountryAndAreaCodes; } } #ifdef WIN32 else { // bug in RasSetEntryProperties still checks area codes // even when RASEO_UseCountryAndAreaCodes is not set lstrcpy(lpRasEntry->szAreaCode, TEXT("805")); lpRasEntry->dwCountryID = 1; lpRasEntry->dwCountryCode = 1; } #endif return ERROR_SUCCESS; } //**************************************************************************** // DWORD NEAR PASCAL ImportServerInfo(PSMMINFO psmmi, LPTSTR szFileName) // // This function imports the server type name and settings. // // History: // Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** DWORD NEAR PASCAL ImportServerInfo(LPRASENTRY lpRasEntry, LPCTSTR szFileName) { TCHAR szYesNo[MAXNAME]; TCHAR szType[MAXNAME]; DWORD i; // Get the server type name // GetPrivateProfileString(cszServerSection, cszServerType, cszNull, szType, MAXNAME, szFileName); // need to convert the string into // one of the following values // RASFP_Ppp // RASFP_Slip Note CSLIP is SLIP with IP compression on // RASFP_Ras for (i = 0; i < sizeof(aServerTypes)/sizeof(aServerTypes[0]); ++i) { if (!lstrcmpi(aServerTypes[i].szType, szType)) { lpRasEntry->dwFramingProtocol = aServerTypes[i].dwType; lpRasEntry->dwfOptions |= aServerTypes[i].dwfOptions; break; } } // Get the server type settings // if (GetPrivateProfileString(cszServerSection, cszSWCompress, cszYes, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_SwCompression; } else { lpRasEntry->dwfOptions |= RASEO_SwCompression; }; }; if (GetPrivateProfileString(cszServerSection, cszPWEncrypt, cszNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_RequireEncryptedPw; } else { lpRasEntry->dwfOptions |= RASEO_RequireEncryptedPw; }; }; if (GetPrivateProfileString(cszServerSection, cszNetLogon, cszNo, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_NetworkLogon; } else { lpRasEntry->dwfOptions |= RASEO_NetworkLogon; }; }; if (GetPrivateProfileString(cszServerSection, cszSWEncrypt, cszNo, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_RequireDataEncryption; } else { lpRasEntry->dwfOptions |= RASEO_RequireDataEncryption; }; }; // Get the protocol settings // if (GetPrivateProfileString(cszServerSection, cszNetBEUI, cszNo, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfNetProtocols &= ~RASNP_NetBEUI; } else { lpRasEntry->dwfNetProtocols |= RASNP_NetBEUI; }; }; if (GetPrivateProfileString(cszServerSection, cszIPX, cszNo, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfNetProtocols &= ~RASNP_Ipx; } else { lpRasEntry->dwfNetProtocols |= RASNP_Ipx; }; }; if (GetPrivateProfileString(cszServerSection, cszIP, cszYes, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfNetProtocols &= ~RASNP_Ip; } else { lpRasEntry->dwfNetProtocols |= RASNP_Ip; }; }; if (GetPrivateProfileString(cszServerSection, cszDisableLcp, cszNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { lpRasEntry->dwfOptions |= RASEO_DisableLcpExtensions; } else { lpRasEntry->dwfOptions &= ~RASEO_DisableLcpExtensions; } }; return ERROR_SUCCESS; } //**************************************************************************** // DWORD NEAR PASCAL ImportIPInfo(LPTSTR szEntryName, LPTSTR szFileName) // // This function imports the TCP/IP information // // History: // Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** DWORD NEAR PASCAL ImportIPInfo(LPRASENTRY lpRasEntry, LPCTSTR szFileName) { TCHAR szIPAddr[MAXIPADDRLEN]; TCHAR szYesNo[MAXNAME]; // Import IP address information // if (GetPrivateProfileString(cszIPSection, cszIPSpec, cszNo, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { // The import file has IP address specified, get the IP address // lpRasEntry->dwfOptions |= RASEO_SpecificIpAddr; if (GetPrivateProfileString(cszIPSection, cszIPAddress, cszNull, szIPAddr, MAXIPADDRLEN, szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddr); }; } else { lpRasEntry->dwfOptions &= ~RASEO_SpecificIpAddr; }; }; // Import Server address information // if (GetPrivateProfileString(cszIPSection, cszServerSpec, cszNo, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { // The import file has server address specified, get the server address // lpRasEntry->dwfOptions |= RASEO_SpecificNameServers; if (GetPrivateProfileString(cszIPSection, cszDNSAddress, cszNull, szIPAddr, MAXIPADDRLEN, szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddrDns); }; if (GetPrivateProfileString(cszIPSection, cszDNSAltAddress, cszNull, szIPAddr, MAXIPADDRLEN, szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddrDnsAlt); }; if (GetPrivateProfileString(cszIPSection, cszWINSAddress, cszNull, szIPAddr, MAXIPADDRLEN, szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddrWins); }; if (GetPrivateProfileString(cszIPSection, cszWINSAltAddress, cszNull, szIPAddr, MAXIPADDRLEN, szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddrWinsAlt); }; } else { lpRasEntry->dwfOptions &= ~RASEO_SpecificNameServers; }; }; // Header compression and the gateway settings // if (GetPrivateProfileString(cszIPSection, cszIPCompress, cszYes, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_IpHeaderCompression; } else { lpRasEntry->dwfOptions |= RASEO_IpHeaderCompression; }; }; if (GetPrivateProfileString(cszIPSection, cszWanPri, cszYes, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_RemoteDefaultGateway; } else { lpRasEntry->dwfOptions |= RASEO_RemoteDefaultGateway; }; }; return ERROR_SUCCESS; } DWORD NEAR PASCAL ImportScriptFile( LPCTSTR lpszImportFile, LPTSTR szScriptFile, UINT cbScriptFile) { TCHAR szTemp[_MAX_PATH]; DWORD dwRet = ERROR_SUCCESS; // Get the script filename // if (GetPrivateProfileString(cszScriptingSection, cszScriptName, cszNull, szTemp, _MAX_PATH, lpszImportFile) != 0) { //!!! commonize this code //!!! make it DBCS compatible //!!! check for overruns //!!! check for absolute path name GetWindowsDirectory(szScriptFile, cbScriptFile); if (*CharPrev(szScriptFile, szScriptFile + lstrlen(szScriptFile)) != '\\') { lstrcat(szScriptFile, TEXT("\\")); } lstrcat(szScriptFile, szTemp); dwRet =ImportFile(lpszImportFile, cszScriptSection, szScriptFile); } return dwRet; } //**************************************************************************** // DWORD WINAPI RnaValidateImportEntry (LPTSTR) // // This function is called to validate an importable file // // History: // Wed 03-Jan-1996 09:45:01 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** DWORD WINAPI RnaValidateImportEntry (LPCTSTR szFileName) { TCHAR szTmp[MAX_PATH+1]; // Get the alias entry name // // 12/4/96 jmazner Normandy #12373 // If no such key, don't return ERROR_INVALID_PHONEBOOK_ENTRY, // since ConfigureClient always ignores that error code. return (GetPrivateProfileString(cszEntrySection, cszEntryName, cszNull, szTmp, MAX_PATH, szFileName) > 0 ? ERROR_SUCCESS : ERROR_NO_MATCH); } //**************************************************************************** // DWORD WINAPI RnaImportEntry (LPTSTR, LPBYTE, DWORD) // // This function is called to import an entry from a specified file // // History: // Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** DWORD ImportRasEntry (LPCTSTR szFileName, LPRASENTRY lpRasEntry) { DWORD dwRet; dwRet = ImportPhoneInfo(lpRasEntry, szFileName); if (ERROR_SUCCESS == dwRet) { // Get device type // GetPrivateProfileString(cszDeviceSection, cszDeviceType, cszNull, lpRasEntry->szDeviceType, RAS_MaxDeviceType, szFileName); // Get Server Type settings // dwRet = ImportServerInfo(lpRasEntry, szFileName); if (ERROR_SUCCESS == dwRet) { // Get IP address // dwRet = ImportIPInfo(lpRasEntry, szFileName); } } return dwRet; } //**************************************************************************** // DWORD WINAPI RnaImportEntry (LPTSTR, LPBYTE, DWORD) // // This function is called to import an entry from a specified file // // History: // Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** DWORD ImportConnection (LPCTSTR szFileName, LPICONNECTION lpConn) { DWORD dwRet; lpConn->RasEntry.dwSize = sizeof(RASENTRY); dwRet = RnaValidateImportEntry(szFileName); if (ERROR_SUCCESS != dwRet) { return dwRet; } GetPrivateProfileString(cszEntrySection, cszEntryName, cszNull, lpConn->szEntryName, RAS_MaxEntryName, szFileName); GetPrivateProfileString(cszUserSection, cszUserName, cszNull, lpConn->szUserName, UNLEN, szFileName); GetPrivateProfileString(cszUserSection, cszPassword, cszNull, lpConn->szPassword, PWLEN, szFileName); dwRet = ImportRasEntry(szFileName, &lpConn->RasEntry); #if !defined(WIN16) if (ERROR_SUCCESS == dwRet) { dwRet = ImportCustomDialer(&lpConn->RasEntry, szFileName); } #endif //!WIN16 if (ERROR_SUCCESS == dwRet) { // Import the script file // dwRet = ImportScriptFile(szFileName, lpConn->RasEntry.szScript, sizeof(lpConn->RasEntry.szScript)/sizeof(TCHAR)); } #if !defined(WIN16) dwRet = ConfigRasEntryDevice(&lpConn->RasEntry); switch( dwRet ) { case ERROR_SUCCESS: break; case ERROR_CANCELLED: InfoMsg(NULL, IDS_SIGNUPCANCELLED); // Fall through default: goto ImportConnectionExit; } #endif ImportConnectionExit: return dwRet; }