| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/managed_mode/managed_user_sync_service.h" | 5 #include "chrome/browser/managed_mode/managed_user_sync_service.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/strings/string_number_conversions.h" |
| 9 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| 10 #include "base/values.h" | 11 #include "base/values.h" |
| 11 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 12 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
| 12 #include "chrome/browser/profiles/profile.h" | 13 #include "chrome/browser/profiles/profile.h" |
| 13 #include "chrome/common/pref_names.h" | 14 #include "chrome/common/pref_names.h" |
| 14 #include "components/user_prefs/pref_registry_syncable.h" | 15 #include "components/user_prefs/pref_registry_syncable.h" |
| 15 #include "sync/api/sync_change.h" | 16 #include "sync/api/sync_change.h" |
| 16 #include "sync/api/sync_data.h" | 17 #include "sync/api/sync_data.h" |
| 17 #include "sync/api/sync_error.h" | 18 #include "sync/api/sync_error.h" |
| 18 #include "sync/api/sync_error_factory.h" | 19 #include "sync/api/sync_error_factory.h" |
| 19 #include "sync/api/sync_merge_result.h" | 20 #include "sync/api/sync_merge_result.h" |
| 20 #include "sync/protocol/sync.pb.h" | 21 #include "sync/protocol/sync.pb.h" |
| 21 | 22 |
| 22 using base::DictionaryValue; | 23 using base::DictionaryValue; |
| 23 using user_prefs::PrefRegistrySyncable; | 24 using user_prefs::PrefRegistrySyncable; |
| 24 using syncer::MANAGED_USERS; | 25 using syncer::MANAGED_USERS; |
| 25 using syncer::ModelType; | 26 using syncer::ModelType; |
| 26 using syncer::SyncChange; | 27 using syncer::SyncChange; |
| 27 using syncer::SyncChangeList; | 28 using syncer::SyncChangeList; |
| 28 using syncer::SyncChangeProcessor; | 29 using syncer::SyncChangeProcessor; |
| 29 using syncer::SyncData; | 30 using syncer::SyncData; |
| 30 using syncer::SyncDataList; | 31 using syncer::SyncDataList; |
| 31 using syncer::SyncError; | 32 using syncer::SyncError; |
| 32 using syncer::SyncErrorFactory; | 33 using syncer::SyncErrorFactory; |
| 33 using syncer::SyncMergeResult; | 34 using syncer::SyncMergeResult; |
| 34 using sync_pb::ManagedUserSpecifics; | 35 using sync_pb::ManagedUserSpecifics; |
| 35 | 36 |
| 36 namespace { | 37 namespace { |
| 37 | 38 |
| 38 const char kAcknowledged[] = "acknowledged"; | 39 const char kChromeAvatarPrefix[] = "chrome-avatar-index:"; |
| 39 const char kChromeAvatar[] = "chromeAvatar"; | |
| 40 const char kChromeOsAvatar[] = "chromeOsAvatar"; | |
| 41 const char kName[] = "name"; | |
| 42 const char kMasterKey[] = "masterKey"; | |
| 43 | 40 |
| 44 SyncData CreateLocalSyncData(const std::string& id, | 41 SyncData CreateLocalSyncData(const std::string& id, |
| 45 const std::string& name, | 42 const std::string& name, |
| 46 bool acknowledged, | 43 bool acknowledged, |
| 47 const std::string& master_key, | 44 const std::string& master_key, |
| 48 const std::string& chrome_avatar, | 45 const std::string& chrome_avatar, |
| 49 const std::string& chromeos_avatar) { | 46 const std::string& chromeos_avatar) { |
| 50 ::sync_pb::EntitySpecifics specifics; | 47 ::sync_pb::EntitySpecifics specifics; |
| 51 specifics.mutable_managed_user()->set_id(id); | 48 specifics.mutable_managed_user()->set_id(id); |
| 52 specifics.mutable_managed_user()->set_name(name); | 49 specifics.mutable_managed_user()->set_name(name); |
| 53 if (!chrome_avatar.empty()) | 50 if (!chrome_avatar.empty()) |
| 54 specifics.mutable_managed_user()->set_chrome_avatar(chrome_avatar); | 51 specifics.mutable_managed_user()->set_chrome_avatar(chrome_avatar); |
| 55 if (!chromeos_avatar.empty()) | 52 if (!chromeos_avatar.empty()) |
| 56 specifics.mutable_managed_user()->set_chromeos_avatar(chromeos_avatar); | 53 specifics.mutable_managed_user()->set_chromeos_avatar(chromeos_avatar); |
| 57 if (!master_key.empty()) | 54 if (!master_key.empty()) |
| 58 specifics.mutable_managed_user()->set_master_key(master_key); | 55 specifics.mutable_managed_user()->set_master_key(master_key); |
| 59 if (acknowledged) | 56 if (acknowledged) |
| 60 specifics.mutable_managed_user()->set_acknowledged(true); | 57 specifics.mutable_managed_user()->set_acknowledged(true); |
| 61 return SyncData::CreateLocalData(id, name, specifics); | 58 return SyncData::CreateLocalData(id, name, specifics); |
| 62 } | 59 } |
| 63 | 60 |
| 64 SyncData CreateSyncDataFromDictionaryEntry( | 61 SyncData CreateSyncDataFromDictionaryEntry( |
| 65 const DictionaryValue::Iterator& it) { | 62 const DictionaryValue::Iterator& it) { |
| 66 const DictionaryValue* dict = NULL; | 63 const DictionaryValue* dict = NULL; |
| 67 bool success = it.value().GetAsDictionary(&dict); | 64 bool success = it.value().GetAsDictionary(&dict); |
| 68 DCHECK(success); | 65 DCHECK(success); |
| 69 bool acknowledged = false; | 66 bool acknowledged = false; |
| 70 dict->GetBoolean(kAcknowledged, &acknowledged); | 67 dict->GetBoolean(ManagedUserSyncService::kAcknowledged, &acknowledged); |
| 71 std::string name; | 68 std::string name; |
| 72 dict->GetString(kName, &name); | 69 dict->GetString(ManagedUserSyncService::kName, &name); |
| 73 DCHECK(!name.empty()); | 70 DCHECK(!name.empty()); |
| 74 std::string master_key; | 71 std::string master_key; |
| 75 dict->GetString(kMasterKey, &master_key); | 72 dict->GetString(ManagedUserSyncService::kMasterKey, &master_key); |
| 76 std::string chrome_avatar; | 73 std::string chrome_avatar; |
| 77 dict->GetString(kChromeAvatar, &chrome_avatar); | 74 dict->GetString(ManagedUserSyncService::kChromeAvatar, &chrome_avatar); |
| 78 std::string chromeos_avatar; | 75 std::string chromeos_avatar; |
| 79 dict->GetString(kChromeOsAvatar, &chromeos_avatar); | 76 dict->GetString(ManagedUserSyncService::kChromeOsAvatar, &chromeos_avatar); |
| 80 | 77 |
| 81 return CreateLocalSyncData(it.key(), name, acknowledged, master_key, | 78 return CreateLocalSyncData(it.key(), name, acknowledged, master_key, |
| 82 chrome_avatar, chromeos_avatar); | 79 chrome_avatar, chromeos_avatar); |
| 83 } | 80 } |
| 84 | 81 |
| 85 } // namespace | 82 } // namespace |
| 86 | 83 |
| 84 const char ManagedUserSyncService::kAcknowledged[] = "acknowledged"; |
| 85 const char ManagedUserSyncService::kChromeAvatar[] = "chromeAvatar"; |
| 86 const char ManagedUserSyncService::kChromeOsAvatar[] = "chromeOsAvatar"; |
| 87 const char ManagedUserSyncService::kName[] = "name"; |
| 88 const char ManagedUserSyncService::kMasterKey[] = "masterKey"; |
| 89 |
| 87 ManagedUserSyncService::ManagedUserSyncService(PrefService* prefs) | 90 ManagedUserSyncService::ManagedUserSyncService(PrefService* prefs) |
| 88 : prefs_(prefs) { | 91 : prefs_(prefs) { |
| 89 pref_change_registrar_.Init(prefs_); | 92 pref_change_registrar_.Init(prefs_); |
| 90 pref_change_registrar_.Add( | 93 pref_change_registrar_.Add( |
| 91 prefs::kGoogleServicesLastUsername, | 94 prefs::kGoogleServicesLastUsername, |
| 92 base::Bind(&ManagedUserSyncService::OnLastSignedInUsernameChange, | 95 base::Bind(&ManagedUserSyncService::OnLastSignedInUsernameChange, |
| 93 base::Unretained(this))); | 96 base::Unretained(this))); |
| 94 } | 97 } |
| 95 | 98 |
| 96 ManagedUserSyncService::~ManagedUserSyncService() { | 99 ManagedUserSyncService::~ManagedUserSyncService() { |
| 97 } | 100 } |
| 98 | 101 |
| 99 // static | 102 // static |
| 100 void ManagedUserSyncService::RegisterProfilePrefs( | 103 void ManagedUserSyncService::RegisterProfilePrefs( |
| 101 PrefRegistrySyncable* registry) { | 104 PrefRegistrySyncable* registry) { |
| 102 registry->RegisterDictionaryPref(prefs::kManagedUsers, | 105 registry->RegisterDictionaryPref(prefs::kManagedUsers, |
| 103 PrefRegistrySyncable::UNSYNCABLE_PREF); | 106 PrefRegistrySyncable::UNSYNCABLE_PREF); |
| 104 } | 107 } |
| 105 | 108 |
| 109 // static |
| 110 bool ManagedUserSyncService::GetAvatarIndex(const std::string& avatar_str, |
| 111 int* avatar_index) { |
| 112 // TODO(ibraaaa): when chrome OS supports supervised users avatar syncing |
| 113 // then update this method to support extracting the avatar index |
| 114 // for chrome OS as well. |
| 115 DCHECK(avatar_index); |
| 116 if (avatar_str.empty()) { |
| 117 *avatar_index = -1; |
| 118 return true; |
| 119 } |
| 120 |
| 121 size_t prefix_len = strlen(kChromeAvatarPrefix); |
| 122 if (avatar_str.size() <= prefix_len || |
| 123 avatar_str.substr(0, prefix_len) != kChromeAvatarPrefix) { |
| 124 return false; |
| 125 } |
| 126 |
| 127 return base::StringToInt(avatar_str.substr(prefix_len), avatar_index); |
| 128 } |
| 129 |
| 130 // static |
| 131 std::string ManagedUserSyncService::BuildAvatarString(int avatar_index) { |
| 132 return base::StringPrintf("%s%d", kChromeAvatarPrefix, avatar_index); |
| 133 } |
| 134 |
| 106 void ManagedUserSyncService::AddObserver( | 135 void ManagedUserSyncService::AddObserver( |
| 107 ManagedUserSyncServiceObserver* observer) { | 136 ManagedUserSyncServiceObserver* observer) { |
| 108 observers_.AddObserver(observer); | 137 observers_.AddObserver(observer); |
| 109 } | 138 } |
| 110 | 139 |
| 111 void ManagedUserSyncService::RemoveObserver( | 140 void ManagedUserSyncService::RemoveObserver( |
| 112 ManagedUserSyncServiceObserver* observer) { | 141 ManagedUserSyncServiceObserver* observer) { |
| 113 observers_.RemoveObserver(observer); | 142 observers_.RemoveObserver(observer); |
| 114 } | 143 } |
| 115 | 144 |
| 116 void ManagedUserSyncService::AddManagedUser(const std::string& id, | 145 void ManagedUserSyncService::AddManagedUser(const std::string& id, |
| 117 const std::string& name, | 146 const std::string& name, |
| 118 const std::string& master_key, | 147 const std::string& master_key, |
| 119 int avatar_index) { | 148 int avatar_index) { |
| 120 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); | 149 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); |
| 121 DictionaryValue* dict = update.Get(); | 150 DictionaryValue* dict = update.Get(); |
| 122 DictionaryValue* value = new DictionaryValue; | 151 DictionaryValue* value = new DictionaryValue; |
| 123 value->SetString(kName, name); | 152 value->SetString(kName, name); |
| 124 value->SetString(kMasterKey, master_key); | 153 value->SetString(kMasterKey, master_key); |
| 125 std::string chrome_avatar; | 154 std::string chrome_avatar; |
| 126 #if defined(CHROME_OS) | 155 #if defined(CHROME_OS) |
| 127 // This is a dummy value that is passed when a supervised user is created on | 156 // This is a dummy value that is passed when a supervised user is created on |
| 128 // Chrome OS. | 157 // Chrome OS. |
| 129 // TODO(ibraaaa): update this to use the correct avatar index | 158 // TODO(ibraaaa): update this to use the correct avatar index |
| 130 // once avatar syncing for supervised users is implemented on Chrome OS. | 159 // once avatar syncing for supervised users is implemented on Chrome OS. |
| 131 DCHECK_EQ(avatar_index, -111); | 160 DCHECK_EQ(avatar_index, -111); |
| 132 #else | 161 #else |
| 133 chrome_avatar = base::StringPrintf("chrome-avatar-index:%d", avatar_index); | 162 chrome_avatar = BuildAvatarString(avatar_index); |
| 134 #endif | 163 #endif |
| 135 value->SetString(kChromeAvatar, chrome_avatar); | 164 value->SetString(kChromeAvatar, chrome_avatar); |
| 136 // TODO(ibraaaa): this should be updated to allow supervised | 165 // TODO(ibraaaa): this should be updated to allow supervised |
| 137 // users avatar syncing on Chrome OS. | 166 // users avatar syncing on Chrome OS. |
| 138 value->SetString(kChromeOsAvatar, std::string()); | 167 value->SetString(kChromeOsAvatar, std::string()); |
| 139 DCHECK(!dict->HasKey(id)); | 168 DCHECK(!dict->HasKey(id)); |
| 140 dict->SetWithoutPathExpansion(id, value); | 169 dict->SetWithoutPathExpansion(id, value); |
| 141 | 170 |
| 142 if (!sync_processor_) | 171 if (!sync_processor_) |
| 143 return; | 172 return; |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 | 368 |
| 340 void ManagedUserSyncService::DispatchCallbacks() { | 369 void ManagedUserSyncService::DispatchCallbacks() { |
| 341 const DictionaryValue* managed_users = | 370 const DictionaryValue* managed_users = |
| 342 prefs_->GetDictionary(prefs::kManagedUsers); | 371 prefs_->GetDictionary(prefs::kManagedUsers); |
| 343 for (std::vector<ManagedUsersCallback>::iterator it = callbacks_.begin(); | 372 for (std::vector<ManagedUsersCallback>::iterator it = callbacks_.begin(); |
| 344 it != callbacks_.end(); ++it) { | 373 it != callbacks_.end(); ++it) { |
| 345 it->Run(managed_users); | 374 it->Run(managed_users); |
| 346 } | 375 } |
| 347 callbacks_.clear(); | 376 callbacks_.clear(); |
| 348 } | 377 } |
| OLD | NEW |