Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(704)

Unified Diff: chrome/browser/chromeos/proxy_config_service_impl.cc

Issue 14846004: Migrate ProxyConfigServiceImpl to NetworkStateHandler and NetworkProfileHandler. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased. Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/proxy_config_service_impl.cc
diff --git a/chrome/browser/chromeos/proxy_config_service_impl.cc b/chrome/browser/chromeos/proxy_config_service_impl.cc
index 71ba9761f9244b6cbc7e694ae0223396155520e1..aebe5d71b308b4aa351b95347e89bd0a6d737b74 100644
--- a/chrome/browser/chromeos/proxy_config_service_impl.cc
+++ b/chrome/browser/chromeos/proxy_config_service_impl.cc
@@ -4,393 +4,52 @@
#include "chrome/browser/chromeos/proxy_config_service_impl.h"
-#include <ostream>
-
#include "base/bind.h"
-#include "base/json/json_string_value_serializer.h"
#include "base/logging.h"
#include "base/prefs/pref_registry_simple.h"
#include "base/prefs/pref_service.h"
-#include "base/string_util.h"
+#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
-#include "chrome/browser/chromeos/cros/network_property_ui_data.h"
+#include "chrome/browser/chromeos/cros/network_library.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
#include "chrome/browser/chromeos/settings/cros_settings_names.h"
#include "chrome/browser/policy/browser_policy_connector.h"
#include "chrome/browser/policy/cloud/cloud_policy_constants.h"
-#include "chrome/browser/policy/proto/chromeos/chrome_device_policy.pb.h"
#include "chrome/browser/prefs/proxy_config_dictionary.h"
#include "chrome/browser/prefs/proxy_prefs.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/pref_names.h"
-#include "chromeos/network/network_ui_data.h"
-#include "chromeos/network/onc/onc_constants.h"
+#include "chromeos/network/network_profile.h"
+#include "chromeos/network/network_profile_handler.h"
+#include "chromeos/network/network_state.h"
+#include "chromeos/network/network_state_handler.h"
+#include "chromeos/network/onc/onc_utils.h"
#include "components/user_prefs/pref_registry_syncable.h"
-#include "content/public/browser/notification_service.h"
-#include "grit/generated_resources.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace em = enterprise_management;
namespace chromeos {
namespace {
-// Shoud we try to push this to base?
-// Helper comparator functor for the find_if call in |findIfEqual|
-template <class T>
-class EqualsComparator{
- public:
- explicit EqualsComparator(const T& key) : key_(key) { }
- bool operator() (const T& element) {
- return element.Equals(key_);
- }
- private:
- const T& key_;
-};
-
-// Tiny STL helper function to allow using the find_if syntax on objects that
-// doesn't use the operator== but implement the Equals function which is the
-// quasi standard with the coding style we have.
-template<class InputIterator, class T>
-InputIterator findIfEqual(InputIterator first, InputIterator last,
- const T& key) {
- return std::find_if(first, last, EqualsComparator<T>(key));
-}
-
-const char* ModeToString(ProxyConfigServiceImpl::ProxyConfig::Mode mode) {
- switch (mode) {
- case ProxyConfigServiceImpl::ProxyConfig::MODE_DIRECT:
- return "direct";
- case ProxyConfigServiceImpl::ProxyConfig::MODE_AUTO_DETECT:
- return "auto-detect";
- case ProxyConfigServiceImpl::ProxyConfig::MODE_PAC_SCRIPT:
- return "pacurl";
- case ProxyConfigServiceImpl::ProxyConfig::MODE_SINGLE_PROXY:
- return "single-proxy";
- case ProxyConfigServiceImpl::ProxyConfig::MODE_PROXY_PER_SCHEME:
- return "proxy-per-scheme";
- }
- NOTREACHED() << "Unrecognized mode type";
- return "";
-}
-
-const char* ConfigStateToString(ProxyPrefs::ConfigState state) {
- switch (state) {
- case ProxyPrefs::CONFIG_POLICY:
- return "config_policy";
- case ProxyPrefs::CONFIG_EXTENSION:
- return "config_extension";
- case ProxyPrefs::CONFIG_OTHER_PRECEDE:
- return "config_other_precede";
- case ProxyPrefs::CONFIG_SYSTEM:
- return "config_network"; // For ChromeOS, system is network.
- case ProxyPrefs::CONFIG_FALLBACK:
- return "config_recommended"; // Fallback is recommended.
- case ProxyPrefs::CONFIG_UNSET:
- return "config_unset";
- }
- NOTREACHED() << "Unrecognized config state type";
- return "";
-}
-
-// Returns true if proxy settings from |network| is editable.
-bool IsNetworkProxySettingsEditable(const Network* network) {
- if (!network)
- return true; // editable if no network given.
-
- NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary();
- const base::DictionaryValue* onc =
- network_library->FindOncForNetwork(network->unique_id());
-
- NetworkPropertyUIData proxy_settings_ui_data;
- proxy_settings_ui_data.ParseOncProperty(
- network->ui_data(),
- onc,
- onc::network_config::kProxySettings);
- return proxy_settings_ui_data.editable();
-}
-
-// Only unblock if needed for debugging.
-#if defined(NEED_DEBUG_LOG)
-std::ostream& operator<<(
- std::ostream& out,
- const ProxyConfigServiceImpl::ProxyConfig::ManualProxy& proxy) {
- out << (proxy.server.is_valid() ? proxy.server.ToURI() : "") << "\n";
- return out;
-}
-
-std::ostream& operator<<(std::ostream& out,
- const ProxyConfigServiceImpl::ProxyConfig& config) {
- switch (config.mode) {
- case ProxyConfigServiceImpl::ProxyConfig::MODE_DIRECT:
- case ProxyConfigServiceImpl::ProxyConfig::MODE_AUTO_DETECT:
- out << ModeToString(config.mode) << ", "
- << ConfigStateToString(config.state) << "\n";
- break;
- case ProxyConfigServiceImpl::ProxyConfig::MODE_PAC_SCRIPT:
- out << ModeToString(config.mode) << ", "
- << ConfigStateToString(config.state)
- << "\n PAC: " << config.automatic_proxy.pac_url << "\n";
- break;
- case ProxyConfigServiceImpl::ProxyConfig::MODE_SINGLE_PROXY:
- out << ModeToString(config.mode) << ", "
- << ConfigStateToString(config.state) << "\n " << config.single_proxy;
- break;
- case ProxyConfigServiceImpl::ProxyConfig::MODE_PROXY_PER_SCHEME:
- out << ModeToString(config.mode) << ", "
- << ConfigStateToString(config.state) << "\n"
- << " HTTP: " << config.http_proxy
- << " HTTPS: " << config.https_proxy
- << " FTP: " << config.ftp_proxy
- << " SOCKS: " << config.socks_proxy;
- break;
- default:
- NOTREACHED() << "Unrecognized proxy config mode";
- break;
- }
- if (config.mode == ProxyConfigServiceImpl::ProxyConfig::MODE_SINGLE_PROXY ||
- config.mode ==
- ProxyConfigServiceImpl::ProxyConfig::MODE_PROXY_PER_SCHEME) {
- out << "Bypass list: ";
- if (config.bypass_rules.rules().empty()) {
- out << "[None]";
- } else {
- const net::ProxyBypassRules& bypass_rules = config.bypass_rules;
- net::ProxyBypassRules::RuleList::const_iterator it;
- for (it = bypass_rules.rules().begin();
- it != bypass_rules.rules().end(); ++it) {
- out << "\n " << (*it)->ToString();
- }
- }
- }
- return out;
-}
-
-std::string ProxyConfigToString(
- const ProxyConfigServiceImpl::ProxyConfig& proxy_config) {
- std::ostringstream stream;
- stream << proxy_config;
- return stream.str();
-}
-#endif // defined(NEED_DEBUG_LOG)
-
-} // namespace
-
-//----------- ProxyConfigServiceImpl::ProxyConfig: public methods --------------
-
-ProxyConfigServiceImpl::ProxyConfig::ProxyConfig()
- : mode(MODE_DIRECT),
- state(ProxyPrefs::CONFIG_UNSET),
- user_modifiable(true) {}
-
-ProxyConfigServiceImpl::ProxyConfig::~ProxyConfig() {}
-
-bool ProxyConfigServiceImpl::ProxyConfig::FromNetProxyConfig(
- const net::ProxyConfig& net_config) {
- *this = ProxyConfigServiceImpl::ProxyConfig(); // Reset to default.
- const net::ProxyConfig::ProxyRules& rules = net_config.proxy_rules();
- switch (rules.type) {
- case net::ProxyConfig::ProxyRules::TYPE_NO_RULES:
- if (!net_config.HasAutomaticSettings()) {
- mode = ProxyConfig::MODE_DIRECT;
- } else if (net_config.auto_detect()) {
- mode = ProxyConfig::MODE_AUTO_DETECT;
- } else if (net_config.has_pac_url()) {
- mode = ProxyConfig::MODE_PAC_SCRIPT;
- automatic_proxy.pac_url = net_config.pac_url();
- } else {
- return false;
- }
- return true;
- case net::ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY:
- if (rules.single_proxies.IsEmpty())
- return false;
- mode = MODE_SINGLE_PROXY;
- single_proxy.server = rules.single_proxies.Get();
- bypass_rules = rules.bypass_rules;
- return true;
- case net::ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME:
- // Make sure we have valid server for at least one of the protocols.
- if (rules.proxies_for_http.IsEmpty() &&
- rules.proxies_for_https.IsEmpty() &&
- rules.proxies_for_ftp.IsEmpty() &&
- rules.fallback_proxies.IsEmpty()) {
- return false;
- }
- mode = MODE_PROXY_PER_SCHEME;
- if (!rules.proxies_for_http.IsEmpty())
- http_proxy.server = rules.proxies_for_http.Get();
- if (!rules.proxies_for_https.IsEmpty())
- https_proxy.server = rules.proxies_for_https.Get();
- if (!rules.proxies_for_ftp.IsEmpty())
- ftp_proxy.server = rules.proxies_for_ftp.Get();
- if (!rules.fallback_proxies.IsEmpty())
- socks_proxy.server = rules.fallback_proxies.Get();
- bypass_rules = rules.bypass_rules;
- return true;
- default:
- NOTREACHED() << "Unrecognized proxy config mode";
- break;
- }
- return false;
-}
-
-DictionaryValue* ProxyConfigServiceImpl::ProxyConfig::ToPrefProxyConfig() {
- switch (mode) {
- case MODE_DIRECT: {
- return ProxyConfigDictionary::CreateDirect();
- }
- case MODE_AUTO_DETECT: {
- return ProxyConfigDictionary::CreateAutoDetect();
- }
- case MODE_PAC_SCRIPT: {
- return ProxyConfigDictionary::CreatePacScript(
- automatic_proxy.pac_url.spec(), false);
- }
- case MODE_SINGLE_PROXY: {
- std::string spec;
- if (single_proxy.server.is_valid())
- spec = single_proxy.server.ToURI();
- return ProxyConfigDictionary::CreateFixedServers(
- spec, bypass_rules.ToString());
- }
- case MODE_PROXY_PER_SCHEME: {
- std::string spec;
- EncodeAndAppendProxyServer("http", http_proxy.server, &spec);
- EncodeAndAppendProxyServer("https", https_proxy.server, &spec);
- EncodeAndAppendProxyServer("ftp", ftp_proxy.server, &spec);
- EncodeAndAppendProxyServer("socks", socks_proxy.server, &spec);
- return ProxyConfigDictionary::CreateFixedServers(
- spec, bypass_rules.ToString());
- }
- default:
- break;
- }
- NOTREACHED() << "Unrecognized proxy config mode for preference";
- return NULL;
-}
-
-ProxyConfigServiceImpl::ProxyConfig::ManualProxy*
- ProxyConfigServiceImpl::ProxyConfig::MapSchemeToProxy(
- const std::string& scheme) {
- if (scheme == "http")
- return &http_proxy;
- if (scheme == "https")
- return &https_proxy;
- if (scheme == "ftp")
- return &ftp_proxy;
- if (scheme == "socks")
- return &socks_proxy;
- NOTREACHED() << "Invalid scheme: " << scheme;
- return NULL;
-}
-
-bool ProxyConfigServiceImpl::ProxyConfig::DeserializeForDevice(
- const std::string& input) {
- em::DeviceProxySettingsProto proxy_proto;
- if (!proxy_proto.ParseFromString(input))
- return false;
-
- const std::string& mode_string(proxy_proto.proxy_mode());
- if (mode_string == ProxyPrefs::kDirectProxyModeName) {
- mode = MODE_DIRECT;
- } else if (mode_string == ProxyPrefs::kAutoDetectProxyModeName) {
- mode = MODE_AUTO_DETECT;
- } else if (mode_string == ProxyPrefs::kPacScriptProxyModeName) {
- mode = MODE_PAC_SCRIPT;
- if (proxy_proto.has_proxy_pac_url())
- automatic_proxy.pac_url = GURL(proxy_proto.proxy_pac_url());
- } else if (mode_string == ProxyPrefs::kFixedServersProxyModeName) {
- net::ProxyConfig::ProxyRules rules;
- rules.ParseFromString(proxy_proto.proxy_server());
- switch (rules.type) {
- case net::ProxyConfig::ProxyRules::TYPE_NO_RULES:
- return false;
- case net::ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY:
- if (rules.single_proxies.IsEmpty())
- return false;
- mode = MODE_SINGLE_PROXY;
- single_proxy.server = rules.single_proxies.Get();
- return true;
- case net::ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME:
- // Make sure we have valid server for at least one of the protocols.
- if (rules.proxies_for_http.IsEmpty() &&
- rules.proxies_for_https.IsEmpty() &&
- rules.proxies_for_ftp.IsEmpty() &&
- rules.fallback_proxies.IsEmpty()) {
- return false;
- }
- mode = MODE_PROXY_PER_SCHEME;
- if (!rules.proxies_for_http.IsEmpty())
- http_proxy.server = rules.proxies_for_http.Get();
- if (!rules.proxies_for_https.IsEmpty())
- https_proxy.server = rules.proxies_for_https.Get();
- if (!rules.proxies_for_ftp.IsEmpty())
- ftp_proxy.server = rules.proxies_for_ftp.Get();
- if (!rules.fallback_proxies.IsEmpty())
- socks_proxy.server = rules.fallback_proxies.Get();
- break;
- }
- } else {
- NOTREACHED() << "Unrecognized proxy config mode";
- return false;
- }
-
- if (proxy_proto.has_proxy_bypass_list())
- bypass_rules.ParseFromString(proxy_proto.proxy_bypass_list());
-
- return true;
-}
-
-bool ProxyConfigServiceImpl::ProxyConfig::SerializeForNetwork(
- std::string* output) {
- scoped_ptr<DictionaryValue> proxy_dict_ptr(ToPrefProxyConfig());
- if (!proxy_dict_ptr.get())
+// Convert and store the proxy config of |pref_proxy_config| of
+// ProxyConfigDictionary format to |proxy_config|. Returns true if
+// |pref_proxy_config| was not empty and if it was successfully converted.
+bool ParseProxyConfig(const base::DictionaryValue& pref_proxy_config,
+ net::ProxyConfig* proxy_config) {
+ if (pref_proxy_config.empty())
return false;
- // Return empty string for direct mode for portal check to work correctly.
- DictionaryValue *dict = proxy_dict_ptr.get();
- ProxyConfigDictionary proxy_dict(dict);
- ProxyPrefs::ProxyMode mode;
- if (proxy_dict.GetMode(&mode)) {
- if (mode == ProxyPrefs::MODE_DIRECT) {
- output->clear();
- return true;
- }
- }
- JSONStringValueSerializer serializer(output);
- return serializer.Serialize(*dict);
-}
-
-//----------- ProxyConfigServiceImpl::ProxyConfig: private methods -------------
-
-// static
-void ProxyConfigServiceImpl::ProxyConfig::EncodeAndAppendProxyServer(
- const std::string& url_scheme,
- const net::ProxyServer& server,
- std::string* spec) {
- if (!server.is_valid())
- return;
-
- if (!spec->empty())
- *spec += ';';
-
- if (!url_scheme.empty()) {
- *spec += url_scheme;
- *spec += "=";
- }
- *spec += server.ToURI();
+ ProxyConfigDictionary proxy_dict(&pref_proxy_config);
+ return PrefProxyConfigTrackerImpl::PrefConfigToNetConfig(proxy_dict,
+ proxy_config);
}
-//------------------- ProxyConfigServiceImpl: public methods -------------------
+} // namespace
ProxyConfigServiceImpl::ProxyConfigServiceImpl(PrefService* pref_service)
: PrefProxyConfigTrackerImpl(pref_service),
active_config_state_(ProxyPrefs::CONFIG_UNSET),
+ ui_proxy_config_service_(pref_service),
pointer_factory_(this) {
// Register for notifications of UseSharedProxies user preference.
@@ -401,189 +60,29 @@ ProxyConfigServiceImpl::ProxyConfigServiceImpl(PrefService* pref_service)
base::Unretained(this)));
}
- FetchProxyPolicy();
+ FetchDeviceProxySetting();
- // Register for shill network notifications.
- NetworkLibrary* network_lib = CrosLibrary::Get()->GetNetworkLibrary();
- OnActiveNetworkChanged(network_lib, network_lib->active_network());
- network_lib->AddNetworkManagerObserver(this);
+ // Register for changes to the default network.
+ NetworkStateHandler* state_handler = NetworkStateHandler::Get();
+ state_handler->AddObserver(this);
+ DefaultNetworkChanged(state_handler->DefaultNetwork());
}
ProxyConfigServiceImpl::~ProxyConfigServiceImpl() {
- NetworkLibrary* netlib = CrosLibrary::Get()->GetNetworkLibrary();
- if (netlib) {
- netlib->RemoveNetworkManagerObserver(this);
- netlib->RemoveObserverForAllNetworks(this);
- }
+ NetworkStateHandler::Get()->RemoveObserver(this);
stevenjb 2013/05/15 17:44:14 Test NetworkStateHandler::IsInitialized() here. (T
pneubeck (no reviews) 2013/05/15 20:24:48 Done.
}
-void ProxyConfigServiceImpl::UISetCurrentNetwork(
- const std::string& current_network) {
- Network* network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath(
- current_network);
- if (!network) {
- ResetUICache();
- LOG(ERROR) << "Can't find requested network " << current_network;
- return;
- }
- current_ui_network_ = current_network;
- OnUISetCurrentNetwork(network);
-}
-
-void ProxyConfigServiceImpl::UIMakeActiveNetworkCurrent() {
- Network* network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath(
- active_network_);
- if (!network) {
- ResetUICache();
- LOG(ERROR) << "Can't find requested network " << active_network_;
- return;
- }
- current_ui_network_ = active_network_;
- OnUISetCurrentNetwork(network);
-}
-
-void ProxyConfigServiceImpl::UIGetCurrentNetworkName(
- std::string* network_name) {
- if (!network_name)
- return;
- network_name->clear();
- Network* network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath(
- current_ui_network_);
- if (!network) {
- LOG(ERROR) << "Can't find requested network " << current_ui_network_;
- return;
- }
- if (network->name().empty() && network->type() == chromeos::TYPE_ETHERNET) {
- *network_name =
- l10n_util::GetStringUTF8(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET);
- } else {
- *network_name = network->name();
- }
-}
-
-void ProxyConfigServiceImpl::UIGetProxyConfig(ProxyConfig* config) {
- // Simply returns the copy last set from UI via UISetCurrentNetwork or
- // UIMakeActiveNetworkCurrent.
- *config = current_ui_config_;
-}
-
-bool ProxyConfigServiceImpl::UISetProxyConfigToDirect() {
- current_ui_config_.mode = ProxyConfig::MODE_DIRECT;
- OnUISetProxyConfig();
- return true;
-}
-
-bool ProxyConfigServiceImpl::UISetProxyConfigToAutoDetect() {
- current_ui_config_.mode = ProxyConfig::MODE_AUTO_DETECT;
- OnUISetProxyConfig();
- return true;
-}
-
-bool ProxyConfigServiceImpl::UISetProxyConfigToPACScript(const GURL& pac_url) {
- current_ui_config_.mode = ProxyConfig::MODE_PAC_SCRIPT;
- current_ui_config_.automatic_proxy.pac_url = pac_url;
- OnUISetProxyConfig();
- return true;
-}
-
-bool ProxyConfigServiceImpl::UISetProxyConfigToSingleProxy(
- const net::ProxyServer& server) {
- current_ui_config_.mode = ProxyConfig::MODE_SINGLE_PROXY;
- current_ui_config_.single_proxy.server = server;
- OnUISetProxyConfig();
- return true;
-}
-
-bool ProxyConfigServiceImpl::UISetProxyConfigToProxyPerScheme(
- const std::string& scheme, const net::ProxyServer& server) {
- ProxyConfig::ManualProxy* proxy = current_ui_config_.MapSchemeToProxy(scheme);
- if (!proxy) {
- NOTREACHED() << "Cannot set proxy: invalid scheme [" << scheme << "]";
- return false;
- }
- current_ui_config_.mode = ProxyConfig::MODE_PROXY_PER_SCHEME;
- proxy->server = server;
- OnUISetProxyConfig();
- return true;
-}
-
-bool ProxyConfigServiceImpl::UISetProxyConfigBypassRules(
- const net::ProxyBypassRules& bypass_rules) {
- if (current_ui_config_.mode != ProxyConfig::MODE_SINGLE_PROXY &&
- current_ui_config_.mode != ProxyConfig::MODE_PROXY_PER_SCHEME) {
- NOTREACHED();
- VLOG(1) << "Cannot set bypass rules for proxy mode ["
- << current_ui_config_.mode << "]";
- return false;
- }
- current_ui_config_.bypass_rules = bypass_rules;
- OnUISetProxyConfig();
- return true;
-}
-
-void ProxyConfigServiceImpl::AddNotificationCallback(base::Closure callback) {
-
- std::vector<base::Closure>::iterator iter =
- findIfEqual(callbacks_.begin(), callbacks_.end(), callback);
- if (iter == callbacks_.end())
- callbacks_.push_back(callback);
-}
-
-void ProxyConfigServiceImpl::RemoveNotificationCallback(
- base::Closure callback) {
- std::vector<base::Closure>::iterator iter =
- findIfEqual(callbacks_.begin(), callbacks_.end(), callback);
- if (iter != callbacks_.end())
- callbacks_.erase(iter);
+UIProxyConfigService& ProxyConfigServiceImpl::GetUIService() {
+ return ui_proxy_config_service_;
}
void ProxyConfigServiceImpl::OnProxyConfigChanged(
ProxyPrefs::ConfigState config_state,
const net::ProxyConfig& config) {
- VLOG(1) << "Got prefs change: " << ConfigStateToString(config_state)
+ VLOG(1) << "Got prefs change: "
+ << ProxyPrefs::ConfigStateToString(config_state)
<< ", mode=" << config.proxy_rules().type;
- Network* network = NULL;
- if (!active_network_.empty()) {
- network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath(
- active_network_);
- if (!network)
- LOG(ERROR) << "can't find requested network " << active_network_;
- }
- DetermineEffectiveConfig(network, true);
-}
-
-void ProxyConfigServiceImpl::OnNetworkManagerChanged(
- NetworkLibrary* network_lib) {
- VLOG(1) << "OnNetworkManagerChanged: use-shared-proxies="
- << GetUseSharedProxies();
- OnActiveNetworkChanged(network_lib, network_lib->active_network());
-}
-
-void ProxyConfigServiceImpl::OnNetworkChanged(NetworkLibrary* network_lib,
- const Network* network) {
- if (!network)
- return;
- VLOG(1) << "OnNetworkChanged: "
- << (network->name().empty() ? network->service_path() :
- network->name())
- << ", use-shared-proxies=" << GetUseSharedProxies();
- // We only care about active network.
- if (network == network_lib->active_network())
- OnActiveNetworkChanged(network_lib, network);
-}
-
-// static
-bool ProxyConfigServiceImpl::ParseProxyConfig(const Network* network,
- net::ProxyConfig* proxy_config) {
- if (!network || !proxy_config)
- return false;
- JSONStringValueSerializer serializer(network->proxy_config());
- scoped_ptr<Value> value(serializer.Deserialize(NULL, NULL));
- if (!value.get() || value->GetType() != Value::TYPE_DICTIONARY)
- return false;
- ProxyConfigDictionary proxy_dict(static_cast<DictionaryValue*>(value.get()));
- return PrefProxyConfigTrackerImpl::PrefConfigToNetConfig(proxy_dict,
- proxy_config);
+ DetermineEffectiveConfigFromDefaultNetwork();
}
// static
@@ -602,143 +101,100 @@ void ProxyConfigServiceImpl::RegisterUserPrefs(
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
}
-//------------------ ProxyConfigServiceImpl: private methods -------------------
-
void ProxyConfigServiceImpl::OnUseSharedProxiesChanged() {
- VLOG(1) << "New use-shared-proxies = " << GetUseSharedProxies();
-
- // Determine new proxy config which may have changed because of new
- // use-shared-proxies. If necessary, activate it.
- Network* network = NULL;
- if (!active_network_.empty()) {
- network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath(
- active_network_);
- if (!network)
- LOG(WARNING) << "Can't find requested network " << active_network_;
- }
- DetermineEffectiveConfig(network, true);
-}
-
-void ProxyConfigServiceImpl::OnUISetProxyConfig() {
- if (current_ui_network_.empty())
- return;
- // Update config to shill.
- std::string value;
- if (current_ui_config_.SerializeForNetwork(&value)) {
- VLOG(1) << "Set proxy (mode=" << current_ui_config_.mode
- << ") for " << current_ui_network_;
- current_ui_config_.state = ProxyPrefs::CONFIG_SYSTEM;
- SetProxyConfigForNetwork(current_ui_network_, value, false);
- }
-}
-
-void ProxyConfigServiceImpl::OnActiveNetworkChanged(NetworkLibrary* network_lib,
- const Network* active_network) {
- std::string new_network;
- if (active_network)
- new_network = active_network->service_path();
-
- if (active_network_ == new_network) { // Same active network.
- VLOG(1) << "Same active network: "
- << (new_network.empty() ? "empty" :
- (active_network->name().empty() ?
- new_network : active_network->name()));
- // Even though network is the same, its proxy config (e.g. if private
- // version of network replaces the shared version after login), or
- // use-shared-proxies setting (e.g. after login) may have changed,
- // so re-determine effective proxy config, and activate if different.
- if (active_network) {
- VLOG(1) << "Profile=" << active_network->profile_type()
- << "," << active_network->profile_path()
- << ", proxy=" << active_network->proxy_config();
- DetermineEffectiveConfig(active_network, true);
- }
+ VLOG(1) << "New use-shared-proxies = " << GetUseSharedProxies(prefs());
+ DetermineEffectiveConfigFromDefaultNetwork();
+}
+
+void ProxyConfigServiceImpl::DefaultNetworkChanged(
+ const NetworkState* new_network) {
+ std::string new_network_path;
+ if (new_network)
+ new_network_path = new_network->path();
+
+ VLOG(1) << "DefaultNetworkChanged to " << new_network_path << ".";
stevenjb 2013/05/15 17:44:14 nit: '' around path (which might be empty)
pneubeck (no reviews) 2013/05/15 20:24:48 Done.
+ VLOG_IF(1, new_network) << "New network: name=" << new_network->name()
+ << ", proxy=" << new_network->proxy_config()
+ << ", profile=" << new_network->profile_path();
+
+ // If necessary, migrate device proxy settings to per network settings.
+ // If this changes the proxy configuration, a notification will be triggered
+ // afterwards which will call this function again.
+ MigrateDeviceToUserProxyConfig(new_network);
+
+ // Even if the default network is the same, its proxy config (e.g. if private
+ // version of network replaces the shared version after login), or
+ // use-shared-proxies setting (e.g. after login) may have changed, so
+ // re-determine effective proxy config, and activate if different.
+ DetermineEffectiveConfigFromDefaultNetwork();
+}
+
+void ProxyConfigServiceImpl::MigrateDeviceToUserProxyConfig(
+ const NetworkState* network_state) {
+ if (!network_state ||
+ !network_state->proxy_config().empty() ||
stevenjb 2013/05/15 17:44:14 This is somewhat non-obvious. Can you add a commen
pneubeck (no reviews) 2013/05/15 20:24:48 Done.
+ device_config_.empty()) {
return;
}
- // If there was a previous active network, remove it as observer.
- if (!active_network_.empty())
- network_lib->RemoveNetworkObserver(active_network_, this);
-
- active_network_ = new_network;
+ const std::string& network_path = network_state->path();
+ VLOG(1) << "Try migrating device config to " << network_path;
- if (active_network_.empty()) {
- VLOG(1) << "New active network: empty";
- DetermineEffectiveConfig(active_network, true);
+ Network* network =
+ CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath(network_path);
+ if (!network)
return;
- }
- VLOG(1) << "New active network: path=" << active_network->service_path()
- << ", name=" << active_network->name()
- << ", profile=" << active_network->profile_type()
- << "," << active_network->profile_path()
- << ", proxy=" << active_network->proxy_config();
-
- // Register observer for new network.
- network_lib->AddNetworkObserver(active_network_, this);
-
- // If necessary, migrate config to shill.
- if (active_network->proxy_config().empty() && !device_config_.empty()) {
- VLOG(1) << "Try migrating device config to " << active_network_;
- SetProxyConfigForNetwork(active_network_, device_config_, true);
- } else {
- // Otherwise, determine and activate possibly new effective proxy config.
- DetermineEffectiveConfig(active_network, true);
- }
+ network->SetProxyConfig(device_config_);
stevenjb 2013/05/15 17:44:14 Can we move this to NetworkLibrary, i.e. CrosLibra
pneubeck (no reviews) 2013/05/15 20:24:48 Actually I had liked to remove this migration code
stevenjb 2013/05/16 17:04:34 If we eliminate If we eliminate this, or plan to e
+ VLOG(1) << "Set proxy for " << network_path << ", value=" << device_config_;
+ // Even in case the default network was changed, there's no need to apply
+ // the new proxy settings, because we will be notified afterwards.
}
-void ProxyConfigServiceImpl::SetProxyConfigForNetwork(
- const std::string& network_path, const std::string& value,
- bool only_set_if_empty) {
- Network* network = CrosLibrary::Get()->GetNetworkLibrary()->FindNetworkByPath(
- network_path);
- if (!network) {
- NOTREACHED() << "Can't find requested network " << network_path;
- return;
- }
- if (!only_set_if_empty || network->proxy_config().empty()) {
- network->SetProxyConfig(value);
- VLOG(1) << "Set proxy for "
- << (network->name().empty() ? network_path : network->name())
- << ", value=" << value;
- if (network_path == active_network_)
- DetermineEffectiveConfig(network, true);
- }
-}
-
-bool ProxyConfigServiceImpl::GetUseSharedProxies() {
- const PrefService::Preference* use_shared_proxies_pref =
- prefs()->FindPreference(prefs::kUseSharedProxies);
- if (!use_shared_proxies_pref) {
+// static
+bool ProxyConfigServiceImpl::GetUseSharedProxies(
+ const PrefService* pref_service) {
+ const PrefService::Preference* use_shared_proxies =
+ pref_service->FindPreference(prefs::kUseSharedProxies);
+ if (!use_shared_proxies) {
// Make sure that proxies are always enabled at sign in screen.
return !UserManager::Get()->IsUserLoggedIn();
}
- return use_shared_proxies_.GetValue();
+ return use_shared_proxies->GetValue();
}
-bool ProxyConfigServiceImpl::IgnoreProxy(const Network* network) {
- if (network->profile_type() == PROFILE_USER)
+// static
+bool ProxyConfigServiceImpl::IgnoreProxy(const PrefService* pref_service,
+ const std::string network_profile_path,
+ onc::ONCSource onc_source) {
+ const NetworkProfile* profile =
+ NetworkProfileHandler::Get()->GetProfileForPath(network_profile_path);
+ if (!profile) {
+ LOG(WARNING) << "Unknown profile_path " << network_profile_path;
+ return true;
+ }
+ if (profile->type() == NetworkProfile::TYPE_USER)
return false;
- if (network->ui_data().onc_source() == onc::ONC_SOURCE_DEVICE_POLICY &&
+ if (onc_source == onc::ONC_SOURCE_DEVICE_POLICY &&
UserManager::Get()->IsUserLoggedIn()) {
policy::BrowserPolicyConnector* connector =
g_browser_process->browser_policy_connector();
const User* logged_in_user = UserManager::Get()->GetLoggedInUser();
if (connector->GetUserAffiliation(logged_in_user->email()) ==
policy::USER_AFFILIATION_MANAGED) {
- VLOG(1) << "Respecting proxy for network " << network->name()
- << ", as logged-in user belongs to the domain the device "
- << "is enrolled to.";
+ VLOG(1) << "Respecting proxy for network, as logged-in user belongs to "
+ << "the domain the device is enrolled to.";
return false;
}
}
- return !GetUseSharedProxies();
+ return !GetUseSharedProxies(pref_service);
}
-void ProxyConfigServiceImpl::DetermineEffectiveConfig(const Network* network,
- bool activate) {
+void ProxyConfigServiceImpl::DetermineEffectiveConfigFromDefaultNetwork() {
+ const NetworkState* network = NetworkStateHandler::Get()->DefaultNetwork();
+
// Get prefs proxy config if available.
net::ProxyConfig pref_config;
ProxyPrefs::ConfigState pref_state = GetProxyConfig(&pref_config);
@@ -747,22 +203,21 @@ void ProxyConfigServiceImpl::DetermineEffectiveConfig(const Network* network,
net::ProxyConfig network_config;
net::ProxyConfigService::ConfigAvailability network_availability =
net::ProxyConfigService::CONFIG_UNSET;
- bool ignore_proxy = activate;
+ bool ignore_proxy = true;
if (network) {
// If we're activating proxy, ignore proxy if necessary;
// otherwise, for ui, get actual proxy to show user.
- ignore_proxy = activate ? IgnoreProxy(network) : false;
+ ignore_proxy =
+ IgnoreProxy(prefs(), network->profile_path(), network->onc_source());
// If network is shared but use-shared-proxies is off, use direct mode.
if (ignore_proxy) {
VLOG(1) << "Shared network && !use-shared-proxies, use direct";
network_availability = net::ProxyConfigService::CONFIG_VALID;
- } else if (!network->proxy_config().empty()) {
+ } else if (ParseProxyConfig(network->proxy_config(), &network_config)) {
// Network is private or shared with user using shared proxies.
- if (ParseProxyConfig(network, &network_config)) {
- VLOG(1) << this << ": using network proxy: "
- << network->proxy_config();
- network_availability = net::ProxyConfigService::CONFIG_VALID;
- }
+ VLOG(1) << this << ": using network proxy: "
+ << network->proxy_config();
+ network_availability = net::ProxyConfigService::CONFIG_VALID;
}
}
@@ -773,112 +228,66 @@ void ProxyConfigServiceImpl::DetermineEffectiveConfig(const Network* network,
network_availability, network_config, ignore_proxy,
&effective_config_state, &effective_config);
- // Determine if we should activate effective proxy and which proxy config to
- // store it.
- if (activate) { // Activate effective proxy and store into |active_config_|.
- // If last update didn't complete, we definitely update now.
- bool update_now = update_pending();
- if (!update_now) { // Otherwise, only update now if there're changes.
- update_now = active_config_state_ != effective_config_state ||
- (active_config_state_ != ProxyPrefs::CONFIG_UNSET &&
- !active_config_.Equals(effective_config));
- }
- if (update_now) { // Activate and store new effective config.
- active_config_state_ = effective_config_state;
- if (active_config_state_ != ProxyPrefs::CONFIG_UNSET)
- active_config_ = effective_config;
- // If effective config is from system (i.e. network), it's considered a
- // special kind of prefs that ranks below policy/extension but above
- // others, so bump it up to CONFIG_OTHER_PRECEDE to force its precedence
- // when PrefProxyConfigTrackerImpl pushes it to ChromeProxyConfigService.
- if (effective_config_state == ProxyPrefs::CONFIG_SYSTEM)
- effective_config_state = ProxyPrefs::CONFIG_OTHER_PRECEDE;
- // If config is manual, add rule to bypass local host.
- if (effective_config.proxy_rules().type !=
- net::ProxyConfig::ProxyRules::TYPE_NO_RULES)
- effective_config.proxy_rules().bypass_rules.AddRuleToBypassLocal();
- PrefProxyConfigTrackerImpl::OnProxyConfigChanged(effective_config_state,
- effective_config);
- if (VLOG_IS_ON(1) && !update_pending()) { // Update was successful.
- scoped_ptr<DictionaryValue> config_dict(static_cast<DictionaryValue*>(
- effective_config.ToValue()));
- std::string config_value;
- JSONStringValueSerializer serializer(&config_value);
- serializer.Serialize(*config_dict.get());
- VLOG(1) << this << ": Proxy changed: "
- << ConfigStateToString(active_config_state_)
- << ", " << config_value;
- }
- }
- } else { // For UI, store effective proxy into |current_ui_config_|.
- current_ui_config_.FromNetProxyConfig(effective_config);
- current_ui_config_.state = effective_config_state;
- if (PrefPrecedes(effective_config_state)) {
- current_ui_config_.user_modifiable = false;
- } else if (!IsNetworkProxySettingsEditable(network)) {
- // TODO(xiyuan): Figure out the right way to set config state for managed
- // network.
- current_ui_config_.state = ProxyPrefs::CONFIG_POLICY;
- current_ui_config_.user_modifiable = false;
- } else {
- current_ui_config_.user_modifiable = !network || !IgnoreProxy(network);
- }
- }
-}
-
-void ProxyConfigServiceImpl::OnUISetCurrentNetwork(const Network* network) {
- DetermineEffectiveConfig(network, false);
- VLOG(1) << "Current ui network: "
- << (network->name().empty() ? current_ui_network_ : network->name())
- << ", " << ModeToString(current_ui_config_.mode)
- << ", " << ConfigStateToString(current_ui_config_.state)
- << ", modifiable:" << current_ui_config_.user_modifiable;
- // Notify whoever is interested in this change.
- std::vector<base::Closure>::iterator iter = callbacks_.begin();
- while (iter != callbacks_.end()) {
- if (iter->is_null()) {
- iter = callbacks_.erase(iter);
- } else {
- iter->Run();
- ++iter;
+ // Activate effective proxy and store into |active_config_|.
+ // If last update didn't complete, we definitely update now.
+ bool update_now = update_pending();
+ if (!update_now) { // Otherwise, only update now if there're changes.
+ update_now = active_config_state_ != effective_config_state ||
+ (active_config_state_ != ProxyPrefs::CONFIG_UNSET &&
+ !active_config_.Equals(effective_config));
+ }
+ if (update_now) { // Activate and store new effective config.
+ active_config_state_ = effective_config_state;
+ if (active_config_state_ != ProxyPrefs::CONFIG_UNSET)
+ active_config_ = effective_config;
+ // If effective config is from system (i.e. network), it's considered a
+ // special kind of prefs that ranks below policy/extension but above
+ // others, so bump it up to CONFIG_OTHER_PRECEDE to force its precedence
+ // when PrefProxyConfigTrackerImpl pushes it to ChromeProxyConfigService.
+ if (effective_config_state == ProxyPrefs::CONFIG_SYSTEM)
+ effective_config_state = ProxyPrefs::CONFIG_OTHER_PRECEDE;
+ // If config is manual, add rule to bypass local host.
+ if (effective_config.proxy_rules().type !=
+ net::ProxyConfig::ProxyRules::TYPE_NO_RULES)
+ effective_config.proxy_rules().bypass_rules.AddRuleToBypassLocal();
+ PrefProxyConfigTrackerImpl::OnProxyConfigChanged(effective_config_state,
+ effective_config);
+ if (VLOG_IS_ON(1) && !update_pending()) { // Update was successful.
+ scoped_ptr<base::DictionaryValue> config_dict(
+ effective_config.ToValue());
+ VLOG(1) << this << ": Proxy changed: "
+ << ProxyPrefs::ConfigStateToString(active_config_state_)
+ << ", " << *config_dict;
}
}
}
-void ProxyConfigServiceImpl::ResetUICache() {
- current_ui_network_.clear();
- current_ui_config_ = ProxyConfig();
-}
-
-void ProxyConfigServiceImpl::FetchProxyPolicy() {
+void ProxyConfigServiceImpl::FetchDeviceProxySetting() {
if (CrosSettingsProvider::TRUSTED !=
CrosSettings::Get()->PrepareTrustedValues(
- base::Bind(&ProxyConfigServiceImpl::FetchProxyPolicy,
+ base::Bind(&ProxyConfigServiceImpl::FetchDeviceProxySetting,
pointer_factory_.GetWeakPtr()))) {
return;
}
- std::string policy_value;
+ std::string device_value;
if (!CrosSettings::Get()->GetString(kSettingProxyEverywhere,
- &policy_value)) {
+ &device_value)) {
VLOG(1) << "No proxy configuration exists in the device settings.";
device_config_.clear();
return;
}
VLOG(1) << "Retrieved proxy setting from device, value=["
- << policy_value << "]";
- ProxyConfig device_config;
- if (!device_config.DeserializeForDevice(policy_value) ||
+ << device_value << "]";
+ UIProxyConfig device_config;
+ if (!device_config.DeserializeForDevice(device_value) ||
!device_config.SerializeForNetwork(&device_config_)) {
LOG(WARNING) << "Can't deserialize device setting or serialize for network";
device_config_.clear();
return;
}
- if (!active_network_.empty()) {
- VLOG(1) << "Try migrating device config to " << active_network_;
- SetProxyConfigForNetwork(active_network_, device_config_, true);
- }
+ MigrateDeviceToUserProxyConfig(NetworkStateHandler::Get()->DefaultNetwork());
}
} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698