| 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 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 if (pol.has_metrics_enabled()) | 598 if (pol.has_metrics_enabled()) |
| 596 ApplyMetricsSetting(false, pol.metrics_enabled().metrics_enabled()); | 599 ApplyMetricsSetting(false, pol.metrics_enabled().metrics_enabled()); |
| 597 else | 600 else |
| 598 ApplyMetricsSetting(true, false); | 601 ApplyMetricsSetting(true, false); |
| 599 // Next set the roaming setting as needed. | 602 // Next set the roaming setting as needed. |
| 600 ApplyRoamingSetting(pol.has_data_roaming_enabled() ? | 603 ApplyRoamingSetting(pol.has_data_roaming_enabled() ? |
| 601 pol.data_roaming_enabled().data_roaming_enabled() : false); | 604 pol.data_roaming_enabled().data_roaming_enabled() : false); |
| 602 } | 605 } |
| 603 | 606 |
| 604 bool DeviceSettingsProvider::MitigateMissingPolicy() { | 607 bool DeviceSettingsProvider::MitigateMissingPolicy() { |
| 605 // As this code runs only in exceptional cases it's fine to allow I/O here. | 608 // First check if the device has been owned already and if not exit |
| 606 base::ThreadRestrictions::ScopedAllowIO allow_io; | 609 // immediately. |
| 607 FilePath legacy_policy_file(kLegacyPolicyFile); | 610 if (g_browser_process->browser_policy_connector()->GetDeviceMode() != |
| 608 // Check if legacy file exists but is not writable to avoid possible | 611 policy::DEVICE_MODE_CONSUMER) { |
| 609 // attack of creating this file through chronos (although this should be | 612 return false; |
| 610 // not possible in root owned location), but better be safe than sorry. | |
| 611 // TODO(pastarmovj): Remove this workaround once we have proper checking | |
| 612 // for policy corruption or when Cr48 is phased out the very latest. | |
| 613 // See: http://crosbug.com/24916. | |
| 614 if (file_util::PathExists(legacy_policy_file) && | |
| 615 !file_util::PathIsWritable(legacy_policy_file)) { | |
| 616 // We are in pre 11 dev upgrading to post 17 version mode. | |
| 617 LOG(ERROR) << "Detected system upgraded from ChromeOS 11 or older with " | |
| 618 << "missing policies. Switching to migration policy mode " | |
| 619 << "until the owner logs in to regenerate the policy data."; | |
| 620 // In this situation we should pretend we have policy even though we | |
| 621 // don't until the owner logs in and restores the policy blob. | |
| 622 values_cache_.SetBoolean(kAccountsPrefAllowNewUser, true); | |
| 623 values_cache_.SetBoolean(kAccountsPrefAllowGuest, true); | |
| 624 trusted_ = true; | |
| 625 // Make sure we will recreate the policy once the owner logs in. | |
| 626 // Any value not in this list will be left to the default which is fine as | |
| 627 // we repopulate the whitelist with the owner and any other possible every | |
| 628 // time the user enables whitelist filtering on the UI. | |
| 629 migration_helper_->AddMigrationValue( | |
| 630 kAccountsPrefAllowNewUser, base::Value::CreateBooleanValue(true)); | |
| 631 migration_helper_->MigrateValues(); | |
| 632 // The last step is to pretend we loaded policy correctly and call everyone. | |
| 633 for (size_t i = 0; i < callbacks_.size(); ++i) | |
| 634 callbacks_[i].Run(); | |
| 635 callbacks_.clear(); | |
| 636 return true; | |
| 637 } | 613 } |
| 638 return false; | 614 |
| 615 // If we are here the policy file were corrupted or missing. This can happen |
| 616 // because we are migrating Pre R11 device to the new secure policies or there |
| 617 // was an attempt to circumvent policy system. In this case we should populate |
| 618 // the policy cache with "safe-mode" defaults which should allow the owner to |
| 619 // log in but lock the device for anyone else until the policy blob has been |
| 620 // recreated by the session manager. |
| 621 LOG(ERROR) << "Corruption of the policy data has been detected." |
| 622 << "Switching to \"safe-mode\" policies until the owner logs in " |
| 623 << "to regenerate the policy data."; |
| 624 values_cache_.SetBoolean(kAccountsPrefAllowNewUser, true); |
| 625 values_cache_.SetBoolean(kAccountsPrefAllowGuest, true); |
| 626 values_cache_.SetBoolean(kPolicyMissingMitigationMode, true); |
| 627 trusted_ = true; |
| 628 // Make sure we will recreate the policy once the owner logs in. |
| 629 // Any value not in this list will be left to the default which is fine as |
| 630 // we repopulate the whitelist with the owner and all other existing users |
| 631 // every time the owner enables whitelist filtering on the UI. |
| 632 migration_helper_->AddMigrationValue( |
| 633 kAccountsPrefAllowNewUser, base::Value::CreateBooleanValue(true)); |
| 634 migration_helper_->MigrateValues(); |
| 635 // The last step is to pretend we loaded policy correctly and call everyone. |
| 636 for (size_t i = 0; i < callbacks_.size(); ++i) |
| 637 callbacks_[i].Run(); |
| 638 callbacks_.clear(); |
| 639 return true; |
| 639 } | 640 } |
| 640 | 641 |
| 641 const base::Value* DeviceSettingsProvider::Get(const std::string& path) const { | 642 const base::Value* DeviceSettingsProvider::Get(const std::string& path) const { |
| 642 if (IsControlledSetting(path)) { | 643 if (IsControlledSetting(path)) { |
| 643 const base::Value* value; | 644 const base::Value* value; |
| 644 if (values_cache_.GetValue(path, &value)) | 645 if (values_cache_.GetValue(path, &value)) |
| 645 return value; | 646 return value; |
| 646 } else { | 647 } else { |
| 647 NOTREACHED() << "Trying to get non cros setting."; | 648 NOTREACHED() << "Trying to get non cros setting."; |
| 648 } | 649 } |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 trusted_ = true; | 700 trusted_ = true; |
| 700 for (size_t i = 0; i < callbacks_.size(); ++i) | 701 for (size_t i = 0; i < callbacks_.size(); ++i) |
| 701 callbacks_[i].Run(); | 702 callbacks_[i].Run(); |
| 702 callbacks_.clear(); | 703 callbacks_.clear(); |
| 703 // TODO(pastarmovj): Make those side effects responsibility of the | 704 // TODO(pastarmovj): Make those side effects responsibility of the |
| 704 // respective subsystems. | 705 // respective subsystems. |
| 705 ApplySideEffects(); | 706 ApplySideEffects(); |
| 706 break; | 707 break; |
| 707 } | 708 } |
| 708 case SignedSettings::NOT_FOUND: | 709 case SignedSettings::NOT_FOUND: |
| 709 // Verify if we don't have to mitigate pre Chrome 12 machine here and if | |
| 710 // needed do the magic. | |
| 711 if (MitigateMissingPolicy()) | 710 if (MitigateMissingPolicy()) |
| 712 break; | 711 break; |
| 713 case SignedSettings::KEY_UNAVAILABLE: { | 712 case SignedSettings::KEY_UNAVAILABLE: { |
| 714 if (ownership_status_ != OwnershipService::OWNERSHIP_TAKEN) | 713 if (ownership_status_ != OwnershipService::OWNERSHIP_TAKEN) |
| 715 NOTREACHED() << "No policies present yet, will use the temp storage."; | 714 NOTREACHED() << "No policies present yet, will use the temp storage."; |
| 716 break; | 715 break; |
| 717 } | 716 } |
| 718 case SignedSettings::BAD_SIGNATURE: | 717 case SignedSettings::BAD_SIGNATURE: |
| 719 case SignedSettings::OPERATION_FAILED: { | 718 case SignedSettings::OPERATION_FAILED: { |
| 720 LOG(ERROR) << "Failed to retrieve cros policies. Reason:" << code; | 719 LOG(ERROR) << "Failed to retrieve cros policies. Reason:" << code; |
| 721 if (retries_left_ > 0) { | 720 if (retries_left_ > 0) { |
| 722 retries_left_ -= 1; | 721 retries_left_ -= 1; |
| 723 Reload(); | 722 Reload(); |
| 724 return; | 723 return; |
| 725 } | 724 } |
| 726 LOG(ERROR) << "No retries left"; | 725 LOG(ERROR) << "No retries left"; |
| 727 break; | 726 break; |
| 728 } | 727 } |
| 729 } | 728 } |
| 730 } | 729 } |
| 731 | 730 |
| 732 } // namespace chromeos | 731 } // namespace chromeos |
| OLD | NEW |