OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/user_cros_settings_provider.h" | 5 #include "chrome/browser/chromeos/user_cros_settings_provider.h" |
6 | 6 |
7 #include <map> | |
8 #include <set> | |
9 | |
10 #include "base/bind.h" | 7 #include "base/bind.h" |
11 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
12 #include "base/callback.h" | 9 #include "base/callback.h" |
13 #include "base/hash_tables.h" | 10 #include "base/hash_tables.h" |
14 #include "base/logging.h" | 11 #include "base/logging.h" |
15 #include "base/memory/singleton.h" | 12 #include "base/memory/singleton.h" |
16 #include "base/string_util.h" | 13 #include "base/string_util.h" |
17 #include "base/values.h" | 14 #include "base/values.h" |
18 #include "chrome/browser/browser_process.h" | 15 #include "chrome/browser/browser_process.h" |
19 #include "chrome/browser/chromeos/cros/cros_library.h" | 16 #include "chrome/browser/chromeos/cros/cros_library.h" |
20 #include "chrome/browser/chromeos/cros/network_library.h" | 17 #include "chrome/browser/chromeos/cros/network_library.h" |
21 #include "chrome/browser/chromeos/cros_settings.h" | 18 #include "chrome/browser/chromeos/cros_settings.h" |
22 #include "chrome/browser/chromeos/cros_settings_names.h" | 19 #include "chrome/browser/chromeos/cros_settings_names.h" |
23 #include "chrome/browser/chromeos/login/ownership_service.h" | 20 #include "chrome/browser/chromeos/login/ownership_service.h" |
24 #include "chrome/browser/chromeos/login/ownership_status_checker.h" | 21 #include "chrome/browser/chromeos/login/ownership_status_checker.h" |
25 #include "chrome/browser/chromeos/login/user_manager.h" | 22 #include "chrome/browser/chromeos/login/user_manager.h" |
26 #include "chrome/browser/prefs/pref_service.h" | 23 #include "chrome/browser/prefs/pref_service.h" |
24 #include "chrome/browser/prefs/pref_value_map.h" | |
27 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 25 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
28 #include "chrome/browser/ui/options/options_util.h" | 26 #include "chrome/browser/ui/options/options_util.h" |
29 #include "chrome/common/chrome_notification_types.h" | 27 #include "chrome/common/chrome_notification_types.h" |
30 #include "chrome/installer/util/google_update_settings.h" | 28 #include "chrome/installer/util/google_update_settings.h" |
31 #include "content/browser/browser_thread.h" | 29 #include "content/browser/browser_thread.h" |
32 #include "content/public/browser/notification_service.h" | 30 #include "content/public/browser/notification_service.h" |
33 | 31 |
34 namespace chromeos { | 32 namespace chromeos { |
35 | 33 |
36 namespace { | 34 namespace { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
69 public: | 67 public: |
70 explicit MigrationHelper() : callback_(NULL) { | 68 explicit MigrationHelper() : callback_(NULL) { |
71 registrar_.Add(this, chrome::NOTIFICATION_OWNERSHIP_CHECKED, | 69 registrar_.Add(this, chrome::NOTIFICATION_OWNERSHIP_CHECKED, |
72 content::NotificationService::AllSources()); | 70 content::NotificationService::AllSources()); |
73 } | 71 } |
74 | 72 |
75 void set_callback(SignedSettingsHelper::Callback* callback) { | 73 void set_callback(SignedSettingsHelper::Callback* callback) { |
76 callback_ = callback; | 74 callback_ = callback; |
77 } | 75 } |
78 | 76 |
79 void AddMigrationValue(const std::string& path, const std::string& value) { | 77 void AddMigrationValue(const std::string& path, base::Value* value) { |
80 migration_values_[path] = value; | 78 migration_values_.SetValue(path, value); |
81 } | 79 } |
82 | 80 |
83 void MigrateValues(void) { | 81 void MigrateValues(void) { |
84 ownership_checker_.reset(new OwnershipStatusChecker( | 82 ownership_checker_.reset(new OwnershipStatusChecker( |
85 base::Bind(&MigrationHelper::DoMigrateValues, base::Unretained(this)))); | 83 base::Bind(&MigrationHelper::DoMigrateValues, base::Unretained(this)))); |
86 } | 84 } |
87 | 85 |
88 // NotificationObserver overrides: | 86 // NotificationObserver overrides: |
89 virtual void Observe(int type, | 87 virtual void Observe(int type, |
90 const content::NotificationSource& source, | 88 const content::NotificationSource& source, |
91 const content::NotificationDetails& details) OVERRIDE { | 89 const content::NotificationDetails& details) OVERRIDE { |
92 if (type == chrome::NOTIFICATION_OWNERSHIP_CHECKED) | 90 if (type == chrome::NOTIFICATION_OWNERSHIP_CHECKED) |
93 MigrateValues(); | 91 MigrateValues(); |
94 } | 92 } |
95 | 93 |
96 private: | 94 private: |
97 void DoMigrateValues(OwnershipService::Status status, | 95 void DoMigrateValues(OwnershipService::Status status, |
98 bool current_user_is_owner) { | 96 bool current_user_is_owner) { |
99 ownership_checker_.reset(NULL); | 97 ownership_checker_.reset(NULL); |
100 | 98 |
101 // We can call StartStorePropertyOp in two cases - either if the owner is | 99 // We can call StartStorePropertyOp in two cases - either if the owner is |
102 // currently logged in and the policy can be updated immediately or if there | 100 // currently logged in and the policy can be updated immediately or if there |
103 // is no owner yet in which case the value will be temporarily stored in the | 101 // is no owner yet in which case the value will be temporarily stored in the |
104 // SignedSettingsTempStorage until the device is owned. If none of these | 102 // SignedSettingsTempStorage until the device is owned. If none of these |
105 // cases is met then we will wait for user change notification and retry. | 103 // cases is met then we will wait for user change notification and retry. |
106 if (current_user_is_owner || status != OwnershipService::OWNERSHIP_TAKEN) { | 104 if (current_user_is_owner || status != OwnershipService::OWNERSHIP_TAKEN) { |
107 std::map<std::string, std::string>::const_iterator i; | 105 PrefValueMap::const_iterator i; |
108 for (i = migration_values_.begin(); i != migration_values_.end(); ++i) { | 106 for (i = migration_values_.begin(); i != migration_values_.end(); ++i) { |
109 // Queue all values for storing. | 107 // Queue all values for storing. |
110 SignedSettingsHelper::Get()->StartStorePropertyOp(i->first, i->second, | 108 SignedSettingsHelper::Get()->StartStorePropertyOp(i->first, *i->second, |
111 callback_); | 109 callback_); |
112 } | 110 } |
113 migration_values_.clear(); | 111 migration_values_.Clear(); |
114 } | 112 } |
115 } | 113 } |
116 | 114 |
117 content::NotificationRegistrar registrar_; | 115 content::NotificationRegistrar registrar_; |
118 scoped_ptr<OwnershipStatusChecker> ownership_checker_; | 116 scoped_ptr<OwnershipStatusChecker> ownership_checker_; |
119 SignedSettingsHelper::Callback* callback_; | 117 SignedSettingsHelper::Callback* callback_; |
120 | 118 PrefValueMap migration_values_; |
121 std::map<std::string, std::string> migration_values_; | |
122 | 119 |
123 DISALLOW_COPY_AND_ASSIGN(MigrationHelper); | 120 DISALLOW_COPY_AND_ASSIGN(MigrationHelper); |
124 }; | 121 }; |
125 | 122 |
123 // A task that exports the Op completion to a Closure callback. | |
124 class TrustedEntryFetcher : public Task { | |
Mattias Nissler (ping if slow)
2011/10/28 14:44:07
Seems unused.
pastarmovj
2011/11/18 13:18:42
Yep obsolete since the base::Bind refactor of Task
| |
125 public: | |
126 explicit TrustedEntryFetcher(const base::Closure& callback) | |
127 : callback_(callback) { | |
128 } | |
129 | |
130 void Run() { | |
131 callback_.Run(); | |
132 } | |
133 | |
134 private: | |
135 base::Closure callback_; | |
136 | |
137 DISALLOW_COPY_AND_ASSIGN(TrustedEntryFetcher); | |
138 }; | |
139 | |
126 bool IsControlledBooleanSetting(const std::string& pref_path) { | 140 bool IsControlledBooleanSetting(const std::string& pref_path) { |
127 // TODO(nkostylev): Using std::find for 4 value array generates this warning | 141 // TODO(nkostylev): Using std::find for 4 value array generates this warning |
128 // in chroot stl_algo.h:231: error: array subscript is above array bounds. | 142 // in chroot stl_algo.h:231: error: array subscript is above array bounds. |
129 // GCC 4.4.3 | 143 // GCC 4.4.3 |
130 return (pref_path == kAccountsPrefAllowNewUser) || | 144 return (pref_path == kAccountsPrefAllowNewUser) || |
131 (pref_path == kAccountsPrefAllowGuest) || | 145 (pref_path == kAccountsPrefAllowGuest) || |
132 (pref_path == kAccountsPrefShowUserNamesOnSignIn) || | 146 (pref_path == kAccountsPrefShowUserNamesOnSignIn) || |
133 (pref_path == kSignedDataRoamingEnabled) || | 147 (pref_path == kSignedDataRoamingEnabled) || |
134 (pref_path == kStatsReportingPref); | 148 (pref_path == kStatsReportingPref); |
135 } | 149 } |
136 | 150 |
137 bool IsControlledStringSetting(const std::string& pref_path) { | 151 bool IsControlledStringSetting(const std::string& pref_path) { |
138 return std::find(kStringSettings, | 152 return std::find(kStringSettings, |
139 kStringSettings + arraysize(kStringSettings), | 153 kStringSettings + arraysize(kStringSettings), |
140 pref_path) != | 154 pref_path) != |
141 kStringSettings + arraysize(kStringSettings); | 155 kStringSettings + arraysize(kStringSettings); |
142 } | 156 } |
143 | 157 |
144 bool IsControlledListSetting(const std::string& pref_path) { | 158 bool IsControlledListSetting(const std::string& pref_path) { |
145 return std::find(kListSettings, | 159 return std::find(kListSettings, |
146 kListSettings + arraysize(kListSettings), | 160 kListSettings + arraysize(kListSettings), |
147 pref_path) != | 161 pref_path) != |
148 kListSettings + arraysize(kListSettings); | 162 kListSettings + arraysize(kListSettings); |
149 } | 163 } |
150 | 164 |
165 bool IsControlledSetting(const std::string& pref_path) { | |
166 return (IsControlledBooleanSetting(pref_path) || | |
167 IsControlledStringSetting(pref_path) || | |
168 IsControlledListSetting(pref_path)); | |
169 } | |
170 | |
151 void RegisterSetting(PrefService* local_state, const std::string& pref_path) { | 171 void RegisterSetting(PrefService* local_state, const std::string& pref_path) { |
152 local_state->RegisterBooleanPref((pref_path + kTrustedSuffix).c_str(), | 172 local_state->RegisterBooleanPref((pref_path + kTrustedSuffix).c_str(), |
153 false, | 173 false, |
154 PrefService::UNSYNCABLE_PREF); | 174 PrefService::UNSYNCABLE_PREF); |
155 if (IsControlledBooleanSetting(pref_path)) { | 175 if (IsControlledBooleanSetting(pref_path)) { |
156 if (pref_path == kSignedDataRoamingEnabled || | 176 if (pref_path == kSignedDataRoamingEnabled || |
157 pref_path == kStatsReportingPref) | 177 pref_path == kStatsReportingPref) |
158 local_state->RegisterBooleanPref(pref_path.c_str(), | 178 local_state->RegisterBooleanPref(pref_path.c_str(), |
159 false, | 179 false, |
160 PrefService::UNSYNCABLE_PREF); | 180 PrefService::UNSYNCABLE_PREF); |
(...skipping 10 matching lines...) Expand all Loading... | |
171 local_state->RegisterListPref(pref_path.c_str(), | 191 local_state->RegisterListPref(pref_path.c_str(), |
172 PrefService::UNSYNCABLE_PREF); | 192 PrefService::UNSYNCABLE_PREF); |
173 } | 193 } |
174 } | 194 } |
175 | 195 |
176 enum UseValue { | 196 enum UseValue { |
177 USE_VALUE_SUPPLIED, | 197 USE_VALUE_SUPPLIED, |
178 USE_VALUE_DEFAULT | 198 USE_VALUE_DEFAULT |
179 }; | 199 }; |
180 | 200 |
181 void UpdateCacheBool(const std::string& name, | 201 void UpdateCache(const std::string& name, |
182 bool value, | 202 const base::Value* value, |
183 UseValue use_value) { | 203 UseValue use_value) { |
184 PrefService* prefs = g_browser_process->local_state(); | 204 PrefService* prefs = g_browser_process->local_state(); |
185 if (use_value == USE_VALUE_DEFAULT) | 205 if (use_value == USE_VALUE_DEFAULT) |
186 prefs->ClearPref(name.c_str()); | 206 prefs->ClearPref(name.c_str()); |
187 else | 207 else |
188 prefs->SetBoolean(name.c_str(), value); | 208 prefs->Set(name.c_str(), *value); |
189 prefs->ScheduleSavePersistentPrefs(); | 209 prefs->ScheduleSavePersistentPrefs(); |
190 } | 210 } |
191 | 211 |
192 void UpdateCacheString(const std::string& name, | |
193 const std::string& value, | |
194 UseValue use_value) { | |
195 PrefService* prefs = g_browser_process->local_state(); | |
196 if (use_value == USE_VALUE_DEFAULT) | |
197 prefs->ClearPref(name.c_str()); | |
198 else | |
199 prefs->SetString(name.c_str(), value); | |
200 prefs->ScheduleSavePersistentPrefs(); | |
201 } | |
202 | |
203 // Helper function to parse the whitelist from the policy cache into the local | |
204 // state. | |
205 // TODO(pastarmovj): This function will disappear in step two of the refactoring | |
206 // as per design doc. (Contact pastarmovj@chromium.org for a link to it.) | |
207 bool GetUserWhitelist(ListValue* user_list) { | |
208 PrefService* prefs = g_browser_process->local_state(); | |
209 DCHECK(!prefs->IsManagedPreference(kAccountsPrefUsers)); | |
210 | |
211 std::vector<std::string> whitelist; | |
212 if (!SignedSettings::EnumerateWhitelist(&whitelist)) { | |
213 LOG(WARNING) << "Failed to retrieve user whitelist."; | |
214 return false; | |
215 } | |
216 | |
217 ListPrefUpdate cached_whitelist_update(prefs, kAccountsPrefUsers); | |
218 cached_whitelist_update->Clear(); | |
219 | |
220 for (size_t i = 0; i < whitelist.size(); ++i) | |
221 cached_whitelist_update->Append(Value::CreateStringValue(whitelist[i])); | |
222 | |
223 prefs->ScheduleSavePersistentPrefs(); | |
224 return true; | |
225 } | |
226 | |
227 class UserCrosSettingsTrust : public SignedSettingsHelper::Callback { | 212 class UserCrosSettingsTrust : public SignedSettingsHelper::Callback { |
228 public: | 213 public: |
229 static UserCrosSettingsTrust* GetInstance() { | 214 static UserCrosSettingsTrust* GetInstance() { |
230 return Singleton<UserCrosSettingsTrust>::get(); | 215 return Singleton<UserCrosSettingsTrust>::get(); |
231 } | 216 } |
232 | 217 |
233 // Working horse for UserCrosSettingsProvider::RequestTrusted* family. | 218 // Working horse for UserCrosSettingsProvider::RequestTrusted* family. |
234 bool RequestTrustedEntity(const std::string& name) { | 219 bool RequestTrustedEntity(const std::string& name) { |
235 OwnershipService::Status ownership_status = | 220 OwnershipService::Status ownership_status = |
236 ownership_service_->GetStatus(false); | 221 ownership_service_->GetStatus(false); |
(...skipping 21 matching lines...) Expand all Loading... | |
258 callbacks_[name].push_back(callback); | 243 callbacks_[name].push_back(callback); |
259 return false; | 244 return false; |
260 } | 245 } |
261 } | 246 } |
262 | 247 |
263 void Reload() { | 248 void Reload() { |
264 for (size_t i = 0; i < arraysize(kBooleanSettings); ++i) | 249 for (size_t i = 0; i < arraysize(kBooleanSettings); ++i) |
265 StartFetchingSetting(kBooleanSettings[i]); | 250 StartFetchingSetting(kBooleanSettings[i]); |
266 for (size_t i = 0; i < arraysize(kStringSettings); ++i) | 251 for (size_t i = 0; i < arraysize(kStringSettings); ++i) |
267 StartFetchingSetting(kStringSettings[i]); | 252 StartFetchingSetting(kStringSettings[i]); |
253 for (size_t i = 0; i < arraysize(kListSettings); ++i) | |
254 StartFetchingSetting(kListSettings[i]); | |
268 } | 255 } |
269 | 256 |
270 void Set(const std::string& path, Value* in_value) { | 257 void Set(const std::string& path, const base::Value& in_value) { |
271 PrefService* prefs = g_browser_process->local_state(); | 258 PrefService* prefs = g_browser_process->local_state(); |
272 DCHECK(!prefs->IsManagedPreference(path.c_str())); | 259 DCHECK(!prefs->IsManagedPreference(path.c_str())); |
273 | 260 |
274 if (!UserManager::Get()->current_user_is_owner()) { | 261 if (!UserManager::Get()->current_user_is_owner()) { |
275 LOG(WARNING) << "Changing settings from non-owner, setting=" << path; | 262 LOG(WARNING) << "Changing settings from non-owner, setting=" << path; |
276 | 263 |
277 // Revert UI change. | 264 // Revert UI change. |
278 CrosSettings::Get()->FireObservers(path.c_str()); | 265 CrosSettings::Get()->FireObservers(path.c_str()); |
279 return; | 266 return; |
280 } | 267 } |
268 if (IsControlledSetting(path)) { | |
269 if (IsControlledBooleanSetting(path)) { | |
270 bool bool_value = false; | |
271 if (in_value.GetAsBoolean(&bool_value)) { | |
272 OnBooleanPropertyChange(path, bool_value); | |
273 } | |
274 } | |
275 SignedSettingsHelper::Get()->StartStorePropertyOp( | |
276 path, in_value, this); | |
277 UpdateCache(path, &in_value, USE_VALUE_SUPPLIED); | |
281 | 278 |
282 if (IsControlledBooleanSetting(path)) { | 279 LOG(ERROR) << "Set cros setting " << path; |
283 bool bool_value = false; | |
284 if (in_value->GetAsBoolean(&bool_value)) { | |
285 OnBooleanPropertyChange(path, bool_value); | |
286 std::string value = bool_value ? kTrueIncantation : kFalseIncantation; | |
287 SignedSettingsHelper::Get()->StartStorePropertyOp(path, value, this); | |
288 UpdateCacheBool(path, bool_value, USE_VALUE_SUPPLIED); | |
289 | |
290 VLOG(1) << "Set cros setting " << path << "=" << value; | |
291 } | |
292 } else if (IsControlledStringSetting(path)) { | |
293 std::string value; | |
294 if (in_value->GetAsString(&value)) { | |
295 SignedSettingsHelper::Get()->StartStorePropertyOp(path, value, this); | |
296 UpdateCacheString(path, value, USE_VALUE_SUPPLIED); | |
297 | |
298 VLOG(1) << "Set cros setting " << path << "=" << value; | |
299 } else { | |
300 NOTREACHED() << "Unable to convert string value."; | |
301 } | |
302 } else if (path == kDeviceOwner) { | |
303 VLOG(1) << "Setting owner is not supported. Please use " | |
304 "'UpdateCachedOwner' instead."; | |
305 } else if (path == kAccountsPrefUsers) { | |
306 VLOG(1) << "Setting user whitelist is not implemented. Please use " | |
307 "whitelist/unwhitelist instead."; | |
308 } else { | 280 } else { |
309 LOG(WARNING) << "Try to set unhandled cros setting " << path; | 281 LOG(WARNING) << "Try to set unhandled cros setting " << path; |
310 } | 282 } |
311 } | 283 } |
312 | 284 |
313 private: | 285 private: |
314 // upper bound for number of retries to fetch a signed setting. | 286 // upper bound for number of retries to fetch a signed setting. |
315 static const int kNumRetriesLimit = 9; | 287 static const int kNumRetriesLimit = 9; |
316 | 288 |
317 UserCrosSettingsTrust() | 289 UserCrosSettingsTrust() |
(...skipping 26 matching lines...) Expand all Loading... | |
344 } | 316 } |
345 cros->SetCellularDataRoamingAllowed(new_value); | 317 cros->SetCellularDataRoamingAllowed(new_value); |
346 } else if (path == kStatsReportingPref) { | 318 } else if (path == kStatsReportingPref) { |
347 // TODO(pastarmovj): Remove this once we don't need to regenerate the | 319 // TODO(pastarmovj): Remove this once we don't need to regenerate the |
348 // consent file for the GUID anymore. | 320 // consent file for the GUID anymore. |
349 OptionsUtil::ResolveMetricsReportingEnabled(new_value); | 321 OptionsUtil::ResolveMetricsReportingEnabled(new_value); |
350 } | 322 } |
351 } | 323 } |
352 | 324 |
353 // Called right after signed value was checked. | 325 // Called right after signed value was checked. |
354 void OnBooleanPropertyRetrieve(const std::string& path, | 326 void OnPropertyRetrieve(const std::string& path, |
355 bool value, | 327 const base::Value* value, |
356 UseValue use_value) { | 328 UseValue use_value) { |
357 if (path == kSignedDataRoamingEnabled) { | 329 if (path == kSignedDataRoamingEnabled) { |
358 if (!CrosLibrary::Get()->EnsureLoaded()) | 330 if (!CrosLibrary::Get()->EnsureLoaded()) |
359 return; | 331 return; |
360 | 332 |
361 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); | 333 NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); |
362 const NetworkDevice* cellular = cros->FindCellularDevice(); | 334 const NetworkDevice* cellular = cros->FindCellularDevice(); |
363 if (cellular) { | 335 if (cellular) { |
364 bool device_value = cellular->data_roaming_allowed(); | 336 bool device_value = cellular->data_roaming_allowed(); |
365 if (!device_value && cros->IsCellularAlwaysInRoaming()) { | 337 if (!device_value && cros->IsCellularAlwaysInRoaming()) { |
366 // If operator requires roaming always enabled, ignore supplied value | 338 // If operator requires roaming always enabled, ignore supplied value |
367 // and set data roaming allowed in true always. | 339 // and set data roaming allowed in true always. |
368 cros->SetCellularDataRoamingAllowed(true); | 340 cros->SetCellularDataRoamingAllowed(true); |
369 } else { | 341 } else { |
370 bool new_value = (use_value == USE_VALUE_SUPPLIED) ? value : false; | 342 bool new_value = false; |
343 if (use_value == USE_VALUE_SUPPLIED) | |
344 value->GetAsBoolean(&new_value); | |
371 if (device_value != new_value) | 345 if (device_value != new_value) |
372 cros->SetCellularDataRoamingAllowed(new_value); | 346 cros->SetCellularDataRoamingAllowed(new_value); |
373 } | 347 } |
374 } | 348 } |
375 } else if (path == kStatsReportingPref) { | 349 } else if (path == kStatsReportingPref) { |
376 bool stats_consent = (use_value == USE_VALUE_SUPPLIED) ? value : false; | 350 bool stats_consent = false; |
351 if (use_value == USE_VALUE_SUPPLIED) | |
352 value->GetAsBoolean(&stats_consent); | |
377 // TODO(pastarmovj): Remove this once migration is not needed anymore. | 353 // TODO(pastarmovj): Remove this once migration is not needed anymore. |
378 // If the value is not set we should try to migrate legacy consent file. | 354 // If the value is not set we should try to migrate legacy consent file. |
379 if (use_value == USE_VALUE_DEFAULT) { | 355 if (use_value == USE_VALUE_DEFAULT) { |
380 // Loading consent file state causes us to do blocking IO on UI thread. | 356 // Loading consent file state causes us to do blocking IO on UI thread. |
381 // Temporarily allow it until we fix http://crbug.com/62626 | 357 // Temporarily allow it until we fix http://crbug.com/62626 |
382 base::ThreadRestrictions::ScopedAllowIO allow_io; | 358 base::ThreadRestrictions::ScopedAllowIO allow_io; |
383 stats_consent = GoogleUpdateSettings::GetCollectStatsConsent(); | 359 stats_consent = GoogleUpdateSettings::GetCollectStatsConsent(); |
384 // Make sure the values will get eventually written to the policy file. | 360 // Make sure the values will get eventually written to the policy file. |
385 migration_helper_.AddMigrationValue( | 361 migration_helper_.AddMigrationValue( |
386 path, stats_consent ? "true" : "false"); | 362 path, base::Value::CreateBooleanValue(stats_consent)); |
387 migration_helper_.MigrateValues(); | 363 migration_helper_.MigrateValues(); |
388 UpdateCacheBool(path, stats_consent, USE_VALUE_SUPPLIED); | 364 base::FundamentalValue base_value(stats_consent); |
365 UpdateCache(path, &base_value, USE_VALUE_SUPPLIED); | |
389 LOG(WARNING) << "No metrics policy set will revert to checking " | 366 LOG(WARNING) << "No metrics policy set will revert to checking " |
390 << "consent file which is " | 367 << "consent file which is " |
391 << (stats_consent ? "on." : "off."); | 368 << (stats_consent ? "on." : "off."); |
392 } | 369 } |
393 // TODO(pastarmovj): Remove this once we don't need to regenerate the | 370 // TODO(pastarmovj): Remove this once we don't need to regenerate the |
394 // consent file for the GUID anymore. | 371 // consent file for the GUID anymore. |
395 VLOG(1) << "Metrics policy is being set to : " << stats_consent | 372 VLOG(1) << "Metrics policy is being set to : " << stats_consent |
396 << "(reason : " << use_value << ")"; | 373 << "(reason : " << use_value << ")"; |
397 OptionsUtil::ResolveMetricsReportingEnabled(stats_consent); | 374 OptionsUtil::ResolveMetricsReportingEnabled(stats_consent); |
398 } | 375 } |
399 } | 376 } |
400 | 377 |
401 void StartFetchingSetting(const std::string& name) { | 378 void StartFetchingSetting(const std::string& name) { |
402 DCHECK(g_browser_process); | 379 DCHECK(g_browser_process); |
403 PrefService* prefs = g_browser_process->local_state(); | 380 PrefService* prefs = g_browser_process->local_state(); |
404 if (!prefs) | 381 if (!prefs) |
405 return; | 382 return; |
406 // Do not trust before fetching complete. | 383 // Do not trust before fetching complete. |
407 prefs->ClearPref((name + kTrustedSuffix).c_str()); | 384 prefs->ClearPref((name + kTrustedSuffix).c_str()); |
408 prefs->ScheduleSavePersistentPrefs(); | 385 prefs->ScheduleSavePersistentPrefs(); |
409 if (CrosLibrary::Get()->EnsureLoaded()) { | 386 if (CrosLibrary::Get()->EnsureLoaded()) { |
410 SignedSettingsHelper::Get()->StartRetrieveProperty(name, this); | 387 SignedSettingsHelper::Get()->StartRetrieveProperty(name, this); |
411 } | 388 } |
412 } | 389 } |
413 | 390 |
414 // Implementation of SignedSettingsHelper::Callback. | 391 // Implementation of SignedSettingsHelper::Callback. |
415 virtual void OnRetrievePropertyCompleted(SignedSettings::ReturnCode code, | 392 virtual void OnRetrievePropertyCompleted(SignedSettings::ReturnCode code, |
416 const std::string& name, | 393 const std::string& name, |
417 const std::string& value) { | 394 const base::Value* value) { |
418 if (!IsControlledBooleanSetting(name) && !IsControlledStringSetting(name)) { | 395 if (!IsControlledSetting(name)) { |
419 NOTREACHED(); | 396 NOTREACHED(); |
420 return; | 397 return; |
421 } | 398 } |
422 | 399 |
423 bool is_owned = ownership_service_->GetStatus(true) == | 400 bool is_owned = ownership_service_->GetStatus(true) == |
424 OwnershipService::OWNERSHIP_TAKEN; | 401 OwnershipService::OWNERSHIP_TAKEN; |
425 PrefService* prefs = g_browser_process->local_state(); | 402 PrefService* prefs = g_browser_process->local_state(); |
426 switch (code) { | 403 switch (code) { |
427 case SignedSettings::SUCCESS: | 404 case SignedSettings::SUCCESS: |
428 case SignedSettings::NOT_FOUND: | 405 case SignedSettings::NOT_FOUND: |
429 case SignedSettings::KEY_UNAVAILABLE: { | 406 case SignedSettings::KEY_UNAVAILABLE: { |
430 bool fallback_to_default = !is_owned | 407 bool fallback_to_default = !is_owned |
431 || (code == SignedSettings::NOT_FOUND); | 408 || (code == SignedSettings::NOT_FOUND); |
432 DCHECK(fallback_to_default || code == SignedSettings::SUCCESS); | 409 DCHECK(fallback_to_default || code == SignedSettings::SUCCESS); |
433 if (fallback_to_default) | 410 if (fallback_to_default) |
434 VLOG(1) << "Going default for cros setting " << name; | 411 VLOG(1) << "Going default for cros setting " << name; |
435 else | 412 else |
436 VLOG(1) << "Retrieved cros setting " << name << "=" << value; | 413 VLOG(1) << "Retrieved cros setting " << name; |
437 if (IsControlledBooleanSetting(name)) { | 414 UpdateCache( |
438 UpdateCacheBool(name, (value == kTrueIncantation), | 415 name, value, |
439 fallback_to_default ? USE_VALUE_DEFAULT : USE_VALUE_SUPPLIED); | 416 fallback_to_default ? USE_VALUE_DEFAULT : USE_VALUE_SUPPLIED); |
440 OnBooleanPropertyRetrieve(name, (value == kTrueIncantation), | 417 OnPropertyRetrieve( |
441 fallback_to_default ? USE_VALUE_DEFAULT : USE_VALUE_SUPPLIED); | 418 name, value, |
442 } else if (IsControlledStringSetting(name)) { | 419 fallback_to_default ? USE_VALUE_DEFAULT : USE_VALUE_SUPPLIED); |
443 UpdateCacheString(name, value, | |
444 fallback_to_default ? USE_VALUE_DEFAULT : USE_VALUE_SUPPLIED); | |
445 } | |
446 break; | 420 break; |
447 } | 421 } |
448 case SignedSettings::OPERATION_FAILED: | 422 case SignedSettings::OPERATION_FAILED: |
449 default: { | 423 default: { |
450 DCHECK(code == SignedSettings::OPERATION_FAILED); | 424 DCHECK(code == SignedSettings::OPERATION_FAILED); |
451 DCHECK(is_owned); | 425 DCHECK(is_owned); |
452 LOG(ERROR) << "On owned device: failed to retrieve cros " | 426 LOG(ERROR) << "On owned device: failed to retrieve cros " |
453 "setting, name=" << name; | 427 "setting, name=" << name; |
454 if (retries_left_ > 0) { | 428 if (retries_left_ > 0) { |
455 retries_left_ -= 1; | 429 retries_left_ -= 1; |
456 StartFetchingSetting(name); | 430 StartFetchingSetting(name); |
457 return; | 431 return; |
458 } | 432 } |
459 LOG(ERROR) << "No retries left"; | 433 LOG(ERROR) << "No retries left"; |
460 if (IsControlledBooleanSetting(name)) { | 434 if (IsControlledBooleanSetting(name)) { |
461 // For boolean settings we can just set safe (false) values | 435 // For boolean settings we can just set safe (false) values |
462 // and continue as trusted. | 436 // and continue as trusted. |
463 OnBooleanPropertyRetrieve(name, false, USE_VALUE_SUPPLIED); | 437 scoped_ptr<base::Value> false_value( |
464 UpdateCacheBool(name, false, USE_VALUE_SUPPLIED); | 438 base::Value::CreateBooleanValue(false)); |
439 OnPropertyRetrieve(name, false_value.get(), USE_VALUE_SUPPLIED); | |
440 UpdateCache(name, false_value.get(), USE_VALUE_SUPPLIED); | |
465 } else { | 441 } else { |
466 prefs->ClearPref((name + kTrustedSuffix).c_str()); | 442 prefs->ClearPref((name + kTrustedSuffix).c_str()); |
467 return; | 443 return; |
468 } | 444 } |
469 break; | 445 break; |
470 } | 446 } |
471 } | 447 } |
472 prefs->SetBoolean((name + kTrustedSuffix).c_str(), true); | 448 prefs->SetBoolean((name + kTrustedSuffix).c_str(), true); |
473 { | 449 { |
474 std::vector<base::Closure>& callbacks_vector = callbacks_[name]; | 450 std::vector<base::Closure>& callbacks_vector = callbacks_[name]; |
475 for (size_t i = 0; i < callbacks_vector.size(); ++i) | 451 for (size_t i = 0; i < callbacks_vector.size(); ++i) |
476 MessageLoop::current()->PostTask(FROM_HERE, callbacks_vector[i]); | 452 MessageLoop::current()->PostTask(FROM_HERE, callbacks_vector[i]); |
477 callbacks_vector.clear(); | 453 callbacks_vector.clear(); |
478 } | 454 } |
479 if (code == SignedSettings::SUCCESS) | 455 if (code == SignedSettings::SUCCESS) |
480 CrosSettings::Get()->FireObservers(name.c_str()); | 456 CrosSettings::Get()->FireObservers(name.c_str()); |
481 } | 457 } |
482 | 458 |
483 // Implementation of SignedSettingsHelper::Callback. | 459 // Implementation of SignedSettingsHelper::Callback. |
484 virtual void OnStorePropertyCompleted(SignedSettings::ReturnCode code, | 460 virtual void OnStorePropertyCompleted(SignedSettings::ReturnCode code, |
485 const std::string& name, | 461 const std::string& name, |
486 const std::string& value) { | 462 const base::Value& value) { |
487 VLOG(1) << "Store cros setting " << name << "=" << value << ", code=" | 463 VLOG(1) << "Store cros setting " << name << ", code=" << code; |
488 << code; | |
489 | 464 |
490 // Reload the setting if store op fails. | 465 // Reload the setting if store op fails. |
491 if (code != SignedSettings::SUCCESS) | 466 if (code != SignedSettings::SUCCESS) |
492 SignedSettingsHelper::Get()->StartRetrieveProperty(name, this); | 467 SignedSettingsHelper::Get()->StartRetrieveProperty(name, this); |
493 } | 468 } |
494 | 469 |
495 // Implementation of SignedSettingsHelper::Callback. | 470 // Implementation of SignedSettingsHelper::Callback. |
496 virtual void OnWhitelistCompleted(SignedSettings::ReturnCode code, | 471 virtual void OnWhitelistCompleted(SignedSettings::ReturnCode code, |
497 const std::string& email) { | 472 const std::string& email) { |
498 VLOG(1) << "Add " << email << " to whitelist, code=" << code; | 473 VLOG(1) << "Add " << email << " to whitelist, code=" << code; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
547 RegisterSetting(local_state, kStringSettings[i]); | 522 RegisterSetting(local_state, kStringSettings[i]); |
548 for (size_t i = 0; i < arraysize(kListSettings); ++i) | 523 for (size_t i = 0; i < arraysize(kListSettings); ++i) |
549 RegisterSetting(local_state, kListSettings[i]); | 524 RegisterSetting(local_state, kListSettings[i]); |
550 } | 525 } |
551 | 526 |
552 void UserCrosSettingsProvider::Reload() { | 527 void UserCrosSettingsProvider::Reload() { |
553 UserCrosSettingsTrust::GetInstance()->Reload(); | 528 UserCrosSettingsTrust::GetInstance()->Reload(); |
554 } | 529 } |
555 | 530 |
556 void UserCrosSettingsProvider::DoSet(const std::string& path, | 531 void UserCrosSettingsProvider::DoSet(const std::string& path, |
557 Value* in_value) { | 532 const base::Value& in_value) { |
558 UserCrosSettingsTrust::GetInstance()->Set(path, in_value); | 533 UserCrosSettingsTrust::GetInstance()->Set(path, in_value); |
559 } | 534 } |
560 | 535 |
561 const base::Value* UserCrosSettingsProvider::Get( | 536 const base::Value* UserCrosSettingsProvider::Get( |
562 const std::string& path) const { | 537 const std::string& path) const { |
563 if (HandlesSetting(path)) { | 538 if (HandlesSetting(path)) { |
564 PrefService* prefs = g_browser_process->local_state(); | 539 const PrefService* prefs = g_browser_process->local_state(); |
565 // TODO(pastarmovj): Temporary hack until we refactor the user whitelisting | |
566 // handling to completely coincide with the rest of the settings. | |
567 if (path == kAccountsPrefUsers && | |
568 prefs->GetList(kAccountsPrefUsers) == NULL) { | |
569 GetUserWhitelist(NULL); | |
570 } | |
571 const PrefService::Preference* pref = prefs->FindPreference(path.c_str()); | 540 const PrefService::Preference* pref = prefs->FindPreference(path.c_str()); |
572 return pref->GetValue(); | 541 return pref->GetValue(); |
573 } | 542 } |
574 return NULL; | 543 return NULL; |
575 } | 544 } |
576 | 545 |
577 bool UserCrosSettingsProvider::GetTrusted(const std::string& path, | 546 bool UserCrosSettingsProvider::GetTrusted(const std::string& path, |
578 const base::Closure& callback) const { | 547 const base::Closure& callback) const { |
579 return UserCrosSettingsTrust::GetInstance()->RequestTrustedEntity( | 548 return UserCrosSettingsTrust::GetInstance()->RequestTrustedEntity( |
580 path, callback); | 549 path, callback); |
(...skipping 24 matching lines...) Expand all Loading... | |
605 | 574 |
606 PrefService* prefs = g_browser_process->local_state(); | 575 PrefService* prefs = g_browser_process->local_state(); |
607 ListPrefUpdate cached_whitelist_update(prefs, kAccountsPrefUsers); | 576 ListPrefUpdate cached_whitelist_update(prefs, kAccountsPrefUsers); |
608 StringValue email_value(email); | 577 StringValue email_value(email); |
609 if (cached_whitelist_update->Remove(email_value, NULL)) | 578 if (cached_whitelist_update->Remove(email_value, NULL)) |
610 prefs->ScheduleSavePersistentPrefs(); | 579 prefs->ScheduleSavePersistentPrefs(); |
611 } | 580 } |
612 | 581 |
613 // static | 582 // static |
614 void UserCrosSettingsProvider::UpdateCachedOwner(const std::string& email) { | 583 void UserCrosSettingsProvider::UpdateCachedOwner(const std::string& email) { |
615 UpdateCacheString(kDeviceOwner, email, USE_VALUE_SUPPLIED); | 584 base::StringValue email_value(email); |
585 UpdateCache(kDeviceOwner, &email_value, USE_VALUE_SUPPLIED); | |
616 } | 586 } |
617 | 587 |
618 } // namespace chromeos | 588 } // namespace chromeos |
OLD | NEW |