| Index: chrome/browser/chromeos/settings/device_settings_provider.cc
|
| diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc
|
| index 1e94ace7c71041dd6c314b30104faa819866c321..3b2b3f318b02f1d92a6a22e9d0e40e4f6ee2dc85 100644
|
| --- a/chrome/browser/chromeos/settings/device_settings_provider.cc
|
| +++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
|
| @@ -88,119 +88,462 @@ bool HasOldMetricsFile() {
|
| return GoogleUpdateSettings::GetCollectStatsConsent();
|
| }
|
|
|
| -} // namespace
|
| -
|
| -DeviceSettingsProvider::DeviceSettingsProvider(
|
| - const NotifyObserversCallback& notify_cb,
|
| - DeviceSettingsService* device_settings_service)
|
| - : CrosSettingsProvider(notify_cb),
|
| - device_settings_service_(device_settings_service),
|
| - trusted_status_(TEMPORARILY_UNTRUSTED),
|
| - ownership_status_(device_settings_service_->GetOwnershipStatus()),
|
| - store_callback_factory_(this) {
|
| - device_settings_service_->AddObserver(this);
|
| - if (!UpdateFromService()) {
|
| - // Make sure we have at least the cache data immediately.
|
| - RetrieveCachedData();
|
| +void DecodeLoginPolicies(
|
| + const em::ChromeDeviceSettingsProto& policy,
|
| + PrefValueMap* new_values_cache) {
|
| + // For all our boolean settings the following is applicable:
|
| + // true is default permissive value and false is safe prohibitive value.
|
| + // Exceptions:
|
| + // kAccountsPrefEphemeralUsersEnabled has a default value of false.
|
| + // kAccountsPrefSupervisedUsersEnabled has a default value of false
|
| + // for enterprise devices and true for consumer devices.
|
| + // kAccountsPrefTransferSAMLCookies has a default value of false.
|
| + if (policy.has_allow_new_users() &&
|
| + policy.allow_new_users().has_allow_new_users()) {
|
| + if (policy.allow_new_users().allow_new_users()) {
|
| + // New users allowed, user whitelist ignored.
|
| + new_values_cache->SetBoolean(kAccountsPrefAllowNewUser, true);
|
| + } else {
|
| + // New users not allowed, enforce user whitelist if present.
|
| + new_values_cache->SetBoolean(kAccountsPrefAllowNewUser,
|
| + !policy.has_user_whitelist());
|
| + }
|
| + } else {
|
| + // No configured allow-new-users value, enforce whitelist if non-empty.
|
| + new_values_cache->SetBoolean(
|
| + kAccountsPrefAllowNewUser,
|
| + policy.user_whitelist().user_whitelist_size() == 0);
|
| }
|
| -}
|
|
|
| -DeviceSettingsProvider::~DeviceSettingsProvider() {
|
| - device_settings_service_->RemoveObserver(this);
|
| -}
|
| + new_values_cache->SetBoolean(
|
| + kAccountsPrefAllowGuest,
|
| + !policy.has_guest_mode_enabled() ||
|
| + !policy.guest_mode_enabled().has_guest_mode_enabled() ||
|
| + policy.guest_mode_enabled().guest_mode_enabled());
|
|
|
| -// static
|
| -bool DeviceSettingsProvider::IsDeviceSetting(const std::string& name) {
|
| - const char** end = kKnownSettings + arraysize(kKnownSettings);
|
| - return std::find(kKnownSettings, end, name) != end;
|
| -}
|
| + policy::BrowserPolicyConnectorChromeOS* connector =
|
| + g_browser_process->platform_part()->browser_policy_connector_chromeos();
|
| + bool supervised_users_enabled = false;
|
| + if (connector->IsEnterpriseManaged()) {
|
| + supervised_users_enabled =
|
| + policy.has_supervised_users_settings() &&
|
| + policy.supervised_users_settings().has_supervised_users_enabled() &&
|
| + policy.supervised_users_settings().supervised_users_enabled();
|
| + } else {
|
| + supervised_users_enabled =
|
| + !policy.has_supervised_users_settings() ||
|
| + !policy.supervised_users_settings().has_supervised_users_enabled() ||
|
| + policy.supervised_users_settings().supervised_users_enabled();
|
| + }
|
| + new_values_cache->SetBoolean(
|
| + kAccountsPrefSupervisedUsersEnabled, supervised_users_enabled);
|
|
|
| -void DeviceSettingsProvider::DoSet(const std::string& path,
|
| - const base::Value& in_value) {
|
| - // Make sure that either the current user is the device owner or the
|
| - // device doesn't have an owner yet.
|
| - if (!(device_settings_service_->HasPrivateOwnerKey() ||
|
| - ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE)) {
|
| - LOG(WARNING) << "Changing settings from non-owner, setting=" << path;
|
| + new_values_cache->SetBoolean(
|
| + kAccountsPrefShowUserNamesOnSignIn,
|
| + !policy.has_show_user_names() ||
|
| + !policy.show_user_names().has_show_user_names() ||
|
| + policy.show_user_names().show_user_names());
|
|
|
| - // Revert UI change.
|
| - NotifyObservers(path);
|
| - return;
|
| + new_values_cache->SetBoolean(
|
| + kAccountsPrefEphemeralUsersEnabled,
|
| + policy.has_ephemeral_users_enabled() &&
|
| + policy.ephemeral_users_enabled().has_ephemeral_users_enabled() &&
|
| + policy.ephemeral_users_enabled().ephemeral_users_enabled());
|
| +
|
| + base::ListValue* list = new base::ListValue();
|
| + const em::UserWhitelistProto& whitelist_proto = policy.user_whitelist();
|
| + const RepeatedPtrField<std::string>& whitelist =
|
| + whitelist_proto.user_whitelist();
|
| + for (RepeatedPtrField<std::string>::const_iterator it = whitelist.begin();
|
| + it != whitelist.end(); ++it) {
|
| + list->Append(new base::StringValue(*it));
|
| }
|
| + new_values_cache->SetValue(kAccountsPrefUsers, list);
|
|
|
| - if (IsDeviceSetting(path)) {
|
| - pending_changes_.push_back(PendingQueueElement(path, in_value.DeepCopy()));
|
| - if (!store_callback_factory_.HasWeakPtrs())
|
| - SetInPolicy();
|
| - } else {
|
| - NOTREACHED() << "Try to set unhandled cros setting " << path;
|
| + scoped_ptr<base::ListValue> account_list(new base::ListValue());
|
| + const em::DeviceLocalAccountsProto device_local_accounts_proto =
|
| + policy.device_local_accounts();
|
| + const RepeatedPtrField<em::DeviceLocalAccountInfoProto>& accounts =
|
| + device_local_accounts_proto.account();
|
| + RepeatedPtrField<em::DeviceLocalAccountInfoProto>::const_iterator entry;
|
| + for (entry = accounts.begin(); entry != accounts.end(); ++entry) {
|
| + scoped_ptr<base::DictionaryValue> entry_dict(new base::DictionaryValue());
|
| + if (entry->has_type()) {
|
| + if (entry->has_account_id()) {
|
| + entry_dict->SetStringWithoutPathExpansion(
|
| + kAccountsPrefDeviceLocalAccountsKeyId, entry->account_id());
|
| + }
|
| + entry_dict->SetIntegerWithoutPathExpansion(
|
| + kAccountsPrefDeviceLocalAccountsKeyType, entry->type());
|
| + if (entry->kiosk_app().has_app_id()) {
|
| + entry_dict->SetStringWithoutPathExpansion(
|
| + kAccountsPrefDeviceLocalAccountsKeyKioskAppId,
|
| + entry->kiosk_app().app_id());
|
| + }
|
| + } else if (entry->has_deprecated_public_session_id()) {
|
| + // Deprecated public session specification.
|
| + entry_dict->SetStringWithoutPathExpansion(
|
| + kAccountsPrefDeviceLocalAccountsKeyId,
|
| + entry->deprecated_public_session_id());
|
| + entry_dict->SetIntegerWithoutPathExpansion(
|
| + kAccountsPrefDeviceLocalAccountsKeyType,
|
| + policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION);
|
| + }
|
| + account_list->Append(entry_dict.release());
|
| }
|
| -}
|
| + new_values_cache->SetValue(kAccountsPrefDeviceLocalAccounts,
|
| + account_list.release());
|
|
|
| -void DeviceSettingsProvider::OwnershipStatusChanged() {
|
| - DeviceSettingsService::OwnershipStatus new_ownership_status =
|
| - device_settings_service_->GetOwnershipStatus();
|
| + if (policy.has_device_local_accounts()) {
|
| + if (policy.device_local_accounts().has_auto_login_id()) {
|
| + new_values_cache->SetString(
|
| + kAccountsPrefDeviceLocalAccountAutoLoginId,
|
| + policy.device_local_accounts().auto_login_id());
|
| + }
|
| + if (policy.device_local_accounts().has_auto_login_delay()) {
|
| + new_values_cache->SetInteger(
|
| + kAccountsPrefDeviceLocalAccountAutoLoginDelay,
|
| + policy.device_local_accounts().auto_login_delay());
|
| + }
|
| + }
|
|
|
| - // If the device just became owned, write the settings accumulated in the
|
| - // cache to device settings proper. It is important that writing only happens
|
| - // in this case, as during normal operation, the contents of the cache should
|
| - // never overwrite actual device settings.
|
| - if (new_ownership_status == DeviceSettingsService::OWNERSHIP_TAKEN &&
|
| - ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE &&
|
| - device_settings_service_->HasPrivateOwnerKey()) {
|
| - // There shouldn't be any pending writes, since the cache writes are all
|
| - // immediate.
|
| - DCHECK(!store_callback_factory_.HasWeakPtrs());
|
| + new_values_cache->SetBoolean(
|
| + kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled,
|
| + policy.device_local_accounts().enable_auto_login_bailout());
|
| + new_values_cache->SetBoolean(
|
| + kAccountsPrefDeviceLocalAccountPromptForNetworkWhenOffline,
|
| + policy.device_local_accounts().prompt_for_network_when_offline());
|
|
|
| - trusted_status_ = TEMPORARILY_UNTRUSTED;
|
| - // Apply the locally-accumulated device settings on top of the initial
|
| - // settings from the service and write back the result.
|
| - if (device_settings_service_->device_settings()) {
|
| - em::ChromeDeviceSettingsProto new_settings(
|
| - *device_settings_service_->device_settings());
|
| - new_settings.MergeFrom(device_settings_);
|
| - device_settings_.Swap(&new_settings);
|
| + if (policy.has_start_up_flags()) {
|
| + base::ListValue* list = new base::ListValue();
|
| + const em::StartUpFlagsProto& flags_proto = policy.start_up_flags();
|
| + const RepeatedPtrField<std::string>& flags = flags_proto.flags();
|
| + for (RepeatedPtrField<std::string>::const_iterator it = flags.begin();
|
| + it != flags.end(); ++it) {
|
| + list->Append(new base::StringValue(*it));
|
| }
|
| - StoreDeviceSettings();
|
| + new_values_cache->SetValue(kStartUpFlags, list);
|
| }
|
|
|
| - // The owner key might have become available, allowing migration to happen.
|
| - AttemptMigration();
|
| -
|
| - ownership_status_ = new_ownership_status;
|
| + if (policy.has_saml_settings()) {
|
| + new_values_cache->SetBoolean(
|
| + kAccountsPrefTransferSAMLCookies,
|
| + policy.saml_settings().transfer_saml_cookies());
|
| + }
|
| }
|
|
|
| -void DeviceSettingsProvider::DeviceSettingsUpdated() {
|
| - if (!store_callback_factory_.HasWeakPtrs())
|
| - UpdateAndProceedStoring();
|
| -}
|
| +void DecodeKioskPolicies(
|
| + const em::ChromeDeviceSettingsProto& policy,
|
| + PrefValueMap* new_values_cache) {
|
| + if (policy.has_forced_logout_timeouts()) {
|
| + if (policy.forced_logout_timeouts().has_idle_logout_timeout()) {
|
| + new_values_cache->SetInteger(
|
| + kIdleLogoutTimeout,
|
| + policy.forced_logout_timeouts().idle_logout_timeout());
|
| + }
|
|
|
| -void DeviceSettingsProvider::RetrieveCachedData() {
|
| - em::PolicyData policy_data;
|
| - if (!device_settings_cache::Retrieve(&policy_data,
|
| - g_browser_process->local_state()) ||
|
| - !device_settings_.ParseFromString(policy_data.policy_value())) {
|
| - VLOG(1) << "Can't retrieve temp store, possibly not created yet.";
|
| + if (policy.forced_logout_timeouts().has_idle_logout_warning_duration()) {
|
| + new_values_cache->SetInteger(
|
| + kIdleLogoutWarningDuration,
|
| + policy.forced_logout_timeouts().idle_logout_warning_duration());
|
| + }
|
| }
|
|
|
| - UpdateValuesCache(policy_data, device_settings_, trusted_status_);
|
| -}
|
| + if (policy.has_login_screen_saver()) {
|
| + if (policy.login_screen_saver().has_screen_saver_timeout()) {
|
| + new_values_cache->SetInteger(
|
| + kScreenSaverTimeout,
|
| + policy.login_screen_saver().screen_saver_timeout());
|
| + }
|
|
|
| -void DeviceSettingsProvider::SetInPolicy() {
|
| - if (pending_changes_.empty()) {
|
| - NOTREACHED();
|
| - return;
|
| + if (policy.login_screen_saver().has_screen_saver_extension_id()) {
|
| + new_values_cache->SetString(
|
| + kScreenSaverExtensionId,
|
| + policy.login_screen_saver().screen_saver_extension_id());
|
| + }
|
| }
|
|
|
| - if (RequestTrustedEntity() != TRUSTED) {
|
| - // Re-sync device settings before proceeding.
|
| - device_settings_service_->Load();
|
| - return;
|
| + if (policy.has_app_pack()) {
|
| + typedef RepeatedPtrField<em::AppPackEntryProto> proto_type;
|
| + base::ListValue* list = new base::ListValue;
|
| + const proto_type& app_pack = policy.app_pack().app_pack();
|
| + for (proto_type::const_iterator it = app_pack.begin();
|
| + it != app_pack.end(); ++it) {
|
| + base::DictionaryValue* entry = new base::DictionaryValue;
|
| + if (it->has_extension_id()) {
|
| + entry->SetStringWithoutPathExpansion(kAppPackKeyExtensionId,
|
| + it->extension_id());
|
| + }
|
| + if (it->has_update_url()) {
|
| + entry->SetStringWithoutPathExpansion(kAppPackKeyUpdateUrl,
|
| + it->update_url());
|
| + }
|
| + list->Append(entry);
|
| + }
|
| + new_values_cache->SetValue(kAppPack, list);
|
| }
|
|
|
| - std::string prop(pending_changes_.front().first);
|
| - scoped_ptr<base::Value> value(pending_changes_.front().second);
|
| - pending_changes_.pop_front();
|
| + if (policy.has_start_up_urls()) {
|
| + base::ListValue* list = new base::ListValue();
|
| + const em::StartUpUrlsProto& urls_proto = policy.start_up_urls();
|
| + const RepeatedPtrField<std::string>& urls = urls_proto.start_up_urls();
|
| + for (RepeatedPtrField<std::string>::const_iterator it = urls.begin();
|
| + it != urls.end(); ++it) {
|
| + list->Append(new base::StringValue(*it));
|
| + }
|
| + new_values_cache->SetValue(kStartUpUrls, list);
|
| + }
|
| +}
|
| +
|
| +void DecodeNetworkPolicies(
|
| + const em::ChromeDeviceSettingsProto& policy,
|
| + PrefValueMap* new_values_cache) {
|
| + // kSignedDataRoamingEnabled has a default value of false.
|
| + new_values_cache->SetBoolean(
|
| + kSignedDataRoamingEnabled,
|
| + policy.has_data_roaming_enabled() &&
|
| + policy.data_roaming_enabled().has_data_roaming_enabled() &&
|
| + policy.data_roaming_enabled().data_roaming_enabled());
|
| +}
|
| +
|
| +void DecodeAutoUpdatePolicies(
|
| + const em::ChromeDeviceSettingsProto& policy,
|
| + PrefValueMap* new_values_cache) {
|
| + if (policy.has_auto_update_settings()) {
|
| + const em::AutoUpdateSettingsProto& au_settings_proto =
|
| + policy.auto_update_settings();
|
| + if (au_settings_proto.has_update_disabled()) {
|
| + new_values_cache->SetBoolean(kUpdateDisabled,
|
| + au_settings_proto.update_disabled());
|
| + }
|
| + const RepeatedField<int>& allowed_connection_types =
|
| + au_settings_proto.allowed_connection_types();
|
| + base::ListValue* list = new base::ListValue();
|
| + for (RepeatedField<int>::const_iterator i(allowed_connection_types.begin());
|
| + i != allowed_connection_types.end(); ++i) {
|
| + list->Append(new base::FundamentalValue(*i));
|
| + }
|
| + new_values_cache->SetValue(kAllowedConnectionTypesForUpdate, list);
|
| + }
|
| +}
|
| +
|
| +void DecodeReportingPolicies(
|
| + const em::ChromeDeviceSettingsProto& policy,
|
| + PrefValueMap* new_values_cache) {
|
| + if (policy.has_device_reporting()) {
|
| + const em::DeviceReportingProto& reporting_policy =
|
| + policy.device_reporting();
|
| + if (reporting_policy.has_report_version_info()) {
|
| + new_values_cache->SetBoolean(
|
| + kReportDeviceVersionInfo,
|
| + reporting_policy.report_version_info());
|
| + }
|
| + if (reporting_policy.has_report_activity_times()) {
|
| + new_values_cache->SetBoolean(
|
| + kReportDeviceActivityTimes,
|
| + reporting_policy.report_activity_times());
|
| + }
|
| + if (reporting_policy.has_report_boot_mode()) {
|
| + new_values_cache->SetBoolean(
|
| + kReportDeviceBootMode,
|
| + reporting_policy.report_boot_mode());
|
| + }
|
| + if (reporting_policy.has_report_network_interfaces()) {
|
| + new_values_cache->SetBoolean(
|
| + kReportDeviceNetworkInterfaces,
|
| + reporting_policy.report_network_interfaces());
|
| + }
|
| + if (reporting_policy.has_report_users()) {
|
| + new_values_cache->SetBoolean(
|
| + kReportDeviceUsers,
|
| + reporting_policy.report_users());
|
| + }
|
| + }
|
| +}
|
| +
|
| +void DecodeGenericPolicies(
|
| + const em::ChromeDeviceSettingsProto& policy,
|
| + PrefValueMap* new_values_cache) {
|
| + if (policy.has_metrics_enabled()) {
|
| + new_values_cache->SetBoolean(kStatsReportingPref,
|
| + policy.metrics_enabled().metrics_enabled());
|
| + } else {
|
| + new_values_cache->SetBoolean(kStatsReportingPref, HasOldMetricsFile());
|
| + }
|
| +
|
| + if (!policy.has_release_channel() ||
|
| + !policy.release_channel().has_release_channel()) {
|
| + // Default to an invalid channel (will be ignored).
|
| + new_values_cache->SetString(kReleaseChannel, "");
|
| + } else {
|
| + new_values_cache->SetString(kReleaseChannel,
|
| + policy.release_channel().release_channel());
|
| + }
|
| +
|
| + new_values_cache->SetBoolean(
|
| + kReleaseChannelDelegated,
|
| + policy.has_release_channel() &&
|
| + policy.release_channel().has_release_channel_delegated() &&
|
| + policy.release_channel().release_channel_delegated());
|
| +
|
| + if (policy.has_system_timezone()) {
|
| + if (policy.system_timezone().has_timezone()) {
|
| + new_values_cache->SetString(
|
| + kSystemTimezonePolicy,
|
| + policy.system_timezone().timezone());
|
| + }
|
| + }
|
| +
|
| + if (policy.has_use_24hour_clock()) {
|
| + if (policy.use_24hour_clock().has_use_24hour_clock()) {
|
| + new_values_cache->SetBoolean(
|
| + kSystemUse24HourClock, policy.use_24hour_clock().use_24hour_clock());
|
| + }
|
| + }
|
| +
|
| + if (policy.has_allow_redeem_offers()) {
|
| + new_values_cache->SetBoolean(
|
| + kAllowRedeemChromeOsRegistrationOffers,
|
| + policy.allow_redeem_offers().allow_redeem_offers());
|
| + } else {
|
| + new_values_cache->SetBoolean(
|
| + kAllowRedeemChromeOsRegistrationOffers,
|
| + true);
|
| + }
|
| +
|
| + if (policy.has_variations_parameter()) {
|
| + new_values_cache->SetString(
|
| + kVariationsRestrictParameter,
|
| + policy.variations_parameter().parameter());
|
| + }
|
| +
|
| + new_values_cache->SetBoolean(
|
| + kDeviceAttestationEnabled,
|
| + policy.attestation_settings().attestation_enabled());
|
| +
|
| + if (policy.has_attestation_settings() &&
|
| + policy.attestation_settings().has_content_protection_enabled()) {
|
| + new_values_cache->SetBoolean(
|
| + kAttestationForContentProtectionEnabled,
|
| + policy.attestation_settings().content_protection_enabled());
|
| + } else {
|
| + new_values_cache->SetBoolean(kAttestationForContentProtectionEnabled, true);
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +DeviceSettingsProvider::DeviceSettingsProvider(
|
| + const NotifyObserversCallback& notify_cb,
|
| + DeviceSettingsService* device_settings_service)
|
| + : CrosSettingsProvider(notify_cb),
|
| + device_settings_service_(device_settings_service),
|
| + trusted_status_(TEMPORARILY_UNTRUSTED),
|
| + ownership_status_(device_settings_service_->GetOwnershipStatus()),
|
| + store_callback_factory_(this) {
|
| + device_settings_service_->AddObserver(this);
|
| + if (!UpdateFromService()) {
|
| + // Make sure we have at least the cache data immediately.
|
| + RetrieveCachedData();
|
| + }
|
| +}
|
| +
|
| +DeviceSettingsProvider::~DeviceSettingsProvider() {
|
| + device_settings_service_->RemoveObserver(this);
|
| +}
|
| +
|
| +// static
|
| +bool DeviceSettingsProvider::IsDeviceSetting(const std::string& name) {
|
| + const char** end = kKnownSettings + arraysize(kKnownSettings);
|
| + return std::find(kKnownSettings, end, name) != end;
|
| +}
|
| +
|
| +void DeviceSettingsProvider::DoSet(const std::string& path,
|
| + const base::Value& in_value) {
|
| + // Make sure that either the current user is the device owner or the
|
| + // device doesn't have an owner yet.
|
| + if (!(device_settings_service_->HasPrivateOwnerKey() ||
|
| + ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE)) {
|
| + LOG(WARNING) << "Changing settings from non-owner, setting=" << path;
|
| +
|
| + // Revert UI change.
|
| + NotifyObservers(path);
|
| + return;
|
| + }
|
| +
|
| + if (IsDeviceSetting(path)) {
|
| + pending_changes_.push_back(PendingQueueElement(path, in_value.DeepCopy()));
|
| + if (!store_callback_factory_.HasWeakPtrs())
|
| + SetInPolicy();
|
| + } else {
|
| + NOTREACHED() << "Try to set unhandled cros setting " << path;
|
| + }
|
| +}
|
| +
|
| +void DeviceSettingsProvider::OwnershipStatusChanged() {
|
| + DeviceSettingsService::OwnershipStatus new_ownership_status =
|
| + device_settings_service_->GetOwnershipStatus();
|
| +
|
| + // If the device just became owned, write the settings accumulated in the
|
| + // cache to device settings proper. It is important that writing only happens
|
| + // in this case, as during normal operation, the contents of the cache should
|
| + // never overwrite actual device settings.
|
| + if (new_ownership_status == DeviceSettingsService::OWNERSHIP_TAKEN &&
|
| + ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE &&
|
| + device_settings_service_->HasPrivateOwnerKey()) {
|
| + // There shouldn't be any pending writes, since the cache writes are all
|
| + // immediate.
|
| + DCHECK(!store_callback_factory_.HasWeakPtrs());
|
| +
|
| + trusted_status_ = TEMPORARILY_UNTRUSTED;
|
| + // Apply the locally-accumulated device settings on top of the initial
|
| + // settings from the service and write back the result.
|
| + if (device_settings_service_->device_settings()) {
|
| + em::ChromeDeviceSettingsProto new_settings(
|
| + *device_settings_service_->device_settings());
|
| + new_settings.MergeFrom(device_settings_);
|
| + device_settings_.Swap(&new_settings);
|
| + }
|
| + StoreDeviceSettings();
|
| + }
|
| +
|
| + // The owner key might have become available, allowing migration to happen.
|
| + AttemptMigration();
|
| +
|
| + ownership_status_ = new_ownership_status;
|
| +}
|
| +
|
| +void DeviceSettingsProvider::DeviceSettingsUpdated() {
|
| + if (!store_callback_factory_.HasWeakPtrs())
|
| + UpdateAndProceedStoring();
|
| +}
|
| +
|
| +void DeviceSettingsProvider::RetrieveCachedData() {
|
| + em::PolicyData policy_data;
|
| + if (!device_settings_cache::Retrieve(&policy_data,
|
| + g_browser_process->local_state()) ||
|
| + !device_settings_.ParseFromString(policy_data.policy_value())) {
|
| + VLOG(1) << "Can't retrieve temp store, possibly not created yet.";
|
| + }
|
| +
|
| + UpdateValuesCache(policy_data, device_settings_, trusted_status_);
|
| +}
|
| +
|
| +void DeviceSettingsProvider::SetInPolicy() {
|
| + if (pending_changes_.empty()) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| +
|
| + if (RequestTrustedEntity() != TRUSTED) {
|
| + // Re-sync device settings before proceeding.
|
| + device_settings_service_->Load();
|
| + return;
|
| + }
|
| +
|
| + std::string prop(pending_changes_.front().first);
|
| + scoped_ptr<base::Value> value(pending_changes_.front().second);
|
| + pending_changes_.pop_front();
|
|
|
| trusted_status_ = TEMPORARILY_UNTRUSTED;
|
| if (prop == kAccountsPrefAllowNewUser) {
|
| @@ -441,349 +784,6 @@ void DeviceSettingsProvider::SetInPolicy() {
|
| }
|
| }
|
|
|
| -void DeviceSettingsProvider::DecodeLoginPolicies(
|
| - const em::ChromeDeviceSettingsProto& policy,
|
| - PrefValueMap* new_values_cache) const {
|
| - // For all our boolean settings the following is applicable:
|
| - // true is default permissive value and false is safe prohibitive value.
|
| - // Exceptions:
|
| - // kAccountsPrefEphemeralUsersEnabled has a default value of false.
|
| - // kAccountsPrefSupervisedUsersEnabled has a default value of false
|
| - // for enterprise devices and true for consumer devices.
|
| - // kAccountsPrefTransferSAMLCookies has a default value of false.
|
| - if (policy.has_allow_new_users() &&
|
| - policy.allow_new_users().has_allow_new_users()) {
|
| - if (policy.allow_new_users().allow_new_users()) {
|
| - // New users allowed, user whitelist ignored.
|
| - new_values_cache->SetBoolean(kAccountsPrefAllowNewUser, true);
|
| - } else {
|
| - // New users not allowed, enforce user whitelist if present.
|
| - new_values_cache->SetBoolean(kAccountsPrefAllowNewUser,
|
| - !policy.has_user_whitelist());
|
| - }
|
| - } else {
|
| - // No configured allow-new-users value, enforce whitelist if non-empty.
|
| - new_values_cache->SetBoolean(
|
| - kAccountsPrefAllowNewUser,
|
| - policy.user_whitelist().user_whitelist_size() == 0);
|
| - }
|
| -
|
| - new_values_cache->SetBoolean(
|
| - kAccountsPrefAllowGuest,
|
| - !policy.has_guest_mode_enabled() ||
|
| - !policy.guest_mode_enabled().has_guest_mode_enabled() ||
|
| - policy.guest_mode_enabled().guest_mode_enabled());
|
| -
|
| - policy::BrowserPolicyConnectorChromeOS* connector =
|
| - g_browser_process->platform_part()->browser_policy_connector_chromeos();
|
| - bool supervised_users_enabled = false;
|
| - if (connector->IsEnterpriseManaged()) {
|
| - supervised_users_enabled =
|
| - policy.has_supervised_users_settings() &&
|
| - policy.supervised_users_settings().has_supervised_users_enabled() &&
|
| - policy.supervised_users_settings().supervised_users_enabled();
|
| - } else {
|
| - supervised_users_enabled =
|
| - !policy.has_supervised_users_settings() ||
|
| - !policy.supervised_users_settings().has_supervised_users_enabled() ||
|
| - policy.supervised_users_settings().supervised_users_enabled();
|
| - }
|
| - new_values_cache->SetBoolean(
|
| - kAccountsPrefSupervisedUsersEnabled, supervised_users_enabled);
|
| -
|
| - new_values_cache->SetBoolean(
|
| - kAccountsPrefShowUserNamesOnSignIn,
|
| - !policy.has_show_user_names() ||
|
| - !policy.show_user_names().has_show_user_names() ||
|
| - policy.show_user_names().show_user_names());
|
| -
|
| - new_values_cache->SetBoolean(
|
| - kAccountsPrefEphemeralUsersEnabled,
|
| - policy.has_ephemeral_users_enabled() &&
|
| - policy.ephemeral_users_enabled().has_ephemeral_users_enabled() &&
|
| - policy.ephemeral_users_enabled().ephemeral_users_enabled());
|
| -
|
| - base::ListValue* list = new base::ListValue();
|
| - const em::UserWhitelistProto& whitelist_proto = policy.user_whitelist();
|
| - const RepeatedPtrField<std::string>& whitelist =
|
| - whitelist_proto.user_whitelist();
|
| - for (RepeatedPtrField<std::string>::const_iterator it = whitelist.begin();
|
| - it != whitelist.end(); ++it) {
|
| - list->Append(new base::StringValue(*it));
|
| - }
|
| - new_values_cache->SetValue(kAccountsPrefUsers, list);
|
| -
|
| - scoped_ptr<base::ListValue> account_list(new base::ListValue());
|
| - const em::DeviceLocalAccountsProto device_local_accounts_proto =
|
| - policy.device_local_accounts();
|
| - const RepeatedPtrField<em::DeviceLocalAccountInfoProto>& accounts =
|
| - device_local_accounts_proto.account();
|
| - RepeatedPtrField<em::DeviceLocalAccountInfoProto>::const_iterator entry;
|
| - for (entry = accounts.begin(); entry != accounts.end(); ++entry) {
|
| - scoped_ptr<base::DictionaryValue> entry_dict(new base::DictionaryValue());
|
| - if (entry->has_type()) {
|
| - if (entry->has_account_id()) {
|
| - entry_dict->SetStringWithoutPathExpansion(
|
| - kAccountsPrefDeviceLocalAccountsKeyId, entry->account_id());
|
| - }
|
| - entry_dict->SetIntegerWithoutPathExpansion(
|
| - kAccountsPrefDeviceLocalAccountsKeyType, entry->type());
|
| - if (entry->kiosk_app().has_app_id()) {
|
| - entry_dict->SetStringWithoutPathExpansion(
|
| - kAccountsPrefDeviceLocalAccountsKeyKioskAppId,
|
| - entry->kiosk_app().app_id());
|
| - }
|
| - } else if (entry->has_deprecated_public_session_id()) {
|
| - // Deprecated public session specification.
|
| - entry_dict->SetStringWithoutPathExpansion(
|
| - kAccountsPrefDeviceLocalAccountsKeyId,
|
| - entry->deprecated_public_session_id());
|
| - entry_dict->SetIntegerWithoutPathExpansion(
|
| - kAccountsPrefDeviceLocalAccountsKeyType,
|
| - policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION);
|
| - }
|
| - account_list->Append(entry_dict.release());
|
| - }
|
| - new_values_cache->SetValue(kAccountsPrefDeviceLocalAccounts,
|
| - account_list.release());
|
| -
|
| - if (policy.has_device_local_accounts()) {
|
| - if (policy.device_local_accounts().has_auto_login_id()) {
|
| - new_values_cache->SetString(
|
| - kAccountsPrefDeviceLocalAccountAutoLoginId,
|
| - policy.device_local_accounts().auto_login_id());
|
| - }
|
| - if (policy.device_local_accounts().has_auto_login_delay()) {
|
| - new_values_cache->SetInteger(
|
| - kAccountsPrefDeviceLocalAccountAutoLoginDelay,
|
| - policy.device_local_accounts().auto_login_delay());
|
| - }
|
| - }
|
| -
|
| - new_values_cache->SetBoolean(
|
| - kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled,
|
| - policy.device_local_accounts().enable_auto_login_bailout());
|
| - new_values_cache->SetBoolean(
|
| - kAccountsPrefDeviceLocalAccountPromptForNetworkWhenOffline,
|
| - policy.device_local_accounts().prompt_for_network_when_offline());
|
| -
|
| - if (policy.has_start_up_flags()) {
|
| - base::ListValue* list = new base::ListValue();
|
| - const em::StartUpFlagsProto& flags_proto = policy.start_up_flags();
|
| - const RepeatedPtrField<std::string>& flags = flags_proto.flags();
|
| - for (RepeatedPtrField<std::string>::const_iterator it = flags.begin();
|
| - it != flags.end(); ++it) {
|
| - list->Append(new base::StringValue(*it));
|
| - }
|
| - new_values_cache->SetValue(kStartUpFlags, list);
|
| - }
|
| -
|
| - if (policy.has_saml_settings()) {
|
| - new_values_cache->SetBoolean(
|
| - kAccountsPrefTransferSAMLCookies,
|
| - policy.saml_settings().transfer_saml_cookies());
|
| - }
|
| -}
|
| -
|
| -void DeviceSettingsProvider::DecodeKioskPolicies(
|
| - const em::ChromeDeviceSettingsProto& policy,
|
| - PrefValueMap* new_values_cache) const {
|
| - if (policy.has_forced_logout_timeouts()) {
|
| - if (policy.forced_logout_timeouts().has_idle_logout_timeout()) {
|
| - new_values_cache->SetInteger(
|
| - kIdleLogoutTimeout,
|
| - policy.forced_logout_timeouts().idle_logout_timeout());
|
| - }
|
| -
|
| - if (policy.forced_logout_timeouts().has_idle_logout_warning_duration()) {
|
| - new_values_cache->SetInteger(
|
| - kIdleLogoutWarningDuration,
|
| - policy.forced_logout_timeouts().idle_logout_warning_duration());
|
| - }
|
| - }
|
| -
|
| - if (policy.has_login_screen_saver()) {
|
| - if (policy.login_screen_saver().has_screen_saver_timeout()) {
|
| - new_values_cache->SetInteger(
|
| - kScreenSaverTimeout,
|
| - policy.login_screen_saver().screen_saver_timeout());
|
| - }
|
| -
|
| - if (policy.login_screen_saver().has_screen_saver_extension_id()) {
|
| - new_values_cache->SetString(
|
| - kScreenSaverExtensionId,
|
| - policy.login_screen_saver().screen_saver_extension_id());
|
| - }
|
| - }
|
| -
|
| - if (policy.has_app_pack()) {
|
| - typedef RepeatedPtrField<em::AppPackEntryProto> proto_type;
|
| - base::ListValue* list = new base::ListValue;
|
| - const proto_type& app_pack = policy.app_pack().app_pack();
|
| - for (proto_type::const_iterator it = app_pack.begin();
|
| - it != app_pack.end(); ++it) {
|
| - base::DictionaryValue* entry = new base::DictionaryValue;
|
| - if (it->has_extension_id()) {
|
| - entry->SetStringWithoutPathExpansion(kAppPackKeyExtensionId,
|
| - it->extension_id());
|
| - }
|
| - if (it->has_update_url()) {
|
| - entry->SetStringWithoutPathExpansion(kAppPackKeyUpdateUrl,
|
| - it->update_url());
|
| - }
|
| - list->Append(entry);
|
| - }
|
| - new_values_cache->SetValue(kAppPack, list);
|
| - }
|
| -
|
| - if (policy.has_start_up_urls()) {
|
| - base::ListValue* list = new base::ListValue();
|
| - const em::StartUpUrlsProto& urls_proto = policy.start_up_urls();
|
| - const RepeatedPtrField<std::string>& urls = urls_proto.start_up_urls();
|
| - for (RepeatedPtrField<std::string>::const_iterator it = urls.begin();
|
| - it != urls.end(); ++it) {
|
| - list->Append(new base::StringValue(*it));
|
| - }
|
| - new_values_cache->SetValue(kStartUpUrls, list);
|
| - }
|
| -}
|
| -
|
| -void DeviceSettingsProvider::DecodeNetworkPolicies(
|
| - const em::ChromeDeviceSettingsProto& policy,
|
| - PrefValueMap* new_values_cache) const {
|
| - // kSignedDataRoamingEnabled has a default value of false.
|
| - new_values_cache->SetBoolean(
|
| - kSignedDataRoamingEnabled,
|
| - policy.has_data_roaming_enabled() &&
|
| - policy.data_roaming_enabled().has_data_roaming_enabled() &&
|
| - policy.data_roaming_enabled().data_roaming_enabled());
|
| -}
|
| -
|
| -void DeviceSettingsProvider::DecodeAutoUpdatePolicies(
|
| - const em::ChromeDeviceSettingsProto& policy,
|
| - PrefValueMap* new_values_cache) const {
|
| - if (policy.has_auto_update_settings()) {
|
| - const em::AutoUpdateSettingsProto& au_settings_proto =
|
| - policy.auto_update_settings();
|
| - if (au_settings_proto.has_update_disabled()) {
|
| - new_values_cache->SetBoolean(kUpdateDisabled,
|
| - au_settings_proto.update_disabled());
|
| - }
|
| - const RepeatedField<int>& allowed_connection_types =
|
| - au_settings_proto.allowed_connection_types();
|
| - base::ListValue* list = new base::ListValue();
|
| - for (RepeatedField<int>::const_iterator i(allowed_connection_types.begin());
|
| - i != allowed_connection_types.end(); ++i) {
|
| - list->Append(new base::FundamentalValue(*i));
|
| - }
|
| - new_values_cache->SetValue(kAllowedConnectionTypesForUpdate, list);
|
| - }
|
| -}
|
| -
|
| -void DeviceSettingsProvider::DecodeReportingPolicies(
|
| - const em::ChromeDeviceSettingsProto& policy,
|
| - PrefValueMap* new_values_cache) const {
|
| - if (policy.has_device_reporting()) {
|
| - const em::DeviceReportingProto& reporting_policy =
|
| - policy.device_reporting();
|
| - if (reporting_policy.has_report_version_info()) {
|
| - new_values_cache->SetBoolean(
|
| - kReportDeviceVersionInfo,
|
| - reporting_policy.report_version_info());
|
| - }
|
| - if (reporting_policy.has_report_activity_times()) {
|
| - new_values_cache->SetBoolean(
|
| - kReportDeviceActivityTimes,
|
| - reporting_policy.report_activity_times());
|
| - }
|
| - if (reporting_policy.has_report_boot_mode()) {
|
| - new_values_cache->SetBoolean(
|
| - kReportDeviceBootMode,
|
| - reporting_policy.report_boot_mode());
|
| - }
|
| - if (reporting_policy.has_report_network_interfaces()) {
|
| - new_values_cache->SetBoolean(
|
| - kReportDeviceNetworkInterfaces,
|
| - reporting_policy.report_network_interfaces());
|
| - }
|
| - if (reporting_policy.has_report_users()) {
|
| - new_values_cache->SetBoolean(
|
| - kReportDeviceUsers,
|
| - reporting_policy.report_users());
|
| - }
|
| - }
|
| -}
|
| -
|
| -void DeviceSettingsProvider::DecodeGenericPolicies(
|
| - const em::ChromeDeviceSettingsProto& policy,
|
| - PrefValueMap* new_values_cache) const {
|
| - if (policy.has_metrics_enabled()) {
|
| - new_values_cache->SetBoolean(kStatsReportingPref,
|
| - policy.metrics_enabled().metrics_enabled());
|
| - } else {
|
| - new_values_cache->SetBoolean(kStatsReportingPref, HasOldMetricsFile());
|
| - }
|
| -
|
| - if (!policy.has_release_channel() ||
|
| - !policy.release_channel().has_release_channel()) {
|
| - // Default to an invalid channel (will be ignored).
|
| - new_values_cache->SetString(kReleaseChannel, "");
|
| - } else {
|
| - new_values_cache->SetString(kReleaseChannel,
|
| - policy.release_channel().release_channel());
|
| - }
|
| -
|
| - new_values_cache->SetBoolean(
|
| - kReleaseChannelDelegated,
|
| - policy.has_release_channel() &&
|
| - policy.release_channel().has_release_channel_delegated() &&
|
| - policy.release_channel().release_channel_delegated());
|
| -
|
| - if (policy.has_system_timezone()) {
|
| - if (policy.system_timezone().has_timezone()) {
|
| - new_values_cache->SetString(
|
| - kSystemTimezonePolicy,
|
| - policy.system_timezone().timezone());
|
| - }
|
| - }
|
| -
|
| - if (policy.has_use_24hour_clock()) {
|
| - if (policy.use_24hour_clock().has_use_24hour_clock()) {
|
| - new_values_cache->SetBoolean(
|
| - kSystemUse24HourClock, policy.use_24hour_clock().use_24hour_clock());
|
| - }
|
| - }
|
| -
|
| - if (policy.has_allow_redeem_offers()) {
|
| - new_values_cache->SetBoolean(
|
| - kAllowRedeemChromeOsRegistrationOffers,
|
| - policy.allow_redeem_offers().allow_redeem_offers());
|
| - } else {
|
| - new_values_cache->SetBoolean(
|
| - kAllowRedeemChromeOsRegistrationOffers,
|
| - true);
|
| - }
|
| -
|
| - if (policy.has_variations_parameter()) {
|
| - new_values_cache->SetString(
|
| - kVariationsRestrictParameter,
|
| - policy.variations_parameter().parameter());
|
| - }
|
| -
|
| - new_values_cache->SetBoolean(
|
| - kDeviceAttestationEnabled,
|
| - policy.attestation_settings().attestation_enabled());
|
| -
|
| - if (policy.has_attestation_settings() &&
|
| - policy.attestation_settings().has_content_protection_enabled()) {
|
| - new_values_cache->SetBoolean(
|
| - kAttestationForContentProtectionEnabled,
|
| - policy.attestation_settings().content_protection_enabled());
|
| - } else {
|
| - new_values_cache->SetBoolean(kAttestationForContentProtectionEnabled, true);
|
| - }
|
| -}
|
| -
|
| void DeviceSettingsProvider::UpdateValuesCache(
|
| const em::PolicyData& policy_data,
|
| const em::ChromeDeviceSettingsProto& settings,
|
|
|