| Index: chrome/browser/managed_mode/managed_user_shared_settings_service.cc
|
| diff --git a/chrome/browser/managed_mode/managed_user_shared_settings_service.cc b/chrome/browser/managed_mode/managed_user_shared_settings_service.cc
|
| deleted file mode 100644
|
| index 74c0b77d444a6c2ca1c7f9cf99c726e1aa2ecb3d..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/managed_mode/managed_user_shared_settings_service.cc
|
| +++ /dev/null
|
| @@ -1,346 +0,0 @@
|
| -// Copyright 2014 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_shared_settings_service.h"
|
| -
|
| -#include "base/json/json_reader.h"
|
| -#include "base/json/json_writer.h"
|
| -#include "base/prefs/pref_service.h"
|
| -#include "base/prefs/scoped_user_pref_update.h"
|
| -#include "base/values.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"
|
| -
|
| -using base::DictionaryValue;
|
| -using base::Value;
|
| -using syncer::SUPERVISED_USER_SHARED_SETTINGS;
|
| -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;
|
| -
|
| -namespace {
|
| -
|
| -const char kAcknowledged[] = "acknowledged";
|
| -const char kValue[] = "value";
|
| -
|
| -DictionaryValue* FindOrCreateDictionary(DictionaryValue* parent,
|
| - const std::string& key) {
|
| - DictionaryValue* dict = NULL;
|
| - if (!parent->GetDictionaryWithoutPathExpansion(key, &dict)) {
|
| - dict = new DictionaryValue;
|
| - parent->SetWithoutPathExpansion(key, dict);
|
| - }
|
| - return dict;
|
| -}
|
| -
|
| -class ScopedManagedUserSharedSettingsUpdate {
|
| - public:
|
| - ScopedManagedUserSharedSettingsUpdate(PrefService* prefs,
|
| - const std::string& mu_id)
|
| - : update_(prefs, prefs::kSupervisedUserSharedSettings), mu_id_(mu_id) {
|
| - DCHECK(!mu_id.empty());
|
| -
|
| - // A supervised user can only modify their own settings.
|
| - std::string id = prefs->GetString(prefs::kSupervisedUserId);
|
| - DCHECK(id.empty() || id == mu_id);
|
| - }
|
| -
|
| - DictionaryValue* Get() {
|
| - return FindOrCreateDictionary(update_.Get(), mu_id_);
|
| - }
|
| -
|
| - private:
|
| - DictionaryPrefUpdate update_;
|
| - std::string mu_id_;
|
| -};
|
| -
|
| -SyncData CreateSyncDataForValue(
|
| - const std::string& mu_id,
|
| - const std::string& key,
|
| - const Value& dict_value) {
|
| - const DictionaryValue* dict = NULL;
|
| - if (!dict_value.GetAsDictionary(&dict))
|
| - return SyncData();
|
| -
|
| - const Value* value = NULL;
|
| - if (!dict->Get(kValue, &value))
|
| - return SyncData();
|
| -
|
| - bool acknowledged = false;
|
| - dict->GetBoolean(kAcknowledged, &acknowledged);
|
| -
|
| - return ManagedUserSharedSettingsService::CreateSyncDataForSetting(
|
| - mu_id, key, *value, acknowledged);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -
|
| -ManagedUserSharedSettingsService::ManagedUserSharedSettingsService(
|
| - PrefService* prefs)
|
| - : prefs_(prefs) {}
|
| -
|
| -ManagedUserSharedSettingsService::~ManagedUserSharedSettingsService() {}
|
| -
|
| -void ManagedUserSharedSettingsService::SetValueInternal(
|
| - const std::string& mu_id,
|
| - const std::string& key,
|
| - const Value& value,
|
| - bool acknowledged) {
|
| - ScopedManagedUserSharedSettingsUpdate update(prefs_, mu_id);
|
| - DictionaryValue* update_dict = update.Get();
|
| -
|
| - DictionaryValue* dict = NULL;
|
| - bool has_key = update_dict->GetDictionaryWithoutPathExpansion(key, &dict);
|
| - if (!has_key) {
|
| - dict = new DictionaryValue;
|
| - update_dict->SetWithoutPathExpansion(key, dict);
|
| - }
|
| - dict->SetWithoutPathExpansion(kValue, value.DeepCopy());
|
| - dict->SetBooleanWithoutPathExpansion(kAcknowledged, acknowledged);
|
| -
|
| - if (!sync_processor_)
|
| - return;
|
| -
|
| - SyncData data = CreateSyncDataForSetting(mu_id, key, value, acknowledged);
|
| - SyncChange::SyncChangeType change_type =
|
| - has_key ? SyncChange::ACTION_UPDATE : SyncChange::ACTION_ADD;
|
| - SyncChangeList changes;
|
| - changes.push_back(SyncChange(FROM_HERE, change_type, data));
|
| - SyncError error = sync_processor_->ProcessSyncChanges(FROM_HERE, changes);
|
| - DCHECK(!error.IsSet()) << error.ToString();
|
| -}
|
| -
|
| -const Value* ManagedUserSharedSettingsService::GetValue(
|
| - const std::string& mu_id,
|
| - const std::string& key) {
|
| - const DictionaryValue* data =
|
| - prefs_->GetDictionary(prefs::kSupervisedUserSharedSettings);
|
| - const DictionaryValue* dict = NULL;
|
| - if (!data->GetDictionaryWithoutPathExpansion(mu_id, &dict))
|
| - return NULL;
|
| -
|
| - const DictionaryValue* settings = NULL;
|
| - if (!dict->GetDictionaryWithoutPathExpansion(key, &settings))
|
| - return NULL;
|
| -
|
| - const Value* value = NULL;
|
| - if (!settings->GetWithoutPathExpansion(kValue, &value))
|
| - return NULL;
|
| -
|
| - return value;
|
| -}
|
| -
|
| -void ManagedUserSharedSettingsService::SetValue(
|
| - const std::string& mu_id,
|
| - const std::string& key,
|
| - const Value& value) {
|
| - SetValueInternal(mu_id, key, value, true);
|
| -}
|
| -
|
| -scoped_ptr<ManagedUserSharedSettingsService::ChangeCallbackList::Subscription>
|
| -ManagedUserSharedSettingsService::Subscribe(
|
| - const ManagedUserSharedSettingsService::ChangeCallback& cb) {
|
| - return callbacks_.Add(cb);
|
| -}
|
| -
|
| -// static
|
| -void ManagedUserSharedSettingsService::RegisterProfilePrefs(
|
| - user_prefs::PrefRegistrySyncable* registry) {
|
| - registry->RegisterDictionaryPref(
|
| - prefs::kSupervisedUserSharedSettings,
|
| - user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
|
| -}
|
| -
|
| -// static
|
| -SyncData ManagedUserSharedSettingsService::CreateSyncDataForSetting(
|
| - const std::string& mu_id,
|
| - const std::string& key,
|
| - const Value& value,
|
| - bool acknowledged) {
|
| - std::string json_value;
|
| - base::JSONWriter::Write(&value, &json_value);
|
| - ::sync_pb::EntitySpecifics specifics;
|
| - specifics.mutable_managed_user_shared_setting()->set_mu_id(mu_id);
|
| - specifics.mutable_managed_user_shared_setting()->set_key(key);
|
| - specifics.mutable_managed_user_shared_setting()->set_value(json_value);
|
| - specifics.mutable_managed_user_shared_setting()->set_acknowledged(
|
| - acknowledged);
|
| - std::string title = mu_id + ":" + key;
|
| - return SyncData::CreateLocalData(title, title, specifics);
|
| -}
|
| -
|
| -void ManagedUserSharedSettingsService::Shutdown() {}
|
| -
|
| -syncer::SyncMergeResult
|
| -ManagedUserSharedSettingsService::MergeDataAndStartSyncing(
|
| - syncer::ModelType type,
|
| - const syncer::SyncDataList& initial_sync_data,
|
| - scoped_ptr<syncer::SyncChangeProcessor> sync_processor,
|
| - scoped_ptr<syncer::SyncErrorFactory> error_handler) {
|
| - DCHECK_EQ(SUPERVISED_USER_SHARED_SETTINGS, type);
|
| - sync_processor_ = sync_processor.Pass();
|
| - error_handler_ = error_handler.Pass();
|
| -
|
| - // We keep a map from MU ID to the set of keys that we have seen in the
|
| - // initial sync data.
|
| - std::map<std::string, std::set<std::string> > seen_keys;
|
| -
|
| - // Iterate over all initial sync data, and update it locally. This means that
|
| - // the value from the server always wins over a local value.
|
| - for (SyncDataList::const_iterator it = initial_sync_data.begin();
|
| - it != initial_sync_data.end();
|
| - ++it) {
|
| - DCHECK_EQ(SUPERVISED_USER_SHARED_SETTINGS, it->GetDataType());
|
| - const ::sync_pb::ManagedUserSharedSettingSpecifics&
|
| - managed_user_shared_setting =
|
| - it->GetSpecifics().managed_user_shared_setting();
|
| - scoped_ptr<Value> value(
|
| - base::JSONReader::Read(managed_user_shared_setting.value()));
|
| - const std::string& mu_id = managed_user_shared_setting.mu_id();
|
| - ScopedManagedUserSharedSettingsUpdate update(prefs_, mu_id);
|
| - const std::string& key = managed_user_shared_setting.key();
|
| - DictionaryValue* dict = FindOrCreateDictionary(update.Get(), key);
|
| - dict->SetWithoutPathExpansion(kValue, value.release());
|
| -
|
| - // Every setting we get from the server should have the acknowledged flag
|
| - // set.
|
| - DCHECK(managed_user_shared_setting.acknowledged());
|
| - dict->SetBooleanWithoutPathExpansion(
|
| - kAcknowledged, managed_user_shared_setting.acknowledged());
|
| - callbacks_.Notify(mu_id, key);
|
| -
|
| - seen_keys[mu_id].insert(key);
|
| - }
|
| -
|
| - // Iterate over all settings that we have locally, which includes settings
|
| - // that were just synced down. We filter those out using |seen_keys|.
|
| - SyncChangeList change_list;
|
| - const DictionaryValue* all_settings =
|
| - prefs_->GetDictionary(prefs::kSupervisedUserSharedSettings);
|
| - for (DictionaryValue::Iterator it(*all_settings); !it.IsAtEnd();
|
| - it.Advance()) {
|
| - const DictionaryValue* dict = NULL;
|
| - bool success = it.value().GetAsDictionary(&dict);
|
| - DCHECK(success);
|
| -
|
| - const std::set<std::string>& seen = seen_keys[it.key()];
|
| - for (DictionaryValue::Iterator jt(*dict); !jt.IsAtEnd(); jt.Advance()) {
|
| - // We only need to upload settings that we haven't seen in the initial
|
| - // sync data (which means they were added locally).
|
| - if (seen.count(jt.key()) > 0)
|
| - continue;
|
| -
|
| - SyncData data = CreateSyncDataForValue(it.key(), jt.key(), jt.value());
|
| - DCHECK(data.IsValid());
|
| - change_list.push_back(
|
| - SyncChange(FROM_HERE, SyncChange::ACTION_ADD, data));
|
| - }
|
| - }
|
| -
|
| - SyncMergeResult result(SUPERVISED_USER_SHARED_SETTINGS);
|
| - // Process all the accumulated changes.
|
| - if (change_list.size() > 0) {
|
| - result.set_error(
|
| - sync_processor_->ProcessSyncChanges(FROM_HERE, change_list));
|
| - }
|
| -
|
| - // TODO(bauerb): Statistics?
|
| - return result;
|
| -}
|
| -
|
| -void ManagedUserSharedSettingsService::StopSyncing(syncer::ModelType type) {
|
| - DCHECK_EQ(SUPERVISED_USER_SHARED_SETTINGS, type);
|
| - sync_processor_.reset();
|
| - error_handler_.reset();
|
| -}
|
| -
|
| -syncer::SyncDataList ManagedUserSharedSettingsService::GetAllSyncData(
|
| - syncer::ModelType type) const {
|
| - DCHECK_EQ(SUPERVISED_USER_SHARED_SETTINGS, type);
|
| - SyncDataList data;
|
| - const DictionaryValue* all_settings =
|
| - prefs_->GetDictionary(prefs::kSupervisedUserSharedSettings);
|
| - for (DictionaryValue::Iterator it(*all_settings); !it.IsAtEnd();
|
| - it.Advance()) {
|
| - const DictionaryValue* dict = NULL;
|
| - bool success = it.value().GetAsDictionary(&dict);
|
| - DCHECK(success);
|
| - for (DictionaryValue::Iterator jt(*dict); !jt.IsAtEnd(); jt.Advance()) {
|
| - data.push_back(CreateSyncDataForValue(it.key(), jt.key(), jt.value()));
|
| - }
|
| - }
|
| - return data;
|
| -}
|
| -
|
| -syncer::SyncError ManagedUserSharedSettingsService::ProcessSyncChanges(
|
| - const tracked_objects::Location& from_here,
|
| - const syncer::SyncChangeList& change_list) {
|
| - for (SyncChangeList::const_iterator it = change_list.begin();
|
| - it != change_list.end();
|
| - ++it) {
|
| - SyncData data = it->sync_data();
|
| - DCHECK_EQ(SUPERVISED_USER_SHARED_SETTINGS, data.GetDataType());
|
| - const ::sync_pb::ManagedUserSharedSettingSpecifics&
|
| - managed_user_shared_setting =
|
| - data.GetSpecifics().managed_user_shared_setting();
|
| - const std::string& key = managed_user_shared_setting.key();
|
| - const std::string& mu_id = managed_user_shared_setting.mu_id();
|
| - ScopedManagedUserSharedSettingsUpdate update(prefs_, mu_id);
|
| - DictionaryValue* update_dict = update.Get();
|
| - DictionaryValue* dict = NULL;
|
| - bool has_key = update_dict->GetDictionaryWithoutPathExpansion(key, &dict);
|
| - switch (it->change_type()) {
|
| - case SyncChange::ACTION_ADD:
|
| - case SyncChange::ACTION_UPDATE: {
|
| - // Every setting we get from the server should have the acknowledged
|
| - // flag set.
|
| - DCHECK(managed_user_shared_setting.acknowledged());
|
| -
|
| - if (has_key) {
|
| - // If the managed user already exists, it should be an update action.
|
| - DCHECK_EQ(SyncChange::ACTION_UPDATE, it->change_type());
|
| - } else {
|
| - // Otherwise, it should be an add action.
|
| - DCHECK_EQ(SyncChange::ACTION_ADD, it->change_type());
|
| - dict = new DictionaryValue;
|
| - update_dict->SetWithoutPathExpansion(key, dict);
|
| - }
|
| - scoped_ptr<Value> value(
|
| - base::JSONReader::Read(managed_user_shared_setting.value()));
|
| - dict->SetWithoutPathExpansion(kValue, value.release());
|
| - dict->SetBooleanWithoutPathExpansion(
|
| - kAcknowledged, managed_user_shared_setting.acknowledged());
|
| - break;
|
| - }
|
| - case SyncChange::ACTION_DELETE: {
|
| - if (has_key)
|
| - update_dict->RemoveWithoutPathExpansion(key, NULL);
|
| - else
|
| - NOTREACHED() << "Trying to delete nonexistent key " << key;
|
| - break;
|
| - }
|
| - case SyncChange::ACTION_INVALID: {
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - }
|
| - callbacks_.Notify(mu_id, key);
|
| - }
|
| -
|
| - SyncError error;
|
| - return error;
|
| -}
|
|
|