user_network_configuration_updater.cc revision f2477e01787aa58f445919b809d89e252beef54f
1// Copyright 2013 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/user_network_configuration_updater.h"
6
7#include "base/bind.h"
8#include "base/bind_helpers.h"
9#include "base/logging.h"
10#include "chrome/browser/chromeos/login/user.h"
11#include "chrome/browser/chromeos/net/onc_utils.h"
12#include "chromeos/network/managed_network_configuration_handler.h"
13#include "chromeos/network/onc/onc_certificate_importer.h"
14#include "content/public/browser/browser_thread.h"
15#include "net/cert/x509_certificate.h"
16#include "policy/policy_constants.h"
17
18namespace policy {
19
20UserNetworkConfigurationUpdater::~UserNetworkConfigurationUpdater() {}
21
22// static
23scoped_ptr<UserNetworkConfigurationUpdater>
24UserNetworkConfigurationUpdater::CreateForUserPolicy(
25    bool allow_trusted_certs_from_policy,
26    const chromeos::User& user,
27    scoped_ptr<chromeos::onc::CertificateImporter> certificate_importer,
28    PolicyService* policy_service,
29    chromeos::ManagedNetworkConfigurationHandler* network_config_handler) {
30  scoped_ptr<UserNetworkConfigurationUpdater> updater(
31      new UserNetworkConfigurationUpdater(allow_trusted_certs_from_policy,
32                                          user,
33                                          certificate_importer.Pass(),
34                                          policy_service,
35                                          network_config_handler));
36  updater->Init();
37  return updater.Pass();
38}
39
40void UserNetworkConfigurationUpdater::AddTrustedCertsObserver(
41    WebTrustedCertsObserver* observer) {
42  observer_list_.AddObserver(observer);
43}
44
45void UserNetworkConfigurationUpdater::RemoveTrustedCertsObserver(
46    WebTrustedCertsObserver* observer) {
47  observer_list_.RemoveObserver(observer);
48}
49
50UserNetworkConfigurationUpdater::UserNetworkConfigurationUpdater(
51    bool allow_trusted_certs_from_policy,
52    const chromeos::User& user,
53    scoped_ptr<chromeos::onc::CertificateImporter> certificate_importer,
54    PolicyService* policy_service,
55    chromeos::ManagedNetworkConfigurationHandler* network_config_handler)
56    : NetworkConfigurationUpdater(onc::ONC_SOURCE_USER_POLICY,
57                                  key::kOpenNetworkConfiguration,
58                                  certificate_importer.Pass(),
59                                  policy_service,
60                                  network_config_handler),
61      allow_trusted_certificates_from_policy_(allow_trusted_certs_from_policy),
62      user_(&user) {}
63
64void UserNetworkConfigurationUpdater::GetWebTrustedCertificates(
65    net::CertificateList* certs) const {
66  *certs = web_trust_certs_;
67}
68
69void UserNetworkConfigurationUpdater::ImportCertificates(
70    const base::ListValue& certificates_onc) {
71  web_trust_certs_.clear();
72  certificate_importer_->ImportCertificates(
73      certificates_onc,
74      onc_source_,
75      allow_trusted_certificates_from_policy_ ? &web_trust_certs_ : NULL);
76
77  NotifyTrustAnchorsChanged();
78}
79
80void UserNetworkConfigurationUpdater::ApplyNetworkPolicy(
81    base::ListValue* network_configs_onc,
82    base::DictionaryValue* global_network_config) {
83  DCHECK(user_);
84  chromeos::onc::ExpandStringPlaceholdersInNetworksForUser(user_,
85                                                           network_configs_onc);
86  network_config_handler_->SetPolicy(onc_source_,
87                                     user_->username_hash(),
88                                     *network_configs_onc,
89                                     *global_network_config);
90}
91
92void UserNetworkConfigurationUpdater::NotifyTrustAnchorsChanged() {
93  FOR_EACH_OBSERVER(WebTrustedCertsObserver,
94                    observer_list_,
95                    OnTrustAnchorsChanged(web_trust_certs_));
96}
97
98}  // namespace policy
99