[CrOS MultiDevice] Adjust RemoteDevice Mojo struct for setup flow.
As part of the MultiDeviceSetup flow, we use JS <==> C++ Mojo bindings,
so we were transferring RemoteDevice objects from C++ to JS.
RemoteDevice objects hold a "public_key" field, which is a std::string
containing randomly-generated bits. These bits are not all necessarily
ASCII characters and often contain NULL characters before the end of the
string. The std::string class handles this situation, but JS strings do
not. Thus, transferring the public_key field was problematic because the
key would not be received correctly on the JS side.
This CL modifies device_sync.mojom's RemoteDevice struct:
* The device ID (human-readable string) is included instead of the
public key.
* StructTraits use RemoteDeviceRef::DerivePublicKey() to retrieve the
public key on the other side of the pipe.
Additionally, this CL modifies multidevice_setup.mojom such that
SetHostDevice() now takes a device ID instead of a public key as a
parameter.
Bug: 824568
Change-Id: I16bda595ce25ba9321f11d3f455fbbeec71d7809
Reviewed-on: https://chromium-review.googlesource.com/1149328
Reviewed-by: Ryan Hansberry <hansberry@chromium.org>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Commit-Queue: Kyle Horimoto <khorimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#578392}
diff --git a/chromeos/services/device_sync/public/mojom/device_sync.mojom b/chromeos/services/device_sync/public/mojom/device_sync.mojom
index 19090b09..06f1e3f 100644
--- a/chromeos/services/device_sync/public/mojom/device_sync.mojom
+++ b/chromeos/services/device_sync/public/mojom/device_sync.mojom
@@ -86,8 +86,10 @@
// Metadata describing a remote device with which the current device can
// communicate.
struct RemoteDevice {
- // Public key used to authenticate a communication channel.
- string public_key;
+ // Unique identifier of the device. Unlike |public_key|, this field is
+ // guaranteed to be human-readable (i.e., it does not contain non-ASCII
+ // characters).
+ string device_id;
// Identifier for the user to whom this device is registered.
string user_id;
diff --git a/chromeos/services/device_sync/public/mojom/device_sync_mojom_traits.cc b/chromeos/services/device_sync/public/mojom/device_sync_mojom_traits.cc
index 167b754..f31d92e 100644
--- a/chromeos/services/device_sync/public/mojom/device_sync_mojom_traits.cc
+++ b/chromeos/services/device_sync/public/mojom/device_sync_mojom_traits.cc
@@ -5,6 +5,7 @@
#include "chromeos/services/device_sync/public/mojom/device_sync_mojom_traits.h"
#include "base/logging.h"
+#include "components/cryptauth/remote_device_ref.h"
#include "mojo/public/cpp/base/time_mojom_traits.h"
namespace mojo {
@@ -48,11 +49,11 @@
return true;
}
-const std::string&
+std::string
StructTraits<chromeos::device_sync::mojom::RemoteDeviceDataView,
- cryptauth::RemoteDevice>::public_key(const cryptauth::RemoteDevice&
- remote_device) {
- return remote_device.public_key;
+ cryptauth::RemoteDevice>::device_id(const cryptauth::RemoteDevice&
+ remote_device) {
+ return remote_device.GetDeviceId();
}
const std::string&
@@ -100,10 +101,11 @@
cryptauth::RemoteDevice>::
Read(chromeos::device_sync::mojom::RemoteDeviceDataView in,
cryptauth::RemoteDevice* out) {
+ std::string device_id;
base::Time last_update_time;
if (!in.ReadUserId(&out->user_id) || !in.ReadDeviceName(&out->name) ||
- !in.ReadPublicKey(&out->public_key) ||
+ !in.ReadDeviceId(&device_id) ||
!in.ReadPersistentSymmetricKey(&out->persistent_symmetric_key) ||
!in.ReadLastUpdateTime(&last_update_time) ||
!in.ReadSoftwareFeatures(&out->software_features) ||
@@ -111,6 +113,7 @@
return false;
}
+ out->public_key = cryptauth::RemoteDeviceRef::DerivePublicKey(device_id);
out->last_update_time_millis = last_update_time.ToJavaTime();
return true;
diff --git a/chromeos/services/device_sync/public/mojom/device_sync_mojom_traits.h b/chromeos/services/device_sync/public/mojom/device_sync_mojom_traits.h
index d65e1c6..a20eb1d 100644
--- a/chromeos/services/device_sync/public/mojom/device_sync_mojom_traits.h
+++ b/chromeos/services/device_sync/public/mojom/device_sync_mojom_traits.h
@@ -33,8 +33,7 @@
class StructTraits<chromeos::device_sync::mojom::RemoteDeviceDataView,
cryptauth::RemoteDevice> {
public:
- static const std::string& public_key(
- const cryptauth::RemoteDevice& remote_device);
+ static std::string device_id(const cryptauth::RemoteDevice& remote_device);
static const std::string& user_id(
const cryptauth::RemoteDevice& remote_device);
static const std::string& device_name(
diff --git a/chromeos/services/multidevice_setup/multidevice_setup_impl.cc b/chromeos/services/multidevice_setup/multidevice_setup_impl.cc
index 661497d4..9bb2e4c 100644
--- a/chromeos/services/multidevice_setup/multidevice_setup_impl.cc
+++ b/chromeos/services/multidevice_setup/multidevice_setup_impl.cc
@@ -109,14 +109,14 @@
std::move(callback).Run(eligible_remote_devices);
}
-void MultiDeviceSetupImpl::SetHostDevice(const std::string& host_public_key,
+void MultiDeviceSetupImpl::SetHostDevice(const std::string& host_device_id,
SetHostDeviceCallback callback) {
cryptauth::RemoteDeviceRefList eligible_devices =
eligible_host_devices_provider_->GetEligibleHostDevices();
auto it =
std::find_if(eligible_devices.begin(), eligible_devices.end(),
- [&host_public_key](const auto& eligible_device) {
- return eligible_device.public_key() == host_public_key;
+ [&host_device_id](const auto& eligible_device) {
+ return eligible_device.GetDeviceId() == host_device_id;
});
if (it == eligible_devices.end()) {
diff --git a/chromeos/services/multidevice_setup/multidevice_setup_impl.h b/chromeos/services/multidevice_setup/multidevice_setup_impl.h
index 909be39..d5ab44c 100644
--- a/chromeos/services/multidevice_setup/multidevice_setup_impl.h
+++ b/chromeos/services/multidevice_setup/multidevice_setup_impl.h
@@ -66,7 +66,7 @@
mojom::AccountStatusChangeDelegatePtr delegate) override;
void AddHostStatusObserver(mojom::HostStatusObserverPtr observer) override;
void GetEligibleHostDevices(GetEligibleHostDevicesCallback callback) override;
- void SetHostDevice(const std::string& host_public_key,
+ void SetHostDevice(const std::string& host_device_id,
SetHostDeviceCallback callback) override;
void RemoveHostDevice() override;
void GetHostStatus(GetHostStatusCallback callback) override;
diff --git a/chromeos/services/multidevice_setup/multidevice_setup_impl_unittest.cc b/chromeos/services/multidevice_setup/multidevice_setup_impl_unittest.cc
index 7cb0576e..a03ab74 100644
--- a/chromeos/services/multidevice_setup/multidevice_setup_impl_unittest.cc
+++ b/chromeos/services/multidevice_setup/multidevice_setup_impl_unittest.cc
@@ -399,10 +399,10 @@
return eligible_devices_list;
}
- bool CallSetHostDevice(const std::string& host_public_key) {
+ bool CallSetHostDevice(const std::string& host_device_id) {
base::RunLoop run_loop;
multidevice_setup_->SetHostDevice(
- host_public_key,
+ host_device_id,
base::BindOnce(&MultiDeviceSetupImplTest::OnHostSet,
base::Unretained(this), run_loop.QuitClosure()));
run_loop.Run();
@@ -650,11 +650,11 @@
EXPECT_FALSE(CallRetrySetHostNow());
// Set an invalid host as the host device; this should fail.
- EXPECT_FALSE(CallSetHostDevice("invalidHostPublicKey"));
+ EXPECT_FALSE(CallSetHostDevice("invalidHostDeviceId"));
EXPECT_FALSE(fake_host_backend_delegate()->HasPendingHostRequest());
// Set device 0 as the host; this should succeed.
- EXPECT_TRUE(CallSetHostDevice(test_devices()[0].public_key()));
+ EXPECT_TRUE(CallSetHostDevice(test_devices()[0].GetDeviceId()));
EXPECT_TRUE(fake_host_backend_delegate()->HasPendingHostRequest());
EXPECT_EQ(test_devices()[0],
fake_host_backend_delegate()->GetPendingHostRequest());
diff --git a/chromeos/services/multidevice_setup/multidevice_setup_initializer.cc b/chromeos/services/multidevice_setup/multidevice_setup_initializer.cc
index 5f57c55..77892e43 100644
--- a/chromeos/services/multidevice_setup/multidevice_setup_initializer.cc
+++ b/chromeos/services/multidevice_setup/multidevice_setup_initializer.cc
@@ -94,11 +94,10 @@
}
void MultiDeviceSetupInitializer::SetHostDevice(
- const std::string& host_public_key,
+ const std::string& host_device_id,
SetHostDeviceCallback callback) {
if (multidevice_setup_impl_) {
- multidevice_setup_impl_->SetHostDevice(host_public_key,
- std::move(callback));
+ multidevice_setup_impl_->SetHostDevice(host_device_id, std::move(callback));
return;
}
@@ -111,7 +110,7 @@
// If a pending request to remove the current device exists, cancel it.
pending_should_remove_host_device_ = false;
- pending_set_host_args_ = std::make_pair(host_public_key, std::move(callback));
+ pending_set_host_args_ = std::make_pair(host_device_id, std::move(callback));
}
void MultiDeviceSetupInitializer::RemoveHostDevice() {
diff --git a/chromeos/services/multidevice_setup/multidevice_setup_initializer.h b/chromeos/services/multidevice_setup/multidevice_setup_initializer.h
index 5440cb0b..51533d75 100644
--- a/chromeos/services/multidevice_setup/multidevice_setup_initializer.h
+++ b/chromeos/services/multidevice_setup/multidevice_setup_initializer.h
@@ -56,7 +56,7 @@
mojom::AccountStatusChangeDelegatePtr delegate) override;
void AddHostStatusObserver(mojom::HostStatusObserverPtr observer) override;
void GetEligibleHostDevices(GetEligibleHostDevicesCallback callback) override;
- void SetHostDevice(const std::string& host_public_key,
+ void SetHostDevice(const std::string& host_device_id,
SetHostDeviceCallback callback) override;
void RemoveHostDevice() override;
void GetHostStatus(GetHostStatusCallback callback) override;
diff --git a/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup.cc b/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup.cc
index 08ea447c..fce02d2 100644
--- a/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup.cc
+++ b/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup.cc
@@ -64,9 +64,9 @@
get_eligible_hosts_args_.push_back(std::move(callback));
}
-void FakeMultiDeviceSetup::SetHostDevice(const std::string& host_public_key,
+void FakeMultiDeviceSetup::SetHostDevice(const std::string& host_device_id,
SetHostDeviceCallback callback) {
- set_host_args_.emplace_back(host_public_key, std::move(callback));
+ set_host_args_.emplace_back(host_device_id, std::move(callback));
}
void FakeMultiDeviceSetup::RemoveHostDevice() {
diff --git a/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup.h b/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup.h
index 3bd52f3..8bd486b 100644
--- a/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup.h
+++ b/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup.h
@@ -56,7 +56,7 @@
mojom::AccountStatusChangeDelegatePtr delegate) override;
void AddHostStatusObserver(mojom::HostStatusObserverPtr observer) override;
void GetEligibleHostDevices(GetEligibleHostDevicesCallback callback) override;
- void SetHostDevice(const std::string& host_public_key,
+ void SetHostDevice(const std::string& host_device_id,
SetHostDeviceCallback callback) override;
void RemoveHostDevice() override;
void GetHostStatus(GetHostStatusCallback callback) override;
diff --git a/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup_client.cc b/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup_client.cc
index 43a1848..e15ddf4 100644
--- a/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup_client.cc
+++ b/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup_client.cc
@@ -12,7 +12,7 @@
FakeMultiDeviceSetupClient::~FakeMultiDeviceSetupClient() {
DCHECK(get_eligible_host_devices_callback_queue_.empty());
- DCHECK(set_host_device_public_key_and_callback_queue_.empty());
+ DCHECK(set_host_device_id_and_callback_queue_.empty());
DCHECK(get_host_status_callback_queue_.empty());
DCHECK(retry_set_host_now_callback_queue_.empty());
DCHECK(trigger_event_for_debugging_type_and_callback_queue_.empty());
@@ -26,13 +26,12 @@
}
void FakeMultiDeviceSetupClient::InvokePendingSetHostDeviceCallback(
- const std::string& expected_public_key,
+ const std::string& expected_device_id,
bool success) {
- DCHECK_EQ(expected_public_key,
- set_host_device_public_key_and_callback_queue_.front().first);
- std::move(set_host_device_public_key_and_callback_queue_.front().second)
- .Run(success);
- set_host_device_public_key_and_callback_queue_.pop();
+ DCHECK_EQ(expected_device_id,
+ set_host_device_id_and_callback_queue_.front().first);
+ std::move(set_host_device_id_and_callback_queue_.front().second).Run(success);
+ set_host_device_id_and_callback_queue_.pop();
}
void FakeMultiDeviceSetupClient::InvokePendingGetHostStatusCallback(
@@ -65,10 +64,10 @@
}
void FakeMultiDeviceSetupClient::SetHostDevice(
- const std::string& public_key,
+ const std::string& host_device_id,
mojom::MultiDeviceSetup::SetHostDeviceCallback callback) {
- set_host_device_public_key_and_callback_queue_.emplace(public_key,
- std::move(callback));
+ set_host_device_id_and_callback_queue_.emplace(host_device_id,
+ std::move(callback));
}
void FakeMultiDeviceSetupClient::RemoveHostDevice() {
diff --git a/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup_client.h b/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup_client.h
index 05a83b633..aa10cd27 100644
--- a/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup_client.h
+++ b/chromeos/services/multidevice_setup/public/cpp/fake_multidevice_setup_client.h
@@ -28,9 +28,8 @@
void InvokePendingGetEligibleHostDevicesCallback(
const cryptauth::RemoteDeviceRefList& eligible_devices);
- void InvokePendingSetHostDeviceCallback(
- const std::string& expected_public_key,
- bool success);
+ void InvokePendingSetHostDeviceCallback(const std::string& expected_device_id,
+ bool success);
void InvokePendingGetHostStatusCallback(
mojom::HostStatus host_status,
const base::Optional<cryptauth::RemoteDeviceRef>& host_device);
@@ -48,7 +47,7 @@
private:
void GetEligibleHostDevices(GetEligibleHostDevicesCallback callback) override;
void SetHostDevice(
- const std::string& public_key,
+ const std::string& host_device_id,
mojom::MultiDeviceSetup::SetHostDeviceCallback callback) override;
void RemoveHostDevice() override;
void GetHostStatus(GetHostStatusCallback callback) override;
@@ -65,7 +64,7 @@
get_eligible_host_devices_callback_queue_;
std::queue<
std::pair<std::string, mojom::MultiDeviceSetup::SetHostDeviceCallback>>
- set_host_device_public_key_and_callback_queue_;
+ set_host_device_id_and_callback_queue_;
std::queue<GetHostStatusCallback> get_host_status_callback_queue_;
std::queue<mojom::MultiDeviceSetup::RetrySetHostNowCallback>
retry_set_host_now_callback_queue_;
diff --git a/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client.h b/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client.h
index a5923ca..5ae6b2b 100644
--- a/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client.h
+++ b/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client.h
@@ -50,7 +50,7 @@
virtual void GetEligibleHostDevices(
GetEligibleHostDevicesCallback callback) = 0;
virtual void SetHostDevice(
- const std::string& public_key,
+ const std::string& host_device_id,
mojom::MultiDeviceSetup::SetHostDeviceCallback callback) = 0;
virtual void RemoveHostDevice() = 0;
virtual void GetHostStatus(GetHostStatusCallback callback) = 0;
diff --git a/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.cc b/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.cc
index 76bd4916..60ce25b 100644
--- a/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.cc
+++ b/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.cc
@@ -64,9 +64,9 @@
}
void MultiDeviceSetupClientImpl::SetHostDevice(
- const std::string& public_key,
+ const std::string& host_device_id,
mojom::MultiDeviceSetup::SetHostDeviceCallback callback) {
- multidevice_setup_ptr_->SetHostDevice(public_key, std::move(callback));
+ multidevice_setup_ptr_->SetHostDevice(host_device_id, std::move(callback));
}
void MultiDeviceSetupClientImpl::RemoveHostDevice() {
diff --git a/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.h b/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.h
index 4720263..f266f2b 100644
--- a/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.h
+++ b/chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client_impl.h
@@ -47,7 +47,7 @@
// MultiDeviceSetupClient:
void GetEligibleHostDevices(GetEligibleHostDevicesCallback callback) override;
void SetHostDevice(
- const std::string& public_key,
+ const std::string& host_device_id,
mojom::MultiDeviceSetup::SetHostDeviceCallback callback) override;
void RemoveHostDevice() override;
void GetHostStatus(GetHostStatusCallback callback) override;