network_configuration_updater.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/chromeos/policy/network_configuration_updater.h" 6 7#include "base/bind.h" 8#include "base/bind_helpers.h" 9#include "base/logging.h" 10#include "base/values.h" 11#include "chrome/browser/policy/policy_map.h" 12#include "chromeos/network/managed_network_configuration_handler.h" 13#include "chromeos/network/onc/onc_certificate_importer.h" 14#include "chromeos/network/onc/onc_utils.h" 15#include "policy/policy_constants.h" 16 17namespace policy { 18 19NetworkConfigurationUpdater::~NetworkConfigurationUpdater() { 20 policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, this); 21} 22 23// static 24scoped_ptr<NetworkConfigurationUpdater> 25NetworkConfigurationUpdater::CreateForDevicePolicy( 26 scoped_ptr<chromeos::onc::CertificateImporter> certificate_importer, 27 PolicyService* policy_service, 28 chromeos::ManagedNetworkConfigurationHandler* network_config_handler) { 29 scoped_ptr<NetworkConfigurationUpdater> updater( 30 new NetworkConfigurationUpdater(onc::ONC_SOURCE_DEVICE_POLICY, 31 key::kDeviceOpenNetworkConfiguration, 32 certificate_importer.Pass(), 33 policy_service, 34 network_config_handler)); 35 updater->Init(); 36 return updater.Pass(); 37} 38 39void NetworkConfigurationUpdater::OnPolicyUpdated(const PolicyNamespace& ns, 40 const PolicyMap& previous, 41 const PolicyMap& current) { 42 // Ignore this call. Policy changes are already observed by the registrar. 43} 44 45void NetworkConfigurationUpdater::OnPolicyServiceInitialized( 46 PolicyDomain domain) { 47 if (domain != POLICY_DOMAIN_CHROME) 48 return; 49 50 if (policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME)) { 51 VLOG(1) << LogHeader() << " initialized."; 52 policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, this); 53 ApplyPolicy(); 54 } 55} 56 57NetworkConfigurationUpdater::NetworkConfigurationUpdater( 58 onc::ONCSource onc_source, 59 std::string policy_key, 60 scoped_ptr<chromeos::onc::CertificateImporter> certificate_importer, 61 PolicyService* policy_service, 62 chromeos::ManagedNetworkConfigurationHandler* network_config_handler) 63 : onc_source_(onc_source), 64 network_config_handler_(network_config_handler), 65 certificate_importer_(certificate_importer.Pass()), 66 policy_key_(policy_key), 67 policy_change_registrar_(policy_service, 68 PolicyNamespace(POLICY_DOMAIN_CHROME, 69 std::string())), 70 policy_service_(policy_service) { 71} 72 73void NetworkConfigurationUpdater::Init() { 74 policy_change_registrar_.Observe( 75 policy_key_, 76 base::Bind(&NetworkConfigurationUpdater::OnPolicyChanged, 77 base::Unretained(this))); 78 79 if (policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME)) { 80 VLOG(1) << LogHeader() << " is already initialized."; 81 ApplyPolicy(); 82 } else { 83 policy_service_->AddObserver(POLICY_DOMAIN_CHROME, this); 84 } 85} 86 87void NetworkConfigurationUpdater::ImportCertificates( 88 const base::ListValue& certificates_onc) { 89 certificate_importer_->ImportCertificates( 90 certificates_onc, onc_source_, NULL); 91} 92 93void NetworkConfigurationUpdater::ApplyNetworkPolicy( 94 base::ListValue* network_configs_onc, 95 base::DictionaryValue* global_network_config) { 96 network_config_handler_->SetPolicy(onc_source_, 97 std::string() /* no username hash */, 98 *network_configs_onc, 99 *global_network_config); 100} 101 102void NetworkConfigurationUpdater::OnPolicyChanged( 103 const base::Value* previous, 104 const base::Value* current) { 105 VLOG(1) << LogHeader() << " changed."; 106 ApplyPolicy(); 107} 108 109void NetworkConfigurationUpdater::ApplyPolicy() { 110 const PolicyMap& policies = policy_service_->GetPolicies( 111 PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())); 112 const base::Value* policy_value = policies.GetValue(policy_key_); 113 114 std::string onc_blob; 115 if (!policy_value) 116 VLOG(2) << LogHeader() << " is not set."; 117 else if (!policy_value->GetAsString(&onc_blob)) 118 LOG(ERROR) << LogHeader() << " is not a string value."; 119 120 base::ListValue network_configs; 121 base::DictionaryValue global_network_config; 122 base::ListValue certificates; 123 chromeos::onc::ParseAndValidateOncForImport(onc_blob, 124 onc_source_, 125 "" /* no passphrase */, 126 &network_configs, 127 &global_network_config, 128 &certificates); 129 130 ImportCertificates(certificates); 131 ApplyNetworkPolicy(&network_configs, &global_network_config); 132} 133 134std::string NetworkConfigurationUpdater::LogHeader() const { 135 return chromeos::onc::GetSourceAsString(onc_source_); 136} 137 138} // namespace policy 139