// Detect any proxy configuration settings automatically. // static void windows_detect_autoproxy_settings() { if (log_flags.proxy_debug) { post_sysmon_msg("[proxy] automatic proxy check in progress"); } HINTERNET hWinHttp = NULL; WINHTTP_AUTOPROXY_OPTIONS autoproxy_options; WINHTTP_PROXY_INFO proxy_info; PARSED_URL purl; std::wstring network_test_url; size_t pos; memset(&autoproxy_options, 0, sizeof(autoproxy_options)); memset(&proxy_info, 0, sizeof(proxy_info)); autoproxy_options.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT; autoproxy_options.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A; autoproxy_options.fAutoLogonIfChallenged = TRUE; network_test_url = boinc_ascii_to_wide(nvc_config.network_test_url).c_str(); hWinHttp = WinHttpOpen( L"BOINC client", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, NULL ); char msg[1024], buf[1024]; safe_strcpy(msg, "[proxy] "); if (WinHttpGetProxyForUrl(hWinHttp, network_test_url.c_str(), &autoproxy_options, &proxy_info)) { // Apparently there are some conditions where WinHttpGetProxyForUrl can return // success but where proxy_info.lpszProxy is null. Maybe related to UPNP? // // For the time being check to see if proxy_info.lpszProxy is non-null. // if (proxy_info.lpszProxy) { std::string proxy(boinc_wide_to_ascii(std::wstring(proxy_info.lpszProxy))); std::string new_proxy; if (log_flags.proxy_debug) { safe_strcat(msg, "proxy list: "); safe_strcat(msg, proxy.c_str()); } if (!proxy.empty()) { // Trim string if more than one proxy is defined // proxy list is defined as: // ([<scheme>=][<scheme>"://"]<server>[":"<port>]) // Find and erase first delimeter type. pos = proxy.find(';'); if (pos != -1 ) { new_proxy = proxy.erase(pos); proxy = new_proxy; } // Find and erase second delimeter type. pos = proxy.find(' '); if (pos != -1 ) { new_proxy = proxy.erase(pos); proxy = new_proxy; } // Parse the remaining url parse_url(proxy.c_str(), purl); // Store the results for future use. if (0 != strcmp(working_proxy_info.autodetect_server_name, purl.host)) { // Reset clients connection error detection path net_status.need_physical_connection = false; working_proxy_info.autodetect_protocol = purl.protocol; safe_strcpy(working_proxy_info.autodetect_server_name, purl.host); working_proxy_info.autodetect_port = purl.port; } if (log_flags.proxy_debug) { snprintf(buf, sizeof(buf), "proxy detected %s:%d", purl.host, purl.port); safe_strcat(msg, buf); } } } // Clean up if (proxy_info.lpszProxy) GlobalFree(proxy_info.lpszProxy); if (proxy_info.lpszProxyBypass) GlobalFree(proxy_info.lpszProxyBypass); } else { // We can get here if the user is switching from a network that // requires a proxy to one that does not require a proxy. working_proxy_info.autodetect_protocol = 0; safe_strcpy(working_proxy_info.autodetect_server_name, ""); working_proxy_info.autodetect_port = 0; if (log_flags.proxy_debug) { safe_strcat(msg, "no automatic proxy detected"); } } if (hWinHttp) WinHttpCloseHandle(hWinHttp); if (log_flags.proxy_debug) { post_sysmon_msg(msg); } }
bool detect_cookie_ie_supported_uac(std::string& project_url, std::string& name, std::string& value) { static HMODULE ieframelib = NULL; static tIEGPMC pIEGPMC = NULL; bool bReturnValue = false; bool bCheckDomainName = false; HRESULT rc; WCHAR szCookieBuffer[4096]; WCHAR* pszCookieFragment = NULL; DWORD dwSize = sizeof(szCookieBuffer)/sizeof(WCHAR); std::wstring strCookieFragment; std::wstring strCookieName; std::wstring strCookieValue; std::string hostname; std::wstring hostname_w; std::string domainname; std::wstring domainname_w; std::wstring name_w; std::wstring value_w; size_t uiDelimeterLocation; if (!ieframelib) { ieframelib = LoadLibraryA("ieframe.dll"); if (ieframelib) { pIEGPMC = (tIEGPMC)GetProcAddress(ieframelib, "IEGetProtectedModeCookie"); } } if (!pIEGPMC) { return false; } // Convert name into wide character string name_w = boinc_ascii_to_wide(name); // if we don't find the cookie at the exact project dns name, check one higher // (i.e. www.worldcommunitygrid.org becomes worldcommunitygrid.org parse_hostname_ie_compatible(project_url, hostname, domainname); // InternetGetCookie expects them in URL format hostname_w = std::wstring(_T("http://")) + boinc_ascii_to_wide(hostname) + std::wstring(_T("/")); domainname_w = std::wstring(_T("http://")) + boinc_ascii_to_wide(domainname) + std::wstring(_T("/")); // First check to see if the desired cookie is assigned to the hostname. rc = pIEGPMC(hostname_w.c_str(), NULL, szCookieBuffer, &dwSize, NULL) == TRUE; if (!SUCCEEDED(rc) || (!wcsstr(szCookieBuffer, name_w.c_str()))) { bCheckDomainName = true; } // Next check if it was assigned to the domainname. if (bCheckDomainName) { rc = pIEGPMC(domainname_w.c_str(), NULL, szCookieBuffer, &dwSize, NULL) == TRUE; if (!SUCCEEDED(rc) || (!wcsstr(szCookieBuffer, name_w.c_str()))) { return false; } } // Format of cookie buffer: // 'cookie1=value1; cookie2=value2; cookie3=value3; // pszCookieFragment = wcstok(szCookieBuffer, _T("; ")); while(pszCookieFragment) { // Convert to a std::string so we can go to town strCookieFragment = pszCookieFragment; // Extract the name & value uiDelimeterLocation = strCookieFragment.find(_T("="), 0); strCookieName = strCookieFragment.substr(0, uiDelimeterLocation); strCookieValue = strCookieFragment.substr(uiDelimeterLocation + 1); if (0 == wcscmp(name_w.c_str(), strCookieName.c_str())) { // Now we found it! Yea - auto attach! value = boinc_wide_to_ascii(strCookieValue); bReturnValue = true; } pszCookieFragment = wcstok(NULL, _T("; ")); } return bReturnValue; }