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)