158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifndef CHROMEOS_NETWORK_POLICY_APPLICATOR_H_
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define CHROMEOS_NETWORK_POLICY_APPLICATOR_H_
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <map>
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <set>
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <string>
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/ref_counted.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_vector.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/weak_ptr.h"
158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/values.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chromeos/network/network_profile.h"
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace chromeos {
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This class compares (entry point is Run()) |modified_policies| with the
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// existing entries in the provided Shill profile |profile|. It fetches all
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// entries in parallel (GetProfilePropertiesCallback), compares each entry with
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// the current policies (GetEntryCallback) and adds all missing policies
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// (~PolicyApplicator).
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PolicyApplicator : public base::RefCounted<PolicyApplicator> {
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  class ConfigurationHandler {
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    public:
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     virtual ~ConfigurationHandler() {}
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     // Write the new configuration with the properties |shill_properties| to
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     // Shill. This configuration comes from a policy. Any conflicting or
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     // existing configuration for the same network will have been removed
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     // before.
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     virtual void CreateConfigurationFromPolicy(
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         const base::DictionaryValue& shill_properties) = 0;
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)     virtual void UpdateExistingConfigurationWithPropertiesFromPolicy(
388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)         const base::DictionaryValue& existing_properties,
398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)         const base::DictionaryValue& new_properties) = 0;
408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     // Called after all policies were applied. At this point, the list of
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     // networks should be updated.
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     virtual void OnPoliciesApplied() = 0;
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    private:
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     DISALLOW_ASSIGN(ConfigurationHandler);
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  typedef std::map<std::string, const base::DictionaryValue*> GuidToPolicyMap;
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // |modified_policies| must not be NULL and will be empty afterwards.
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PolicyApplicator(base::WeakPtr<ConfigurationHandler> handler,
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   const NetworkProfile& profile,
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   const GuidToPolicyMap& all_policies,
558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                   const base::DictionaryValue& global_network_config,
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   std::set<std::string>* modified_policies);
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void Run();
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  friend class base::RefCounted<PolicyApplicator>;
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Called with the properties of the profile |profile_|. Requests the
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // properties of each entry, which are processed by GetEntryCallback.
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void GetProfilePropertiesCallback(
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const base::DictionaryValue& profile_properties);
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Called with the properties of the profile entry |entry|. Checks whether the
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // entry was previously managed, whether a current policy applies and then
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // either updates, deletes or not touches the entry.
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void GetEntryCallback(const std::string& entry,
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const base::DictionaryValue& entry_properties);
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Sends Shill the command to delete profile entry |entry| from |profile_|.
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void DeleteEntry(const std::string& entry);
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Sends the Shill configuration |shill_dictionary| to Shill. If |write_later|
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // is true, the configuration is queued for sending until ~PolicyApplicator.
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void WriteNewShillConfiguration(const base::DictionaryValue& shill_dictionary,
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  const base::DictionaryValue& policy,
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  bool write_later);
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Called once all Profile entries are processed. Calls
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // ApplyRemainingPolicies.
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~PolicyApplicator();
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Creates new entries for all remaining policies, i.e. for which no matching
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Profile entry was found.
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void ApplyRemainingPolicies();
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::set<std::string> remaining_policies_;
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::WeakPtr<ConfigurationHandler> handler_;
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NetworkProfile profile_;
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GuidToPolicyMap all_policies_;
958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::DictionaryValue global_network_config_;
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedVector<base::DictionaryValue> new_shill_configurations_;
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PolicyApplicator);
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace chromeos
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // CHROMEOS_NETWORK_POLICY_APPLICATOR_H_
104