Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Unified Diff: chromeos/components/tether/tether_disconnector_impl.cc

Issue 2975483002: [CrOS Tether] Disconnect cleanly from active Tether networks when the user logs out or the Tether c… (Closed)
Patch Set: hansberry@ comment. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromeos/components/tether/tether_disconnector_impl.cc
diff --git a/chromeos/components/tether/tether_disconnector.cc b/chromeos/components/tether/tether_disconnector_impl.cc
similarity index 72%
rename from chromeos/components/tether/tether_disconnector.cc
rename to chromeos/components/tether/tether_disconnector_impl.cc
index 65f8cefd30a4d279446dc606df642850dbfc7646..08141440a558b391b1ad111a7eeeb8e7fff43507 100644
--- a/chromeos/components/tether/tether_disconnector.cc
+++ b/chromeos/components/tether/tether_disconnector_impl.cc
@@ -2,24 +2,41 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chromeos/components/tether/tether_disconnector.h"
+#include "chromeos/components/tether/tether_disconnector_impl.h"
#include "base/values.h"
#include "chromeos/components/tether/active_host.h"
#include "chromeos/components/tether/device_id_tether_network_guid_map.h"
#include "chromeos/components/tether/network_configuration_remover.h"
+#include "chromeos/components/tether/pref_names.h"
#include "chromeos/components/tether/tether_connector.h"
#include "chromeos/components/tether/tether_host_fetcher.h"
#include "chromeos/network/network_connection_handler.h"
#include "chromeos/network/network_state.h"
#include "chromeos/network/network_state_handler.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/pref_service.h"
#include "components/proximity_auth/logging/logging.h"
namespace chromeos {
namespace tether {
-TetherDisconnector::TetherDisconnector(
+namespace {
+
+void OnDisconnectError(const std::string& error_name) {
+ PA_LOG(WARNING) << "Error disconnecting from Tether network during shutdown; "
+ << "Error name: " << error_name;
+}
+
+} // namespace
+
+// static
+void TetherDisconnectorImpl::RegisterPrefs(PrefRegistrySimple* registry) {
+ registry->RegisterStringPref(prefs::kDisconnectingWifiNetworkGuid, "");
+}
+
+TetherDisconnectorImpl::TetherDisconnectorImpl(
NetworkConnectionHandler* network_connection_handler,
NetworkStateHandler* network_state_handler,
ActiveHost* active_host,
@@ -27,7 +44,8 @@ TetherDisconnector::TetherDisconnector(
NetworkConfigurationRemover* network_configuration_remover,
TetherConnector* tether_connector,
DeviceIdTetherNetworkGuidMap* device_id_tether_network_guid_map,
- TetherHostFetcher* tether_host_fetcher)
+ TetherHostFetcher* tether_host_fetcher,
+ PrefService* pref_service)
: network_connection_handler_(network_connection_handler),
network_state_handler_(network_state_handler),
active_host_(active_host),
@@ -36,14 +54,34 @@ TetherDisconnector::TetherDisconnector(
tether_connector_(tether_connector),
device_id_tether_network_guid_map_(device_id_tether_network_guid_map),
tether_host_fetcher_(tether_host_fetcher),
- weak_ptr_factory_(this) {}
+ pref_service_(pref_service),
+ weak_ptr_factory_(this) {
+ std::string disconnecting_wifi_guid_from_previous_session =
+ pref_service_->GetString(prefs::kDisconnectingWifiNetworkGuid);
+ if (!disconnecting_wifi_guid_from_previous_session.empty()) {
+ // If a previous disconnection attempt was aborted before it could be fully
+ // completed, clean up the leftover network configuration.
+ network_configuration_remover_->RemoveNetworkConfiguration(
+ disconnecting_wifi_guid_from_previous_session);
+ pref_service_->ClearPref(prefs::kDisconnectingWifiNetworkGuid);
+ }
+}
-TetherDisconnector::~TetherDisconnector() {
+TetherDisconnectorImpl::~TetherDisconnectorImpl() {
if (disconnect_tethering_operation_)
disconnect_tethering_operation_->RemoveObserver(this);
+
+ std::string active_tether_guid = active_host_->GetTetherNetworkGuid();
+ if (!active_tether_guid.empty()) {
+ PA_LOG(INFO) << "There was an active Tether connection during Tether "
+ << "shutdown. Initiating disconnection from network with GUID "
+ << "\"" << active_tether_guid << "\"";
+ DisconnectFromNetwork(active_tether_guid, base::Bind(&base::DoNothing),
+ base::Bind(&OnDisconnectError));
+ }
}
-void TetherDisconnector::DisconnectFromNetwork(
+void TetherDisconnectorImpl::DisconnectFromNetwork(
const std::string& tether_network_guid,
const base::Closure& success_callback,
const network_handler::StringResultCallback& error_callback) {
@@ -92,7 +130,7 @@ void TetherDisconnector::DisconnectFromNetwork(
success_callback, error_callback);
}
-void TetherDisconnector::DisconnectActiveWifiConnection(
+void TetherDisconnectorImpl::DisconnectActiveWifiConnection(
const std::string& tether_network_guid,
const std::string& wifi_network_guid,
const base::Closure& success_callback,
@@ -105,15 +143,25 @@ void TetherDisconnector::DisconnectActiveWifiConnection(
// transition which needs to be fixed.
active_host_->SetActiveHostDisconnected();
+ // Before starting disconnection, log the disconnecting Wi-Fi GUID to prefs.
+ // Under normal circumstances, the GUID will be cleared as part of
+ // CleanUpAfterWifiDisconnection(). However, when the user logs out,
+ // this TetherDisconnectorImpl instance will be deleted before one of the
+ // callbacks passed below to DisconnectNetwork() can be called, and the
+ // GUID will remain in prefs until the next time the user logs in, at which
+ // time the associated network configuration can be removed.
+ pref_service_->Set(prefs::kDisconnectingWifiNetworkGuid,
+ base::Value(wifi_network_guid));
+
const NetworkState* wifi_network_state =
network_state_handler_->GetNetworkStateFromGuid(wifi_network_guid);
if (wifi_network_state) {
network_connection_handler_->DisconnectNetwork(
wifi_network_state->path(),
- base::Bind(&TetherDisconnector::OnSuccessfulWifiDisconnect,
+ base::Bind(&TetherDisconnectorImpl::OnSuccessfulWifiDisconnect,
weak_ptr_factory_.GetWeakPtr(), wifi_network_guid,
success_callback, error_callback),
- base::Bind(&TetherDisconnector::OnFailedWifiDisconnect,
+ base::Bind(&TetherDisconnectorImpl::OnFailedWifiDisconnect,
weak_ptr_factory_.GetWeakPtr(), wifi_network_guid,
success_callback, error_callback));
} else {
@@ -129,12 +177,12 @@ void TetherDisconnector::DisconnectActiveWifiConnection(
device_id_tether_network_guid_map_->GetDeviceIdForTetherNetworkGuid(
tether_network_guid);
tether_host_fetcher_->FetchTetherHost(
- device_id, base::Bind(&TetherDisconnector::OnTetherHostFetched,
+ device_id, base::Bind(&TetherDisconnectorImpl::OnTetherHostFetched,
weak_ptr_factory_.GetWeakPtr(), device_id));
}
-void TetherDisconnector::OnOperationFinished(const std::string& device_id,
- bool success) {
+void TetherDisconnectorImpl::OnOperationFinished(const std::string& device_id,
+ bool success) {
if (success) {
PA_LOG(INFO) << "Successfully sent DisconnectTetheringRequest to device "
<< "with ID "
@@ -152,7 +200,7 @@ void TetherDisconnector::OnOperationFinished(const std::string& device_id,
disconnect_tethering_operation_.reset();
}
-void TetherDisconnector::OnSuccessfulWifiDisconnect(
+void TetherDisconnectorImpl::OnSuccessfulWifiDisconnect(
const std::string& wifi_network_guid,
const base::Closure& success_callback,
const network_handler::StringResultCallback& error_callback) {
@@ -162,7 +210,7 @@ void TetherDisconnector::OnSuccessfulWifiDisconnect(
success_callback, error_callback);
}
-void TetherDisconnector::OnFailedWifiDisconnect(
+void TetherDisconnectorImpl::OnFailedWifiDisconnect(
const std::string& wifi_network_guid,
const base::Closure& success_callback,
const network_handler::StringResultCallback& error_callback,
@@ -174,20 +222,21 @@ void TetherDisconnector::OnFailedWifiDisconnect(
success_callback, error_callback);
}
-void TetherDisconnector::CleanUpAfterWifiDisconnection(
+void TetherDisconnectorImpl::CleanUpAfterWifiDisconnection(
bool success,
const std::string& wifi_network_guid,
const base::Closure& success_callback,
const network_handler::StringResultCallback& error_callback) {
+ network_configuration_remover_->RemoveNetworkConfiguration(wifi_network_guid);
+ pref_service_->ClearPref(prefs::kDisconnectingWifiNetworkGuid);
+
if (success)
success_callback.Run();
else
error_callback.Run(NetworkConnectionHandler::kErrorDisconnectFailed);
-
- network_configuration_remover_->RemoveNetworkConfiguration(wifi_network_guid);
}
-void TetherDisconnector::OnTetherHostFetched(
+void TetherDisconnectorImpl::OnTetherHostFetched(
const std::string& device_id,
std::unique_ptr<cryptauth::RemoteDevice> tether_host) {
if (!tether_host) {
« no previous file with comments | « chromeos/components/tether/tether_disconnector_impl.h ('k') | chromeos/components/tether/tether_disconnector_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698