| Index: chrome/browser/chromeos/cros/network_library.cc
|
| diff --git a/chrome/browser/chromeos/cros/network_library.cc b/chrome/browser/chromeos/cros/network_library.cc
|
| deleted file mode 100644
|
| index 0a709fde01e5488413f2850d435459b0fc0d2953..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/cros/network_library.cc
|
| +++ /dev/null
|
| @@ -1,1395 +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.h"
|
| -
|
| -#include "base/chromeos/chromeos_version.h"
|
| -#include "base/i18n/icu_encoding_detection.h"
|
| -#include "base/i18n/icu_string_conversions.h"
|
| -#include "base/i18n/time_formatting.h"
|
| -#include "base/json/json_writer.h" // for debug output only.
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/utf_string_conversion_utils.h"
|
| -#include "chrome/browser/chromeos/cros/native_network_constants.h"
|
| -#include "chrome/browser/chromeos/cros/native_network_parser.h"
|
| -#include "chrome/browser/chromeos/cros/network_library_impl_cros.h"
|
| -#include "chrome/browser/chromeos/cros/network_library_impl_stub.h"
|
| -#include "chrome/browser/chromeos/enrollment_dialog_view.h"
|
| -#include "chrome/common/net/x509_certificate_model.h"
|
| -#include "chromeos/network/certificate_pattern.h"
|
| -#include "chromeos/network/client_cert_util.h"
|
| -#include "chromeos/network/cros_network_functions.h"
|
| -#include "chromeos/network/network_state_handler.h"
|
| -#include "chromeos/network/onc/onc_utils.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "grit/ash_strings.h"
|
| -#include "grit/generated_resources.h"
|
| -#include "net/base/url_util.h"
|
| -#include "third_party/cros_system_api/dbus/service_constants.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -
|
| -using content::BrowserThread;
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// Implementation notes.
|
| -// NetworkLibraryImpl manages a series of classes that describe network devices
|
| -// and services:
|
| -//
|
| -// NetworkDevice: e.g. ethernet, wifi modem, cellular modem
|
| -// device_map_: canonical map<path, NetworkDevice*> for devices
|
| -//
|
| -// Network: a network service ("network").
|
| -// network_map_: canonical map<path, Network*> for all visible networks.
|
| -// EthernetNetwork
|
| -// ethernet_: EthernetNetwork* to the active ethernet network in network_map_.
|
| -// WirelessNetwork: a WiFi or Cellular Network.
|
| -// WifiNetwork
|
| -// active_wifi_: WifiNetwork* to the active wifi network in network_map_.
|
| -// wifi_networks_: ordered vector of WifiNetwork* entries in network_map_,
|
| -// in descending order of importance.
|
| -// CellularNetwork
|
| -// active_cellular_: Cellular version of wifi_.
|
| -// cellular_networks_: Cellular version of wifi_.
|
| -// network_unique_id_map_: map<unique_id, Network*> for all visible networks.
|
| -// remembered_network_map_: a canonical map<path, Network*> for all networks
|
| -// remembered in the active Profile ("favorites").
|
| -// remembered_network_unique_id_map_: map<unique_id, Network*> for all
|
| -// remembered networks.
|
| -// remembered_wifi_networks_: ordered vector of WifiNetwork* entries in
|
| -// remembered_network_map_, in descending order of preference.
|
| -// remembered_virtual_networks_: ordered vector of VirtualNetwork* entries in
|
| -// remembered_network_map_, in descending order of preference.
|
| -//
|
| -// network_manager_monitor_: a handle to the libcros network Manager handler.
|
| -// NetworkManagerStatusChanged: This handles all messages from the Manager.
|
| -// Messages are parsed here and the appropriate updates are then requested.
|
| -//
|
| -// UpdateNetworkServiceList: This is the primary Manager handler. It handles
|
| -// the "Services" message which list all visible networks. The handler
|
| -// rebuilds the network lists without destroying existing Network structures,
|
| -// then requests neccessary updates to be fetched asynchronously from
|
| -// libcros (RequestNetworkServiceProperties).
|
| -//
|
| -// TODO(stevenjb): Document cellular data plan handlers.
|
| -//
|
| -// AddNetworkObserver: Adds an observer for a specific network.
|
| -// UpdateNetworkStatus: This handles changes to a monitored service, typically
|
| -// changes to transient states like Strength. (Note: also updates State).
|
| -//
|
| -// AddNetworkDeviceObserver: Adds an observer for a specific device.
|
| -// Will be called on any device property change.
|
| -// UpdateNetworkDeviceStatus: Handles changes to a monitored device, like
|
| -// SIM lock state and updates device state.
|
| -//
|
| -// All *Pin(...) methods use internal callback that would update cellular
|
| -// device state once async call is completed and notify all device observers.
|
| -//
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -namespace chromeos {
|
| -
|
| -namespace {
|
| -
|
| -static NetworkLibrary* g_network_library = NULL;
|
| -
|
| -// Default value of the SIM unlock retries count. It is updated to the real
|
| -// retries count once cellular device with SIM card is initialized.
|
| -// If cellular device doesn't have SIM card, then retries are never used.
|
| -const int kDefaultSimUnlockRetriesCount = 999;
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// Misc.
|
| -
|
| -// Erase the memory used by a string, then clear it.
|
| -void WipeString(std::string* str) {
|
| - str->assign(str->size(), '\0');
|
| - str->clear();
|
| -}
|
| -
|
| -bool EnsureRunningOnChromeOS() {
|
| - if (!base::chromeos::IsRunningOnChromeOS()) {
|
| - return false;
|
| - } else {
|
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI))
|
| - << "chromeos_network calls made from non UI thread!";
|
| - return true;
|
| - }
|
| -}
|
| -
|
| -void ValidateUTF8(const std::string& str, std::string* output) {
|
| - output->clear();
|
| -
|
| - for (int32 index = 0; index < static_cast<int32>(str.size()); ++index) {
|
| - uint32 code_point_out;
|
| - bool is_unicode_char = base::ReadUnicodeCharacter(str.c_str(), str.size(),
|
| - &index, &code_point_out);
|
| - if (is_unicode_char && (code_point_out >= 0x20))
|
| - base::WriteUnicodeCharacter(code_point_out, output);
|
| - else
|
| - // Puts REPLACEMENT CHARACTER (U+FFFD) if character is not readable UTF-8
|
| - base::WriteUnicodeCharacter(0xFFFD, output);
|
| - }
|
| -}
|
| -
|
| -std::string ConnectionStateString(ConnectionState state) {
|
| - switch (state) {
|
| - case STATE_UNKNOWN:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_UNKNOWN);
|
| - case STATE_IDLE:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_IDLE);
|
| - case STATE_CARRIER:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_CARRIER);
|
| - case STATE_ASSOCIATION:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_ASSOCIATION);
|
| - case STATE_CONFIGURATION:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_CONFIGURATION);
|
| - case STATE_READY:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_READY);
|
| - case STATE_DISCONNECT:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_DISCONNECT);
|
| - case STATE_FAILURE:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_FAILURE);
|
| - case STATE_ACTIVATION_FAILURE:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_STATE_ACTIVATION_FAILURE);
|
| - case STATE_PORTAL:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_PORTAL);
|
| - case STATE_ONLINE:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_ONLINE);
|
| - case STATE_CONNECT_REQUESTED:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_STATE_CONNECT_REQUESTED);
|
| - }
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_UNRECOGNIZED);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// FoundCellularNetwork
|
| -
|
| -FoundCellularNetwork::FoundCellularNetwork() {}
|
| -
|
| -FoundCellularNetwork::~FoundCellularNetwork() {}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// NetworkDevice
|
| -
|
| -NetworkDevice::NetworkDevice(const std::string& device_path)
|
| - : device_path_(device_path),
|
| - type_(TYPE_UNKNOWN),
|
| - scanning_(false),
|
| - sim_lock_state_(SIM_UNKNOWN),
|
| - sim_retries_left_(kDefaultSimUnlockRetriesCount),
|
| - sim_pin_required_(SIM_PIN_REQUIRE_UNKNOWN),
|
| - sim_present_(false),
|
| - powered_(false),
|
| - prl_version_(0),
|
| - data_roaming_allowed_(false),
|
| - support_network_scan_(false),
|
| - device_parser_(new NativeNetworkDeviceParser) {
|
| -}
|
| -
|
| -NetworkDevice::~NetworkDevice() {}
|
| -
|
| -void NetworkDevice::SetNetworkDeviceParser(NetworkDeviceParser* parser) {
|
| - device_parser_.reset(parser);
|
| -}
|
| -
|
| -void NetworkDevice::ParseInfo(const DictionaryValue& info) {
|
| - if (device_parser_.get())
|
| - device_parser_->UpdateDeviceFromInfo(info, this);
|
| -}
|
| -
|
| -bool NetworkDevice::UpdateStatus(const std::string& key,
|
| - const base::Value& value,
|
| - PropertyIndex* index) {
|
| - if (device_parser_.get())
|
| - return device_parser_->UpdateStatus(key, value, this, index);
|
| - return false;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// Network
|
| -
|
| -Network::Network(const std::string& service_path,
|
| - ConnectionType type)
|
| - : state_(STATE_UNKNOWN),
|
| - error_(ERROR_NO_ERROR),
|
| - connectable_(true),
|
| - user_connect_state_(USER_CONNECT_NONE),
|
| - is_active_(false),
|
| - priority_(kPriorityNotSet),
|
| - auto_connect_(false),
|
| - save_credentials_(false),
|
| - priority_order_(0),
|
| - added_(false),
|
| - notify_failure_(false),
|
| - profile_type_(PROFILE_NONE),
|
| - service_path_(service_path),
|
| - type_(type) {
|
| -}
|
| -
|
| -Network::~Network() {
|
| -}
|
| -
|
| -void Network::SetNetworkParser(NetworkParser* parser) {
|
| - network_parser_.reset(parser);
|
| -}
|
| -
|
| -// static
|
| -Network* Network::CreateForTesting(ConnectionType type) {
|
| - return new Network("fake_service_path", type);
|
| -}
|
| -
|
| -void Network::SetState(ConnectionState new_state) {
|
| - if (new_state == state_)
|
| - return;
|
| - if (state_ == STATE_CONNECT_REQUESTED && new_state == STATE_IDLE) {
|
| - // CONNECT_REQUESTED is set internally. Shill does not update the
|
| - // state immediately, so ignore any Idle state updates sent while a
|
| - // connection attempt is in progress.
|
| - VLOG(2) << "Ignoring idle state change after connection request.";
|
| - return;
|
| - }
|
| - ConnectionState old_state = state_;
|
| - VLOG(2) << "Entering new state: " << ConnectionStateString(new_state);
|
| - state_ = new_state;
|
| - if (new_state == STATE_FAILURE) {
|
| - VLOG(1) << service_path() << ": Detected Failure state.";
|
| - if (old_state != STATE_UNKNOWN && old_state != STATE_IDLE &&
|
| - (type() != TYPE_CELLULAR ||
|
| - user_connect_state() == USER_CONNECT_STARTED)) {
|
| - // New failure, the user needs to be notified.
|
| - // Transition STATE_IDLE -> STATE_FAILURE sometimes happens on resume
|
| - // but is not an actual failure as network device is not ready yet.
|
| - // For Cellular we only show failure notifications if user initiated.
|
| - notify_failure_ = true;
|
| - // Normally error_ should be set, but if it is not we need to set it to
|
| - // something here so that the retry logic will be triggered.
|
| - if (error_ == ERROR_NO_ERROR) {
|
| - VLOG(2) << "Detected NO_ERROR error state. Setting to UNKNOWN.";
|
| - error_ = ERROR_UNKNOWN;
|
| - }
|
| - }
|
| - if (user_connect_state() == USER_CONNECT_STARTED)
|
| - set_user_connect_state(USER_CONNECT_FAILED);
|
| - } else if (new_state == STATE_IDLE && IsConnectingState(old_state) &&
|
| - user_connect_state() == USER_CONNECT_STARTED) {
|
| - // If we requested a connect and never went through a connected state,
|
| - // treat it as a failure.
|
| - VLOG(1) << service_path() << ": Inferring Failure state.";
|
| - notify_failure_ = true;
|
| - error_ = ERROR_UNKNOWN;
|
| - if (user_connect_state() == USER_CONNECT_STARTED)
|
| - set_user_connect_state(USER_CONNECT_FAILED);
|
| - } else if (new_state != STATE_UNKNOWN) {
|
| - notify_failure_ = false;
|
| - // State changed, so refresh IP address.
|
| - InitIPAddress();
|
| - if (user_connect_state() == USER_CONNECT_STARTED) {
|
| - if (IsConnectedState(new_state)) {
|
| - set_user_connect_state(USER_CONNECT_CONNECTED);
|
| - } else if (!IsConnectingState(new_state)) {
|
| - LOG(WARNING) << "Connection started and State -> " << GetStateString();
|
| - set_user_connect_state(USER_CONNECT_FAILED);
|
| - }
|
| - }
|
| - }
|
| - VLOG(1) << name() << ".State [" << service_path() << "]: " << GetStateString()
|
| - << " (was: " << ConnectionStateString(old_state) << ")";
|
| -}
|
| -
|
| -void Network::SetError(ConnectionError error) {
|
| - error_ = error;
|
| - if (error == ERROR_NO_ERROR)
|
| - notify_failure_ = false;
|
| -}
|
| -
|
| -void Network::SetName(const std::string& name) {
|
| - std::string name_utf8;
|
| - ValidateUTF8(name, &name_utf8);
|
| - set_name(name_utf8);
|
| -}
|
| -
|
| -void Network::ParseInfo(const DictionaryValue& info) {
|
| - if (network_parser_.get())
|
| - network_parser_->UpdateNetworkFromInfo(info, this);
|
| -}
|
| -
|
| -void Network::EraseCredentials() {
|
| -}
|
| -
|
| -void Network::CalculateUniqueId() {
|
| - unique_id_ = name_;
|
| -}
|
| -
|
| -bool Network::RequiresUserProfile() const {
|
| - return false;
|
| -}
|
| -
|
| -void Network::CopyCredentialsFromRemembered(Network* remembered) {
|
| -}
|
| -
|
| -void Network::SetEnrollmentDelegate(EnrollmentDelegate* delegate) {
|
| - enrollment_delegate_.reset(delegate);
|
| -}
|
| -
|
| -void Network::SetValueProperty(const char* prop, const base::Value& value) {
|
| - DCHECK(prop);
|
| - if (!EnsureRunningOnChromeOS())
|
| - return;
|
| - CrosSetNetworkServiceProperty(service_path_, prop, value);
|
| - // Ensure NetworkStateHandler properties are up-to-date.
|
| - if (NetworkHandler::IsInitialized()) {
|
| - NetworkHandler::Get()->network_state_handler()->RequestUpdateForNetwork(
|
| - service_path());
|
| - }
|
| -}
|
| -
|
| -void Network::ClearProperty(const char* prop) {
|
| - DCHECK(prop);
|
| - if (!EnsureRunningOnChromeOS())
|
| - return;
|
| - CrosClearNetworkServiceProperty(service_path_, prop);
|
| - // Ensure NetworkStateHandler properties are up-to-date.
|
| - if (NetworkHandler::IsInitialized()) {
|
| - NetworkHandler::Get()->network_state_handler()->RequestUpdateForNetwork(
|
| - service_path());
|
| - }
|
| -}
|
| -
|
| -void Network::SetStringProperty(
|
| - const char* prop, const std::string& str, std::string* dest) {
|
| - if (dest)
|
| - *dest = str;
|
| - SetValueProperty(prop, base::StringValue(str));
|
| -}
|
| -
|
| -void Network::SetOrClearStringProperty(const char* prop,
|
| - const std::string& str,
|
| - std::string* dest) {
|
| - if (str.empty()) {
|
| - ClearProperty(prop);
|
| - if (dest)
|
| - dest->clear();
|
| - } else {
|
| - SetStringProperty(prop, str, dest);
|
| - }
|
| -}
|
| -
|
| -void Network::SetBooleanProperty(const char* prop, bool b, bool* dest) {
|
| - if (dest)
|
| - *dest = b;
|
| - SetValueProperty(prop, base::FundamentalValue(b));
|
| -}
|
| -
|
| -void Network::SetIntegerProperty(const char* prop, int i, int* dest) {
|
| - if (dest)
|
| - *dest = i;
|
| - SetValueProperty(prop, base::FundamentalValue(i));
|
| -}
|
| -
|
| -void Network::SetPreferred(bool preferred) {
|
| - if (preferred) {
|
| - SetIntegerProperty(
|
| - flimflam::kPriorityProperty, kPriorityPreferred, &priority_);
|
| - } else {
|
| - ClearProperty(flimflam::kPriorityProperty);
|
| - priority_ = kPriorityNotSet;
|
| - }
|
| -}
|
| -
|
| -void Network::SetAutoConnect(bool auto_connect) {
|
| - SetBooleanProperty(
|
| - flimflam::kAutoConnectProperty, auto_connect, &auto_connect_);
|
| -}
|
| -
|
| -void Network::SetSaveCredentials(bool save_credentials) {
|
| - SetBooleanProperty(
|
| - flimflam::kSaveCredentialsProperty, save_credentials, &save_credentials_);
|
| -}
|
| -
|
| -void Network::ClearUIData() {
|
| - ui_data_ = NetworkUIData();
|
| - ClearProperty(flimflam::kUIDataProperty);
|
| -}
|
| -
|
| -void Network::AttemptConnection(const base::Closure& closure) {
|
| - // By default, just invoke the closure right away. Some subclasses
|
| - // (Wifi, VPN, etc.) override to do more work.
|
| - closure.Run();
|
| -}
|
| -
|
| -void Network::set_connecting() {
|
| - state_ = STATE_CONNECT_REQUESTED;
|
| -}
|
| -
|
| -void Network::SetProfilePath(const std::string& profile_path) {
|
| - VLOG(1) << "Setting profile for: " << name_ << " to: " << profile_path;
|
| - SetOrClearStringProperty(
|
| - flimflam::kProfileProperty, profile_path, &profile_path_);
|
| -}
|
| -
|
| -std::string Network::GetStateString() const {
|
| - return ConnectionStateString(state_);
|
| -}
|
| -
|
| -std::string Network::GetErrorString() const {
|
| - switch (error_) {
|
| - case ERROR_NO_ERROR:
|
| - // TODO(nkostylev): Introduce new error message "None" instead.
|
| - return std::string();
|
| - case ERROR_OUT_OF_RANGE:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_OUT_OF_RANGE);
|
| - case ERROR_PIN_MISSING:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_PIN_MISSING);
|
| - case ERROR_DHCP_FAILED:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_DHCP_FAILED);
|
| - case ERROR_CONNECT_FAILED:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ERROR_CONNECT_FAILED);
|
| - case ERROR_BAD_PASSPHRASE:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ERROR_BAD_PASSPHRASE);
|
| - case ERROR_BAD_WEPKEY:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_BAD_WEPKEY);
|
| - case ERROR_ACTIVATION_FAILED:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ERROR_ACTIVATION_FAILED);
|
| - case ERROR_NEED_EVDO:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_NEED_EVDO);
|
| - case ERROR_NEED_HOME_NETWORK:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ERROR_NEED_HOME_NETWORK);
|
| - case ERROR_OTASP_FAILED:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_OTASP_FAILED);
|
| - case ERROR_AAA_FAILED:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_AAA_FAILED);
|
| - case ERROR_INTERNAL:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_INTERNAL);
|
| - case ERROR_DNS_LOOKUP_FAILED:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ERROR_DNS_LOOKUP_FAILED);
|
| - case ERROR_HTTP_GET_FAILED:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ERROR_HTTP_GET_FAILED);
|
| - case ERROR_IPSEC_PSK_AUTH_FAILED:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ERROR_IPSEC_PSK_AUTH_FAILED);
|
| - case ERROR_IPSEC_CERT_AUTH_FAILED:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ERROR_CERT_AUTH_FAILED);
|
| - case ERROR_PPP_AUTH_FAILED:
|
| - case ERROR_EAP_AUTHENTICATION_FAILED:
|
| - case ERROR_EAP_LOCAL_TLS_FAILED:
|
| - case ERROR_EAP_REMOTE_TLS_FAILED:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ERROR_PPP_AUTH_FAILED);
|
| - case ERROR_UNKNOWN:
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_UNKNOWN);
|
| - }
|
| - return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_UNRECOGNIZED);
|
| -}
|
| -
|
| -void Network::InitIPAddress() {
|
| - ip_address_.clear();
|
| - if (!EnsureRunningOnChromeOS())
|
| - return;
|
| - // If connected, get IPConfig.
|
| - if (connected() && !device_path_.empty()) {
|
| - CrosListIPConfigs(device_path_,
|
| - base::Bind(&Network::InitIPAddressCallback,
|
| - service_path_));
|
| - }
|
| -}
|
| -
|
| -// static
|
| -void Network::InitIPAddressCallback(
|
| - const std::string& service_path,
|
| - const NetworkIPConfigVector& ip_configs,
|
| - const std::string& hardware_address) {
|
| - Network* network =
|
| - NetworkLibrary::Get()->FindNetworkByPath(service_path);
|
| - if (!network)
|
| - return;
|
| - for (size_t i = 0; i < ip_configs.size(); ++i) {
|
| - const NetworkIPConfig& ipconfig = ip_configs[i];
|
| - if (ipconfig.address.size() > 0) {
|
| - network->ip_address_ = ipconfig.address;
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -bool Network::UpdateStatus(const std::string& key,
|
| - const Value& value,
|
| - PropertyIndex* index) {
|
| - if (network_parser_.get())
|
| - return network_parser_->UpdateStatus(key, value, this, index);
|
| - return false;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// EthernetNetwork
|
| -
|
| -EthernetNetwork::EthernetNetwork(const std::string& service_path)
|
| - : Network(service_path, TYPE_ETHERNET) {
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// VirtualNetwork
|
| -
|
| -VirtualNetwork::VirtualNetwork(const std::string& service_path)
|
| - : Network(service_path, TYPE_VPN),
|
| - provider_type_(PROVIDER_TYPE_L2TP_IPSEC_PSK),
|
| - // Assume PSK and user passphrase are not available initially
|
| - psk_passphrase_required_(true),
|
| - user_passphrase_required_(true),
|
| - weak_pointer_factory_(this) {
|
| -}
|
| -
|
| -VirtualNetwork::~VirtualNetwork() {}
|
| -
|
| -void VirtualNetwork::EraseCredentials() {
|
| - WipeString(&ca_cert_pem_);
|
| - WipeString(&psk_passphrase_);
|
| - WipeString(&client_cert_id_);
|
| - WipeString(&user_passphrase_);
|
| -}
|
| -
|
| -void VirtualNetwork::CalculateUniqueId() {
|
| - std::string provider_type(ProviderTypeToString(provider_type_));
|
| - set_unique_id(provider_type + "|" + server_hostname_);
|
| -}
|
| -
|
| -bool VirtualNetwork::RequiresUserProfile() const {
|
| - return true;
|
| -}
|
| -
|
| -void VirtualNetwork::AttemptConnection(const base::Closure& connect) {
|
| - if (client_cert_type() == CLIENT_CERT_TYPE_PATTERN) {
|
| - MatchCertificatePattern(true, connect);
|
| - } else {
|
| - connect.Run();
|
| - }
|
| -}
|
| -
|
| -void VirtualNetwork::CopyCredentialsFromRemembered(Network* remembered) {
|
| - CHECK_EQ(remembered->type(), TYPE_VPN);
|
| - VirtualNetwork* remembered_vpn = static_cast<VirtualNetwork*>(remembered);
|
| - VLOG(1) << "Copy VPN credentials: " << name()
|
| - << " username: " << remembered_vpn->username();
|
| - if (ca_cert_pem_.empty())
|
| - ca_cert_pem_ = remembered_vpn->ca_cert_pem();
|
| - if (psk_passphrase_.empty())
|
| - psk_passphrase_ = remembered_vpn->psk_passphrase();
|
| - if (client_cert_id_.empty())
|
| - client_cert_id_ = remembered_vpn->client_cert_id();
|
| - if (username_.empty())
|
| - username_ = remembered_vpn->username();
|
| - if (user_passphrase_.empty())
|
| - user_passphrase_ = remembered_vpn->user_passphrase();
|
| -}
|
| -
|
| -bool VirtualNetwork::NeedMoreInfoToConnect() const {
|
| - if (server_hostname_.empty()) {
|
| - VLOG(1) << "server_hostname_.empty()";
|
| - return true;
|
| - }
|
| - if (username_.empty()) {
|
| - VLOG(1) << "username_.empty()";
|
| - return true;
|
| - }
|
| - if (IsUserPassphraseRequired()) {
|
| - VLOG(1) << "User Passphrase Required";
|
| - return true;
|
| - }
|
| - if (error() != ERROR_NO_ERROR) {
|
| - VLOG(1) << "Error: " << error();
|
| - return true;
|
| - }
|
| - switch (provider_type_) {
|
| - case PROVIDER_TYPE_L2TP_IPSEC_PSK:
|
| - if (IsPSKPassphraseRequired()) {
|
| - VLOG(1) << "PSK Passphrase Required";
|
| - return true;
|
| - }
|
| - break;
|
| - case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
|
| - if (client_cert_id_.empty() &&
|
| - client_cert_type() != CLIENT_CERT_TYPE_PATTERN) {
|
| - VLOG(1) << "Certificate Required";
|
| - return true;
|
| - }
|
| - break;
|
| - case PROVIDER_TYPE_OPEN_VPN:
|
| - if (client_cert_id_.empty()) {
|
| - VLOG(1) << "client_cert_id_.empty()";
|
| - return true;
|
| - }
|
| - // For now we always need additional info for OpenVPN.
|
| - // TODO(stevenjb): Check connectable() once shill sets that state
|
| - // properly, or define another mechanism to determine when additional
|
| - // credentials are required.
|
| - VLOG(1) << "OpenVPN requires credentials, connectable: "
|
| - << connectable();
|
| - return true;
|
| - break;
|
| - case PROVIDER_TYPE_MAX:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -std::string VirtualNetwork::GetProviderTypeString() const {
|
| - switch (provider_type_) {
|
| - case PROVIDER_TYPE_L2TP_IPSEC_PSK:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_PSK);
|
| - break;
|
| - case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_USER_CERT);
|
| - break;
|
| - case PROVIDER_TYPE_OPEN_VPN:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_OPEN_VPN);
|
| - break;
|
| - default:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ERROR_UNKNOWN);
|
| - break;
|
| - }
|
| -}
|
| -
|
| -bool VirtualNetwork::IsPSKPassphraseRequired() const {
|
| - return psk_passphrase_required_ && psk_passphrase_.empty();
|
| -}
|
| -
|
| -bool VirtualNetwork::IsUserPassphraseRequired() const {
|
| - return user_passphrase_required_ && user_passphrase_.empty();
|
| -}
|
| -
|
| -void VirtualNetwork::SetCACertPEM(const std::string& ca_cert_pem) {
|
| - VLOG(1) << "SetCACertPEM " << ca_cert_pem;
|
| - if (provider_type_ == PROVIDER_TYPE_OPEN_VPN) {
|
| - ca_cert_pem_ = ca_cert_pem;
|
| - base::ListValue pem_list;
|
| - pem_list.AppendString(ca_cert_pem_);
|
| - SetValueProperty(shill::kOpenVPNCaCertPemProperty, pem_list);
|
| - } else {
|
| - SetStringProperty(
|
| - shill::kL2tpIpsecCaCertPemProperty, ca_cert_pem, &ca_cert_pem_);
|
| - }
|
| -}
|
| -
|
| -void VirtualNetwork::SetL2TPIPsecPSKCredentials(
|
| - const std::string& psk_passphrase,
|
| - const std::string& username,
|
| - const std::string& user_passphrase,
|
| - const std::string& group_name) {
|
| - if (!psk_passphrase.empty()) {
|
| - SetStringProperty(flimflam::kL2tpIpsecPskProperty,
|
| - psk_passphrase, &psk_passphrase_);
|
| - }
|
| - SetStringProperty(flimflam::kL2tpIpsecUserProperty, username, &username_);
|
| - if (!user_passphrase.empty()) {
|
| - SetStringProperty(flimflam::kL2tpIpsecPasswordProperty,
|
| - user_passphrase, &user_passphrase_);
|
| - }
|
| - SetStringProperty(shill::kL2tpIpsecTunnelGroupProperty,
|
| - group_name, &group_name_);
|
| -}
|
| -
|
| -void VirtualNetwork::SetL2TPIPsecCertCredentials(
|
| - const std::string& client_cert_id,
|
| - const std::string& username,
|
| - const std::string& user_passphrase,
|
| - const std::string& group_name) {
|
| - SetStringProperty(flimflam::kL2tpIpsecClientCertIdProperty,
|
| - client_cert_id, &client_cert_id_);
|
| - SetStringProperty(flimflam::kL2tpIpsecUserProperty, username, &username_);
|
| - if (!user_passphrase.empty()) {
|
| - SetStringProperty(flimflam::kL2tpIpsecPasswordProperty,
|
| - user_passphrase, &user_passphrase_);
|
| - }
|
| - SetStringProperty(shill::kL2tpIpsecTunnelGroupProperty,
|
| - group_name, &group_name_);
|
| -}
|
| -
|
| -void VirtualNetwork::SetOpenVPNCredentials(
|
| - const std::string& client_cert_id,
|
| - const std::string& username,
|
| - const std::string& user_passphrase,
|
| - const std::string& otp) {
|
| - SetStringProperty(flimflam::kOpenVPNClientCertIdProperty,
|
| - client_cert_id, &client_cert_id_);
|
| - SetStringProperty(flimflam::kOpenVPNUserProperty, username, &username_);
|
| - if (!user_passphrase.empty()) {
|
| - SetStringProperty(flimflam::kOpenVPNPasswordProperty,
|
| - user_passphrase, &user_passphrase_);
|
| - }
|
| - SetStringProperty(flimflam::kOpenVPNOTPProperty, otp, NULL);
|
| -}
|
| -
|
| -void VirtualNetwork::SetServerHostname(const std::string& server_hostname) {
|
| - SetStringProperty(flimflam::kProviderHostProperty,
|
| - server_hostname, &server_hostname_);
|
| -}
|
| -
|
| -void VirtualNetwork::SetCertificateSlotAndPin(
|
| - const std::string& slot, const std::string& pin) {
|
| - if (provider_type() == PROVIDER_TYPE_OPEN_VPN) {
|
| - SetOrClearStringProperty(flimflam::kOpenVPNClientCertSlotProperty,
|
| - slot, NULL);
|
| - SetOrClearStringProperty(flimflam::kOpenVPNPinProperty, pin, NULL);
|
| - } else {
|
| - SetOrClearStringProperty(flimflam::kL2tpIpsecClientCertSlotProperty,
|
| - slot, NULL);
|
| - SetOrClearStringProperty(flimflam::kL2tpIpsecPinProperty, pin, NULL);
|
| - }
|
| -}
|
| -
|
| -void VirtualNetwork::MatchCertificatePattern(bool allow_enroll,
|
| - const base::Closure& connect) {
|
| - DCHECK(client_cert_type() == CLIENT_CERT_TYPE_PATTERN);
|
| - DCHECK(!client_cert_pattern().Empty());
|
| -
|
| - // We skip certificate patterns for device policy ONC so that an unmanaged
|
| - // user can't get to the place where a cert is presented for them
|
| - // involuntarily.
|
| - if (client_cert_pattern().Empty() ||
|
| - ui_data().onc_source() == onc::ONC_SOURCE_DEVICE_POLICY) {
|
| - connect.Run();
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<net::X509Certificate> matching_cert =
|
| - client_cert::GetCertificateMatch(client_cert_pattern());
|
| - if (matching_cert.get()) {
|
| - std::string client_cert_id =
|
| - x509_certificate_model::GetPkcs11Id(matching_cert->os_cert_handle());
|
| - if (provider_type() == PROVIDER_TYPE_OPEN_VPN) {
|
| - SetStringProperty(flimflam::kOpenVPNClientCertIdProperty,
|
| - client_cert_id, &client_cert_id_);
|
| - } else {
|
| - SetStringProperty(flimflam::kL2tpIpsecClientCertIdProperty,
|
| - client_cert_id, &client_cert_id_);
|
| - }
|
| - } else {
|
| - if (allow_enroll && enrollment_delegate()) {
|
| - // Wrap the closure in another callback so that we can retry the
|
| - // certificate match again before actually connecting.
|
| - base::Closure wrapped_connect =
|
| - base::Bind(&VirtualNetwork::MatchCertificatePattern,
|
| - weak_pointer_factory_.GetWeakPtr(),
|
| - false,
|
| - connect);
|
| -
|
| - enrollment_delegate()->Enroll(client_cert_pattern().enrollment_uri_list(),
|
| - wrapped_connect);
|
| - // Enrollment delegate will take care of running the closure at the
|
| - // appropriate time, if the user doesn't cancel.
|
| - return;
|
| - }
|
| - }
|
| - connect.Run();
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// WirelessNetwork
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// CellTower
|
| -
|
| -CellTower::CellTower() {}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// CellularApn
|
| -
|
| -CellularApn::CellularApn() {}
|
| -
|
| -CellularApn::CellularApn(
|
| - const std::string& apn, const std::string& network_id,
|
| - const std::string& username, const std::string& password)
|
| - : apn(apn), network_id(network_id),
|
| - username(username), password(password) {
|
| -}
|
| -
|
| -CellularApn::~CellularApn() {}
|
| -
|
| -void CellularApn::Set(const DictionaryValue& dict) {
|
| - if (!dict.GetStringWithoutPathExpansion(flimflam::kApnProperty, &apn))
|
| - apn.clear();
|
| - if (!dict.GetStringWithoutPathExpansion(flimflam::kApnNetworkIdProperty,
|
| - &network_id))
|
| - network_id.clear();
|
| - if (!dict.GetStringWithoutPathExpansion(flimflam::kApnUsernameProperty,
|
| - &username))
|
| - username.clear();
|
| - if (!dict.GetStringWithoutPathExpansion(flimflam::kApnPasswordProperty,
|
| - &password))
|
| - password.clear();
|
| - if (!dict.GetStringWithoutPathExpansion(flimflam::kApnNameProperty, &name))
|
| - name.clear();
|
| - if (!dict.GetStringWithoutPathExpansion(flimflam::kApnLocalizedNameProperty,
|
| - &localized_name))
|
| - localized_name.clear();
|
| - if (!dict.GetStringWithoutPathExpansion(flimflam::kApnLanguageProperty,
|
| - &language))
|
| - language.clear();
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// CellularNetwork
|
| -
|
| -CellularNetwork::CellularNetwork(const std::string& service_path)
|
| - : WirelessNetwork(service_path, TYPE_CELLULAR),
|
| - activate_over_non_cellular_network_(false),
|
| - out_of_credits_(false),
|
| - activation_state_(ACTIVATION_STATE_UNKNOWN),
|
| - network_technology_(NETWORK_TECHNOLOGY_UNKNOWN),
|
| - roaming_state_(ROAMING_STATE_UNKNOWN),
|
| - using_post_(false) {
|
| -}
|
| -
|
| -CellularNetwork::~CellularNetwork() {
|
| -}
|
| -
|
| -bool CellularNetwork::StartActivation() {
|
| - if (!EnsureRunningOnChromeOS())
|
| - return false;
|
| - if (!CrosActivateCellularModem(service_path(), ""))
|
| - return false;
|
| - // Don't wait for shill to tell us that we are really activating since
|
| - // other notifications in the message loop might cause us to think that
|
| - // the process hasn't started yet.
|
| - activation_state_ = ACTIVATION_STATE_ACTIVATING;
|
| - return true;
|
| -}
|
| -
|
| -void CellularNetwork::CompleteActivation() {
|
| - if (!EnsureRunningOnChromeOS())
|
| - return;
|
| - CrosCompleteCellularActivation(service_path());
|
| -}
|
| -
|
| -void CellularNetwork::SetApn(const CellularApn& apn) {
|
| - if (!apn.apn.empty()) {
|
| - DictionaryValue value;
|
| - // Only use the fields that are needed for establishing
|
| - // connections, and ignore the rest.
|
| - value.SetString(flimflam::kApnProperty, apn.apn);
|
| - value.SetString(flimflam::kApnNetworkIdProperty, apn.network_id);
|
| - value.SetString(flimflam::kApnUsernameProperty, apn.username);
|
| - value.SetString(flimflam::kApnPasswordProperty, apn.password);
|
| - SetValueProperty(flimflam::kCellularApnProperty, value);
|
| - } else {
|
| - ClearProperty(flimflam::kCellularApnProperty);
|
| - }
|
| -}
|
| -
|
| -bool CellularNetwork::SupportsActivation() const {
|
| - return !usage_url().empty() || !payment_url().empty();
|
| -}
|
| -
|
| -bool CellularNetwork::NeedsActivation() const {
|
| - return (activation_state() == ACTIVATION_STATE_NOT_ACTIVATED ||
|
| - activation_state() == ACTIVATION_STATE_PARTIALLY_ACTIVATED);
|
| -}
|
| -
|
| -std::string CellularNetwork::GetNetworkTechnologyString() const {
|
| - // No need to localize these cellular technology abbreviations.
|
| - switch (network_technology_) {
|
| - case NETWORK_TECHNOLOGY_1XRTT:
|
| - return "1xRTT";
|
| - break;
|
| - case NETWORK_TECHNOLOGY_EVDO:
|
| - return "EVDO";
|
| - break;
|
| - case NETWORK_TECHNOLOGY_GPRS:
|
| - return "GPRS";
|
| - break;
|
| - case NETWORK_TECHNOLOGY_EDGE:
|
| - return "EDGE";
|
| - break;
|
| - case NETWORK_TECHNOLOGY_UMTS:
|
| - return "UMTS";
|
| - break;
|
| - case NETWORK_TECHNOLOGY_HSPA:
|
| - return "HSPA";
|
| - break;
|
| - case NETWORK_TECHNOLOGY_HSPA_PLUS:
|
| - return "HSPA Plus";
|
| - break;
|
| - case NETWORK_TECHNOLOGY_LTE:
|
| - return "LTE";
|
| - break;
|
| - case NETWORK_TECHNOLOGY_LTE_ADVANCED:
|
| - return "LTE Advanced";
|
| - break;
|
| - case NETWORK_TECHNOLOGY_GSM:
|
| - return "GSM";
|
| - break;
|
| - default:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_CELLULAR_TECHNOLOGY_UNKNOWN);
|
| - break;
|
| - }
|
| -}
|
| -
|
| -std::string CellularNetwork::ActivationStateToString(
|
| - ActivationState activation_state) {
|
| - switch (activation_state) {
|
| - case ACTIVATION_STATE_ACTIVATED:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_ACTIVATED);
|
| - break;
|
| - case ACTIVATION_STATE_ACTIVATING:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_ACTIVATING);
|
| - break;
|
| - case ACTIVATION_STATE_NOT_ACTIVATED:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_NOT_ACTIVATED);
|
| - break;
|
| - case ACTIVATION_STATE_PARTIALLY_ACTIVATED:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_PARTIALLY_ACTIVATED);
|
| - break;
|
| - default:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_UNKNOWN);
|
| - break;
|
| - }
|
| -}
|
| -
|
| -std::string CellularNetwork::GetActivationStateString() const {
|
| - return ActivationStateToString(this->activation_state_);
|
| -}
|
| -
|
| -std::string CellularNetwork::GetRoamingStateString() const {
|
| - switch (this->roaming_state_) {
|
| - case ROAMING_STATE_HOME:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ROAMING_STATE_HOME);
|
| - break;
|
| - case ROAMING_STATE_ROAMING:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ROAMING_STATE_ROAMING);
|
| - break;
|
| - default:
|
| - return l10n_util::GetStringUTF8(
|
| - IDS_CHROMEOS_NETWORK_ROAMING_STATE_UNKNOWN);
|
| - break;
|
| - }
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// WifiNetwork
|
| -
|
| -WifiNetwork::WifiNetwork(const std::string& service_path)
|
| - : WirelessNetwork(service_path, TYPE_WIFI),
|
| - encryption_(SECURITY_NONE),
|
| - passphrase_required_(false),
|
| - hidden_ssid_(false),
|
| - frequency_(0),
|
| - eap_method_(EAP_METHOD_UNKNOWN),
|
| - eap_phase_2_auth_(EAP_PHASE_2_AUTH_AUTO),
|
| - eap_use_system_cas_(true),
|
| - eap_save_credentials_(false),
|
| - weak_pointer_factory_(this) {
|
| -}
|
| -
|
| -WifiNetwork::~WifiNetwork() {}
|
| -
|
| -void WifiNetwork::CalculateUniqueId() {
|
| - ConnectionSecurity encryption = encryption_;
|
| - // Shill treats wpa and rsn as psk internally, so convert those types
|
| - // to psk for unique naming.
|
| - if (encryption == SECURITY_WPA || encryption == SECURITY_RSN)
|
| - encryption = SECURITY_PSK;
|
| - std::string security = std::string(SecurityToString(encryption));
|
| - set_unique_id(security + "|" + name());
|
| -}
|
| -
|
| -bool WifiNetwork::SetSsid(const std::string& ssid) {
|
| - // Detects encoding and convert to UTF-8.
|
| - std::string ssid_utf8;
|
| - if (!IsStringUTF8(ssid)) {
|
| - std::string encoding;
|
| - if (base::DetectEncoding(ssid, &encoding)) {
|
| - if (!base::ConvertToUtf8AndNormalize(ssid, encoding, &ssid_utf8)) {
|
| - ssid_utf8.clear();
|
| - }
|
| - }
|
| - }
|
| -
|
| - if (ssid_utf8.empty())
|
| - SetName(ssid);
|
| - else
|
| - SetName(ssid_utf8);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool WifiNetwork::SetHexSsid(const std::string& ssid_hex) {
|
| - // Converts ascii hex dump (eg. "49656c6c6f") to string (eg. "Hello").
|
| - std::vector<uint8> ssid_raw;
|
| - if (!base::HexStringToBytes(ssid_hex, &ssid_raw)) {
|
| - LOG(ERROR) << "Illegal hex char is found in WiFi.HexSSID.";
|
| - ssid_raw.clear();
|
| - return false;
|
| - }
|
| -
|
| - return SetSsid(std::string(ssid_raw.begin(), ssid_raw.end()));
|
| -}
|
| -
|
| -const std::string& WifiNetwork::GetPassphrase() const {
|
| - if (!user_passphrase_.empty())
|
| - return user_passphrase_;
|
| - return passphrase_;
|
| -}
|
| -
|
| -void WifiNetwork::SetPassphrase(const std::string& passphrase) {
|
| - // Set the user_passphrase_ only; passphrase_ stores the shill value.
|
| - // If the user sets an empty passphrase, restore it to the passphrase
|
| - // remembered by shill.
|
| - if (!passphrase.empty()) {
|
| - user_passphrase_ = passphrase;
|
| - passphrase_ = passphrase;
|
| - } else {
|
| - user_passphrase_ = passphrase_;
|
| - }
|
| - // Send the change to shill. If the format is valid, it will propagate to
|
| - // passphrase_ with a service update.
|
| - SetOrClearStringProperty(flimflam::kPassphraseProperty, passphrase, NULL);
|
| -}
|
| -
|
| -// See src/third_party/shill/doc/service-api.txt for properties that
|
| -// shill will forget when SaveCredentials is false.
|
| -void WifiNetwork::EraseCredentials() {
|
| - WipeString(&passphrase_);
|
| - WipeString(&user_passphrase_);
|
| - WipeString(&eap_server_ca_cert_pem_);
|
| - WipeString(&eap_client_cert_pkcs11_id_);
|
| - WipeString(&eap_identity_);
|
| - WipeString(&eap_anonymous_identity_);
|
| - WipeString(&eap_passphrase_);
|
| -}
|
| -
|
| -void WifiNetwork::SetEAPMethod(EAPMethod method) {
|
| - eap_method_ = method;
|
| - switch (method) {
|
| - case EAP_METHOD_PEAP:
|
| - SetStringProperty(
|
| - flimflam::kEapMethodProperty, flimflam::kEapMethodPEAP, NULL);
|
| - break;
|
| - case EAP_METHOD_TLS:
|
| - SetStringProperty(
|
| - flimflam::kEapMethodProperty, flimflam::kEapMethodTLS, NULL);
|
| - break;
|
| - case EAP_METHOD_TTLS:
|
| - SetStringProperty(
|
| - flimflam::kEapMethodProperty, flimflam::kEapMethodTTLS, NULL);
|
| - break;
|
| - case EAP_METHOD_LEAP:
|
| - SetStringProperty(
|
| - flimflam::kEapMethodProperty, flimflam::kEapMethodLEAP, NULL);
|
| - break;
|
| - default:
|
| - ClearProperty(flimflam::kEapMethodProperty);
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void WifiNetwork::SetEAPPhase2Auth(EAPPhase2Auth auth) {
|
| - eap_phase_2_auth_ = auth;
|
| - bool is_peap = (eap_method_ == EAP_METHOD_PEAP);
|
| - switch (auth) {
|
| - case EAP_PHASE_2_AUTH_AUTO:
|
| - ClearProperty(flimflam::kEapPhase2AuthProperty);
|
| - break;
|
| - case EAP_PHASE_2_AUTH_MD5:
|
| - SetStringProperty(flimflam::kEapPhase2AuthProperty,
|
| - is_peap ? flimflam::kEapPhase2AuthPEAPMD5
|
| - : flimflam::kEapPhase2AuthTTLSMD5,
|
| - NULL);
|
| - break;
|
| - case EAP_PHASE_2_AUTH_MSCHAPV2:
|
| - SetStringProperty(flimflam::kEapPhase2AuthProperty,
|
| - is_peap ? flimflam::kEapPhase2AuthPEAPMSCHAPV2
|
| - : flimflam::kEapPhase2AuthTTLSMSCHAPV2,
|
| - NULL);
|
| - break;
|
| - case EAP_PHASE_2_AUTH_MSCHAP:
|
| - SetStringProperty(flimflam::kEapPhase2AuthProperty,
|
| - flimflam::kEapPhase2AuthTTLSMSCHAP, NULL);
|
| - break;
|
| - case EAP_PHASE_2_AUTH_PAP:
|
| - SetStringProperty(flimflam::kEapPhase2AuthProperty,
|
| - flimflam::kEapPhase2AuthTTLSPAP, NULL);
|
| - break;
|
| - case EAP_PHASE_2_AUTH_CHAP:
|
| - SetStringProperty(flimflam::kEapPhase2AuthProperty,
|
| - flimflam::kEapPhase2AuthTTLSCHAP, NULL);
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void WifiNetwork::SetEAPServerCaCertPEM(
|
| - const std::string& ca_cert_pem) {
|
| - VLOG(1) << "SetEAPServerCaCertPEM " << ca_cert_pem;
|
| - eap_server_ca_cert_pem_ = ca_cert_pem;
|
| - base::ListValue pem_list;
|
| - pem_list.AppendString(ca_cert_pem);
|
| - SetValueProperty(shill::kEapCaCertPemProperty, pem_list);
|
| -}
|
| -
|
| -void WifiNetwork::SetEAPClientCertPkcs11Id(const std::string& pkcs11_id) {
|
| - VLOG(1) << "SetEAPClientCertPkcs11Id " << pkcs11_id;
|
| - SetOrClearStringProperty(
|
| - flimflam::kEapCertIdProperty, pkcs11_id, &eap_client_cert_pkcs11_id_);
|
| - // shill requires both CertID and KeyID for TLS connections, despite
|
| - // the fact that by convention they are the same ID.
|
| - SetOrClearStringProperty(flimflam::kEapKeyIdProperty, pkcs11_id, NULL);
|
| -}
|
| -
|
| -void WifiNetwork::SetEAPUseSystemCAs(bool use_system_cas) {
|
| - SetBooleanProperty(flimflam::kEapUseSystemCasProperty, use_system_cas,
|
| - &eap_use_system_cas_);
|
| -}
|
| -
|
| -void WifiNetwork::SetEAPIdentity(const std::string& identity) {
|
| - SetOrClearStringProperty(
|
| - flimflam::kEapIdentityProperty, identity, &eap_identity_);
|
| -}
|
| -
|
| -void WifiNetwork::SetEAPAnonymousIdentity(const std::string& identity) {
|
| - SetOrClearStringProperty(flimflam::kEapAnonymousIdentityProperty, identity,
|
| - &eap_anonymous_identity_);
|
| -}
|
| -
|
| -void WifiNetwork::SetEAPPassphrase(const std::string& passphrase) {
|
| - SetOrClearStringProperty(
|
| - flimflam::kEapPasswordProperty, passphrase, &eap_passphrase_);
|
| -}
|
| -
|
| -std::string WifiNetwork::GetEncryptionString() const {
|
| - switch (encryption_) {
|
| - case SECURITY_UNKNOWN:
|
| - break;
|
| - case SECURITY_NONE:
|
| - return "";
|
| - case SECURITY_WEP:
|
| - return "WEP";
|
| - case SECURITY_WPA:
|
| - return "WPA";
|
| - case SECURITY_RSN:
|
| - return "RSN";
|
| - case SECURITY_8021X: {
|
| - std::string result("8021X");
|
| - switch (eap_method_) {
|
| - case EAP_METHOD_PEAP:
|
| - result += "+PEAP";
|
| - break;
|
| - case EAP_METHOD_TLS:
|
| - result += "+TLS";
|
| - break;
|
| - case EAP_METHOD_TTLS:
|
| - result += "+TTLS";
|
| - break;
|
| - case EAP_METHOD_LEAP:
|
| - result += "+LEAP";
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - return result;
|
| - }
|
| - case SECURITY_PSK:
|
| - return "PSK";
|
| - }
|
| - return "Unknown";
|
| -}
|
| -
|
| -bool WifiNetwork::IsPassphraseRequired() const {
|
| - if (encryption_ == SECURITY_NONE)
|
| - return false;
|
| - // A connection failure might be due to a bad passphrase.
|
| - if (error() == ERROR_BAD_PASSPHRASE ||
|
| - error() == ERROR_BAD_WEPKEY ||
|
| - error() == ERROR_PPP_AUTH_FAILED ||
|
| - error() == ERROR_EAP_LOCAL_TLS_FAILED ||
|
| - error() == ERROR_EAP_REMOTE_TLS_FAILED ||
|
| - error() == ERROR_EAP_AUTHENTICATION_FAILED ||
|
| - error() == ERROR_CONNECT_FAILED ||
|
| - error() == ERROR_UNKNOWN) {
|
| - VLOG(1) << "Authentication Error: " << GetErrorString();
|
| - return true;
|
| - }
|
| - // If the user initiated a connection and it failed, request credentials in
|
| - // case it is a credentials error and Shill was unable to detect it.
|
| - if (user_connect_state() == USER_CONNECT_FAILED)
|
| - return true;
|
| - // WEP/WPA/RSN and PSK networks rely on the PassphraseRequired property.
|
| - if (encryption_ != SECURITY_8021X)
|
| - return passphrase_required_;
|
| - // For 802.1x networks, if we are using a certificate pattern we do not
|
| - // need any credentials.
|
| - if (eap_method_ == EAP_METHOD_TLS &&
|
| - client_cert_type() == CLIENT_CERT_TYPE_PATTERN) {
|
| - return false;
|
| - }
|
| - // Connectable will be false if 802.1x credentials are not set
|
| - return !connectable();
|
| -}
|
| -
|
| -bool WifiNetwork::RequiresUserProfile() const {
|
| - // 8021X requires certificates which are only stored for individual users.
|
| - if (encryption_ != SECURITY_8021X)
|
| - return false;
|
| -
|
| - if (eap_method_ != EAP_METHOD_TLS)
|
| - return false;
|
| -
|
| - if (eap_client_cert_pkcs11_id().empty() &&
|
| - client_cert_type() != CLIENT_CERT_TYPE_PATTERN)
|
| - return false;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void WifiNetwork::AttemptConnection(const base::Closure& connect) {
|
| - if (client_cert_type() == CLIENT_CERT_TYPE_PATTERN) {
|
| - MatchCertificatePattern(true, connect);
|
| - } else {
|
| - connect.Run();
|
| - }
|
| -}
|
| -
|
| -void WifiNetwork::SetCertificatePin(const std::string& pin) {
|
| - SetOrClearStringProperty(flimflam::kEapPinProperty, pin, NULL);
|
| -}
|
| -
|
| -void WifiNetwork::MatchCertificatePattern(bool allow_enroll,
|
| - const base::Closure& connect) {
|
| - DCHECK(client_cert_type() == CLIENT_CERT_TYPE_PATTERN);
|
| - DCHECK(!client_cert_pattern().Empty());
|
| - if (client_cert_pattern().Empty()) {
|
| - connect.Run();
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<net::X509Certificate> matching_cert =
|
| - client_cert::GetCertificateMatch(client_cert_pattern());
|
| - if (matching_cert.get()) {
|
| - SetEAPClientCertPkcs11Id(
|
| - x509_certificate_model::GetPkcs11Id(matching_cert->os_cert_handle()));
|
| - } else {
|
| - if (allow_enroll && enrollment_delegate()) {
|
| - // Wrap the closure in another callback so that we can retry the
|
| - // certificate match again before actually connecting.
|
| - base::Closure wrapped_connect =
|
| - base::Bind(&WifiNetwork::MatchCertificatePattern,
|
| - weak_pointer_factory_.GetWeakPtr(),
|
| - false,
|
| - connect);
|
| -
|
| - enrollment_delegate()->Enroll(client_cert_pattern().enrollment_uri_list(),
|
| - wrapped_connect);
|
| - // Enrollment delegate should take care of running the closure at the
|
| - // appropriate time, if the user doesn't cancel.
|
| - return;
|
| - }
|
| - }
|
| - connect.Run();
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// WimaxNetwork
|
| -
|
| -WimaxNetwork::WimaxNetwork(const std::string& service_path)
|
| - : WirelessNetwork(service_path, TYPE_WIMAX),
|
| - passphrase_required_(false) {
|
| -}
|
| -
|
| -WimaxNetwork::~WimaxNetwork() {
|
| -}
|
| -
|
| -void WimaxNetwork::EraseCredentials() {
|
| - WipeString(&eap_passphrase_);
|
| - WipeString(&eap_identity_);
|
| -}
|
| -
|
| -void WimaxNetwork::SetEAPPassphrase(const std::string& passphrase) {
|
| - SetOrClearStringProperty(
|
| - flimflam::kEapPasswordProperty, passphrase, &eap_passphrase_);
|
| -}
|
| -
|
| -void WimaxNetwork::SetEAPIdentity(const std::string& identity) {
|
| - SetOrClearStringProperty(
|
| - flimflam::kEapIdentityProperty, identity, &eap_identity_);
|
| -}
|
| -
|
| -void WimaxNetwork::CalculateUniqueId() {
|
| - set_unique_id(name() + "|" + eap_identity());
|
| -}
|
| -
|
| -NetworkLibrary::EAPConfigData::EAPConfigData()
|
| - : method(EAP_METHOD_UNKNOWN),
|
| - auth(EAP_PHASE_2_AUTH_AUTO),
|
| - use_system_cas(true) {
|
| -}
|
| -
|
| -NetworkLibrary::EAPConfigData::~EAPConfigData() {}
|
| -
|
| -NetworkLibrary::VPNConfigData::VPNConfigData()
|
| - : save_credentials(false) {
|
| -}
|
| -
|
| -NetworkLibrary::VPNConfigData::~VPNConfigData() {}
|
| -
|
| -// static
|
| -NetworkLibrary* NetworkLibrary::GetImpl(bool stub) {
|
| - NetworkLibrary* impl;
|
| - if (stub)
|
| - impl = new NetworkLibraryImplStub();
|
| - else
|
| - impl = new NetworkLibraryImplCros();
|
| - impl->Init();
|
| - return impl;
|
| -}
|
| -
|
| -// static
|
| -void NetworkLibrary::Initialize(bool use_stub) {
|
| - CHECK(!g_network_library)
|
| - << "NetworkLibrary: Multiple calls to Initialize().";
|
| - g_network_library = NetworkLibrary::GetImpl(use_stub);
|
| - VLOG_IF(1, use_stub) << "NetworkLibrary Initialized with Stub Impl.";
|
| -}
|
| -
|
| -// static
|
| -void NetworkLibrary::Shutdown() {
|
| - VLOG(1) << "NetworkLibrary Shutting down...";
|
| - delete g_network_library;
|
| - g_network_library = NULL;
|
| - VLOG(1) << " NetworkLibrary Shutdown completed.";
|
| -}
|
| -
|
| -// static
|
| -NetworkLibrary* NetworkLibrary::Get() {
|
| - return g_network_library;
|
| -}
|
| -
|
| -// static
|
| -void NetworkLibrary::SetForTesting(NetworkLibrary* library) {
|
| - if (g_network_library)
|
| - delete g_network_library;
|
| - g_network_library = library;
|
| -}
|
| -
|
| -} // namespace chromeos
|
|
|