| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/proxy/proxy_config_service_linux.h" | 5 #include "net/proxy/proxy_config_service_linux.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <gconf/gconf-client.h> | 9 #include <gconf/gconf-client.h> |
| 10 #include <limits.h> | 10 #include <limits.h> |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 host.resize(host.length() - 1); | 76 host.resize(host.length() - 1); |
| 77 return host; | 77 return host; |
| 78 } | 78 } |
| 79 | 79 |
| 80 } // namespace | 80 } // namespace |
| 81 | 81 |
| 82 bool ProxyConfigServiceLinux::Delegate::GetProxyFromEnvVarForScheme( | 82 bool ProxyConfigServiceLinux::Delegate::GetProxyFromEnvVarForScheme( |
| 83 const char* variable, ProxyServer::Scheme scheme, | 83 const char* variable, ProxyServer::Scheme scheme, |
| 84 ProxyServer* result_server) { | 84 ProxyServer* result_server) { |
| 85 std::string env_value; | 85 std::string env_value; |
| 86 if (env_var_getter_->GetEnv(variable, &env_value)) { | 86 if (env_var_getter_->GetVar(variable, &env_value)) { |
| 87 if (!env_value.empty()) { | 87 if (!env_value.empty()) { |
| 88 env_value = FixupProxyHostScheme(scheme, env_value); | 88 env_value = FixupProxyHostScheme(scheme, env_value); |
| 89 ProxyServer proxy_server = | 89 ProxyServer proxy_server = |
| 90 ProxyServer::FromURI(env_value, ProxyServer::SCHEME_HTTP); | 90 ProxyServer::FromURI(env_value, ProxyServer::SCHEME_HTTP); |
| 91 if (proxy_server.is_valid() && !proxy_server.is_direct()) { | 91 if (proxy_server.is_valid() && !proxy_server.is_direct()) { |
| 92 *result_server = proxy_server; | 92 *result_server = proxy_server; |
| 93 return true; | 93 return true; |
| 94 } else { | 94 } else { |
| 95 LOG(ERROR) << "Failed to parse environment variable " << variable; | 95 LOG(ERROR) << "Failed to parse environment variable " << variable; |
| 96 } | 96 } |
| 97 } | 97 } |
| 98 } | 98 } |
| 99 return false; | 99 return false; |
| 100 } | 100 } |
| 101 | 101 |
| 102 bool ProxyConfigServiceLinux::Delegate::GetProxyFromEnvVar( | 102 bool ProxyConfigServiceLinux::Delegate::GetProxyFromEnvVar( |
| 103 const char* variable, ProxyServer* result_server) { | 103 const char* variable, ProxyServer* result_server) { |
| 104 return GetProxyFromEnvVarForScheme(variable, ProxyServer::SCHEME_HTTP, | 104 return GetProxyFromEnvVarForScheme(variable, ProxyServer::SCHEME_HTTP, |
| 105 result_server); | 105 result_server); |
| 106 } | 106 } |
| 107 | 107 |
| 108 bool ProxyConfigServiceLinux::Delegate::GetConfigFromEnv(ProxyConfig* config) { | 108 bool ProxyConfigServiceLinux::Delegate::GetConfigFromEnv(ProxyConfig* config) { |
| 109 // Check for automatic configuration first, in | 109 // Check for automatic configuration first, in |
| 110 // "auto_proxy". Possibly only the "environment_proxy" firefox | 110 // "auto_proxy". Possibly only the "environment_proxy" firefox |
| 111 // extension has ever used this, but it still sounds like a good | 111 // extension has ever used this, but it still sounds like a good |
| 112 // idea. | 112 // idea. |
| 113 std::string auto_proxy; | 113 std::string auto_proxy; |
| 114 if (env_var_getter_->GetEnv("auto_proxy", &auto_proxy)) { | 114 if (env_var_getter_->GetVar("auto_proxy", &auto_proxy)) { |
| 115 if (auto_proxy.empty()) { | 115 if (auto_proxy.empty()) { |
| 116 // Defined and empty => autodetect | 116 // Defined and empty => autodetect |
| 117 config->set_auto_detect(true); | 117 config->set_auto_detect(true); |
| 118 } else { | 118 } else { |
| 119 // specified autoconfig URL | 119 // specified autoconfig URL |
| 120 config->set_pac_url(GURL(auto_proxy)); | 120 config->set_pac_url(GURL(auto_proxy)); |
| 121 } | 121 } |
| 122 return true; | 122 return true; |
| 123 } | 123 } |
| 124 // "all_proxy" is a shortcut to avoid defining {http,https,ftp}_proxy. | 124 // "all_proxy" is a shortcut to avoid defining {http,https,ftp}_proxy. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 144 if (have_http || have_https || have_ftp) { | 144 if (have_http || have_https || have_ftp) { |
| 145 // mustn't change type unless some rules are actually set. | 145 // mustn't change type unless some rules are actually set. |
| 146 config->proxy_rules().type = | 146 config->proxy_rules().type = |
| 147 ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME; | 147 ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME; |
| 148 } | 148 } |
| 149 } | 149 } |
| 150 if (config->proxy_rules().empty()) { | 150 if (config->proxy_rules().empty()) { |
| 151 // If the above were not defined, try for socks. | 151 // If the above were not defined, try for socks. |
| 152 ProxyServer::Scheme scheme = ProxyServer::SCHEME_SOCKS4; | 152 ProxyServer::Scheme scheme = ProxyServer::SCHEME_SOCKS4; |
| 153 std::string env_version; | 153 std::string env_version; |
| 154 if (env_var_getter_->GetEnv("SOCKS_VERSION", &env_version) | 154 if (env_var_getter_->GetVar("SOCKS_VERSION", &env_version) |
| 155 && env_version == "5") | 155 && env_version == "5") |
| 156 scheme = ProxyServer::SCHEME_SOCKS5; | 156 scheme = ProxyServer::SCHEME_SOCKS5; |
| 157 if (GetProxyFromEnvVarForScheme("SOCKS_SERVER", scheme, &proxy_server)) { | 157 if (GetProxyFromEnvVarForScheme("SOCKS_SERVER", scheme, &proxy_server)) { |
| 158 config->proxy_rules().type = ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY; | 158 config->proxy_rules().type = ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY; |
| 159 config->proxy_rules().single_proxy = proxy_server; | 159 config->proxy_rules().single_proxy = proxy_server; |
| 160 } | 160 } |
| 161 } | 161 } |
| 162 // Look for the proxy bypass list. | 162 // Look for the proxy bypass list. |
| 163 std::string no_proxy; | 163 std::string no_proxy; |
| 164 env_var_getter_->GetEnv("no_proxy", &no_proxy); | 164 env_var_getter_->GetVar("no_proxy", &no_proxy); |
| 165 if (config->proxy_rules().empty()) { | 165 if (config->proxy_rules().empty()) { |
| 166 // Having only "no_proxy" set, presumably to "*", makes it | 166 // Having only "no_proxy" set, presumably to "*", makes it |
| 167 // explicit that env vars do specify a configuration: having no | 167 // explicit that env vars do specify a configuration: having no |
| 168 // rules specified only means the user explicitly asks for direct | 168 // rules specified only means the user explicitly asks for direct |
| 169 // connections. | 169 // connections. |
| 170 return !no_proxy.empty(); | 170 return !no_proxy.empty(); |
| 171 } | 171 } |
| 172 // Note that this uses "suffix" matching. So a bypass of "google.com" | 172 // Note that this uses "suffix" matching. So a bypass of "google.com" |
| 173 // is understood to mean a bypass of "*google.com". | 173 // is understood to mean a bypass of "*google.com". |
| 174 config->proxy_rules().bypass_rules.ParseFromStringUsingSuffixMatching( | 174 config->proxy_rules().bypass_rules.ParseFromStringUsingSuffixMatching( |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 class GConfSettingGetterImplKDE | 421 class GConfSettingGetterImplKDE |
| 422 : public ProxyConfigServiceLinux::GConfSettingGetter, | 422 : public ProxyConfigServiceLinux::GConfSettingGetter, |
| 423 public base::MessagePumpLibevent::Watcher { | 423 public base::MessagePumpLibevent::Watcher { |
| 424 public: | 424 public: |
| 425 explicit GConfSettingGetterImplKDE(base::Environment* env_var_getter) | 425 explicit GConfSettingGetterImplKDE(base::Environment* env_var_getter) |
| 426 : inotify_fd_(-1), notify_delegate_(NULL), indirect_manual_(false), | 426 : inotify_fd_(-1), notify_delegate_(NULL), indirect_manual_(false), |
| 427 auto_no_pac_(false), reversed_bypass_list_(false), | 427 auto_no_pac_(false), reversed_bypass_list_(false), |
| 428 env_var_getter_(env_var_getter), file_loop_(NULL) { | 428 env_var_getter_(env_var_getter), file_loop_(NULL) { |
| 429 // Derive the location of the kde config dir from the environment. | 429 // Derive the location of the kde config dir from the environment. |
| 430 std::string home; | 430 std::string home; |
| 431 if (env_var_getter->GetEnv("KDEHOME", &home) && !home.empty()) { | 431 if (env_var_getter->GetVar("KDEHOME", &home) && !home.empty()) { |
| 432 // $KDEHOME is set. Use it unconditionally. | 432 // $KDEHOME is set. Use it unconditionally. |
| 433 kde_config_dir_ = KDEHomeToConfigPath(FilePath(home)); | 433 kde_config_dir_ = KDEHomeToConfigPath(FilePath(home)); |
| 434 } else { | 434 } else { |
| 435 // $KDEHOME is unset. Try to figure out what to use. This seems to be | 435 // $KDEHOME is unset. Try to figure out what to use. This seems to be |
| 436 // the common case on most distributions. | 436 // the common case on most distributions. |
| 437 if (!env_var_getter->GetEnv(base::env_vars::kHome, &home)) | 437 if (!env_var_getter->GetVar(base::env_vars::kHome, &home)) |
| 438 // User has no $HOME? Give up. Later we'll report the failure. | 438 // User has no $HOME? Give up. Later we'll report the failure. |
| 439 return; | 439 return; |
| 440 if (base::GetDesktopEnvironment(env_var_getter) == | 440 if (base::GetDesktopEnvironment(env_var_getter) == |
| 441 base::DESKTOP_ENVIRONMENT_KDE3) { | 441 base::DESKTOP_ENVIRONMENT_KDE3) { |
| 442 // KDE3 always uses .kde for its configuration. | 442 // KDE3 always uses .kde for its configuration. |
| 443 FilePath kde_path = FilePath(home).Append(".kde"); | 443 FilePath kde_path = FilePath(home).Append(".kde"); |
| 444 kde_config_dir_ = KDEHomeToConfigPath(kde_path); | 444 kde_config_dir_ = KDEHomeToConfigPath(kde_path); |
| 445 } else { | 445 } else { |
| 446 // Some distributions patch KDE4 to use .kde4 instead of .kde, so that | 446 // Some distributions patch KDE4 to use .kde4 instead of .kde, so that |
| 447 // both can be installed side-by-side. Sadly they don't all do this, and | 447 // both can be installed side-by-side. Sadly they don't all do this, and |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 LOG(WARNING) << | 681 LOG(WARNING) << |
| 682 "Proxy authentication parameters ignored, see bug 16709"; | 682 "Proxy authentication parameters ignored, see bug 16709"; |
| 683 } | 683 } |
| 684 } | 684 } |
| 685 } | 685 } |
| 686 | 686 |
| 687 void ResolveIndirect(const std::string& key) { | 687 void ResolveIndirect(const std::string& key) { |
| 688 string_map_type::iterator it = string_table_.find(key); | 688 string_map_type::iterator it = string_table_.find(key); |
| 689 if (it != string_table_.end()) { | 689 if (it != string_table_.end()) { |
| 690 std::string value; | 690 std::string value; |
| 691 if (env_var_getter_->GetEnv(it->second.c_str(), &value)) | 691 if (env_var_getter_->GetVar(it->second.c_str(), &value)) |
| 692 it->second = value; | 692 it->second = value; |
| 693 else | 693 else |
| 694 string_table_.erase(it); | 694 string_table_.erase(it); |
| 695 } | 695 } |
| 696 } | 696 } |
| 697 | 697 |
| 698 void ResolveIndirectList(const std::string& key) { | 698 void ResolveIndirectList(const std::string& key) { |
| 699 strings_map_type::iterator it = strings_table_.find(key); | 699 strings_map_type::iterator it = strings_table_.find(key); |
| 700 if (it != strings_table_.end()) { | 700 if (it != strings_table_.end()) { |
| 701 std::string value; | 701 std::string value; |
| 702 if (!it->second.empty() && | 702 if (!it->second.empty() && |
| 703 env_var_getter_->GetEnv(it->second[0].c_str(), &value)) | 703 env_var_getter_->GetVar(it->second[0].c_str(), &value)) |
| 704 AddHostList(key, value); | 704 AddHostList(key, value); |
| 705 else | 705 else |
| 706 strings_table_.erase(it); | 706 strings_table_.erase(it); |
| 707 } | 707 } |
| 708 } | 708 } |
| 709 | 709 |
| 710 // The settings in kioslaverc could occur in any order, but some affect | 710 // The settings in kioslaverc could occur in any order, but some affect |
| 711 // others. Rather than read the whole file in and then query them in an | 711 // others. Rather than read the whole file in and then query them in an |
| 712 // order that allows us to handle that, we read the settings in whatever | 712 // order that allows us to handle that, we read the settings in whatever |
| 713 // order they occur and do any necessary tweaking after we finish. | 713 // order they occur and do any necessary tweaking after we finish. |
| (...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1232 : delegate_(new Delegate(env_var_getter)) { | 1232 : delegate_(new Delegate(env_var_getter)) { |
| 1233 } | 1233 } |
| 1234 | 1234 |
| 1235 ProxyConfigServiceLinux::ProxyConfigServiceLinux( | 1235 ProxyConfigServiceLinux::ProxyConfigServiceLinux( |
| 1236 base::Environment* env_var_getter, | 1236 base::Environment* env_var_getter, |
| 1237 GConfSettingGetter* gconf_getter) | 1237 GConfSettingGetter* gconf_getter) |
| 1238 : delegate_(new Delegate(env_var_getter, gconf_getter)) { | 1238 : delegate_(new Delegate(env_var_getter, gconf_getter)) { |
| 1239 } | 1239 } |
| 1240 | 1240 |
| 1241 } // namespace net | 1241 } // namespace net |
| OLD | NEW |