15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROMEOS_NETWORK_NETWORK_STATE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEOS_NETWORK_NETWORK_STATE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector>
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/values.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/managed_state.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/onc/onc_constants.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "url/gurl.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace base {
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DictionaryValue;
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class Value;
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simple class to provide network state information about a network service.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class should always be passed as a const* and should never be held
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on to. Store network_state->path() (defined in ManagedState) instead and
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// call NetworkStateHandler::GetNetworkState(path) to retrieve the state for
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the network.
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Note: NetworkStateHandler will store an entry for each member of
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Manager.ServiceCompleteList. The visible() method indicates whether the
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// network is visible, and the IsInProfile() method indicates whether the
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// network is saved in a profile.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CHROMEOS_EXPORT NetworkState : public ManagedState {
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit NetworkState(const std::string& path);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~NetworkState();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ManagedState overrides
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If you change this method, update GetProperties too.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool PropertyChanged(const std::string& key,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const base::Value& value) OVERRIDE;
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual bool InitialPropertiesReceived(
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const base::DictionaryValue& properties) OVERRIDE;
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void GetStateProperties(
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::DictionaryValue* dictionary) const OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void IPConfigPropertiesChanged(const base::DictionaryValue& properties);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Returns true, if the network requires a service activation.
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool RequiresActivation() const;
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accessors
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool visible() const { return visible_; }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& security() const { return security_; }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& device_path() const { return device_path_; }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& guid() const { return guid_; }
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string& profile_path() const { return profile_path_; }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& error() const { return error_; }
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const std::string& last_error() const { return last_error_; }
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void clear_last_error() { last_error_.clear(); }
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Returns |connection_state_| if visible, kStateDisconnect otherwise.
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string connection_state() const;
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const base::DictionaryValue& proxy_config() const { return proxy_config_; }
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // IPConfig Properties. These require an extra call to ShillIPConfigClient,
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // so cache them to avoid excessively complex client code.
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const std::string& ip_address() const { return ip_address_; }
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const std::string& gateway() const { return gateway_; }
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const std::vector<std::string>& dns_servers() const { return dns_servers_; }
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const GURL& web_proxy_auto_discovery_url() const {
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return web_proxy_auto_discovery_url_;
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wireless property accessors
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool connectable() const { return connectable_; }
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int signal_strength() const { return signal_strength_; }
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Wifi property accessors
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const std::string& eap_method() const { return eap_method_; }
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Cellular property accessors
84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const std::string& network_technology() const {
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return network_technology_;
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const std::string& activation_type() const { return activation_type_; }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& activation_state() const { return activation_state_; }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& roaming() const { return roaming_; }
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string& payment_url() const { return payment_url_; }
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool cellular_out_of_credits() const { return cellular_out_of_credits_; }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Whether this network has a CACertNSS nickname set.
943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool HasCACertNSS() const { return has_ca_cert_nss_; }
953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Returns true if |connection_state_| is a connected/connecting state.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsConnectedState() const;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsConnectingState() const;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Returns true if this is a network stored in a profile.
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool IsInProfile() const;
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Returns true if the network properties are stored in a user profile.
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool IsPrivate() const;
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Returns a comma separated string of name servers.
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string GetDnsServersAsString() const;
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Converts the prefix length to a netmask string.
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string GetNetmask() const;
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Returns a specifier for identifying this network in the absence of a GUID.
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // This should only be used by NetworkStateHandler for keeping track of
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // GUIDs assigned to unsaved networks.
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string GetSpecifier() const;
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set the GUID. Called exclusively by NetworkStateHandler.
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SetGuid(const std::string& guid);
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Helpers (used e.g. when a state or error is cached)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool StateIsConnected(const std::string& connection_state);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool StateIsConnecting(const std::string& connection_state);
123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static bool ErrorIsValid(const std::string& error);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  friend class MobileActivatorTest;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class NetworkStateHandler;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class NetworkChangeNotifierChromeosUpdateTest;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Updates |name_| from WiFi.HexSSID if provided, and validates |name_|.
131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Returns true if |name_| changes.
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool UpdateName(const base::DictionaryValue& properties);
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Set to true if the network is a member of Manager.Services.
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool visible_;
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Network Service properties. Avoid adding any additional properties here.
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Instead use NetworkConfigurationHandler::GetProperties() to asynchronously
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // request properties from Shill.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string security_;
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string eap_method_;  // Needed for WiFi EAP networks
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string device_path_;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string guid_;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string connection_state_;
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string profile_path_;
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool connectable_;
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Reflects the current Shill Service.Error property. This might get cleared
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // by Shill shortly after a failure.
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string error_;
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Last non empty Service.Error property. Cleared by NetworkConnectionHandler
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // when a connection attempt is initiated.
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string last_error_;
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // IPConfig properties.
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Note: These do not correspond to actual Shill.Service properties
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // but are derived from the service's corresponding IPConfig object.
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string ip_address_;
1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string gateway_;
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> dns_servers_;
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int prefix_length_;  // Used by GetNetmask()
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GURL web_proxy_auto_discovery_url_;
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Wireless properties, used for icons and Connect logic.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int signal_strength_;
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Cellular properties, used for icons, Connect, and Activation.
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string network_technology_;
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::string activation_type_;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string activation_state_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string roaming_;
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string payment_url_;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool cellular_out_of_credits_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Whether a deprecated CaCertNSS property of this network is set. Required
1773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // for migration to PEM.
1783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool has_ca_cert_nss_;
1793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // TODO(pneubeck): Remove this once (Managed)NetworkConfigurationHandler
181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // provides proxy configuration. crbug.com/241775
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::DictionaryValue proxy_config_;
183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetworkState);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROMEOS_NETWORK_NETWORK_STATE_H_
190