| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/device_settings_provider.h" | 5 #include "chrome/browser/chromeos/device_settings_provider.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/string_util.h" | 12 #include "base/string_util.h" |
| 13 #include "base/threading/thread_restrictions.h" | 13 #include "base/threading/thread_restrictions.h" |
| 14 #include "base/values.h" | 14 #include "base/values.h" |
| 15 #include "chrome/browser/browser_process.h" | 15 #include "chrome/browser/browser_process.h" |
| 16 #include "chrome/browser/chromeos/cros/cros_library.h" | 16 #include "chrome/browser/chromeos/cros/cros_library.h" |
| 17 #include "chrome/browser/chromeos/cros/network_library.h" | 17 #include "chrome/browser/chromeos/cros/network_library.h" |
| 18 #include "chrome/browser/chromeos/cros_settings.h" | 18 #include "chrome/browser/chromeos/cros_settings.h" |
| 19 #include "chrome/browser/chromeos/cros_settings_names.h" | 19 #include "chrome/browser/chromeos/cros_settings_names.h" |
| 20 #include "chrome/browser/chromeos/login/ownership_service.h" | 20 #include "chrome/browser/chromeos/login/ownership_service.h" |
| 21 #include "chrome/browser/chromeos/login/signed_settings_cache.h" | 21 #include "chrome/browser/chromeos/login/signed_settings_cache.h" |
| 22 #include "chrome/browser/chromeos/login/signed_settings_helper.h" | 22 #include "chrome/browser/chromeos/login/signed_settings_helper.h" |
| 23 #include "chrome/browser/chromeos/login/user_manager.h" | 23 #include "chrome/browser/chromeos/login/user_manager.h" |
| 24 #include "chrome/browser/policy/app_pack_updater.h" | 24 #include "chrome/browser/policy/app_pack_updater.h" |
| 25 #include "chrome/browser/policy/browser_policy_connector.h" |
| 26 #include "chrome/browser/policy/cloud_policy_constants.h" |
| 25 #include "chrome/browser/ui/options/options_util.h" | 27 #include "chrome/browser/ui/options/options_util.h" |
| 26 #include "chrome/common/chrome_notification_types.h" | 28 #include "chrome/common/chrome_notification_types.h" |
| 27 #include "chrome/installer/util/google_update_settings.h" | 29 #include "chrome/installer/util/google_update_settings.h" |
| 28 #include "content/public/browser/notification_service.h" | 30 #include "content/public/browser/notification_service.h" |
| 29 | 31 |
| 30 using google::protobuf::RepeatedPtrField; | 32 using google::protobuf::RepeatedPtrField; |
| 31 | 33 |
| 32 namespace em = enterprise_management; | 34 namespace em = enterprise_management; |
| 33 | 35 |
| 34 namespace chromeos { | 36 namespace chromeos { |
| 35 | 37 |
| 36 namespace { | 38 namespace { |
| 37 | 39 |
| 38 // List of settings handled by the DeviceSettingsProvider. | 40 // List of settings handled by the DeviceSettingsProvider. |
| 39 const char* kKnownSettings[] = { | 41 const char* kKnownSettings[] = { |
| 40 kAccountsPrefAllowGuest, | 42 kAccountsPrefAllowGuest, |
| 41 kAccountsPrefAllowNewUser, | 43 kAccountsPrefAllowNewUser, |
| 42 kAccountsPrefEphemeralUsersEnabled, | 44 kAccountsPrefEphemeralUsersEnabled, |
| 43 kAccountsPrefShowUserNamesOnSignIn, | 45 kAccountsPrefShowUserNamesOnSignIn, |
| 44 kAccountsPrefUsers, | 46 kAccountsPrefUsers, |
| 45 kAppPack, | 47 kAppPack, |
| 46 kDeviceOwner, | 48 kDeviceOwner, |
| 47 kIdleLogoutTimeout, | 49 kIdleLogoutTimeout, |
| 48 kIdleLogoutWarningDuration, | 50 kIdleLogoutWarningDuration, |
| 51 kPolicyMissingMitigationMode, |
| 49 kReleaseChannel, | 52 kReleaseChannel, |
| 50 kReleaseChannelDelegated, | 53 kReleaseChannelDelegated, |
| 51 kReportDeviceActivityTimes, | 54 kReportDeviceActivityTimes, |
| 52 kReportDeviceBootMode, | 55 kReportDeviceBootMode, |
| 53 kReportDeviceVersionInfo, | 56 kReportDeviceVersionInfo, |
| 54 kScreenSaverExtensionId, | 57 kScreenSaverExtensionId, |
| 55 kScreenSaverTimeout, | 58 kScreenSaverTimeout, |
| 56 kSettingProxyEverywhere, | 59 kSettingProxyEverywhere, |
| 57 kSignedDataRoamingEnabled, | 60 kSignedDataRoamingEnabled, |
| 58 kStartUpUrls, | 61 kStartUpUrls, |
| (...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 if (pol.has_metrics_enabled()) | 600 if (pol.has_metrics_enabled()) |
| 598 ApplyMetricsSetting(false, pol.metrics_enabled().metrics_enabled()); | 601 ApplyMetricsSetting(false, pol.metrics_enabled().metrics_enabled()); |
| 599 else | 602 else |
| 600 ApplyMetricsSetting(true, false); | 603 ApplyMetricsSetting(true, false); |
| 601 // Next set the roaming setting as needed. | 604 // Next set the roaming setting as needed. |
| 602 ApplyRoamingSetting(pol.has_data_roaming_enabled() ? | 605 ApplyRoamingSetting(pol.has_data_roaming_enabled() ? |
| 603 pol.data_roaming_enabled().data_roaming_enabled() : false); | 606 pol.data_roaming_enabled().data_roaming_enabled() : false); |
| 604 } | 607 } |
| 605 | 608 |
| 606 bool DeviceSettingsProvider::MitigateMissingPolicy() { | 609 bool DeviceSettingsProvider::MitigateMissingPolicy() { |
| 607 // As this code runs only in exceptional cases it's fine to allow I/O here. | 610 // First check if the device has been owned already and if not exit |
| 608 base::ThreadRestrictions::ScopedAllowIO allow_io; | 611 // immediately. |
| 609 FilePath legacy_policy_file(kLegacyPolicyFile); | 612 if (g_browser_process->browser_policy_connector()->GetDeviceMode() != |
| 610 // Check if legacy file exists but is not writable to avoid possible | 613 policy::DEVICE_MODE_CONSUMER) { |
| 611 // attack of creating this file through chronos (although this should be | 614 return false; |
| 612 // not possible in root owned location), but better be safe than sorry. | |
| 613 // TODO(pastarmovj): Remove this workaround once we have proper checking | |
| 614 // for policy corruption or when Cr48 is phased out the very latest. | |
| 615 // See: http://crosbug.com/24916. | |
| 616 if (file_util::PathExists(legacy_policy_file) && | |
| 617 !file_util::PathIsWritable(legacy_policy_file)) { | |
| 618 // We are in pre 11 dev upgrading to post 17 version mode. | |
| 619 LOG(ERROR) << "Detected system upgraded from ChromeOS 11 or older with " | |
| 620 << "missing policies. Switching to migration policy mode " | |
| 621 << "until the owner logs in to regenerate the policy data."; | |
| 622 // In this situation we should pretend we have policy even though we | |
| 623 // don't until the owner logs in and restores the policy blob. | |
| 624 values_cache_.SetBoolean(kAccountsPrefAllowNewUser, true); | |
| 625 values_cache_.SetBoolean(kAccountsPrefAllowGuest, true); | |
| 626 trusted_ = true; | |
| 627 // Make sure we will recreate the policy once the owner logs in. | |
| 628 // Any value not in this list will be left to the default which is fine as | |
| 629 // we repopulate the whitelist with the owner and any other possible every | |
| 630 // time the user enables whitelist filtering on the UI. | |
| 631 migration_helper_->AddMigrationValue( | |
| 632 kAccountsPrefAllowNewUser, base::Value::CreateBooleanValue(true)); | |
| 633 migration_helper_->MigrateValues(); | |
| 634 // The last step is to pretend we loaded policy correctly and call everyone. | |
| 635 for (size_t i = 0; i < callbacks_.size(); ++i) | |
| 636 callbacks_[i].Run(); | |
| 637 callbacks_.clear(); | |
| 638 return true; | |
| 639 } | 615 } |
| 640 return false; | 616 |
| 617 // If we are here the policy file were corrupted or missing. This can happen |
| 618 // because we are migrating Pre R11 device to the new secure policies or there |
| 619 // was an attempt to circumvent policy system. In this case we should populate |
| 620 // the policy cache with "safe-mode" defaults which should allow the owner to |
| 621 // log in but lock the device for anyone else until the policy blob has been |
| 622 // recreated by the session manager. |
| 623 LOG(ERROR) << "Corruption of the policy data has been detected." |
| 624 << "Switching to \"safe-mode\" policies until the owner logs in " |
| 625 << "to regenerate the policy data."; |
| 626 values_cache_.SetBoolean(kAccountsPrefAllowNewUser, true); |
| 627 values_cache_.SetBoolean(kAccountsPrefAllowGuest, true); |
| 628 values_cache_.SetBoolean(kPolicyMissingMitigationMode, true); |
| 629 trusted_ = true; |
| 630 // Make sure we will recreate the policy once the owner logs in. |
| 631 // Any value not in this list will be left to the default which is fine as |
| 632 // we repopulate the whitelist with the owner and all other existing users |
| 633 // every time the owner enables whitelist filtering on the UI. |
| 634 migration_helper_->AddMigrationValue( |
| 635 kAccountsPrefAllowNewUser, base::Value::CreateBooleanValue(true)); |
| 636 migration_helper_->MigrateValues(); |
| 637 // The last step is to pretend we loaded policy correctly and call everyone. |
| 638 for (size_t i = 0; i < callbacks_.size(); ++i) |
| 639 callbacks_[i].Run(); |
| 640 callbacks_.clear(); |
| 641 return true; |
| 641 } | 642 } |
| 642 | 643 |
| 643 const base::Value* DeviceSettingsProvider::Get(const std::string& path) const { | 644 const base::Value* DeviceSettingsProvider::Get(const std::string& path) const { |
| 644 if (IsControlledSetting(path)) { | 645 if (IsControlledSetting(path)) { |
| 645 const base::Value* value; | 646 const base::Value* value; |
| 646 if (values_cache_.GetValue(path, &value)) | 647 if (values_cache_.GetValue(path, &value)) |
| 647 return value; | 648 return value; |
| 648 } else { | 649 } else { |
| 649 NOTREACHED() << "Trying to get non cros setting."; | 650 NOTREACHED() << "Trying to get non cros setting."; |
| 650 } | 651 } |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 trusted_ = true; | 702 trusted_ = true; |
| 702 for (size_t i = 0; i < callbacks_.size(); ++i) | 703 for (size_t i = 0; i < callbacks_.size(); ++i) |
| 703 callbacks_[i].Run(); | 704 callbacks_[i].Run(); |
| 704 callbacks_.clear(); | 705 callbacks_.clear(); |
| 705 // TODO(pastarmovj): Make those side effects responsibility of the | 706 // TODO(pastarmovj): Make those side effects responsibility of the |
| 706 // respective subsystems. | 707 // respective subsystems. |
| 707 ApplySideEffects(); | 708 ApplySideEffects(); |
| 708 break; | 709 break; |
| 709 } | 710 } |
| 710 case SignedSettings::NOT_FOUND: | 711 case SignedSettings::NOT_FOUND: |
| 711 // Verify if we don't have to mitigate pre Chrome 12 machine here and if | |
| 712 // needed do the magic. | |
| 713 if (MitigateMissingPolicy()) | 712 if (MitigateMissingPolicy()) |
| 714 break; | 713 break; |
| 715 case SignedSettings::KEY_UNAVAILABLE: { | 714 case SignedSettings::KEY_UNAVAILABLE: { |
| 716 if (ownership_status_ != OwnershipService::OWNERSHIP_TAKEN) | 715 if (ownership_status_ != OwnershipService::OWNERSHIP_TAKEN) |
| 717 NOTREACHED() << "No policies present yet, will use the temp storage."; | 716 NOTREACHED() << "No policies present yet, will use the temp storage."; |
| 718 break; | 717 break; |
| 719 } | 718 } |
| 720 case SignedSettings::BAD_SIGNATURE: | 719 case SignedSettings::BAD_SIGNATURE: |
| 721 case SignedSettings::OPERATION_FAILED: { | 720 case SignedSettings::OPERATION_FAILED: { |
| 722 LOG(ERROR) << "Failed to retrieve cros policies. Reason:" << code; | 721 LOG(ERROR) << "Failed to retrieve cros policies. Reason:" << code; |
| 723 if (retries_left_ > 0) { | 722 if (retries_left_ > 0) { |
| 724 retries_left_ -= 1; | 723 retries_left_ -= 1; |
| 725 Reload(); | 724 Reload(); |
| 726 return; | 725 return; |
| 727 } | 726 } |
| 728 LOG(ERROR) << "No retries left"; | 727 LOG(ERROR) << "No retries left"; |
| 729 break; | 728 break; |
| 730 } | 729 } |
| 731 } | 730 } |
| 732 } | 731 } |
| 733 | 732 |
| 734 } // namespace chromeos | 733 } // namespace chromeos |
| OLD | NEW |