| Index: chrome/browser/chromeos/cros/network_library_impl_base.cc
|
| diff --git a/chrome/browser/chromeos/cros/network_library_impl_base.cc b/chrome/browser/chromeos/cros/network_library_impl_base.cc
|
| deleted file mode 100644
|
| index 9b169a55c87a4b7494c0ebc4ff76208d14a2de8c..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/cros/network_library_impl_base.cc
|
| +++ /dev/null
|
| @@ -1,1595 +0,0 @@
|
| -// 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.
|
| -
|
| -#include "chrome/browser/chromeos/cros/network_library_impl_base.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/json/json_writer.h"
|
| -#include "base/memory/scoped_vector.h"
|
| -#include "base/stl_util.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "chrome/browser/chromeos/cros/network_constants.h"
|
| -#include "chrome/browser/chromeos/login/user_manager.h"
|
| -#include "chrome/browser/chromeos/net/onc_utils.h"
|
| -#include "chromeos/network/network_state_handler.h"
|
| -#include "chromeos/network/network_ui_data.h"
|
| -#include "chromeos/network/onc/onc_constants.h"
|
| -#include "chromeos/network/onc/onc_normalizer.h"
|
| -#include "chromeos/network/onc/onc_signature.h"
|
| -#include "chromeos/network/onc/onc_translator.h"
|
| -#include "chromeos/network/onc/onc_utils.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "crypto/nss_util.h" // crypto::GetTPMTokenInfo() for 802.1X and VPN.
|
| -#include "third_party/cros_system_api/dbus/service_constants.h"
|
| -
|
| -using content::BrowserThread;
|
| -
|
| -namespace chromeos {
|
| -
|
| -namespace {
|
| -
|
| -// Only send network change notifications to observers once every 50ms.
|
| -const int kNetworkNotifyDelayMs = 50;
|
| -
|
| -// How long we should remember that cellular plan payment was received.
|
| -const int kRecentPlanPaymentHours = 6;
|
| -
|
| -NetworkProfileType GetProfileTypeForSource(onc::ONCSource source) {
|
| - switch (source) {
|
| - case onc::ONC_SOURCE_DEVICE_POLICY:
|
| - return PROFILE_SHARED;
|
| - case onc::ONC_SOURCE_USER_POLICY:
|
| - return PROFILE_USER;
|
| - case onc::ONC_SOURCE_NONE:
|
| - case onc::ONC_SOURCE_USER_IMPORT:
|
| - return PROFILE_NONE;
|
| - }
|
| - NOTREACHED() << "Unknown ONC source " << source;
|
| - return PROFILE_NONE;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -NetworkLibraryImplBase::NetworkLibraryImplBase()
|
| - : ethernet_(NULL),
|
| - active_wifi_(NULL),
|
| - active_cellular_(NULL),
|
| - active_wimax_(NULL),
|
| - active_virtual_(NULL),
|
| - available_devices_(0),
|
| - uninitialized_devices_(0),
|
| - enabled_devices_(0),
|
| - busy_devices_(0),
|
| - wifi_scanning_(false),
|
| - is_locked_(false),
|
| - sim_operation_(SIM_OPERATION_NONE),
|
| - notify_manager_weak_factory_(this) {
|
| -}
|
| -
|
| -NetworkLibraryImplBase::~NetworkLibraryImplBase() {
|
| - network_profile_observers_.Clear();
|
| - network_manager_observers_.Clear();
|
| - pin_operation_observers_.Clear();
|
| - STLDeleteValues(&network_map_);
|
| - ClearNetworks();
|
| - DeleteRememberedNetworks();
|
| - STLDeleteValues(&device_map_);
|
| - STLDeleteValues(&network_device_observers_);
|
| - STLDeleteValues(&network_observers_);
|
| - STLDeleteValues(&network_onc_map_);
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -// NetworkLibrary implementation.
|
| -
|
| -void NetworkLibraryImplBase::AddNetworkProfileObserver(
|
| - NetworkProfileObserver* observer) {
|
| - network_profile_observers_.AddObserver(observer);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::RemoveNetworkProfileObserver(
|
| - NetworkProfileObserver* observer) {
|
| - network_profile_observers_.RemoveObserver(observer);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::AddNetworkManagerObserver(
|
| - NetworkManagerObserver* observer) {
|
| - if (!network_manager_observers_.HasObserver(observer))
|
| - network_manager_observers_.AddObserver(observer);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::RemoveNetworkManagerObserver(
|
| - NetworkManagerObserver* observer) {
|
| - network_manager_observers_.RemoveObserver(observer);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::AddNetworkObserver(
|
| - const std::string& service_path, NetworkObserver* observer) {
|
| - // First, add the observer to the callback map.
|
| - NetworkObserverMap::iterator iter = network_observers_.find(service_path);
|
| - NetworkObserverList* oblist;
|
| - if (iter != network_observers_.end()) {
|
| - oblist = iter->second;
|
| - } else {
|
| - oblist = new NetworkObserverList();
|
| - network_observers_[service_path] = oblist;
|
| - }
|
| - if (observer && !oblist->HasObserver(observer))
|
| - oblist->AddObserver(observer);
|
| - MonitorNetworkStart(service_path);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::RemoveNetworkObserver(
|
| - const std::string& service_path, NetworkObserver* observer) {
|
| - DCHECK(service_path.size());
|
| - NetworkObserverMap::iterator map_iter =
|
| - network_observers_.find(service_path);
|
| - if (map_iter != network_observers_.end()) {
|
| - map_iter->second->RemoveObserver(observer);
|
| - if (!map_iter->second->might_have_observers()) {
|
| - MonitorNetworkStop(service_path);
|
| - delete map_iter->second;
|
| - network_observers_.erase(map_iter);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::RemoveObserverForAllNetworks(
|
| - NetworkObserver* observer) {
|
| - DCHECK(observer);
|
| - NetworkObserverMap::iterator map_iter = network_observers_.begin();
|
| - while (map_iter != network_observers_.end()) {
|
| - map_iter->second->RemoveObserver(observer);
|
| - if (!map_iter->second->might_have_observers()) {
|
| - MonitorNetworkStop(map_iter->first);
|
| - delete map_iter->second;
|
| - network_observers_.erase(map_iter++);
|
| - } else {
|
| - ++map_iter;
|
| - }
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::AddNetworkDeviceObserver(
|
| - const std::string& device_path, NetworkDeviceObserver* observer) {
|
| - // First, add the observer to the callback map.
|
| - NetworkDeviceObserverMap::iterator iter =
|
| - network_device_observers_.find(device_path);
|
| - NetworkDeviceObserverList* oblist;
|
| - if (iter != network_device_observers_.end()) {
|
| - oblist = iter->second;
|
| - } else {
|
| - oblist = new NetworkDeviceObserverList();
|
| - network_device_observers_[device_path] = oblist;
|
| - }
|
| - if (!oblist->HasObserver(observer))
|
| - oblist->AddObserver(observer);
|
| - MonitorNetworkDeviceStart(device_path);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::RemoveNetworkDeviceObserver(
|
| - const std::string& device_path, NetworkDeviceObserver* observer) {
|
| - DCHECK(device_path.size());
|
| - NetworkDeviceObserverMap::iterator map_iter =
|
| - network_device_observers_.find(device_path);
|
| - if (map_iter != network_device_observers_.end()) {
|
| - map_iter->second->RemoveObserver(observer);
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::DeleteDeviceFromDeviceObserversMap(
|
| - const std::string& device_path) {
|
| - // Delete all device observers associated with this device.
|
| - NetworkDeviceObserverMap::iterator map_iter =
|
| - network_device_observers_.find(device_path);
|
| - if (map_iter != network_device_observers_.end()) {
|
| - delete map_iter->second;
|
| - network_device_observers_.erase(map_iter);
|
| - }
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| -void NetworkLibraryImplBase::AddPinOperationObserver(
|
| - PinOperationObserver* observer) {
|
| - if (!pin_operation_observers_.HasObserver(observer))
|
| - pin_operation_observers_.AddObserver(observer);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::RemovePinOperationObserver(
|
| - PinOperationObserver* observer) {
|
| - pin_operation_observers_.RemoveObserver(observer);
|
| -}
|
| -
|
| -const EthernetNetwork* NetworkLibraryImplBase::ethernet_network() const {
|
| - return ethernet_;
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::ethernet_connecting() const {
|
| - return ethernet_ ? ethernet_->connecting() : false;
|
| -}
|
| -bool NetworkLibraryImplBase::ethernet_connected() const {
|
| - return ethernet_ ? ethernet_->connected() : false;
|
| -}
|
| -const WifiNetwork* NetworkLibraryImplBase::wifi_network() const {
|
| - return active_wifi_;
|
| -}
|
| -bool NetworkLibraryImplBase::wifi_connecting() const {
|
| - return active_wifi_ ? active_wifi_->connecting() : false;
|
| -}
|
| -bool NetworkLibraryImplBase::wifi_connected() const {
|
| - return active_wifi_ ? active_wifi_->connected() : false;
|
| -}
|
| -const CellularNetwork* NetworkLibraryImplBase::cellular_network() const {
|
| - return active_cellular_;
|
| -}
|
| -bool NetworkLibraryImplBase::cellular_connecting() const {
|
| - return active_cellular_ ? active_cellular_->connecting() : false;
|
| -}
|
| -bool NetworkLibraryImplBase::cellular_connected() const {
|
| - return active_cellular_ ? active_cellular_->connected() : false;
|
| -}
|
| -const WimaxNetwork* NetworkLibraryImplBase::wimax_network() const {
|
| - return active_wimax_;
|
| -}
|
| -bool NetworkLibraryImplBase::wimax_connecting() const {
|
| - return active_wimax_ ? active_wimax_->connecting() : false;
|
| -}
|
| -bool NetworkLibraryImplBase::wimax_connected() const {
|
| - return active_wimax_ ? active_wimax_->connected() : false;
|
| -}
|
| -const VirtualNetwork* NetworkLibraryImplBase::virtual_network() const {
|
| - return active_virtual_;
|
| -}
|
| -bool NetworkLibraryImplBase::virtual_network_connecting() const {
|
| - return active_virtual_ ? active_virtual_->connecting() : false;
|
| -}
|
| -bool NetworkLibraryImplBase::virtual_network_connected() const {
|
| - return active_virtual_ ? active_virtual_->connected() : false;
|
| -}
|
| -bool NetworkLibraryImplBase::Connected() const {
|
| - return ethernet_connected() || wifi_connected() ||
|
| - cellular_connected() || wimax_connected();
|
| -}
|
| -bool NetworkLibraryImplBase::Connecting() const {
|
| - return ethernet_connecting() || wifi_connecting() ||
|
| - cellular_connecting() || wimax_connecting();
|
| -}
|
| -const WifiNetworkVector& NetworkLibraryImplBase::wifi_networks() const {
|
| - return wifi_networks_;
|
| -}
|
| -const WifiNetworkVector&
|
| - NetworkLibraryImplBase::remembered_wifi_networks() const {
|
| - return remembered_wifi_networks_;
|
| -}
|
| -const CellularNetworkVector& NetworkLibraryImplBase::cellular_networks() const {
|
| - return cellular_networks_;
|
| -}
|
| -const WimaxNetworkVector& NetworkLibraryImplBase::wimax_networks() const {
|
| - return wimax_networks_;
|
| -}
|
| -const VirtualNetworkVector& NetworkLibraryImplBase::virtual_networks() const {
|
| - return virtual_networks_;
|
| -}
|
| -const VirtualNetworkVector&
|
| - NetworkLibraryImplBase::remembered_virtual_networks() const {
|
| - return remembered_virtual_networks_;
|
| -}
|
| -
|
| -namespace {
|
| -
|
| -// Use shill's ordering of the services to determine which type of
|
| -// network to return (i.e. don't assume priority of network types).
|
| -// Note: This does not include any virtual networks.
|
| -const Network* highest_priority(const Network* a, const Network*b) {
|
| - if (!a)
|
| - return b;
|
| - if (!b)
|
| - return a;
|
| - if (b->priority_order() < a->priority_order())
|
| - return b;
|
| - return a;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -const Network* NetworkLibraryImplBase::active_network() const {
|
| - const Network* result = active_nonvirtual_network();
|
| - if (active_virtual_ && active_virtual_->is_active())
|
| - result = highest_priority(result, active_virtual_);
|
| - return result;
|
| -}
|
| -
|
| -const Network* NetworkLibraryImplBase::active_nonvirtual_network() const {
|
| - const Network* result = NULL;
|
| - if (ethernet_ && ethernet_->is_active())
|
| - result = ethernet_;
|
| - if (active_wifi_ && active_wifi_->is_active())
|
| - result = highest_priority(result, active_wifi_);
|
| - if (active_cellular_ && active_cellular_->is_active())
|
| - result = highest_priority(result, active_cellular_);
|
| - if (active_wimax_ && active_wimax_->is_active())
|
| - result = highest_priority(result, active_wimax_);
|
| - return result;
|
| -}
|
| -
|
| -const Network* NetworkLibraryImplBase::connected_network() const {
|
| - const Network* result = NULL;
|
| - if (ethernet_ && ethernet_->connected())
|
| - result = ethernet_;
|
| - if (active_wifi_ && active_wifi_->connected())
|
| - result = highest_priority(result, active_wifi_);
|
| - if (active_cellular_ && active_cellular_->connected())
|
| - result = highest_priority(result, active_cellular_);
|
| - if (active_wimax_ && active_wimax_->connected())
|
| - result = highest_priority(result, active_wimax_);
|
| - return result;
|
| -}
|
| -
|
| -// Connecting order in logical preference.
|
| -const Network* NetworkLibraryImplBase::connecting_network() const {
|
| - if (ethernet_connecting())
|
| - return ethernet_network();
|
| - else if (wifi_connecting())
|
| - return wifi_network();
|
| - else if (cellular_connecting())
|
| - return cellular_network();
|
| - else if (wimax_connecting())
|
| - return wimax_network();
|
| - return NULL;
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::ethernet_available() const {
|
| - return available_devices_ & (1 << TYPE_ETHERNET);
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::wifi_available() const {
|
| - return available_devices_ & (1 << TYPE_WIFI);
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::wimax_available() const {
|
| - return available_devices_ & (1 << TYPE_WIMAX);
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::cellular_available() const {
|
| - return available_devices_ & (1 << TYPE_CELLULAR);
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::ethernet_enabled() const {
|
| - return enabled_devices_ & (1 << TYPE_ETHERNET);
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::wifi_enabled() const {
|
| - return enabled_devices_ & (1 << TYPE_WIFI);
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::wimax_enabled() const {
|
| - return enabled_devices_ & (1 << TYPE_WIMAX);
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::cellular_enabled() const {
|
| - return enabled_devices_ & (1 << TYPE_CELLULAR);
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::wifi_scanning() const {
|
| - return wifi_scanning_;
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::cellular_initializing() const {
|
| - if (uninitialized_devices_ & (1 << TYPE_CELLULAR))
|
| - return true;
|
| - const NetworkDevice* device = FindDeviceByType(TYPE_CELLULAR);
|
| - if (device && device->scanning())
|
| - return true;
|
| - return false;
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////
|
| -
|
| -const NetworkDevice* NetworkLibraryImplBase::FindNetworkDeviceByPath(
|
| - const std::string& path) const {
|
| - NetworkDeviceMap::const_iterator iter = device_map_.find(path);
|
| - if (iter != device_map_.end())
|
| - return iter->second;
|
| - LOG(WARNING) << "Device path not found: " << path;
|
| - return NULL;
|
| -}
|
| -
|
| -NetworkDevice* NetworkLibraryImplBase::FindNetworkDeviceByPath(
|
| - const std::string& path) {
|
| - NetworkDeviceMap::iterator iter = device_map_.find(path);
|
| - if (iter != device_map_.end())
|
| - return iter->second;
|
| - LOG(WARNING) << "Device path not found: " << path;
|
| - return NULL;
|
| -}
|
| -
|
| -const NetworkDevice* NetworkLibraryImplBase::FindCellularDevice() const {
|
| - return FindDeviceByType(TYPE_CELLULAR);
|
| -}
|
| -
|
| -const NetworkDevice* NetworkLibraryImplBase::FindMobileDevice() const {
|
| - const NetworkDevice* device = FindDeviceByType(TYPE_CELLULAR);
|
| - if (device)
|
| - return device;
|
| -
|
| - return FindDeviceByType(TYPE_WIMAX);
|
| -}
|
| -
|
| -Network* NetworkLibraryImplBase::FindNetworkByPath(
|
| - const std::string& path) const {
|
| - NetworkMap::const_iterator iter = network_map_.find(path);
|
| - if (iter != network_map_.end())
|
| - return iter->second;
|
| - return NULL;
|
| -}
|
| -
|
| -Network* NetworkLibraryImplBase::FindNetworkByUniqueId(
|
| - const std::string& unique_id) const {
|
| - NetworkMap::const_iterator found = network_unique_id_map_.find(unique_id);
|
| - if (found != network_unique_id_map_.end())
|
| - return found->second;
|
| - return NULL;
|
| -}
|
| -
|
| -WirelessNetwork* NetworkLibraryImplBase::FindWirelessNetworkByPath(
|
| - const std::string& path) const {
|
| - Network* network = FindNetworkByPath(path);
|
| - if (network &&
|
| - (network->type() == TYPE_WIFI || network->type() == TYPE_WIMAX ||
|
| - network->type() == TYPE_CELLULAR))
|
| - return static_cast<WirelessNetwork*>(network);
|
| - return NULL;
|
| -}
|
| -
|
| -WifiNetwork* NetworkLibraryImplBase::FindWifiNetworkByPath(
|
| - const std::string& path) const {
|
| - Network* network = FindNetworkByPath(path);
|
| - if (network && network->type() == TYPE_WIFI)
|
| - return static_cast<WifiNetwork*>(network);
|
| - return NULL;
|
| -}
|
| -
|
| -WimaxNetwork* NetworkLibraryImplBase::FindWimaxNetworkByPath(
|
| - const std::string& path) const {
|
| - Network* network = FindNetworkByPath(path);
|
| - if (network && (network->type() == TYPE_WIMAX))
|
| - return static_cast<WimaxNetwork*>(network);
|
| - return NULL;
|
| -}
|
| -
|
| -CellularNetwork* NetworkLibraryImplBase::FindCellularNetworkByPath(
|
| - const std::string& path) const {
|
| - Network* network = FindNetworkByPath(path);
|
| - if (network && network->type() == TYPE_CELLULAR)
|
| - return static_cast<CellularNetwork*>(network);
|
| - return NULL;
|
| -}
|
| -
|
| -VirtualNetwork* NetworkLibraryImplBase::FindVirtualNetworkByPath(
|
| - const std::string& path) const {
|
| - Network* network = FindNetworkByPath(path);
|
| - if (network && network->type() == TYPE_VPN)
|
| - return static_cast<VirtualNetwork*>(network);
|
| - return NULL;
|
| -}
|
| -
|
| -Network* NetworkLibraryImplBase::FindRememberedFromNetwork(
|
| - const Network* network) const {
|
| - for (NetworkMap::const_iterator iter = remembered_network_map_.begin();
|
| - iter != remembered_network_map_.end(); ++iter) {
|
| - if (iter->second->unique_id() == network->unique_id())
|
| - return iter->second;
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -Network* NetworkLibraryImplBase::FindRememberedNetworkByPath(
|
| - const std::string& path) const {
|
| - NetworkMap::const_iterator iter = remembered_network_map_.find(path);
|
| - if (iter != remembered_network_map_.end())
|
| - return iter->second;
|
| - return NULL;
|
| -}
|
| -
|
| -const base::DictionaryValue* NetworkLibraryImplBase::FindOncForNetwork(
|
| - const std::string& unique_id) const {
|
| - NetworkOncMap::const_iterator iter = network_onc_map_.find(unique_id);
|
| - return iter != network_onc_map_.end() ? iter->second : NULL;
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::SignalCellularPlanPayment() {
|
| - DCHECK(!HasRecentCellularPlanPayment());
|
| - cellular_plan_payment_time_ = base::Time::Now();
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::HasRecentCellularPlanPayment() {
|
| - return (base::Time::Now() -
|
| - cellular_plan_payment_time_).InHours() < kRecentPlanPaymentHours;
|
| -}
|
| -
|
| -const std::string& NetworkLibraryImplBase::GetCellularHomeCarrierId() const {
|
| - const NetworkDevice* cellular = FindCellularDevice();
|
| - if (cellular)
|
| - return cellular->home_provider_id();
|
| - return EmptyString();
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::CellularDeviceUsesDirectActivation() const {
|
| - const NetworkDevice* cellular = FindCellularDevice();
|
| - return cellular && (cellular->carrier() == shill::kCarrierSprint);
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////
|
| -// Profiles.
|
| -
|
| -bool NetworkLibraryImplBase::HasProfileType(NetworkProfileType type) const {
|
| - for (NetworkProfileList::const_iterator iter = profile_list_.begin();
|
| - iter != profile_list_.end(); ++iter) {
|
| - if ((*iter).type == type)
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -NetworkLibraryImplBase::NetworkProfile::NetworkProfile(const std::string& p,
|
| - NetworkProfileType t)
|
| - : path(p),
|
| - type(t) {
|
| -}
|
| -
|
| -NetworkLibraryImplBase::NetworkProfile::~NetworkProfile() {}
|
| -
|
| -NetworkLibraryImplBase::ConnectData::ConnectData()
|
| - : security(SECURITY_NONE),
|
| - eap_method(EAP_METHOD_UNKNOWN),
|
| - eap_auth(EAP_PHASE_2_AUTH_AUTO),
|
| - eap_use_system_cas(false),
|
| - save_credentials(false),
|
| - profile_type(PROFILE_NONE) {
|
| -}
|
| -
|
| -NetworkLibraryImplBase::ConnectData::~ConnectData() {}
|
| -
|
| -const NetworkDevice* NetworkLibraryImplBase::FindDeviceByType(
|
| - ConnectionType type) const {
|
| - for (NetworkDeviceMap::const_iterator iter = device_map_.begin();
|
| - iter != device_map_.end(); ++iter) {
|
| - if (iter->second && iter->second->type() == type)
|
| - return iter->second;
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////
|
| -// Connect to an existing network.
|
| -
|
| -bool NetworkLibraryImplBase::CanConnectToNetwork(const Network* network) const {
|
| - if (!HasProfileType(PROFILE_USER) && network->RequiresUserProfile())
|
| - return false;
|
| - return true;
|
| -}
|
| -
|
| -// 1. Request a connection to an existing wifi network.
|
| -// Use |shared| to pass along the desired profile type.
|
| -void NetworkLibraryImplBase::ConnectToWifiNetwork(
|
| - WifiNetwork* wifi, bool shared) {
|
| - NetworkConnectStartWifi(wifi, shared ? PROFILE_SHARED : PROFILE_USER);
|
| -}
|
| -
|
| -// 1. Request a connection to an existing wifi network.
|
| -void NetworkLibraryImplBase::ConnectToWifiNetwork(WifiNetwork* wifi) {
|
| - NetworkConnectStartWifi(wifi, PROFILE_NONE);
|
| -}
|
| -
|
| -// 1. Request a connection to an existing wimax network.
|
| -// Use |shared| to pass along the desired profile type.
|
| -void NetworkLibraryImplBase::ConnectToWimaxNetwork(
|
| - WimaxNetwork* wimax, bool shared) {
|
| - NetworkConnectStart(wimax, shared ? PROFILE_SHARED : PROFILE_USER);
|
| -}
|
| -
|
| -// 1. Request a connection to an existing wimax network.
|
| -void NetworkLibraryImplBase::ConnectToWimaxNetwork(WimaxNetwork* wimax) {
|
| - NetworkConnectStart(wimax, PROFILE_NONE);
|
| -}
|
| -
|
| -// 1. Connect to a cellular network.
|
| -void NetworkLibraryImplBase::ConnectToCellularNetwork(
|
| - CellularNetwork* cellular) {
|
| - NetworkConnectStart(cellular, PROFILE_NONE);
|
| -}
|
| -
|
| -// 1. Connect to an existing virtual network.
|
| -void NetworkLibraryImplBase::ConnectToVirtualNetwork(VirtualNetwork* vpn) {
|
| - NetworkConnectStartVPN(vpn);
|
| -}
|
| -
|
| -// 2. Start the connection.
|
| -void NetworkLibraryImplBase::NetworkConnectStartWifi(
|
| - WifiNetwork* wifi, NetworkProfileType profile_type) {
|
| - DCHECK(!wifi->connection_started());
|
| - // This will happen if a network resets, gets out of range or is forgotten.
|
| - if (wifi->user_passphrase_ != wifi->passphrase_ ||
|
| - wifi->passphrase_required())
|
| - wifi->SetPassphrase(wifi->user_passphrase_);
|
| - // For enterprise 802.1X networks, always provide TPM PIN when available.
|
| - // shill uses the PIN if it needs to access certificates in the TPM and
|
| - // ignores it otherwise.
|
| - if (wifi->encryption() == SECURITY_8021X) {
|
| - // If the TPM initialization has not completed, GetTpmPin() will return
|
| - // an empty value, in which case we do not want to clear the PIN since
|
| - // that will cause shill to flag the network as unconfigured.
|
| - // TODO(stevenjb): We may want to delay attempting to connect, or fail
|
| - // immediately, rather than let the network layer attempt a connection.
|
| - std::string tpm_pin = GetTpmPin();
|
| - if (!tpm_pin.empty())
|
| - wifi->SetCertificatePin(tpm_pin);
|
| - }
|
| - NetworkConnectStart(wifi, profile_type);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::NetworkConnectStartVPN(VirtualNetwork* vpn) {
|
| - // shill needs the TPM PIN for some VPN networks to access client
|
| - // certificates, and ignores the PIN if it doesn't need them. Only set this
|
| - // if the TPM is ready (see comment in NetworkConnectStartWifi).
|
| - std::string tpm_pin = GetTpmPin();
|
| - if (!tpm_pin.empty()) {
|
| - std::string tpm_slot = GetTpmSlot();
|
| - vpn->SetCertificateSlotAndPin(tpm_slot, tpm_pin);
|
| - }
|
| - NetworkConnectStart(vpn, PROFILE_NONE);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::NetworkConnectStart(
|
| - Network* network, NetworkProfileType profile_type) {
|
| - DCHECK(network);
|
| - DCHECK(!network->connection_started());
|
| - // In order to be certain to trigger any notifications, set the connecting
|
| - // state locally and notify observers. Otherwise there might be a state
|
| - // change without a forced notify.
|
| - network->set_connecting();
|
| - // Distinguish between user-initiated connection attempts
|
| - // and auto-connect.
|
| - network->set_user_connect_state(USER_CONNECT_STARTED);
|
| - NotifyNetworkManagerChanged(true); // Forced update.
|
| - VLOG(1) << "Requesting connect to network: " << network->name()
|
| - << " profile type: " << profile_type;
|
| - // Specify the correct profile for wifi networks (if specified or unset).
|
| - if ((network->type() == TYPE_WIFI || network->type() == TYPE_WIMAX) &&
|
| - (profile_type != PROFILE_NONE ||
|
| - network->profile_type() == PROFILE_NONE)) {
|
| - if (network->RequiresUserProfile())
|
| - profile_type = PROFILE_USER; // Networks with certs can not be shared.
|
| - else if (profile_type == PROFILE_NONE)
|
| - profile_type = PROFILE_SHARED; // Other networks are shared by default.
|
| - std::string profile_path = GetProfilePath(profile_type);
|
| - if (!profile_path.empty()) {
|
| - if (profile_path != network->profile_path())
|
| - SetProfileType(network, profile_type);
|
| - } else if (profile_type == PROFILE_USER) {
|
| - // The user profile was specified but is not available (i.e. pre-login).
|
| - // Add this network to the list of networks to move to the user profile
|
| - // when it becomes available.
|
| - VLOG(1) << "Queuing: " << network->name() << " to user_networks list.";
|
| - user_networks_.push_back(network->service_path());
|
| - }
|
| - }
|
| - CallConnectToNetwork(network);
|
| -}
|
| -
|
| -// 3. Start the connection attempt for Network.
|
| -// Must Call NetworkConnectCompleted when the connection attempt completes.
|
| -// virtual void CallConnectToNetwork(Network* network) = 0;
|
| -
|
| -// 4. Complete the connection.
|
| -void NetworkLibraryImplBase::NetworkConnectCompleted(
|
| - Network* network, NetworkConnectStatus status) {
|
| - DCHECK(network);
|
| - if (status != CONNECT_SUCCESS) {
|
| - // This will trigger the connection failed notification.
|
| - // TODO(stevenjb): Remove if chromium-os:13203 gets fixed.
|
| - network->SetState(STATE_FAILURE);
|
| - if (status == CONNECT_BAD_PASSPHRASE) {
|
| - network->SetError(ERROR_BAD_PASSPHRASE);
|
| - } else {
|
| - network->SetError(ERROR_CONNECT_FAILED);
|
| - }
|
| - NotifyNetworkManagerChanged(true); // Forced update.
|
| - NotifyNetworkChanged(network);
|
| - VLOG(1) << "Error connecting to network: " << network->name()
|
| - << " Status: " << status;
|
| - return;
|
| - }
|
| -
|
| - VLOG(1) << "Connected to network: " << network->name()
|
| - << " State: " << network->state()
|
| - << " Status: " << status;
|
| -
|
| - // If the user asked not to save credentials, shill will have
|
| - // forgotten them. Wipe our cache as well.
|
| - if (!network->save_credentials())
|
| - network->EraseCredentials();
|
| -
|
| - ClearActiveNetwork(network->type());
|
| - UpdateActiveNetwork(network);
|
| -
|
| - // Notify observers.
|
| - NotifyNetworkManagerChanged(true); // Forced update.
|
| - NotifyNetworkChanged(network);
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////
|
| -// Request a network and connect to it.
|
| -
|
| -// 1. Connect to an unconfigured or unlisted wifi network.
|
| -// This needs to request information about the named service.
|
| -// The connection attempt will occur in the callback.
|
| -void NetworkLibraryImplBase::ConnectToUnconfiguredWifiNetwork(
|
| - const std::string& ssid,
|
| - ConnectionSecurity security,
|
| - const std::string& passphrase,
|
| - const EAPConfigData* eap_config,
|
| - bool save_credentials,
|
| - bool shared) {
|
| - // Store the connection data to be used by the callback.
|
| - connect_data_.security = security;
|
| - connect_data_.service_name = ssid;
|
| - connect_data_.passphrase = passphrase;
|
| - connect_data_.save_credentials = save_credentials;
|
| - connect_data_.profile_type = shared ? PROFILE_SHARED : PROFILE_USER;
|
| - if (security == SECURITY_8021X) {
|
| - DCHECK(eap_config);
|
| - connect_data_.service_name = ssid;
|
| - connect_data_.eap_method = eap_config->method;
|
| - connect_data_.eap_auth = eap_config->auth;
|
| - connect_data_.server_ca_cert_pem = eap_config->server_ca_cert_pem;
|
| - connect_data_.eap_use_system_cas = eap_config->use_system_cas;
|
| - connect_data_.client_cert_pkcs11_id =
|
| - eap_config->client_cert_pkcs11_id;
|
| - connect_data_.eap_identity = eap_config->identity;
|
| - connect_data_.eap_anonymous_identity = eap_config->anonymous_identity;
|
| - }
|
| -
|
| - CallRequestWifiNetworkAndConnect(ssid, security);
|
| -}
|
| -
|
| -// 1. Connect to a virtual network with a PSK.
|
| -void NetworkLibraryImplBase::ConnectToUnconfiguredVirtualNetwork(
|
| - const std::string& service_name,
|
| - const std::string& server_hostname,
|
| - ProviderType provider_type,
|
| - const VPNConfigData& config) {
|
| - // Store the connection data to be used by the callback.
|
| - connect_data_.service_name = service_name;
|
| - connect_data_.server_hostname = server_hostname;
|
| - connect_data_.psk_key = config.psk;
|
| - connect_data_.server_ca_cert_pem = config.server_ca_cert_pem;
|
| - connect_data_.client_cert_pkcs11_id = config.client_cert_pkcs11_id;
|
| - connect_data_.username = config.username;
|
| - connect_data_.passphrase = config.user_passphrase;
|
| - connect_data_.otp = config.otp;
|
| - connect_data_.group_name = config.group_name;
|
| - connect_data_.save_credentials = config.save_credentials;
|
| - CallRequestVirtualNetworkAndConnect(
|
| - service_name, server_hostname, provider_type);
|
| -}
|
| -
|
| -// 2. Requests a WiFi Network by SSID and security.
|
| -// Calls ConnectToWifiNetworkUsingConnectData if network request succeeds.
|
| -// virtual void CallRequestWifiNetworkAndConnect(
|
| -// const std::string& ssid, ConnectionSecurity security) = 0;
|
| -
|
| -// 2. Requests a Virtual Network by service name, etc.
|
| -// Calls ConnectToVirtualNetworkUsingConnectData if network request succeeds.
|
| -// virtual void CallRequestVirtualNetworkAndConnect(
|
| -// const std::string& service_name,
|
| -// const std::string& server_hostname,
|
| -// ProviderType provider_type) = 0;
|
| -
|
| -// 3. Sets network properties stored in ConnectData and calls
|
| -// NetworkConnectStart.
|
| -void NetworkLibraryImplBase::ConnectToWifiNetworkUsingConnectData(
|
| - WifiNetwork* wifi) {
|
| - ConnectData& data = connect_data_;
|
| - if (wifi->name() != data.service_name) {
|
| - LOG(WARNING) << "WiFi network name does not match ConnectData: "
|
| - << wifi->name() << " != " << data.service_name;
|
| - return;
|
| - }
|
| - wifi->set_added(true);
|
| - if (data.security == SECURITY_8021X) {
|
| - // Enterprise 802.1X EAP network.
|
| - wifi->SetEAPMethod(data.eap_method);
|
| - wifi->SetEAPPhase2Auth(data.eap_auth);
|
| - wifi->SetEAPServerCaCertPEM(data.server_ca_cert_pem);
|
| - wifi->SetEAPUseSystemCAs(data.eap_use_system_cas);
|
| - wifi->SetEAPClientCertPkcs11Id(data.client_cert_pkcs11_id);
|
| - wifi->SetEAPIdentity(data.eap_identity);
|
| - wifi->SetEAPAnonymousIdentity(data.eap_anonymous_identity);
|
| - wifi->SetEAPPassphrase(data.passphrase);
|
| - wifi->SetSaveCredentials(data.save_credentials);
|
| - } else {
|
| - // Ordinary, non-802.1X network.
|
| - wifi->SetPassphrase(data.passphrase);
|
| - }
|
| -
|
| - NetworkConnectStartWifi(wifi, data.profile_type);
|
| -}
|
| -
|
| -// 3. Sets network properties stored in ConnectData and calls
|
| -// ConnectToVirtualNetwork.
|
| -void NetworkLibraryImplBase::ConnectToVirtualNetworkUsingConnectData(
|
| - VirtualNetwork* vpn) {
|
| - ConnectData& data = connect_data_;
|
| - if (vpn->name() != data.service_name) {
|
| - LOG(WARNING) << "Virtual network name does not match ConnectData: "
|
| - << vpn->name() << " != " << data.service_name;
|
| - return;
|
| - }
|
| -
|
| - // When a L2TP/IPsec certificate-based VPN is created, the VirtualNetwork
|
| - // instance is created by NativeNetworkParser::CreateNetworkFromInfo().
|
| - // At that point, the provider type is deduced based on the value of
|
| - // client_cert_id_ of the VirtualNetwork instance, which hasn't been
|
| - // updated to the value of connect_data_.client_cert_pkcs11_id. Thus,
|
| - // the provider type is always incorrectly set to L2TP_IPSEC_PSK when
|
| - // L2TP_IPSEC_USER_CERT is expected. Here we fix the provider type based
|
| - // on connect_data_.client_cert_pkcs11_id.
|
| - //
|
| - // TODO(benchan): This is a quick and dirty workaround, we should refactor
|
| - // the code to make the flow more straightforward. See crosbug.com/24636
|
| - if (vpn->provider_type() == PROVIDER_TYPE_L2TP_IPSEC_PSK &&
|
| - !connect_data_.client_cert_pkcs11_id.empty()) {
|
| - vpn->set_provider_type(PROVIDER_TYPE_L2TP_IPSEC_USER_CERT);
|
| - }
|
| -
|
| - vpn->set_added(true);
|
| - if (!data.server_hostname.empty())
|
| - vpn->set_server_hostname(data.server_hostname);
|
| -
|
| - vpn->SetCACertPEM(data.server_ca_cert_pem);
|
| - switch (vpn->provider_type()) {
|
| - case PROVIDER_TYPE_L2TP_IPSEC_PSK:
|
| - vpn->SetL2TPIPsecPSKCredentials(
|
| - data.psk_key, data.username, data.passphrase, data.group_name);
|
| - break;
|
| - case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT: {
|
| - vpn->SetL2TPIPsecCertCredentials(
|
| - data.client_cert_pkcs11_id,
|
| - data.username, data.passphrase, data.group_name);
|
| - break;
|
| - }
|
| - case PROVIDER_TYPE_OPEN_VPN: {
|
| - vpn->SetOpenVPNCredentials(
|
| - data.client_cert_pkcs11_id,
|
| - data.username, data.passphrase, data.otp);
|
| - break;
|
| - }
|
| - case PROVIDER_TYPE_MAX:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - vpn->SetSaveCredentials(data.save_credentials);
|
| -
|
| - NetworkConnectStartVPN(vpn);
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////
|
| -
|
| -void NetworkLibraryImplBase::ForgetNetwork(const std::string& service_path) {
|
| - // Remove network from remembered list and notify observers.
|
| - DeleteRememberedNetwork(service_path);
|
| - NotifyNetworkManagerChanged(true); // Forced update.
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////
|
| -
|
| -void NetworkLibraryImplBase::EnableEthernetNetworkDevice(bool enable) {
|
| - if (is_locked_)
|
| - return;
|
| - CallEnableNetworkDeviceType(TYPE_ETHERNET, enable);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::EnableWifiNetworkDevice(bool enable) {
|
| - if (is_locked_)
|
| - return;
|
| - CallEnableNetworkDeviceType(TYPE_WIFI, enable);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::EnableWimaxNetworkDevice(bool enable) {
|
| - if (is_locked_)
|
| - return;
|
| - CallEnableNetworkDeviceType(TYPE_WIMAX, enable);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::EnableCellularNetworkDevice(bool enable) {
|
| - if (is_locked_)
|
| - return;
|
| - CallEnableNetworkDeviceType(TYPE_CELLULAR, enable);
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::SwitchToPreferredNetwork() {
|
| - // If current network (if any) is not preferred, check network service list to
|
| - // see if the first not connected network is preferred and set to autoconnect.
|
| - // If so, connect to it.
|
| - if (!wifi_enabled() || (active_wifi_ && active_wifi_->preferred()))
|
| - return;
|
| - for (WifiNetworkVector::const_iterator it = wifi_networks_.begin();
|
| - it != wifi_networks_.end(); ++it) {
|
| - WifiNetwork* wifi = *it;
|
| - if (wifi->connected() || wifi->connecting()) // Skip connected/connecting.
|
| - continue;
|
| - if (!wifi->preferred()) // All preferred networks are sorted in front.
|
| - break;
|
| - if (wifi->auto_connect()) {
|
| - ConnectToWifiNetwork(wifi);
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -namespace {
|
| -
|
| -class UserStringSubstitution : public onc::StringSubstitution {
|
| - public:
|
| - UserStringSubstitution() {}
|
| - virtual bool GetSubstitute(const std::string& placeholder,
|
| - std::string* substitute) const OVERRIDE {
|
| - if (!UserManager::Get()->IsUserLoggedIn())
|
| - return false;
|
| - const User* logged_in_user = UserManager::Get()->GetLoggedInUser();
|
| - if (placeholder == onc::substitutes::kLoginIDField)
|
| - *substitute = logged_in_user->GetAccountName(false);
|
| - else if (placeholder == onc::substitutes::kEmailField)
|
| - *substitute = logged_in_user->email();
|
| - else
|
| - return false;
|
| - return true;
|
| - }
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -void NetworkLibraryImplBase::LoadOncNetworks(
|
| - const base::ListValue& network_configs,
|
| - onc::ONCSource source) {
|
| - VLOG(2) << __func__ << ": called on " << network_configs;
|
| - NetworkProfile* profile = NULL;
|
| - bool from_policy = (source == onc::ONC_SOURCE_USER_POLICY ||
|
| - source == onc::ONC_SOURCE_DEVICE_POLICY);
|
| -
|
| - // Policies are applied to a specific Shill profile. User ONC import however
|
| - // is applied to whatever profile Shill chooses. This should be the profile
|
| - // that is already associated with a network and if no profile is associated
|
| - // yet, it should be the user profile.
|
| - if (from_policy) {
|
| - profile = GetProfileForType(GetProfileTypeForSource(source));
|
| - if (profile == NULL) {
|
| - VLOG(2) << "Profile for ONC source " << onc::GetSourceAsString(source)
|
| - << " doesn't exist.";
|
| - return;
|
| - }
|
| - }
|
| -
|
| - std::set<std::string> removal_ids;
|
| - std::set<std::string>& network_ids(network_source_map_[source]);
|
| - network_ids.clear();
|
| - VLOG(2) << "ONC file has " << network_configs.GetSize() << " networks";
|
| - for (base::ListValue::const_iterator it(network_configs.begin());
|
| - it != network_configs.end(); ++it) {
|
| - const base::DictionaryValue* network;
|
| - (*it)->GetAsDictionary(&network);
|
| -
|
| - bool marked_for_removal = false;
|
| - network->GetBooleanWithoutPathExpansion(onc::kRemove,
|
| - &marked_for_removal);
|
| -
|
| - std::string type;
|
| - network->GetStringWithoutPathExpansion(onc::network_config::kType, &type);
|
| -
|
| - std::string guid;
|
| - network->GetStringWithoutPathExpansion(onc::network_config::kGUID, &guid);
|
| -
|
| - if (source == onc::ONC_SOURCE_USER_IMPORT && marked_for_removal) {
|
| - // User import supports the removal of networks by ID.
|
| - removal_ids.insert(guid);
|
| - continue;
|
| - }
|
| -
|
| - // Don't configure a network that is supposed to be removed. For
|
| - // policy-managed networks, the "remove" functionality of ONC is
|
| - // irrelevant. Instead, in general, all previously configured networks
|
| - // that are no longer configured are removed.
|
| - if (marked_for_removal)
|
| - continue;
|
| -
|
| - // Store the network's identifier. The identifiers are later used to clean
|
| - // out any previously-existing networks that had been configured through
|
| - // policy but are no longer specified in the updated ONC blob.
|
| - network_ids.insert(guid);
|
| -
|
| - // Expand strings like LoginID
|
| - base::DictionaryValue* expanded_network = network->DeepCopy();
|
| - UserStringSubstitution substitution;
|
| - onc::ExpandStringsInOncObject(onc::kNetworkConfigurationSignature,
|
| - substitution,
|
| - expanded_network);
|
| -
|
| - // Update the ONC map.
|
| - const base::DictionaryValue*& entry = network_onc_map_[guid];
|
| - if (entry && entry->Equals(expanded_network))
|
| - continue;
|
| -
|
| - delete entry;
|
| - entry = expanded_network;
|
| -
|
| - // Normalize the ONC: Remove irrelevant fields.
|
| - onc::Normalizer normalizer(true /* remove recommended fields */);
|
| - scoped_ptr<base::DictionaryValue> normalized_network =
|
| - normalizer.NormalizeObject(&onc::kNetworkConfigurationSignature,
|
| - *expanded_network);
|
| -
|
| - // Configure the network.
|
| - scoped_ptr<base::DictionaryValue> shill_dict =
|
| - onc::TranslateONCObjectToShill(&onc::kNetworkConfigurationSignature,
|
| - *normalized_network);
|
| -
|
| - // Set the UIData.
|
| - scoped_ptr<NetworkUIData> ui_data =
|
| - NetworkUIData::CreateFromONC(source, *normalized_network);
|
| - base::DictionaryValue ui_data_dict;
|
| - ui_data->FillDictionary(&ui_data_dict);
|
| - std::string ui_data_json;
|
| - base::JSONWriter::Write(&ui_data_dict, &ui_data_json);
|
| - shill_dict->SetStringWithoutPathExpansion(flimflam::kUIDataProperty,
|
| - ui_data_json);
|
| -
|
| - // Set the appropriate profile for |source|.
|
| - if (profile != NULL) {
|
| - shill_dict->SetStringWithoutPathExpansion(flimflam::kProfileProperty,
|
| - profile->path);
|
| - }
|
| -
|
| - // For Ethernet networks, apply them to the current Ethernet service.
|
| - if (type == onc::network_type::kEthernet) {
|
| - const EthernetNetwork* ethernet = ethernet_network();
|
| - if (ethernet) {
|
| - CallConfigureService(ethernet->unique_id(), shill_dict.get());
|
| - } else {
|
| - LOG(WARNING) << "Tried to import ONC with an Ethernet network when "
|
| - << "there is no active Ethernet connection.";
|
| - }
|
| - } else {
|
| - CallConfigureService(guid, shill_dict.get());
|
| - }
|
| - }
|
| -
|
| - if (from_policy) {
|
| - // For policy-managed networks, go through the list of existing remembered
|
| - // networks and clean out the ones that no longer have a definition in the
|
| - // ONC blob. We first collect the networks and do the actual deletion later
|
| - // because ForgetNetwork() changes the remembered network vectors.
|
| - ForgetNetworksById(source, network_ids, false);
|
| - } else if (source == onc::ONC_SOURCE_USER_IMPORT && !removal_ids.empty()) {
|
| - ForgetNetworksById(source, removal_ids, true);
|
| - }
|
| - // Ensure NetworkStateHandler properties are up-to-date.
|
| - if (NetworkHandler::IsInitialized()) {
|
| - NetworkHandler::Get()->network_state_handler()->
|
| - RequestUpdateForAllNetworks();
|
| - }
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////
|
| -// Testing functions.
|
| -
|
| -bool NetworkLibraryImplBase::SetActiveNetwork(
|
| - ConnectionType type, const std::string& service_path) {
|
| - Network* network = NULL;
|
| - if (!service_path.empty())
|
| - network = FindNetworkByPath(service_path);
|
| - if (network && network->type() != type) {
|
| - LOG(WARNING) << "SetActiveNetwork type mismatch for: " << network->name();
|
| - return false;
|
| - }
|
| -
|
| - ClearActiveNetwork(type);
|
| -
|
| - if (!network)
|
| - return true;
|
| -
|
| - // Set |network| to active.
|
| - UpdateActiveNetwork(network);
|
| - return true;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////
|
| -// Network list management functions.
|
| -
|
| -// Note: sometimes shill still returns networks when the device type is
|
| -// disabled. Always check the appropriate enabled() state before adding
|
| -// networks to a list or setting an active network so that we do not show them
|
| -// in the UI.
|
| -
|
| -// This relies on services being requested from shill in priority order,
|
| -// and the updates getting processed and received in order.
|
| -void NetworkLibraryImplBase::UpdateActiveNetwork(Network* network) {
|
| - network->set_is_active(true);
|
| - ConnectionType type(network->type());
|
| - if (type == TYPE_ETHERNET) {
|
| - if (ethernet_enabled()) {
|
| - // Set ethernet_ to the first connected ethernet service, or the first
|
| - // disconnected ethernet service if none are connected.
|
| - if (ethernet_ == NULL || !ethernet_->connected()) {
|
| - ethernet_ = static_cast<EthernetNetwork*>(network);
|
| - VLOG(2) << "Active ethernet -> " << ethernet_->name();
|
| - }
|
| - }
|
| - } else if (type == TYPE_WIFI) {
|
| - if (wifi_enabled()) {
|
| - // Set active_wifi_ to the first connected or connecting wifi service.
|
| - if (active_wifi_ == NULL && network->connecting_or_connected()) {
|
| - active_wifi_ = static_cast<WifiNetwork*>(network);
|
| - VLOG(2) << "Active wifi -> " << active_wifi_->name();
|
| - }
|
| - }
|
| - } else if (type == TYPE_CELLULAR) {
|
| - if (cellular_enabled()) {
|
| - // Set active_cellular_ to first connected/connecting celluar service.
|
| - if (active_cellular_ == NULL && network->connecting_or_connected()) {
|
| - active_cellular_ = static_cast<CellularNetwork*>(network);
|
| - VLOG(2) << "Active cellular -> " << active_cellular_->name();
|
| - }
|
| - }
|
| - } else if (type == TYPE_WIMAX) {
|
| - if (wimax_enabled()) {
|
| - // Set active_wimax_ to first connected/connecting wimax service.
|
| - if (active_wimax_ == NULL && network->connecting_or_connected()) {
|
| - active_wimax_ = static_cast<WimaxNetwork*>(network);
|
| - VLOG(2) << "Active wimax -> " << active_wimax_->name();
|
| - }
|
| - }
|
| - } else if (type == TYPE_VPN) {
|
| - // Set active_virtual_ to the first connected or connecting vpn service. {
|
| - if (active_virtual_ == NULL && network->connecting_or_connected()) {
|
| - active_virtual_ = static_cast<VirtualNetwork*>(network);
|
| - VLOG(2) << "Active virtual -> " << active_virtual_->name();
|
| - }
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::ClearActiveNetwork(ConnectionType type) {
|
| - // Clear any existing active network matching |type|.
|
| - for (NetworkMap::iterator iter = network_map_.begin();
|
| - iter != network_map_.end(); ++iter) {
|
| - Network* other = iter->second;
|
| - if (other->type() == type)
|
| - other->set_is_active(false);
|
| - }
|
| - switch (type) {
|
| - case TYPE_ETHERNET:
|
| - ethernet_ = NULL;
|
| - break;
|
| - case TYPE_WIFI:
|
| - active_wifi_ = NULL;
|
| - break;
|
| - case TYPE_CELLULAR:
|
| - active_cellular_ = NULL;
|
| - break;
|
| - case TYPE_WIMAX:
|
| - active_wimax_ = NULL;
|
| - break;
|
| - case TYPE_VPN:
|
| - active_virtual_ = NULL;
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::AddNetwork(Network* network) {
|
| - std::pair<NetworkMap::iterator, bool> result =
|
| - network_map_.insert(std::make_pair(network->service_path(), network));
|
| - DCHECK(result.second); // Should only get called with new network.
|
| - VLOG(2) << "Adding Network: " << network->service_path()
|
| - << " (" << network->name() << ")";
|
| - ConnectionType type(network->type());
|
| - if (type == TYPE_WIFI) {
|
| - if (wifi_enabled())
|
| - wifi_networks_.push_back(static_cast<WifiNetwork*>(network));
|
| - } else if (type == TYPE_CELLULAR) {
|
| - if (cellular_enabled())
|
| - cellular_networks_.push_back(static_cast<CellularNetwork*>(network));
|
| - } else if (type == TYPE_WIMAX) {
|
| - if (wimax_enabled())
|
| - wimax_networks_.push_back(static_cast<WimaxNetwork*>(network));
|
| - } else if (type == TYPE_VPN) {
|
| - virtual_networks_.push_back(static_cast<VirtualNetwork*>(network));
|
| - }
|
| - // Do not set the active network here. Wait until we parse the network.
|
| -}
|
| -
|
| -// Deletes a network. It must already be removed from any lists.
|
| -void NetworkLibraryImplBase::DeleteNetwork(Network* network) {
|
| - CHECK(network_map_.find(network->service_path()) == network_map_.end());
|
| - delete network;
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::ForgetNetworksById(
|
| - onc::ONCSource source,
|
| - std::set<std::string> ids,
|
| - bool if_found) {
|
| - std::vector<std::string> to_be_forgotten;
|
| - for (WifiNetworkVector::iterator i = remembered_wifi_networks_.begin();
|
| - i != remembered_wifi_networks_.end(); ++i) {
|
| - WifiNetwork* wifi_network = *i;
|
| - if (wifi_network->ui_data().onc_source() == source &&
|
| - if_found == (ids.find(wifi_network->unique_id()) != ids.end()))
|
| - to_be_forgotten.push_back(wifi_network->service_path());
|
| - }
|
| -
|
| - for (VirtualNetworkVector::iterator i = remembered_virtual_networks_.begin();
|
| - i != remembered_virtual_networks_.end(); ++i) {
|
| - VirtualNetwork* virtual_network = *i;
|
| - if (virtual_network->ui_data().onc_source() == source &&
|
| - if_found == (ids.find(virtual_network->unique_id()) != ids.end()))
|
| - to_be_forgotten.push_back(virtual_network->service_path());
|
| - }
|
| -
|
| - for (std::vector<std::string>::const_iterator i = to_be_forgotten.begin();
|
| - i != to_be_forgotten.end(); ++i) {
|
| - ForgetNetwork(*i);
|
| - }
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::ValidateRememberedNetwork(Network* network) {
|
| - std::pair<NetworkMap::iterator, bool> result =
|
| - remembered_network_map_.insert(
|
| - std::make_pair(network->service_path(), network));
|
| - DCHECK(result.second); // Should only get called with new network.
|
| -
|
| - // See if this is a policy-configured network that has meanwhile been removed.
|
| - // This situation may arise when the full list of remembered networks is not
|
| - // available to LoadOncNetworks(), which can happen due to the asynchronous
|
| - // communication between shill and NetworkLibrary. Just tell shill to
|
| - // delete the network now.
|
| - const onc::ONCSource source = network->ui_data().onc_source();
|
| - if (source == onc::ONC_SOURCE_USER_POLICY ||
|
| - source == onc::ONC_SOURCE_DEVICE_POLICY) {
|
| - NetworkSourceMap::const_iterator network_id_set(
|
| - network_source_map_.find(source));
|
| - if (network_id_set != network_source_map_.end() &&
|
| - network_id_set->second.find(network->unique_id()) ==
|
| - network_id_set->second.end()) {
|
| - DeleteRememberedNetwork(network->service_path());
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool NetworkLibraryImplBase::ValidateAndAddRememberedNetwork(Network* network) {
|
| - if (!ValidateRememberedNetwork(network))
|
| - return false;
|
| -
|
| - if (network->type() == TYPE_WIFI) {
|
| - remembered_wifi_networks_.push_back(
|
| - static_cast<WifiNetwork*>(network));
|
| - } else if (network->type() == TYPE_VPN) {
|
| - remembered_virtual_networks_.push_back(
|
| - static_cast<VirtualNetwork*>(network));
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - VLOG(1) << "ValidateAndAddRememberedNetwork: " << network->service_path();
|
| - return true;
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::DeleteRememberedNetwork(
|
| - const std::string& service_path) {
|
| - NetworkMap::iterator found = remembered_network_map_.find(service_path);
|
| - if (found == remembered_network_map_.end()) {
|
| - LOG(WARNING) << "Attempt to delete non-existent remembered network: "
|
| - << service_path;
|
| - return;
|
| - }
|
| - Network* remembered_network = found->second;
|
| - VLOG(1) << "Deleting remembered network: "
|
| - << remembered_network->service_path();
|
| -
|
| - // Update any associated network service before removing from profile
|
| - // so that shill doesn't recreate the service (e.g. when we disconenct it).
|
| - Network* network = FindNetworkByUniqueId(remembered_network->unique_id());
|
| - if (network) {
|
| - // Clear the stored credentials for any forgotten networks.
|
| - network->EraseCredentials();
|
| - network->ClearUIData();
|
| - SetProfileType(network, PROFILE_NONE);
|
| - // Remove VPN from list of networks.
|
| - if (network->type() == TYPE_VPN)
|
| - CallRemoveNetwork(network);
|
| - } else {
|
| - // Network is not in service list.
|
| - VLOG(2) << "Remembered Network not in service list: "
|
| - << remembered_network->unique_id();
|
| - }
|
| -
|
| - // Delete remembered network from lists.
|
| - remembered_network_map_.erase(found);
|
| -
|
| - if (remembered_network->type() == TYPE_WIFI) {
|
| - WifiNetworkVector::iterator iter = std::find(
|
| - remembered_wifi_networks_.begin(),
|
| - remembered_wifi_networks_.end(),
|
| - remembered_network);
|
| - if (iter != remembered_wifi_networks_.end())
|
| - remembered_wifi_networks_.erase(iter);
|
| - } else if (remembered_network->type() == TYPE_VPN) {
|
| - VirtualNetworkVector::iterator iter = std::find(
|
| - remembered_virtual_networks_.begin(),
|
| - remembered_virtual_networks_.end(),
|
| - remembered_network);
|
| - if (iter != remembered_virtual_networks_.end())
|
| - remembered_virtual_networks_.erase(iter);
|
| - }
|
| -
|
| - // Delete remembered network from all profiles it is in.
|
| - for (NetworkProfileList::iterator iter = profile_list_.begin();
|
| - iter != profile_list_.end(); ++iter) {
|
| - NetworkProfile& profile = *iter;
|
| - NetworkProfile::ServiceList::iterator found =
|
| - profile.services.find(remembered_network->service_path());
|
| - if (found != profile.services.end()) {
|
| - VLOG(1) << "Deleting: " << remembered_network->service_path()
|
| - << " From: " << profile.path;
|
| - CallDeleteRememberedNetwork(profile.path,
|
| - remembered_network->service_path());
|
| - profile.services.erase(found);
|
| - }
|
| - }
|
| -
|
| - // Remove the ONC blob for the network, if present.
|
| - NetworkOncMap::iterator onc_map_entry =
|
| - network_onc_map_.find(remembered_network->unique_id());
|
| - if (onc_map_entry != network_onc_map_.end()) {
|
| - delete onc_map_entry->second;
|
| - network_onc_map_.erase(onc_map_entry);
|
| - }
|
| -
|
| - delete remembered_network;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////
|
| -
|
| -void NetworkLibraryImplBase::ClearNetworks() {
|
| - network_map_.clear();
|
| - network_unique_id_map_.clear();
|
| - ethernet_ = NULL;
|
| - active_wifi_ = NULL;
|
| - active_cellular_ = NULL;
|
| - active_wimax_ = NULL;
|
| - active_virtual_ = NULL;
|
| - wifi_networks_.clear();
|
| - cellular_networks_.clear();
|
| - wimax_networks_.clear();
|
| - virtual_networks_.clear();
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::DeleteRememberedNetworks() {
|
| - STLDeleteValues(&remembered_network_map_);
|
| - remembered_network_map_.clear();
|
| - remembered_wifi_networks_.clear();
|
| - remembered_virtual_networks_.clear();
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::DeleteDevice(const std::string& device_path) {
|
| - NetworkDeviceMap::iterator found = device_map_.find(device_path);
|
| - if (found == device_map_.end()) {
|
| - LOG(WARNING) << "Attempt to delete non-existent device: "
|
| - << device_path;
|
| - return;
|
| - }
|
| - VLOG(2) << " Deleting device: " << device_path;
|
| - NetworkDevice* device = found->second;
|
| - device_map_.erase(found);
|
| - delete device;
|
| - DeleteDeviceFromDeviceObserversMap(device_path);
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////
|
| -
|
| -void NetworkLibraryImplBase::AddProfile(const std::string& profile_path,
|
| - NetworkProfileType profile_type) {
|
| - VLOG(1) << "Adding profile " << profile_path;
|
| - profile_list_.push_back(NetworkProfile(profile_path, profile_type));
|
| - // Check to see if we connected to any networks before a user profile was
|
| - // available (i.e. before login), but unchecked the "Share" option (i.e.
|
| - // the desired pofile is the user profile). Move these networks to the
|
| - // user profile when it becomes available.
|
| - if (profile_type == PROFILE_USER && !user_networks_.empty()) {
|
| - for (std::list<std::string>::iterator iter2 = user_networks_.begin();
|
| - iter2 != user_networks_.end(); ++iter2) {
|
| - Network* network = FindNetworkByPath(*iter2);
|
| - if (network && network->profile_path() != profile_path)
|
| - network->SetProfilePath(profile_path);
|
| - }
|
| - user_networks_.clear();
|
| - }
|
| -}
|
| -
|
| -NetworkLibraryImplBase::NetworkProfile*
|
| -NetworkLibraryImplBase::GetProfileForType(NetworkProfileType type) {
|
| - for (NetworkProfileList::iterator iter = profile_list_.begin();
|
| - iter != profile_list_.end(); ++iter) {
|
| - NetworkProfile& profile = *iter;
|
| - if (profile.type == type)
|
| - return &profile;
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::SetProfileType(
|
| - Network* network, NetworkProfileType type) {
|
| - if (type == PROFILE_NONE) {
|
| - network->SetProfilePath(std::string());
|
| - network->set_profile_type(PROFILE_NONE);
|
| - } else {
|
| - std::string profile_path = GetProfilePath(type);
|
| - if (!profile_path.empty()) {
|
| - network->SetProfilePath(profile_path);
|
| - network->set_profile_type(type);
|
| - } else {
|
| - LOG(WARNING) << "Profile type not found: " << type;
|
| - network->set_profile_type(PROFILE_NONE);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::SetProfileTypeFromPath(Network* network) {
|
| - if (network->profile_path().empty()) {
|
| - network->set_profile_type(PROFILE_NONE);
|
| - return;
|
| - }
|
| - for (NetworkProfileList::iterator iter = profile_list_.begin();
|
| - iter != profile_list_.end(); ++iter) {
|
| - NetworkProfile& profile = *iter;
|
| - if (profile.path == network->profile_path()) {
|
| - network->set_profile_type(profile.type);
|
| - return;
|
| - }
|
| - }
|
| - LOG(WARNING) << "Profile path not found: " << network->profile_path();
|
| - network->set_profile_type(PROFILE_NONE);
|
| -}
|
| -
|
| -std::string NetworkLibraryImplBase::GetProfilePath(NetworkProfileType type) {
|
| - std::string profile_path;
|
| - NetworkProfile* profile = GetProfileForType(type);
|
| - if (profile)
|
| - profile_path = profile->path;
|
| - return profile_path;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////
|
| -// Notifications.
|
| -
|
| -void NetworkLibraryImplBase::NotifyNetworkProfileObservers() {
|
| - FOR_EACH_OBSERVER(NetworkProfileObserver,
|
| - network_profile_observers_,
|
| - OnProfileListChanged());
|
| -}
|
| -
|
| -// We call this any time something in NetworkLibrary changes.
|
| -// TODO(stevenjb): We should consider breaking this into multiple
|
| -// notifications, e.g. connection state, devices, services, etc.
|
| -void NetworkLibraryImplBase::NotifyNetworkManagerChanged(bool force_update) {
|
| - // Cancel any pending signals.
|
| - notify_manager_weak_factory_.InvalidateWeakPtrs();
|
| - if (force_update) {
|
| - // Signal observers now.
|
| - SignalNetworkManagerObservers();
|
| - } else {
|
| - // Schedule a delayed signal to limit the frequency of notifications.
|
| - BrowserThread::PostDelayedTask(
|
| - BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(&NetworkLibraryImplBase::SignalNetworkManagerObservers,
|
| - notify_manager_weak_factory_.GetWeakPtr()),
|
| - base::TimeDelta::FromMilliseconds(kNetworkNotifyDelayMs));
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::SignalNetworkManagerObservers() {
|
| - FOR_EACH_OBSERVER(NetworkManagerObserver,
|
| - network_manager_observers_,
|
| - OnNetworkManagerChanged(this));
|
| - // Clear notification flags.
|
| - for (NetworkMap::iterator iter = network_map_.begin();
|
| - iter != network_map_.end(); ++iter) {
|
| - iter->second->set_notify_failure(false);
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::NotifyNetworkChanged(const Network* network) {
|
| - DCHECK(network);
|
| - VLOG(2) << "Network changed: " << network->name();
|
| - NetworkObserverMap::const_iterator iter = network_observers_.find(
|
| - network->service_path());
|
| - if (iter != network_observers_.end()) {
|
| - FOR_EACH_OBSERVER(NetworkObserver,
|
| - *(iter->second),
|
| - OnNetworkChanged(this, network));
|
| - } else if (IsCros()) {
|
| - LOG(ERROR) << "Unexpected signal for unobserved network: "
|
| - << network->name();
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::NotifyNetworkDeviceChanged(
|
| - NetworkDevice* device, PropertyIndex index) {
|
| - DCHECK(device);
|
| - VLOG(2) << "Network device changed: " << device->name();
|
| - NetworkDeviceObserverMap::const_iterator iter =
|
| - network_device_observers_.find(device->device_path());
|
| - if (iter != network_device_observers_.end()) {
|
| - NetworkDeviceObserverList* device_observer_list = iter->second;
|
| - if (index == PROPERTY_INDEX_FOUND_NETWORKS) {
|
| - FOR_EACH_OBSERVER(NetworkDeviceObserver,
|
| - *device_observer_list,
|
| - OnNetworkDeviceFoundNetworks(this, device));
|
| - } else if (index == PROPERTY_INDEX_SIM_LOCK) {
|
| - FOR_EACH_OBSERVER(NetworkDeviceObserver,
|
| - *device_observer_list,
|
| - OnNetworkDeviceSimLockChanged(this, device));
|
| - }
|
| - } else {
|
| - LOG(ERROR) << "Unexpected signal for unobserved device: "
|
| - << device->name();
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplBase::NotifyPinOperationCompleted(
|
| - PinOperationError error) {
|
| - FOR_EACH_OBSERVER(PinOperationObserver,
|
| - pin_operation_observers_,
|
| - OnPinOperationCompleted(this, error));
|
| - sim_operation_ = SIM_OPERATION_NONE;
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -// Pin related functions.
|
| -
|
| -void NetworkLibraryImplBase::GetTpmInfo() {
|
| - // Avoid making multiple synchronous D-Bus calls to cryptohome by caching
|
| - // the TPM PIN, which does not change during a session.
|
| - if (tpm_pin_.empty()) {
|
| - if (crypto::IsTPMTokenReady()) {
|
| - std::string tpm_label;
|
| - crypto::GetTPMTokenInfo(&tpm_label, &tpm_pin_);
|
| - // VLOG(1) << "TPM Label: " << tpm_label << ", PIN: " << tpm_pin_;
|
| - // TODO(stevenjb): GetTPMTokenInfo returns a label, but the network
|
| - // code expects a slot ID. See chromium-os:17998.
|
| - // For now, use a hard coded, well known slot instead.
|
| - const char kHardcodedTpmSlot[] = "0";
|
| - tpm_slot_ = kHardcodedTpmSlot;
|
| - } else if (IsCros()) {
|
| - LOG(WARNING) << "TPM token not ready";
|
| - }
|
| - }
|
| -}
|
| -
|
| -const std::string& NetworkLibraryImplBase::GetTpmSlot() {
|
| - GetTpmInfo();
|
| - return tpm_slot_;
|
| -}
|
| -
|
| -const std::string& NetworkLibraryImplBase::GetTpmPin() {
|
| - GetTpmInfo();
|
| - return tpm_pin_;
|
| -}
|
| -
|
| -} // namespace chromeos
|
|
|