network_configuration_updater.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/policy/network_configuration_updater.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/policy_map.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/managed_network_configuration_handler.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/onc/onc_certificate_importer.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/onc/onc_utils.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "policy/policy_constants.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkConfigurationUpdater::~NetworkConfigurationUpdater() { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, this); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<NetworkConfigurationUpdater> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkConfigurationUpdater::CreateForDevicePolicy( 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<chromeos::onc::CertificateImporter> certificate_importer, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyService* policy_service, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::ManagedNetworkConfigurationHandler* network_config_handler) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<NetworkConfigurationUpdater> updater( 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new NetworkConfigurationUpdater(onc::ONC_SOURCE_DEVICE_POLICY, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key::kDeviceOpenNetworkConfiguration, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) certificate_importer.Pass(), 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_service, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_config_handler)); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) updater->Init(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return updater.Pass(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigurationUpdater::OnPolicyUpdated(const PolicyNamespace& ns, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyMap& previous, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyMap& current) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore this call. Policy changes are already observed by the registrar. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigurationUpdater::OnPolicyServiceInitialized( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyDomain domain) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (domain != POLICY_DOMAIN_CHROME) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME)) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << LogHeader() << " initialized."; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, this); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ApplyPolicy(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkConfigurationUpdater::NetworkConfigurationUpdater( 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onc::ONCSource onc_source, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string policy_key, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<chromeos::onc::CertificateImporter> certificate_importer, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyService* policy_service, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::ManagedNetworkConfigurationHandler* network_config_handler) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : onc_source_(onc_source), 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_config_handler_(network_config_handler), 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) certificate_importer_(certificate_importer.Pass()), 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_key_(policy_key), 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_change_registrar_(policy_service, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyNamespace(POLICY_DOMAIN_CHROME, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string())), 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_service_(policy_service) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigurationUpdater::Init() { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_change_registrar_.Observe( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_key_, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NetworkConfigurationUpdater::OnPolicyChanged, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME)) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << LogHeader() << " is already initialized."; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ApplyPolicy(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_service_->AddObserver(POLICY_DOMAIN_CHROME, this); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigurationUpdater::ImportCertificates( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue& certificates_onc) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) certificate_importer_->ImportCertificates( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) certificates_onc, onc_source_, NULL); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigurationUpdater::ApplyNetworkPolicy( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* network_configs_onc) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_config_handler_->SetPolicy( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onc_source_, std::string() /* no username hash */, *network_configs_onc); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigurationUpdater::OnPolicyChanged( 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value* previous, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value* current) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << LogHeader() << " changed."; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ApplyPolicy(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkConfigurationUpdater::ApplyPolicy() { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyMap& policies = policy_service_->GetPolicies( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value* policy_value = policies.GetValue(policy_key_); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string onc_blob; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!policy_value) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(2) << LogHeader() << " is not set."; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (!policy_value->GetAsString(&onc_blob)) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << LogHeader() << " is not a string value."; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue network_configs; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue certificates; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::onc::ParseAndValidateOncForImport(onc_blob, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onc_source_, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "" /* no passphrase */, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_configs, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &certificates); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImportCertificates(certificates); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ApplyNetworkPolicy(&network_configs); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string NetworkConfigurationUpdater::LogHeader() const { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chromeos::onc::GetSourceAsString(onc_source_); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace policy 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)