// Copyright 2015 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 "components/proximity_auth/proximity_auth_pref_manager.h" #include #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/prefs/pref_registry_simple.h" #include "base/prefs/pref_service.h" #include "base/prefs/scoped_user_pref_update.h" #include "base/values.h" #include "components/proximity_auth/logging/logging.h" #include "components/proximity_auth/proximity_auth_pref_names.h" namespace proximity_auth { ProximityAuthPrefManager::ProximityAuthPrefManager(PrefService* pref_service) : pref_service_(pref_service) {} ProximityAuthPrefManager::~ProximityAuthPrefManager() {} // static void ProximityAuthPrefManager::RegisterPrefs(PrefRegistrySimple* registry) { registry->RegisterDictionaryPref(prefs::kProximityAuthRemoteBleDevices); } bool ProximityAuthPrefManager::HasDeviceWithAddress( const std::string& bluetooth_address) const { return pref_service_->GetDictionary(prefs::kProximityAuthRemoteBleDevices) ->HasKey(bluetooth_address); } bool ProximityAuthPrefManager::HasDeviceWithPublicKey( const std::string& public_key) const { return !GetDeviceAddress(public_key).empty(); } std::string ProximityAuthPrefManager::GetDevicePublicKey( const std::string& bluetooth_address) const { std::string public_key; GetRemoteBleDevices()->GetStringWithoutPathExpansion(bluetooth_address, &public_key); return public_key; } std::string ProximityAuthPrefManager::GetDeviceAddress( const std::string& public_key) const { const base::DictionaryValue* remote_ble_devices = GetRemoteBleDevices(); for (base::DictionaryValue::Iterator it(*remote_ble_devices); !it.IsAtEnd(); it.Advance()) { std::string value_string; DCHECK(it.value().IsType(base::Value::TYPE_STRING)); if (it.value().GetAsString(&value_string) && value_string == public_key) return it.key(); } return std::string(); } std::vector ProximityAuthPrefManager::GetPublicKeys() const { std::vector public_keys; const base::DictionaryValue* remote_ble_devices = GetRemoteBleDevices(); for (base::DictionaryValue::Iterator it(*remote_ble_devices); !it.IsAtEnd(); it.Advance()) { std::string value_string; DCHECK(it.value().IsType(base::Value::TYPE_STRING)); it.value().GetAsString(&value_string); public_keys.push_back(value_string); } return public_keys; } void ProximityAuthPrefManager::AddOrUpdateDevice( const std::string& bluetooth_address, const std::string& public_key) { PA_LOG(INFO) << "Adding " << public_key << " , " << bluetooth_address << " pair."; if (HasDeviceWithPublicKey(public_key) && GetDeviceAddress(public_key) != bluetooth_address) { PA_LOG(WARNING) << "Two devices with different bluetooth address, but the " "same public key were added: " << public_key; RemoveDeviceWithPublicKey(public_key); } DictionaryPrefUpdate remote_ble_devices_update( pref_service_, prefs::kProximityAuthRemoteBleDevices); remote_ble_devices_update->SetStringWithoutPathExpansion(bluetooth_address, public_key); } bool ProximityAuthPrefManager::RemoveDeviceWithAddress( const std::string& bluetooth_address) { DictionaryPrefUpdate remote_ble_devices_update( pref_service_, prefs::kProximityAuthRemoteBleDevices); return remote_ble_devices_update->RemoveWithoutPathExpansion( bluetooth_address, nullptr); } bool ProximityAuthPrefManager::RemoveDeviceWithPublicKey( const std::string& public_key) { return RemoveDeviceWithAddress(GetDeviceAddress(public_key)); } const base::DictionaryValue* ProximityAuthPrefManager::GetRemoteBleDevices() const { return pref_service_->GetDictionary(prefs::kProximityAuthRemoteBleDevices); } } // namespace proximity_auth