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 DCHECK_EQ(avatar_index, -111); | |
Bernhard Bauer
2013/09/05 15:35:24
Where is this number coming from?
ibra
2013/09/05 15:44:50
Are you talking about the value? or about what?
T
Bernhard Bauer
2013/09/05 15:51:12
Yes, you're setting the value in locally_managed_u
ibra
2013/09/05 16:25:03
Done.
| |
127 #else | |
128 chrome_avatar = base::StringPrintf("chrome-avatar-index:%d", avatar_index); | |
129 #endif | |
130 value->SetString(kChromeAvatar, chrome_avatar); | |
131 // TODO(ibraaaa): this should be updated to allow supervised | |
132 // users avatar syncing on Chrome OS. | |
133 value->SetString(kChromeOsAvatar, std::string()); | |
93 DCHECK(!dict->HasKey(id)); | 134 DCHECK(!dict->HasKey(id)); |
94 dict->SetWithoutPathExpansion(id, value); | 135 dict->SetWithoutPathExpansion(id, value); |
95 | 136 |
96 if (!sync_processor_) | 137 if (!sync_processor_) |
97 return; | 138 return; |
98 | 139 |
99 // If we're already syncing, create a new change and upload it. | 140 // If we're already syncing, create a new change and upload it. |
100 SyncChangeList change_list; | 141 SyncChangeList change_list; |
101 change_list.push_back(SyncChange( | 142 change_list.push_back(SyncChange( |
102 FROM_HERE, | 143 FROM_HERE, |
103 SyncChange::ACTION_ADD, | 144 SyncChange::ACTION_ADD, |
104 CreateLocalSyncData(id, name, false, master_key))); | 145 CreateLocalSyncData(id, name, false, master_key, |
146 chrome_avatar, std::string()))); | |
105 SyncError error = | 147 SyncError error = |
106 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list); | 148 sync_processor_->ProcessSyncChanges(FROM_HERE, change_list); |
107 DCHECK(!error.IsSet()) << error.ToString(); | 149 DCHECK(!error.IsSet()) << error.ToString(); |
108 } | 150 } |
109 | 151 |
110 void ManagedUserSyncService::DeleteManagedUser(const std::string& id) { | 152 void ManagedUserSyncService::DeleteManagedUser(const std::string& id) { |
111 if (!sync_processor_) | 153 if (!sync_processor_) |
112 return; | 154 return; |
113 | 155 |
114 SyncChangeList change_list; | 156 SyncChangeList change_list; |
(...skipping 30 matching lines...) Expand all Loading... | |
145 int num_items_modified = 0; | 187 int num_items_modified = 0; |
146 for (SyncDataList::const_iterator it = initial_sync_data.begin(); | 188 for (SyncDataList::const_iterator it = initial_sync_data.begin(); |
147 it != initial_sync_data.end(); ++it) { | 189 it != initial_sync_data.end(); ++it) { |
148 DCHECK_EQ(MANAGED_USERS, it->GetDataType()); | 190 DCHECK_EQ(MANAGED_USERS, it->GetDataType()); |
149 const ManagedUserSpecifics& managed_user = | 191 const ManagedUserSpecifics& managed_user = |
150 it->GetSpecifics().managed_user(); | 192 it->GetSpecifics().managed_user(); |
151 DictionaryValue* value = new DictionaryValue(); | 193 DictionaryValue* value = new DictionaryValue(); |
152 value->SetString(kName, managed_user.name()); | 194 value->SetString(kName, managed_user.name()); |
153 value->SetBoolean(kAcknowledged, managed_user.acknowledged()); | 195 value->SetBoolean(kAcknowledged, managed_user.acknowledged()); |
154 value->SetString(kMasterKey, managed_user.master_key()); | 196 value->SetString(kMasterKey, managed_user.master_key()); |
197 value->SetString(kChromeAvatar, managed_user.chrome_avatar()); | |
198 value->SetString(kChromeOsAvatar, managed_user.chromeos_avatar()); | |
155 if (dict->HasKey(managed_user.id())) | 199 if (dict->HasKey(managed_user.id())) |
156 num_items_modified++; | 200 num_items_modified++; |
157 else | 201 else |
158 num_items_added++; | 202 num_items_added++; |
159 dict->SetWithoutPathExpansion(managed_user.id(), value); | 203 dict->SetWithoutPathExpansion(managed_user.id(), value); |
160 seen_ids.insert(managed_user.id()); | 204 seen_ids.insert(managed_user.id()); |
161 } | 205 } |
162 | 206 |
163 for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { | 207 for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { |
164 if (seen_ids.find(it.key()) != seen_ids.end()) | 208 if (seen_ids.find(it.key()) != seen_ids.end()) |
165 continue; | 209 continue; |
166 | 210 |
167 const DictionaryValue* dict = NULL; | 211 change_list.push_back(SyncChange(FROM_HERE, SyncChange::ACTION_ADD, |
168 bool success = it.value().GetAsDictionary(&dict); | 212 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 } | 213 } |
181 result.set_error(sync_processor_->ProcessSyncChanges(FROM_HERE, change_list)); | 214 result.set_error(sync_processor_->ProcessSyncChanges(FROM_HERE, change_list)); |
182 | 215 |
183 result.set_num_items_modified(num_items_modified); | 216 result.set_num_items_modified(num_items_modified); |
184 result.set_num_items_added(num_items_added); | 217 result.set_num_items_added(num_items_added); |
185 result.set_num_items_after_association(dict->size()); | 218 result.set_num_items_after_association(dict->size()); |
186 | 219 |
187 return result; | 220 return result; |
188 } | 221 } |
189 | 222 |
190 void ManagedUserSyncService::StopSyncing(ModelType type) { | 223 void ManagedUserSyncService::StopSyncing(ModelType type) { |
191 DCHECK_EQ(MANAGED_USERS, type); | 224 DCHECK_EQ(MANAGED_USERS, type); |
192 // The observers may want to change the Sync data, so notify them before | 225 // The observers may want to change the Sync data, so notify them before |
193 // resetting the |sync_processor_|. | 226 // resetting the |sync_processor_|. |
194 NotifyManagedUsersSyncingStopped(); | 227 NotifyManagedUsersSyncingStopped(); |
195 sync_processor_.reset(); | 228 sync_processor_.reset(); |
196 error_handler_.reset(); | 229 error_handler_.reset(); |
197 } | 230 } |
198 | 231 |
199 SyncDataList ManagedUserSyncService::GetAllSyncData( | 232 SyncDataList ManagedUserSyncService::GetAllSyncData( |
200 ModelType type) const { | 233 ModelType type) const { |
201 SyncDataList data; | 234 SyncDataList data; |
202 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); | 235 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); |
203 DictionaryValue* dict = update.Get(); | 236 DictionaryValue* dict = update.Get(); |
204 for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) { | 237 for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) |
205 const DictionaryValue* dict = NULL; | 238 data.push_back(CreateSyncDataFromDictionaryEntry(it)); |
206 bool success = it.value().GetAsDictionary(&dict); | 239 |
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; | 240 return data; |
218 } | 241 } |
219 | 242 |
220 SyncError ManagedUserSyncService::ProcessSyncChanges( | 243 SyncError ManagedUserSyncService::ProcessSyncChanges( |
221 const tracked_objects::Location& from_here, | 244 const tracked_objects::Location& from_here, |
222 const SyncChangeList& change_list) { | 245 const SyncChangeList& change_list) { |
223 SyncError error; | 246 SyncError error; |
224 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); | 247 DictionaryPrefUpdate update(prefs_, prefs::kManagedUsers); |
225 DictionaryValue* dict = update.Get(); | 248 DictionaryValue* dict = update.Get(); |
226 for (SyncChangeList::const_iterator it = change_list.begin(); | 249 for (SyncChangeList::const_iterator it = change_list.begin(); |
(...skipping 18 matching lines...) Expand all Loading... | |
245 | 268 |
246 // If the managed user switched from unacknowledged to acknowledged, | 269 // If the managed user switched from unacknowledged to acknowledged, |
247 // we might need to continue with a registration. | 270 // we might need to continue with a registration. |
248 if (old_value && !old_value->HasKey(kAcknowledged)) | 271 if (old_value && !old_value->HasKey(kAcknowledged)) |
249 NotifyManagedUserAcknowledged(managed_user.id()); | 272 NotifyManagedUserAcknowledged(managed_user.id()); |
250 | 273 |
251 DictionaryValue* value = new DictionaryValue; | 274 DictionaryValue* value = new DictionaryValue; |
252 value->SetString(kName, managed_user.name()); | 275 value->SetString(kName, managed_user.name()); |
253 value->SetBoolean(kAcknowledged, managed_user.acknowledged()); | 276 value->SetBoolean(kAcknowledged, managed_user.acknowledged()); |
254 value->SetString(kMasterKey, managed_user.master_key()); | 277 value->SetString(kMasterKey, managed_user.master_key()); |
278 value->SetString(kChromeAvatar, managed_user.chrome_avatar()); | |
279 value->SetString(kChromeOsAvatar, managed_user.chromeos_avatar()); | |
255 dict->SetWithoutPathExpansion(managed_user.id(), value); | 280 dict->SetWithoutPathExpansion(managed_user.id(), value); |
256 break; | 281 break; |
257 } | 282 } |
258 case SyncChange::ACTION_DELETE: { | 283 case SyncChange::ACTION_DELETE: { |
259 DCHECK(dict->HasKey(managed_user.id())) << managed_user.id(); | 284 DCHECK(dict->HasKey(managed_user.id())) << managed_user.id(); |
260 dict->RemoveWithoutPathExpansion(managed_user.id(), NULL); | 285 dict->RemoveWithoutPathExpansion(managed_user.id(), NULL); |
261 break; | 286 break; |
262 } | 287 } |
263 case SyncChange::ACTION_INVALID: { | 288 case SyncChange::ACTION_INVALID: { |
264 NOTREACHED(); | 289 NOTREACHED(); |
(...skipping 15 matching lines...) Expand all Loading... | |
280 void ManagedUserSyncService::NotifyManagedUserAcknowledged( | 305 void ManagedUserSyncService::NotifyManagedUserAcknowledged( |
281 const std::string& managed_user_id) { | 306 const std::string& managed_user_id) { |
282 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_, | 307 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_, |
283 OnManagedUserAcknowledged(managed_user_id)); | 308 OnManagedUserAcknowledged(managed_user_id)); |
284 } | 309 } |
285 | 310 |
286 void ManagedUserSyncService::NotifyManagedUsersSyncingStopped() { | 311 void ManagedUserSyncService::NotifyManagedUsersSyncingStopped() { |
287 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_, | 312 FOR_EACH_OBSERVER(ManagedUserSyncServiceObserver, observers_, |
288 OnManagedUsersSyncingStopped()); | 313 OnManagedUsersSyncingStopped()); |
289 } | 314 } |
OLD | NEW |