blob: e4ebbb01a0d481f9ec3565a8b787eca3b0daabff [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_
#define CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_
#include <map>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/singleton.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/timer/timer.h"
#include "base/values.h"
#include "chrome/browser/chromeos/cros/network_constants.h"
#include "chromeos/network/network_ip_config.h"
#include "chromeos/network/network_ui_data.h"
#include "chromeos/network/network_util.h"
#include "chromeos/network/onc/onc_constants.h"
namespace chromeos {
class CertificatePattern;
class EnrollmentDelegate;
class NetworkDeviceParser;
class NetworkParser;
// This is the list of all implementation classes that are allowed
// access to the internals of the network library classes.
#define NETWORK_LIBRARY_IMPL_FRIENDS \
friend class NetworkLibraryImplBase; \
friend class NetworkLibraryImplCros; \
friend class NetworkLibraryImplStub;
// Simple wrapper for property Cellular.FoundNetworks.
struct FoundCellularNetwork {
FoundCellularNetwork();
~FoundCellularNetwork();
std::string status;
std::string network_id;
std::string short_name;
std::string long_name;
std::string technology;
};
typedef std::vector<FoundCellularNetwork> CellularNetworkList;
struct CellularApn {
std::string apn;
std::string network_id;
std::string username;
std::string password;
std::string name;
std::string localized_name;
std::string language;
CellularApn();
CellularApn(const std::string& apn, const std::string& network_id,
const std::string& username, const std::string& password);
~CellularApn();
void Set(const base::DictionaryValue& dict);
};
typedef std::vector<CellularApn> CellularApnList;
// The value of priority if it is not set.
const int kPriorityNotSet = 0;
// The value of priority if network is preferred.
const int kPriorityPreferred = 1;
// Contains data related to the shill.Device interface,
// e.g. ethernet, wifi, cellular.
// TODO(dpolukhin): refactor to make base class and device specific derivatives.
class NetworkDevice {
public:
explicit NetworkDevice(const std::string& device_path);
~NetworkDevice();
NetworkDeviceParser* device_parser() { return device_parser_.get(); }
void SetNetworkDeviceParser(NetworkDeviceParser* parser);
// Device info.
const std::string& device_path() const { return device_path_; }
const std::string& name() const { return name_; }
const std::string& unique_id() const { return unique_id_; }
ConnectionType type() const { return type_; }
bool scanning() const { return scanning_; }
const std::string& meid() const { return meid_; }
const std::string& iccid() const { return iccid_; }
const std::string& imei() const { return imei_; }
const std::string& imsi() const { return imsi_; }
const std::string& esn() const { return esn_; }
const std::string& mdn() const { return mdn_; }
const std::string& min() const { return min_; }
const std::string& model_id() const { return model_id_; }
const std::string& manufacturer() const { return manufacturer_; }
SimLockState sim_lock_state() const { return sim_lock_state_; }
bool is_sim_locked() const {
return sim_lock_state_ == SIM_LOCKED_PIN ||
sim_lock_state_ == SIM_LOCKED_PUK;
}
// Returns true if GSM modem and SIM as absent, otherwise
// returns false: GSM modem and SIM card is present or CDMA modem.
bool is_sim_absent() const {
return technology_family() == TECHNOLOGY_FAMILY_GSM &&
!is_sim_locked() && !sim_present_;
}
int sim_retries_left() const { return sim_retries_left_; }
SimPinRequire sim_pin_required() const { return sim_pin_required_; }
bool powered() const { return powered_; }
const std::string& firmware_revision() const { return firmware_revision_; }
const std::string& hardware_revision() const { return hardware_revision_; }
const unsigned int prl_version() const { return prl_version_; }
const std::string& home_provider_code() const { return home_provider_code_; }
const std::string& home_provider_country() const {
return home_provider_country_;
}
const std::string& home_provider_id() const { return home_provider_id_; }
const std::string& home_provider_name() const { return home_provider_name_; }
const bool provider_requires_roaming() const {
return provider_requires_roaming_;
}
const std::string& selected_cellular_network() const {
return selected_cellular_network_;
}
const CellularNetworkList& found_cellular_networks() const {
return found_cellular_networks_;
}
bool data_roaming_allowed() const { return data_roaming_allowed_; }
bool support_network_scan() const { return support_network_scan_; }
std::string carrier() const { return carrier_; }
base::ListValue* supported_carriers() const {
return supported_carriers_.get();
}
enum TechnologyFamily technology_family() const { return technology_family_; }
const CellularApnList& provider_apn_list() const {
return provider_apn_list_;
}
// Updates the property specified by |key| with the contents of
// |value|. Returns false on failure. Upon success, returns the
// PropertyIndex that was updated in |index|. |index| may be NULL
// if not needed.
bool UpdateStatus(const std::string& key,
const base::Value& value,
PropertyIndex* index);
protected:
void set_unique_id(const std::string& unique_id) { unique_id_ = unique_id; }
private:
// This allows NetworkDeviceParser and its subclasses access to
// device privates so that they can be reconstituted during parsing.
// The parsers only access things through the private set_ functions
// so that this class can evolve without having to change all the
// parsers.
friend class NativeNetworkDeviceParser;
// This allows the implementation classes access to privates.
NETWORK_LIBRARY_IMPL_FRIENDS;
// Use these functions at your peril. They are used by the various
// parsers to set state, and really shouldn't be used by anyone
// else.
void set_device_path(const std::string& device_path) {
device_path_ = device_path;
}
void set_name(const std::string& name) { name_ = name; }
void set_type(ConnectionType type) { type_ = type; }
void set_scanning(bool scanning) { scanning_ = scanning; }
void set_meid(const std::string& meid) { meid_ = meid; }
void set_iccid(const std::string& iccid) { iccid_ = iccid; }
void set_imei(const std::string& imei) { imei_ = imei; }
void set_imsi(const std::string& imsi) { imsi_ = imsi; }
void set_esn(const std::string& esn) { esn_ = esn; }
void set_mdn(const std::string& mdn) { mdn_ = mdn; }
void set_min(const std::string& min) { min_ = min; }
void set_technology_family(TechnologyFamily technology_family) {
technology_family_ = technology_family;
}
void set_carrier(const std::string& carrier) { carrier_ = carrier; }
void set_supported_carriers(const base::ListValue& supported_carriers) {
supported_carriers_.reset(supported_carriers.DeepCopy());
}
void set_home_provider_code(const std::string& home_provider_code) {
home_provider_code_ = home_provider_code;
}
void set_home_provider_country(const std::string& home_provider_country) {
home_provider_country_ = home_provider_country;
}
void set_home_provider_id(const std::string& home_provider_id) {
home_provider_id_ = home_provider_id;
}
void set_home_provider_name(const std::string& home_provider_name) {
home_provider_name_ = home_provider_name;
}
void set_provider_requires_roaming(bool provider_requires_roaming) {
provider_requires_roaming_ = provider_requires_roaming;
}
void set_model_id(const std::string& model_id) { model_id_ = model_id; }
void set_manufacturer(const std::string& manufacturer) {
manufacturer_ = manufacturer;
}
void set_prl_version(int prl_version) {
prl_version_ = prl_version;
}
void set_sim_lock_state(SimLockState sim_lock_state) {
sim_lock_state_ = sim_lock_state;
}
void set_sim_retries_left(int sim_retries_left) {
sim_retries_left_ = sim_retries_left;
}
void set_sim_pin_required(SimPinRequire sim_pin_required) {
sim_pin_required_ = sim_pin_required;
}
void set_sim_present(bool sim_present) {
sim_present_ = sim_present;
}
void set_powered(bool powered) {
powered_ = powered;
}
void set_firmware_revision(const std::string& firmware_revision) {
firmware_revision_ = firmware_revision;
}
void set_hardware_revision(const std::string& hardware_revision) {
hardware_revision_ = hardware_revision;
}
void set_selected_cellular_network(
const std::string& selected_cellular_network) {
selected_cellular_network_ = selected_cellular_network;
}
void set_found_cellular_networks(
const CellularNetworkList& found_cellular_networks) {
found_cellular_networks_ = found_cellular_networks;
}
void set_data_roaming_allowed(bool data_roaming_allowed) {
data_roaming_allowed_ = data_roaming_allowed;
}
void set_support_network_scan(bool support_network_scan) {
support_network_scan_ = support_network_scan;
}
void set_provider_apn_list(const CellularApnList& provider_apn_list) {
provider_apn_list_ = provider_apn_list;
}
void ParseInfo(const base::DictionaryValue& info);
// General device info.
std::string device_path_;
std::string name_;
std::string unique_id_;
ConnectionType type_;
bool scanning_;
// Cellular specific device info.
TechnologyFamily technology_family_;
std::string carrier_;
scoped_ptr<base::ListValue> supported_carriers_;
std::string home_provider_code_;
std::string home_provider_country_;
std::string home_provider_id_;
std::string home_provider_name_;
bool provider_requires_roaming_;
std::string meid_;
std::string imei_;
std::string iccid_;
std::string imsi_;
std::string esn_;
std::string mdn_;
std::string min_;
std::string model_id_;
std::string manufacturer_;
SimLockState sim_lock_state_;
int sim_retries_left_;
SimPinRequire sim_pin_required_;
bool sim_present_;
bool powered_;
std::string firmware_revision_;
std::string hardware_revision_;
int prl_version_;
std::string selected_cellular_network_;
CellularNetworkList found_cellular_networks_;
bool data_roaming_allowed_;
bool support_network_scan_;
CellularApnList provider_apn_list_;
// This is the parser we use to parse messages from the native
// network layer.
scoped_ptr<NetworkDeviceParser> device_parser_;
DISALLOW_COPY_AND_ASSIGN(NetworkDevice);
};
// Contains data common to all network service types.
class Network {
public:
virtual ~Network();
// Test API for accessing setters in tests.
class TestApi {
public:
explicit TestApi(Network* network) : network_(network) {}
void SetConnected() {
network_->set_connected();
}
void SetConnecting() {
network_->set_connecting();
}
void SetDisconnected() {
network_->set_disconnected();
}
void SetUserConnectState(UserConnectState user_connect_state) {
network_->set_user_connect_state(user_connect_state);
}
private:
Network* network_;
};
friend class TestApi;
const std::string& service_path() const { return service_path_; }
const std::string& name() const { return name_; }
const std::string& device_path() const { return device_path_; }
const std::string& ip_address() const { return ip_address_; }
ConnectionType type() const { return type_; }
ConnectionState connection_state() const { return state_; }
bool connecting() const { return IsConnectingState(state_); }
bool configuring() const { return state_ == STATE_CONFIGURATION; }
bool connected() const { return IsConnectedState(state_); }
bool connecting_or_connected() const { return connecting() || connected(); }
// True when a user-initiated connection attempt is in progress
bool connection_started() const {
return user_connect_state_ == USER_CONNECT_STARTED;
}
UserConnectState user_connect_state() const { return user_connect_state_; }
bool failed() const { return state_ == STATE_FAILURE; }
bool disconnected() const { return IsDisconnectedState(state_); }
bool online() const { return state_ == STATE_ONLINE; }
bool restricted_pool() const { return state_ == STATE_PORTAL; }
ConnectionError error() const { return error_; }
ConnectionState state() const { return state_; }
// Is this network connectable. Currently, this is mainly used by 802.1x
// networks to specify that the network is not configured yet.
bool connectable() const { return connectable_; }
// Is this the active network, i.e, the one through which
// network traffic is being routed? A network can be connected,
// but not be carrying traffic.
bool is_active() const { return is_active_; }
bool preferred() const { return priority_ != kPriorityNotSet; }
bool auto_connect() const { return auto_connect_; }
bool save_credentials() const { return save_credentials_; }
bool added() const { return added_; }
bool notify_failure() const { return notify_failure_; }
const std::string& profile_path() const { return profile_path_; }
NetworkProfileType profile_type() const { return profile_type_; }
const std::string& unique_id() const { return unique_id_; }
int priority_order() const { return priority_order_; }
const NetworkUIData& ui_data() const { return ui_data_; }
void set_notify_failure(bool state) { notify_failure_ = state; }
void SetPreferred(bool preferred);
void SetAutoConnect(bool auto_connect);
void SetName(const std::string& name);
void SetSaveCredentials(bool save_credentials);
void ClearUIData();
// This will resolve any automatic configuration that has to occur
// (provisioning certificates, etc.) before attempting to connect to the
// network. When configuration is complete, calls the closure to finish the
// connection or show the config dialog to collect user-supplied info.
virtual void AttemptConnection(const base::Closure& connect);
// Return a string representation of the state code.
std::string GetStateString() const;
// Return a string representation of the error code.
std::string GetErrorString() const;
// Return true if the network must be in the user profile (e.g. has certs).
virtual bool RequiresUserProfile() const;
// Copy any credentials from a remembered network that are unset in |this|.
virtual void CopyCredentialsFromRemembered(Network* remembered);
// Static helper functions.
static bool IsConnectedState(ConnectionState state) {
return (state == STATE_READY ||
state == STATE_ONLINE ||
state == STATE_PORTAL);
}
static bool IsConnectingState(ConnectionState state) {
return (state == STATE_CONNECT_REQUESTED ||
state == STATE_ASSOCIATION ||
state == STATE_CONFIGURATION ||
state == STATE_CARRIER);
}
static bool IsDisconnectedState(ConnectionState state) {
return (state == STATE_UNKNOWN ||
state == STATE_IDLE ||
state == STATE_DISCONNECT ||
state == STATE_FAILURE ||
state == STATE_ACTIVATION_FAILURE);
}
// Adopts the given enrollment handler to handle any certificate enrollment
// URIs encountered during network connection.
void SetEnrollmentDelegate(EnrollmentDelegate* delegate);
virtual bool UpdateStatus(const std::string& key,
const base::Value& value,
PropertyIndex* index);
// Creates a Network object for the given type for testing.
static Network* CreateForTesting(ConnectionType type);
protected:
Network(const std::string& service_path,
ConnectionType type);
NetworkParser* network_parser() { return network_parser_.get(); }
void SetNetworkParser(NetworkParser* parser);
// Set the state and update flags if necessary.
void SetState(ConnectionState state);
// Set the error state and update notify_failure_
void SetError(ConnectionError error);
// Parse name/value pairs from libcros.
virtual void ParseInfo(const base::DictionaryValue& info);
// Erase cached credentials, used when "Save password" is unchecked.
virtual void EraseCredentials();
// Calculate a unique identifier for the network.
virtual void CalculateUniqueId();
// Methods to asynchronously set network service properties
virtual void SetStringProperty(const char* prop, const std::string& str,
std::string* dest);
virtual void SetBooleanProperty(const char* prop, bool b, bool* dest);
virtual void SetIntegerProperty(const char* prop, int i, int* dest);
virtual void SetValueProperty(const char* prop, const base::Value& val);
virtual void ClearProperty(const char* prop);
// This will clear the property if string is empty. Otherwise, it will set it.
virtual void SetOrClearStringProperty(const char* prop,
const std::string& str,
std::string* dest);
void set_unique_id(const std::string& unique_id) { unique_id_ = unique_id; }
const CertificatePattern& client_cert_pattern() const {
return ui_data_.certificate_pattern();
}
ClientCertType client_cert_type() const {
return ui_data_.certificate_type();
}
EnrollmentDelegate* enrollment_delegate() const {
return enrollment_delegate_.get();
}
private:
// This allows NetworkParser and its subclasses access to device
// privates so that they can be reconstituted during parsing. The
// parsers only access things through the private set_ functions so
// that this class can evolve without having to change all the
// parsers.
friend class NetworkParser;
friend class NativeNetworkParser;
friend class NativeVirtualNetworkParser;
// We reach directly into the network for testing purposes.
friend class MobileActivatorTest;
// This allows the implementation classes access to privates.
NETWORK_LIBRARY_IMPL_FRIENDS;
// Use these functions at your peril. They are used by the various
// parsers to set state, and really shouldn't be used by anything else
// because they don't do the error checking and sending to the
// network layer that the other setters do.
void set_device_path(const std::string& device_path) {
device_path_ = device_path;
}
void set_name(const std::string& name) { name_ = name; }
void set_connecting();
void set_behind_portal() {
state_ = STATE_PORTAL;
}
void set_connected() {
state_ = STATE_ONLINE;
}
void set_disconnected() {
state_ = STATE_IDLE;
}
void set_connectable(bool connectable) { connectable_ = connectable; }
void set_user_connect_state(UserConnectState user_connect_state) {
user_connect_state_ = user_connect_state;
}
void set_is_active(bool is_active) { is_active_ = is_active; }
void set_added(bool added) { added_ = added; }
void set_auto_connect(bool auto_connect) { auto_connect_ = auto_connect; }
void set_save_credentials(bool save_credentials) {
save_credentials_ = save_credentials;
}
void set_profile_path(const std::string& path) { profile_path_ = path; }
void set_profile_type(NetworkProfileType type) { profile_type_ = type; }
void set_ui_data(const NetworkUIData& ui_data) {
ui_data_ = ui_data;
}
void set_client_cert_pattern(const CertificatePattern& pattern) {
ui_data_.set_certificate_pattern(pattern);
}
void set_client_cert_type(ClientCertType type) {
ui_data_.set_certificate_type(type);
}
// Set the profile path and update the flimflam property.
void SetProfilePath(const std::string& profile_path);
// Trigger an asynchronous initialization the IP address field.
void InitIPAddress();
// Initialize the IP address field.
static void InitIPAddressCallback(
const std::string& service_path,
const NetworkIPConfigVector& ip_configs,
const std::string& hardware_address);
std::string device_path_;
std::string name_;
std::string ip_address_;
ConnectionState state_;
ConnectionError error_;
bool connectable_;
UserConnectState user_connect_state_;
bool is_active_;
int priority_; // determines order in network list.
bool auto_connect_;
bool save_credentials_; // save passphrase and EAP credentials to disk.
scoped_ptr<EnrollmentDelegate> enrollment_delegate_;
// Unique identifier, set the first time the network is parsed.
std::string unique_id_;
// Priority value, corresponds to index in list from shill (0 = first)
int priority_order_;
// Set to true if the UI requested this as a new network.
bool added_;
// Set to true when a new connection failure occurs; cleared when observers
// are notified.
bool notify_failure_;
// Profile path for networks.
std::string profile_path_;
// Set to profile type based on profile_path_.
NetworkProfileType profile_type_;
// These must not be modified after construction.
std::string service_path_;
ConnectionType type_;
// UI-level state that is opaque to the connection manager. The value is
// stored in JSON-serialized from in the connection manager.
NetworkUIData ui_data_;
// This is the parser we use to parse messages from the native
// network layer.
scoped_ptr<NetworkParser> network_parser_;
DISALLOW_COPY_AND_ASSIGN(Network);
};
// Class for networks of TYPE_ETHERNET.
class EthernetNetwork : public Network {
public:
explicit EthernetNetwork(const std::string& service_path);
private:
// This allows the implementation classes access to privates.
NETWORK_LIBRARY_IMPL_FRIENDS;
DISALLOW_COPY_AND_ASSIGN(EthernetNetwork);
};
// Class for networks of TYPE_VPN.
class VirtualNetwork : public Network {
public:
explicit VirtualNetwork(const std::string& service_path);
virtual ~VirtualNetwork();
const std::string& server_hostname() const { return server_hostname_; }
ProviderType provider_type() const { return provider_type_; }
const std::string& ca_cert_pem() const { return ca_cert_pem_; }
const std::string& psk_passphrase() const { return psk_passphrase_; }
const std::string& client_cert_id() const { return client_cert_id_; }
const std::string& username() const { return username_; }
const std::string& user_passphrase() const { return user_passphrase_; }
const std::string& group_name() const { return group_name_; }
// Sets the well-known PKCS#11 slot and PIN for accessing certificates.
void SetCertificateSlotAndPin(
const std::string& slot, const std::string& pin);
// Network overrides.
virtual bool RequiresUserProfile() const OVERRIDE;
virtual void CopyCredentialsFromRemembered(Network* remembered) OVERRIDE;
virtual void AttemptConnection(const base::Closure& connect) OVERRIDE;
// Public getters.
bool NeedMoreInfoToConnect() const;
std::string GetProviderTypeString() const;
// Returns true if a PSK passphrase is required to connect.
bool IsPSKPassphraseRequired() const;
// Returns true if a user passphrase is required to connect.
bool IsUserPassphraseRequired() const;
// Public setters.
void SetCACertPEM(const std::string& ca_cert_pem);
void SetL2TPIPsecPSKCredentials(const std::string& psk_passphrase,
const std::string& username,
const std::string& user_passphrase,
const std::string& group_name);
void SetL2TPIPsecCertCredentials(const std::string& client_cert_id,
const std::string& username,
const std::string& user_passphrase,
const std::string& group_name);
void SetOpenVPNCredentials(const std::string& client_cert_id,
const std::string& username,
const std::string& user_passphrase,
const std::string& otp);
void SetServerHostname(const std::string& server_hostname);
private:
// This allows NetworkParser and its subclasses access to
// device privates so that they can be reconstituted during parsing.
// The parsers only access things through the private set_ functions
// so that this class can evolve without having to change all the
// parsers.
friend class NativeNetworkParser;
friend class NativeVirtualNetworkParser;
// This allows the implementation classes access to privates.
NETWORK_LIBRARY_IMPL_FRIENDS;
// Use these functions at your peril. They are used by the various
// parsers to set state, and really shouldn't be used by anything else
// because they don't do the error checking and sending to the
// network layer that the other setters do.
void set_server_hostname(const std::string& server_hostname) {
server_hostname_ = server_hostname;
}
void set_provider_type(ProviderType provider_type) {
provider_type_ = provider_type;
}
void set_ca_cert_pem(const std::string& ca_cert_pem) {
ca_cert_pem_ = ca_cert_pem;
}
void set_psk_passphrase(const std::string& psk_passphrase) {
psk_passphrase_ = psk_passphrase;
}
void set_psk_passphrase_required(bool psk_passphrase_required) {
psk_passphrase_required_ = psk_passphrase_required;
}
void set_client_cert_id(const std::string& client_cert_id) {
client_cert_id_ = client_cert_id;
}
void set_username(const std::string& username) { username_ = username; }
void set_user_passphrase(const std::string& user_passphrase) {
user_passphrase_ = user_passphrase;
}
void set_user_passphrase_required(bool user_passphrase_required) {
user_passphrase_required_ = user_passphrase_required;
}
void set_group_name(const std::string& group_name) {
group_name_ = group_name;
}
// Matches the client certificate pattern by checking to see if a certificate
// exists that meets the pattern criteria. If it finds one, it sets the
// appropriate network property. If not, it passes |connect| to the
// EnrollmentDelegate to do something with the enrollment URI (e.g. launch a
// dialog) to install the certificate, and then invoke |connect|. If
// |allow_enroll| is false, then the enrollment handler will not be invoked in
// the case of a missing certificate.
void MatchCertificatePattern(bool allow_enroll, const base::Closure& connect);
// Network overrides.
virtual void EraseCredentials() OVERRIDE;
virtual void CalculateUniqueId() OVERRIDE;
std::string server_hostname_;
ProviderType provider_type_;
std::string ca_cert_pem_;
std::string psk_passphrase_;
bool psk_passphrase_required_;
// PKCS#11 ID for client certificate.
std::string client_cert_id_;
std::string username_;
std::string user_passphrase_;
bool user_passphrase_required_;
std::string group_name_;
// Weak pointer factory for wrapping pointers to this network in callbacks.
base::WeakPtrFactory<VirtualNetwork> weak_pointer_factory_;
DISALLOW_COPY_AND_ASSIGN(VirtualNetwork);
};
typedef std::vector<VirtualNetwork*> VirtualNetworkVector;
// Base class for networks of TYPE_WIFI or TYPE_CELLULAR.
class WirelessNetwork : public Network {
public:
// Test API for accessing setters in tests.
class TestApi {
public:
explicit TestApi(WirelessNetwork* network) : network_(network) {}
void SetStrength(int strength) { network_->set_strength(strength); }
private:
WirelessNetwork* network_;
};
friend class TestApi;
int strength() const { return strength_; }
protected:
WirelessNetwork(const std::string& service_path,
ConnectionType type)
: Network(service_path, type), strength_(0) {}
private:
// This allows NativeWirelessNetworkParser access to device privates
// so that they can be reconstituted during parsing. The parsers
// only access things through the private set_ functions so that
// this class can evolve without having to change all the parsers.
friend class NativeWirelessNetworkParser;
// This allows the implementation classes access to privates.
NETWORK_LIBRARY_IMPL_FRIENDS;
// The friend parsers use this.
void set_strength(int strength) { strength_ = strength; }
int strength_; // 0-100
DISALLOW_COPY_AND_ASSIGN(WirelessNetwork);
};
// Class for networks of TYPE_CELLULAR.
class CellularNetwork : public WirelessNetwork {
public:
// Test API for accessing setters in tests.
class TestApi {
public:
explicit TestApi(CellularNetwork* network) : network_(network) {}
void SetRoamingState(NetworkRoamingState roaming_state) {
network_->set_roaming_state(roaming_state);
}
private:
CellularNetwork* network_;
};
friend class TestApi;
explicit CellularNetwork(const std::string& service_path);
virtual ~CellularNetwork();
// Starts device activation process. Returns false if the device state does
// not permit activation.
virtual bool StartActivation();
virtual void CompleteActivation();
bool activate_over_non_cellular_network() const {
return activate_over_non_cellular_network_;
}
const ActivationState activation_state() const { return activation_state_; }
bool activated() const {
return activation_state() == ACTIVATION_STATE_ACTIVATED;
}
const NetworkTechnology network_technology() const {
return network_technology_;
}
const NetworkRoamingState roaming_state() const { return roaming_state_; }
const std::string& operator_name() const { return operator_name_; }
const std::string& operator_code() const { return operator_code_; }
const std::string& operator_country() const { return operator_country_; }
bool out_of_credits() const { return out_of_credits_; }
const std::string& payment_url() const { return payment_url_; }
const std::string& usage_url() const { return usage_url_; }
const std::string& post_data() const { return post_data_; }
const bool using_post() const { return using_post_; }
const CellularApn& apn() const { return apn_; }
const CellularApn& last_good_apn() const { return last_good_apn_; }
// Sets the APN to use in establishing data connections. Only
// the fields of the APN that are needed for making connections
// are passed to shill. The name, localized_name, and language
// fields are ignored.
void SetApn(const CellularApn& apn);
// Returns true if network supports activation.
bool SupportsActivation() const;
// Returns whether the network needs to be activated.
bool NeedsActivation() const;
// Return a string representation of network technology.
std::string GetNetworkTechnologyString() const;
// Return a string representation of activation state.
std::string GetActivationStateString() const;
// Return a string representation of roaming state.
std::string GetRoamingStateString() const;
// Return a string representation of |activation_state|.
static std::string ActivationStateToString(ActivationState activation_state);
private:
// This allows NativeCellularNetworkParser access to device privates
// so that they can be reconstituted during parsing. The parsers
// only access things through the private set_ functions so that
// this class can evolve without having to change all the parsers.
friend class NativeCellularNetworkParser;
// We reach directly into the network for testing purposes.
friend class MobileActivatorTest;
// This allows the implementation classes access to privates.
NETWORK_LIBRARY_IMPL_FRIENDS;
// Use these functions at your peril. They are used by the various
// parsers to set state, and really shouldn't be used by anything else
// because they don't do the error checking and sending to the
// network layer that the other setters do.
void set_activate_over_non_cellular_network(bool value) {
activate_over_non_cellular_network_ = value;
}
void set_activation_state(ActivationState activation_state) {
activation_state_ = activation_state;
}
void set_network_technology(NetworkTechnology network_technology) {
network_technology_ = network_technology;
}
void set_roaming_state(NetworkRoamingState roaming_state) {
roaming_state_ = roaming_state;
}
void set_operator_name(const std::string& operator_name) {
operator_name_ = operator_name;
}
void set_operator_code(const std::string& operator_code) {
operator_code_ = operator_code;
}
void set_operator_country(const std::string& operator_country) {
operator_country_ = operator_country;
}
void set_out_of_credits(bool out_of_credits) {
out_of_credits_ = out_of_credits;
}
void set_payment_url(const std::string& payment_url) {
payment_url_ = payment_url;
}
void set_post_data(const std::string& post_data) {
post_data_ = post_data;
}
void set_using_post(bool using_post) {
using_post_ = using_post;
}
void set_usage_url(const std::string& usage_url) { usage_url_ = usage_url; }
void set_apn(const base::DictionaryValue& apn) { apn_.Set(apn); }
void set_last_good_apn(const base::DictionaryValue& last_good_apn) {
last_good_apn_.Set(last_good_apn);
}
bool activate_over_non_cellular_network_;
bool out_of_credits_;
ActivationState activation_state_;
NetworkTechnology network_technology_;
NetworkRoamingState roaming_state_;
// Carrier Info
std::string operator_name_;
std::string operator_code_;
std::string operator_country_;
std::string payment_url_;
std::string usage_url_;
std::string post_data_;
bool using_post_;
// Cached values
CellularApn apn_;
CellularApn last_good_apn_;
DISALLOW_COPY_AND_ASSIGN(CellularNetwork);
};
typedef std::vector<CellularNetwork*> CellularNetworkVector;
// Class for networks of TYPE_WIFI.
class WifiNetwork : public WirelessNetwork {
public:
// Test API for accessing setters in tests.
class TestApi {
public:
explicit TestApi(WifiNetwork* network) : network_(network) {}
void SetEncryption(ConnectionSecurity encryption) {
network_->set_encryption(encryption);
}
void SetSsid(const std::string& ssid) {
network_->SetSsid(ssid);
}
void SetHexSsid(const std::string& ssid_hex) {
network_->SetHexSsid(ssid_hex);
}
private:
WifiNetwork* network_;
};
friend class TestApi;
explicit WifiNetwork(const std::string& service_path);
virtual ~WifiNetwork();
bool encrypted() const { return encryption_ != SECURITY_NONE; }
ConnectionSecurity encryption() const { return encryption_; }
const std::string& passphrase() const { return passphrase_; }
const std::string& identity() const { return identity_; }
bool passphrase_required() const { return passphrase_required_; }
bool hidden_ssid() const { return hidden_ssid_; }
const std::string& bssid() const { return bssid_; }
int frequency() const { return frequency_; }
EAPMethod eap_method() const { return eap_method_; }
EAPPhase2Auth eap_phase_2_auth() const { return eap_phase_2_auth_; }
const std::string& eap_server_ca_cert_pem() const {
return eap_server_ca_cert_pem_; }
const std::string& eap_client_cert_pkcs11_id() const {
return eap_client_cert_pkcs11_id_; }
const bool eap_use_system_cas() const { return eap_use_system_cas_; }
const std::string& eap_identity() const { return eap_identity_; }
const std::string& eap_anonymous_identity() const {
return eap_anonymous_identity_;
}
const std::string& eap_passphrase() const { return eap_passphrase_; }
const bool eap_save_credentials() const { return eap_save_credentials_; }
const std::string& GetPassphrase() const;
// Set property and call SetNetworkServiceProperty:
void SetPassphrase(const std::string& passphrase);
// 802.1x properties
void SetEAPMethod(EAPMethod method);
void SetEAPPhase2Auth(EAPPhase2Auth auth);
void SetEAPServerCaCertPEM(const std::string& ca_cert_pem);
void SetEAPClientCertPkcs11Id(const std::string& pkcs11_id);
void SetEAPUseSystemCAs(bool use_system_cas);
void SetEAPIdentity(const std::string& identity);
void SetEAPAnonymousIdentity(const std::string& identity);
void SetEAPPassphrase(const std::string& passphrase);
// Sets the well-known PKCS#11 PIN for accessing certificates.
void SetCertificatePin(const std::string& pin);
// Network overrides.
virtual bool RequiresUserProfile() const OVERRIDE;
virtual void AttemptConnection(const base::Closure& connect) OVERRIDE;
// Return a string representation of the encryption code.
// This not translated and should be only used for debugging purposes.
std::string GetEncryptionString() const;
// Return true if a passphrase or other input is required to connect.
bool IsPassphraseRequired() const;
protected:
// This allows NativeWifiNetworkParser access to device privates so
// that they can be reconstituted during parsing. The parsers only
// access things through the private set_ functions so that this
// class can evolve without having to change all the parsers.
friend class NativeWifiNetworkParser;
// This allows the implementation classes access to privates.
NETWORK_LIBRARY_IMPL_FRIENDS;
// Use these functions at your peril. They are used by the various
// parsers to set state, and really shouldn't be used by anything else
// because they don't do the error checking and sending to the
// network layer that the other setters do.
bool SetSsid(const std::string& ssid);
bool SetHexSsid(const std::string& ssid_hex);
void set_encryption(ConnectionSecurity encryption) {
encryption_ = encryption;
}
void set_passphrase(const std::string& passphrase) {
passphrase_ = passphrase;
user_passphrase_ = passphrase;
}
void set_passphrase_required(bool passphrase_required) {
passphrase_required_ = passphrase_required;
}
void set_identity(const std::string& identity) {
identity_ = identity;
}
void set_hidden_ssid(bool hidden_ssid) {
hidden_ssid_ = hidden_ssid;
}
void set_bssid(const std::string& bssid) { bssid_ = bssid; }
void set_frequency(int frequency) { frequency_ = frequency; }
void set_eap_method(EAPMethod eap_method) { eap_method_ = eap_method; }
void set_eap_phase_2_auth(EAPPhase2Auth eap_phase_2_auth) {
eap_phase_2_auth_ = eap_phase_2_auth;
}
void set_eap_server_ca_cert_pem(const std::string& eap_server_ca_cert_pem) {
eap_server_ca_cert_pem_ = eap_server_ca_cert_pem;
}
void set_eap_client_cert_pkcs11_id(
const std::string& eap_client_cert_pkcs11_id) {
eap_client_cert_pkcs11_id_ = eap_client_cert_pkcs11_id;
}
void set_eap_use_system_cas(bool eap_use_system_cas) {
eap_use_system_cas_ = eap_use_system_cas;
}
void set_eap_identity(const std::string& eap_identity) {
eap_identity_ = eap_identity;
}
void set_eap_anonymous_identity(const std::string& eap_anonymous_identity) {
eap_anonymous_identity_ = eap_anonymous_identity;
}
void set_eap_passphrase(const std::string& eap_passphrase) {
eap_passphrase_ = eap_passphrase;
}
void set_eap_save_credentials(bool save_credentials) {
eap_save_credentials_ = save_credentials;
}
// Matches the client certificate pattern by checking to see if a certificate
// exists that meets the pattern criteria. If it finds one, it sets the
// appropriate network property. If not, it passes |connect| to the
// EnrollmentDelegate to do something with the enrollment URI (e.g. launch a
// dialog) to install the certificate, and then invoke |connect|. If
// |allow_enroll| is false, then the enrollment handler will not be invoked in
// the case of a missing certificate.
void MatchCertificatePattern(bool allow_enroll, const base::Closure& connect);
// Network overrides.
virtual void EraseCredentials() OVERRIDE;
virtual void CalculateUniqueId() OVERRIDE;
ConnectionSecurity encryption_;
std::string passphrase_;
bool passphrase_required_;
std::string identity_;
bool hidden_ssid_;
std::string bssid_;
int frequency_;
EAPMethod eap_method_;
EAPPhase2Auth eap_phase_2_auth_;
std::string eap_server_ca_cert_pem_;
std::string eap_client_cert_pkcs11_id_;
bool eap_use_system_cas_;
std::string eap_identity_;
std::string eap_anonymous_identity_;
std::string eap_passphrase_;
bool eap_save_credentials_;
// Internal state (not stored in shill).
// Passphrase set by user (stored for UI).
std::string user_passphrase_;
// Weak pointer factory for wrapping pointers to this network in callbacks.
base::WeakPtrFactory<WifiNetwork> weak_pointer_factory_;
DISALLOW_COPY_AND_ASSIGN(WifiNetwork);
};
typedef std::vector<WifiNetwork*> WifiNetworkVector;
// Class for networks of TYPE_WIMAX.
class WimaxNetwork : public WirelessNetwork {
public:
explicit WimaxNetwork(const std::string& service_path);
virtual ~WimaxNetwork();
bool passphrase_required() const { return passphrase_required_; }
const std::string& eap_identity() const { return eap_identity_; }
const std::string& eap_passphrase() const { return eap_passphrase_; }
void SetEAPIdentity(const std::string& identity);
void SetEAPPassphrase(const std::string& passphrase);
protected:
// This allows NativeWimaxNetworkParser access to device privates so
// that they can be reconstituted during parsing. The parsers only
// access things through the private set_ functions so that this
// class can evolve without having to change all the parsers.
friend class NativeWimaxNetworkParser;
// This allows the implementation classes access to privates.
NETWORK_LIBRARY_IMPL_FRIENDS;
void set_eap_identity(const std::string& identity) {
eap_identity_ = identity;
}
void set_eap_passphrase(const std::string& passphrase) {
eap_passphrase_ = passphrase;
}
void set_passphrase_required(bool passphrase_required) {
passphrase_required_ = passphrase_required;
}
// Network overrides.
virtual void EraseCredentials() OVERRIDE;
virtual void CalculateUniqueId() OVERRIDE;
bool passphrase_required_;
std::string eap_identity_;
std::string eap_passphrase_;
DISALLOW_COPY_AND_ASSIGN(WimaxNetwork);
};
typedef std::vector<WimaxNetwork*> WimaxNetworkVector;
// Geolocation data.
struct CellTower {
CellTower();
enum RadioType {
RADIOTYPE_GSM,
RADIOTYPE_CDMA,
RADIOTYPE_WCDMA,
} radio_type; // GSM/WCDMA CDMA
int mobile_country_code; // MCC MCC
int mobile_network_code; // MNC SID
int location_area_code; // LAC NID
int cell_id; // CID BID
base::Time timestamp; // Timestamp when this cell was primary
int signal_strength; // Radio signal strength measured in dBm.
int timing_advance; // Represents the distance from the cell tower.
// Each unit is roughly 550 meters.
};
typedef std::vector<CellTower> CellTowerVector;
// This class handles the interaction with the ChromeOS network library APIs.
// Classes can add themselves as observers. Users can get an instance of the
// library like this: chromeos::NetworkLibrary::Get()
class NetworkLibrary {
public:
enum HardwareAddressFormat {
FORMAT_RAW_HEX,
FORMAT_COLON_SEPARATED_HEX
};
// Used to configure which IP parameters will be specified by DHCP and which
// will be set by the user.
enum UseDHCP {
USE_DHCP_ADDRESS = 0x1,
USE_DHCP_NETMASK = 0x1 << 1,
USE_DHCP_GATEWAY = 0x1 << 2,
USE_DHCP_NAME_SERVERS = 0x1 << 3,
USE_DHCP_ALL_ROUTING_INFO =
(USE_DHCP_ADDRESS |
USE_DHCP_NETMASK |
USE_DHCP_GATEWAY),
};
class NetworkProfileObserver {
public:
// Called when the list of network profiles was changed.
virtual void OnProfileListChanged() = 0;
protected:
virtual ~NetworkProfileObserver() {}
};
class NetworkManagerObserver {
public:
// Called when the state of the network manager has changed,
// for example, networks have appeared or disappeared.
virtual void OnNetworkManagerChanged(NetworkLibrary* obj) = 0;
protected:
virtual ~NetworkManagerObserver() {}
};
class NetworkObserver {
public:
// Called when the state of a single network has changed,
// for example signal strength or connection state.
virtual void OnNetworkChanged(NetworkLibrary* cros,
const Network* network) = 0;
protected:
virtual ~NetworkObserver() {}
};
class NetworkDeviceObserver {
public:
// Called when |device| got notification about new networks available.
virtual void OnNetworkDeviceFoundNetworks(NetworkLibrary* cros,
const NetworkDevice* device) {}
// Called when |device| got notification about SIM lock change.
virtual void OnNetworkDeviceSimLockChanged(NetworkLibrary* cros,
const NetworkDevice* device) {}
protected:
virtual ~NetworkDeviceObserver() {}
};
class PinOperationObserver {
public:
// Called when pin async operation has completed.
// Network is NULL when we don't have an associated Network object.
virtual void OnPinOperationCompleted(NetworkLibrary* cros,
PinOperationError error) = 0;
protected:
virtual ~PinOperationObserver() {}
};
virtual ~NetworkLibrary() {}
virtual void Init() = 0;
// Returns true if libcros was loaded instead of stubbed out.
virtual bool IsCros() const = 0;
virtual void AddNetworkProfileObserver(NetworkProfileObserver* observer) = 0;
virtual void RemoveNetworkProfileObserver(
NetworkProfileObserver* observer) = 0;
virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) = 0;
virtual void RemoveNetworkManagerObserver(
NetworkManagerObserver* observer) = 0;
// An attempt to add an observer that has already been added for a
// give service path will be ignored.
virtual void AddNetworkObserver(const std::string& service_path,
NetworkObserver* observer) = 0;
// Remove an observer of a single network
virtual void RemoveNetworkObserver(const std::string& service_path,
NetworkObserver* observer) = 0;
// Stop |observer| from observing any networks
virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) = 0;
// Add an observer for a single network device.
virtual void AddNetworkDeviceObserver(const std::string& device_path,
NetworkDeviceObserver* observer) = 0;
// Remove an observer for a single network device.
virtual void RemoveNetworkDeviceObserver(const std::string& device_path,
NetworkDeviceObserver* observer) = 0;
virtual void AddPinOperationObserver(PinOperationObserver* observer) = 0;
virtual void RemovePinOperationObserver(PinOperationObserver* observer) = 0;
// Return the active or default Ethernet network (or NULL if none).
virtual const EthernetNetwork* ethernet_network() const = 0;
virtual bool ethernet_connecting() const = 0;
virtual bool ethernet_connected() const = 0;
// Return the active Wifi network (or NULL if none active).
virtual const WifiNetwork* wifi_network() const = 0;
virtual bool wifi_connecting() const = 0;
virtual bool wifi_connected() const = 0;
// Return the active Cellular network (or NULL if none active).
virtual const CellularNetwork* cellular_network() const = 0;
virtual bool cellular_connecting() const = 0;
virtual bool cellular_connected() const = 0;
// Return the active Wimax network (or NULL if none active).
virtual const WimaxNetwork* wimax_network() const = 0;
virtual bool wimax_connecting() const = 0;
virtual bool wimax_connected() const = 0;
// Return the active virtual network (or NULL if none active).
virtual const VirtualNetwork* virtual_network() const = 0;
virtual bool virtual_network_connecting() const = 0;
virtual bool virtual_network_connected() const = 0;
// Return true if any network is currently connected.
virtual bool Connected() const = 0;
// Return true if any network is currently connecting.
virtual bool Connecting() const = 0;
// Returns the current list of wifi networks.
virtual const WifiNetworkVector& wifi_networks() const = 0;
// Returns the list of remembered wifi networks.
virtual const WifiNetworkVector& remembered_wifi_networks() const = 0;
// Returns the current list of cellular networks.
virtual const CellularNetworkVector& cellular_networks() const = 0;
// Returns the current list of Wimax networks.
virtual const WimaxNetworkVector& wimax_networks() const = 0;
// Returns the current list of virtual networks.
virtual const VirtualNetworkVector& virtual_networks() const = 0;
// Returns the current list of virtual networks.
virtual const VirtualNetworkVector& remembered_virtual_networks() const = 0;
virtual const Network* active_network() const = 0;
virtual const Network* active_nonvirtual_network() const = 0;
virtual const Network* connected_network() const = 0;
virtual const Network* connecting_network() const = 0;
virtual bool ethernet_available() const = 0;
virtual bool wifi_available() const = 0;
virtual bool wimax_available() const = 0;
virtual bool cellular_available() const = 0;
virtual bool ethernet_enabled() const = 0;
virtual bool wifi_enabled() const = 0;
virtual bool wimax_enabled() const = 0;
virtual bool cellular_enabled() const = 0;
virtual bool wifi_scanning() const = 0;
virtual bool cellular_initializing() const = 0;
// Return a pointer to the device, if it exists, or NULL.
virtual const NetworkDevice* FindNetworkDeviceByPath(
const std::string& path) const = 0;
// Returns device with TYPE_CELLULAR or TYPE_WIMAX.
// Returns NULL if none exists.
virtual const NetworkDevice* FindMobileDevice() const = 0;
// Returns device with TYPE_CELLULAR. Returns NULL if none exists.
virtual const NetworkDevice* FindCellularDevice() const = 0;
// Return a pointer to the network, if it exists, or NULL.
// NOTE: Never store these results, store service paths instead.
// The pattern for doing an operation on a Network is:
// Network* network = cros->FindNetworkByPath(service_path);
// network->SetFoo();
// network->Connect();
// As long as this is done in sequence on the UI thread it will be safe;
// the network list only gets updated on the UI thread.
virtual Network* FindNetworkByPath(const std::string& path) const = 0;
virtual Network* FindNetworkByUniqueId(
const std::string& unique_id) const = 0;
virtual WifiNetwork* FindWifiNetworkByPath(const std::string& path) const = 0;
virtual CellularNetwork* FindCellularNetworkByPath(
const std::string& path) const = 0;
virtual WimaxNetwork* FindWimaxNetworkByPath(
const std::string& path) const = 0;
virtual VirtualNetwork* FindVirtualNetworkByPath(
const std::string& path) const = 0;
// Return a pointer to the remembered network, if it exists, or NULL.
virtual Network* FindRememberedNetworkByPath(
const std::string& path) const = 0;
// Return a pointer to the ONC dictionary for a network identified by unique
// ID. Returns NULL if there is no ONC dictionary available for that network.
// The ONC dictionary is usually only present for policy-configure networks
// which get reconfigured at startup.
virtual const base::DictionaryValue* FindOncForNetwork(
const std::string& unique_id) const = 0;
// Records information that cellular plan payment has happened.
virtual void SignalCellularPlanPayment() = 0;
// Returns true if cellular plan payment has been recorded recently.
virtual bool HasRecentCellularPlanPayment() = 0;
// Returns home carrier ID if available, otherwise empty string is returned.
// Carrier ID format: <carrier name> (country). Ex.: "Verizon (us)".
virtual const std::string& GetCellularHomeCarrierId() const = 0;
// Checks if the current cellular device should be activated by directly
// calling it's activate function instead of going through the activation
// process.
// Note: Currently Sprint is the only carrier using direct activation.
virtual bool CellularDeviceUsesDirectActivation() const = 0;
// Passes |old_pin|, |new_pin| to change SIM card PIM.
virtual void ChangePin(const std::string& old_pin,
const std::string& new_pin) = 0;
// Passes |pin|, |require_pin| value to change SIM card RequirePin setting.
virtual void ChangeRequirePin(bool require_pin,
const std::string& pin) = 0;
// Passes |pin| to unlock SIM card.
virtual void EnterPin(const std::string& pin) = 0;
// Passes |puk|, |new_pin| to unblock SIM card.
virtual void UnblockPin(const std::string& puk,
const std::string& new_pin) = 0;
// Request a scan for available cellular networks.
virtual void RequestCellularScan() = 0;
// Request a register in cellular network with |network_id|.
virtual void RequestCellularRegister(const std::string& network_id) = 0;
// Change data roaming restriction for current cellular device.
virtual void SetCellularDataRoamingAllowed(bool new_value) = 0;
// Changes the active cellular carrier to the one provided, calls the closure
// once the transition is complete.
virtual void SetCarrier(const std::string& carrier,
const NetworkOperationCallback& completed) = 0;
// Return true if GSM SIM card can work only with enabled roaming.
virtual bool IsCellularAlwaysInRoaming() = 0;
// Request a scan for new wifi networks.
virtual void RequestNetworkScan() = 0;
// TODO(joth): Add GetCellTowers to retrieve a CellTowerVector.
// Returns false if there is no way to connect to this network, even with
// user input (e.g. it requires a user profile but none is available).
virtual bool CanConnectToNetwork(const Network* network) const = 0;
// Connect to the specified wireless network.
virtual void ConnectToWifiNetwork(WifiNetwork* network) = 0;
// Connect to the specified wireless network and set its profile
// to SHARED if |shared| is true, otherwise to USER.
virtual void ConnectToWifiNetwork(WifiNetwork* network, bool shared) = 0;
// Connect to the specified cellular network.
virtual void ConnectToCellularNetwork(CellularNetwork* network) = 0;
// Connect to the specified WiMAX network.
virtual void ConnectToWimaxNetwork(WimaxNetwork* network) = 0;
// Connect to the specified WiMAX network and set its profile
// to SHARED if |shared| is true, otherwise to USER.
virtual void ConnectToWimaxNetwork(WimaxNetwork* network, bool shared) = 0;
// Connect to the specified virtual network.
virtual void ConnectToVirtualNetwork(VirtualNetwork* network) = 0;
// Connect to an unconfigured network with given SSID, security, passphrase,
// and optional EAP configuration. If |security| is SECURITY_8021X,
// |eap_config| must be provided.
struct EAPConfigData {
EAPConfigData();
~EAPConfigData();
EAPMethod method;
EAPPhase2Auth auth;
std::string server_ca_cert_pem;
bool use_system_cas;
std::string client_cert_pkcs11_id;
std::string identity;
std::string anonymous_identity;
};
virtual void ConnectToUnconfiguredWifiNetwork(
const std::string& ssid,
ConnectionSecurity security,
const std::string& passphrase,
const EAPConfigData* eap_config,
bool save_credentials,
bool shared) = 0;
// Connect to the specified virtual network with service name.
// VPNConfigData must be provided.
struct VPNConfigData {
VPNConfigData();
~VPNConfigData();
std::string psk;
std::string server_ca_cert_pem;
std::string client_cert_pkcs11_id;
std::string username;
std::string user_passphrase;
std::string otp;
std::string group_name;
bool save_credentials;
};
virtual void ConnectToUnconfiguredVirtualNetwork(
const std::string& service_name,
const std::string& server_hostname,
ProviderType provider_type,
const VPNConfigData& config) = 0;
// Disconnect from the specified network.
virtual void DisconnectFromNetwork(const Network* network) = 0;
// Forget the network corresponding to service_path.
virtual void ForgetNetwork(const std::string& service_path) = 0;
// Enables/disables the ethernet network device.
virtual void EnableEthernetNetworkDevice(bool enable) = 0;
// Enables/disables the wifi network device.
virtual void EnableWifiNetworkDevice(bool enable) = 0;
// Enables/disables the wimax network device.
virtual void EnableWimaxNetworkDevice(bool enable) = 0;
// Enables/disables the cellular network device.
virtual void EnableCellularNetworkDevice(bool enable) = 0;
// Fetches IP configs and hardware address for a given device_path and returns
// them via the given callback.
virtual void GetIPConfigs(const std::string& device_path,
HardwareAddressFormat format,
const NetworkGetIPConfigsCallback& callback) = 0;
// Sets the configuration of the IP parameters. This is called when user
// changes IP settings from dhcp to static or vice versa or when user changes
// the ip config info. If nothing is changed, this method does nothing.
// |dhcp_usage_mask| is a bitmask composed of items from the UseDHCP enum, and
// indicates which of the supplied values are overridden by values given by
// the default IP acquisition technique for the service (DHCP, usually).
virtual void SetIPParameters(const std::string& service_path,
const std::string& address,
const std::string& netmask,
const std::string& gateway,
const std::string& name_servers,
int dhcp_usage_mask) = 0;
// Requests the service properties associated with |service_path|. Calls
// |callback| with the properties when competed.
typedef base::Callback<void(const std::string& service_path,
const base::DictionaryValue* properties)>
NetworkServicePropertiesCallback;
virtual void RequestNetworkServiceProperties(
const std::string& service_path,
const NetworkServicePropertiesCallback& callback) = 0;
// Load networks from a list of NetworkConfigurations of ONC.
virtual void LoadOncNetworks(const base::ListValue& network_configs,
onc::ONCSource source) = 0;
// This sets the active network for the network type. Note: priority order
// is unchanged (i.e. if a wifi network is set to active, but an ethernet
// network is still active, active_network() will still return the ethernet
// network). Other networks of the same type will become inactive.
// Used for testing.
virtual bool SetActiveNetwork(ConnectionType type,
const std::string& service_path) = 0;
// Factory function, creates a new instance and returns ownership.
// For normal usage, access the singleton via NetworkLibrary::Get().
static NetworkLibrary* GetImpl(bool stub);
// Initializes the global instance.
static void Initialize(bool use_stub);
// Destroys the global instance. Must be called before AtExitManager is
// destroyed to ensure a clean shutdown.
static void Shutdown();
// Gets the global instance. Returns NULL if Initialize() has not been
// called (or Shutdown() has been called).
static NetworkLibrary* Get();
// Sets the network library to be returned from Get(). The existing network
// library will be deleted.
static void SetForTesting(NetworkLibrary* network_library);
};
// The class is used for enabling the stub libcros, and cleaning it up at
// the end of the object lifetime. Useful for testing.
class ScopedStubNetworkLibraryEnabler {
public:
ScopedStubNetworkLibraryEnabler() {
NetworkLibrary::Initialize(true);
}
~ScopedStubNetworkLibraryEnabler() {
NetworkLibrary::Shutdown();
}
private:
DISALLOW_COPY_AND_ASSIGN(ScopedStubNetworkLibraryEnabler);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_