| 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 |