190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (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)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/compiler_specific.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/observer_list.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/chromeos_export.h"
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_handler.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_handler_callbacks.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/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)
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class NetworkPolicyObserver;
27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The ManagedNetworkConfigurationHandler class is used to create and configure
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// networks in ChromeOS using ONC and takes care of network policies.
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Its interface exposes only ONC and should decouple users from Shill.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Internally it translates ONC to Shill dictionaries and calls through to the
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NetworkConfigurationHandler.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// For accessing lists of visible networks, and other state information, see the
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// class NetworkStateHandler.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This is a singleton and its lifetime is managed by the Chrome startup code.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Network configurations are referred to by Shill's service path. These
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// identifiers should at most be used to also access network state using the
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NetworkStateHandler, but dependencies to Shill should be avoided. In the
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// future, we may switch to other identifiers.
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note on callbacks: Because all the functions here are meant to be
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// asynchronous, they all take a |callback| of some type, and an
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |error_callback|. When the operation succeeds, |callback| will be called, and
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when it doesn't, |error_callback| will be called with information about the
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// error, including a symbolic name for the error and often some error message
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that is suitable for logging. None of the error message text is meant for
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// user consumption.
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class CHROMEOS_EXPORT ManagedNetworkConfigurationHandler {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~ManagedNetworkConfigurationHandler();
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void AddObserver(NetworkPolicyObserver* observer) = 0;
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void RemoveObserver(NetworkPolicyObserver* observer) = 0;
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Provides the properties of the network with |service_path| to |callback|.
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void GetProperties(
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& service_path,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const network_handler::DictionaryResultCallback& callback,
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const network_handler::ErrorCallback& error_callback) = 0;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Provides the managed properties of the network with |service_path| to
66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // |callback|. |userhash| is only used to ensure that the user's policy is
67b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // already applied.
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void GetManagedProperties(
69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      const std::string& userhash,
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& service_path,
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const network_handler::DictionaryResultCallback& callback,
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const network_handler::ErrorCallback& error_callback) = 0;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the user's settings of an already configured network with
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |service_path|. A network can be initially configured by calling
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CreateConfiguration or if it is managed by a policy. The given properties
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // will be merged with the existing settings, and it won't clear any existing
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // properties.
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void SetProperties(
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& service_path,
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::DictionaryValue& user_settings,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Closure& callback,
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const network_handler::ErrorCallback& error_callback) const = 0;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Initially configures an unconfigured network with the given user settings
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and returns the new identifier to |callback| if successful. Fails if the
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // network was already configured by a call to this function or because of a
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // policy. The new configuration will be owned by user |userhash|. If
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // |userhash| is empty, the new configuration will be shared.
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void CreateConfiguration(
91b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      const std::string& userhash,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::DictionaryValue& properties,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const network_handler::StringResultCallback& callback,
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const network_handler::ErrorCallback& error_callback) const = 0;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Removes the user's configuration from the network with |service_path|. The
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // network may still show up in the visible networks after this, but no user
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // configuration will remain. If it was managed, it will still be configured.
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void RemoveConfiguration(
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& service_path,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Closure& callback,
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const network_handler::ErrorCallback& error_callback) const = 0;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Only to be called by NetworkConfigurationUpdater or from tests. Sets
1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // |network_configs_onc| and |global_network_config| as the current policy of
1068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // |userhash| and |onc_source|. The policy will be applied (not necessarily
1078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // immediately) to Shill's profiles and enforced in future configurations
1088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // until the policy associated with |userhash| and |onc_source| is changed
1098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // again with this function. For device policies, |userhash| must be empty.
1108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void SetPolicy(
1118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      ::onc::ONCSource onc_source,
1128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      const std::string& userhash,
1138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      const base::ListValue& network_configs_onc,
1148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      const base::DictionaryValue& global_network_config) = 0;
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Returns the user policy for user |userhash| or device policy, which has
117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // |guid|. If |userhash| is empty, only looks for a device policy. If such
118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // doesn't exist, returns NULL. Sets |onc_source| accordingly.
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual const base::DictionaryValue* FindPolicyByGUID(
120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const std::string userhash,
121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const std::string& guid,
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ::onc::ONCSource* onc_source) const = 0;
123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Returns the global configuration of the policy of user |userhash| or device
1258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // policy if |userhash| is empty.
1268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual const base::DictionaryValue* GetGlobalConfigFromPolicy(
1278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      const std::string userhash) const = 0;
1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Returns the policy with |guid| for profile |profile_path|. If such
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // doesn't exist, returns NULL.
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual const base::DictionaryValue* FindPolicyByGuidAndProfile(
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const std::string& guid,
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const std::string& profile_path) const = 0;
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_ASSIGN(ManagedNetworkConfigurationHandler);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROMEOS_NETWORK_MANAGED_NETWORK_CONFIGURATION_HANDLER_H_
142