//+---------------------------------------------------------------------------- // // File: cmproxy.cpp // // Module: CMPROXY.DLL (TOOL) // // Synopsis: Main source for IE proxy setting connect action // // Copyright (c) 1999 Microsoft Corporation // // Author: quintinb Created 10/27/99 // //+---------------------------------------------------------------------------- #include "pch.h" // // Include the locale-safe replacement for lstrcmpi // #include "CompareString.cpp" const CHAR* const c_pszInternetSettingsPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"; const CHAR* const c_pszProxyEnable = "ProxyEnable"; const CHAR* const c_pszProxyServer = "ProxyServer"; const CHAR* const c_pszProxyOverride = "ProxyOverride"; const CHAR* const c_pszManualProxySection = "Manual Proxy"; const CHAR* const c_pszAutoProxySection = "Automatic Proxy"; const CHAR* const c_pszAutoConfigScript = "AutoConfigScript"; const CHAR* const c_pszAutoProxyEnable = "AutoProxyEnable"; const CHAR* const c_pszAutoConfigScriptEnable = "AutoConfigScriptEnable"; const CHAR* const c_pszUseVpnName = "UseVpnName"; const CHAR* const c_pszEmpty = ""; // // Typedefs and Function Pointers for the Wininet APIs that we use. // typedef BOOL (WINAPI* pfnInternetQueryOptionSpec)(HINTERNET, DWORD, LPVOID, LPDWORD); typedef BOOL (WINAPI* pfnInternetSetOptionSpec)(HINTERNET, DWORD, LPVOID, DWORD); pfnInternetQueryOptionSpec g_pfnInternetQueryOption = NULL; pfnInternetSetOptionSpec g_pfnInternetSetOption = NULL; //+---------------------------------------------------------------------------- // // Function: SetIE5ProxySettings // // Synopsis: This function sets the IE5, per connection proxy settings using // the given connection, enabled value, proxy server, and override // settings. // // Arguments: LPSTR pszConnection - Connection name to set the proxy settings for // BOOL bManualProxy - whether the manual proxy is enabled or not // BOOL bAutomaticProxy - whether the auto proxy detection is enabled // BOOL bAutoConfigScript - whether an auto config script should be used // LPSTR pszProxyServer - proxy server name in the proxyserver:port format // LPSTR pszProxyOverride - a semi-colon seperated list of // realms to bypass the proxy for // LPSTR pszAutoConfigScript - auto config URL // // Returns: HRESULT - Standard COM return codes // // History: quintinb Created 10/27/99 // //+---------------------------------------------------------------------------- HRESULT SetIE5ProxySettings(LPSTR pszConnection, BOOL bManualProxy, BOOL bAutomaticProxy, BOOL bAutoConfigScript, LPSTR pszProxyServer, LPSTR pszProxyOverride, LPSTR pszAutoConfigScript) { // // Check Inputs, note allow pszConnection to be NULL (to set the LAN connection) // if ((NULL == g_pfnInternetSetOption) || (NULL == pszProxyServer) || (NULL == pszProxyOverride) || (NULL == pszAutoConfigScript)) { return E_INVALIDARG; } HRESULT hr = S_OK; INTERNET_PER_CONN_OPTION_LIST PerConnOptionList; DWORD dwSize = sizeof(PerConnOptionList); PerConnOptionList.dwSize = sizeof(PerConnOptionList); PerConnOptionList.pszConnection = pszConnection; PerConnOptionList.dwOptionCount = 4; PerConnOptionList.dwOptionError = 0; PerConnOptionList.pOptions = (INTERNET_PER_CONN_OPTION*)CmMalloc(4*sizeof(INTERNET_PER_CONN_OPTION)); if(NULL == PerConnOptionList.pOptions) { return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); } // // set flags // PerConnOptionList.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; PerConnOptionList.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT; if (bManualProxy) { PerConnOptionList.pOptions[0].Value.dwValue |= PROXY_TYPE_PROXY; } if (bAutomaticProxy) { PerConnOptionList.pOptions[0].Value.dwValue |= PROXY_TYPE_AUTO_DETECT; } if (bAutoConfigScript) { PerConnOptionList.pOptions[0].Value.dwValue |= PROXY_TYPE_AUTO_PROXY_URL; } // // set proxy name // PerConnOptionList.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER; PerConnOptionList.pOptions[1].Value.pszValue = pszProxyServer; // // set proxy override // PerConnOptionList.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS; PerConnOptionList.pOptions[2].Value.pszValue = pszProxyOverride; // // set auto config URL // PerConnOptionList.pOptions[3].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL; PerConnOptionList.pOptions[3].Value.pszValue = pszAutoConfigScript; // // tell wininet // if (!g_pfnInternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &PerConnOptionList, dwSize)) { hr = HRESULT_FROM_WIN32(GetLastError()); } CmFree(PerConnOptionList.pOptions); return hr; } //+---------------------------------------------------------------------------- // // Function: SetIE4ProxySettings // // Synopsis: This function sets the IE4 proxy settings (global to a machine) using // the given connection, enabled value, proxy server, and override // settings. // // Arguments: LPSTR pszConnection - ignored (exists to have same prototype as IE5 version) // BOOL bManualProxy - whether the manual proxy is enabled or not // BOOL bAutomaticProxy - ignored (exists to have same prototype as IE5 version) // BOOL bAutoConfigScript - ignored (exists to have same prototype as IE5 version) // LPSTR pszProxyServer - proxy server name in the proxyserver:port format // LPSTR pszProxyOverride - a semi-colon seperated list of // realms to bypass the proxy for // LPSTR pszAutoConfigScript - ignored (exists to have same prototype as IE5 version) // // Returns: HRESULT - Standard COM return codes // // History: quintinb Created 10/27/99 // //+---------------------------------------------------------------------------- HRESULT SetIE4ProxySettings(LPSTR pszConnection, BOOL bManualProxy, BOOL bAutomaticProxy, BOOL bAutoConfigScript, LPSTR pszProxyServer, LPSTR pszProxyOverride, LPSTR pszAutoConfigScript) { // // Check Inputs, note that we don't allow the strings to be NULL but they could // be empty. Also note that pszConnection is ignored because IE4 proxy settings are global. // if ((NULL == pszProxyServer) || (NULL == pszProxyOverride)) { return E_INVALIDARG; } DWORD dwTemp; HKEY hKey = NULL; HRESULT hr = S_OK; // // Now Create/Open the Internet Settings key // LONG lResult = RegCreateKeyEx(HKEY_CURRENT_USER, c_pszInternetSettingsPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwTemp); hr = HRESULT_FROM_WIN32(lResult); if (SUCCEEDED(hr)) { // // Set the proxy values // dwTemp = bManualProxy ? 1 : 0; // use a true 1 or 0 value. lResult = RegSetValueEx(hKey, c_pszProxyEnable, 0, REG_DWORD, (CONST BYTE*)&dwTemp, sizeof(DWORD)); hr = HRESULT_FROM_WIN32(lResult); if (SUCCEEDED(hr)) { lResult = RegSetValueEx(hKey, c_pszProxyServer, 0, REG_SZ, (CONST BYTE*)pszProxyServer, lstrlen(pszProxyServer)+1); hr = HRESULT_FROM_WIN32(lResult); if (SUCCEEDED(hr)) { lResult = RegSetValueEx(hKey, c_pszProxyOverride, 0, REG_SZ, (CONST BYTE*)pszProxyOverride, lstrlen(pszProxyOverride)+1); hr = HRESULT_FROM_WIN32(lResult); } } (VOID)RegCloseKey(hKey); } return hr; } //+---------------------------------------------------------------------------- // // Function: GetIE5ProxySettings // // Synopsis: Gets the IE5, per connection, proxy settings for the given connection. // Please note that the strings allocated for the proxy server and the // proxy override values must be freed by the caller. // // Arguments: LPSTR pszConnection - connection name to get the proxy settings for // LPBOOL pbManualProxy - bool pointer to hold whether the manual // proxy is enabled or not // LPBOOL pbAutomaticProxy - bool pointer to hold whether automatic // proxy detection is enabled or not // LPBOOL pbAutoConfigScript - bool pointer to hold whether an auto // config script should be used or not // LPSTR* ppszProxyServer - string pointer to hold the retrieved // proxy server string // LPSTR* ppszProxyOverride - string pointer to hold the retrieved // proxy server string // LPSTR* ppszAutoConfigScript - string pointer to hold the retrieved // auto config script // // Returns: HRESULT - Standard COM return codes // // History: quintinb Created 10/27/99 // //+---------------------------------------------------------------------------- HRESULT GetIE5ProxySettings(LPSTR pszConnection, LPBOOL pbManualProxy, LPBOOL pbAutomaticProxy, LPBOOL pbAutoConfigScript, LPSTR* ppszProxyServer, LPSTR* ppszProxyOverride, LPSTR* ppszAutoConfigScript) { // // Check Inputs, note that pszConnection can be NULL. It will set the LAN connection in that case. // if ((NULL == pbManualProxy) || (NULL == pbAutomaticProxy) || (NULL == pbAutoConfigScript) || (NULL == ppszProxyServer) || (NULL == ppszProxyOverride) || (NULL == ppszAutoConfigScript) || (NULL == g_pfnInternetQueryOption)) { return E_INVALIDARG; } // // Zero the output params // *pbManualProxy = FALSE; *pbAutomaticProxy = FALSE; *pbAutoConfigScript = FALSE; *ppszProxyServer = CmStrCpyAlloc(c_pszEmpty); *ppszProxyOverride = CmStrCpyAlloc(c_pszEmpty); *ppszAutoConfigScript = CmStrCpyAlloc(c_pszEmpty); // // Setup the Option List Struct // HRESULT hr = S_OK; INTERNET_PER_CONN_OPTION_LIST PerConnOptionList; PerConnOptionList.dwSize = sizeof(PerConnOptionList); PerConnOptionList.pszConnection = pszConnection; PerConnOptionList.dwOptionError = 0; PerConnOptionList.dwOptionCount = 4; PerConnOptionList.pOptions = (INTERNET_PER_CONN_OPTION*)CmMalloc(4*sizeof(INTERNET_PER_CONN_OPTION)); if(NULL == PerConnOptionList.pOptions) { return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); } // // set flags we want info about // PerConnOptionList.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; PerConnOptionList.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER; PerConnOptionList.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS; PerConnOptionList.pOptions[3].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL; DWORD dwSize = sizeof(PerConnOptionList); // // Get the Options // if (!g_pfnInternetQueryOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &PerConnOptionList, &dwSize)) { hr = HRESULT_FROM_WIN32(GetLastError()); } if (SUCCEEDED(hr)) { // // Parse the returned options to find the options we are interested in // for (DWORD dwIndex=0; dwIndex < PerConnOptionList.dwOptionCount; dwIndex++) { switch(PerConnOptionList.pOptions[dwIndex].dwOption) { case INTERNET_PER_CONN_FLAGS: if (PROXY_TYPE_PROXY & PerConnOptionList.pOptions[dwIndex].Value.dwValue) { *pbManualProxy = TRUE; } if (PROXY_TYPE_AUTO_PROXY_URL & PerConnOptionList.pOptions[dwIndex].Value.dwValue) { *pbAutoConfigScript = TRUE; } if (PROXY_TYPE_AUTO_DETECT & PerConnOptionList.pOptions[dwIndex].Value.dwValue) { *pbAutomaticProxy = TRUE; } break; case INTERNET_PER_CONN_PROXY_SERVER: if (NULL != PerConnOptionList.pOptions[dwIndex].Value.pszValue) { CmFree(*ppszProxyServer); *ppszProxyServer = CmStrCpyAlloc(PerConnOptionList.pOptions[dwIndex].Value.pszValue); LocalFree(PerConnOptionList.pOptions[dwIndex].Value.pszValue); } break; case INTERNET_PER_CONN_PROXY_BYPASS: if (NULL != PerConnOptionList.pOptions[dwIndex].Value.pszValue) { CmFree(*ppszProxyOverride); *ppszProxyOverride = CmStrCpyAlloc(PerConnOptionList.pOptions[dwIndex].Value.pszValue); LocalFree(PerConnOptionList.pOptions[dwIndex].Value.pszValue); } break; case INTERNET_PER_CONN_AUTOCONFIG_URL: if (NULL != PerConnOptionList.pOptions[dwIndex].Value.pszValue) { CmFree(*ppszAutoConfigScript); *ppszAutoConfigScript = CmStrCpyAlloc(PerConnOptionList.pOptions[dwIndex].Value.pszValue); LocalFree(PerConnOptionList.pOptions[dwIndex].Value.pszValue); } break; default: break; } } CmFree(PerConnOptionList.pOptions); } return hr; } //+---------------------------------------------------------------------------- // // Function: GetIE4ProxySettings // // Synopsis: Gets the IE4, per machine, proxy settings. // Please note that the strings allocated for the proxy server and the // proxy override values must be freed by the caller. // // Arguments: LPSTR pszConnection - ignored (exists for prototype consistency with the IE5 version) // LPBOOL pbManualProxy - bool pointer to hold whether the manual // proxy is enabled or not // LPBOOL pbAutomaticProxy - ignored (not supported by IE4) // LPBOOL pbAutoConfigScript - ignored (not supported by IE4) // LPSTR* ppszProxyServer - string pointer to hold the retrieved // proxy server string // LPSTR* ppszProxyOverride - string pointer to hold the retrieved // proxy server string // LPSTR* ppszAutoConfigScript - ignored (not supported by IE4) // // Returns: HRESULT - Standard COM return codes // // History: quintinb Created 10/27/99 // //+---------------------------------------------------------------------------- HRESULT GetIE4ProxySettings(LPSTR pszConnection, LPBOOL pbManualProxy, LPBOOL pbAutomaticProxy, LPBOOL pbAutoConfigScript, LPSTR* ppszProxyServer, LPSTR* ppszProxyOverride, LPSTR* ppszAutoConfigScript) { // // Check Inputs, note that we don't allow the pointers to be NULL but they could // be empty. Also note that pszConnection is ignored because IE4 proxy settings are global. // if ((NULL == pbManualProxy) || (NULL == ppszProxyServer) || (NULL == ppszProxyOverride)) { return E_INVALIDARG; } DWORD dwTemp; DWORD dwSize; DWORD dwType; HKEY hKey = NULL; HRESULT hr = S_OK; // // Zero the output params // *pbManualProxy = FALSE; *pbAutomaticProxy = FALSE; *pbAutoConfigScript = FALSE; *ppszProxyServer = CmStrCpyAlloc(c_pszEmpty); *ppszProxyOverride = CmStrCpyAlloc(c_pszEmpty); *ppszAutoConfigScript = CmStrCpyAlloc(c_pszEmpty); // // Now Create/Open the Internet Settings key // LONG lResult = RegOpenKeyEx(HKEY_CURRENT_USER, c_pszInternetSettingsPath, 0, KEY_READ, &hKey); hr = HRESULT_FROM_WIN32(lResult); if (SUCCEEDED(hr)) { // // get whether the proxy is enabled or not // dwSize = sizeof(DWORD); lResult = RegQueryValueEx(hKey, c_pszProxyEnable, 0, &dwType, (LPBYTE)pbManualProxy, &dwSize); hr = HRESULT_FROM_WIN32(lResult); if (SUCCEEDED(hr)) { // // get the proxy server value // lResult = ERROR_INSUFFICIENT_BUFFER; dwSize = MAX_PATH; do { // // Alloc a Buffer // CmFree(*ppszProxyServer); *ppszProxyServer = (CHAR*)CmMalloc(dwSize); if (*ppszProxyServer) { lResult = RegQueryValueEx(hKey, c_pszProxyServer, 0, &dwType, (LPBYTE)*ppszProxyServer, &dwSize); } else { lResult = ERROR_NOT_ENOUGH_MEMORY; } hr = HRESULT_FROM_WIN32(lResult); dwSize = 2*dwSize; } while ((ERROR_INSUFFICIENT_BUFFER == lResult) && (dwSize < 1024*1024)); if (SUCCEEDED(hr)) { // // get the proxy override value // lResult = ERROR_INSUFFICIENT_BUFFER; dwSize = MAX_PATH; do { // // Alloc a Buffer // CmFree(*ppszProxyOverride); *ppszProxyOverride = (CHAR*)CmMalloc(dwSize); if (*ppszProxyOverride) { lResult = RegQueryValueEx(hKey, c_pszProxyOverride, 0, &dwType, (LPBYTE)*ppszProxyOverride, &dwSize); } else { lResult = ERROR_NOT_ENOUGH_MEMORY; } hr = HRESULT_FROM_WIN32(lResult); dwSize = 2*dwSize; } while ((ERROR_INSUFFICIENT_BUFFER == lResult) && (dwSize < 1024*1024)); } } } else { if (ERROR_FILE_NOT_FOUND == lResult) { // // No Proxy settings to get. // hr = S_FALSE; } } if (hKey) { (VOID)RegCloseKey(hKey); } return hr; } //+---------------------------------------------------------------------------- // // Function: ReadProxySettingsFromFile // // Synopsis: Reads the proxy settings from the given proxy file and stores them // in the provided pointers. Please note that the buffers allocated // by GetString and stored in ppszProxyOverride, ppszProxyServer, and // ppszAutoConfigScript must be freed by the caller. Please see the above // format guide for specifics. // // Arguments: LPCSTR pszSourceFile - file to read the proxy settings from. // LPBOOL pbManualProxy - determines if the manual proxy is enabled or not // LPBOOL pbAutomaticProxy - determines if automatic proxy detection is enabled or not // LPBOOL pbAutoConfigScript - determines if an automatic config script should be used // LPSTR* ppszProxyServer - string pointer to hold the Proxy server value // (in server:port format) // LPSTR* ppszProxyOverride - string pointer to hold the Proxy override values // (a semi-colon seperated list) // LPSTR* ppszAutoConfigScript - URL for an automatic config script // LPBOOL pbUseVpnName - whether the alternate connectoid name should // be used (the VPN connectoid name) // // Returns: BOOL - TRUE if the settings were successfully read // // History: quintinb Created 10/27/99 // //+---------------------------------------------------------------------------- BOOL ReadProxySettingsFromFile(LPCSTR pszSourceFile, LPBOOL pbManualProxy, LPBOOL pbAutomaticProxy, LPBOOL pbAutoConfigScript, LPSTR* ppszProxyServer, LPSTR* ppszProxyOverride, LPSTR* ppszAutoConfigScript, LPBOOL pbUseVpnName) { // // Check input params // if ((NULL == ppszProxyOverride) || (NULL == ppszProxyServer) || (NULL == ppszAutoConfigScript) || (NULL == pbAutomaticProxy) || (NULL == pbAutoConfigScript) || (NULL == pbManualProxy) || (NULL == pbUseVpnName) || (NULL == pszSourceFile) || ('\0' == pszSourceFile[0])) { return FALSE; } // // Get the Manual proxy settings // *pbManualProxy = GetPrivateProfileInt(c_pszManualProxySection, c_pszProxyEnable, 0, pszSourceFile); GetString(c_pszManualProxySection, c_pszProxyServer, ppszProxyServer, pszSourceFile); if (NULL == *ppszProxyServer) { return FALSE; } GetString(c_pszManualProxySection, c_pszProxyOverride, ppszProxyOverride, pszSourceFile); if (NULL == *ppszProxyOverride) { return FALSE; } // // If this is a backup file, we will have the UseVpnName flag to tell us which connectoid name // is appropriate. Lets look it up. Note that we default to using the standard connectoid. // *pbUseVpnName = GetPrivateProfileInt(c_pszManualProxySection, c_pszUseVpnName, 0, pszSourceFile); // // Get the Auto proxy settings // *pbAutomaticProxy = GetPrivateProfileInt(c_pszAutoProxySection, c_pszAutoProxyEnable, 0, pszSourceFile); //"Automatically detect settings" checkbox *pbAutoConfigScript = GetPrivateProfileInt(c_pszAutoProxySection, c_pszAutoConfigScriptEnable, 0, pszSourceFile);//"Use automatic configuration script" checkbox GetString(c_pszAutoProxySection, c_pszAutoConfigScript, ppszAutoConfigScript, pszSourceFile); return TRUE; } //+---------------------------------------------------------------------------- // // Function: WriteProxySettingsToFile // // Synopsis: Writes the specified settings to the given backup proxy filename. // Please see the above format guide for specifics. // // Arguments: LPCSTR pszBackupFile - backup file to write the current settings to // BOOL bManualProxy -- bool to tell if the manual proxy is enabled. // BOOL bAutomaticProxy -- bool to tell if auto proxy detection is enabled. // BOOL bAutoConfigScript -- bool to tell if an auto config // script should be used. // LPSTR pszProxyServer - proxy server string in server:port format // LPSTR pszProxyOverride - semi-colon seperated list of realms for // which the proxy server should be bypassed. // BOOL bUseVpnName - value to write to the UseVpnName file, see format doc above. // // Returns: BOOL - TRUE if the values were written successfully // // History: quintinb Created 10/27/99 // //+---------------------------------------------------------------------------- BOOL WriteProxySettingsToFile(LPCSTR pszBackupFile, BOOL bManualProxy, BOOL bAutomaticProxy, BOOL bAutoConfigScript, LPSTR pszProxyServer, LPSTR pszProxyOverride, LPSTR pszAutoConfigScript, BOOL bUseVpnName) { // // Check inputs // if ((NULL == pszBackupFile) || ('\0' == pszBackupFile[0]) || (NULL == pszProxyServer) || (NULL == pszProxyOverride) || (NULL == pszAutoConfigScript)) { return FALSE; } BOOL bReturn = TRUE; CHAR szTemp[MAX_PATH]; // // Write the Manual Proxy Settings // wsprintf(szTemp, "%d", bManualProxy); if (!WritePrivateProfileString(c_pszManualProxySection, c_pszProxyEnable, szTemp, pszBackupFile)) { CMTRACE1("CmProxy -- WriteProxySettingsToFile failed, GLE %d", GetLastError()); bReturn = FALSE; } if (!WritePrivateProfileString(c_pszManualProxySection, c_pszProxyServer, pszProxyServer, pszBackupFile)) { CMTRACE1("CmProxy -- WriteProxySettingsToFile failed, GLE %d", GetLastError()); bReturn = FALSE; } if (!WritePrivateProfileString(c_pszManualProxySection, c_pszProxyOverride, pszProxyOverride, pszBackupFile)) { CMTRACE1("CmProxy -- WriteProxySettingsToFile failed, GLE %d", GetLastError()); bReturn = FALSE; } wsprintf(szTemp, "%d", bUseVpnName); if (!WritePrivateProfileString(c_pszManualProxySection, c_pszUseVpnName, szTemp, pszBackupFile)) { CMTRACE1("CmProxy -- WriteProxySettingsToFile failed, GLE %d", GetLastError()); bReturn = FALSE; } // // Write the Automatic Proxy Settings // wsprintf(szTemp, "%d", bAutomaticProxy); if (!WritePrivateProfileString(c_pszAutoProxySection, c_pszAutoProxyEnable, szTemp, pszBackupFile)) { CMTRACE1("CmProxy -- WriteProxySettingsToFile failed, GLE %d", GetLastError()); bReturn = FALSE; } wsprintf(szTemp, "%d", bAutoConfigScript); if (!WritePrivateProfileString(c_pszAutoProxySection, c_pszAutoConfigScriptEnable, szTemp, pszBackupFile)) { CMTRACE1("CmProxy -- WriteProxySettingsToFile failed, GLE %d", GetLastError()); bReturn = FALSE; } if (!WritePrivateProfileString(c_pszAutoProxySection, c_pszAutoConfigScript, pszAutoConfigScript, pszBackupFile)) { CMTRACE1("CmProxy -- WriteProxySettingsToFile failed, GLE %d", GetLastError()); bReturn = FALSE; } return bReturn; } //+---------------------------------------------------------------------------- // // Function: SetProxy // // Synopsis: Proxy entry point for setting the IE4 and IE5 style proxies. Since // this is a Connection Manager connect action it uses the CM connect // action format (see CMAK docs for more info). Thus the parameters // to the dll are passed via a string which contains parameters (see the // cmproxy spec for a list of the parameter values). // // Arguments: HWND hWnd - Window handle of caller // HINSTANCE hInst - Instance handle of caller // LPSTR pszArgs - Argument string // int nShow - Unused // // Returns: DWORD WINAPI - Error code // // History: quintinb Created 10/27/99 // //+---------------------------------------------------------------------------- HRESULT WINAPI SetProxy(HWND hWnd, HINSTANCE hInst, LPSTR pszArgs, int nShow) { // // First figure out if we have IE4 or IE5 available. // typedef HRESULT (WINAPI *pfnSetProxySettings)(LPSTR, BOOL, BOOL, BOOL, LPSTR, LPSTR, LPSTR); typedef HRESULT (WINAPI *pfnGetProxySettings)(LPSTR, LPBOOL, LPBOOL, LPBOOL, LPSTR*, LPSTR*, LPSTR*); pfnSetProxySettings SetProxySettings = NULL; pfnGetProxySettings GetProxySettings = NULL; BOOL bIE5 = FALSE; BOOL bManualProxy; BOOL bAutomaticProxy; BOOL bAutoConfigScript; BOOL bUseVpnName = FALSE; DLLVERSIONINFO VersionInfo; HINSTANCE hWinInet = NULL; LPSTR pszProxyServer = NULL; LPSTR pszProxyOverride = NULL; LPSTR pszAutoConfigScript = NULL; LPSTR pszSourceFile = NULL; LPSTR pszBackupFile = NULL; LPSTR pszConnectionName = NULL; LPSTR pszProfileDirPath = NULL; LPSTR pszAltName = NULL; LPSTR* CmArgV = NULL; if (SUCCEEDED(GetBrowserVersion(&VersionInfo))) { if (5 <= VersionInfo.dwMajorVersion) { // // Set the function pointers to use the IE5 versions of the functions // SetProxySettings = SetIE5ProxySettings; GetProxySettings = GetIE5ProxySettings; bIE5 = TRUE; } else if ((4 == VersionInfo.dwMajorVersion) && ((71 == VersionInfo.dwMinorVersion) || (72 == VersionInfo.dwMinorVersion))) { // // Use the IE4 version of the proxy functions // SetProxySettings = SetIE4ProxySettings; GetProxySettings = GetIE4ProxySettings; } else { // // We don't work with IE versions less than 4 so lets return right here // without setting anything. // CMTRACE("CMPROXY--Unable to set the proxy settings because of insufficient IE version."); return TRUE; } // // If we have IE5, then we need to load wininet.dll. // if (bIE5) { hWinInet = LoadLibrary("wininet.dll"); if (hWinInet) { // // Okay, lets get the procedure addresses for InternetSetOption and InternetQueryOption // g_pfnInternetQueryOption = (pfnInternetQueryOptionSpec)GetProcAddress(hWinInet, "InternetQueryOptionA"); g_pfnInternetSetOption = (pfnInternetSetOptionSpec)GetProcAddress(hWinInet, "InternetSetOptionA"); if ((NULL == g_pfnInternetQueryOption) || (NULL == g_pfnInternetSetOption)) { FreeLibrary(hWinInet); return FALSE; } } } // // Parse out the command line parameters // // command line is of the form: /profile %PROFILE% /DialRasEntry %DIALRASENTRY% /TunnelRasEntry %TUNNELRASENTRYNAME% /source_filename Proxy.txt /backup_filename backup.txt CmArgV = GetCmArgV(pszArgs); int i = 0; if (!CmArgV) { goto exit; } while (CmArgV[i]) { if (0 == SafeCompareString(CmArgV[i], "/source_filename") && CmArgV[i+1]) { pszSourceFile = CmStrCpyAlloc(CmArgV[i+1]); i = i+2; } else if (0 == SafeCompareString(CmArgV[i], "/backup_filename") && CmArgV[i+1]) { pszBackupFile = CmStrCpyAlloc(CmArgV[i+1]); i = i+2; } else if (0 == SafeCompareString(CmArgV[i], "/DialRasEntry") && CmArgV[i+1]) { pszConnectionName = (CmArgV[i+1]); i = i+2; } else if (0 == SafeCompareString(CmArgV[i], "/TunnelRasEntry") && CmArgV[i+1]) { pszAltName = (CmArgV[i+1]); i = i+2; } else if (0 == SafeCompareString(CmArgV[i], "/profile") && CmArgV[i+1]) { pszProfileDirPath = (CmArgV[i+1]); i = i+2; } else { // // Unknown option. Lets trace it out and try to continue. We will do param // verification next so if we don't have enough info to operate correctly we will work there. // CMTRACE1("Unknown option: %s", CmArgV[i]); i++; } } // // Verify that we have at least a source file and a name. // if ((pszSourceFile) && (pszConnectionName)) { // // Lets parse the cmp path into the profile dir and append it to the filename. // if (pszProfileDirPath) { LPSTR pszTemp = CmStrrchr(pszProfileDirPath, '.'); if (pszTemp) { *pszTemp = '\\'; *(pszTemp+1) = '\0'; pszTemp = CmStrCpyAlloc(pszProfileDirPath); CmStrCatAlloc(&pszTemp, pszSourceFile); CmFree(pszSourceFile); pszSourceFile = pszTemp; if (pszBackupFile) { pszTemp = CmStrCpyAlloc(pszProfileDirPath); CmStrCatAlloc(&pszTemp, pszBackupFile); CmFree(pszBackupFile); pszBackupFile = pszTemp; } } } // // If we have a direct connection or if this is a double dial connection on Win9x then we // will want to use pszAltName instead of pszConnectionName. This is because in the Win9x case, // the tunnel connectoid has "Tunnel" appended to it since all of the connectoids are stored in // the registry and we cannot have two connectoids with the same name. If this is a direct // connection this is also important because pszConnectoid will come through as "NULL" and the // Tunnel connectoid name will be the important one. Also, in these cases we need to set // bWriteOutUseVpnName to TRUE in order to write this flag out for the disconnect action. // BOOL bWriteOutUseVpnName = FALSE; if (pszConnectionName && pszAltName && bIE5) { if ((0 == SafeCompareString(pszConnectionName, TEXT("NULL"))) || OS_W9X) { // // Then we have a direct connection or a double dial connection on 9x // if (UseVpnName(pszAltName)) { pszConnectionName = pszAltName; pszAltName = NULL; bWriteOutUseVpnName = TRUE; } } } // // If we have a backup filename specified then we need to read the current Proxy settings // and save them out to the given filename. // if (NULL != pszBackupFile) { if (SUCCEEDED(GetProxySettings(pszConnectionName, &bManualProxy, &bAutomaticProxy, &bAutoConfigScript, &pszProxyServer, &pszProxyOverride, &pszAutoConfigScript))) { BOOL bSuccess = WriteProxySettingsToFile(pszBackupFile, bManualProxy, bAutomaticProxy, bAutoConfigScript, pszProxyServer, pszProxyOverride, pszAutoConfigScript, bWriteOutUseVpnName); if (!bSuccess) { CMTRACE("Unable to save settings to backup file, exiting!"); goto exit; } CmFree(pszProxyServer); pszProxyServer = NULL; CmFree(pszProxyOverride); pszProxyOverride = NULL; CmFree(pszAutoConfigScript); pszAutoConfigScript = NULL; } } // // Now we need to read the proxy settings to apply out of the given file // if (ReadProxySettingsFromFile(pszSourceFile, &bManualProxy, &bAutomaticProxy, &bAutoConfigScript, &pszProxyServer, &pszProxyOverride, &pszAutoConfigScript, &bUseVpnName)) { // // Finally write the proxy settings. // if (SUCCEEDED(SetProxySettings(pszConnectionName, bManualProxy, bAutomaticProxy, bAutoConfigScript, pszProxyServer, pszProxyOverride, pszAutoConfigScript))) { CMTRACE1("CmProxy -- Set proxy settings successfully for %s.", pszConnectionName); } } } } exit: CmFree(pszProxyServer); CmFree(pszProxyOverride); CmFree(pszAutoConfigScript); CmFree(pszSourceFile); CmFree(pszBackupFile); CmFree(CmArgV); if (hWinInet) { FreeLibrary(hWinInet); } // // Always return S_OK because failing to set the proxy shouldn't stop the connection // process. // return S_OK; }