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/strings/stringprintf.h" | |
8 #include "base/values.h" | 9 #include "base/values.h" |
9 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 10 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
10 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
11 #include "chrome/common/pref_names.h" | 12 #include "chrome/common/pref_names.h" |
12 #include "components/user_prefs/pref_registry_syncable.h" | 13 #include "components/user_prefs/pref_registry_syncable.h" |
13 #include "sync/api/sync_change.h" | 14 #include "sync/api/sync_change.h" |
14 #include "sync/api/sync_data.h" | 15 #include "sync/api/sync_data.h" |
15 #include "sync/api/sync_error.h" | 16 #include "sync/api/sync_error.h" |
16 #include "sync/api/sync_error_factory.h" | 17 #include "sync/api/sync_error_factory.h" |
17 #include "sync/api/sync_merge_result.h" | 18 #include "sync/api/sync_merge_result.h" |
18 #include "sync/protocol/sync.pb.h" | 19 #include "sync/protocol/sync.pb.h" |
19 | 20 |
20 using base::DictionaryValue; | 21 using base::DictionaryValue; |
21 using user_prefs::PrefRegistrySyncable; | 22 using user_prefs::PrefRegistrySyncable; |
22 using syncer::MANAGED_USERS; | 23 using syncer::MANAGED_USERS; |
23 using syncer::ModelType; | 24 using syncer::ModelType; |
24 using syncer::SyncChange; | 25 using syncer::SyncChange; |
25 using syncer::SyncChangeList; | 26 using syncer::SyncChangeList; |
26 using syncer::SyncChangeProcessor; | 27 using syncer::SyncChangeProcessor; |
27 using syncer::SyncData; | 28 using syncer::SyncData; |
28 using syncer::SyncDataList; | 29 using syncer::SyncDataList; |
29 using syncer::SyncError; | 30 using syncer::SyncError; |
30 using syncer::SyncErrorFactory; | 31 using syncer::SyncErrorFactory; |
31 using syncer::SyncMergeResult; | 32 using syncer::SyncMergeResult; |
32 using sync_pb::ManagedUserSpecifics; | 33 using sync_pb::ManagedUserSpecifics; |
33 | 34 |
34 namespace { | 35 namespace { |
35 | 36 |
36 const char kAcknowledged[] = "acknowledged"; | 37 const char kAcknowledged[] = "acknowledged"; |
38 const char kChromeAvatar[] = "chromeAvatar"; | |
39 const char kChromeOsAvatar[] = "chromeOsAvatar"; | |
37 const char kName[] = "name"; | 40 const char kName[] = "name"; |
38 const char kMasterKey[] = "masterKey"; | 41 const char kMasterKey[] = "masterKey"; |
39 | 42 |
40 SyncData CreateLocalSyncData(const std::string& id, | 43 SyncData CreateLocalSyncData(const std::string& id, |
41 const std::string& name, | 44 const std::string& name, |
42 bool acknowledged, | 45 bool acknowledged, |
43 const std::string& master_key) { | 46 const std::string& master_key, |
47 const std::string& chrome_avatar, | |
48 const std::string& chromeos_avatar) { | |
44 ::sync_pb::EntitySpecifics specifics; | 49 ::sync_pb::EntitySpecifics specifics; |
45 specifics.mutable_managed_user()->set_id(id); | 50 specifics.mutable_managed_user()->set_id(id); |
46 specifics.mutable_managed_user()->set_name(name); | 51 specifics.mutable_managed_user()->set_name(name); |
52 if (!chrome_avatar.empty()) | |
53 specifics.mutable_managed_user()->set_chrome_avatar(chrome_avatar); | |
54 if (!chromeos_avatar.empty()) | |
55 specifics.mutable_managed_user()->set_chromeos_avatar(chromeos_avatar); | |
47 if (!master_key.empty()) | 56 if (!master_key.empty()) |
48 specifics.mutable_managed_user()->set_master_key(master_key); | 57 specifics.mutable_managed_user()->set_master_key(master_key); |
49 if (acknowledged) | 58 if (acknowledged) |
50 specifics.mutable_managed_user()->set_acknowledged(true); | 59 specifics.mutable_managed_user()->set_acknowledged(true); |
51 return SyncData::CreateLocalData(id, name, specifics); | 60 return SyncData::CreateLocalData(id, name, specifics); |
52 } | 61 } |
53 | 62 |
63 SyncData CreateSyncDataFromDictionaryEntry( | |
64 const DictionaryValue::Iterator& it) { | |
65 const DictionaryValue* dict = NULL; | |
66 bool success = it.value().GetAsDictionary(&dict); | |
67 DCHECK(success); | |
68 bool acknowledged = false; | |
69 dict->GetBoolean(kAcknowledged, &acknowledged); | |
70 std::string name; | |
71 dict->GetString(kName, &name); | |
72 DCHECK(!name.empty()); | |
73 std::string master_key; | |
74 dict->GetString(kMasterKey, &master_key); | |
75 std::string chrome_avatar; | |
76 dict->GetString(kChromeAvatar, &chrome_avatar); | |
77 std::string chromeos_avatar; | |
78 dict->GetString(kChromeOsAvatar, &chromeos_avatar); | |
79 | |
80 return CreateLocalSyncData(it.key(), name, acknowledged, master_key, | |
81 chrome_avatar, chromeos_avatar); | |
82 } | |
83 | |
54 } // namespace | 84 } // namespace |
55 | 85 |
56 ManagedUserSyncService::ManagedUserSyncService(PrefService* prefs) | 86 ManagedUserSyncService::ManagedUserSyncService(PrefService* prefs) |
57 : prefs_(prefs) { | 87 : prefs_(prefs) { |
58 pref_change_registrar_.Init(prefs_); | 88 pref_change_registrar_.Init(prefs_); |
59 pref_change_registrar_.Add( | 89 pref_change_registrar_.Add( |
60 prefs::kGoogleServicesLastUsername, | 90 prefs::kGoogleServicesLastUsername, |
61 base::Bind(&ManagedUserSyncService::OnLastSignedInUsernameChange, | 91 base::Bind(&ManagedUserSyncService::OnLastSignedInUsernameChange, |
62 base::Unretained(this))); | 92 base::Unretained(this))); |
63 } | 93 } |
(...skipping 13 matching lines...) Expand all Loading... | |
77 observers_.AddObserver(observer); | 107 observers_.AddObserver(observer); |
78 } | 108 } |
79 | 109 |
80 void ManagedUserSyncService::RemoveObserver( | 110 void ManagedUserSyncService::RemoveObserver( |
81 ManagedUserSyncServiceObserver* observer) { | 111 ManagedUserSyncServiceObserver* observer) { |
82 observers_.RemoveObserver(observer); | 112 observers_.RemoveObserver(observer); |
83 } | 113 } |
84 | 114 |
85 void ManagedUserSyncService::AddManagedUser(const std::string& id, | 115 void ManagedUserSyncService::AddManagedUser(const std::string& id, |
86 const std::string& name, | 116 const std::string& name, |
87 const std::string& master_key) { | 117 const std::string& master_key, |
118 int avatar_index) { | |
88 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); | 119 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); |
89 DictionaryValue* dict = update.Get(); | 120 DictionaryValue* dict = update.Get(); |
90 DictionaryValue* value = new DictionaryValue; | 121 DictionaryValue* value = new DictionaryValue; |
91 value->SetString(kName, name); | 122 value->SetString(kName, name); |
92 value->SetString(kMasterKey, master_key); | 123 value->SetString(kMasterKey, master_key); |
124 std::string chrome_avatar; | |
125 #if !defined(CHROME_OS) | |
126 chrome_avatar = base::StringPrintf("chrome-avatar-index:%d", avatar_index); | |
127 #endif | |
128 value->SetString(kChromeAvatar, chrome_avatar); | |
129 // TODO(ibraaaa): this should be updated to allow supervised | |
130 // users avatar syncing on chrome OS. | |
Bernhard Bauer
2013/09/05 13:15:33
Nit: "Chrome" with an uppercase "C".
ibra
2013/09/05 13:28:38
Done.
| |
131 value->SetString(kChromeOsAvatar, std::string()); | |
93 DCHECK(!dict->HasKey(id)); | 132 DCHECK(!dict->HasKey(id)); |
94 dict->SetWithoutPathExpansion(id, value); | 133 dict->SetWithoutPathExpansion(id, value); |
95 | 134 |
96 if (!sync_processor_) | 135 if (!sync_processor_) |
97 return; | 136 return; |
98 | 137 |
99 // If we're already syncing, create a new change and upload it. | 138 // If we're already syncing, create a new change and upload it. |
100 SyncChangeList change_list; | 139 SyncChangeList change_list; |
101 change_list.push_back(SyncChange( | 140 change_list.push_back(SyncChange( |
102 FROM_HERE, | 141 FROM_HERE, |
103 SyncChange::ACTION_ADD, | 142 SyncChange::ACTION_ADD, |
104 CreateLocalSyncData(id, name, false, master_key))); | 143 CreateLocalSyncData(id, name, false, master_key, |
144 chrome_avatar, std::string()))); | |
105 SyncError error = | 145 SyncError error = |
106 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list); | 146 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list); |
107 DCHECK(!error.IsSet()) << error.ToString(); | 147 DCHECK(!error.IsSet()) << error.ToString(); |
108 } | 148 } |
109 | 149 |
110 void ManagedUserSyncService::DeleteManagedUser(const std::string& id) { | 150 void ManagedUserSyncService::DeleteManagedUser(const std::string& id) { |
111 if (!sync_processor_) | 151 if (!sync_processor_) |
112 return; | 152 return; |
113 | 153 |
114 SyncChangeList change_list; | 154 SyncChangeList change_list; |
(...skipping 30 matching lines...) Expand all Loading... | |
145 int num_items_modified = 0; | 185 int num_items_modified = 0; |
146 for (SyncDataList::const_iterator it = initial_sync_data.begin(); | 186 for (SyncDataList::const_iterator it = initial_sync_data.begin(); |
147 it != initial_sync_data.end(); ++it) { | 187 it != initial_sync_data.end(); ++it) { |
148 DCHECK_EQ(MANAGED_USERS, it->GetDataType()); | 188 DCHECK_EQ(MANAGED_USERS, it->GetDataType()); |
149 const ManagedUserSpecifics& managed_user = | 189 const ManagedUserSpecifics& managed_user = |
150 it->GetSpecifics().managed_user(); | 190 it->GetSpecifics().managed_user(); |
151 DictionaryValue* value = new DictionaryValue(); | 191 DictionaryValue* value = new DictionaryValue(); |
152 value->SetString(kName, managed_user.name()); | 192 value->SetString(kName, managed_user.name()); |
153 value->SetBoolean(kAcknowledged, managed_user.acknowledged()); | 193 value->SetBoolean(kAcknowledged, managed_user.acknowledged()); |
154 value->SetString(kMasterKey, managed_user.master_key()); | 194 value->SetString(kMasterKey, managed_user.master_key()); |
195 value->SetString(kChromeAvatar, managed_user.chrome_avatar()); | |
196 value->SetString(kChromeOsAvatar, managed_user.chromeos_avatar()); | |
155 if (dict->HasKey(managed_user.id())) | 197 if (dict->HasKey(managed_user.id())) |
156 num_items_modified++; | 198 num_items_modified++; |
157 else | 199 else |
158 num_items_added++; | 200 num_items_added++; |
159 dict->SetWithoutPathExpansion(managed_user.id(), value); | 201 dict->SetWithoutPathExpansion(managed_user.id(), value); |
160 seen_ids.insert(managed_user.id()); | 202 seen_ids.insert(managed_user.id()); |
161 } | 203 } |
162 | 204 |
163 for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { | 205 for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { |
164 if (seen_ids.find(it.key()) != seen_ids.end()) | 206 if (seen_ids.find(it.key()) != seen_ids.end()) |
165 continue; | 207 continue; |
166 | 208 |
167 const DictionaryValue* dict = NULL; | 209 change_list.push_back(SyncChange(FROM_HERE, SyncChange::ACTION_ADD, |
168 bool success = it.value().GetAsDictionary(&dict); | 210 CreateSyncDataFromDictionaryEntry(it))); |
169 DCHECK(success); | |
170 bool acknowledged = false; | |
171 dict->GetBoolean(kAcknowledged, &acknowledged); | |
172 std::string name; | |
173 dict->GetString(kName, &name); | |
174 std::string master_key; | |
175 dict->GetString(kMasterKey, &master_key); | |
176 DCHECK(!name.empty()); | |
177 change_list.push_back( | |
178 SyncChange(FROM_HERE, SyncChange::ACTION_ADD, | |
179 CreateLocalSyncData(it.key(), name, acknowledged, master_key))); | |
180 } | 211 } |
181 result.set_error(sync_processor_->ProcessSyncChanges(FROM_HERE, change_list)); | 212 result.set_error(sync_processor_->ProcessSyncChanges(FROM_HERE, change_list)); |
182 | 213 |
183 result.set_num_items_modified(num_items_modified); | 214 result.set_num_items_modified(num_items_modified); |
184 result.set_num_items_added(num_items_added); | 215 result.set_num_items_added(num_items_added); |
185 result.set_num_items_after_association(dict->size()); | 216 result.set_num_items_after_association(dict->size()); |
186 | 217 |
187 return result; | 218 return result; |
188 } | 219 } |
189 | 220 |
190 void ManagedUserSyncService::StopSyncing(ModelType type) { | 221 void ManagedUserSyncService::StopSyncing(ModelType type) { |
191 DCHECK_EQ(MANAGED_USERS, type); | 222 DCHECK_EQ(MANAGED_USERS, type); |
192 // The observers may want to change the Sync data, so notify them before | 223 // The observers may want to change the Sync data, so notify them before |
193 // resetting the |sync_processor_|. | 224 // resetting the |sync_processor_|. |
194 NotifyManagedUsersSyncingStopped(); | 225 NotifyManagedUsersSyncingStopped(); |
195 sync_processor_.reset(); | 226 sync_processor_.reset(); |
196 error_handler_.reset(); | 227 error_handler_.reset(); |
197 } | 228 } |
198 | 229 |
199 SyncDataList ManagedUserSyncService::GetAllSyncData( | 230 SyncDataList ManagedUserSyncService::GetAllSyncData( |
200 ModelType type) const { | 231 ModelType type) const { |
201 SyncDataList data; | 232 SyncDataList data; |
202 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); | 233 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); |
203 DictionaryValue* dict = update.Get(); | 234 DictionaryValue* dict = update.Get(); |
204 for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { | 235 for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) |
205 const DictionaryValue* dict = NULL; | 236 data.push_back(CreateSyncDataFromDictionaryEntry(it)); |
206 bool success = it.value().GetAsDictionary(&dict); | 237 |
207 DCHECK(success); | |
208 std::string name; | |
209 dict->GetString(kName, &name); | |
210 std::string master_key; | |
211 dict->GetString(kMasterKey, &master_key); | |
212 bool acknowledged = false; | |
213 dict->GetBoolean(kAcknowledged, &acknowledged); | |
214 data.push_back( | |
215 CreateLocalSyncData(it.key(), name, acknowledged, master_key)); | |
216 } | |
217 return data; | 238 return data; |
218 } | 239 } |
219 | 240 |
220 SyncError ManagedUserSyncService::ProcessSyncChanges( | 241 SyncError ManagedUserSyncService::ProcessSyncChanges( |
221 const tracked_objects::Location& from_here, | 242 const tracked_objects::Location& from_here, |
222 const SyncChangeList& change_list) { | 243 const SyncChangeList& change_list) { |
223 SyncError error; | 244 SyncError error; |
224 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); | 245 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); |
225 DictionaryValue* dict = update.Get(); | 246 DictionaryValue* dict = update.Get(); |
226 for (SyncChangeList::const_iterator it = change_list.begin(); | 247 for (SyncChangeList::const_iterator it = change_list.begin(); |
(...skipping 18 matching lines...) Expand all Loading... | |
245 | 266 |
246 // If the managed user switched from unacknowledged to acknowledged, | 267 // If the managed user switched from unacknowledged to acknowledged, |
247 // we might need to continue with a registration. | 268 // we might need to continue with a registration. |
248 if (old_value && !old_value->HasKey(kAcknowledged)) | 269 if (old_value && !old_value->HasKey(kAcknowledged)) |
249 NotifyManagedUserAcknowledged(managed_user.id()); | 270 NotifyManagedUserAcknowledged(managed_user.id()); |
250 | 271 |
251 DictionaryValue* value = new DictionaryValue; | 272 DictionaryValue* value = new DictionaryValue; |
252 value->SetString(kName, managed_user.name()); | 273 value->SetString(kName, managed_user.name()); |
253 value->SetBoolean(kAcknowledged, managed_user.acknowledged()); | 274 value->SetBoolean(kAcknowledged, managed_user.acknowledged()); |
254 value->SetString(kMasterKey, managed_user.master_key()); | 275 value->SetString(kMasterKey, managed_user.master_key()); |
276 value->SetString(kChromeAvatar, managed_user.chrome_avatar()); | |
277 value->SetString(kChromeOsAvatar, managed_user.chromeos_avatar()); | |
255 dict->SetWithoutPathExpansion(managed_user.id(), value); | 278 dict->SetWithoutPathExpansion(managed_user.id(), value); |
256 break; | 279 break; |
257 } | 280 } |
258 case SyncChange::ACTION_DELETE: { | 281 case SyncChange::ACTION_DELETE: { |
259 DCHECK(dict->HasKey(managed_user.id())) << managed_user.id(); | 282 DCHECK(dict->HasKey(managed_user.id())) << managed_user.id(); |
260 dict->RemoveWithoutPathExpansion(managed_user.id(), NULL); | 283 dict->RemoveWithoutPathExpansion(managed_user.id(), NULL); |
261 break; | 284 break; |
262 } | 285 } |
263 case SyncChange::ACTION_INVALID: { | 286 case SyncChange::ACTION_INVALID: { |
264 NOTREACHED(); | 287 NOTREACHED(); |
(...skipping 15 matching lines...) Expand all Loading... | |
280 void ManagedUserSyncService::NotifyManagedUserAcknowledged( | 303 void ManagedUserSyncService::NotifyManagedUserAcknowledged( |
281 const std::string& managed_user_id) { | 304 const std::string& managed_user_id) { |
282 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_, | 305 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_, |
283 OnManagedUserAcknowledged(managed_user_id)); | 306 OnManagedUserAcknowledged(managed_user_id)); |
284 } | 307 } |
285 | 308 |
286 void ManagedUserSyncService::NotifyManagedUsersSyncingStopped() { | 309 void ManagedUserSyncService::NotifyManagedUsersSyncingStopped() { |
287 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_, | 310 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_, |
288 OnManagedUsersSyncingStopped()); | 311 OnManagedUsersSyncingStopped()); |
289 } | 312 } |
OLD | NEW |