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