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/prefs/scoped_user_pref_update.h" | 9 #include "base/prefs/scoped_user_pref_update.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "base/values.h" | 12 #include "base/values.h" |
13 #include "chrome/browser/profiles/profile_avatar_icon_util.h" | 13 #include "chrome/browser/profiles/profile_avatar_icon_util.h" |
14 #include "chrome/common/pref_names.h" | 14 #include "chrome/common/pref_names.h" |
15 #include "components/pref_registry/pref_registry_syncable.h" | 15 #include "components/pref_registry/pref_registry_syncable.h" |
16 #include "sync/api/sync_change.h" | 16 #include "sync/api/sync_change.h" |
17 #include "sync/api/sync_data.h" | 17 #include "sync/api/sync_data.h" |
18 #include "sync/api/sync_error.h" | 18 #include "sync/api/sync_error.h" |
19 #include "sync/api/sync_error_factory.h" | 19 #include "sync/api/sync_error_factory.h" |
20 #include "sync/api/sync_merge_result.h" | 20 #include "sync/api/sync_merge_result.h" |
21 #include "sync/protocol/sync.pb.h" | 21 #include "sync/protocol/sync.pb.h" |
22 | 22 |
23 #if defined(OS_CHROMEOS) | 23 #if defined(OS_CHROMEOS) |
24 #include "chrome/browser/chromeos/login/users/avatar/default_user_images.h" | 24 #include "chrome/browser/chromeos/login/users/avatar/default_user_images.h" |
25 #endif | 25 #endif |
26 | 26 |
27 using base::DictionaryValue; | 27 using base::DictionaryValue; |
28 using user_prefs::PrefRegistrySyncable; | 28 using user_prefs::PrefRegistrySyncable; |
29 using syncer::MANAGED_USERS; | 29 using syncer::SUPERVISED_USERS; |
30 using syncer::ModelType; | 30 using syncer::ModelType; |
31 using syncer::SyncChange; | 31 using syncer::SyncChange; |
32 using syncer::SyncChangeList; | 32 using syncer::SyncChangeList; |
33 using syncer::SyncChangeProcessor; | 33 using syncer::SyncChangeProcessor; |
34 using syncer::SyncData; | 34 using syncer::SyncData; |
35 using syncer::SyncDataList; | 35 using syncer::SyncDataList; |
36 using syncer::SyncError; | 36 using syncer::SyncError; |
37 using syncer::SyncErrorFactory; | 37 using syncer::SyncErrorFactory; |
38 using syncer::SyncMergeResult; | 38 using syncer::SyncMergeResult; |
39 using sync_pb::ManagedUserSpecifics; | 39 using sync_pb::ManagedUserSpecifics; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 base::Bind(&ManagedUserSyncService::OnLastSignedInUsernameChange, | 128 base::Bind(&ManagedUserSyncService::OnLastSignedInUsernameChange, |
129 base::Unretained(this))); | 129 base::Unretained(this))); |
130 } | 130 } |
131 | 131 |
132 ManagedUserSyncService::~ManagedUserSyncService() { | 132 ManagedUserSyncService::~ManagedUserSyncService() { |
133 } | 133 } |
134 | 134 |
135 // static | 135 // static |
136 void ManagedUserSyncService::RegisterProfilePrefs( | 136 void ManagedUserSyncService::RegisterProfilePrefs( |
137 PrefRegistrySyncable* registry) { | 137 PrefRegistrySyncable* registry) { |
138 registry->RegisterDictionaryPref(prefs::kManagedUsers, | 138 registry->RegisterDictionaryPref(prefs::kSupervisedUsers, |
139 PrefRegistrySyncable::UNSYNCABLE_PREF); | 139 PrefRegistrySyncable::UNSYNCABLE_PREF); |
140 } | 140 } |
141 | 141 |
142 // static | 142 // static |
143 bool ManagedUserSyncService::GetAvatarIndex(const std::string& avatar_str, | 143 bool ManagedUserSyncService::GetAvatarIndex(const std::string& avatar_str, |
144 int* avatar_index) { | 144 int* avatar_index) { |
145 DCHECK(avatar_index); | 145 DCHECK(avatar_index); |
146 if (avatar_str.empty()) { | 146 if (avatar_str.empty()) { |
147 *avatar_index = kNoAvatar; | 147 *avatar_index = kNoAvatar; |
148 return true; | 148 return true; |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 } | 259 } |
260 | 260 |
261 void ManagedUserSyncService::UpdateManagedUserImpl( | 261 void ManagedUserSyncService::UpdateManagedUserImpl( |
262 const std::string& id, | 262 const std::string& id, |
263 const std::string& name, | 263 const std::string& name, |
264 const std::string& master_key, | 264 const std::string& master_key, |
265 const std::string& signature_key, | 265 const std::string& signature_key, |
266 const std::string& encryption_key, | 266 const std::string& encryption_key, |
267 int avatar_index, | 267 int avatar_index, |
268 bool add_user) { | 268 bool add_user) { |
269 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); | 269 DictionaryPrefUpdate update(prefs_, prefs::kSupervisedUsers); |
270 base::DictionaryValue* dict = update.Get(); | 270 base::DictionaryValue* dict = update.Get(); |
271 scoped_ptr<base::DictionaryValue> value = CreateDictionary( | 271 scoped_ptr<base::DictionaryValue> value = CreateDictionary( |
272 name, master_key, signature_key, encryption_key, avatar_index); | 272 name, master_key, signature_key, encryption_key, avatar_index); |
273 | 273 |
274 DCHECK_EQ(add_user, !dict->HasKey(id)); | 274 DCHECK_EQ(add_user, !dict->HasKey(id)); |
275 base::DictionaryValue* entry = value.get(); | 275 base::DictionaryValue* entry = value.get(); |
276 dict->SetWithoutPathExpansion(id, value.release()); | 276 dict->SetWithoutPathExpansion(id, value.release()); |
277 | 277 |
278 if (!sync_processor_) | 278 if (!sync_processor_) |
279 return; | 279 return; |
280 | 280 |
281 // If we're already syncing, create a new change and upload it. | 281 // If we're already syncing, create a new change and upload it. |
282 SyncChangeList change_list; | 282 SyncChangeList change_list; |
283 change_list.push_back( | 283 change_list.push_back( |
284 SyncChange(FROM_HERE, | 284 SyncChange(FROM_HERE, |
285 add_user ? SyncChange::ACTION_ADD : SyncChange::ACTION_UPDATE, | 285 add_user ? SyncChange::ACTION_ADD : SyncChange::ACTION_UPDATE, |
286 CreateSyncDataFromDictionaryEntry(id, *entry))); | 286 CreateSyncDataFromDictionaryEntry(id, *entry))); |
287 SyncError error = | 287 SyncError error = |
288 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list); | 288 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list); |
289 DCHECK(!error.IsSet()) << error.ToString(); | 289 DCHECK(!error.IsSet()) << error.ToString(); |
290 } | 290 } |
291 | 291 |
292 void ManagedUserSyncService::DeleteManagedUser(const std::string& id) { | 292 void ManagedUserSyncService::DeleteManagedUser(const std::string& id) { |
293 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); | 293 DictionaryPrefUpdate update(prefs_, prefs::kSupervisedUsers); |
294 bool success = update->RemoveWithoutPathExpansion(id, NULL); | 294 bool success = update->RemoveWithoutPathExpansion(id, NULL); |
295 DCHECK(success); | 295 DCHECK(success); |
296 | 296 |
297 if (!sync_processor_) | 297 if (!sync_processor_) |
298 return; | 298 return; |
299 | 299 |
300 SyncChangeList change_list; | 300 SyncChangeList change_list; |
301 change_list.push_back(SyncChange( | 301 change_list.push_back(SyncChange( |
302 FROM_HERE, | 302 FROM_HERE, |
303 SyncChange::ACTION_DELETE, | 303 SyncChange::ACTION_DELETE, |
304 SyncData::CreateLocalDelete(id, MANAGED_USERS))); | 304 SyncData::CreateLocalDelete(id, SUPERVISED_USERS))); |
305 SyncError sync_error = | 305 SyncError sync_error = |
306 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list); | 306 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list); |
307 DCHECK(!sync_error.IsSet()); | 307 DCHECK(!sync_error.IsSet()); |
308 } | 308 } |
309 | 309 |
310 const base::DictionaryValue* ManagedUserSyncService::GetManagedUsers() { | 310 const base::DictionaryValue* ManagedUserSyncService::GetManagedUsers() { |
311 DCHECK(sync_processor_); | 311 DCHECK(sync_processor_); |
312 return prefs_->GetDictionary(prefs::kManagedUsers); | 312 return prefs_->GetDictionary(prefs::kSupervisedUsers); |
313 } | 313 } |
314 | 314 |
315 bool ManagedUserSyncService::UpdateManagedUserAvatarIfNeeded( | 315 bool ManagedUserSyncService::UpdateManagedUserAvatarIfNeeded( |
316 const std::string& id, | 316 const std::string& id, |
317 int avatar_index) { | 317 int avatar_index) { |
318 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); | 318 DictionaryPrefUpdate update(prefs_, prefs::kSupervisedUsers); |
319 base::DictionaryValue* dict = update.Get(); | 319 base::DictionaryValue* dict = update.Get(); |
320 DCHECK(dict->HasKey(id)); | 320 DCHECK(dict->HasKey(id)); |
321 base::DictionaryValue* value = NULL; | 321 base::DictionaryValue* value = NULL; |
322 bool success = dict->GetDictionaryWithoutPathExpansion(id, &value); | 322 bool success = dict->GetDictionaryWithoutPathExpansion(id, &value); |
323 DCHECK(success); | 323 DCHECK(success); |
324 | 324 |
325 bool acknowledged = false; | 325 bool acknowledged = false; |
326 value->GetBoolean(ManagedUserSyncService::kAcknowledged, &acknowledged); | 326 value->GetBoolean(ManagedUserSyncService::kAcknowledged, &acknowledged); |
327 std::string name; | 327 std::string name; |
328 value->GetString(ManagedUserSyncService::kName, &name); | 328 value->GetString(ManagedUserSyncService::kName, &name); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 | 391 |
392 void ManagedUserSyncService::Shutdown() { | 392 void ManagedUserSyncService::Shutdown() { |
393 NotifyManagedUsersSyncingStopped(); | 393 NotifyManagedUsersSyncingStopped(); |
394 } | 394 } |
395 | 395 |
396 SyncMergeResult ManagedUserSyncService::MergeDataAndStartSyncing( | 396 SyncMergeResult ManagedUserSyncService::MergeDataAndStartSyncing( |
397 ModelType type, | 397 ModelType type, |
398 const SyncDataList& initial_sync_data, | 398 const SyncDataList& initial_sync_data, |
399 scoped_ptr<SyncChangeProcessor> sync_processor, | 399 scoped_ptr<SyncChangeProcessor> sync_processor, |
400 scoped_ptr<SyncErrorFactory> error_handler) { | 400 scoped_ptr<SyncErrorFactory> error_handler) { |
401 DCHECK_EQ(MANAGED_USERS, type); | 401 DCHECK_EQ(SUPERVISED_USERS, type); |
402 sync_processor_ = sync_processor.Pass(); | 402 sync_processor_ = sync_processor.Pass(); |
403 error_handler_ = error_handler.Pass(); | 403 error_handler_ = error_handler.Pass(); |
404 | 404 |
405 SyncChangeList change_list; | 405 SyncChangeList change_list; |
406 SyncMergeResult result(MANAGED_USERS); | 406 SyncMergeResult result(SUPERVISED_USERS); |
407 | 407 |
408 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); | 408 DictionaryPrefUpdate update(prefs_, prefs::kSupervisedUsers); |
409 base::DictionaryValue* dict = update.Get(); | 409 base::DictionaryValue* dict = update.Get(); |
410 result.set_num_items_before_association(dict->size()); | 410 result.set_num_items_before_association(dict->size()); |
411 std::set<std::string> seen_ids; | 411 std::set<std::string> seen_ids; |
412 int num_items_added = 0; | 412 int num_items_added = 0; |
413 int num_items_modified = 0; | 413 int num_items_modified = 0; |
414 for (SyncDataList::const_iterator it = initial_sync_data.begin(); | 414 for (SyncDataList::const_iterator it = initial_sync_data.begin(); |
415 it != initial_sync_data.end(); ++it) { | 415 it != initial_sync_data.end(); ++it) { |
416 DCHECK_EQ(MANAGED_USERS, it->GetDataType()); | 416 DCHECK_EQ(SUPERVISED_USERS, it->GetDataType()); |
417 const ManagedUserSpecifics& managed_user = | 417 const ManagedUserSpecifics& managed_user = |
418 it->GetSpecifics().managed_user(); | 418 it->GetSpecifics().managed_user(); |
419 base::DictionaryValue* value = new base::DictionaryValue(); | 419 base::DictionaryValue* value = new base::DictionaryValue(); |
420 value->SetString(kName, managed_user.name()); | 420 value->SetString(kName, managed_user.name()); |
421 value->SetBoolean(kAcknowledged, managed_user.acknowledged()); | 421 value->SetBoolean(kAcknowledged, managed_user.acknowledged()); |
422 value->SetString(kMasterKey, managed_user.master_key()); | 422 value->SetString(kMasterKey, managed_user.master_key()); |
423 value->SetString(kChromeAvatar, managed_user.chrome_avatar()); | 423 value->SetString(kChromeAvatar, managed_user.chrome_avatar()); |
424 value->SetString(kChromeOsAvatar, managed_user.chromeos_avatar()); | 424 value->SetString(kChromeOsAvatar, managed_user.chromeos_avatar()); |
425 value->SetString(kPasswordSignatureKey, | 425 value->SetString(kPasswordSignatureKey, |
426 managed_user.password_signature_key()); | 426 managed_user.password_signature_key()); |
(...skipping 21 matching lines...) Expand all Loading... |
448 result.set_num_items_modified(num_items_modified); | 448 result.set_num_items_modified(num_items_modified); |
449 result.set_num_items_added(num_items_added); | 449 result.set_num_items_added(num_items_added); |
450 result.set_num_items_after_association(dict->size()); | 450 result.set_num_items_after_association(dict->size()); |
451 | 451 |
452 DispatchCallbacks(); | 452 DispatchCallbacks(); |
453 | 453 |
454 return result; | 454 return result; |
455 } | 455 } |
456 | 456 |
457 void ManagedUserSyncService::StopSyncing(ModelType type) { | 457 void ManagedUserSyncService::StopSyncing(ModelType type) { |
458 DCHECK_EQ(MANAGED_USERS, type); | 458 DCHECK_EQ(SUPERVISED_USERS, type); |
459 // The observers may want to change the Sync data, so notify them before | 459 // The observers may want to change the Sync data, so notify them before |
460 // resetting the |sync_processor_|. | 460 // resetting the |sync_processor_|. |
461 NotifyManagedUsersSyncingStopped(); | 461 NotifyManagedUsersSyncingStopped(); |
462 sync_processor_.reset(); | 462 sync_processor_.reset(); |
463 error_handler_.reset(); | 463 error_handler_.reset(); |
464 } | 464 } |
465 | 465 |
466 SyncDataList ManagedUserSyncService::GetAllSyncData( | 466 SyncDataList ManagedUserSyncService::GetAllSyncData( |
467 ModelType type) const { | 467 ModelType type) const { |
468 SyncDataList data; | 468 SyncDataList data; |
469 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); | 469 DictionaryPrefUpdate update(prefs_, prefs::kSupervisedUsers); |
470 base::DictionaryValue* dict = update.Get(); | 470 base::DictionaryValue* dict = update.Get(); |
471 for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) | 471 for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) |
472 data.push_back(CreateSyncDataFromDictionaryEntry(it.key(), it.value())); | 472 data.push_back(CreateSyncDataFromDictionaryEntry(it.key(), it.value())); |
473 | 473 |
474 return data; | 474 return data; |
475 } | 475 } |
476 | 476 |
477 SyncError ManagedUserSyncService::ProcessSyncChanges( | 477 SyncError ManagedUserSyncService::ProcessSyncChanges( |
478 const tracked_objects::Location& from_here, | 478 const tracked_objects::Location& from_here, |
479 const SyncChangeList& change_list) { | 479 const SyncChangeList& change_list) { |
480 SyncError error; | 480 SyncError error; |
481 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); | 481 DictionaryPrefUpdate update(prefs_, prefs::kSupervisedUsers); |
482 base::DictionaryValue* dict = update.Get(); | 482 base::DictionaryValue* dict = update.Get(); |
483 for (SyncChangeList::const_iterator it = change_list.begin(); | 483 for (SyncChangeList::const_iterator it = change_list.begin(); |
484 it != change_list.end(); ++it) { | 484 it != change_list.end(); ++it) { |
485 SyncData data = it->sync_data(); | 485 SyncData data = it->sync_data(); |
486 DCHECK_EQ(MANAGED_USERS, data.GetDataType()); | 486 DCHECK_EQ(SUPERVISED_USERS, data.GetDataType()); |
487 const ManagedUserSpecifics& managed_user = | 487 const ManagedUserSpecifics& managed_user = |
488 data.GetSpecifics().managed_user(); | 488 data.GetSpecifics().managed_user(); |
489 switch (it->change_type()) { | 489 switch (it->change_type()) { |
490 case SyncChange::ACTION_ADD: | 490 case SyncChange::ACTION_ADD: |
491 case SyncChange::ACTION_UPDATE: { | 491 case SyncChange::ACTION_UPDATE: { |
492 // Every item we get from the server should be acknowledged. | 492 // Every item we get from the server should be acknowledged. |
493 DCHECK(managed_user.acknowledged()); | 493 DCHECK(managed_user.acknowledged()); |
494 const base::DictionaryValue* old_value = NULL; | 494 const base::DictionaryValue* old_value = NULL; |
495 dict->GetDictionaryWithoutPathExpansion(managed_user.id(), &old_value); | 495 dict->GetDictionaryWithoutPathExpansion(managed_user.id(), &old_value); |
496 | 496 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 } | 532 } |
533 } | 533 } |
534 return error; | 534 return error; |
535 } | 535 } |
536 | 536 |
537 void ManagedUserSyncService::OnLastSignedInUsernameChange() { | 537 void ManagedUserSyncService::OnLastSignedInUsernameChange() { |
538 DCHECK(!sync_processor_); | 538 DCHECK(!sync_processor_); |
539 | 539 |
540 // If the last signed in user changes, we clear all data, to avoid managed | 540 // If the last signed in user changes, we clear all data, to avoid managed |
541 // users from one custodian appearing in another one's profile. | 541 // users from one custodian appearing in another one's profile. |
542 prefs_->ClearPref(prefs::kManagedUsers); | 542 prefs_->ClearPref(prefs::kSupervisedUsers); |
543 } | 543 } |
544 | 544 |
545 void ManagedUserSyncService::NotifyManagedUserAcknowledged( | 545 void ManagedUserSyncService::NotifyManagedUserAcknowledged( |
546 const std::string& managed_user_id) { | 546 const std::string& managed_user_id) { |
547 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_, | 547 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_, |
548 OnManagedUserAcknowledged(managed_user_id)); | 548 OnManagedUserAcknowledged(managed_user_id)); |
549 } | 549 } |
550 | 550 |
551 void ManagedUserSyncService::NotifyManagedUsersSyncingStopped() { | 551 void ManagedUserSyncService::NotifyManagedUsersSyncingStopped() { |
552 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_, | 552 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_, |
553 OnManagedUsersSyncingStopped()); | 553 OnManagedUsersSyncingStopped()); |
554 } | 554 } |
555 | 555 |
556 void ManagedUserSyncService::NotifyManagedUsersChanged() { | 556 void ManagedUserSyncService::NotifyManagedUsersChanged() { |
557 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, | 557 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, |
558 observers_, | 558 observers_, |
559 OnManagedUsersChanged()); | 559 OnManagedUsersChanged()); |
560 } | 560 } |
561 | 561 |
562 void ManagedUserSyncService::DispatchCallbacks() { | 562 void ManagedUserSyncService::DispatchCallbacks() { |
563 const base::DictionaryValue* managed_users = | 563 const base::DictionaryValue* managed_users = |
564 prefs_->GetDictionary(prefs::kManagedUsers); | 564 prefs_->GetDictionary(prefs::kSupervisedUsers); |
565 for (std::vector<ManagedUsersCallback>::iterator it = callbacks_.begin(); | 565 for (std::vector<ManagedUsersCallback>::iterator it = callbacks_.begin(); |
566 it != callbacks_.end(); ++it) { | 566 it != callbacks_.end(); ++it) { |
567 it->Run(managed_users); | 567 it->Run(managed_users); |
568 } | 568 } |
569 callbacks_.clear(); | 569 callbacks_.clear(); |
570 } | 570 } |
OLD | NEW |