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#ifndef CHROMEOS_NETWORK_POLICY_APPLICATOR_H_
6#define CHROMEOS_NETWORK_POLICY_APPLICATOR_H_
7
8#include <map>
9#include <set>
10#include <string>
11
12#include "base/memory/ref_counted.h"
13#include "base/memory/scoped_vector.h"
14#include "base/memory/weak_ptr.h"
15#include "base/values.h"
16#include "chromeos/network/network_profile.h"
17
18namespace chromeos {
19
20// This class compares (entry point is Run()) |modified_policies| with the
21// existing entries in the provided Shill profile |profile|. It fetches all
22// entries in parallel (GetProfilePropertiesCallback), compares each entry with
23// the current policies (GetEntryCallback) and adds all missing policies
24// (~PolicyApplicator).
25class PolicyApplicator : public base::RefCounted<PolicyApplicator> {
26 public:
27  class ConfigurationHandler {
28    public:
29     virtual ~ConfigurationHandler() {}
30     // Write the new configuration with the properties |shill_properties| to
31     // Shill. This configuration comes from a policy. Any conflicting or
32     // existing configuration for the same network will have been removed
33     // before.
34     virtual void CreateConfigurationFromPolicy(
35         const base::DictionaryValue& shill_properties) = 0;
36
37     virtual void UpdateExistingConfigurationWithPropertiesFromPolicy(
38         const base::DictionaryValue& existing_properties,
39         const base::DictionaryValue& new_properties) = 0;
40
41     // Called after all policies were applied. At this point, the list of
42     // networks should be updated.
43     virtual void OnPoliciesApplied() = 0;
44
45    private:
46     DISALLOW_ASSIGN(ConfigurationHandler);
47  };
48
49  typedef std::map<std::string, const base::DictionaryValue*> GuidToPolicyMap;
50
51  // |modified_policies| must not be NULL and will be empty afterwards.
52  PolicyApplicator(base::WeakPtr<ConfigurationHandler> handler,
53                   const NetworkProfile& profile,
54                   const GuidToPolicyMap& all_policies,
55                   const base::DictionaryValue& global_network_config,
56                   std::set<std::string>* modified_policies);
57
58  void Run();
59
60 private:
61  friend class base::RefCounted<PolicyApplicator>;
62
63  // Called with the properties of the profile |profile_|. Requests the
64  // properties of each entry, which are processed by GetEntryCallback.
65  void GetProfilePropertiesCallback(
66      const base::DictionaryValue& profile_properties);
67
68  // Called with the properties of the profile entry |entry|. Checks whether the
69  // entry was previously managed, whether a current policy applies and then
70  // either updates, deletes or not touches the entry.
71  void GetEntryCallback(const std::string& entry,
72                        const base::DictionaryValue& entry_properties);
73
74  // Sends Shill the command to delete profile entry |entry| from |profile_|.
75  void DeleteEntry(const std::string& entry);
76
77  // Sends the Shill configuration |shill_dictionary| to Shill. If |write_later|
78  // is true, the configuration is queued for sending until ~PolicyApplicator.
79  void WriteNewShillConfiguration(const base::DictionaryValue& shill_dictionary,
80                                  const base::DictionaryValue& policy,
81                                  bool write_later);
82
83  // Called once all Profile entries are processed. Calls
84  // ApplyRemainingPolicies.
85  virtual ~PolicyApplicator();
86
87  // Creates new entries for all remaining policies, i.e. for which no matching
88  // Profile entry was found.
89  void ApplyRemainingPolicies();
90
91  std::set<std::string> remaining_policies_;
92  base::WeakPtr<ConfigurationHandler> handler_;
93  NetworkProfile profile_;
94  GuidToPolicyMap all_policies_;
95  base::DictionaryValue global_network_config_;
96  ScopedVector<base::DictionaryValue> new_shill_configurations_;
97
98  DISALLOW_COPY_AND_ASSIGN(PolicyApplicator);
99};
100
101}  // namespace chromeos
102
103#endif  // CHROMEOS_NETWORK_POLICY_APPLICATOR_H_
104