Don't allow registration of registered device Device first needs to be factory reset. BUG: 26427523 Change-Id: I82102fccaaad87f125ae4d124b1c17f984b39b46 Reviewed-on: https://weave-review.googlesource.com/2169 Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/src/device_registration_info.cc b/src/device_registration_info.cc index a91ae6f..c374527 100644 --- a/src/device_registration_info.cc +++ b/src/device_registration_info.cc
@@ -36,6 +36,7 @@ const char kErrorDomainOAuth2[] = "oauth2"; const char kErrorDomainGCD[] = "gcd"; const char kErrorDomainGCDServer[] = "gcd_server"; +const char kErrorAlreayRegistered[] = "already_registered"; namespace { @@ -523,6 +524,14 @@ void DeviceRegistrationInfo::RegisterDevice(const std::string& ticket_id, const DoneCallback& callback) { + if (HaveRegistrationCredentials()) { + ErrorPtr error; + Error::AddTo(&error, FROM_HERE, errors::kErrorDomain, + kErrorAlreayRegistered, + "Unable to register already registered device"); + return RegisterDeviceError(callback, std::move(error)); + } + std::unique_ptr<base::DictionaryValue> device_draft = BuildDeviceResource(); CHECK(device_draft); @@ -835,7 +844,7 @@ const std::string& service_url, ErrorPtr* error) { if (HaveRegistrationCredentials()) { - Error::AddTo(error, FROM_HERE, errors::kErrorDomain, "already_registered", + Error::AddTo(error, FROM_HERE, errors::kErrorDomain, kErrorAlreayRegistered, "Unable to change config for registered device"); return false; }
diff --git a/src/device_registration_info_unittest.cc b/src/device_registration_info_unittest.cc index ea81057..595d749 100644 --- a/src/device_registration_info_unittest.cc +++ b/src/device_registration_info_unittest.cc
@@ -153,11 +153,14 @@ dev_reg_->Start(); } - void ReloadSettings() { + void ReloadSettings(bool registered = true) { base::DictionaryValue dict; - dict.SetString("refresh_token", test_data::kRefreshToken); - dict.SetString("cloud_id", test_data::kCloudId); - dict.SetString("robot_account", test_data::kRobotAccountEmail); + dict.SetInteger("version", 1); + if (registered) { + dict.SetString("refresh_token", test_data::kRefreshToken); + dict.SetString("cloud_id", test_data::kCloudId); + dict.SetString("robot_account", test_data::kRobotAccountEmail); + } dict.SetString("device_id", test_data::kDeviceId); std::string json_string; base::JSONWriter::WriteWithOptions( @@ -373,7 +376,7 @@ } TEST_F(DeviceRegistrationInfoTest, RegisterDevice) { - ReloadSettings(); + ReloadSettings(false); auto json_traits = CreateDictionaryValue(R"({ 'base': { @@ -558,6 +561,28 @@ EXPECT_TRUE(done); } +TEST_F(DeviceRegistrationInfoTest, ReRegisterDevice) { + ReloadSettings(); + + bool done = false; + dev_reg_->RegisterDevice( + test_data::kClaimTicketId, base::Bind([this, &done](ErrorPtr error) { + EXPECT_TRUE(error->HasError("weave", "already_registered")); + done = true; + task_runner_.Break(); + EXPECT_EQ(GcdState::kConnecting, GetGcdState()); + + // Validate the device info saved to storage... + EXPECT_EQ(test_data::kCloudId, dev_reg_->GetSettings().cloud_id); + EXPECT_EQ(test_data::kRefreshToken, + dev_reg_->GetSettings().refresh_token); + EXPECT_EQ(test_data::kRobotAccountEmail, + dev_reg_->GetSettings().robot_account); + })); + task_runner_.Run(); + EXPECT_TRUE(done); +} + TEST_F(DeviceRegistrationInfoTest, OOBRegistrationStatus) { // After we've been initialized, we should be either offline or // unregistered, depending on whether or not we've found credentials.
diff --git a/src/weave_unittest.cc b/src/weave_unittest.cc index 987b0c4..b106aab 100644 --- a/src/weave_unittest.cc +++ b/src/weave_unittest.cc
@@ -433,6 +433,17 @@ })); task_runner_.Run(); EXPECT_TRUE(done); + + done = false; + device_->Register( + "TICKET_ID2", base::Bind([this, &done](ErrorPtr error) { + EXPECT_TRUE(error->HasError("weave", "already_registered")); + done = true; + task_runner_.Break(); + EXPECT_EQ("CLOUD_ID", device_->GetSettings().cloud_id); + })); + task_runner_.Run(); + EXPECT_TRUE(done); } class WeaveWiFiSetupTest : public WeaveTest {