// This file is part of BOINC. // http://boinc.berkeley.edu // Copyright (C) 2008 University of California // // BOINC is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License // as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // // BOINC is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with BOINC. If not, see . #if defined(_WIN32) && !defined(__STDWX_H__) && !defined(_BOINC_WIN_) && !defined(_AFX_STDAFX_H_) #include "boinc_win.h" #endif #ifndef _WIN32 #include "config.h" #include #include #endif #include "parse.h" #include "error_numbers.h" #include "proxy_info.h" PROXY_INFO::PROXY_INFO() { clear(); #ifdef _WIN32 autodetect_mutex = CreateMutex(NULL, FALSE, NULL); #endif } PROXY_INFO::~PROXY_INFO() { #ifdef _WIN32 if (autodetect_mutex) CloseHandle(autodetect_mutex); #endif } bool PROXY_INFO::get_autoproxy_settings( int& server_protocol, std::string& server_name, int& server_port ) { bool retval = false; #ifdef _WIN32 // Request ownership of mutex. DWORD result = WaitForSingleObject(autodetect_mutex, 1000); if (result == WAIT_OBJECT_0) { #endif server_protocol = autodetect_server_protocol; server_name = autodetect_server_name; server_port = autodetect_server_port; retval = true; #ifdef _WIN32 } ReleaseMutex(autodetect_mutex); #endif return retval; } bool PROXY_INFO::set_autoproxy_settings( int server_protocol, std::string server_name, int server_port ) { bool retval = false; #ifdef _WIN32 // Request ownership of mutex. DWORD result = WaitForSingleObject(autodetect_mutex, 1000); if (result == WAIT_OBJECT_0) { #endif autodetect_server_protocol = server_protocol; autodetect_server_name = server_name; autodetect_server_port = server_port; autodetect_proxy_settings = false; retval = true; #ifdef _WIN32 } ReleaseMutex(autodetect_mutex); #endif return retval; } int PROXY_INFO::parse(MIOFILE& in) { char buf[2048]; clear(); while (in.fgets(buf, 2048)) { if (match_tag(buf, "")) return 0; else if (parse_bool(buf, "use_http_proxy", use_http_proxy)) continue; else if (parse_bool(buf, "use_socks_proxy", use_socks_proxy)) continue; else if (parse_bool(buf, "use_http_auth", use_http_auth)) continue; else if (parse_int(buf, "", socks_version)) continue; else if (parse_str(buf, "", socks_server_name)) continue; else if (parse_int(buf, "", socks_server_port)) continue; else if (parse_str(buf, "", http_server_name)) continue; else if (parse_int(buf, "", http_server_port)) continue; else if (parse_str(buf, "", socks5_user_name)) { xml_unescape(socks5_user_name); continue; } else if (parse_str(buf, "", socks5_user_passwd)) { xml_unescape(socks5_user_passwd); continue; } else if (parse_str(buf, "", http_user_name)) { xml_unescape(http_user_name); continue; } else if (parse_str(buf, "", http_user_passwd)) { xml_unescape(http_user_passwd); continue; } else if (parse_str(buf, "", noproxy_hosts)) continue; } return ERR_XML_PARSE; } int PROXY_INFO::write(MIOFILE& out) { char s5un[2048], s5up[2048], hun[2048], hup[2048]; xml_escape(socks5_user_name.c_str(), s5un, sizeof(s5un)); xml_escape(socks5_user_passwd.c_str(), s5up, sizeof(s5up)); xml_escape(http_user_name.c_str(), hun, sizeof(hun)); xml_escape(http_user_passwd.c_str(), hup, sizeof(hup)); out.printf( "\n" "%s" "%s" "%s" " %d\n" " %s\n" " %d\n" " %s\n" " %d\n" " %s\n" " %s\n" " %s\n" " %s\n" " %s\n" "\n", use_http_proxy?" \n":"", use_socks_proxy?" \n":"", use_http_auth?" \n":"", socks_version, socks_server_name.c_str(), socks_server_port, http_server_name.c_str(), http_server_port, s5un, s5up, hun, hup, noproxy_hosts.c_str() ); return 0; } void PROXY_INFO::clear() { use_http_proxy = false; use_socks_proxy = false; use_http_auth = false; socks_server_name.clear(); http_server_name.clear(); socks_server_port = 80; http_server_port = 80; socks5_user_name.clear(); socks5_user_passwd.clear(); http_user_name.clear(); http_user_passwd.clear(); socks_version = 0; autodetect_server_protocol = 0; autodetect_server_name.clear(); autodetect_server_port = 80; noproxy_hosts.clear(); } PROXY_INFO& PROXY_INFO::operator=(const PROXY_INFO& new_pi) { #ifdef _WIN32 // Request ownership of mutex. DWORD result = WaitForSingleObject(autodetect_mutex, 1000); if (result == WAIT_OBJECT_0) { #endif use_http_proxy = new_pi.use_http_proxy; use_socks_proxy = new_pi.use_socks_proxy; use_http_auth = new_pi.use_http_auth; socks_server_name = new_pi.socks_server_name; http_server_name = new_pi.http_server_name; socks_server_port = new_pi.socks_server_port; http_server_port = new_pi.http_server_port; socks5_user_name = new_pi.socks5_user_name; socks5_user_passwd = new_pi.socks5_user_passwd; http_user_name = new_pi.http_user_name; http_user_passwd = new_pi.http_user_passwd; socks_version = new_pi.socks_version; autodetect_server_protocol = new_pi.autodetect_server_protocol; autodetect_server_name = new_pi.autodetect_server_name; autodetect_server_port = new_pi.autodetect_server_port; noproxy_hosts = new_pi.noproxy_hosts; #ifdef _WIN32 } ReleaseMutex(autodetect_mutex); #endif return *this; } const char *BOINC_RCSID_af13db88e5 = "$Id$";