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