managed_network_configuration_handler.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 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) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROMEOS_NETWORK_MANAGED_NETWORK_CONFIGURATION_HANDLER_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROMEOS_NETWORK_MANAGED_NETWORK_CONFIGURATION_HANDLER_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/gtest_prod_util.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/chromeos_export.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_handler_callbacks.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/network/onc/onc_constants.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DictionaryValue; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ListValue; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The ManagedNetworkConfigurationHandler class is used to create and configure 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// networks in ChromeOS using ONC and takes care of network policies. 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Its interface exposes only ONC and should decouple users from Shill. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Internally it translates ONC to Shill dictionaries and calls through to the 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NetworkConfigurationHandler. 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// For accessing lists of visible networks, and other state information, see the 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// class NetworkStateHandler. 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This is a singleton and its lifetime is managed by the Chrome startup code. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Network configurations are referred to by Shill's service path. These 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// identifiers should at most be used to also access network state using the 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NetworkStateHandler, but dependencies to Shill should be avoided. In the 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// future, we may switch to other identifiers. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note on callbacks: Because all the functions here are meant to be 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// asynchronous, they all take a |callback| of some type, and an 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |error_callback|. When the operation succeeds, |callback| will be called, and 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when it doesn't, |error_callback| will be called with information about the 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// error, including a symbolic name for the error and often some error message 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that is suitable for logging. None of the error message text is meant for 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// user consumption. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CHROMEOS_EXPORT ManagedNetworkConfigurationHandler { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef std::map<std::string, const base::DictionaryValue*> PolicyMap; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initializes the singleton. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void Initialize(); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns if the singleton is initialized. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool IsInitialized(); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Destroys the singleton. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void Shutdown(); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initialize() must be called before this. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static ManagedNetworkConfigurationHandler* Get(); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Provides the properties of the network with |service_path| to |callback|. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetProperties( 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& service_path, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::DictionaryResultCallback& callback, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::ErrorCallback& error_callback) const; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Provides the managed properties of the network with |service_path| to 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |callback|. 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void GetManagedProperties( 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& service_path, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const network_handler::DictionaryResultCallback& callback, 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const network_handler::ErrorCallback& error_callback); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the user's settings of an already configured network with 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |service_path|. A network can be initially configured by calling 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CreateConfiguration or if it is managed by a policy. The given properties 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will be merged with the existing settings, and it won't clear any existing 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // properties. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetProperties( 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& service_path, 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue& user_settings, 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::ErrorCallback& error_callback) const; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initiates a connection with network that has |service_path|. |callback| is 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // called if the connection request was successfully handled. That doesn't 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // mean that the connection was successfully established. 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Connect(const std::string& service_path, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::ErrorCallback& error_callback) const; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initiates a disconnect with the network at |service_path|. |callback| is 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // called if the diconnect request was successfully handled. That doesn't mean 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that the network is already diconnected. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Disconnect(const std::string& service_path, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::ErrorCallback& error_callback) const; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initially configures an unconfigured network with the given user settings 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and returns the new identifier to |callback| if successful. Fails if the 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // network was already configured by a call to this function or because of a 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // policy. 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CreateConfiguration( 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue& properties, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::StringResultCallback& callback, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::ErrorCallback& error_callback) const; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Removes the user's configuration from the network with |service_path|. The 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // network may still show up in the visible networks after this, but no user 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // configuration will remain. If it was managed, it will still be configured. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveConfiguration( 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& service_path, 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::ErrorCallback& error_callback) const; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Only to be called by NetworkConfigurationUpdater or from tests. Sets 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |network_configs_onc| as the current policy of |onc_source|. The network 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // configurations of the policy will be applied (not necessarily immediately) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to Shill's profiles and enforced in future configurations until the policy 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // associated with |onc_source| is changed again with this function. 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This function doesn't validate the policy. The caller must ensure validity. 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetPolicy(onc::ONCSource onc_source, 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::ListValue& network_configs_onc); 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class PolicyApplicator; 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedNetworkConfigurationHandler(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~ManagedNetworkConfigurationHandler(); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void GetManagedPropertiesCallback( 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const network_handler::DictionaryResultCallback& callback, 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const network_handler::ErrorCallback& error_callback, 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& service_path, 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue& shill_properties); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PolicyMap* GetPoliciesForProfile(const std::string& profile) const; 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The entries of these maps are owned by this class and are explicitly 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // deleted where necessary. 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PolicyMap user_policies_by_guid_; 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PolicyMap device_policies_by_guid_; 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool user_policies_initialized_; 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool device_policies_initialized_; 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // For Shill client callbacks 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::WeakPtrFactory<ManagedNetworkConfigurationHandler> weak_ptr_factory_; 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ManagedNetworkConfigurationHandler); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // CHROMEOS_NETWORK_MANAGED_NETWORK_CONFIGURATION_HANDLER_H_ 161