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

Side by Side Diff: chrome/browser/chromeos/cros_settings_provider_user.cc

Issue 3413021: Implement users options handling in login screen. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: for tfarina,dpolukhin,nkostylev #1 Created 10 years, 3 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 (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/chromeos/cros_settings_provider_user.h" 5 #include "chrome/browser/chromeos/cros_settings_provider_user.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/string_util.h" 8 #include "base/string_util.h"
9 #include "base/values.h" 9 #include "base/values.h"
10 #include "chrome/browser/browser_process.h"
10 #include "chrome/browser/chromeos/cros/cros_library.h" 11 #include "chrome/browser/chromeos/cros/cros_library.h"
11 #include "chrome/browser/chromeos/cros/login_library.h" 12 #include "chrome/browser/chromeos/cros/login_library.h"
12 #include "chrome/browser/chromeos/cros_settings.h" 13 #include "chrome/browser/chromeos/cros_settings.h"
13 #include "chrome/browser/chromeos/cros_settings_names.h" 14 #include "chrome/browser/chromeos/cros_settings_names.h"
14 #include "chrome/browser/chromeos/login/user_manager.h" 15 #include "chrome/browser/chromeos/login/user_manager.h"
16 #include "chrome/browser/prefs/pref_service.h"
15 17
16 namespace { 18 namespace {
17 19
18 Value* CreateSettingsBooleanValue(bool value, bool managed) { 20 Value* CreateSettingsBooleanValue(bool value, bool managed) {
19 DictionaryValue* dict = new DictionaryValue; 21 DictionaryValue* dict = new DictionaryValue;
20 dict->Set("value", Value::CreateBooleanValue(value)); 22 dict->Set("value", Value::CreateBooleanValue(value));
21 dict->Set("managed", Value::CreateBooleanValue(managed)); 23 dict->Set("managed", Value::CreateBooleanValue(managed));
22 return dict; 24 return dict;
23 } 25 }
24 26
27 void UpdateCache(const char* name, bool value) {
28 PrefService* prefs = g_browser_process->local_state();
29 prefs->SetBoolean(name, value);
30 prefs->ScheduleSavePersistentPrefs();
31 }
32
25 } // namespace 33 } // namespace
26 34
27 namespace chromeos { 35 namespace chromeos {
28 36
29 UserCrosSettingsProvider::UserCrosSettingsProvider() 37 UserCrosSettingsProvider::UserCrosSettingsProvider() {
30 : cache_(new DictionaryValue) {
31 current_user_is_owner_ = UserManager::Get()->current_user_is_owner(); 38 current_user_is_owner_ = UserManager::Get()->current_user_is_owner();
32 39
33 StartFetchingBoolSetting(kAccountsPrefAllowBWSI, true); 40 StartFetchingBoolSetting(kAccountsPrefAllowBWSI);
34 StartFetchingBoolSetting(kAccountsPrefAllowGuest, true); 41 StartFetchingBoolSetting(kAccountsPrefAllowGuest);
35 StartFetchingBoolSetting(kAccountsPrefShowUserNamesOnSignIn, true); 42 StartFetchingBoolSetting(kAccountsPrefShowUserNamesOnSignIn);
36
37 LoadUserWhitelist();
38 } 43 }
39 44
40 UserCrosSettingsProvider::~UserCrosSettingsProvider() { 45 UserCrosSettingsProvider::~UserCrosSettingsProvider() {
41 // Cancels all pending callbacks from us. 46 // Cancels all pending callbacks from us.
42 SignedSettingsHelper::Get()->CancelCallback(this); 47 SignedSettingsHelper::Get()->CancelCallback(this);
43 } 48 }
44 49
50 void UserCrosSettingsProvider::RegisterPrefs(PrefService* local_state) {
51 // Cached signed settings values
52 local_state->RegisterBooleanPref(kAccountsPrefAllowBWSI, true);
53 local_state->RegisterBooleanPref(kAccountsPrefAllowGuest, true);
54 local_state->RegisterBooleanPref(kAccountsPrefShowUserNamesOnSignIn, true);
55 local_state->RegisterListPref(kAccountsPrefUsers);
56 }
57
58 bool UserCrosSettingsProvider::cached_allow_bwsi() {
59 return g_browser_process->local_state()->GetBoolean(kAccountsPrefAllowBWSI);
60 }
61
62 bool UserCrosSettingsProvider::cached_allow_guest() {
63 return g_browser_process->local_state()->GetBoolean(kAccountsPrefAllowGuest);
64 }
65
66 bool UserCrosSettingsProvider::cached_show_users_on_signin() {
67 return g_browser_process->local_state()->GetBoolean(
68 kAccountsPrefShowUserNamesOnSignIn);
69 }
70
71 const ListValue* UserCrosSettingsProvider::cached_whitelist() {
72 return g_browser_process->local_state()->GetList(kAccountsPrefUsers);
73 }
74
45 void UserCrosSettingsProvider::Set(const std::string& path, Value* in_value) { 75 void UserCrosSettingsProvider::Set(const std::string& path, Value* in_value) {
46 if (path == kAccountsPrefAllowBWSI || 76 if (path == kAccountsPrefAllowBWSI ||
47 path == kAccountsPrefAllowGuest || 77 path == kAccountsPrefAllowGuest ||
48 path == kAccountsPrefShowUserNamesOnSignIn) { 78 path == kAccountsPrefShowUserNamesOnSignIn) {
49 bool bool_value = false; 79 bool bool_value = false;
50 if (in_value->GetAsBoolean(&bool_value)) { 80 if (in_value->GetAsBoolean(&bool_value)) {
51 cache_->Set(path, in_value);
52
53 std::string value = bool_value ? "true" : "false"; 81 std::string value = bool_value ? "true" : "false";
54 SignedSettingsHelper::Get()->StartStorePropertyOp(path, value, this); 82 SignedSettingsHelper::Get()->StartStorePropertyOp(path, value, this);
83 UpdateCache(path.c_str(), bool_value);
55 84
56 LOG(INFO) << "Set cros setting " << path << "=" << value; 85 LOG(INFO) << "Set cros setting " << path << "=" << value;
57 } 86 }
58 } else if (path == kAccountsPrefUsers) { 87 } else if (path == kAccountsPrefUsers) {
59 LOG(INFO) << "Setting user whitelist is not implemented." 88 LOG(INFO) << "Setting user whitelist is not implemented."
60 << "Please use whitelist/unwhitelist instead."; 89 << "Please use whitelist/unwhitelist instead.";
61 } else { 90 } else {
62 LOG(WARNING) << "Try to set unhandled cros setting " << path; 91 LOG(WARNING) << "Try to set unhandled cros setting " << path;
63 } 92 }
64 } 93 }
65 94
66 bool UserCrosSettingsProvider::Get(const std::string& path, 95 bool UserCrosSettingsProvider::Get(const std::string& path,
67 Value** out_value) const { 96 Value** out_value) const {
68 Value* value = NULL; 97 if (path == kAccountsPrefAllowBWSI ||
69 if (cache_->Get(path, &value) && value) { 98 path == kAccountsPrefAllowGuest ||
70 *out_value = value->DeepCopy(); 99 path == kAccountsPrefShowUserNamesOnSignIn) {
100 *out_value = Value::CreateBooleanValue(
101 g_browser_process->local_state()->GetBoolean(path.c_str()));
102 return true;
103 } else if (path == kAccountsPrefUsers) {
104 *out_value = GetUserWhitelist();
71 return true; 105 return true;
72 } 106 }
73 107
74 return false; 108 return false;
75 } 109 }
76 110
77 bool UserCrosSettingsProvider::HandlesSetting(const std::string& path) { 111 bool UserCrosSettingsProvider::HandlesSetting(const std::string& path) {
78 return ::StartsWithASCII(path, "cros.accounts.", true); 112 return ::StartsWithASCII(path, "cros.accounts.", true);
79 } 113 }
80 114
81 void UserCrosSettingsProvider::OnWhitelistCompleted(bool success, 115 void UserCrosSettingsProvider::OnWhitelistCompleted(bool success,
82 const std::string& email) { 116 const std::string& email) {
83 LOG(INFO) << "Add " << email << " to whitelist, success=" << success; 117 LOG(INFO) << "Add " << email << " to whitelist, success=" << success;
84 118
85 // Reload the whitelist on settings op failure. 119 // Reload the whitelist on settings op failure.
86 if (!success) 120 if (!success)
87 LoadUserWhitelist(); 121 CrosSettings::Get()->FireObservers(kAccountsPrefUsers);
88 } 122 }
89 123
90 void UserCrosSettingsProvider::OnUnwhitelistCompleted(bool success, 124 void UserCrosSettingsProvider::OnUnwhitelistCompleted(bool success,
91 const std::string& email) { 125 const std::string& email) {
92 LOG(INFO) << "Remove " << email << " from whitelist, success=" << success; 126 LOG(INFO) << "Remove " << email << " from whitelist, success=" << success;
93 127
94 // Reload the whitelist on settings op failure. 128 // Reload the whitelist on settings op failure.
95 if (!success) 129 if (!success)
96 LoadUserWhitelist(); 130 CrosSettings::Get()->FireObservers(kAccountsPrefUsers);
97 } 131 }
98 132
99 void UserCrosSettingsProvider::OnStorePropertyCompleted( 133 void UserCrosSettingsProvider::OnStorePropertyCompleted(
100 bool success, const std::string& name, const std::string& value) { 134 bool success, const std::string& name, const std::string& value) {
101 LOG(INFO) << "Store cros setting " << name << "=" << value 135 LOG(INFO) << "Store cros setting " << name << "=" << value
102 << ", success=" << success; 136 << ", success=" << success;
103 137
104 // Reload the setting if store op fails. 138 // Reload the setting if store op fails.
105 if (!success) 139 if (!success)
106 SignedSettingsHelper::Get()->StartRetrieveProperty(name, this); 140 SignedSettingsHelper::Get()->StartRetrieveProperty(name, this);
107 } 141 }
108 142
109 void UserCrosSettingsProvider::OnRetrievePropertyCompleted( 143 void UserCrosSettingsProvider::OnRetrievePropertyCompleted(
110 bool success, const std::string& name, const std::string& value) { 144 bool success, const std::string& name, const std::string& value) {
111 if (!success) { 145 if (!success) {
112 LOG(WARNING) << "Failed to retrieve cros setting, name=" << name; 146 LOG(WARNING) << "Failed to retrieve cros setting, name=" << name;
113 return; 147 return;
114 } 148 }
115 149
116 LOG(INFO) << "Retrieved cros setting " << name << "=" << value; 150 LOG(INFO) << "Retrieved cros setting " << name << "=" << value;
117 151
118 bool bool_value = value == "true" ? true : false; 152 UpdateCache(name.c_str(), value == "true" ? true : false);
119 cache_->Set(name,
120 CreateSettingsBooleanValue(bool_value, !current_user_is_owner_));
121 CrosSettings::Get()->FireObservers(name.c_str()); 153 CrosSettings::Get()->FireObservers(name.c_str());
122 } 154 }
123 155
124 void UserCrosSettingsProvider::WhitelistUser(const std::string& email) { 156 void UserCrosSettingsProvider::WhitelistUser(const std::string& email) {
125 SignedSettingsHelper::Get()->StartWhitelistOp(email, true, this); 157 SignedSettingsHelper::Get()->StartWhitelistOp(email, true, this);
158
159 PrefService* prefs = g_browser_process->local_state();
160 ListValue* cached_whitelist = prefs->GetMutableList(kAccountsPrefUsers);
161 cached_whitelist->Append(Value::CreateStringValue(email));
162 prefs->ScheduleSavePersistentPrefs();
126 } 163 }
127 164
128 void UserCrosSettingsProvider::UnwhitelistUser(const std::string& email) { 165 void UserCrosSettingsProvider::UnwhitelistUser(const std::string& email) {
129 SignedSettingsHelper::Get()->StartWhitelistOp(email, false, this); 166 SignedSettingsHelper::Get()->StartWhitelistOp(email, false, this);
167
168 PrefService* prefs = g_browser_process->local_state();
169 ListValue* cached_whitelist = prefs->GetMutableList(kAccountsPrefUsers);
170 StringValue email_value(email);
171 if (cached_whitelist->Remove(email_value) != -1)
172 prefs->ScheduleSavePersistentPrefs();
130 } 173 }
131 174
132 void UserCrosSettingsProvider::StartFetchingBoolSetting( 175 void UserCrosSettingsProvider::StartFetchingBoolSetting(
133 const std::string& name, 176 const std::string& name) {
134 bool default_value) {
135 if (!cache_->HasKey(name)) {
136 cache_->Set(name,
137 CreateSettingsBooleanValue(default_value, !current_user_is_owner_));
138 }
139
140 if (CrosLibrary::Get()->EnsureLoaded()) 177 if (CrosLibrary::Get()->EnsureLoaded())
141 SignedSettingsHelper::Get()->StartRetrieveProperty(name, this); 178 SignedSettingsHelper::Get()->StartRetrieveProperty(name, this);
142 } 179 }
143 180
144 void UserCrosSettingsProvider::LoadUserWhitelist() { 181 ListValue* UserCrosSettingsProvider::GetUserWhitelist() const {
145 ListValue* user_list = new ListValue; 182 ListValue* user_list = new ListValue;
146 183
147 std::vector<std::string> whitelist; 184 std::vector<std::string> whitelist;
148 if (!CrosLibrary::Get()->EnsureLoaded() || 185 if (!CrosLibrary::Get()->EnsureLoaded() ||
149 !CrosLibrary::Get()->GetLoginLibrary()->EnumerateWhitelisted( 186 !CrosLibrary::Get()->GetLoginLibrary()->EnumerateWhitelisted(
150 &whitelist)) { 187 &whitelist)) {
151 LOG(WARNING) << "Failed to retrieve user whitelist."; 188 LOG(WARNING) << "Failed to retrieve user whitelist.";
152 } else { 189 } else {
190 PrefService* prefs = g_browser_process->local_state();
191 ListValue* cached_whitelist = prefs->GetMutableList(kAccountsPrefUsers);
192 cached_whitelist->Clear();
193
153 const UserManager::User& current_user = 194 const UserManager::User& current_user =
154 UserManager::Get()->logged_in_user(); 195 UserManager::Get()->logged_in_user();
155 for (size_t i = 0; i < whitelist.size(); ++i) { 196 for (size_t i = 0; i < whitelist.size(); ++i) {
156 const std::string& email = whitelist[i]; 197 const std::string& email = whitelist[i];
157 198
158 DictionaryValue* user = new DictionaryValue; 199 DictionaryValue* user = new DictionaryValue;
159 user->SetString("email", email); 200 user->SetString("email", email);
160 user->SetString("name", ""); 201 user->SetString("name", "");
161 user->SetBoolean("owner", 202 user->SetBoolean("owner",
162 current_user_is_owner_ && email == current_user.email()); 203 current_user_is_owner_ && email == current_user.email());
163 204
164 user_list->Append(user); 205 user_list->Append(user);
206 cached_whitelist->Append(Value::CreateStringValue(email));
165 } 207 }
208
209 prefs->ScheduleSavePersistentPrefs();
166 } 210 }
167 211
168 cache_->Set(kAccountsPrefUsers, user_list); 212 return user_list;
169 CrosSettings::Get()->FireObservers(kAccountsPrefUsers);
170 } 213 }
171 214
172 } // namespace chromeos 215 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698