Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(252)

Side by Side Diff: chrome/browser/extensions/api/settings_private/prefs_util.cc

Issue 2792163003: chrome.settingsPrivate: Check whitelist for getPref / setPref (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/extensions/api/settings_private/prefs_util.h" 5 #include "chrome/browser/extensions/api/settings_private/prefs_util.h"
6 6
7 #include "build/build_config.h" 7 #include "build/build_config.h"
8 #include "chrome/browser/browser_process.h" 8 #include "chrome/browser/browser_process.h"
9 #include "chrome/browser/extensions/chrome_extension_function.h" 9 #include "chrome/browser/extensions/chrome_extension_function.h"
10 #include "chrome/browser/extensions/settings_api_helpers.h" 10 #include "chrome/browser/extensions/settings_api_helpers.h"
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 settings_private::PrefType::PREF_TYPE_DICTIONARY; 365 settings_private::PrefType::PREF_TYPE_DICTIONARY;
366 366
367 #if defined(GOOGLE_CHROME_BUILD) 367 #if defined(GOOGLE_CHROME_BUILD)
368 (*s_whitelist)[::prefs::kMediaRouterEnableCloudServices] = 368 (*s_whitelist)[::prefs::kMediaRouterEnableCloudServices] =
369 settings_private::PrefType::PREF_TYPE_BOOLEAN; 369 settings_private::PrefType::PREF_TYPE_BOOLEAN;
370 #endif // defined(GOOGLE_CHROME_BUILD) 370 #endif // defined(GOOGLE_CHROME_BUILD)
371 371
372 return *s_whitelist; 372 return *s_whitelist;
373 } 373 }
374 374
375 settings_private::PrefType PrefsUtil::GetWhitelistedPrefType(
376 const std::string& pref_name) {
377 const TypedPrefMap& keys = GetWhitelistedKeys();
378 const auto& iter = keys.find(pref_name);
michaelpg 2017/04/04 00:37:09 nit: keys.count(pref_name) ? : is (IMO) prettier t
stevenjb 2017/04/04 18:18:11 We need to return iter->second.
379 return iter != keys.end() ? iter->second
380 : settings_private::PrefType::PREF_TYPE_NONE;
381 }
382
375 settings_private::PrefType PrefsUtil::GetType(const std::string& name, 383 settings_private::PrefType PrefsUtil::GetType(const std::string& name,
376 base::Value::Type type) { 384 base::Value::Type type) {
377 switch (type) { 385 switch (type) {
378 case base::Value::Type::BOOLEAN: 386 case base::Value::Type::BOOLEAN:
379 return settings_private::PrefType::PREF_TYPE_BOOLEAN; 387 return settings_private::PrefType::PREF_TYPE_BOOLEAN;
380 case base::Value::Type::INTEGER: 388 case base::Value::Type::INTEGER:
381 case base::Value::Type::DOUBLE: 389 case base::Value::Type::DOUBLE:
382 return settings_private::PrefType::PREF_TYPE_NUMBER; 390 return settings_private::PrefType::PREF_TYPE_NUMBER;
383 case base::Value::Type::STRING: 391 case base::Value::Type::STRING:
384 return IsPrefTypeURL(name) ? settings_private::PrefType::PREF_TYPE_URL 392 return IsPrefTypeURL(name) ? settings_private::PrefType::PREF_TYPE_URL
385 : settings_private::PrefType::PREF_TYPE_STRING; 393 : settings_private::PrefType::PREF_TYPE_STRING;
386 case base::Value::Type::LIST: 394 case base::Value::Type::LIST:
387 return settings_private::PrefType::PREF_TYPE_LIST; 395 return settings_private::PrefType::PREF_TYPE_LIST;
388 case base::Value::Type::DICTIONARY: 396 case base::Value::Type::DICTIONARY:
389 return settings_private::PrefType::PREF_TYPE_DICTIONARY; 397 return settings_private::PrefType::PREF_TYPE_DICTIONARY;
390 default: 398 default:
391 return settings_private::PrefType::PREF_TYPE_NONE; 399 return settings_private::PrefType::PREF_TYPE_NONE;
392 } 400 }
393 } 401 }
394 402
395 std::unique_ptr<settings_private::PrefObject> PrefsUtil::GetCrosSettingsPref( 403 std::unique_ptr<settings_private::PrefObject> PrefsUtil::GetCrosSettingsPref(
396 const std::string& name) { 404 const std::string& name) {
397 std::unique_ptr<settings_private::PrefObject> pref_object( 405 std::unique_ptr<settings_private::PrefObject> pref_object(
398 new settings_private::PrefObject()); 406 new settings_private::PrefObject());
399 407
400 #if defined(OS_CHROMEOS) 408 #if defined(OS_CHROMEOS)
401 const base::Value* value = CrosSettings::Get()->GetPref(name); 409 const base::Value* value = CrosSettings::Get()->GetPref(name);
402 DCHECK(value) << "Pref not found: " << name; 410 if (!value) {
411 LOG(ERROR) << "Cros settings pref not found: " << name;
michaelpg 2017/04/04 00:37:09 would NOTREACHED be more appropriate than removing
stevenjb 2017/04/04 18:18:11 We should only use DCHECK for code that is logical
412 return nullptr;
413 }
403 pref_object->key = name; 414 pref_object->key = name;
404 pref_object->type = GetType(name, value->GetType()); 415 pref_object->type = GetType(name, value->GetType());
405 pref_object->value.reset(value->DeepCopy()); 416 pref_object->value.reset(value->DeepCopy());
406 #endif 417 #endif
407 418
408 return pref_object; 419 return pref_object;
409 } 420 }
410 421
411 std::unique_ptr<settings_private::PrefObject> PrefsUtil::GetPref( 422 std::unique_ptr<settings_private::PrefObject> PrefsUtil::GetPref(
412 const std::string& name) { 423 const std::string& name) {
424 if (GetWhitelistedPrefType(name) ==
425 settings_private::PrefType::PREF_TYPE_NONE) {
426 return nullptr;
427 }
428
413 const PrefService::Preference* pref = nullptr; 429 const PrefService::Preference* pref = nullptr;
414 std::unique_ptr<settings_private::PrefObject> pref_object; 430 std::unique_ptr<settings_private::PrefObject> pref_object;
415 if (IsCrosSetting(name)) { 431 if (IsCrosSetting(name)) {
416 pref_object = GetCrosSettingsPref(name); 432 pref_object = GetCrosSettingsPref(name);
433 if (!pref_object)
434 return nullptr;
417 } else { 435 } else {
418 PrefService* pref_service = FindServiceForPref(name); 436 PrefService* pref_service = FindServiceForPref(name);
419 pref = pref_service->FindPreference(name); 437 pref = pref_service->FindPreference(name);
420 if (!pref) 438 if (!pref)
421 return nullptr; 439 return nullptr;
422 pref_object.reset(new settings_private::PrefObject()); 440 pref_object.reset(new settings_private::PrefObject());
423 pref_object->key = pref->name(); 441 pref_object->key = pref->name();
424 pref_object->type = GetType(name, pref->GetType()); 442 pref_object->type = GetType(name, pref->GetType());
425 pref_object->value.reset(pref->GetValue()->DeepCopy()); 443 pref_object->value.reset(pref->GetValue()->DeepCopy());
426 } 444 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 return pref_object; 517 return pref_object;
500 } 518 }
501 519
502 // TODO(dbeam): surface !IsUserModifiable or IsPrefSupervisorControlled? 520 // TODO(dbeam): surface !IsUserModifiable or IsPrefSupervisorControlled?
503 521
504 return pref_object; 522 return pref_object;
505 } 523 }
506 524
507 PrefsUtil::SetPrefResult PrefsUtil::SetPref(const std::string& pref_name, 525 PrefsUtil::SetPrefResult PrefsUtil::SetPref(const std::string& pref_name,
508 const base::Value* value) { 526 const base::Value* value) {
527 if (GetWhitelistedPrefType(pref_name) ==
528 settings_private::PrefType::PREF_TYPE_NONE) {
529 return PREF_NOT_FOUND;
530 }
531
509 if (IsCrosSetting(pref_name)) 532 if (IsCrosSetting(pref_name))
510 return SetCrosSettingsPref(pref_name, value); 533 return SetCrosSettingsPref(pref_name, value);
511 534
512 PrefService* pref_service = FindServiceForPref(pref_name); 535 PrefService* pref_service = FindServiceForPref(pref_name);
513 536
514 if (!IsPrefUserModifiable(pref_name)) 537 if (!IsPrefUserModifiable(pref_name))
515 return PREF_NOT_MODIFIABLE; 538 return PREF_NOT_MODIFIABLE;
516 539
517 const PrefService::Preference* pref = pref_service->FindPreference(pref_name); 540 const PrefService::Preference* pref = pref_service->FindPreference(pref_name);
518 if (!pref) 541 if (!pref)
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 } 637 }
615 638
616 CrosSettings::Get()->RemoveFromList(pref_name, &value); 639 CrosSettings::Get()->RemoveFromList(pref_name, &value);
617 return true; 640 return true;
618 #else 641 #else
619 return false; 642 return false;
620 #endif 643 #endif
621 } 644 }
622 645
623 bool PrefsUtil::IsPrefTypeURL(const std::string& pref_name) { 646 bool PrefsUtil::IsPrefTypeURL(const std::string& pref_name) {
624 settings_private::PrefType pref_type = 647 return GetWhitelistedPrefType(pref_name) ==
625 settings_private::PrefType::PREF_TYPE_NONE; 648 settings_private::PrefType::PREF_TYPE_URL;
626
627 const TypedPrefMap keys = GetWhitelistedKeys();
628 const auto& iter = keys.find(pref_name);
629 if (iter != keys.end())
630 pref_type = iter->second;
631
632 return pref_type == settings_private::PrefType::PREF_TYPE_URL;
633 } 649 }
634 650
635 #if defined(OS_CHROMEOS) 651 #if defined(OS_CHROMEOS)
636 bool PrefsUtil::IsPrefEnterpriseManaged(const std::string& pref_name) { 652 bool PrefsUtil::IsPrefEnterpriseManaged(const std::string& pref_name) {
637 if (IsPrivilegedCrosSetting(pref_name)) { 653 if (IsPrivilegedCrosSetting(pref_name)) {
638 policy::BrowserPolicyConnectorChromeOS* connector = 654 policy::BrowserPolicyConnectorChromeOS* connector =
639 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 655 g_browser_process->platform_part()->browser_policy_connector_chromeos();
640 if (connector->IsEnterpriseManaged()) 656 if (connector->IsEnterpriseManaged())
641 return true; 657 return true;
642 } 658 }
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 ExtensionPrefValueMapFactory::GetForBrowserContext(profile_) 767 ExtensionPrefValueMapFactory::GetForBrowserContext(profile_)
752 ->GetExtensionControllingPref(pref_object.key); 768 ->GetExtensionControllingPref(pref_object.key);
753 if (extension_id.empty()) 769 if (extension_id.empty())
754 return nullptr; 770 return nullptr;
755 771
756 return ExtensionRegistry::Get(profile_)->GetExtensionById( 772 return ExtensionRegistry::Get(profile_)->GetExtensionById(
757 extension_id, ExtensionRegistry::ENABLED); 773 extension_id, ExtensionRegistry::ENABLED);
758 } 774 }
759 775
760 } // namespace extensions 776 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698