diff options
author | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-07 21:54:51 +0000 |
---|---|---|
committer | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-07 21:54:51 +0000 |
commit | b671ef3ffa0bb016fed93529bae49fb89c683198 (patch) | |
tree | 5de53924bb32fc75a32894f5168f4b08aa77b10d /chrome/browser | |
parent | ebb90aa0b972184a818b49d250b2ba7cc9c36d53 (diff) | |
download | chromium_src-b671ef3ffa0bb016fed93529bae49fb89c683198.zip chromium_src-b671ef3ffa0bb016fed93529bae49fb89c683198.tar.gz chromium_src-b671ef3ffa0bb016fed93529bae49fb89c683198.tar.bz2 |
Fix crash caused by missing user white list cache.
- Handle the user white list missing case;
- Change in user settings provider to populate white list cache if it
is missing;
BUG=chromium-os:7442
TEST=Verify crash in chromium-os:7442 no longer happens.
Review URL: http://codereview.chromium.org/3532017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61856 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
3 files changed, 60 insertions, 50 deletions
diff --git a/chrome/browser/chromeos/cros_settings_provider_user.cc b/chrome/browser/chromeos/cros_settings_provider_user.cc index 65fff62..e5f4e94 100644 --- a/chrome/browser/chromeos/cros_settings_provider_user.cc +++ b/chrome/browser/chromeos/cros_settings_provider_user.cc @@ -15,6 +15,8 @@ #include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/prefs/pref_service.h" +namespace chromeos { + namespace { Value* CreateSettingsBooleanValue(bool value, bool managed) { @@ -30,13 +32,44 @@ void UpdateCache(const char* name, bool value) { prefs->ScheduleSavePersistentPrefs(); } -} // namespace +bool GetUserWhitelist(ListValue* user_list) { + std::vector<std::string> whitelist; + if (!CrosLibrary::Get()->EnsureLoaded() || + !CrosLibrary::Get()->GetLoginLibrary()->EnumerateWhitelisted( + &whitelist)) { + LOG(WARNING) << "Failed to retrieve user whitelist."; + return false; + } -namespace chromeos { + PrefService* prefs = g_browser_process->local_state(); + ListValue* cached_whitelist = prefs->GetMutableList(kAccountsPrefUsers); + cached_whitelist->Clear(); -UserCrosSettingsProvider::UserCrosSettingsProvider() { - current_user_is_owner_ = UserManager::Get()->current_user_is_owner(); + const UserManager::User& self = UserManager::Get()->logged_in_user(); + bool is_owner = UserManager::Get()->current_user_is_owner(); + + for (size_t i = 0; i < whitelist.size(); ++i) { + const std::string& email = whitelist[i]; + + if (user_list) { + DictionaryValue* user = new DictionaryValue; + user->SetString("email", email); + user->SetString("name", ""); + user->SetBoolean("owner", is_owner && email == self.email()); + user_list->Append(user); + } + + cached_whitelist->Append(Value::CreateStringValue(email)); + } + + prefs->ScheduleSavePersistentPrefs(); + + return true; +} + +} // namespace +UserCrosSettingsProvider::UserCrosSettingsProvider() { StartFetchingBoolSetting(kAccountsPrefAllowBWSI); StartFetchingBoolSetting(kAccountsPrefAllowNewUser); StartFetchingBoolSetting(kAccountsPrefShowUserNamesOnSignIn); @@ -70,11 +103,21 @@ bool UserCrosSettingsProvider::cached_show_users_on_signin() { } const ListValue* UserCrosSettingsProvider::cached_whitelist() { - return g_browser_process->local_state()->GetList(kAccountsPrefUsers); + PrefService* prefs = g_browser_process->local_state(); + const ListValue* cached_users = prefs->GetList(kAccountsPrefUsers); + + if (!cached_users) { + // Update whitelist cache. + GetUserWhitelist(NULL); + + cached_users = prefs->GetList(kAccountsPrefUsers); + } + + return cached_users; } void UserCrosSettingsProvider::Set(const std::string& path, Value* in_value) { - if (!current_user_is_owner_) { + if (!UserManager::Get()->current_user_is_owner()) { LOG(WARNING) << "Changing settings from non-owner, setting=" << path; // Revert UI change. @@ -108,10 +151,12 @@ bool UserCrosSettingsProvider::Get(const std::string& path, path == kAccountsPrefShowUserNamesOnSignIn) { *out_value = CreateSettingsBooleanValue( g_browser_process->local_state()->GetBoolean(path.c_str()), - !current_user_is_owner_); + !UserManager::Get()->current_user_is_owner()); return true; } else if (path == kAccountsPrefUsers) { - *out_value = GetUserWhitelist(); + ListValue* user_list = new ListValue; + GetUserWhitelist(user_list); + *out_value = user_list; return true; } @@ -188,38 +233,4 @@ void UserCrosSettingsProvider::StartFetchingBoolSetting( SignedSettingsHelper::Get()->StartRetrieveProperty(name, this); } -ListValue* UserCrosSettingsProvider::GetUserWhitelist() const { - ListValue* user_list = new ListValue; - - std::vector<std::string> whitelist; - if (!CrosLibrary::Get()->EnsureLoaded() || - !CrosLibrary::Get()->GetLoginLibrary()->EnumerateWhitelisted( - &whitelist)) { - LOG(WARNING) << "Failed to retrieve user whitelist."; - } else { - PrefService* prefs = g_browser_process->local_state(); - ListValue* cached_whitelist = prefs->GetMutableList(kAccountsPrefUsers); - cached_whitelist->Clear(); - - const UserManager::User& current_user = - UserManager::Get()->logged_in_user(); - for (size_t i = 0; i < whitelist.size(); ++i) { - const std::string& email = whitelist[i]; - - DictionaryValue* user = new DictionaryValue; - user->SetString("email", email); - user->SetString("name", ""); - user->SetBoolean("owner", - current_user_is_owner_ && email == current_user.email()); - - user_list->Append(user); - cached_whitelist->Append(Value::CreateStringValue(email)); - } - - prefs->ScheduleSavePersistentPrefs(); - } - - return user_list; -} - } // namespace chromeos diff --git a/chrome/browser/chromeos/cros_settings_provider_user.h b/chrome/browser/chromeos/cros_settings_provider_user.h index f1da644..0c7f9a1 100644 --- a/chrome/browser/chromeos/cros_settings_provider_user.h +++ b/chrome/browser/chromeos/cros_settings_provider_user.h @@ -50,9 +50,6 @@ class UserCrosSettingsProvider : public CrosSettingsProvider, private: void StartFetchingBoolSetting(const std::string& name); - ListValue* GetUserWhitelist() const; - - bool current_user_is_owner_; DISALLOW_COPY_AND_ASSIGN(UserCrosSettingsProvider); }; diff --git a/chrome/browser/chromeos/login/existing_user_controller.cc b/chrome/browser/chromeos/login/existing_user_controller.cc index b947573..d317e7b 100644 --- a/chrome/browser/chromeos/login/existing_user_controller.cc +++ b/chrome/browser/chromeos/login/existing_user_controller.cc @@ -100,12 +100,14 @@ void EnableTooltipsIfNeeded(const std::vector<UserController*>& controllers) { // Note this function is for display purpose only and should use // CheckWhitelist op for the real whitelist check. bool IsEmailInCachedWhitelist(const std::string& email) { - StringValue email_value(email); const ListValue* whitelist = UserCrosSettingsProvider::cached_whitelist(); - for (ListValue::const_iterator i(whitelist->begin()); - i != whitelist->end(); ++i) { - if ((*i)->Equals(&email_value)) - return true; + if (whitelist) { + StringValue email_value(email); + for (ListValue::const_iterator i(whitelist->begin()); + i != whitelist->end(); ++i) { + if ((*i)->Equals(&email_value)) + return true; + } } return false; } |