summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-07 21:54:51 +0000
committerxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-07 21:54:51 +0000
commitb671ef3ffa0bb016fed93529bae49fb89c683198 (patch)
tree5de53924bb32fc75a32894f5168f4b08aa77b10d /chrome/browser
parentebb90aa0b972184a818b49d250b2ba7cc9c36d53 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/chromeos/cros_settings_provider_user.cc95
-rw-r--r--chrome/browser/chromeos/cros_settings_provider_user.h3
-rw-r--r--chrome/browser/chromeos/login/existing_user_controller.cc12
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;
}