windows-nt/Source/XPSP1/NT/shell/osshell/regwiz/regwizpost/rwpost.cpp
2020-09-26 16:20:57 +08:00

642 lines
17 KiB
C++

/////////////////////////////////////////
// File: RWPost.cpp
//
//////////////////////////////////////////
//#define STRICT
// Include Files
//
//Modifications :
//MDX1 03/11/99 Suresh
// In SendHTTPData() the MSID will be got from Cookie
// it will no longer be red from the Registry
//
//
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include "resource.h"
#include "Ithread.h"
#include "icw.h"
#include "util.h"
#include "tcp.h"
#include "rw_common.h"
#include "dconv.h"
#include "RwPost.h"
#include "mcm.h"
#include "ATK_RAS.h"
#include "tcp.h"
#define CONNECTION_TIME_OUT 1000 * 60
#define MAX_PROXY_AUTH_RETRY 2
static CInternetThread theInternetClass;
extern BOOL bOemDllLoaded;
extern HANDLE hOemDll;
static DWORD dwConnectionStatus = DIALUP_NOT_REQUIRED;
extern DWORD InvokePost(HWND hWnd,CInternetThread *p);
void InitializeInetThread(HINSTANCE hIns)
{
theInternetClass.Initialize(hIns);
}
//
// Returns
// DIALUP_NOT_REQUIRED : Use Network for tx
// DIALUP_REQUIRED : Use Dialupo for Tx
// RWZ_ERROR_NOTCPIP : No TCP/IPO
// CONNECTION_CANNOT_BE_ESTABLISHED : No modem or RAS setup
DWORD CheckInternetConnectivityExists(HWND hWnd, HINSTANCE hInstance)
{
static int iAuthRetry =0; // Retry count for the number of times to invoke Proxy Auth Dlg
static CHAR szProxyServer[MAX_PATH];
CHAR szProxySettings[MAX_PATH];
static int iChkInternetConnection = 0;
static DWORD sdwConnectionStatus = CONNECTION_CANNOT_BE_ESTABLISHED;
BOOL bNeedsReboot;
BOOL bRet;
DWORD dwPingStatus;
DWORD dwError= RWZ_NOERROR;
BOOL bProxyExists;
MODEMSTATUS mStatus;
DWORD dwTimeOut = CONNECTION_TIME_OUT;
int iProxyPort;
TCHAR szUserName[48] = _T(""),
szPassword[48] = _T("");
int iDisableAutoDial;
iDisableAutoDial=1;
if( sdwConnectionStatus == DIALUP_NOT_REQUIRED )
return DIALUP_NOT_REQUIRED;
if( sdwConnectionStatus == DIALUP_REQUIRED )
return DIALUP_REQUIRED;
// Disable Auto Dial only
// if there are not active Dialup Connection
//
if( ATK_IsRasDllOk() == RAS_DLL_LOADED )
{
if( IsDialupConnectionActive() )
{
iDisableAutoDial=0;
}
}
if(iDisableAutoDial)
{
DisableAutoDial();// Disable the Auto Dial
}
// Ping Current Host to check if TCP is
// installed /configured.
//
// if it is for the first time
// RWZ_PINGSTATUS_NOTCPIP : if no socket library or get hostname fails
// RWZ_PINGSTATUS_SUCCESS : if gethostname and ping is successful
// RWZ_PINGSTATUS_FAIL : if gethostname is succesful and ping via icmp fails
dwPingStatus = PingHost();
RW_DEBUG <<"\n Ping To Host (40: No TCP/IP 41: Success 42: Failure)=: " << dwPingStatus << flush;
if (dwPingStatus == RWZ_PINGSTATUS_NOTCPIP )
{
return RWZ_ERROR_NOTCPIP;
}
if( dwPingStatus == RWZ_PINGSTATUS_SUCCESS ){
bProxyExists = theInternetClass.GetSystemProxyServer(szProxyServer,MAX_PATH, &iProxyPort);
if (1 /*bProxyExists*/)
{
//theInternetClass.GetSystemProxySettings(szProxySettings,MAX_PATH);
//theInternetClass.SetSystemProxySettings(szProxySettings);
theInternetClass.SetSystemProxySettings("itgproxy");
if(1 /*Ping(szProxyServer)*/)
{
DWORD dwChkSite;
int iExit;
iExit =0;
RW_DEBUG <<"\n Ping Success" << flush;
theInternetClass.m_UserName[0] = _T('\0');
theInternetClass.m_Password[0] = _T('\0');
do {
dwChkSite = ChkSiteAvailability(hWnd, theInternetClass.m_strIISServer,
dwTimeOut,
(LPTSTR) theInternetClass.GetProxyServer(),
theInternetClass.m_UserName,theInternetClass.m_Password);
RW_DEBUG <<"\n After ChkSiteAvailability : " << dwChkSite << flush;
if( dwChkSite == RWZ_SITE_REQUIRES_AUTHENTICATION) {
if( iAuthRetry++ > MAX_PROXY_AUTH_RETRY) {
iExit =1;
}
// Modified on 2/4/98
// No Need to call our Proxy Auth Dlg insted use
// InternetErrorDlg() to invoke Auth Dlg
//if(GetProxyAuthenticationInfo(hInstance,ConvertToUnicode(szProxyServer),
// theInternetClass.m_UserName,theInternetClass.m_Password)) {
//}
}else {
// Exit because Connectivity is OK
iExit = 1;
}
}while(!iExit);
if( dwChkSite == RWZ_SITE_CONNECTED)
{
theInternetClass.m_dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG;
// Modified on 2/4/98to use the PRECONFIGIED rather than the PROXY specified by
// the user programatically
// The INTERNET_OPEN_TYPE_PROXY is changed .....
// This change is done in order for IE Auth Dlg
dwError = DIALUP_NOT_REQUIRED;
sdwConnectionStatus = DIALUP_NOT_REQUIRED;
dwConnectionStatus = DIALUP_NOT_REQUIRED;
goto ExitChk;
}
}
}
// No Procy so check for connection using existing LAN
// already opened Dialup Connection
// Set to NULL Proxy
//
theInternetClass.SetProxyServer("",80);// Set it To Null
theInternetClass.m_dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
if( ATK_IsRasDllOk() == RAS_DLL_LOADED )
{
if( IsDialupConnectionActive() )
{
// Already Dialup COnnection is Active
dwError = DIALUP_NOT_REQUIRED;
sdwConnectionStatus = DIALUP_NOT_REQUIRED;
dwConnectionStatus = DIALUP_NOT_REQUIRED;
goto ExitChk;
}
}
//
// Check Lan Connection
bRet = CheckHostName( ConvertToANSIString(theInternetClass.m_strIISServer));
if(bRet)
{
theInternetClass.m_dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
if(ChkSiteAvailability(NULL, theInternetClass.m_strIISServer,
dwTimeOut,
_T(""),szUserName,szPassword))
{
dwError = DIALUP_NOT_REQUIRED;
sdwConnectionStatus = DIALUP_NOT_REQUIRED;
dwConnectionStatus = DIALUP_NOT_REQUIRED;
goto ExitChk;
}
}
}
dwError = DIALUP_REQUIRED;
sdwConnectionStatus = DIALUP_REQUIRED;
dwConnectionStatus = DIALUP_NOT_REQUIRED;
theInternetClass.m_dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
RW_DEBUG << "\n Before MDMCHK..." << flush;
//MDMCHK:
// Install Modem
//
/**bNeedsReboot = theInternetClass.InstallModem(hWnd);
if(bNeedsReboot)
{
// ?????
// This will be abnormally terminating the Registration Wizard,
// So support modem installation in OS which dosent call for a reboot
}
**/
mStatus = MSDetectModemTAPI(hInstance);
if(mStatus != kMsModemOk )
{
dwError = CONNECTION_CANNOT_BE_ESTABLISHED;
sdwConnectionStatus = CONNECTION_CANNOT_BE_ESTABLISHED;
}
if(dwError == DIALUP_REQUIRED )
{
// Load RASPAI32.DLL and Exit if it can not be loaded
if( ATK_IsRasDllOk() != RAS_DLL_LOADED )
{
//
dwError = CONNECTION_CANNOT_BE_ESTABLISHED;
sdwConnectionStatus = CONNECTION_CANNOT_BE_ESTABLISHED;
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n RASAPI32.DLL NOT FOUND ...";
#endif
}
}
ExitChk:
#ifdef _LOG_IN_FILE
RW_DEBUG <<"\n Chk Connection ( 1 = via NTWK, 2 = DIalup , 3 = Problem) " << dwError << flush;
#endif
theInternetClass.UnLoadInetCfgDll();
return dwError;
}
//
// Returns
// DIALUP_NOT_REQUIRED : Use Network for tx
// DIALUP_REQUIRED : Use Dialupo for Tx
// RWZ_ERROR_NOTCPIP : No TCP/IPO
// CONNECTION_CANNOT_BE_ESTABLISHED : No modem or RAS setup
DWORD CheckInternetConnectivityExistsOldLogic(HWND hWnd, HINSTANCE hInstance)
{
static int iAuthRetry =0; // Retry count for the number of times to invoke Proxy Auth Dlg
static CHAR szProxyServer[MAX_PATH];
CHAR szProxySettings[MAX_PATH];
static int iChkInternetConnection = 0;
static DWORD sdwConnectionStatus = CONNECTION_CANNOT_BE_ESTABLISHED;
BOOL bNeedsReboot;
BOOL bRet;
DWORD dwPingStatus;
DWORD dwError= RWZ_NOERROR;
BOOL bProxyExists;
MODEMSTATUS mStatus;
DWORD dwTimeOut = CONNECTION_TIME_OUT;
int iProxyPort;
TCHAR szUserName[48] = _T(""),
szPassword[48] = _T("");
int iDisableAutoDial;
iDisableAutoDial=1;
if( sdwConnectionStatus == DIALUP_NOT_REQUIRED )
return DIALUP_NOT_REQUIRED;
if( sdwConnectionStatus == DIALUP_REQUIRED )
return DIALUP_REQUIRED;
// Disable Auto Dial only
// if there are not active Dialup Connection
//
if( ATK_IsRasDllOk() == RAS_DLL_LOADED )
{
if( IsDialupConnectionActive() )
{
iDisableAutoDial=0;
}
}
if(iDisableAutoDial)
{
DisableAutoDial();// Disable the Auto Dial
}
// Ping Current Host to check if TCP is
// installed /configured.
//
// if it is for the first time
// RWZ_PINGSTATUS_NOTCPIP : if no socket library or get hostname fails
// RWZ_PINGSTATUS_SUCCESS : if gethostname and ping is successful
// RWZ_PINGSTATUS_FAIL : if gethostname is succesful and ping via icmp fails
dwPingStatus = PingHost();
RW_DEBUG <<"\n Ping To Host (40: No TCP/IP 41: Success 42: Failure)=: " << dwPingStatus << flush;
if (dwPingStatus == RWZ_PINGSTATUS_NOTCPIP )
{
return RWZ_ERROR_NOTCPIP;
}
if( dwPingStatus == RWZ_PINGSTATUS_SUCCESS ){
bProxyExists = theInternetClass.GetSystemProxyServer(szProxyServer,MAX_PATH, &iProxyPort);
if (bProxyExists)
{
theInternetClass.GetSystemProxySettings(szProxySettings,MAX_PATH);
theInternetClass.SetSystemProxySettings(szProxySettings);
if(Ping(szProxyServer))
{
DWORD dwChkSite;
int iExit;
iExit =0;
RW_DEBUG <<"\n Ping Success" << flush;
theInternetClass.m_UserName[0] = _T('\0');
theInternetClass.m_Password[0] = _T('\0');
do {
dwChkSite = ChkSiteAvailability(hWnd, theInternetClass.m_strIISServer,
dwTimeOut,
(LPTSTR) theInternetClass.GetProxyServer(),
theInternetClass.m_UserName,theInternetClass.m_Password);
RW_DEBUG <<"\n After ChkSiteAvailability : " << dwChkSite << flush;
if( dwChkSite == RWZ_SITE_REQUIRES_AUTHENTICATION) {
if( iAuthRetry++ > MAX_PROXY_AUTH_RETRY) {
iExit =1;
}
// Modified on 2/4/98
// No Need to call our Proxy Auth Dlg insted use
// InternetErrorDlg() to invoke Auth Dlg
//if(GetProxyAuthenticationInfo(hInstance,ConvertToUnicode(szProxyServer),
// theInternetClass.m_UserName,theInternetClass.m_Password)) {
//}
}else {
// Exit because Connectivity is OK
iExit = 1;
}
}while(!iExit);
if( dwChkSite == RWZ_SITE_CONNECTED)
{
theInternetClass.m_dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG;
// Modified on 2/4/98to use the PRECONFIGIED rather than the PROXY specified by
// the user programatically
// The INTERNET_OPEN_TYPE_PROXY is changed .....
// This change is done in order for IE Auth Dlg
dwError = DIALUP_NOT_REQUIRED;
sdwConnectionStatus = DIALUP_NOT_REQUIRED;
dwConnectionStatus = DIALUP_NOT_REQUIRED;
goto ExitChk;
}
}
}
// No Procy so check for connection using existing LAN
// already opened Dialup Connection
// Set to NULL Proxy
//
theInternetClass.SetProxyServer("",80);// Set it To Null
theInternetClass.m_dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
if( ATK_IsRasDllOk() == RAS_DLL_LOADED )
{
if( IsDialupConnectionActive() )
{
// Already Dialup COnnection is Active
dwError = DIALUP_NOT_REQUIRED;
sdwConnectionStatus = DIALUP_NOT_REQUIRED;
dwConnectionStatus = DIALUP_NOT_REQUIRED;
goto ExitChk;
}
}
//
// Check Lan Connection
bRet = CheckHostName( ConvertToANSIString(theInternetClass.m_strIISServer));
if(bRet)
{
theInternetClass.m_dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
if(ChkSiteAvailability(NULL, theInternetClass.m_strIISServer,
dwTimeOut,
_T(""),szUserName,szPassword))
{
dwError = DIALUP_NOT_REQUIRED;
sdwConnectionStatus = DIALUP_NOT_REQUIRED;
dwConnectionStatus = DIALUP_NOT_REQUIRED;
goto ExitChk;
}
}
}
dwError = DIALUP_REQUIRED;
sdwConnectionStatus = DIALUP_REQUIRED;
dwConnectionStatus = DIALUP_NOT_REQUIRED;
theInternetClass.m_dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
RW_DEBUG << "\n Before MDMCHK..." << flush;
//MDMCHK:
// Install Modem
//
bNeedsReboot = theInternetClass.InstallModem(hWnd);
if(bNeedsReboot)
{
// ?????
// This will be abnormally terminating the Registration Wizard,
// So support modem installation in OS which dosent call for a reboot
}
mStatus = MSDetectModemTAPI(hInstance);
if(mStatus != kMsModemOk )
{
dwError = CONNECTION_CANNOT_BE_ESTABLISHED;
sdwConnectionStatus = CONNECTION_CANNOT_BE_ESTABLISHED;
}
if(dwError == DIALUP_REQUIRED )
{
// Load RASPAI32.DLL and Exit if it can not be loaded
if( ATK_IsRasDllOk() != RAS_DLL_LOADED )
{
//
dwError = CONNECTION_CANNOT_BE_ESTABLISHED;
sdwConnectionStatus = CONNECTION_CANNOT_BE_ESTABLISHED;
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n RASAPI32.DLL NOT FOUND ...";
#endif
}
}
ExitChk:
#ifdef _LOG_IN_FILE
RW_DEBUG <<"\n Chk Connection ( 1 = via NTWK, 2 = DIalup , 3 = Problem) " << dwError << flush;
#endif
theInternetClass.UnLoadInetCfgDll();
return dwError;
}
DWORD SendHTTPData(HWND hWnd, HINSTANCE hInstance)
{
char czB [MAX_BUFFER + 1]; // Buffer for Tx
DWORD dwBufSize = MAX_BUFFER;
DWORD dwOemBufSize;
DWORD dwRet;
_TCHAR szValue[256];
DWORD dwTimeOut = CONNECTION_TIME_OUT;
// MDX : 03/11/99
// Get MSID From Cookie , No need to check from Registry
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n*******Getting Cookie********\n"<< flush;
#endif
if(dwConnectionStatus == DIALUP_REQUIRED){
ChkSiteAvailability(hWnd, theInternetClass.m_strIISServer,
dwTimeOut,
NULL,
theInternetClass.m_UserName,
theInternetClass.m_Password);
}
else{
ChkSiteAvailability(hWnd, theInternetClass.m_strIISServer,
dwTimeOut,
(LPTSTR) theInternetClass.GetProxyServer(),
theInternetClass.m_UserName,
theInternetClass.m_Password);
}
SetMSID(hInstance);
dwRet = PrepareRegWizTxbuffer(hInstance, czB, &dwBufSize);
dwOemBufSize = MAX_BUFFER - dwBufSize;
dwRet = OemTransmitBuffer(hInstance,czB + dwBufSize,&dwOemBufSize);
dwBufSize += dwOemBufSize;
switch(dwRet)
{
case RWZ_NOERROR:
theInternetClass.SetBuffer(czB, dwBufSize+1);
theInternetClass.SetSSLFlag(TRUE);
dwRet = theInternetClass.PostData(hWnd);
// dwRet = InvokePost(hWnd, &theInternetClass);
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n PostData() returned: "<<dwRet << flush;
#endif
if( dwRet == RWZ_POST_FAILURE || dwRet == RWZ_POST_WITH_SSL_FAILURE)
{
// Try posting without SSL only for the modem
//if(dwConnectionStatus == DIALUP_REQUIRED)
//{
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Posting Failure : Sending Data without SSL" << flush;
#endif
theInternetClass.SetSSLFlag(FALSE);
dwRet = theInternetClass.PostData(hWnd);
//dwRet = InvokePost(hWnd, &theInternetClass);
//}
}
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Success ... \t" << dwRet << flush;
RW_DEBUG <<"\n\n\nBuffer\t\t*[" << czB << "]" << flush;
#endif
break;
case RWZ_NO_INFO_AVAILABLE :
#ifdef _LOG_IN_FILE
RW_DEBUG << _T("\n No Info Available ") << flush;
#endif
break;
case RWZ_INVALID_INFORMATION :
#ifdef _LOG_IN_FILE
RW_DEBUG << _T("\n Invalid Info " ) << flush;
#endif
break;
case RWZ_BUFFER_SIZE_INSUFFICIENT :
#ifdef _LOG_IN_FILE
RW_DEBUG <<_T("\n Buffer Length In Sufficient ...") << dwRet;
RW_DEBUG <<_T("\n\n\nBuffer\t\t") << czB;
#endif
break;
case RWZ_INTERNAL_ERROR :
#ifdef _LOG_IN_FILE
RW_DEBUG << _T("\n Internal Error ....") ;
#endif
default:
break;
}
#ifdef _LOG_IN_FILE
RW_DEBUG << flush;
#endif
return dwRet;
}
/*DWORD PostHTTPData(HINSTANCE hInstance)
{
DWORD dwRet = RWZ_POST_FAILURE;
DWORD dwRetStatus;
dwRetStatus = CheckWithDisplayInternetConnectivityExists(hInstance,2);
switch (dwRetStatus)
{
case DIALUP_NOT_REQUIRED :
if ((dwRet = PostDataWithWindowMessage(hInstance))
== RWZ_POST_SUCCESS){
;
}
else {
}
break;
case DIALUP_REQUIRED :
dwRet=DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIAL), NULL,FDlgProc,
(LPARAM)hInstance);
if(dwRet == -1 ) {
// Error in creating the Dialogue
}
switch ( dwRet) {
case RWZ_ERROR_LOCATING_MSN_FILES :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Signup :Error Locating MSN File " << flush;
#endif
break;
case RWZ_ERROR_LOCATING_DUN_FILES :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Signup :Error Locating DUN File " << flush;
#endif
break;
case RWZ_ERROR_MODEM_IN_USE :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Signup :Error Modem Already in use by another Application " << flush;
#endif
break;
case RWZ_ERROR_MODEM_CFG_ERROR:
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Signup :Modem Configuration Error " << flush;
#endif
case RWZ_ERROR_TXFER_CANCELLED_BY_USER :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Signup :HTTP Post Cancelled by User " << flush;
#endif
break;
case RWZ_ERROR_SYSTEMERROR :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Signup : System Resource Allocation Error " << flush;
#endif
break;
case RWZ_ERROR_NODIALTONE :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Signup : Modem Error No Dialtone " << flush;
#endif
break;
default :
break;
}
case CONNECTION_CANNOT_BE_ESTABLISHED :
default :
// It is unexpected . ? to Do
break;
}
return dwRet;
}
**/