12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/policy/network_configuration_updater.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/bind.h" 8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/bind_helpers.h" 9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/logging.h" 10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/values.h" 11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chromeos/network/onc/onc_utils.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_map.h" 13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "policy/policy_constants.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace policy { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)NetworkConfigurationUpdater::~NetworkConfigurationUpdater() { 18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, this); 19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void NetworkConfigurationUpdater::OnPolicyUpdated(const PolicyNamespace& ns, 22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const PolicyMap& previous, 23424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const PolicyMap& current) { 24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Ignore this call. Policy changes are already observed by the registrar. 25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void NetworkConfigurationUpdater::OnPolicyServiceInitialized( 28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PolicyDomain domain) { 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (domain != POLICY_DOMAIN_CHROME) 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME)) { 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) VLOG(1) << LogHeader() << " initialized."; 34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, this); 35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ApplyPolicy(); 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)NetworkConfigurationUpdater::NetworkConfigurationUpdater( 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) onc::ONCSource onc_source, 41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) std::string policy_key, 42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PolicyService* policy_service, 43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) chromeos::ManagedNetworkConfigurationHandler* network_config_handler) 44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : onc_source_(onc_source), 45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) network_config_handler_(network_config_handler), 46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) policy_key_(policy_key), 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) policy_change_registrar_(policy_service, 48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PolicyNamespace(POLICY_DOMAIN_CHROME, 49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) std::string())), 50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) policy_service_(policy_service) { 51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 53424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void NetworkConfigurationUpdater::Init() { 54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) policy_change_registrar_.Observe( 55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) policy_key_, 56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Bind(&NetworkConfigurationUpdater::OnPolicyChanged, 57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Unretained(this))); 58424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME)) { 60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) VLOG(1) << LogHeader() << " is already initialized."; 61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ApplyPolicy(); 62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } else { 63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) policy_service_->AddObserver(POLICY_DOMAIN_CHROME, this); 64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void NetworkConfigurationUpdater::OnPolicyChanged( 68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const base::Value* previous, 69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const base::Value* current) { 70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) VLOG(1) << LogHeader() << " changed."; 71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ApplyPolicy(); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void NetworkConfigurationUpdater::ApplyPolicy() { 75424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const PolicyMap& policies = policy_service_->GetPolicies( 76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())); 77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const base::Value* policy_value = policies.GetValue(policy_key_); 78424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 79424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) std::string onc_blob; 80424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!policy_value) 81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) VLOG(2) << LogHeader() << " is not set."; 82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) else if (!policy_value->GetAsString(&onc_blob)) 83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LOG(ERROR) << LogHeader() << " is not a string value."; 84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::ListValue network_configs; 868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::DictionaryValue global_network_config; 87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::ListValue certificates; 88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) chromeos::onc::ParseAndValidateOncForImport(onc_blob, 89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) onc_source_, 90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) "" /* no passphrase */, 91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &network_configs, 928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &global_network_config, 93424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &certificates); 94424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 95424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ImportCertificates(certificates); 968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ApplyNetworkPolicy(&network_configs, &global_network_config); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 99424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)std::string NetworkConfigurationUpdater::LogHeader() const { 100424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return chromeos::onc::GetSourceAsString(onc_source_); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace policy 104