| Index: chrome/browser/chromeos/device_settings_provider.cc
|
| diff --git a/chrome/browser/chromeos/device_settings_provider.cc b/chrome/browser/chromeos/device_settings_provider.cc
|
| index 41fbb4a60e7a952f02e1845c896c645412b8ea62..59f6e1a6bb284fac85144b45354616b82e3a45f8 100644
|
| --- a/chrome/browser/chromeos/device_settings_provider.cc
|
| +++ b/chrome/browser/chromeos/device_settings_provider.cc
|
| @@ -22,6 +22,8 @@
|
| #include "chrome/browser/chromeos/login/signed_settings_helper.h"
|
| #include "chrome/browser/chromeos/login/user_manager.h"
|
| #include "chrome/browser/policy/app_pack_updater.h"
|
| +#include "chrome/browser/policy/browser_policy_connector.h"
|
| +#include "chrome/browser/policy/cloud_policy_constants.h"
|
| #include "chrome/browser/ui/options/options_util.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| #include "chrome/installer/util/google_update_settings.h"
|
| @@ -46,6 +48,7 @@ const char* kKnownSettings[] = {
|
| kDeviceOwner,
|
| kIdleLogoutTimeout,
|
| kIdleLogoutWarningDuration,
|
| + kPolicyMissingMitigationMode,
|
| kReleaseChannel,
|
| kReleaseChannelDelegated,
|
| kReportDeviceActivityTimes,
|
| @@ -604,40 +607,38 @@ void DeviceSettingsProvider::ApplySideEffects() const {
|
| }
|
|
|
| bool DeviceSettingsProvider::MitigateMissingPolicy() {
|
| - // As this code runs only in exceptional cases it's fine to allow I/O here.
|
| - base::ThreadRestrictions::ScopedAllowIO allow_io;
|
| - FilePath legacy_policy_file(kLegacyPolicyFile);
|
| - // Check if legacy file exists but is not writable to avoid possible
|
| - // attack of creating this file through chronos (although this should be
|
| - // not possible in root owned location), but better be safe than sorry.
|
| - // TODO(pastarmovj): Remove this workaround once we have proper checking
|
| - // for policy corruption or when Cr48 is phased out the very latest.
|
| - // See: http://crosbug.com/24916.
|
| - if (file_util::PathExists(legacy_policy_file) &&
|
| - !file_util::PathIsWritable(legacy_policy_file)) {
|
| - // We are in pre 11 dev upgrading to post 17 version mode.
|
| - LOG(ERROR) << "Detected system upgraded from ChromeOS 11 or older with "
|
| - << "missing policies. Switching to migration policy mode "
|
| - << "until the owner logs in to regenerate the policy data.";
|
| - // In this situation we should pretend we have policy even though we
|
| - // don't until the owner logs in and restores the policy blob.
|
| - values_cache_.SetBoolean(kAccountsPrefAllowNewUser, true);
|
| - values_cache_.SetBoolean(kAccountsPrefAllowGuest, true);
|
| - trusted_ = true;
|
| - // Make sure we will recreate the policy once the owner logs in.
|
| - // Any value not in this list will be left to the default which is fine as
|
| - // we repopulate the whitelist with the owner and any other possible every
|
| - // time the user enables whitelist filtering on the UI.
|
| - migration_helper_->AddMigrationValue(
|
| - kAccountsPrefAllowNewUser, base::Value::CreateBooleanValue(true));
|
| - migration_helper_->MigrateValues();
|
| - // The last step is to pretend we loaded policy correctly and call everyone.
|
| - for (size_t i = 0; i < callbacks_.size(); ++i)
|
| - callbacks_[i].Run();
|
| - callbacks_.clear();
|
| - return true;
|
| + // First check if the device has been owned already and if not exit
|
| + // immediately.
|
| + if (g_browser_process->browser_policy_connector()->GetDeviceMode() !=
|
| + policy::DEVICE_MODE_CONSUMER) {
|
| + return false;
|
| }
|
| - return false;
|
| +
|
| + // If we are here the policy file were corrupted or missing. This can happen
|
| + // because we are migrating Pre R11 device to the new secure policies or there
|
| + // was an attempt to circumvent policy system. In this case we should populate
|
| + // the policy cache with "safe-mode" defaults which should allow the owner to
|
| + // log in but lock the device for anyone else until the policy blob has been
|
| + // recreated by the session manager.
|
| + LOG(ERROR) << "Corruption of the policy data has been detected."
|
| + << "Switching to \"safe-mode\" policies until the owner logs in "
|
| + << "to regenerate the policy data.";
|
| + values_cache_.SetBoolean(kAccountsPrefAllowNewUser, true);
|
| + values_cache_.SetBoolean(kAccountsPrefAllowGuest, true);
|
| + values_cache_.SetBoolean(kPolicyMissingMitigationMode, true);
|
| + trusted_ = true;
|
| + // Make sure we will recreate the policy once the owner logs in.
|
| + // Any value not in this list will be left to the default which is fine as
|
| + // we repopulate the whitelist with the owner and all other existing users
|
| + // every time the owner enables whitelist filtering on the UI.
|
| + migration_helper_->AddMigrationValue(
|
| + kAccountsPrefAllowNewUser, base::Value::CreateBooleanValue(true));
|
| + migration_helper_->MigrateValues();
|
| + // The last step is to pretend we loaded policy correctly and call everyone.
|
| + for (size_t i = 0; i < callbacks_.size(); ++i)
|
| + callbacks_[i].Run();
|
| + callbacks_.clear();
|
| + return true;
|
| }
|
|
|
| const base::Value* DeviceSettingsProvider::Get(const std::string& path) const {
|
| @@ -708,8 +709,6 @@ void DeviceSettingsProvider::OnRetrievePolicyCompleted(
|
| break;
|
| }
|
| case SignedSettings::NOT_FOUND:
|
| - // Verify if we don't have to mitigate pre Chrome 12 machine here and if
|
| - // needed do the magic.
|
| if (MitigateMissingPolicy())
|
| break;
|
| case SignedSettings::KEY_UNAVAILABLE: {
|
|
|