Commit dd29c6a1 authored by Kyle Horimoto's avatar Kyle Horimoto Committed by Commit Bot

[CrOS PhoneHub] Add SetNearbyConnector() Mojo API

This function allows clients to set a NearbyConnector to be used when
attempting a Nearby Connection.

Within the SecureChannel implementation, connection requests are
rejected with the newly-added MISSING_NEARBY_CONNECTOR failure reason if
a connection is requested when a NearbyConnector has not been set. A
future CL will use the provided NearbyConnector when initiating a
connection.

On the client side, NearbyConnectorFactory now sets the NearbyConnector
instance when it is created. PhoneHubManagerFactory adds a dependency on
NearbyConnectorFactory to ensure that the NearbyConnector is set before
Phone Hub starts up.

Bug: 1106937
Change-Id: I6f25aa9be817c0bb15c19045d2c4e9494b674368
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2513748
Commit-Queue: Kyle Horimoto <khorimoto@chromium.org>
Reviewed-by: default avatarRyan Hansberry <hansberry@chromium.org>
Reviewed-by: default avatarJames Vecore <vecore@google.com>
Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#825047}
parent 511e3d59
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "chrome/browser/chromeos/phonehub/browser_tabs_metadata_fetcher_impl.h" #include "chrome/browser/chromeos/phonehub/browser_tabs_metadata_fetcher_impl.h"
#include "chrome/browser/chromeos/phonehub/browser_tabs_model_provider_impl.h" #include "chrome/browser/chromeos/phonehub/browser_tabs_model_provider_impl.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/chromeos/secure_channel/nearby_connector_factory.h"
#include "chrome/browser/chromeos/secure_channel/secure_channel_client_provider.h" #include "chrome/browser/chromeos/secure_channel/secure_channel_client_provider.h"
#include "chrome/browser/favicon/history_ui_favicon_request_handler_factory.h" #include "chrome/browser/favicon/history_ui_favicon_request_handler_factory.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
...@@ -65,6 +66,7 @@ PhoneHubManagerFactory::PhoneHubManagerFactory() ...@@ -65,6 +66,7 @@ PhoneHubManagerFactory::PhoneHubManagerFactory()
BrowserContextDependencyManager::GetInstance()) { BrowserContextDependencyManager::GetInstance()) {
DependsOn(device_sync::DeviceSyncClientFactory::GetInstance()); DependsOn(device_sync::DeviceSyncClientFactory::GetInstance());
DependsOn(multidevice_setup::MultiDeviceSetupClientFactory::GetInstance()); DependsOn(multidevice_setup::MultiDeviceSetupClientFactory::GetInstance());
DependsOn(secure_channel::NearbyConnectorFactory::GetInstance());
DependsOn(SessionSyncServiceFactory::GetInstance()); DependsOn(SessionSyncServiceFactory::GetInstance());
DependsOn(HistoryUiFaviconRequestHandlerFactory::GetInstance()); DependsOn(HistoryUiFaviconRequestHandlerFactory::GetInstance());
} }
......
...@@ -6,7 +6,9 @@ ...@@ -6,7 +6,9 @@
#include "chrome/browser/chromeos/nearby/nearby_process_manager_factory.h" #include "chrome/browser/chromeos/nearby/nearby_process_manager_factory.h"
#include "chrome/browser/chromeos/secure_channel/nearby_connector_impl.h" #include "chrome/browser/chromeos/secure_channel/nearby_connector_impl.h"
#include "chrome/browser/chromeos/secure_channel/secure_channel_client_provider.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chromeos/services/secure_channel/public/cpp/client/secure_channel_client.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/keyed_service/content/browser_context_dependency_manager.h"
namespace chromeos { namespace chromeos {
...@@ -44,7 +46,11 @@ KeyedService* NearbyConnectorFactory::BuildServiceInstanceFor( ...@@ -44,7 +46,11 @@ KeyedService* NearbyConnectorFactory::BuildServiceInstanceFor(
if (!nearby_process_manager) if (!nearby_process_manager)
return nullptr; return nullptr;
return new NearbyConnectorImpl(nearby_process_manager); auto nearby_connector =
std::make_unique<NearbyConnectorImpl>(nearby_process_manager);
SecureChannelClientProvider::GetInstance()->GetClient()->SetNearbyConnector(
nearby_connector.get());
return nearby_connector.release();
} }
bool NearbyConnectorFactory::ServiceIsCreatedWithBrowserContext() const { bool NearbyConnectorFactory::ServiceIsCreatedWithBrowserContext() const {
......
...@@ -327,6 +327,7 @@ source_set("unit_tests") { ...@@ -327,6 +327,7 @@ source_set("unit_tests") {
"//chromeos/components/multidevice", "//chromeos/components/multidevice",
"//chromeos/components/multidevice:test_support", "//chromeos/components/multidevice:test_support",
"//chromeos/components/multidevice/logging", "//chromeos/components/multidevice/logging",
"//chromeos/services/secure_channel/public/cpp/client:test_support",
"//chromeos/services/secure_channel/public/cpp/client:unit_tests", "//chromeos/services/secure_channel/public/cpp/client:unit_tests",
"//chromeos/services/secure_channel/public/cpp/shared", "//chromeos/services/secure_channel/public/cpp/shared",
"//chromeos/services/secure_channel/public/mojom", "//chromeos/services/secure_channel/public/mojom",
......
...@@ -51,6 +51,8 @@ class FakeSecureChannel : public SecureChannelBase { ...@@ -51,6 +51,8 @@ class FakeSecureChannel : public SecureChannelBase {
ConnectionMedium connection_medium, ConnectionMedium connection_medium,
ConnectionPriority connection_priority, ConnectionPriority connection_priority,
mojo::PendingRemote<mojom::ConnectionDelegate> delegate) override; mojo::PendingRemote<mojom::ConnectionDelegate> delegate) override;
void SetNearbyConnector(
mojo::PendingRemote<mojom::NearbyConnector> nearby_connector) override {}
mojo::Remote<mojom::ConnectionDelegate> delegate_from_last_listen_call_; mojo::Remote<mojom::ConnectionDelegate> delegate_from_last_listen_call_;
mojo::Remote<mojom::ConnectionDelegate> delegate_from_last_initiate_call_; mojo::Remote<mojom::ConnectionDelegate> delegate_from_last_initiate_call_;
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "chromeos/services/secure_channel/nearby_connection.h" #include "chromeos/services/secure_channel/nearby_connection.h"
#include "base/check.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
namespace chromeos { namespace chromeos {
...@@ -16,11 +17,13 @@ NearbyConnection::Factory* NearbyConnection::Factory::factory_instance_ = ...@@ -16,11 +17,13 @@ NearbyConnection::Factory* NearbyConnection::Factory::factory_instance_ =
// static // static
std::unique_ptr<Connection> NearbyConnection::Factory::Create( std::unique_ptr<Connection> NearbyConnection::Factory::Create(
multidevice::RemoteDeviceRef remote_device) { multidevice::RemoteDeviceRef remote_device,
mojom::NearbyConnector* nearby_connector) {
if (factory_instance_) if (factory_instance_)
return factory_instance_->CreateInstance(remote_device); return factory_instance_->CreateInstance(remote_device, nearby_connector);
return base::WrapUnique(new NearbyConnection(remote_device)); return base::WrapUnique(
new NearbyConnection(remote_device, nearby_connector));
} }
// static // static
...@@ -28,8 +31,11 @@ void NearbyConnection::Factory::SetFactoryForTesting(Factory* factory) { ...@@ -28,8 +31,11 @@ void NearbyConnection::Factory::SetFactoryForTesting(Factory* factory) {
factory_instance_ = factory; factory_instance_ = factory;
} }
NearbyConnection::NearbyConnection(multidevice::RemoteDeviceRef remote_device) NearbyConnection::NearbyConnection(multidevice::RemoteDeviceRef remote_device,
: Connection(remote_device) {} mojom::NearbyConnector* nearby_connector)
: Connection(remote_device), nearby_connector_(nearby_connector) {
DCHECK(nearby_connector_);
}
NearbyConnection::~NearbyConnection() { NearbyConnection::~NearbyConnection() {
// TODO(https://crbug.com/1106937): Clean up potentially-lingering connection. // TODO(https://crbug.com/1106937): Clean up potentially-lingering connection.
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define CHROMEOS_SERVICES_SECURE_CHANNEL_NEARBY_CONNECTION_H_ #define CHROMEOS_SERVICES_SECURE_CHANNEL_NEARBY_CONNECTION_H_
#include "chromeos/services/secure_channel/connection.h" #include "chromeos/services/secure_channel/connection.h"
#include "chromeos/services/secure_channel/public/mojom/nearby_connector.mojom.h"
namespace chromeos { namespace chromeos {
...@@ -19,13 +20,15 @@ class NearbyConnection : public Connection { ...@@ -19,13 +20,15 @@ class NearbyConnection : public Connection {
class Factory { class Factory {
public: public:
static std::unique_ptr<Connection> Create( static std::unique_ptr<Connection> Create(
multidevice::RemoteDeviceRef remote_device); multidevice::RemoteDeviceRef remote_device,
mojom::NearbyConnector* nearby_connector);
static void SetFactoryForTesting(Factory* factory); static void SetFactoryForTesting(Factory* factory);
virtual ~Factory() = default; virtual ~Factory() = default;
protected: protected:
virtual std::unique_ptr<Connection> CreateInstance( virtual std::unique_ptr<Connection> CreateInstance(
multidevice::RemoteDeviceRef remote_device) = 0; multidevice::RemoteDeviceRef remote_device,
mojom::NearbyConnector* nearby_connector) = 0;
private: private:
static Factory* factory_instance_; static Factory* factory_instance_;
...@@ -34,13 +37,16 @@ class NearbyConnection : public Connection { ...@@ -34,13 +37,16 @@ class NearbyConnection : public Connection {
~NearbyConnection() override; ~NearbyConnection() override;
private: private:
NearbyConnection(multidevice::RemoteDeviceRef remote_device); NearbyConnection(multidevice::RemoteDeviceRef remote_device,
mojom::NearbyConnector* nearby_connector);
// Connection: // Connection:
void Connect() override; void Connect() override;
void Disconnect() override; void Disconnect() override;
std::string GetDeviceAddress() override; std::string GetDeviceAddress() override;
void SendMessageImpl(std::unique_ptr<WireMessage> message) override; void SendMessageImpl(std::unique_ptr<WireMessage> message) override;
mojom::NearbyConnector* nearby_connector_;
}; };
} // namespace secure_channel } // namespace secure_channel
......
...@@ -26,6 +26,18 @@ NearbyConnectionManager::NearbyConnectionManager() = default; ...@@ -26,6 +26,18 @@ NearbyConnectionManager::NearbyConnectionManager() = default;
NearbyConnectionManager::~NearbyConnectionManager() = default; NearbyConnectionManager::~NearbyConnectionManager() = default;
void NearbyConnectionManager::SetNearbyConnector(
mojo::PendingRemote<mojom::NearbyConnector> nearby_connector) {
if (nearby_connector_)
nearby_connector_.reset();
nearby_connector_.Bind(std::move(nearby_connector));
}
bool NearbyConnectionManager::IsNearbyConnectorSet() const {
return nearby_connector_.is_bound();
}
void NearbyConnectionManager::AttemptNearbyInitiatorConnection( void NearbyConnectionManager::AttemptNearbyInitiatorConnection(
const DeviceIdPair& device_id_pair, const DeviceIdPair& device_id_pair,
ConnectionSuccessCallback success_callback, ConnectionSuccessCallback success_callback,
...@@ -56,6 +68,12 @@ void NearbyConnectionManager::CancelNearbyInitiatorConnectionAttempt( ...@@ -56,6 +68,12 @@ void NearbyConnectionManager::CancelNearbyInitiatorConnectionAttempt(
PerformCancelNearbyInitiatorConnectionAttempt(device_id_pair); PerformCancelNearbyInitiatorConnectionAttempt(device_id_pair);
} }
mojom::NearbyConnector* NearbyConnectionManager::GetNearbyConnector() {
if (!nearby_connector_.is_bound())
return nullptr;
return nearby_connector_.get();
}
const base::flat_set<DeviceIdPair>& const base::flat_set<DeviceIdPair>&
NearbyConnectionManager::GetDeviceIdPairsForRemoteDevice( NearbyConnectionManager::GetDeviceIdPairsForRemoteDevice(
const std::string& remote_device_id) const { const std::string& remote_device_id) const {
......
...@@ -13,6 +13,9 @@ ...@@ -13,6 +13,9 @@
#include "base/macros.h" #include "base/macros.h"
#include "chromeos/services/secure_channel/device_id_pair.h" #include "chromeos/services/secure_channel/device_id_pair.h"
#include "chromeos/services/secure_channel/nearby_initiator_failure_type.h" #include "chromeos/services/secure_channel/nearby_initiator_failure_type.h"
#include "chromeos/services/secure_channel/public/mojom/nearby_connector.mojom.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace chromeos { namespace chromeos {
...@@ -27,6 +30,11 @@ class NearbyConnectionManager { ...@@ -27,6 +30,11 @@ class NearbyConnectionManager {
NearbyConnectionManager& operator=(const NearbyConnectionManager&) = delete; NearbyConnectionManager& operator=(const NearbyConnectionManager&) = delete;
virtual ~NearbyConnectionManager(); virtual ~NearbyConnectionManager();
// Note: NearbyConnector must be set before connections can be requested.
void SetNearbyConnector(
mojo::PendingRemote<mojom::NearbyConnector> nearby_connector);
bool IsNearbyConnectorSet() const;
using ConnectionSuccessCallback = using ConnectionSuccessCallback =
base::OnceCallback<void(std::unique_ptr<AuthenticatedChannel>)>; base::OnceCallback<void(std::unique_ptr<AuthenticatedChannel>)>;
using FailureCallback = using FailureCallback =
...@@ -52,6 +60,8 @@ class NearbyConnectionManager { ...@@ -52,6 +60,8 @@ class NearbyConnectionManager {
virtual void PerformCancelNearbyInitiatorConnectionAttempt( virtual void PerformCancelNearbyInitiatorConnectionAttempt(
const DeviceIdPair& device_id_pair) = 0; const DeviceIdPair& device_id_pair) = 0;
mojom::NearbyConnector* GetNearbyConnector();
const base::flat_set<DeviceIdPair>& GetDeviceIdPairsForRemoteDevice( const base::flat_set<DeviceIdPair>& GetDeviceIdPairsForRemoteDevice(
const std::string& remote_device_id) const; const std::string& remote_device_id) const;
bool DoesAttemptExist(const DeviceIdPair& device_id_pair); bool DoesAttemptExist(const DeviceIdPair& device_id_pair);
...@@ -77,6 +87,7 @@ class NearbyConnectionManager { ...@@ -77,6 +87,7 @@ class NearbyConnectionManager {
const DeviceIdPair& device_id_pair); const DeviceIdPair& device_id_pair);
void RemoveRequestMetadata(const DeviceIdPair& device_id_pair); void RemoveRequestMetadata(const DeviceIdPair& device_id_pair);
mojo::Remote<mojom::NearbyConnector> nearby_connector_;
base::flat_map<std::string, base::flat_set<DeviceIdPair>> base::flat_map<std::string, base::flat_set<DeviceIdPair>>
remote_device_id_to_id_pair_map_; remote_device_id_to_id_pair_map_;
base::flat_map<DeviceIdPair, base::flat_map<DeviceIdPair,
......
...@@ -93,7 +93,7 @@ void NearbyConnectionManagerImpl::OnReceivedAdvertisement( ...@@ -93,7 +93,7 @@ void NearbyConnectionManagerImpl::OnReceivedAdvertisement(
// Create a connection to the device. // Create a connection to the device.
std::unique_ptr<Connection> connection = std::unique_ptr<Connection> connection =
NearbyConnection::Factory::Create(remote_device); NearbyConnection::Factory::Create(remote_device, GetNearbyConnector());
SetAuthenticatingChannel( SetAuthenticatingChannel(
remote_device.GetDeviceId(), remote_device.GetDeviceId(),
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "chromeos/services/secure_channel/fake_secure_channel_connection.h" #include "chromeos/services/secure_channel/fake_secure_channel_connection.h"
#include "chromeos/services/secure_channel/fake_secure_channel_disconnector.h" #include "chromeos/services/secure_channel/fake_secure_channel_disconnector.h"
#include "chromeos/services/secure_channel/nearby_connection.h" #include "chromeos/services/secure_channel/nearby_connection.h"
#include "chromeos/services/secure_channel/public/cpp/client/fake_nearby_connector.h"
#include "chromeos/services/secure_channel/secure_channel.h" #include "chromeos/services/secure_channel/secure_channel.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -39,7 +40,8 @@ class FakeNearbyConnectionFactory : public NearbyConnection::Factory { ...@@ -39,7 +40,8 @@ class FakeNearbyConnectionFactory : public NearbyConnection::Factory {
private: private:
// cryptauth::NearbyConnection::Factory: // cryptauth::NearbyConnection::Factory:
std::unique_ptr<Connection> CreateInstance( std::unique_ptr<Connection> CreateInstance(
multidevice::RemoteDeviceRef remote_device) override { multidevice::RemoteDeviceRef remote_device,
mojom::NearbyConnector* nearby_connector) override {
auto instance = std::make_unique<FakeConnection>(remote_device); auto instance = std::make_unique<FakeConnection>(remote_device);
last_created_instance_ = instance.get(); last_created_instance_ = instance.get();
return instance; return instance;
...@@ -146,6 +148,12 @@ class SecureChannelNearbyConnectionManagerImplTest : public testing::Test { ...@@ -146,6 +148,12 @@ class SecureChannelNearbyConnectionManagerImplTest : public testing::Test {
manager_ = NearbyConnectionManagerImpl::Factory::Create( manager_ = NearbyConnectionManagerImpl::Factory::Create(
fake_ble_scanner_.get(), fake_secure_channel_disconnector_.get()); fake_ble_scanner_.get(), fake_secure_channel_disconnector_.get());
EXPECT_FALSE(manager_->IsNearbyConnectorSet());
fake_nearby_connector_ = std::make_unique<FakeNearbyConnector>();
manager_->SetNearbyConnector(
fake_nearby_connector_->GeneratePendingRemote());
EXPECT_TRUE(manager_->IsNearbyConnectorSet());
} }
void TearDown() override { void TearDown() override {
...@@ -361,6 +369,7 @@ class SecureChannelNearbyConnectionManagerImplTest : public testing::Test { ...@@ -361,6 +369,7 @@ class SecureChannelNearbyConnectionManagerImplTest : public testing::Test {
std::unique_ptr<FakeBleScanner> fake_ble_scanner_; std::unique_ptr<FakeBleScanner> fake_ble_scanner_;
std::unique_ptr<FakeSecureChannelDisconnector> std::unique_ptr<FakeSecureChannelDisconnector>
fake_secure_channel_disconnector_; fake_secure_channel_disconnector_;
std::unique_ptr<FakeNearbyConnector> fake_nearby_connector_;
std::unique_ptr<NearbyConnectionManager> manager_; std::unique_ptr<NearbyConnectionManager> manager_;
}; };
......
...@@ -131,6 +131,7 @@ class FakeSecureChannelClient : public SecureChannelClient { ...@@ -131,6 +131,7 @@ class FakeSecureChannelClient : public SecureChannelClient {
const std::string& feature, const std::string& feature,
ConnectionMedium connection_medium, ConnectionMedium connection_medium,
ConnectionPriority connection_priority) override; ConnectionPriority connection_priority) override;
void SetNearbyConnector(NearbyConnector* nearby_connector) override {}
private: private:
// First element of pair is remote device, second is local device. // First element of pair is remote device, second is local device.
......
...@@ -18,6 +18,7 @@ namespace chromeos { ...@@ -18,6 +18,7 @@ namespace chromeos {
namespace secure_channel { namespace secure_channel {
class ConnectionAttempt; class ConnectionAttempt;
class NearbyConnector;
// Provides clients access to the SecureChannel API. // Provides clients access to the SecureChannel API.
// //
...@@ -67,6 +68,7 @@ class SecureChannelClient { ...@@ -67,6 +68,7 @@ class SecureChannelClient {
const std::string& feature, const std::string& feature,
ConnectionMedium connection_medium, ConnectionMedium connection_medium,
ConnectionPriority connection_priority) = 0; ConnectionPriority connection_priority) = 0;
virtual void SetNearbyConnector(NearbyConnector* nearby_connector) = 0;
protected: protected:
SecureChannelClient() = default; SecureChannelClient() = default;
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/task_runner.h" #include "base/task_runner.h"
#include "chromeos/services/secure_channel/public/cpp/client/connection_attempt_impl.h" #include "chromeos/services/secure_channel/public/cpp/client/connection_attempt_impl.h"
#include "chromeos/services/secure_channel/public/cpp/client/nearby_connector.h"
namespace chromeos { namespace chromeos {
...@@ -90,6 +91,12 @@ SecureChannelClientImpl::ListenForConnectionFromDevice( ...@@ -90,6 +91,12 @@ SecureChannelClientImpl::ListenForConnectionFromDevice(
return connection_attempt; return connection_attempt;
} }
void SecureChannelClientImpl::SetNearbyConnector(
NearbyConnector* nearby_connector) {
secure_channel_remote_->SetNearbyConnector(
nearby_connector->GeneratePendingRemote());
}
void SecureChannelClientImpl::PerformInitiateConnectionToDevice( void SecureChannelClientImpl::PerformInitiateConnectionToDevice(
multidevice::RemoteDeviceRef device_to_connect, multidevice::RemoteDeviceRef device_to_connect,
multidevice::RemoteDeviceRef local_device, multidevice::RemoteDeviceRef local_device,
......
...@@ -61,6 +61,7 @@ class SecureChannelClientImpl : public SecureChannelClient { ...@@ -61,6 +61,7 @@ class SecureChannelClientImpl : public SecureChannelClient {
const std::string& feature, const std::string& feature,
ConnectionMedium connection_medium, ConnectionMedium connection_medium,
ConnectionPriority connection_priority) override; ConnectionPriority connection_priority) override;
void SetNearbyConnector(NearbyConnector* nearby_connector) override;
void PerformInitiateConnectionToDevice( void PerformInitiateConnectionToDevice(
multidevice::RemoteDeviceRef device_to_connect, multidevice::RemoteDeviceRef device_to_connect,
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
module chromeos.secure_channel.mojom; module chromeos.secure_channel.mojom;
import "chromeos/components/multidevice/mojom/multidevice_types.mojom"; import "chromeos/components/multidevice/mojom/multidevice_types.mojom";
import "chromeos/services/secure_channel/public/mojom/nearby_connector.mojom";
enum ConnectionAttemptFailureReason { enum ConnectionAttemptFailureReason {
// The local device could not authenticate with the remote device. This likely // The local device could not authenticate with the remote device. This likely
...@@ -55,7 +56,11 @@ enum ConnectionAttemptFailureReason { ...@@ -55,7 +56,11 @@ enum ConnectionAttemptFailureReason {
// Tried to connect using a role which is unsupported for the connection // Tried to connect using a role which is unsupported for the connection
// medium (e.g., Nearby Connections only supports the listener role, not the // medium (e.g., Nearby Connections only supports the listener role, not the
// initiator role). // initiator role).
UNSUPPORTED_ROLE_FOR_MEDIUM UNSUPPORTED_ROLE_FOR_MEDIUM,
// Tried requesting a connection via Nearby Connections, but no
// NearbyConnector was provided.
MISSING_NEARBY_CONNECTOR
}; };
enum ConnectionCreationDetail { enum ConnectionCreationDetail {
...@@ -183,6 +188,9 @@ interface ConnectionDelegate { ...@@ -183,6 +188,9 @@ interface ConnectionDelegate {
// establish connections to phones belonging to each account on the device, so // establish connections to phones belonging to each account on the device, so
// each of these connection attempts uses a different local device. // each of these connection attempts uses a different local device.
// //
// If a Nearby-based connection is requested, clients must first invoke
// SetNearbyConnector().
//
// Note: Each API function results in either one connection (success case) // Note: Each API function results in either one connection (success case)
// or zero connections (failure case). Clients wishing to initiate another // or zero connections (failure case). Clients wishing to initiate another
// connection after the first one has completed should invoke the API again. // connection after the first one has completed should invoke the API again.
...@@ -216,4 +224,9 @@ interface SecureChannel { ...@@ -216,4 +224,9 @@ interface SecureChannel {
ConnectionMedium connection_medium, ConnectionMedium connection_medium,
ConnectionPriority connection_priority, ConnectionPriority connection_priority,
pending_remote<ConnectionDelegate> delegate); pending_remote<ConnectionDelegate> delegate);
// Sets a NearbyConnector to be used by future connection requests. Must be
// called before requesting a connection with
// ConnectionMedium::kNearbyConnections. Should only be called once.
SetNearbyConnector(pending_remote<NearbyConnector> nearby_connector);
}; };
...@@ -126,6 +126,11 @@ void SecureChannelImpl::InitiateConnectionToDevice( ...@@ -126,6 +126,11 @@ void SecureChannelImpl::InitiateConnectionToDevice(
ConnectionRole::kInitiatorRole, connection_priority, connection_medium); ConnectionRole::kInitiatorRole, connection_priority, connection_medium);
} }
void SecureChannelImpl::SetNearbyConnector(
mojo::PendingRemote<mojom::NearbyConnector> nearby_connector) {
nearby_connection_manager_->SetNearbyConnector(std::move(nearby_connector));
}
void SecureChannelImpl::OnDisconnected( void SecureChannelImpl::OnDisconnected(
const ConnectionDetails& connection_details) { const ConnectionDetails& connection_details) {
auto pending_requests_it = auto pending_requests_it =
...@@ -218,9 +223,9 @@ void SecureChannelImpl::ProcessConnectionRequest( ...@@ -218,9 +223,9 @@ void SecureChannelImpl::ProcessConnectionRequest(
switch (connection_medium) { switch (connection_medium) {
case ConnectionMedium::kNearbyConnections: case ConnectionMedium::kNearbyConnections:
// Nearby Connections only supports certain roles. // Nearby Connections only supports certain roles.
if (CheckForInvalidNearbyRole(api_fn_name, if (CheckForInvalidNearbyRequest(api_fn_name,
client_connection_parameters.get(), client_connection_parameters.get(),
connection_role)) { connection_role)) {
return; return;
} }
...@@ -362,7 +367,7 @@ bool SecureChannelImpl::CheckForInvalidInputDevice( ...@@ -362,7 +367,7 @@ bool SecureChannelImpl::CheckForInvalidInputDevice(
return true; return true;
} }
bool SecureChannelImpl::CheckForInvalidNearbyRole( bool SecureChannelImpl::CheckForInvalidNearbyRequest(
ApiFunctionName api_fn_name, ApiFunctionName api_fn_name,
ClientConnectionParameters* client_connection_parameters, ClientConnectionParameters* client_connection_parameters,
ConnectionRole connection_role) { ConnectionRole connection_role) {
...@@ -374,6 +379,14 @@ bool SecureChannelImpl::CheckForInvalidNearbyRole( ...@@ -374,6 +379,14 @@ bool SecureChannelImpl::CheckForInvalidNearbyRole(
return true; return true;
} }
if (!nearby_connection_manager_->IsNearbyConnectorSet()) {
RejectRequestForReason(
api_fn_name,
mojom::ConnectionAttemptFailureReason::MISSING_NEARBY_CONNECTOR,
client_connection_parameters);
return true;
}
return false; return false;
} }
......
...@@ -114,6 +114,8 @@ class SecureChannelImpl : public mojom::SecureChannel, ...@@ -114,6 +114,8 @@ class SecureChannelImpl : public mojom::SecureChannel,
ConnectionMedium connection_medium, ConnectionMedium connection_medium,
ConnectionPriority connection_priority, ConnectionPriority connection_priority,
mojo::PendingRemote<mojom::ConnectionDelegate> delegate) override; mojo::PendingRemote<mojom::ConnectionDelegate> delegate) override;
void SetNearbyConnector(
mojo::PendingRemote<mojom::NearbyConnector> nearby_connector) override;
// ActiveConnectionManager::Delegate: // ActiveConnectionManager::Delegate:
void OnDisconnected(const ConnectionDetails& connection_details) override; void OnDisconnected(const ConnectionDetails& connection_details) override;
...@@ -154,7 +156,7 @@ class SecureChannelImpl : public mojom::SecureChannel, ...@@ -154,7 +156,7 @@ class SecureChannelImpl : public mojom::SecureChannel,
// Checks for whether |connection_role| is valid for a connection via the // Checks for whether |connection_role| is valid for a connection via the
// Nearby Connections library. // Nearby Connections library.
bool CheckForInvalidNearbyRole( bool CheckForInvalidNearbyRequest(
ApiFunctionName api_fn_name, ApiFunctionName api_fn_name,
ClientConnectionParameters* client_connection_parameters, ClientConnectionParameters* client_connection_parameters,
ConnectionRole connection_role); ConnectionRole connection_role);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "chromeos/components/multidevice/logging/logging.h" #include "chromeos/components/multidevice/logging/logging.h"
#include "chromeos/services/secure_channel/secure_channel_impl.h" #include "chromeos/services/secure_channel/secure_channel_impl.h"
#include "device/bluetooth/bluetooth_adapter_factory.h" #include "device/bluetooth/bluetooth_adapter_factory.h"
#include "device/bluetooth/dbus/bluez_dbus_manager.h"
namespace chromeos { namespace chromeos {
...@@ -56,6 +57,10 @@ SecureChannelInitializer::ConnectionRequestArgs::~ConnectionRequestArgs() = ...@@ -56,6 +57,10 @@ SecureChannelInitializer::ConnectionRequestArgs::~ConnectionRequestArgs() =
SecureChannelInitializer::SecureChannelInitializer( SecureChannelInitializer::SecureChannelInitializer(
scoped_refptr<base::TaskRunner> task_runner) { scoped_refptr<base::TaskRunner> task_runner) {
// May not be initialized in tests.
if (!bluez::BluezDBusManager::IsInitialized())
return;
PA_LOG(VERBOSE) << "SecureChannelInitializer::SecureChannelInitializer(): " PA_LOG(VERBOSE) << "SecureChannelInitializer::SecureChannelInitializer(): "
<< "Fetching Bluetooth adapter. All requests received before " << "Fetching Bluetooth adapter. All requests received before "
<< "the adapter is fetched will be queued."; << "the adapter is fetched will be queued.";
...@@ -113,6 +118,16 @@ void SecureChannelInitializer::InitiateConnectionToDevice( ...@@ -113,6 +118,16 @@ void SecureChannelInitializer::InitiateConnectionToDevice(
connection_priority, std::move(delegate), false /* is_listen_request */)); connection_priority, std::move(delegate), false /* is_listen_request */));
} }
void SecureChannelInitializer::SetNearbyConnector(
mojo::PendingRemote<mojom::NearbyConnector> nearby_connector) {
if (secure_channel_impl_) {
secure_channel_impl_->SetNearbyConnector(std::move(nearby_connector));
return;
}
nearby_connector_ = std::move(nearby_connector);
}
void SecureChannelInitializer::OnBluetoothAdapterReceived( void SecureChannelInitializer::OnBluetoothAdapterReceived(
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) { scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) {
PA_LOG(VERBOSE) << "SecureChannelInitializer::OnBluetoothAdapterReceived(): " PA_LOG(VERBOSE) << "SecureChannelInitializer::OnBluetoothAdapterReceived(): "
...@@ -121,6 +136,9 @@ void SecureChannelInitializer::OnBluetoothAdapterReceived( ...@@ -121,6 +136,9 @@ void SecureChannelInitializer::OnBluetoothAdapterReceived(
secure_channel_impl_ = SecureChannelImpl::Factory::Create(bluetooth_adapter); secure_channel_impl_ = SecureChannelImpl::Factory::Create(bluetooth_adapter);
if (nearby_connector_)
secure_channel_impl_->SetNearbyConnector(std::move(nearby_connector_));
while (!pending_args_.empty()) { while (!pending_args_.empty()) {
std::unique_ptr<ConnectionRequestArgs> args_to_pass = std::unique_ptr<ConnectionRequestArgs> args_to_pass =
std::move(pending_args_.front()); std::move(pending_args_.front());
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "chromeos/services/secure_channel/public/mojom/nearby_connector.mojom.h"
#include "chromeos/services/secure_channel/public/mojom/secure_channel.mojom.h" #include "chromeos/services/secure_channel/public/mojom/secure_channel.mojom.h"
#include "chromeos/services/secure_channel/secure_channel_base.h" #include "chromeos/services/secure_channel/secure_channel_base.h"
#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h"
...@@ -90,10 +91,13 @@ class SecureChannelInitializer : public SecureChannelBase { ...@@ -90,10 +91,13 @@ class SecureChannelInitializer : public SecureChannelBase {
ConnectionMedium connection_medium, ConnectionMedium connection_medium,
ConnectionPriority connection_priority, ConnectionPriority connection_priority,
mojo::PendingRemote<mojom::ConnectionDelegate> delegate) override; mojo::PendingRemote<mojom::ConnectionDelegate> delegate) override;
void SetNearbyConnector(
mojo::PendingRemote<mojom::NearbyConnector> nearby_connector) override;
void OnBluetoothAdapterReceived( void OnBluetoothAdapterReceived(
scoped_refptr<device::BluetoothAdapter> bluetooth_adapter); scoped_refptr<device::BluetoothAdapter> bluetooth_adapter);
mojo::PendingRemote<mojom::NearbyConnector> nearby_connector_;
std::queue<std::unique_ptr<ConnectionRequestArgs>> pending_args_; std::queue<std::unique_ptr<ConnectionRequestArgs>> pending_args_;
std::unique_ptr<mojom::SecureChannel> secure_channel_impl_; std::unique_ptr<mojom::SecureChannel> secure_channel_impl_;
......
...@@ -34,12 +34,14 @@ ...@@ -34,12 +34,14 @@
#include "chromeos/services/secure_channel/fake_timer_factory.h" #include "chromeos/services/secure_channel/fake_timer_factory.h"
#include "chromeos/services/secure_channel/nearby_connection_manager_impl.h" #include "chromeos/services/secure_channel/nearby_connection_manager_impl.h"
#include "chromeos/services/secure_channel/pending_connection_manager_impl.h" #include "chromeos/services/secure_channel/pending_connection_manager_impl.h"
#include "chromeos/services/secure_channel/public/cpp/client/fake_nearby_connector.h"
#include "chromeos/services/secure_channel/public/cpp/shared/connection_priority.h" #include "chromeos/services/secure_channel/public/cpp/shared/connection_priority.h"
#include "chromeos/services/secure_channel/public/mojom/secure_channel.mojom.h" #include "chromeos/services/secure_channel/public/mojom/secure_channel.mojom.h"
#include "chromeos/services/secure_channel/secure_channel_disconnector_impl.h" #include "chromeos/services/secure_channel/secure_channel_disconnector_impl.h"
#include "chromeos/services/secure_channel/secure_channel_initializer.h" #include "chromeos/services/secure_channel/secure_channel_initializer.h"
#include "chromeos/services/secure_channel/timer_factory_impl.h" #include "chromeos/services/secure_channel/timer_factory_impl.h"
#include "device/bluetooth/bluetooth_adapter_factory.h" #include "device/bluetooth/bluetooth_adapter_factory.h"
#include "device/bluetooth/dbus/bluez_dbus_manager.h"
#include "device/bluetooth/test/mock_bluetooth_adapter.h" #include "device/bluetooth/test/mock_bluetooth_adapter.h"
#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/remote.h"
...@@ -480,6 +482,8 @@ class SecureChannelServiceTest : public testing::Test { ...@@ -480,6 +482,8 @@ class SecureChannelServiceTest : public testing::Test {
// testing::Test: // testing::Test:
void SetUp() override { void SetUp() override {
bluez::BluezDBusManager::GetSetterForTesting();
bluez::BluezDBusManager::InitializeFake();
mock_adapter_ = mock_adapter_ =
base::MakeRefCounted<testing::NiceMock<device::MockBluetoothAdapter>>(); base::MakeRefCounted<testing::NiceMock<device::MockBluetoothAdapter>>();
is_adapter_powered_ = true; is_adapter_powered_ = true;
...@@ -494,6 +498,8 @@ class SecureChannelServiceTest : public testing::Test { ...@@ -494,6 +498,8 @@ class SecureChannelServiceTest : public testing::Test {
test_task_runner_ = base::MakeRefCounted<base::TestSimpleTaskRunner>(); test_task_runner_ = base::MakeRefCounted<base::TestSimpleTaskRunner>();
fake_nearby_connector_ = std::make_unique<FakeNearbyConnector>();
fake_timer_factory_factory_ = std::make_unique<FakeTimerFactoryFactory>(); fake_timer_factory_factory_ = std::make_unique<FakeTimerFactoryFactory>();
TimerFactoryImpl::Factory::SetFactoryForTesting( TimerFactoryImpl::Factory::SetFactoryForTesting(
fake_timer_factory_factory_.get()); fake_timer_factory_factory_.get());
...@@ -778,10 +784,16 @@ class SecureChannelServiceTest : public testing::Test { ...@@ -778,10 +784,16 @@ class SecureChannelServiceTest : public testing::Test {
->CancelClientRequest(); ->CancelClientRequest();
} }
void FinishInitialization() { void FinishInitialization(bool set_nearby_connector = true) {
// The PendingConnectionManager should not have yet been created. // The PendingConnectionManager should not have yet been created.
EXPECT_FALSE(fake_pending_connection_manager()); EXPECT_FALSE(fake_pending_connection_manager());
if (set_nearby_connector) {
secure_channel_remote_->SetNearbyConnector(
fake_nearby_connector_->GeneratePendingRemote());
secure_channel_remote_.FlushForTesting();
}
EXPECT_TRUE(test_task_runner_->HasPendingTask()); EXPECT_TRUE(test_task_runner_->HasPendingTask());
test_task_runner_->RunUntilIdle(); test_task_runner_->RunUntilIdle();
...@@ -1046,6 +1058,7 @@ class SecureChannelServiceTest : public testing::Test { ...@@ -1046,6 +1058,7 @@ class SecureChannelServiceTest : public testing::Test {
scoped_refptr<testing::NiceMock<device::MockBluetoothAdapter>> mock_adapter_; scoped_refptr<testing::NiceMock<device::MockBluetoothAdapter>> mock_adapter_;
scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_; scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_;
std::unique_ptr<FakeNearbyConnector> fake_nearby_connector_;
std::unique_ptr<FakeTimerFactoryFactory> fake_timer_factory_factory_; std::unique_ptr<FakeTimerFactoryFactory> fake_timer_factory_factory_;
std::unique_ptr<TestRemoteDeviceCacheFactory> std::unique_ptr<TestRemoteDeviceCacheFactory>
...@@ -1248,17 +1261,13 @@ TEST_F(SecureChannelServiceTest, ...@@ -1248,17 +1261,13 @@ TEST_F(SecureChannelServiceTest,
} }
TEST_F(SecureChannelServiceTest, TEST_F(SecureChannelServiceTest,
InitiateConnection_Nearby_LocalDeviceMissingBluetoothAddress) { InitiateConnection_Nearby_MissingNearbyConnector) {
FinishInitialization(); FinishInitialization(/*set_nearby_connector=*/false);
multidevice::RemoteDevice local_device = test_devices()[1];
local_device.bluetooth_public_address.clear();
CallInitiateConnectionToDeviceAndVerifyRejection( CallInitiateConnectionToDeviceAndVerifyRejection(
test_devices()[0], local_device, "feature", test_devices()[0], test_devices()[1], "feature",
ConnectionMedium::kNearbyConnections, ConnectionPriority::kLow, ConnectionMedium::kNearbyConnections, ConnectionPriority::kLow,
mojom::ConnectionAttemptFailureReason:: mojom::ConnectionAttemptFailureReason::MISSING_NEARBY_CONNECTOR);
LOCAL_DEVICE_INVALID_BLUETOOTH_ADDRESS);
} }
TEST_F(SecureChannelServiceTest, ListenForConnection_Nearby) { TEST_F(SecureChannelServiceTest, ListenForConnection_Nearby) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment