1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "system_features_disable_list_policy_handler.h"
6 
7 #include "ash/public/cpp/ash_pref_names.h"
8 #include "base/logging.h"
9 #include "base/metrics/histogram_functions.h"
10 #include "base/values.h"
11 #include "components/policy/core/common/policy_pref_names.h"
12 #include "components/policy/policy_constants.h"
13 #include "components/prefs/pref_registry_simple.h"
14 
15 namespace policy {
16 
17 const char kCameraFeature[] = "camera";
18 const char kBrowserSettingsFeature[] = "browser_settings";
19 const char kOsSettingsFeature[] = "os_settings";
20 const char kScanningFeature[] = "scanning";
21 
22 const char kSystemFeaturesDisableListHistogram[] =
23     "Enterprise.SystemFeaturesDisableList";
24 
SystemFeaturesDisableListPolicyHandler()25 SystemFeaturesDisableListPolicyHandler::SystemFeaturesDisableListPolicyHandler()
26     : policy::ListPolicyHandler(key::kSystemFeaturesDisableList,
27                                 base::Value::Type::STRING) {}
28 
29 SystemFeaturesDisableListPolicyHandler::
30     ~SystemFeaturesDisableListPolicyHandler() = default;
31 
RegisterPrefs(PrefRegistrySimple * registry)32 void SystemFeaturesDisableListPolicyHandler::RegisterPrefs(
33     PrefRegistrySimple* registry) {
34   registry->RegisterListPref(policy_prefs::kSystemFeaturesDisableList);
35 }
36 
ApplyList(base::Value filtered_list,PrefValueMap * prefs)37 void SystemFeaturesDisableListPolicyHandler::ApplyList(
38     base::Value filtered_list,
39     PrefValueMap* prefs) {
40   DCHECK(filtered_list.is_list());
41 
42   base::Value enums_list(base::Value::Type::LIST);
43   bool os_settings_enabled = true;
44 
45   base::Value* old_list = nullptr;
46   prefs->GetValue(policy_prefs::kSystemFeaturesDisableList, &old_list);
47 
48   for (const auto& element : filtered_list.GetList()) {
49     SystemFeature feature = ConvertToEnum(element.GetString());
50     enums_list.Append(feature);
51     if (feature == SystemFeature::OS_SETTINGS)
52       os_settings_enabled = false;
53 
54     if (!old_list ||
55         !base::Contains(old_list->GetList(), base::Value(feature))) {
56       base::UmaHistogramEnumeration(kSystemFeaturesDisableListHistogram,
57                                     feature);
58     }
59   }
60 
61   prefs->SetValue(policy_prefs::kSystemFeaturesDisableList,
62                   std::move(enums_list));
63   prefs->SetBoolean(ash::prefs::kOsSettingsEnabled, os_settings_enabled);
64 }
65 
ConvertToEnum(const std::string & system_feature)66 SystemFeature SystemFeaturesDisableListPolicyHandler::ConvertToEnum(
67     const std::string& system_feature) {
68   if (system_feature == kCameraFeature)
69     return SystemFeature::CAMERA;
70   if (system_feature == kOsSettingsFeature)
71     return SystemFeature::OS_SETTINGS;
72   if (system_feature == kBrowserSettingsFeature)
73     return SystemFeature::BROWSER_SETTINGS;
74   if (system_feature == kScanningFeature)
75     return SystemFeature::SCANNING;
76 
77   LOG(ERROR) << "Unsupported system feature: " << system_feature;
78   return UNKNOWN_SYSTEM_FEATURE;
79 }
80 
81 }  // namespace policy
82