|  | // Copyright 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "chrome/browser/chromeos/policy/device_network_configuration_updater.h" | 
|  |  | 
|  | #include "base/bind.h" | 
|  | #include "base/bind_helpers.h" | 
|  | #include "chrome/browser/chromeos/settings/cros_settings.h" | 
|  | #include "chromeos/network/managed_network_configuration_handler.h" | 
|  | #include "chromeos/network/network_device_handler.h" | 
|  | #include "chromeos/settings/cros_settings_names.h" | 
|  | #include "chromeos/settings/cros_settings_provider.h" | 
|  | #include "policy/policy_constants.h" | 
|  |  | 
|  | namespace policy { | 
|  |  | 
|  | DeviceNetworkConfigurationUpdater::~DeviceNetworkConfigurationUpdater() {} | 
|  |  | 
|  | // static | 
|  | scoped_ptr<DeviceNetworkConfigurationUpdater> | 
|  | DeviceNetworkConfigurationUpdater::CreateForDevicePolicy( | 
|  | PolicyService* policy_service, | 
|  | chromeos::ManagedNetworkConfigurationHandler* network_config_handler, | 
|  | chromeos::NetworkDeviceHandler* network_device_handler, | 
|  | chromeos::CrosSettings* cros_settings) { | 
|  | scoped_ptr<DeviceNetworkConfigurationUpdater> updater( | 
|  | new DeviceNetworkConfigurationUpdater(policy_service, | 
|  | network_config_handler, | 
|  | network_device_handler, | 
|  | cros_settings)); | 
|  | updater->Init(); | 
|  | return updater.Pass(); | 
|  | } | 
|  |  | 
|  | DeviceNetworkConfigurationUpdater::DeviceNetworkConfigurationUpdater( | 
|  | PolicyService* policy_service, | 
|  | chromeos::ManagedNetworkConfigurationHandler* network_config_handler, | 
|  | chromeos::NetworkDeviceHandler* network_device_handler, | 
|  | chromeos::CrosSettings* cros_settings) | 
|  | : NetworkConfigurationUpdater(onc::ONC_SOURCE_DEVICE_POLICY, | 
|  | key::kDeviceOpenNetworkConfiguration, | 
|  | policy_service, | 
|  | network_config_handler), | 
|  | network_device_handler_(network_device_handler), | 
|  | cros_settings_(cros_settings), | 
|  | weak_factory_(this) { | 
|  | DCHECK(network_device_handler_); | 
|  | data_roaming_setting_subscription_ = cros_settings->AddSettingsObserver( | 
|  | chromeos::kSignedDataRoamingEnabled, | 
|  | base::Bind( | 
|  | &DeviceNetworkConfigurationUpdater::OnDataRoamingSettingChanged, | 
|  | base::Unretained(this))); | 
|  | } | 
|  |  | 
|  | void DeviceNetworkConfigurationUpdater::Init() { | 
|  | NetworkConfigurationUpdater::Init(); | 
|  |  | 
|  | // Apply the roaming setting initially. | 
|  | OnDataRoamingSettingChanged(); | 
|  | } | 
|  |  | 
|  | void DeviceNetworkConfigurationUpdater::ImportCertificates( | 
|  | const base::ListValue& certificates_onc) { | 
|  | // Importing CA and server certs from device policy is not  allowed, while | 
|  | // importing client is not yet supported (as a system-wide PKCS#11 token to | 
|  | // which they should be imported does not exists at the time). | 
|  | } | 
|  |  | 
|  | void DeviceNetworkConfigurationUpdater::ApplyNetworkPolicy( | 
|  | base::ListValue* network_configs_onc, | 
|  | base::DictionaryValue* global_network_config) { | 
|  | network_config_handler_->SetPolicy(onc_source_, | 
|  | std::string() /* no username hash */, | 
|  | *network_configs_onc, | 
|  | *global_network_config); | 
|  | } | 
|  |  | 
|  | void DeviceNetworkConfigurationUpdater::OnDataRoamingSettingChanged() { | 
|  | chromeos::CrosSettingsProvider::TrustedStatus trusted_status = | 
|  | cros_settings_->PrepareTrustedValues(base::Bind( | 
|  | &DeviceNetworkConfigurationUpdater::OnDataRoamingSettingChanged, | 
|  | weak_factory_.GetWeakPtr())); | 
|  |  | 
|  | if (trusted_status == chromeos::CrosSettingsProvider::TEMPORARILY_UNTRUSTED) { | 
|  | // Return, this function will be called again later by | 
|  | // PrepareTrustedValues. | 
|  | return; | 
|  | } | 
|  |  | 
|  | bool data_roaming_setting = false; | 
|  | if (trusted_status == chromeos::CrosSettingsProvider::TRUSTED) { | 
|  | if (!cros_settings_->GetBoolean(chromeos::kSignedDataRoamingEnabled, | 
|  | &data_roaming_setting)) { | 
|  | LOG(ERROR) << "Couldn't get device setting " | 
|  | << chromeos::kSignedDataRoamingEnabled; | 
|  | data_roaming_setting = false; | 
|  | } | 
|  | } else { | 
|  | DCHECK_EQ(trusted_status, | 
|  | chromeos::CrosSettingsProvider::PERMANENTLY_UNTRUSTED); | 
|  | // Roaming is disabled as we can't determine the correct setting. | 
|  | } | 
|  |  | 
|  | network_device_handler_->SetCellularAllowRoaming(data_roaming_setting); | 
|  | } | 
|  |  | 
|  | }  // namespace policy |