Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

832 lines
19 KiB

#include <windows.h>
#include <stdio.h>
#include "AtkInternet.h"
#include "resource.h"
#include <ithread.h>
#include "icw.h"
#include "util.h"
#include "rw_common.h"
#include "ATK_inet.h"
#define RWZ_POST_MAX_RETRY 3
struct _MK
{
DWORD dwQuery;
char *s;
} ;
#define MK(x) {x,#x}
static _MK Queries[] =
{
MK(HTTP_QUERY_MIME_VERSION),
MK(HTTP_QUERY_CONTENT_TYPE),
MK(HTTP_QUERY_CONTENT_TRANSFER_ENCODING),
MK(HTTP_QUERY_CONTENT_ID),
MK(HTTP_QUERY_CONTENT_DESCRIPTION),
MK(HTTP_QUERY_CONTENT_LENGTH),
MK(HTTP_QUERY_ALLOW),
MK(HTTP_QUERY_PUBLIC),
MK(HTTP_QUERY_DATE),
MK(HTTP_QUERY_EXPIRES),
MK(HTTP_QUERY_LAST_MODIFIED),
MK(HTTP_QUERY_MESSAGE_ID),
MK(HTTP_QUERY_URI),
MK(HTTP_QUERY_DERIVED_FROM),
MK(HTTP_QUERY_COST),
MK(HTTP_QUERY_PRAGMA),
MK(HTTP_QUERY_VERSION),
MK(HTTP_QUERY_STATUS_CODE),
MK(HTTP_QUERY_STATUS_TEXT),
MK(HTTP_QUERY_RAW_HEADERS),
MK(HTTP_QUERY_RAW_HEADERS_CRLF),
MK(HTTP_QUERY_REQUEST_METHOD)
};
void QueryForInfo(HINTERNET );
void GetQueryInfo(HINTERNET ,DWORD ,char *);
typedef BOOL (WINAPI *LPICP)(HWND,BOOL,BOOL);
LPICP lpICP;
void QueryForInfo(HINTERNET hIntHandle)
{
int nSize = sizeof(Queries)/sizeof(_MK);
for(int i=0;i< nSize;i++)
{
GetQueryInfo(hIntHandle,Queries[i].dwQuery,Queries[i].s);
}
}
void GetQueryInfo(HINTERNET hIntHandle,DWORD dwQuery,char *s)
{
char dwbufQuery[512];
DWORD dwLengthBufQuery;
BOOL bQuery = ::ATK_HttpQueryInfo( hIntHandle,
dwQuery,
&dwbufQuery,
&dwLengthBufQuery,
NULL) ;
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n" << s << dwbufQuery << flush;
#endif
}
void _stdcall myCallback( IN HINTERNET hInternet,
IN DWORD dwContext,
IN DWORD dwInternetStatus,
IN LPVOID lpvStatusInformation OPTIONAL,
IN DWORD dwStatusInformationLength)
{
int iX= 100;
iX++;
switch(dwInternetStatus)
{
case INTERNET_STATUS_RESOLVING_NAME :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: RESOLVING_NAME\n" << flush;
#endif
break;
case INTERNET_STATUS_NAME_RESOLVED :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: INTERNET_STATUS_NAME_RESOLVED\n" << flush;
#endif
break;
case INTERNET_STATUS_CONNECTING_TO_SERVER :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: INTERNET_STATUS_CONNECTING_TO_SERVER\n" << flush;
#endif
break;
case INTERNET_STATUS_CONNECTED_TO_SERVER :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: INTERNET_STATUS_CONNECTED_TO_SERVER\n" << flush;
#endif
break;
case INTERNET_STATUS_SENDING_REQUEST :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: INTERNET_STATUS_SENDING_REQUEST\n" << flush;
#endif
break;
case INTERNET_STATUS_REQUEST_SENT :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: INTERNET_STATUS_REQUEST_SENT\n" << flush;
#endif
break;
case INTERNET_STATUS_RECEIVING_RESPONSE :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: INTERNET_STATUS_RECEIVING_RESPONSE\n" << flush;
#endif
break;
case INTERNET_STATUS_RESPONSE_RECEIVED :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: INTERNET_STATUS_RESPONSE_RECEIVED\n" << flush;
#endif
break;
case INTERNET_STATUS_REDIRECT :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: INTERNET_STATUS_REDIRECT\n" << flush;
#endif
break;
case INTERNET_STATUS_CLOSING_CONNECTION :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: INTERNET_STATUS_CLOSING_CONNECTION\n" << flush;
#endif
break;
case INTERNET_STATUS_CONNECTION_CLOSED :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: INTERNET_STATUS_CONNECTION_CLOSED\n" << flush;
#endif
break;
case INTERNET_STATUS_HANDLE_CREATED :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: INTERNET_STATUS_HANDLE_CREATED\n" << flush;
#endif
break;
case INTERNET_STATUS_REQUEST_COMPLETE :
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nCallback: INTERNET_STATUS_REQUEST_COMPLETE\n" << flush;
#endif
break;
default :
#ifdef _LOG_IN_FILE
RW_DEBUG <<"\n Callback : default " << flush;
#endif
}
}
void pickup(const char* in, char* out, int *ipProxy)
{
char czProzy[10]= "80";
char *pProxy;
int iCount ;
pProxy = czProzy;
if( *in == '/' )
in++;
if( *in == '/' )
in++;
while( *in && (*in != ':') && (*in != ';') )
*out++ = *in++;
*out = 0;
if(!*in)
return;
if ( *in == ':' || *in == ';' )
*in++;
iCount = 0;
while(*in && ( isspace(*in) || isdigit(*in)) )
{
if( isdigit(*in) && iCount < ((sizeof(czProzy) / sizeof(czProzy[0])) - 1) ) // leave room for the terminating NULL
{
*pProxy++ = *in;
iCount++;
}
*in++;
}
if(iCount)
*pProxy = 0;
*ipProxy = atoi(czProzy);
}
/* //remove all blabks immediately preceeding ':' and afterwards.
// eg. "HELLO WORLD : 80 " =>
// "HELLO WORLD:80"
Remove all blanks: No blanks are allowed in a machine name?
*/
void RemoveBlank(char *pszStr)
{
char *p, *q;
p = pszStr;
q = p;
for(;*p;*p++)
{
if(!isspace(*p))
{
*q++ = *p;
}
}
*q = '\0';
}
int getProxy(const char *in, char *out,int *piPort)
{
char *s;
*piPort = 0;
if( s= strstr(in, "http://") )
{
pickup(s+7,out,piPort);
}
else
if(s= strstr(in, "http=") )
{
pickup(s+5,out,piPort);
}
else
if( s= strstr(in, "http:") )
{
pickup(s+5,out,piPort);
}
else
if(s= strstr(in, "://") )
{
*out = 0;
return 0;
}
else
if(s= strstr(in, "=") )
{
*out = 0;
return 0;
}
else
pickup(in,out,piPort);
return 1;
}
// Constructor
//
CInternetThread::CInternetThread()
: m_hSession(NULL),
m_dwAccessType(PRE_CONFIG_INTERNET_ACCESS)
{
m_strProxyServer = NULL;
m_strBuffer = NULL;
m_strIISServer = NULL;
m_strPath = NULL;
m_hICWDllInstance = NULL ; // ICW DLL not loaded
}
// Closes the Internet session so InternetOpen will be called on next PostData.
//
void CInternetThread::ResetSession()
{
if (m_hSession != NULL)
{
::InternetCloseHandle(m_hSession);
m_hSession = NULL ;
}
}
//
//
CInternetThread::~CInternetThread()
{
if (m_strBuffer) delete []m_strBuffer;
if (m_strIISServer) delete []m_strIISServer;
if (m_strProxyServer) delete []m_strProxyServer;
if (m_UserName) delete [] m_UserName;
if (m_Password ) delete [] m_Password;
if (m_strPath) delete [] m_strPath;
//ResetSession();
if(m_hICWDllInstance)
{
FreeLibrary(m_hICWDllInstance);
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Freeing INETCFG.DLL " << flush;
#endif
m_hICWDllInstance = NULL;
}
}
void CInternetThread ::UnLoadInetCfgDll()
{
if( m_hICWDllInstance)
FreeLibrary(m_hICWDllInstance);
m_hICWDllInstance = NULL;
}
void CInternetThread::SetBuffer(LPSTR strBuffer)
{
if (m_strBuffer)
delete []m_strBuffer;
if (strBuffer)
{
m_dwBufferLen = strlen(strBuffer)+1;
m_strBuffer = (LPSTR) new CHAR[strlen(strBuffer)+1];
strcpy(m_strBuffer, strBuffer);
}
}
void CInternetThread::SetBuffer(LPSTR strBuffer, DWORD dwLen)
{
if (m_strBuffer)
delete []m_strBuffer;
if (strBuffer)
{
m_dwBufferLen = dwLen-1;
m_strBuffer = (LPSTR) new CHAR[m_dwBufferLen+1];
memset(m_strBuffer, '\0', m_dwBufferLen+1);
strncpy(m_strBuffer, strBuffer, m_dwBufferLen);
}
}
HINSTANCE CInternetThread:: LoadInetCfgDll()
{
if(m_hICWDllInstance)
{
return m_hICWDllInstance;
}
m_hICWDllInstance = LoadLibrary(_T("INETCFG.DLL"));
if (NULL == m_hICWDllInstance)
{
DisplayMessage("INETCFG.DLL LoadLibrary Failure", "");
}
return m_hICWDllInstance;
}
BOOL CInternetThread :: InstallModem(HWND hwnd)
{
RW_DEBUG << "\n---Inside InstallModem" << flush;
#ifdef _WINNT
/*
STARTUPINFOA startUpInfo;
PROCESS_INFORMATION PrcsInfo;
GetStartupInfoA(&startUpInfo);
DWORD dwPrS;
int iErr;
if( dwPrS= CreateProcessA( NULL ,
"rundll32.exe shell32.dll,Control_RunDLL modem.cpl", 0, 0,
FALSE,CREATE_NEW_CONSOLE, 0, 0,
&startUpInfo, &PrcsInfo) ) {
WaitForSingleObject(PrcsInfo.hProcess, INFINITE);
}
else
{
iErr = GetLastError();
RW_DEBUG << "\n Error In invoking Modem Init " << iErr << flush;
}
return 0;*/
BOOL bRet;
HINSTANCE hInstance = LoadLibrary(_T("modemui.dll"));
if(hInstance != NULL)
{
lpICP = (LPICP) GetProcAddress(hInstance,"InvokeControlPanel");
// Initialise the Control panel application
bRet = lpICP(hwnd,FALSE,FALSE);
FreeLibrary(hInstance);
}
else
{
bRet = FALSE;
RW_DEBUG << "\n Error Loading modemui.dll" << flush;
}
return bRet;
#else
HINSTANCE hInst;
BOOL bRestart=FALSE;
INETCONFIGSYSTEM fpS;
hInst = LoadInetCfgDll();
fpS = (INETCONFIGSYSTEM) GetProcAddress(hInst, "InetConfigSystem");
HRESULT hrs = (*fpS)(NULL,0x02,&bRestart);
DWORD dwR = GetLastError();
return bRestart;
#endif
}
/*
05/05/97 : Proxy returns as http://XX:port
*/
BOOL CInternetThread::GetSystemProxyServer(PCHAR szProxy,
DWORD dwBufferLength,
int *piProxyPort)
{
DWORD size = 0;
ATK_InternetQueryOption(NULL, INTERNET_OPTION_PROXY,NULL, &size);
#ifdef USE_ASTRATEK_WRAPPER
BYTE* buf = new BYTE[size];
#else
BYTE* buf = new BYTE[size* sizeof(_TCHAR)];
#endif
ATK_INTERNET_PROXY_INFO* ipi = (ATK_INTERNET_PROXY_INFO*)buf;
if (!ATK_InternetQueryOption(NULL, INTERNET_OPTION_PROXY, ipi, &size))
{
//MessageBox(NULL,_T("InternetQueryOption"),_T("False"),IDOK);
delete[] buf;
return FALSE;
}
else
{
if(ipi->dwAccessType != 3)
{
//MessageBox(NULL,_T("AccessType"),_T("False"),IDOK);
delete[] buf;
return FALSE;
}
else
{
//MessageBox(NULL,ConvertToUnicode(),ConvertToUnicode((LPSTR)ipi->lpszProxy),IDOK);
#ifdef USE_ASTRATEK_WRAPPER
if( getProxy(ipi->lpszProxy,szProxy,piProxyPort))
#else
if( getProxy(ConvertToANSIString(ipi->lpszProxy),szProxy,piProxyPort))
#endif
{
RemoveBlank(szProxy);
// MessageBox(NULL,_T("after getproxy"),_T("TRUE"),IDOK);
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Actual HTTP Proxy [" <<szProxy << "] Port:" << *piProxyPort << flush;
#endif
delete[] buf;
return TRUE;
}
else
{
//MessageBox(NULL,_T("GetProxy"),_T("False"),IDOK);
delete[] buf;
return FALSE;
}
}
}
}
//
// This function gets the Actual proxy settings string
void CInternetThread :: GetSystemProxySettings( PCHAR szProxy,
DWORD dwBufferLength)
{
DWORD size = 0;
ATK_InternetQueryOption(NULL, INTERNET_OPTION_PROXY,NULL, &size);
#ifdef USE_ASTRATEK_WRAPPER
BYTE* buf = new BYTE[size];
#else
BYTE* buf = new BYTE[size* sizeof(_TCHAR)];
#endif
ATK_INTERNET_PROXY_INFO* ipi = (ATK_INTERNET_PROXY_INFO*)buf;
ATK_InternetQueryOption(NULL, INTERNET_OPTION_PROXY, ipi, &size);
#ifdef USE_ASTRATEK_WRAPPER
strcpy(szProxy,ipi->lpszProxy);
#else
strcpy(szProxy,ConvertToANSIString(ipi->lpszProxy));
#endif
dwBufferLength = strlen(szProxy) +1;
delete[] buf;
}
//
// IN Parameters:
// LPSTR strProxyServer : Proxy Server name in ANSI char
// int iProxyPort : Proxy Server Port
//
void CInternetThread::SetSystemProxySettings(LPSTR strProxyServer)
{
TCHAR *pProxy;
if (m_strProxyServer)
delete []m_strProxyServer;
if (strProxyServer)
{
pProxy = ConvertToUnicode(strProxyServer);
m_strProxyServer = (LPTSTR) new TCHAR[_tcslen(pProxy)+11];
_tcscpy(m_strProxyServer, pProxy);
}
}
// IN Parameters:
// LPSTR strProxyServer : Proxy Server name in ANSI char
// int iProxyPort : Proxy Server Port
void CInternetThread::SetProxyServer(LPSTR strProxyServer, int iProxyPort)
{
TCHAR czTemp[10];
TCHAR *pProxy;
if (m_strProxyServer)
delete []m_strProxyServer;
if (strProxyServer)
{
pProxy = ConvertToUnicode(strProxyServer);
m_strProxyServer = (LPTSTR) new TCHAR[_tcslen(pProxy)+11];
_tcscpy(m_strProxyServer, pProxy);
_stprintf(czTemp,_T(":%d"),iProxyPort);
_tcscat(m_strProxyServer,czTemp);
}
}
void CInternetThread::SetIISServer(LPTSTR strIISServer)
{
if (m_strIISServer)
delete []m_strIISServer;
if (strIISServer)
{
m_strIISServer = (LPTSTR) new TCHAR[_tcslen(strIISServer)+1];
_tcscpy(m_strIISServer, strIISServer);
}
}
void CInternetThread::SetServerPath(LPTSTR strPath)
{
if (m_strPath)
delete []m_strPath;
if (strPath)
{
m_strPath = (LPTSTR) new TCHAR[_tcslen(strPath)+1];
_tcscpy(m_strPath, strPath);
}
}
// Verify that rAddress is partially valid. Start the worker thread to get a web page.
DWORD CInternetThread::PostData(HWND hWnd)
{
int iRetryCount;
UINT uiRetVal;
int iExit;
iExit =0;
iRetryCount = 0;
uiRetVal = RWZ_POST_FAILURE;
if (!m_strIISServer || !m_strPath)
{
DisplayMessage ("IIS Server path not found ");
}
/*
do {
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nRetry Posting " << iRetryCount+1 << flush;
#endif
uiRetVal = _PostDataWorker();
if(uiRetVal != RWZ_POST_SUCCESS) {
iRetryCount++;
}else {
iExit = 1;
}
if( uiRetVal == RWZ_POST_WITH_SSL_FAILURE) {
// Do not Retry if it is an SSL problem
iExit= 1;
}
if(iRetryCount > RWZ_POST_MAX_RETRY ){
iExit = 1;
}
}while(!iExit);
**/
uiRetVal = _PostDataWorker(hWnd);
return uiRetVal;
}
// This is the thread function.
//
UINT CInternetThread::PostDataThread(LPVOID pvThread)
{
CInternetThread* pInternetThread = (CInternetThread*) pvThread ;
if (pInternetThread == NULL || (!pInternetThread->m_strIISServer))
{
return FALSE;
}
return pInternetThread->_PostDataWorker(NULL) ;
}
// This is where all of the actually Internet work is done.
UINT CInternetThread::_PostDataWorker(HWND hWnd)
{
UINT uiResult = RWZ_POST_FAILURE;
BOOL bRead;
HINTERNET hConnect;
HINTERNET hHttpFile;
_TCHAR szHeader[240];
BOOL bSendRequest;
DWORD dwCL=0;
DWORD dwLengthBufQuery ;
DWORD dwInfoLevel;
BOOL bQuery;
CHAR pBuffer [MAX_PATH] ; // ?? decide with Steve on Bugffer Sz
DWORD dwBytesRead ;
// Variables for the SSL / Normal operation
INTERNET_PORT nServerPort;
DWORD dwFlags;
// Added for Proxy Server
LPTSTR pUserName;
LPTSTR pPassword;
LPTSTR pProxyServerName;
pUserName =_T("");
pPassword =_T("");
pProxyServerName =NULL;
if(m_bPostWithSSL){
nServerPort = INTERNET_DEFAULT_HTTPS_PORT;
dwFlags = INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_SECURE;
}else {
nServerPort = INTERNET_INVALID_PORT_NUMBER;
dwFlags = INTERNET_FLAG_DONT_CACHE;
}
#ifdef _LOG_IN_FILE
RW_DEBUG << "\nPost Data:\n" << flush;
#endif
if (m_hSession == NULL){
// Initialize the Internet Functions.
m_hSession = ATK_InternetOpen(_T("Registration Wizard"),
m_dwAccessType,
pProxyServerName,
NULL,
0
);
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n\tInternet Open:" << m_hSession << flush;
#endif
if (!Succeeded(m_hSession, "InternetOpen"))
{
goto EndFn;
}
}
hConnect = ATK_InternetConnect(m_hSession,
m_strIISServer,
nServerPort,
pUserName, // m_UserName, Changed on 2/4/98 for IE Proxy Auth
pPassword, // m_Password,
INTERNET_SERVICE_HTTP,
0,
0);
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n\tInternet Connection:" << ConvertToANSIString(m_strIISServer) << flush;
// RW_DEBUG << "\n\tUserName :" << ConvertToANSIString(m_UserName) << flush;
// RW_DEBUG << "\n\tPassword :" << ConvertToANSIString(m_Password) << flush;
#endif
if (!Succeeded(hConnect, "InternetConnect"))
{
goto EndFn;
}
hHttpFile = ATK_HttpOpenRequest(hConnect,
_T("POST"),
m_strPath,
HTTP_VERSION,
NULL,
NULL, //szAcceptType,
dwFlags,//INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_SECURE,
0) ;
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n\t\tInternet Post :" << ConvertToANSIString(m_strPath) << flush;
#endif
if (! Succeeded(hHttpFile, "HttpOpenRequest"))
{
::InternetCloseHandle(hConnect);
goto EndFn;
}
_tcscpy(szHeader, _T("Accept: */*\nContent-Type: application/x-www-form-urlencoded"));
bSendRequest = ATK_HttpSendRequest(hHttpFile,
szHeader, -1L , m_strBuffer, m_dwBufferLen);
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n\t\tSendData:" << m_strBuffer << flush;
#endif
if (!Succeeded1(bSendRequest, "HttpSendRequest"))
{
::InternetCloseHandle(hConnect);
goto EndFn;
}
// Get size of file.
dwInfoLevel = HTTP_QUERY_CONTENT_TRANSFER_ENCODING;
dwLengthBufQuery = sizeof( DWORD);
bQuery = ATK_HttpQueryInfo(hHttpFile,
HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
&dwCL,
&dwLengthBufQuery,
NULL) ;
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Query ContentLength : " << dwCL << flush;
#endif
if (! Succeeded1(bQuery, "HttpQueryInfo") )
{
::InternetCloseHandle(hConnect);
goto EndFn;
}
memset(pBuffer,0,MAX_PATH);
bRead = ::InternetReadFile(hHttpFile,
pBuffer,
MAX_PATH,
&dwBytesRead);
#ifdef _LOG_IN_FILE
RW_DEBUG <<"\n ReturnBuffer " << pBuffer << flush;
#endif
if (!Succeeded1(bRead, "InternetReadFile"))
{
DisplayMessage("HTTP POST FAILURE ...");
::InternetCloseHandle(hConnect);
goto EndFn;
}
if(pBuffer[0] == _T('0' ))
{
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Post Successful" << flush;
#endif
uiResult = RWZ_POST_SUCCESS;
}
else {
// 438
if ( (pBuffer[0] == _T('4')) && (pBuffer[1] == _T('3')) ) {
uiResult = RWZ_POST_MSN_SITE_BUSY;
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Post Failure " << flush;
#endif
}
else {
uiResult = RWZ_POST_WITH_SSL_FAILURE;
#ifdef _LOG_IN_FILE
RW_DEBUG << "\n Post with SSL Failure " << flush;
#endif
}
}
pBuffer[dwBytesRead] = 0 ;
::InternetCloseHandle(hConnect);
EndFn:
return uiResult ;
}
DWORD InvokePost(HWND hWnd, CInternetThread *p)
{
return p->PostData(hWnd);
}