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(); |
-} |