| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromeos/network/network_connection_handler.h" | 5 #include "chromeos/network/network_connection_handler.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
| 9 #include "chromeos/dbus/dbus_thread_manager.h" | 9 #include "chromeos/dbus/dbus_thread_manager.h" |
| 10 #include "chromeos/dbus/shill_manager_client.h" | 10 #include "chromeos/dbus/shill_manager_client.h" |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 scoped_refptr<net::X509Certificate> matching_cert = | 100 scoped_refptr<net::X509Certificate> matching_cert = |
| 101 certificate_pattern::GetCertificateMatch( | 101 certificate_pattern::GetCertificateMatch( |
| 102 ui_data->certificate_pattern()); | 102 ui_data->certificate_pattern()); |
| 103 if (!matching_cert.get()) | 103 if (!matching_cert.get()) |
| 104 return false; | 104 return false; |
| 105 return true; | 105 return true; |
| 106 } | 106 } |
| 107 | 107 |
| 108 } // namespace | 108 } // namespace |
| 109 | 109 |
| 110 static NetworkConnectionHandler* g_connection_handler_instance = NULL; | |
| 111 | |
| 112 const char NetworkConnectionHandler::kErrorNotFound[] = "not-found"; | 110 const char NetworkConnectionHandler::kErrorNotFound[] = "not-found"; |
| 113 const char NetworkConnectionHandler::kErrorConnected[] = "connected"; | 111 const char NetworkConnectionHandler::kErrorConnected[] = "connected"; |
| 114 const char NetworkConnectionHandler::kErrorConnecting[] = "connecting"; | 112 const char NetworkConnectionHandler::kErrorConnecting[] = "connecting"; |
| 115 const char NetworkConnectionHandler::kErrorNotConnected[] = "not-connected"; | 113 const char NetworkConnectionHandler::kErrorNotConnected[] = "not-connected"; |
| 116 const char NetworkConnectionHandler::kErrorPassphraseRequired[] = | 114 const char NetworkConnectionHandler::kErrorPassphraseRequired[] = |
| 117 "passphrase-required"; | 115 "passphrase-required"; |
| 118 const char NetworkConnectionHandler::kErrorActivationRequired[] = | 116 const char NetworkConnectionHandler::kErrorActivationRequired[] = |
| 119 "activation-required"; | 117 "activation-required"; |
| 120 const char NetworkConnectionHandler::kErrorCertificateRequired[] = | 118 const char NetworkConnectionHandler::kErrorCertificateRequired[] = |
| 121 "certificate-required"; | 119 "certificate-required"; |
| 122 const char NetworkConnectionHandler::kErrorConfigurationRequired[] = | 120 const char NetworkConnectionHandler::kErrorConfigurationRequired[] = |
| 123 "configuration-required"; | 121 "configuration-required"; |
| 124 const char NetworkConnectionHandler::kErrorShillError[] = "shill-error"; | 122 const char NetworkConnectionHandler::kErrorShillError[] = "shill-error"; |
| 125 | 123 |
| 126 // static | 124 NetworkConnectionHandler::NetworkConnectionHandler() |
| 127 void NetworkConnectionHandler::Initialize() { | 125 : network_state_handler_(NULL), |
| 128 CHECK(!g_connection_handler_instance); | 126 network_configuration_handler_(NULL) { |
| 129 g_connection_handler_instance = new NetworkConnectionHandler; | |
| 130 } | |
| 131 | |
| 132 // static | |
| 133 void NetworkConnectionHandler::Shutdown() { | |
| 134 CHECK(g_connection_handler_instance); | |
| 135 delete g_connection_handler_instance; | |
| 136 g_connection_handler_instance = NULL; | |
| 137 } | |
| 138 | |
| 139 // static | |
| 140 NetworkConnectionHandler* NetworkConnectionHandler::Get() { | |
| 141 CHECK(g_connection_handler_instance) | |
| 142 << "NetworkConnectionHandler::Get() called before Initialize()"; | |
| 143 return g_connection_handler_instance; | |
| 144 } | |
| 145 | |
| 146 NetworkConnectionHandler::NetworkConnectionHandler() { | |
| 147 } | 127 } |
| 148 | 128 |
| 149 NetworkConnectionHandler::~NetworkConnectionHandler() { | 129 NetworkConnectionHandler::~NetworkConnectionHandler() { |
| 150 } | 130 } |
| 151 | 131 |
| 132 void NetworkConnectionHandler::Init( |
| 133 NetworkStateHandler* network_state_handler, |
| 134 NetworkConfigurationHandler* network_configuration_handler) { |
| 135 network_state_handler_ = network_state_handler; |
| 136 network_configuration_handler_ = network_configuration_handler; |
| 137 } |
| 138 |
| 152 void NetworkConnectionHandler::ConnectToNetwork( | 139 void NetworkConnectionHandler::ConnectToNetwork( |
| 153 const std::string& service_path, | 140 const std::string& service_path, |
| 154 const base::Closure& success_callback, | 141 const base::Closure& success_callback, |
| 155 const network_handler::ErrorCallback& error_callback) { | 142 const network_handler::ErrorCallback& error_callback) { |
| 156 const NetworkState* network = | 143 const NetworkState* network = |
| 157 NetworkStateHandler::Get()->GetNetworkState(service_path); | 144 network_state_handler_->GetNetworkState(service_path); |
| 158 if (!network) { | 145 if (!network) { |
| 159 InvokeErrorCallback(service_path, error_callback, kErrorNotFound); | 146 InvokeErrorCallback(service_path, error_callback, kErrorNotFound); |
| 160 return; | 147 return; |
| 161 } | 148 } |
| 162 if (network->IsConnectedState()) { | 149 if (network->IsConnectedState()) { |
| 163 InvokeErrorCallback(service_path, error_callback, kErrorConnected); | 150 InvokeErrorCallback(service_path, error_callback, kErrorConnected); |
| 164 return; | 151 return; |
| 165 } | 152 } |
| 166 if (network->IsConnectingState() || | 153 if (network->IsConnectingState() || |
| 167 pending_requests_.find(service_path) != pending_requests_.end()) { | 154 pending_requests_.find(service_path) != pending_requests_.end()) { |
| 168 InvokeErrorCallback(service_path, error_callback, kErrorConnecting); | 155 InvokeErrorCallback(service_path, error_callback, kErrorConnecting); |
| 169 return; | 156 return; |
| 170 } | 157 } |
| 171 if (network->passphrase_required()) { | 158 if (network->passphrase_required()) { |
| 172 InvokeErrorCallback(service_path, error_callback, kErrorPassphraseRequired); | 159 InvokeErrorCallback(service_path, error_callback, kErrorPassphraseRequired); |
| 173 return; | 160 return; |
| 174 } | 161 } |
| 175 if (NetworkRequiresActivation(network)) { | 162 if (NetworkRequiresActivation(network)) { |
| 176 InvokeErrorCallback(service_path, error_callback, kErrorActivationRequired); | 163 InvokeErrorCallback(service_path, error_callback, kErrorActivationRequired); |
| 177 return; | 164 return; |
| 178 } | 165 } |
| 179 | 166 |
| 180 // All synchronous checks passed, add |service_path| to connecting list. | 167 // All synchronous checks passed, add |service_path| to connecting list. |
| 181 pending_requests_.insert(service_path); | 168 pending_requests_.insert(service_path); |
| 182 | 169 |
| 183 if (!network->connectable() && NetworkMayNeedCredentials(network)) { | 170 if (!network->connectable() && NetworkMayNeedCredentials(network)) { |
| 184 // Request additional properties to check. | 171 // Request additional properties to check. |
| 185 NetworkConfigurationHandler::Get()->GetProperties( | 172 network_configuration_handler_->GetProperties( |
| 186 network->path(), | 173 network->path(), |
| 187 base::Bind(&NetworkConnectionHandler::VerifyConfiguredAndConnect, | 174 base::Bind(&NetworkConnectionHandler::VerifyConfiguredAndConnect, |
| 188 AsWeakPtr(), success_callback, error_callback), | 175 AsWeakPtr(), success_callback, error_callback), |
| 189 base::Bind(&NetworkConnectionHandler::HandleConfigurationFailure, | 176 base::Bind(&NetworkConnectionHandler::HandleConfigurationFailure, |
| 190 AsWeakPtr(), network->path(), error_callback)); | 177 AsWeakPtr(), network->path(), error_callback)); |
| 191 return; | 178 return; |
| 192 } | 179 } |
| 193 // All checks passed, send connect request. | 180 // All checks passed, send connect request. |
| 194 CallShillConnect(service_path, success_callback, error_callback); | 181 CallShillConnect(service_path, success_callback, error_callback); |
| 195 } | 182 } |
| 196 | 183 |
| 197 void NetworkConnectionHandler::DisconnectNetwork( | 184 void NetworkConnectionHandler::DisconnectNetwork( |
| 198 const std::string& service_path, | 185 const std::string& service_path, |
| 199 const base::Closure& success_callback, | 186 const base::Closure& success_callback, |
| 200 const network_handler::ErrorCallback& error_callback) { | 187 const network_handler::ErrorCallback& error_callback) { |
| 201 const NetworkState* network = | 188 const NetworkState* network = |
| 202 NetworkStateHandler::Get()->GetNetworkState(service_path); | 189 network_state_handler_->GetNetworkState(service_path); |
| 203 if (!network) { | 190 if (!network) { |
| 204 InvokeErrorCallback(service_path, error_callback, kErrorNotFound); | 191 InvokeErrorCallback(service_path, error_callback, kErrorNotFound); |
| 205 return; | 192 return; |
| 206 } | 193 } |
| 207 if (!network->IsConnectedState()) { | 194 if (!network->IsConnectedState()) { |
| 208 InvokeErrorCallback(service_path, error_callback, kErrorNotConnected); | 195 InvokeErrorCallback(service_path, error_callback, kErrorNotConnected); |
| 209 return; | 196 return; |
| 210 } | 197 } |
| 211 CallShillDisconnect(service_path, success_callback, error_callback); | 198 CallShillDisconnect(service_path, success_callback, error_callback); |
| 212 } | 199 } |
| 213 | 200 |
| 214 void NetworkConnectionHandler::CallShillConnect( | 201 void NetworkConnectionHandler::CallShillConnect( |
| 215 const std::string& service_path, | 202 const std::string& service_path, |
| 216 const base::Closure& success_callback, | 203 const base::Closure& success_callback, |
| 217 const network_handler::ErrorCallback& error_callback) { | 204 const network_handler::ErrorCallback& error_callback) { |
| 218 // TODO(stevenjb): Remove SetConnectingNetwork and use this class to maintain | 205 // TODO(stevenjb): Remove SetConnectingNetwork and use this class to maintain |
| 219 // the connecting network(s) once NetworkLibrary path is eliminated. | 206 // the connecting network(s) once NetworkLibrary path is eliminated. |
| 220 NetworkStateHandler::Get()->SetConnectingNetwork(service_path); | 207 network_state_handler_->SetConnectingNetwork(service_path); |
| 221 network_event_log::AddEntry(kLogModule, "Connect Request", service_path); | 208 network_event_log::AddEntry(kLogModule, "Connect Request", service_path); |
| 222 DBusThreadManager::Get()->GetShillServiceClient()->Connect( | 209 DBusThreadManager::Get()->GetShillServiceClient()->Connect( |
| 223 dbus::ObjectPath(service_path), | 210 dbus::ObjectPath(service_path), |
| 224 base::Bind(&NetworkConnectionHandler::HandleShillSuccess, | 211 base::Bind(&NetworkConnectionHandler::HandleShillSuccess, |
| 225 AsWeakPtr(), service_path, success_callback), | 212 AsWeakPtr(), service_path, success_callback), |
| 226 base::Bind(&NetworkConnectionHandler::HandleShillFailure, | 213 base::Bind(&NetworkConnectionHandler::HandleShillFailure, |
| 227 AsWeakPtr(), service_path, error_callback)); | 214 AsWeakPtr(), service_path, error_callback)); |
| 228 } | 215 } |
| 229 | 216 |
| 230 void NetworkConnectionHandler::CallShillDisconnect( | 217 void NetworkConnectionHandler::CallShillDisconnect( |
| 231 const std::string& service_path, | 218 const std::string& service_path, |
| 232 const base::Closure& success_callback, | 219 const base::Closure& success_callback, |
| 233 const network_handler::ErrorCallback& error_callback) { | 220 const network_handler::ErrorCallback& error_callback) { |
| 234 network_event_log::AddEntry(kLogModule, "Disconnect Request", service_path); | 221 network_event_log::AddEntry(kLogModule, "Disconnect Request", service_path); |
| 235 DBusThreadManager::Get()->GetShillServiceClient()->Disconnect( | 222 DBusThreadManager::Get()->GetShillServiceClient()->Disconnect( |
| 236 dbus::ObjectPath(service_path), | 223 dbus::ObjectPath(service_path), |
| 237 base::Bind(&NetworkConnectionHandler::HandleShillSuccess, | 224 base::Bind(&NetworkConnectionHandler::HandleShillSuccess, |
| 238 AsWeakPtr(), service_path, success_callback), | 225 AsWeakPtr(), service_path, success_callback), |
| 239 base::Bind(&NetworkConnectionHandler::HandleShillFailure, | 226 base::Bind(&NetworkConnectionHandler::HandleShillFailure, |
| 240 AsWeakPtr(), service_path, error_callback)); | 227 AsWeakPtr(), service_path, error_callback)); |
| 241 } | 228 } |
| 242 | 229 |
| 243 void NetworkConnectionHandler::VerifyConfiguredAndConnect( | 230 void NetworkConnectionHandler::VerifyConfiguredAndConnect( |
| 244 const base::Closure& success_callback, | 231 const base::Closure& success_callback, |
| 245 const network_handler::ErrorCallback& error_callback, | 232 const network_handler::ErrorCallback& error_callback, |
| 246 const std::string& service_path, | 233 const std::string& service_path, |
| 247 const base::DictionaryValue& properties) { | 234 const base::DictionaryValue& properties) { |
| 248 const NetworkState* network = | 235 const NetworkState* network = |
| 249 NetworkStateHandler::Get()->GetNetworkState(service_path); | 236 network_state_handler_->GetNetworkState(service_path); |
| 250 if (!network) { | 237 if (!network) { |
| 251 InvokeErrorCallback(service_path, error_callback, kErrorNotFound); | 238 InvokeErrorCallback(service_path, error_callback, kErrorNotFound); |
| 252 return; | 239 return; |
| 253 } | 240 } |
| 254 | 241 |
| 255 // VPN requires a host and username to be set. | 242 // VPN requires a host and username to be set. |
| 256 if (network->type() == flimflam::kTypeVPN && | 243 if (network->type() == flimflam::kTypeVPN && |
| 257 !VPNIsConfigured(properties)) { | 244 !VPNIsConfigured(properties)) { |
| 258 InvokeErrorCallback(service_path, error_callback, | 245 InvokeErrorCallback(service_path, error_callback, |
| 259 kErrorConfigurationRequired); | 246 kErrorConfigurationRequired); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 const network_handler::ErrorCallback& error_callback, | 287 const network_handler::ErrorCallback& error_callback, |
| 301 const std::string& error_name, | 288 const std::string& error_name, |
| 302 const std::string& error_message) { | 289 const std::string& error_message) { |
| 303 pending_requests_.erase(service_path); | 290 pending_requests_.erase(service_path); |
| 304 std::string error = "Connect Failure: " + error_name + ": " + error_message; | 291 std::string error = "Connect Failure: " + error_name + ": " + error_message; |
| 305 network_handler::ShillErrorCallbackFunction( | 292 network_handler::ShillErrorCallbackFunction( |
| 306 kLogModule, service_path, error_callback, error_name, error_message); | 293 kLogModule, service_path, error_callback, error_name, error_message); |
| 307 } | 294 } |
| 308 | 295 |
| 309 } // namespace chromeos | 296 } // namespace chromeos |
| OLD | NEW |