OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/prefs/pref_value_store.h" | 5 #include "chrome/browser/prefs/pref_value_store.h" |
6 | 6 |
7 #include "chrome/browser/browser_thread.h" | 7 #include "chrome/browser/browser_thread.h" |
8 #include "chrome/browser/extensions/extension_pref_store.h" | 8 #include "chrome/browser/extensions/extension_pref_store.h" |
9 #include "chrome/browser/policy/configuration_policy_pref_store.h" | 9 #include "chrome/browser/policy/configuration_policy_pref_store.h" |
10 #include "chrome/browser/prefs/command_line_pref_store.h" | 10 #include "chrome/browser/prefs/command_line_pref_store.h" |
(...skipping 22 matching lines...) Expand all Loading... |
33 | 33 |
34 } // namespace | 34 } // namespace |
35 | 35 |
36 // static | 36 // static |
37 PrefValueStore* PrefValueStore::CreatePrefValueStore( | 37 PrefValueStore* PrefValueStore::CreatePrefValueStore( |
38 const FilePath& pref_filename, | 38 const FilePath& pref_filename, |
39 Profile* profile, | 39 Profile* profile, |
40 bool user_only) { | 40 bool user_only) { |
41 using policy::ConfigurationPolicyPrefStore; | 41 using policy::ConfigurationPolicyPrefStore; |
42 ConfigurationPolicyPrefStore* managed = NULL; | 42 ConfigurationPolicyPrefStore* managed = NULL; |
| 43 ConfigurationPolicyPrefStore* device_management = NULL; |
43 ExtensionPrefStore* extension = NULL; | 44 ExtensionPrefStore* extension = NULL; |
44 CommandLinePrefStore* command_line = NULL; | 45 CommandLinePrefStore* command_line = NULL; |
45 ConfigurationPolicyPrefStore* recommended = NULL; | 46 ConfigurationPolicyPrefStore* recommended = NULL; |
46 | 47 |
47 JsonPrefStore* user = new JsonPrefStore( | 48 JsonPrefStore* user = new JsonPrefStore( |
48 pref_filename, | 49 pref_filename, |
49 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)); | 50 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)); |
50 DefaultPrefStore* default_store = new DefaultPrefStore(); | 51 DefaultPrefStore* default_store = new DefaultPrefStore(); |
51 | 52 |
52 if (!user_only) { | 53 if (!user_only) { |
53 managed = ConfigurationPolicyPrefStore::CreateManagedPolicyPrefStore(); | 54 managed = |
| 55 ConfigurationPolicyPrefStore::CreateManagedPlatformPolicyPrefStore(); |
| 56 device_management = |
| 57 ConfigurationPolicyPrefStore::CreateDeviceManagementPolicyPrefStore(); |
54 extension = new ExtensionPrefStore(profile, PrefNotifier::EXTENSION_STORE); | 58 extension = new ExtensionPrefStore(profile, PrefNotifier::EXTENSION_STORE); |
55 command_line = new CommandLinePrefStore(CommandLine::ForCurrentProcess()); | 59 command_line = new CommandLinePrefStore(CommandLine::ForCurrentProcess()); |
56 recommended = | 60 recommended = |
57 ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore(); | 61 ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore(); |
58 } | 62 } |
59 return new PrefValueStore(managed, extension, command_line, user, | 63 return new PrefValueStore(managed, device_management, extension, |
60 recommended, default_store); | 64 command_line, user, recommended, default_store); |
61 } | 65 } |
62 | 66 |
63 PrefValueStore::~PrefValueStore() {} | 67 PrefValueStore::~PrefValueStore() {} |
64 | 68 |
65 bool PrefValueStore::GetValue(const std::string& name, | 69 bool PrefValueStore::GetValue(const std::string& name, |
66 Value** out_value) const { | 70 Value** out_value) const { |
67 // Check the |PrefStore|s in order of their priority from highest to lowest | 71 // Check the |PrefStore|s in order of their priority from highest to lowest |
68 // to find the value of the preference described by the given preference name. | 72 // to find the value of the preference described by the given preference name. |
69 for (size_t i = 0; i <= PrefNotifier::PREF_STORE_TYPE_MAX; ++i) { | 73 for (size_t i = 0; i <= PrefNotifier::PREF_STORE_TYPE_MAX; ++i) { |
70 if (GetValueFromStore(name.c_str(), | 74 if (GetValueFromStore(name.c_str(), |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 return pref_stores_[PrefNotifier::USER_STORE]->ReadOnly(); | 188 return pref_stores_[PrefNotifier::USER_STORE]->ReadOnly(); |
185 } | 189 } |
186 | 190 |
187 bool PrefValueStore::RemoveUserPrefValue(const char* name) { | 191 bool PrefValueStore::RemoveUserPrefValue(const char* name) { |
188 if (pref_stores_[PrefNotifier::USER_STORE].get()) { | 192 if (pref_stores_[PrefNotifier::USER_STORE].get()) { |
189 return pref_stores_[PrefNotifier::USER_STORE]->prefs()->Remove(name, NULL); | 193 return pref_stores_[PrefNotifier::USER_STORE]->prefs()->Remove(name, NULL); |
190 } | 194 } |
191 return false; | 195 return false; |
192 } | 196 } |
193 | 197 |
194 bool PrefValueStore::PrefValueInManagedStore(const char* name) const { | 198 bool PrefValueStore::PrefValueInManagedPlatformStore(const char* name) const { |
195 return PrefValueInStore(name, PrefNotifier::MANAGED_STORE); | 199 return PrefValueInStore(name, PrefNotifier::MANAGED_PLATFORM_STORE); |
| 200 } |
| 201 |
| 202 bool PrefValueStore::PrefValueInDeviceManagementStore(const char* name) const { |
| 203 return PrefValueInStore(name, PrefNotifier::DEVICE_MANAGEMENT_STORE); |
196 } | 204 } |
197 | 205 |
198 bool PrefValueStore::PrefValueInExtensionStore(const char* name) const { | 206 bool PrefValueStore::PrefValueInExtensionStore(const char* name) const { |
199 return PrefValueInStore(name, PrefNotifier::EXTENSION_STORE); | 207 return PrefValueInStore(name, PrefNotifier::EXTENSION_STORE); |
200 } | 208 } |
201 | 209 |
202 bool PrefValueStore::PrefValueInUserStore(const char* name) const { | 210 bool PrefValueStore::PrefValueInUserStore(const char* name) const { |
203 return PrefValueInStore(name, PrefNotifier::USER_STORE); | 211 return PrefValueInStore(name, PrefNotifier::USER_STORE); |
204 } | 212 } |
205 | 213 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 store = PrefNotifier::DEFAULT_STORE; | 288 store = PrefNotifier::DEFAULT_STORE; |
281 } | 289 } |
282 if (IsValidType(GetRegisteredType(name), (*out_value)->GetType(), store)) | 290 if (IsValidType(GetRegisteredType(name), (*out_value)->GetType(), store)) |
283 return true; | 291 return true; |
284 } | 292 } |
285 // No valid value found for the given preference name: set the return false. | 293 // No valid value found for the given preference name: set the return false. |
286 *out_value = NULL; | 294 *out_value = NULL; |
287 return false; | 295 return false; |
288 } | 296 } |
289 | 297 |
290 void PrefValueStore::RefreshPolicyPrefsCompletion( | |
291 PrefStore* new_managed_pref_store, | |
292 PrefStore* new_recommended_pref_store, | |
293 AfterRefreshCallback* callback_pointer) { | |
294 scoped_ptr<AfterRefreshCallback> callback(callback_pointer); | |
295 DictionaryValue* managed_prefs_before( | |
296 pref_stores_[PrefNotifier::MANAGED_STORE]->prefs()); | |
297 DictionaryValue* managed_prefs_after(new_managed_pref_store->prefs()); | |
298 DictionaryValue* recommended_prefs_before( | |
299 pref_stores_[PrefNotifier::RECOMMENDED_STORE]->prefs()); | |
300 DictionaryValue* recommended_prefs_after(new_recommended_pref_store->prefs()); | |
301 | |
302 std::vector<std::string> changed_managed_paths; | |
303 managed_prefs_before->GetDifferingPaths(managed_prefs_after, | |
304 &changed_managed_paths); | |
305 | |
306 std::vector<std::string> changed_recommended_paths; | |
307 recommended_prefs_before->GetDifferingPaths(recommended_prefs_after, | |
308 &changed_recommended_paths); | |
309 | |
310 std::vector<std::string> changed_paths(changed_managed_paths.size() + | |
311 changed_recommended_paths.size()); | |
312 std::vector<std::string>::iterator last_insert = | |
313 std::merge(changed_managed_paths.begin(), | |
314 changed_managed_paths.end(), | |
315 changed_recommended_paths.begin(), | |
316 changed_recommended_paths.end(), | |
317 changed_paths.begin()); | |
318 changed_paths.resize(last_insert - changed_paths.begin()); | |
319 | |
320 pref_stores_[PrefNotifier::MANAGED_STORE].reset(new_managed_pref_store); | |
321 pref_stores_[PrefNotifier::RECOMMENDED_STORE].reset( | |
322 new_recommended_pref_store); | |
323 callback->Run(changed_paths); | |
324 } | |
325 | |
326 void PrefValueStore::RefreshPolicyPrefsOnFileThread( | 298 void PrefValueStore::RefreshPolicyPrefsOnFileThread( |
327 BrowserThread::ID calling_thread_id, | 299 BrowserThread::ID calling_thread_id, |
328 PrefStore* new_managed_pref_store, | 300 PrefStore* new_managed_platform_pref_store, |
| 301 PrefStore* new_device_management_pref_store, |
329 PrefStore* new_recommended_pref_store, | 302 PrefStore* new_recommended_pref_store, |
330 AfterRefreshCallback* callback_pointer) { | 303 AfterRefreshCallback* callback_pointer) { |
331 scoped_ptr<AfterRefreshCallback> callback(callback_pointer); | 304 scoped_ptr<AfterRefreshCallback> callback(callback_pointer); |
332 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 305 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
333 scoped_ptr<PrefStore> managed_pref_store(new_managed_pref_store); | 306 scoped_ptr<PrefStore> managed_platform_pref_store( |
| 307 new_managed_platform_pref_store); |
| 308 scoped_ptr<PrefStore> device_management_pref_store( |
| 309 new_device_management_pref_store); |
334 scoped_ptr<PrefStore> recommended_pref_store(new_recommended_pref_store); | 310 scoped_ptr<PrefStore> recommended_pref_store(new_recommended_pref_store); |
335 | 311 |
336 PrefStore::PrefReadError read_error = new_managed_pref_store->ReadPrefs(); | 312 PrefStore::PrefReadError read_error = |
| 313 new_managed_platform_pref_store->ReadPrefs(); |
337 if (read_error != PrefStore::PREF_READ_ERROR_NONE) { | 314 if (read_error != PrefStore::PREF_READ_ERROR_NONE) { |
338 LOG(ERROR) << "refresh of managed policy failed: PrefReadError = " | 315 LOG(ERROR) << "refresh of managed policy failed: PrefReadError = " |
339 << read_error; | 316 << read_error; |
340 return; | 317 return; |
341 } | 318 } |
342 | 319 |
| 320 read_error = new_device_management_pref_store->ReadPrefs(); |
| 321 if (read_error != PrefStore::PREF_READ_ERROR_NONE) { |
| 322 LOG(ERROR) << "refresh of device management policy failed: " |
| 323 << "PrefReadError = " << read_error; |
| 324 return; |
| 325 } |
| 326 |
343 read_error = new_recommended_pref_store->ReadPrefs(); | 327 read_error = new_recommended_pref_store->ReadPrefs(); |
344 if (read_error != PrefStore::PREF_READ_ERROR_NONE) { | 328 if (read_error != PrefStore::PREF_READ_ERROR_NONE) { |
345 LOG(ERROR) << "refresh of recommended policy failed: PrefReadError = " | 329 LOG(ERROR) << "refresh of recommended policy failed: PrefReadError = " |
346 << read_error; | 330 << read_error; |
347 return; | 331 return; |
348 } | 332 } |
349 | 333 |
350 BrowserThread::PostTask( | 334 BrowserThread::PostTask( |
351 calling_thread_id, FROM_HERE, | 335 calling_thread_id, FROM_HERE, |
352 NewRunnableMethod(this, | 336 NewRunnableMethod(this, |
353 &PrefValueStore::RefreshPolicyPrefsCompletion, | 337 &PrefValueStore::RefreshPolicyPrefsCompletion, |
354 managed_pref_store.release(), | 338 managed_platform_pref_store.release(), |
| 339 device_management_pref_store.release(), |
355 recommended_pref_store.release(), | 340 recommended_pref_store.release(), |
356 callback.release())); | 341 callback.release())); |
357 } | 342 } |
358 | 343 |
| 344 void PrefValueStore::RefreshPolicyPrefsCompletion( |
| 345 PrefStore* new_managed_platform_pref_store, |
| 346 PrefStore* new_device_management_pref_store, |
| 347 PrefStore* new_recommended_pref_store, |
| 348 AfterRefreshCallback* callback_pointer) { |
| 349 scoped_ptr<AfterRefreshCallback> callback(callback_pointer); |
| 350 |
| 351 // Determine the paths of all the changed preferences values in the three |
| 352 // policy-related stores (managed platform, device management and |
| 353 // recommended). |
| 354 DictionaryValue* managed_platform_prefs_before( |
| 355 pref_stores_[PrefNotifier::MANAGED_PLATFORM_STORE]->prefs()); |
| 356 DictionaryValue* managed_platform_prefs_after( |
| 357 new_managed_platform_pref_store->prefs()); |
| 358 DictionaryValue* device_management_prefs_before( |
| 359 pref_stores_[PrefNotifier::DEVICE_MANAGEMENT_STORE]->prefs()); |
| 360 DictionaryValue* device_management_prefs_after( |
| 361 new_device_management_pref_store->prefs()); |
| 362 DictionaryValue* recommended_prefs_before( |
| 363 pref_stores_[PrefNotifier::RECOMMENDED_STORE]->prefs()); |
| 364 DictionaryValue* recommended_prefs_after(new_recommended_pref_store->prefs()); |
| 365 |
| 366 std::vector<std::string> changed_managed_platform_paths; |
| 367 managed_platform_prefs_before->GetDifferingPaths(managed_platform_prefs_after, |
| 368 &changed_managed_platform_paths); |
| 369 |
| 370 std::vector<std::string> changed_device_management_paths; |
| 371 device_management_prefs_before->GetDifferingPaths( |
| 372 device_management_prefs_after, |
| 373 &changed_device_management_paths); |
| 374 |
| 375 std::vector<std::string> changed_recommended_paths; |
| 376 recommended_prefs_before->GetDifferingPaths(recommended_prefs_after, |
| 377 &changed_recommended_paths); |
| 378 |
| 379 // Merge all three vectors of changed value paths together, filtering |
| 380 // duplicates in a post-processing step. |
| 381 std::vector<std::string> all_changed_managed_platform_paths( |
| 382 changed_managed_platform_paths.size() + |
| 383 changed_device_management_paths.size()); |
| 384 |
| 385 std::vector<std::string>::iterator last_insert = |
| 386 std::merge(changed_managed_platform_paths.begin(), |
| 387 changed_managed_platform_paths.end(), |
| 388 changed_device_management_paths.begin(), |
| 389 changed_device_management_paths.end(), |
| 390 all_changed_managed_platform_paths.begin()); |
| 391 all_changed_managed_platform_paths.resize( |
| 392 last_insert - all_changed_managed_platform_paths.begin()); |
| 393 |
| 394 std::vector<std::string> changed_paths( |
| 395 all_changed_managed_platform_paths.size() + |
| 396 changed_recommended_paths.size()); |
| 397 last_insert = std::merge(all_changed_managed_platform_paths.begin(), |
| 398 all_changed_managed_platform_paths.end(), |
| 399 changed_recommended_paths.begin(), |
| 400 changed_recommended_paths.end(), |
| 401 changed_paths.begin()); |
| 402 changed_paths.resize(last_insert - changed_paths.begin()); |
| 403 |
| 404 last_insert = unique(changed_paths.begin(), changed_paths.end()); |
| 405 changed_paths.resize(last_insert - changed_paths.begin()); |
| 406 |
| 407 // Replace the old stores with the new and send notification of the changed |
| 408 // preferences. |
| 409 pref_stores_[PrefNotifier::MANAGED_PLATFORM_STORE].reset( |
| 410 new_managed_platform_pref_store); |
| 411 pref_stores_[PrefNotifier::DEVICE_MANAGEMENT_STORE].reset( |
| 412 new_device_management_pref_store); |
| 413 pref_stores_[PrefNotifier::RECOMMENDED_STORE].reset( |
| 414 new_recommended_pref_store); |
| 415 callback->Run(changed_paths); |
| 416 } |
| 417 |
359 void PrefValueStore::RefreshPolicyPrefs( | 418 void PrefValueStore::RefreshPolicyPrefs( |
360 AfterRefreshCallback* callback) { | 419 AfterRefreshCallback* callback) { |
361 using policy::ConfigurationPolicyPrefStore; | 420 using policy::ConfigurationPolicyPrefStore; |
362 // Because loading of policy information must happen on the FILE | 421 // Because loading of policy information must happen on the FILE |
363 // thread, it's not possible to just replace the contents of the | 422 // thread, it's not possible to just replace the contents of the |
364 // managed and recommended stores in place due to possible | 423 // managed and recommended stores in place due to possible |
365 // concurrent access from the UI thread. Instead, new stores are | 424 // concurrent access from the UI thread. Instead, new stores are |
366 // created and the refreshed policy read into them. The new stores | 425 // created and the refreshed policy read into them. The new stores |
367 // are swapped with the old from a Task on the UI thread after the | 426 // are swapped with the old from a Task on the UI thread after the |
368 // load is complete. | 427 // load is complete. |
369 PrefStore* new_managed_pref_store( | 428 PrefStore* new_managed_platform_pref_store( |
370 ConfigurationPolicyPrefStore::CreateManagedPolicyPrefStore()); | 429 ConfigurationPolicyPrefStore::CreateManagedPlatformPolicyPrefStore()); |
| 430 PrefStore* new_device_management_pref_store( |
| 431 ConfigurationPolicyPrefStore::CreateDeviceManagementPolicyPrefStore()); |
371 PrefStore* new_recommended_pref_store( | 432 PrefStore* new_recommended_pref_store( |
372 ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore()); | 433 ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore()); |
373 BrowserThread::ID current_thread_id; | 434 BrowserThread::ID current_thread_id; |
374 CHECK(BrowserThread::GetCurrentThreadIdentifier(¤t_thread_id)); | 435 CHECK(BrowserThread::GetCurrentThreadIdentifier(¤t_thread_id)); |
375 BrowserThread::PostTask( | 436 BrowserThread::PostTask( |
376 BrowserThread::FILE, FROM_HERE, | 437 BrowserThread::FILE, FROM_HERE, |
377 NewRunnableMethod(this, | 438 NewRunnableMethod(this, |
378 &PrefValueStore::RefreshPolicyPrefsOnFileThread, | 439 &PrefValueStore::RefreshPolicyPrefsOnFileThread, |
379 current_thread_id, | 440 current_thread_id, |
380 new_managed_pref_store, | 441 new_managed_platform_pref_store, |
| 442 new_device_management_pref_store, |
381 new_recommended_pref_store, | 443 new_recommended_pref_store, |
382 callback)); | 444 callback)); |
383 } | 445 } |
384 | 446 |
385 bool PrefValueStore::HasPolicyConflictingUserProxySettings() { | 447 bool PrefValueStore::HasPolicyConflictingUserProxySettings() { |
386 using policy::ConfigurationPolicyPrefStore; | 448 using policy::ConfigurationPolicyPrefStore; |
387 ConfigurationPolicyPrefStore::ProxyPreferenceSet proxy_prefs; | 449 ConfigurationPolicyPrefStore::ProxyPreferenceSet proxy_prefs; |
388 ConfigurationPolicyPrefStore::GetProxyPreferenceSet(&proxy_prefs); | 450 ConfigurationPolicyPrefStore::GetProxyPreferenceSet(&proxy_prefs); |
389 ConfigurationPolicyPrefStore::ProxyPreferenceSet::const_iterator i; | 451 ConfigurationPolicyPrefStore::ProxyPreferenceSet::const_iterator i; |
390 for (i = proxy_prefs.begin(); i != proxy_prefs.end(); ++i) { | 452 for (i = proxy_prefs.begin(); i != proxy_prefs.end(); ++i) { |
391 if (PrefValueInManagedStore(*i) && | 453 if ((PrefValueInManagedPlatformStore(*i) || |
| 454 PrefValueInDeviceManagementStore(*i)) && |
392 PrefValueInStoreRange(*i, | 455 PrefValueInStoreRange(*i, |
393 PrefNotifier::COMMAND_LINE_STORE, | 456 PrefNotifier::COMMAND_LINE_STORE, |
394 PrefNotifier::USER_STORE)) | 457 PrefNotifier::USER_STORE)) |
395 return true; | 458 return true; |
396 } | 459 } |
397 return false; | 460 return false; |
398 } | 461 } |
399 | 462 |
400 PrefValueStore::PrefValueStore(PrefStore* managed_prefs, | 463 PrefValueStore::PrefValueStore(PrefStore* managed_platform_prefs, |
| 464 PrefStore* device_management_prefs, |
401 PrefStore* extension_prefs, | 465 PrefStore* extension_prefs, |
402 PrefStore* command_line_prefs, | 466 PrefStore* command_line_prefs, |
403 PrefStore* user_prefs, | 467 PrefStore* user_prefs, |
404 PrefStore* recommended_prefs, | 468 PrefStore* recommended_prefs, |
405 PrefStore* default_prefs) { | 469 PrefStore* default_prefs) { |
406 // NULL default pref store is usually bad, but may be OK for some unit tests. | 470 // NULL default pref store is usually bad, but may be OK for some unit tests. |
407 if (!default_prefs) | 471 if (!default_prefs) |
408 LOG(WARNING) << "default pref store is null"; | 472 LOG(WARNING) << "default pref store is null"; |
409 pref_stores_[PrefNotifier::MANAGED_STORE].reset(managed_prefs); | 473 pref_stores_[PrefNotifier::MANAGED_PLATFORM_STORE].reset( |
| 474 managed_platform_prefs); |
| 475 pref_stores_[PrefNotifier::DEVICE_MANAGEMENT_STORE].reset( |
| 476 device_management_prefs); |
410 pref_stores_[PrefNotifier::EXTENSION_STORE].reset(extension_prefs); | 477 pref_stores_[PrefNotifier::EXTENSION_STORE].reset(extension_prefs); |
411 pref_stores_[PrefNotifier::COMMAND_LINE_STORE].reset(command_line_prefs); | 478 pref_stores_[PrefNotifier::COMMAND_LINE_STORE].reset(command_line_prefs); |
412 pref_stores_[PrefNotifier::USER_STORE].reset(user_prefs); | 479 pref_stores_[PrefNotifier::USER_STORE].reset(user_prefs); |
413 pref_stores_[PrefNotifier::RECOMMENDED_STORE].reset(recommended_prefs); | 480 pref_stores_[PrefNotifier::RECOMMENDED_STORE].reset(recommended_prefs); |
414 pref_stores_[PrefNotifier::DEFAULT_STORE].reset(default_prefs); | 481 pref_stores_[PrefNotifier::DEFAULT_STORE].reset(default_prefs); |
415 } | 482 } |
OLD | NEW |