Commit b6c626e5 authored by ibraaaa@chromium.org's avatar ibraaaa@chromium.org

Avatar syncing for supervised users

Syncs the avatar of the supervised user selected during its creation process but doesn't sync any further changes.

TBR=nkostylev@chromium.org

BUG=278083

Review URL: https://chromiumcodereview.appspot.com/23653007

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@222019 0039d316-1c4b-4281-b951-d872f2087c98
parent 63bcb55f
......@@ -29,6 +29,7 @@ namespace chromeos {
namespace {
const int kDummyAvatarIndex = -111;
const int kMasterKeySize = 32;
const int kUserCreationTimeoutSeconds = 60; // 60 seconds.
......@@ -160,7 +161,8 @@ void LocallyManagedUserCreationController::OnAddKeySuccess() {
creation_context_->manager_profile);
VLOG(1) << "Creating user on server";
ManagedUserRegistrationInfo info(creation_context_->display_name);
ManagedUserRegistrationInfo info(creation_context_->display_name,
kDummyAvatarIndex);
info.master_key = creation_context_->master_key;
creation_context_->registration_utility->Register(
creation_context_->sync_user_id,
......
......@@ -107,8 +107,10 @@ class ManagedUserRegistrationUtilityImpl
} // namespace
ManagedUserRegistrationInfo::ManagedUserRegistrationInfo(const string16& name)
: name(name) {
ManagedUserRegistrationInfo::ManagedUserRegistrationInfo(const string16& name,
int avatar_index)
: avatar_index(avatar_index),
name(name) {
}
ScopedTestingManagedUserRegistrationUtility::
......@@ -202,7 +204,8 @@ void ManagedUserRegistrationUtilityImpl::Register(
if (!is_existing_managed_user_) {
managed_user_sync_service_->AddManagedUser(pending_managed_user_id_,
base::UTF16ToUTF8(info.name),
info.master_key);
info.master_key,
info.avatar_index);
} else {
// User already exists, don't wait for acknowledgment.
OnManagedUserAcknowledged(managed_user_id);
......
......@@ -31,7 +31,8 @@ class DeviceInfo;
// Structure to store registration information.
struct ManagedUserRegistrationInfo {
explicit ManagedUserRegistrationInfo(const string16& name);
ManagedUserRegistrationInfo(const string16& name, int avatar_index);
int avatar_index;
string16 name;
std::string master_key;
};
......
......@@ -231,7 +231,7 @@ TEST_F(ManagedUserRegistrationUtilityTest, Register) {
StartInitialSync();
GetRegistrationUtility()->Register(
ManagedUserRegistrationUtility::GenerateNewManagedUserId(),
ManagedUserRegistrationInfo(ASCIIToUTF16("Dug")),
ManagedUserRegistrationInfo(ASCIIToUTF16("Dug"), 0),
GetRegistrationCallback());
EXPECT_EQ(1u, prefs()->GetDictionary(prefs::kManagedUsers)->size());
Acknowledge();
......@@ -244,7 +244,7 @@ TEST_F(ManagedUserRegistrationUtilityTest, Register) {
TEST_F(ManagedUserRegistrationUtilityTest, RegisterBeforeInitialSync) {
GetRegistrationUtility()->Register(
ManagedUserRegistrationUtility::GenerateNewManagedUserId(),
ManagedUserRegistrationInfo(ASCIIToUTF16("Nemo")),
ManagedUserRegistrationInfo(ASCIIToUTF16("Nemo"), 5),
GetRegistrationCallback());
EXPECT_EQ(1u, prefs()->GetDictionary(prefs::kManagedUsers)->size());
StartInitialSync();
......@@ -259,7 +259,7 @@ TEST_F(ManagedUserRegistrationUtilityTest, SyncServiceShutdownBeforeRegFinish) {
StartInitialSync();
GetRegistrationUtility()->Register(
ManagedUserRegistrationUtility::GenerateNewManagedUserId(),
ManagedUserRegistrationInfo(ASCIIToUTF16("Remy")),
ManagedUserRegistrationInfo(ASCIIToUTF16("Remy"), 12),
GetRegistrationCallback());
EXPECT_EQ(1u, prefs()->GetDictionary(prefs::kManagedUsers)->size());
service()->Shutdown();
......@@ -273,7 +273,7 @@ TEST_F(ManagedUserRegistrationUtilityTest, StopSyncingBeforeRegFinish) {
StartInitialSync();
GetRegistrationUtility()->Register(
ManagedUserRegistrationUtility::GenerateNewManagedUserId(),
ManagedUserRegistrationInfo(ASCIIToUTF16("Mike")),
ManagedUserRegistrationInfo(ASCIIToUTF16("Mike"), 17),
GetRegistrationCallback());
EXPECT_EQ(1u, prefs()->GetDictionary(prefs::kManagedUsers)->size());
service()->StopSyncing(MANAGED_USERS);
......
......@@ -637,7 +637,9 @@ void ManagedUserService::RegisterAndInitSync(
string16 name = UTF8ToUTF16(
profile_->GetPrefs()->GetString(prefs::kProfileName));
ManagedUserRegistrationInfo info(name);
int avatar_index = profile_->GetPrefs()->GetInteger(
prefs::kProfileAvatarIndex);
ManagedUserRegistrationInfo info(name, avatar_index);
registration_utility->Register(
managed_user_id,
info,
......
......@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/callback.h"
#include "base/strings/stringprintf.h"
#include "base/values.h"
#include "chrome/browser/prefs/scoped_user_pref_update.h"
#include "chrome/browser/profiles/profile.h"
......@@ -35,16 +36,24 @@ using sync_pb::ManagedUserSpecifics;
namespace {
const char kAcknowledged[] = "acknowledged";
const char kChromeAvatar[] = "chromeAvatar";
const char kChromeOsAvatar[] = "chromeOsAvatar";
const char kName[] = "name";
const char kMasterKey[] = "masterKey";
SyncData CreateLocalSyncData(const std::string& id,
const std::string& name,
bool acknowledged,
const std::string& master_key) {
const std::string& master_key,
const std::string& chrome_avatar,
const std::string& chromeos_avatar) {
::sync_pb::EntitySpecifics specifics;
specifics.mutable_managed_user()->set_id(id);
specifics.mutable_managed_user()->set_name(name);
if (!chrome_avatar.empty())
specifics.mutable_managed_user()->set_chrome_avatar(chrome_avatar);
if (!chromeos_avatar.empty())
specifics.mutable_managed_user()->set_chromeos_avatar(chromeos_avatar);
if (!master_key.empty())
specifics.mutable_managed_user()->set_master_key(master_key);
if (acknowledged)
......@@ -52,6 +61,27 @@ SyncData CreateLocalSyncData(const std::string& id,
return SyncData::CreateLocalData(id, name, specifics);
}
SyncData CreateSyncDataFromDictionaryEntry(
const DictionaryValue::Iterator& it) {
const DictionaryValue* dict = NULL;
bool success = it.value().GetAsDictionary(&dict);
DCHECK(success);
bool acknowledged = false;
dict->GetBoolean(kAcknowledged, &acknowledged);
std::string name;
dict->GetString(kName, &name);
DCHECK(!name.empty());
std::string master_key;
dict->GetString(kMasterKey, &master_key);
std::string chrome_avatar;
dict->GetString(kChromeAvatar, &chrome_avatar);
std::string chromeos_avatar;
dict->GetString(kChromeOsAvatar, &chromeos_avatar);
return CreateLocalSyncData(it.key(), name, acknowledged, master_key,
chrome_avatar, chromeos_avatar);
}
} // namespace
ManagedUserSyncService::ManagedUserSyncService(PrefService* prefs)
......@@ -85,12 +115,27 @@ void ManagedUserSyncService::RemoveObserver(
void ManagedUserSyncService::AddManagedUser(const std::string& id,
const std::string& name,
const std::string& master_key) {
const std::string& master_key,
int avatar_index) {
DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers);
DictionaryValue* dict = update.Get();
DictionaryValue* value = new DictionaryValue;
value->SetString(kName, name);
value->SetString(kMasterKey, master_key);
std::string chrome_avatar;
#if defined(CHROME_OS)
// This is a dummy value that is passed when a supervised user is created on
// Chrome OS.
// TODO(ibraaaa): update this to use the correct avatar index
// once avatar syncing for supervised users is implemented on Chrome OS.
DCHECK_EQ(avatar_index, -111);
#else
chrome_avatar = base::StringPrintf("chrome-avatar-index:%d", avatar_index);
#endif
value->SetString(kChromeAvatar, chrome_avatar);
// TODO(ibraaaa): this should be updated to allow supervised
// users avatar syncing on Chrome OS.
value->SetString(kChromeOsAvatar, std::string());
DCHECK(!dict->HasKey(id));
dict->SetWithoutPathExpansion(id, value);
......@@ -102,7 +147,8 @@ void ManagedUserSyncService::AddManagedUser(const std::string& id,
change_list.push_back(SyncChange(
FROM_HERE,
SyncChange::ACTION_ADD,
CreateLocalSyncData(id, name, false, master_key)));
CreateLocalSyncData(id, name, false, master_key,
chrome_avatar, std::string())));
SyncError error =
sync_processor_->ProcessSyncChanges(FROM_HERE, change_list);
DCHECK(!error.IsSet()) << error.ToString();
......@@ -170,6 +216,8 @@ SyncMergeResult ManagedUserSyncService::MergeDataAndStartSyncing(
value->SetString(kName, managed_user.name());
value->SetBoolean(kAcknowledged, managed_user.acknowledged());
value->SetString(kMasterKey, managed_user.master_key());
value->SetString(kChromeAvatar, managed_user.chrome_avatar());
value->SetString(kChromeOsAvatar, managed_user.chromeos_avatar());
if (dict->HasKey(managed_user.id()))
num_items_modified++;
else
......@@ -182,19 +230,8 @@ SyncMergeResult ManagedUserSyncService::MergeDataAndStartSyncing(
if (seen_ids.find(it.key()) != seen_ids.end())
continue;
const DictionaryValue* dict = NULL;
bool success = it.value().GetAsDictionary(&dict);
DCHECK(success);
bool acknowledged = false;
dict->GetBoolean(kAcknowledged, &acknowledged);
std::string name;
dict->GetString(kName, &name);
std::string master_key;
dict->GetString(kMasterKey, &master_key);
DCHECK(!name.empty());
change_list.push_back(
SyncChange(FROM_HERE, SyncChange::ACTION_ADD,
CreateLocalSyncData(it.key(), name, acknowledged, master_key)));
change_list.push_back(SyncChange(FROM_HERE, SyncChange::ACTION_ADD,
CreateSyncDataFromDictionaryEntry(it)));
}
result.set_error(sync_processor_->ProcessSyncChanges(FROM_HERE, change_list));
......@@ -221,19 +258,9 @@ SyncDataList ManagedUserSyncService::GetAllSyncData(
SyncDataList data;
DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers);
DictionaryValue* dict = update.Get();
for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) {
const DictionaryValue* dict = NULL;
bool success = it.value().GetAsDictionary(&dict);
DCHECK(success);
std::string name;
dict->GetString(kName, &name);
std::string master_key;
dict->GetString(kMasterKey, &master_key);
bool acknowledged = false;
dict->GetBoolean(kAcknowledged, &acknowledged);
data.push_back(
CreateLocalSyncData(it.key(), name, acknowledged, master_key));
}
for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance())
data.push_back(CreateSyncDataFromDictionaryEntry(it));
return data;
}
......@@ -272,6 +299,8 @@ SyncError ManagedUserSyncService::ProcessSyncChanges(
value->SetString(kName, managed_user.name());
value->SetBoolean(kAcknowledged, managed_user.acknowledged());
value->SetString(kMasterKey, managed_user.master_key());
value->SetString(kChromeAvatar, managed_user.chrome_avatar());
value->SetString(kChromeOsAvatar, managed_user.chromeos_avatar());
dict->SetWithoutPathExpansion(managed_user.id(), value);
break;
}
......
......@@ -42,7 +42,8 @@ class ManagedUserSyncService : public BrowserContextKeyedService,
void AddManagedUser(const std::string& id,
const std::string& name,
const std::string& master_key);
const std::string& master_key,
int avatar_index);
void DeleteManagedUser(const std::string& id);
// Returns a dictionary containing all managed users managed by this
......
......@@ -85,7 +85,9 @@ class ManagedUserSyncServiceTest : public ::testing::Test {
protected:
scoped_ptr<SyncChangeProcessor> CreateChangeProcessor();
scoped_ptr<SyncErrorFactory> CreateErrorFactory();
SyncData CreateRemoteData(const std::string& id, const std::string& name);
SyncData CreateRemoteData(const std::string& id,
const std::string& name,
const std::string& avatar);
PrefService* prefs() { return profile_.GetPrefs(); }
ManagedUserSyncService* service() { return service_; }
......@@ -124,11 +126,15 @@ ManagedUserSyncServiceTest::CreateErrorFactory() {
SyncData ManagedUserSyncServiceTest::CreateRemoteData(
const std::string& id,
const std::string& name) {
const std::string& name,
const std::string& chrome_avatar) {
::sync_pb::EntitySpecifics specifics;
specifics.mutable_managed_user()->set_id(id);
specifics.mutable_managed_user()->set_name(name);
specifics.mutable_managed_user()->set_acknowledged(true);
if (!chrome_avatar.empty())
specifics.mutable_managed_user()->set_chrome_avatar(chrome_avatar);
return SyncData::CreateRemoteData(++sync_data_id_, specifics, base::Time());
}
......@@ -154,6 +160,7 @@ TEST_F(ManagedUserSyncServiceTest, MergeEmpty) {
TEST_F(ManagedUserSyncServiceTest, MergeExisting) {
const char kNameKey[] = "name";
const char kAcknowledgedKey[] = "acknowledged";
const char kChromeAvatarKey[] = "chromeAvatar";
const char kUserId1[] = "aaaaa";
const char kUserId2[] = "bbbbb";
......@@ -163,6 +170,10 @@ TEST_F(ManagedUserSyncServiceTest, MergeExisting) {
const char kName2[] = "Buzz";
const char kName3[] = "Crush";
const char kName4[] = "Dory";
const char kAvatar1[] = "";
const char kAvatar2[] = "chrome-avatar-index:0";
const char kAvatar3[] = "chrome-avatar-index:20";
const char kAvatar4[] = "";
{
DictionaryPrefUpdate update(prefs(), prefs::kManagedUsers);
DictionaryValue* managed_users = update.Get();
......@@ -180,9 +191,9 @@ TEST_F(ManagedUserSyncServiceTest, MergeExisting) {
base::Bind(&GetManagedUsersCallback, &async_managed_users));
SyncDataList initial_sync_data;
initial_sync_data.push_back(CreateRemoteData(kUserId2, kName2));
initial_sync_data.push_back(CreateRemoteData(kUserId3, kName3));
initial_sync_data.push_back(CreateRemoteData(kUserId4, kName4));
initial_sync_data.push_back(CreateRemoteData(kUserId2, kName2, kAvatar2));
initial_sync_data.push_back(CreateRemoteData(kUserId3, kName3, kAvatar3));
initial_sync_data.push_back(CreateRemoteData(kUserId4, kName4, kAvatar4));
SyncMergeResult result =
service()->MergeDataAndStartSyncing(MANAGED_USERS,
......@@ -211,6 +222,9 @@ TEST_F(ManagedUserSyncServiceTest, MergeExisting) {
bool acknowledged = false;
EXPECT_TRUE(managed_user->GetBoolean(kAcknowledgedKey, &acknowledged));
EXPECT_TRUE(acknowledged);
std::string avatar;
EXPECT_TRUE(managed_user->GetString(kChromeAvatarKey, &avatar));
EXPECT_EQ(kAvatar2, avatar);
}
{
const DictionaryValue* managed_user = NULL;
......@@ -222,6 +236,9 @@ TEST_F(ManagedUserSyncServiceTest, MergeExisting) {
bool acknowledged = false;
EXPECT_TRUE(managed_user->GetBoolean(kAcknowledgedKey, &acknowledged));
EXPECT_TRUE(acknowledged);
std::string avatar;
EXPECT_TRUE(managed_user->GetString(kChromeAvatarKey, &avatar));
EXPECT_EQ(kAvatar3, avatar);
}
{
const DictionaryValue* managed_user = NULL;
......@@ -233,6 +250,9 @@ TEST_F(ManagedUserSyncServiceTest, MergeExisting) {
bool acknowledged = false;
EXPECT_TRUE(managed_user->GetBoolean(kAcknowledgedKey, &acknowledged));
EXPECT_TRUE(acknowledged);
std::string avatar;
EXPECT_TRUE(managed_user->GetString(kChromeAvatarKey, &avatar));
EXPECT_EQ(kAvatar4, avatar);
}
EXPECT_EQ(1u, change_processor()->changes().size());
......@@ -244,5 +264,6 @@ TEST_F(ManagedUserSyncServiceTest, MergeExisting) {
change.sync_data().GetSpecifics().managed_user();
EXPECT_EQ(kName1, managed_user.name());
EXPECT_FALSE(managed_user.acknowledged());
EXPECT_EQ(kAvatar1, managed_user.chrome_avatar());
}
}
......@@ -25,4 +25,12 @@ message ManagedUserSpecifics {
optional bool acknowledged = 3 [default = false];
// Master key for managed user cryptohome.
optional string master_key = 4;
// A string representing the index of the supervised user avatar on Chrome.
// It has the following format:
// "chrome-avatar-index:INDEX" where INDEX is an integer.
optional string chrome_avatar = 5;
// A string representing the index of the supervised user avatar on Chrome OS.
// It has the following format:
// "chromeos-avatar-index:INDEX" where INDEX is an integer.
optional string chromeos_avatar = 6;
}
......@@ -492,6 +492,8 @@ base::DictionaryValue* ManagedUserSpecificsToValue(
SET_STR(name);
SET_BOOL(acknowledged);
SET_STR(master_key);
SET_STR(chrome_avatar);
SET_STR(chromeos_avatar);
return value;
}
......
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