blob: 25eca1071917a195d6f8b9fff2fff53b96a12ecd [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "system_features_disable_list_policy_handler.h"
#include "ash/public/cpp/ash_pref_names.h"
#include "base/logging.h"
#include "base/metrics/histogram_functions.h"
#include "base/values.h"
#include "components/policy/core/common/policy_pref_names.h"
#include "components/policy/policy_constants.h"
#include "components/prefs/pref_registry_simple.h"
namespace policy {
const char kCameraFeature[] = "camera";
const char kBrowserSettingsFeature[] = "browser_settings";
const char kOsSettingsFeature[] = "os_settings";
const char kScanningFeature[] = "scanning";
const char kBlockedDisableMode[] = "blocked";
const char kHiddenDisableMode[] = "hidden";
const char kSystemFeaturesDisableListHistogram[] =
"Enterprise.SystemFeaturesDisableList";
SystemFeaturesDisableListPolicyHandler::SystemFeaturesDisableListPolicyHandler()
: policy::ListPolicyHandler(key::kSystemFeaturesDisableList,
base::Value::Type::STRING) {}
SystemFeaturesDisableListPolicyHandler::
~SystemFeaturesDisableListPolicyHandler() = default;
void SystemFeaturesDisableListPolicyHandler::RegisterPrefs(
PrefRegistrySimple* registry) {
registry->RegisterListPref(policy_prefs::kSystemFeaturesDisableList);
registry->RegisterStringPref(policy_prefs::kSystemFeaturesDisableMode,
kBlockedDisableMode);
}
void SystemFeaturesDisableListPolicyHandler::ApplyList(
base::Value filtered_list,
PrefValueMap* prefs) {
DCHECK(filtered_list.is_list());
base::Value enums_list(base::Value::Type::LIST);
bool os_settings_enabled = true;
base::Value* old_list = nullptr;
prefs->GetValue(policy_prefs::kSystemFeaturesDisableList, &old_list);
for (const auto& element : filtered_list.GetList()) {
SystemFeature feature = ConvertToEnum(element.GetString());
enums_list.Append(feature);
if (feature == SystemFeature::kOsSettings)
os_settings_enabled = false;
if (!old_list ||
!base::Contains(old_list->GetList(), base::Value(feature))) {
base::UmaHistogramEnumeration(kSystemFeaturesDisableListHistogram,
feature);
}
}
prefs->SetValue(policy_prefs::kSystemFeaturesDisableList,
std::move(enums_list));
prefs->SetBoolean(ash::prefs::kOsSettingsEnabled, os_settings_enabled);
}
SystemFeature SystemFeaturesDisableListPolicyHandler::ConvertToEnum(
const std::string& system_feature) {
if (system_feature == kCameraFeature)
return SystemFeature::kCamera;
if (system_feature == kOsSettingsFeature)
return SystemFeature::kOsSettings;
if (system_feature == kBrowserSettingsFeature)
return SystemFeature::kBrowserSettings;
if (system_feature == kScanningFeature)
return SystemFeature::kScanning;
LOG(ERROR) << "Unsupported system feature: " << system_feature;
return kUnknownSystemFeature;
}
} // namespace policy