Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Unified Diff: chrome/browser/managed_mode/managed_user_sync_service.cc

Issue 335833003: Rename "managed (mode|user)" to "supervised user" (part 2) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review comments (+ a few other cleanups) Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/managed_mode/managed_user_sync_service.cc
diff --git a/chrome/browser/managed_mode/managed_user_sync_service.cc b/chrome/browser/managed_mode/managed_user_sync_service.cc
deleted file mode 100644
index d41582a15f6e2ff25fdc7c6bb80b19021c41d250..0000000000000000000000000000000000000000
--- a/chrome/browser/managed_mode/managed_user_sync_service.cc
+++ /dev/null
@@ -1,570 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/managed_mode/managed_user_sync_service.h"
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/prefs/scoped_user_pref_update.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/values.h"
-#include "chrome/browser/profiles/profile_avatar_icon_util.h"
-#include "chrome/common/pref_names.h"
-#include "components/pref_registry/pref_registry_syncable.h"
-#include "sync/api/sync_change.h"
-#include "sync/api/sync_data.h"
-#include "sync/api/sync_error.h"
-#include "sync/api/sync_error_factory.h"
-#include "sync/api/sync_merge_result.h"
-#include "sync/protocol/sync.pb.h"
-
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/login/users/avatar/default_user_images.h"
-#endif
-
-using base::DictionaryValue;
-using user_prefs::PrefRegistrySyncable;
-using syncer::SUPERVISED_USERS;
-using syncer::ModelType;
-using syncer::SyncChange;
-using syncer::SyncChangeList;
-using syncer::SyncChangeProcessor;
-using syncer::SyncData;
-using syncer::SyncDataList;
-using syncer::SyncError;
-using syncer::SyncErrorFactory;
-using syncer::SyncMergeResult;
-using sync_pb::ManagedUserSpecifics;
-
-namespace {
-
-#if defined(OS_CHROMEOS)
-const char kChromeOSAvatarPrefix[] = "chromeos-avatar-index:";
-#else
-const char kChromeAvatarPrefix[] = "chrome-avatar-index:";
-#endif
-
-SyncData CreateLocalSyncData(const std::string& id,
- const std::string& name,
- bool acknowledged,
- const std::string& master_key,
- const std::string& chrome_avatar,
- const std::string& chromeos_avatar,
- const std::string& password_signature_key,
- const std::string& password_encryption_key) {
- ::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)
- specifics.mutable_managed_user()->set_acknowledged(true);
- if (!password_signature_key.empty()) {
- specifics.mutable_managed_user()->
- set_password_signature_key(password_signature_key);
- }
- if (!password_encryption_key.empty()) {
- specifics.mutable_managed_user()->
- set_password_encryption_key(password_encryption_key);
- }
- return SyncData::CreateLocalData(id, name, specifics);
-}
-
-SyncData CreateSyncDataFromDictionaryEntry(const std::string& id,
- const base::Value& value) {
- const base::DictionaryValue* dict = NULL;
- bool success = value.GetAsDictionary(&dict);
- DCHECK(success);
- bool acknowledged = false;
- dict->GetBoolean(ManagedUserSyncService::kAcknowledged, &acknowledged);
- std::string name;
- dict->GetString(ManagedUserSyncService::kName, &name);
- DCHECK(!name.empty());
- std::string master_key;
- dict->GetString(ManagedUserSyncService::kMasterKey, &master_key);
- std::string chrome_avatar;
- dict->GetString(ManagedUserSyncService::kChromeAvatar, &chrome_avatar);
- std::string chromeos_avatar;
- dict->GetString(ManagedUserSyncService::kChromeOsAvatar, &chromeos_avatar);
- std::string signature;
- dict->GetString(ManagedUserSyncService::kPasswordSignatureKey, &signature);
- std::string encryption;
- dict->GetString(ManagedUserSyncService::kPasswordEncryptionKey, &encryption);
-
- return CreateLocalSyncData(id,
- name,
- acknowledged,
- master_key,
- chrome_avatar,
- chromeos_avatar,
- signature,
- encryption);
-}
-
-} // namespace
-
-const char ManagedUserSyncService::kAcknowledged[] = "acknowledged";
-const char ManagedUserSyncService::kChromeAvatar[] = "chromeAvatar";
-const char ManagedUserSyncService::kChromeOsAvatar[] = "chromeOsAvatar";
-const char ManagedUserSyncService::kMasterKey[] = "masterKey";
-const char ManagedUserSyncService::kName[] = "name";
-const char ManagedUserSyncService::kPasswordSignatureKey[] =
- "passwordSignatureKey";
-const char ManagedUserSyncService::kPasswordEncryptionKey[] =
- "passwordEncryptionKey";
-const int ManagedUserSyncService::kNoAvatar = -100;
-
-ManagedUserSyncService::ManagedUserSyncService(PrefService* prefs)
- : prefs_(prefs) {
- pref_change_registrar_.Init(prefs_);
- pref_change_registrar_.Add(
- prefs::kGoogleServicesLastUsername,
- base::Bind(&ManagedUserSyncService::OnLastSignedInUsernameChange,
- base::Unretained(this)));
-}
-
-ManagedUserSyncService::~ManagedUserSyncService() {
-}
-
-// static
-void ManagedUserSyncService::RegisterProfilePrefs(
- PrefRegistrySyncable* registry) {
- registry->RegisterDictionaryPref(prefs::kSupervisedUsers,
- PrefRegistrySyncable::UNSYNCABLE_PREF);
-}
-
-// static
-bool ManagedUserSyncService::GetAvatarIndex(const std::string& avatar_str,
- int* avatar_index) {
- DCHECK(avatar_index);
- if (avatar_str.empty()) {
- *avatar_index = kNoAvatar;
- return true;
- }
-#if defined(OS_CHROMEOS)
- const char* prefix = kChromeOSAvatarPrefix;
-#else
- const char* prefix = kChromeAvatarPrefix;
-#endif
- size_t prefix_len = strlen(prefix);
- if (avatar_str.size() <= prefix_len ||
- avatar_str.substr(0, prefix_len) != prefix) {
- return false;
- }
-
- if (!base::StringToInt(avatar_str.substr(prefix_len), avatar_index))
- return false;
-
- const int kChromeOSDummyAvatarIndex = -111;
-
-#if defined(OS_CHROMEOS)
- return (*avatar_index == kChromeOSDummyAvatarIndex ||
- (*avatar_index >= chromeos::kFirstDefaultImageIndex &&
- *avatar_index < chromeos::kDefaultImagesCount));
-#else
- // Check if the Chrome avatar index is set to a dummy value. Some early
- // supervised user profiles on ChromeOS stored a dummy avatar index as a
- // Chrome Avatar before there was logic to sync the ChromeOS avatar
- // separately. Handle this as if the Chrome Avatar was not chosen yet (which
- // is correct for these profiles).
- if (*avatar_index == kChromeOSDummyAvatarIndex)
- *avatar_index = kNoAvatar;
- return (*avatar_index == kNoAvatar ||
- (*avatar_index >= 0 &&
- static_cast<size_t>(*avatar_index) <
- profiles::GetDefaultAvatarIconCount()));
-#endif
-}
-
-// static
-std::string ManagedUserSyncService::BuildAvatarString(int avatar_index) {
-#if defined(OS_CHROMEOS)
- const char* prefix = kChromeOSAvatarPrefix;
-#else
- const char* prefix = kChromeAvatarPrefix;
-#endif
- return base::StringPrintf("%s%d", prefix, avatar_index);
-}
-
-void ManagedUserSyncService::AddObserver(
- ManagedUserSyncServiceObserver* observer) {
- observers_.AddObserver(observer);
-}
-
-void ManagedUserSyncService::RemoveObserver(
- ManagedUserSyncServiceObserver* observer) {
- observers_.RemoveObserver(observer);
-}
-
-scoped_ptr<base::DictionaryValue> ManagedUserSyncService::CreateDictionary(
- const std::string& name,
- const std::string& master_key,
- const std::string& signature_key,
- const std::string& encryption_key,
- int avatar_index) {
- scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue());
- result->SetString(kName, name);
- result->SetString(kMasterKey, master_key);
- result->SetString(kPasswordSignatureKey, signature_key);
- result->SetString(kPasswordEncryptionKey, encryption_key);
- // TODO(akuegel): Get rid of the avatar stuff here when Chrome OS switches
- // to the avatar index that is stored as a shared setting.
- std::string chrome_avatar;
- std::string chromeos_avatar;
-#if defined(OS_CHROMEOS)
- chromeos_avatar = BuildAvatarString(avatar_index);
-#else
- chrome_avatar = BuildAvatarString(avatar_index);
-#endif
- result->SetString(kChromeAvatar, chrome_avatar);
- result->SetString(kChromeOsAvatar, chromeos_avatar);
- return result.Pass();
-}
-
-void ManagedUserSyncService::AddManagedUser(const std::string& id,
- const std::string& name,
- const std::string& master_key,
- const std::string& signature_key,
- const std::string& encryption_key,
- int avatar_index) {
- UpdateManagedUserImpl(id,
- name,
- master_key,
- signature_key,
- encryption_key,
- avatar_index,
- true /* add */);
-}
-
-void ManagedUserSyncService::UpdateManagedUser(
- const std::string& id,
- const std::string& name,
- const std::string& master_key,
- const std::string& signature_key,
- const std::string& encryption_key,
- int avatar_index) {
- UpdateManagedUserImpl(id,
- name,
- master_key,
- signature_key,
- encryption_key,
- avatar_index,
- false /* update */);
-}
-
-void ManagedUserSyncService::UpdateManagedUserImpl(
- const std::string& id,
- const std::string& name,
- const std::string& master_key,
- const std::string& signature_key,
- const std::string& encryption_key,
- int avatar_index,
- bool add_user) {
- DictionaryPrefUpdate update(prefs_, prefs::kSupervisedUsers);
- base::DictionaryValue* dict = update.Get();
- scoped_ptr<base::DictionaryValue> value = CreateDictionary(
- name, master_key, signature_key, encryption_key, avatar_index);
-
- DCHECK_EQ(add_user, !dict->HasKey(id));
- base::DictionaryValue* entry = value.get();
- dict->SetWithoutPathExpansion(id, value.release());
-
- if (!sync_processor_)
- return;
-
- // If we're already syncing, create a new change and upload it.
- SyncChangeList change_list;
- change_list.push_back(
- SyncChange(FROM_HERE,
- add_user ? SyncChange::ACTION_ADD : SyncChange::ACTION_UPDATE,
- CreateSyncDataFromDictionaryEntry(id, *entry)));
- SyncError error =
- sync_processor_->ProcessSyncChanges(FROM_HERE, change_list);
- DCHECK(!error.IsSet()) << error.ToString();
-}
-
-void ManagedUserSyncService::DeleteManagedUser(const std::string& id) {
- DictionaryPrefUpdate update(prefs_, prefs::kSupervisedUsers);
- bool success = update->RemoveWithoutPathExpansion(id, NULL);
- DCHECK(success);
-
- if (!sync_processor_)
- return;
-
- SyncChangeList change_list;
- change_list.push_back(SyncChange(
- FROM_HERE,
- SyncChange::ACTION_DELETE,
- SyncData::CreateLocalDelete(id, SUPERVISED_USERS)));
- SyncError sync_error =
- sync_processor_->ProcessSyncChanges(FROM_HERE, change_list);
- DCHECK(!sync_error.IsSet());
-}
-
-const base::DictionaryValue* ManagedUserSyncService::GetManagedUsers() {
- DCHECK(sync_processor_);
- return prefs_->GetDictionary(prefs::kSupervisedUsers);
-}
-
-bool ManagedUserSyncService::UpdateManagedUserAvatarIfNeeded(
- const std::string& id,
- int avatar_index) {
- DictionaryPrefUpdate update(prefs_, prefs::kSupervisedUsers);
- base::DictionaryValue* dict = update.Get();
- DCHECK(dict->HasKey(id));
- base::DictionaryValue* value = NULL;
- bool success = dict->GetDictionaryWithoutPathExpansion(id, &value);
- DCHECK(success);
-
- bool acknowledged = false;
- value->GetBoolean(ManagedUserSyncService::kAcknowledged, &acknowledged);
- std::string name;
- value->GetString(ManagedUserSyncService::kName, &name);
- std::string master_key;
- value->GetString(ManagedUserSyncService::kMasterKey, &master_key);
- std::string signature;
- value->GetString(ManagedUserSyncService::kPasswordSignatureKey, &signature);
- std::string encryption;
- value->GetString(ManagedUserSyncService::kPasswordEncryptionKey, &encryption);
- std::string chromeos_avatar;
- value->GetString(ManagedUserSyncService::kChromeOsAvatar, &chromeos_avatar);
- std::string chrome_avatar;
- value->GetString(ManagedUserSyncService::kChromeAvatar, &chrome_avatar);
- // The following check is just for safety. We want to avoid that the existing
- // avatar selection is overwritten. Currently we don't allow the user to
- // choose a different avatar in the recreation dialog, anyway, if there is
- // already an avatar selected.
-#if defined(OS_CHROMEOS)
- if (!chromeos_avatar.empty() && avatar_index != kNoAvatar)
- return false;
-#else
- if (!chrome_avatar.empty() && avatar_index != kNoAvatar)
- return false;
-#endif
-
- chrome_avatar = avatar_index == kNoAvatar ?
- std::string() : BuildAvatarString(avatar_index);
-#if defined(OS_CHROMEOS)
- value->SetString(kChromeOsAvatar, chrome_avatar);
-#else
- value->SetString(kChromeAvatar, chrome_avatar);
-#endif
-
- if (!sync_processor_)
- return true;
-
- SyncChangeList change_list;
- change_list.push_back(SyncChange(
- FROM_HERE,
- SyncChange::ACTION_UPDATE,
- CreateLocalSyncData(id, name, acknowledged, master_key,
- chrome_avatar, chromeos_avatar,
- signature, encryption)));
- SyncError error =
- sync_processor_->ProcessSyncChanges(FROM_HERE, change_list);
- DCHECK(!error.IsSet()) << error.ToString();
- return true;
-}
-
-void ManagedUserSyncService::ClearManagedUserAvatar(const std::string& id) {
- bool cleared = UpdateManagedUserAvatarIfNeeded(id, kNoAvatar);
- DCHECK(cleared);
-}
-
-void ManagedUserSyncService::GetManagedUsersAsync(
- const ManagedUsersCallback& callback) {
- // If we are already syncing, just run the callback.
- if (sync_processor_) {
- callback.Run(GetManagedUsers());
- return;
- }
-
- // Otherwise queue it up until we start syncing.
- callbacks_.push_back(callback);
-}
-
-void ManagedUserSyncService::Shutdown() {
- NotifyManagedUsersSyncingStopped();
-}
-
-SyncMergeResult ManagedUserSyncService::MergeDataAndStartSyncing(
- ModelType type,
- const SyncDataList& initial_sync_data,
- scoped_ptr<SyncChangeProcessor> sync_processor,
- scoped_ptr<SyncErrorFactory> error_handler) {
- DCHECK_EQ(SUPERVISED_USERS, type);
- sync_processor_ = sync_processor.Pass();
- error_handler_ = error_handler.Pass();
-
- SyncChangeList change_list;
- SyncMergeResult result(SUPERVISED_USERS);
-
- DictionaryPrefUpdate update(prefs_, prefs::kSupervisedUsers);
- base::DictionaryValue* dict = update.Get();
- result.set_num_items_before_association(dict->size());
- std::set<std::string> seen_ids;
- int num_items_added = 0;
- int num_items_modified = 0;
- for (SyncDataList::const_iterator it = initial_sync_data.begin();
- it != initial_sync_data.end(); ++it) {
- DCHECK_EQ(SUPERVISED_USERS, it->GetDataType());
- const ManagedUserSpecifics& managed_user =
- it->GetSpecifics().managed_user();
- base::DictionaryValue* value = new base::DictionaryValue();
- 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());
- value->SetString(kPasswordSignatureKey,
- managed_user.password_signature_key());
- value->SetString(kPasswordEncryptionKey,
- managed_user.password_encryption_key());
- if (dict->HasKey(managed_user.id()))
- num_items_modified++;
- else
- num_items_added++;
- dict->SetWithoutPathExpansion(managed_user.id(), value);
- seen_ids.insert(managed_user.id());
- }
-
- for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) {
- if (seen_ids.find(it.key()) != seen_ids.end())
- continue;
-
- change_list.push_back(
- SyncChange(FROM_HERE,
- SyncChange::ACTION_ADD,
- CreateSyncDataFromDictionaryEntry(it.key(), it.value())));
- }
- result.set_error(sync_processor_->ProcessSyncChanges(FROM_HERE, change_list));
-
- result.set_num_items_modified(num_items_modified);
- result.set_num_items_added(num_items_added);
- result.set_num_items_after_association(dict->size());
-
- DispatchCallbacks();
-
- return result;
-}
-
-void ManagedUserSyncService::StopSyncing(ModelType type) {
- DCHECK_EQ(SUPERVISED_USERS, type);
- // The observers may want to change the Sync data, so notify them before
- // resetting the |sync_processor_|.
- NotifyManagedUsersSyncingStopped();
- sync_processor_.reset();
- error_handler_.reset();
-}
-
-SyncDataList ManagedUserSyncService::GetAllSyncData(
- ModelType type) const {
- SyncDataList data;
- DictionaryPrefUpdate update(prefs_, prefs::kSupervisedUsers);
- base::DictionaryValue* dict = update.Get();
- for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance())
- data.push_back(CreateSyncDataFromDictionaryEntry(it.key(), it.value()));
-
- return data;
-}
-
-SyncError ManagedUserSyncService::ProcessSyncChanges(
- const tracked_objects::Location& from_here,
- const SyncChangeList& change_list) {
- SyncError error;
- DictionaryPrefUpdate update(prefs_, prefs::kSupervisedUsers);
- base::DictionaryValue* dict = update.Get();
- for (SyncChangeList::const_iterator it = change_list.begin();
- it != change_list.end(); ++it) {
- SyncData data = it->sync_data();
- DCHECK_EQ(SUPERVISED_USERS, data.GetDataType());
- const ManagedUserSpecifics& managed_user =
- data.GetSpecifics().managed_user();
- switch (it->change_type()) {
- case SyncChange::ACTION_ADD:
- case SyncChange::ACTION_UPDATE: {
- // Every item we get from the server should be acknowledged.
- DCHECK(managed_user.acknowledged());
- const base::DictionaryValue* old_value = NULL;
- dict->GetDictionaryWithoutPathExpansion(managed_user.id(), &old_value);
-
- // For an update action, the managed user should already exist, for an
- // add action, it should not.
- DCHECK_EQ(
- old_value ? SyncChange::ACTION_UPDATE : SyncChange::ACTION_ADD,
- it->change_type());
-
- // If the managed user switched from unacknowledged to acknowledged,
- // we might need to continue with a registration.
- if (old_value && !old_value->HasKey(kAcknowledged))
- NotifyManagedUserAcknowledged(managed_user.id());
-
- base::DictionaryValue* value = new base::DictionaryValue;
- 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());
- value->SetString(kPasswordSignatureKey,
- managed_user.password_signature_key());
- value->SetString(kPasswordEncryptionKey,
- managed_user.password_encryption_key());
- dict->SetWithoutPathExpansion(managed_user.id(), value);
-
- NotifyManagedUsersChanged();
- break;
- }
- case SyncChange::ACTION_DELETE: {
- DCHECK(dict->HasKey(managed_user.id())) << managed_user.id();
- dict->RemoveWithoutPathExpansion(managed_user.id(), NULL);
- break;
- }
- case SyncChange::ACTION_INVALID: {
- NOTREACHED();
- break;
- }
- }
- }
- return error;
-}
-
-void ManagedUserSyncService::OnLastSignedInUsernameChange() {
- DCHECK(!sync_processor_);
-
- // If the last signed in user changes, we clear all data, to avoid managed
- // users from one custodian appearing in another one's profile.
- prefs_->ClearPref(prefs::kSupervisedUsers);
-}
-
-void ManagedUserSyncService::NotifyManagedUserAcknowledged(
- const std::string& managed_user_id) {
- FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_,
- OnManagedUserAcknowledged(managed_user_id));
-}
-
-void ManagedUserSyncService::NotifyManagedUsersSyncingStopped() {
- FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_,
- OnManagedUsersSyncingStopped());
-}
-
-void ManagedUserSyncService::NotifyManagedUsersChanged() {
- FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver,
- observers_,
- OnManagedUsersChanged());
-}
-
-void ManagedUserSyncService::DispatchCallbacks() {
- const base::DictionaryValue* managed_users =
- prefs_->GetDictionary(prefs::kSupervisedUsers);
- for (std::vector<ManagedUsersCallback>::iterator it = callbacks_.begin();
- it != callbacks_.end(); ++it) {
- it->Run(managed_users);
- }
- callbacks_.clear();
-}

Powered by Google App Engine
This is Rietveld 408576698