Add local_auth_info_changed -> root_client_token_owner We are going to store owner of Root Client Authentication Token. Information is needed to avoid claiming tokens by multiple clients or by client and cloud simultaneously. BUG=26156215 Change-Id: I4dae39f3e8b0cfe3667775a864d5c893710fc18e Reviewed-on: https://weave-review.googlesource.com/1921 Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/src/config.cc b/src/config.cc index f0ec963..18e50b5 100644 --- a/src/config.cc +++ b/src/config.cc
@@ -42,7 +42,7 @@ const char kRobotAccount[] = "robot_account"; const char kLastConfiguredSsid[] = "last_configured_ssid"; const char kSecret[] = "secret"; -const char kLocalAuthInfoChanged[] = "local_auth_info_changed"; +const char kRootClientTokenOwner[] = "root_client_token_owner"; } // namespace config_keys @@ -72,8 +72,18 @@ return result; } +const EnumToStringMap<RootClientTokenOwner>::Map kRootClientTokenOwnerMap[] = { + {RootClientTokenOwner::kNone, "none"}, + {RootClientTokenOwner::kClient, "client"}, + {RootClientTokenOwner::kCloud, "cloud"}, +}; + } // namespace +template <> +LIBWEAVE_EXPORT EnumToStringMap<RootClientTokenOwner>::EnumToStringMap() + : EnumToStringMap(kRootClientTokenOwnerMap) {} + Config::Config(provider::ConfigStore* config_store) : settings_{CreateDefaultSettings()}, config_store_{config_store} { } @@ -121,7 +131,7 @@ CHECK(settings_.robot_account.empty()); CHECK(settings_.last_configured_ssid.empty()); CHECK(settings_.secret.empty()); - CHECK(settings_.local_auth_info_changed); + CHECK(settings_.root_client_token_owner == RootClientTokenOwner::kNone); change.LoadState(); } @@ -214,8 +224,11 @@ if (dict->GetString(config_keys::kSecret, &tmp) && Base64Decode(tmp, &secret)) set_secret(secret); - if (dict->GetBoolean(config_keys::kLocalAuthInfoChanged, &tmp_bool)) - set_local_auth_info_changed(tmp_bool); + RootClientTokenOwner token_owner{RootClientTokenOwner::kNone}; + if (dict->GetString(config_keys::kRootClientTokenOwner, &tmp) && + StringToEnum(tmp, &token_owner)) { + set_root_client_token_owner(token_owner); + } } void Config::Save() { @@ -237,8 +250,8 @@ dict.SetString(config_keys::kLastConfiguredSsid, settings_.last_configured_ssid); dict.SetString(config_keys::kSecret, Base64Encode(settings_.secret)); - dict.SetBoolean(config_keys::kLocalAuthInfoChanged, - settings_.local_auth_info_changed); + dict.SetString(config_keys::kRootClientTokenOwner, + EnumToString(settings_.root_client_token_owner)); dict.SetString(config_keys::kName, settings_.name); dict.SetString(config_keys::kDescription, settings_.description); dict.SetString(config_keys::kLocation, settings_.location);
diff --git a/src/config.h b/src/config.h index fc2568f..0c7ea5f 100644 --- a/src/config.h +++ b/src/config.h
@@ -14,12 +14,18 @@ #include <weave/error.h> #include <weave/provider/config_store.h> -#include "src/privet/security_delegate.h" +#include "src/privet/privet_types.h" namespace weave { class StorageInterface; +enum class RootClientTokenOwner { + kNone, + kClient, + kCloud, +}; + // Handles reading buffet config and state files. class Config final { public: @@ -28,7 +34,7 @@ std::string robot_account; std::string last_configured_ssid; std::vector<uint8_t> secret; - bool local_auth_info_changed{true}; + RootClientTokenOwner root_client_token_owner{RootClientTokenOwner::kNone}; }; using OnChangedCallback = base::Callback<void(const weave::Settings&)>; @@ -92,8 +98,9 @@ void set_secret(const std::vector<uint8_t>& secret) { settings_->secret = secret; } - void set_local_auth_info_changed(bool local_auth_info_changed) { - settings_->local_auth_info_changed = local_auth_info_changed; + void set_root_client_token_owner( + RootClientTokenOwner root_client_token_owner) { + settings_->root_client_token_owner = root_client_token_owner; } void Commit();
diff --git a/src/config_unittest.cc b/src/config_unittest.cc index 8c99131..1491d7b 100644 --- a/src/config_unittest.cc +++ b/src/config_unittest.cc
@@ -77,7 +77,7 @@ EXPECT_EQ("", GetSettings().robot_account); EXPECT_EQ("", GetSettings().last_configured_ssid); EXPECT_EQ(std::vector<uint8_t>(), GetSettings().secret); - EXPECT_TRUE(GetSettings().local_auth_info_changed); + EXPECT_EQ(RootClientTokenOwner::kNone, GetSettings().root_client_token_owner); } TEST_F(ConfigTest, LoadStateV0) { @@ -117,7 +117,7 @@ "device_id": "state_device_id", "last_configured_ssid": "state_last_configured_ssid", "local_anonymous_access_role": "user", - "local_auth_info_changed": false, + "root_client_token_owner": "client", "local_discovery_enabled": false, "local_pairing_enabled": false, "location": "state_location", @@ -161,7 +161,8 @@ EXPECT_EQ("state_robot_account", GetSettings().robot_account); EXPECT_EQ("state_last_configured_ssid", GetSettings().last_configured_ssid); EXPECT_EQ("c3RhdGVfc2VjcmV0", Base64Encode(GetSettings().secret)); - EXPECT_FALSE(GetSettings().local_auth_info_changed); + EXPECT_EQ(RootClientTokenOwner::kClient, + GetSettings().root_client_token_owner); } TEST_F(ConfigTest, Setters) { @@ -231,8 +232,9 @@ change.set_secret(secret); EXPECT_EQ(secret, GetSettings().secret); - change.set_local_auth_info_changed(false); - EXPECT_FALSE(GetSettings().local_auth_info_changed); + change.set_root_client_token_owner(RootClientTokenOwner::kCloud); + EXPECT_EQ(RootClientTokenOwner::kCloud, + GetSettings().root_client_token_owner); EXPECT_CALL(*this, OnConfigChanged(_)).Times(1); @@ -248,7 +250,7 @@ 'device_id': 'set_device_id', 'last_configured_ssid': 'set_last_configured_ssid', 'local_anonymous_access_role': 'user', - 'local_auth_info_changed': false, + 'root_client_token_owner': 'cloud', 'local_discovery_enabled': true, 'local_pairing_enabled': true, 'location': 'set_location',