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