// Copyright 2020 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 "chromeos/network/network_event_log.h" #include "base/strings/string_util.h" #include "chromeos/network/network_handler.h" #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" #include "chromeos/network/tether_constants.h" #include "third_party/cros_system_api/dbus/service_constants.h" namespace { constexpr char kServicePrefix[] = "/service/"; constexpr char kUnknownId[] = ""; chromeos::NetworkStateHandler* GetNetworkStateHandler() { if (!chromeos::NetworkHandler::IsInitialized()) return nullptr; return chromeos::NetworkHandler::Get()->network_state_handler(); } } // namespace namespace chromeos { // Returns a descriptive unique id for |network| // e.g.: ethernet_0, wifi_psk_1, cellular_lte_2, vpn_openvpn_3. std::string NetworkId(const NetworkState* network) { if (!network) return kUnknownId; const std::string& type = network->type(); if (type == kTypeTether) { // Tether uses a GUID for its service path. Use the first 8 digits. return type + "_" + network->path().substr(0, 8); } // Test networks may not follow the Shill pattern, just use the path. if (!base::StartsWith(network->path(), kServicePrefix, base::CompareCase::SENSITIVE)) { return network->path(); } std::string id = network->path().substr(strlen(kServicePrefix)); if (type.empty()) return "service_" + id; std::string result = type + "_"; if (type == shill::kTypeWifi) { result += network->security_class() + "_"; } else if (type == shill::kTypeCellular) { result += network->network_technology() + "_"; } else if (type == shill::kTypeVPN) { result += network->GetVpnProviderType() + "_"; } return result + id; } // Calls NetworkId() if a NetworkState for |service_path| exists, otherwise // returns service_{id}. If |service_path| does not represent a valid service // path (e.g. in tests), returns |service_path|. std::string NetworkPathId(const std::string& service_path) { NetworkStateHandler* handler = GetNetworkStateHandler(); if (handler) { const NetworkState* network = handler->GetNetworkState(service_path); if (network) return NetworkId(network); } if (!base::StartsWith(service_path, kServicePrefix, base::CompareCase::SENSITIVE)) { return service_path; } std::string id = service_path.substr(strlen(kServicePrefix)); return "service_" + id; } // Calls NetworkId() if a NetworkState exists for |guid|, otherwise // returns |guid|. std::string NetworkGuidId(const std::string& guid) { if (guid.empty()) return kUnknownId; NetworkStateHandler* handler = GetNetworkStateHandler(); if (handler) { const NetworkState* network = handler->GetNetworkStateFromGuid(guid); if (network) return NetworkId(network); } return guid; } } // namespace chromeos