chromium/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h

// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ASH_POLICY_HANDLERS_CONFIGURATION_POLICY_HANDLER_ASH_H_
#define CHROME_BROWSER_ASH_POLICY_HANDLERS_CONFIGURATION_POLICY_HANDLER_ASH_H_

#include <string>
#include <string_view>

#include "base/values.h"
#include "chrome/browser/extensions/policy_handlers.h"
#include "chromeos/ash/components/network/network_ui_data.h"
#include "components/onc/onc_constants.h"
#include "components/policy/core/browser/configuration_policy_handler.h"
#include "components/policy/core/common/policy_map.h"

namespace policy {

class Schema;

// ConfigurationPolicyHandler for policies referencing external data.
class ExternalDataPolicyHandler : public TypeCheckingPolicyHandler {
 public:
  explicit ExternalDataPolicyHandler(const char* policy_name);

  ExternalDataPolicyHandler(const ExternalDataPolicyHandler&) = delete;
  ExternalDataPolicyHandler& operator=(const ExternalDataPolicyHandler&) =
      delete;

  ~ExternalDataPolicyHandler() override;

  static bool CheckPolicySettings(const char* policy,
                                  const PolicyMap::Entry* entry,
                                  PolicyErrorMap* errors);

  // TypeCheckingPolicyHandler:
  bool CheckPolicySettings(const PolicyMap& policies,
                           PolicyErrorMap* errors) override;

  void ApplyPolicySettings(const PolicyMap& policies,
                           PrefValueMap* prefs) override;
};

// ConfigurationPolicyHandler for validation of the network configuration
// policies. These actually don't set any preferences, but the handler just
// generates error messages.
class NetworkConfigurationPolicyHandler : public TypeCheckingPolicyHandler {
 public:
  static NetworkConfigurationPolicyHandler* CreateForUserPolicy();
  static NetworkConfigurationPolicyHandler* CreateForDevicePolicy();

  NetworkConfigurationPolicyHandler(const NetworkConfigurationPolicyHandler&) =
      delete;
  NetworkConfigurationPolicyHandler& operator=(
      const NetworkConfigurationPolicyHandler&) = delete;

  ~NetworkConfigurationPolicyHandler() override;

  // ConfigurationPolicyHandler methods:
  bool CheckPolicySettings(const PolicyMap& policies,
                           PolicyErrorMap* errors) override;
  void ApplyPolicySettings(const PolicyMap& policies,
                           PrefValueMap* prefs) override;
  void PrepareForDisplaying(PolicyMap* policies) const override;

 private:
  explicit NetworkConfigurationPolicyHandler(const char* policy_name,
                                             ::onc::ONCSource onc_source,
                                             const char* pref_path);

  // Takes network policy in Value representation and produces an output Value
  // that contains a pretty-printed and sanitized version. In particular, we
  // remove any Passphrases that may be contained in the JSON. Ownership of the
  // return value is transferred to the caller.
  static std::optional<base::Value> SanitizeNetworkConfig(
      const base::Value* config);

  // The kind of ONC source that this handler represents. ONCSource
  // distinguishes between user and device policy.
  const ::onc::ONCSource onc_source_;

  // The name of the pref to apply the policy to.
  const char* pref_path_;
};

// Maps the PinnedLauncherApps policy to the corresponding pref. List entries
// may be Android app ids or extension ids.
class PinnedLauncherAppsPolicyHandler : public ListPolicyHandler {
 public:
  PinnedLauncherAppsPolicyHandler();

  PinnedLauncherAppsPolicyHandler(const PinnedLauncherAppsPolicyHandler&) =
      delete;
  PinnedLauncherAppsPolicyHandler& operator=(
      const PinnedLauncherAppsPolicyHandler&) = delete;

  ~PinnedLauncherAppsPolicyHandler() override;

 protected:
  // ListPolicyHandler methods:

  // Returns true if |value| contains an Android app id (using a heuristic) or
  // an extension id.
  bool CheckListEntry(const base::Value& value) override;

  // Converts the list of strings |filtered_list| to a list of dictionaries and
  // sets the pref.
  void ApplyList(base::Value::List filtered_list, PrefValueMap* prefs) override;
};

// Maps the DefaultHandlersForFileExtensions policy to the corresponding pref.
class DefaultHandlersForFileExtensionsPolicyHandler
    : public SchemaValidatingPolicyHandler {
 public:
  explicit DefaultHandlersForFileExtensionsPolicyHandler(const policy::Schema&);

  // SchemaValidatingPolicyHandler:
  bool CheckPolicySettings(const PolicyMap& policies,
                           PolicyErrorMap* errors) override;
  void ApplyPolicySettings(const PolicyMap& policies,
                           PrefValueMap* prefs) override;

  bool IsValidPolicyId(std::string_view policy_id) const;
};

class ScreenMagnifierPolicyHandler : public IntRangePolicyHandlerBase {
 public:
  ScreenMagnifierPolicyHandler();

  ScreenMagnifierPolicyHandler(const ScreenMagnifierPolicyHandler&) = delete;
  ScreenMagnifierPolicyHandler& operator=(const ScreenMagnifierPolicyHandler&) =
      delete;

  ~ScreenMagnifierPolicyHandler() override;

  // IntRangePolicyHandlerBase:
  void ApplyPolicySettings(const PolicyMap& policies,
                           PrefValueMap* prefs) override;
};

// Policy handler for login screen power management settings. This does not
// actually set any prefs, it just checks whether the settings are valid and
// generates errors if appropriate.
class LoginScreenPowerManagementPolicyHandler
    : public SchemaValidatingPolicyHandler {
 public:
  explicit LoginScreenPowerManagementPolicyHandler(const Schema& chrome_schema);

  LoginScreenPowerManagementPolicyHandler(
      const LoginScreenPowerManagementPolicyHandler&) = delete;
  LoginScreenPowerManagementPolicyHandler& operator=(
      const LoginScreenPowerManagementPolicyHandler&) = delete;

  ~LoginScreenPowerManagementPolicyHandler() override;

  // SchemaValidatingPolicyHandler:
  void ApplyPolicySettings(const PolicyMap& policies,
                           PrefValueMap* prefs) override;
};

// Handles the deprecated IdleAction policy, so both kIdleActionBattery and
// kIdleActionAC fall back to the deprecated action.
class DeprecatedIdleActionHandler : public IntRangePolicyHandlerBase {
 public:
  DeprecatedIdleActionHandler();

  DeprecatedIdleActionHandler(const DeprecatedIdleActionHandler&) = delete;
  DeprecatedIdleActionHandler& operator=(const DeprecatedIdleActionHandler&) =
      delete;

  ~DeprecatedIdleActionHandler() override;

  // IntRangePolicyHandlerBase:
  void ApplyPolicySettings(const PolicyMap& policies,
                           PrefValueMap* prefs) override;
};

class PowerManagementIdleSettingsPolicyHandler
    : public SchemaValidatingPolicyHandler {
 public:
  explicit PowerManagementIdleSettingsPolicyHandler(
      const Schema& chrome_schema);

  PowerManagementIdleSettingsPolicyHandler(
      const PowerManagementIdleSettingsPolicyHandler&) = delete;
  PowerManagementIdleSettingsPolicyHandler& operator=(
      const PowerManagementIdleSettingsPolicyHandler&) = delete;

  ~PowerManagementIdleSettingsPolicyHandler() override;

  // SchemaValidatingPolicyHandler:
  void ApplyPolicySettings(const PolicyMap& policies,
                           PrefValueMap* prefs) override;
};

class ScreenLockDelayPolicyHandler : public SchemaValidatingPolicyHandler {
 public:
  explicit ScreenLockDelayPolicyHandler(const Schema& chrome_schema);

  ScreenLockDelayPolicyHandler(const ScreenLockDelayPolicyHandler&) = delete;
  ScreenLockDelayPolicyHandler& operator=(const ScreenLockDelayPolicyHandler&) =
      delete;

  ~ScreenLockDelayPolicyHandler() override;

  // SchemaValidatingPolicyHandler:
  void ApplyPolicySettings(const PolicyMap& policies,
                           PrefValueMap* prefs) override;
};

class ScreenBrightnessPercentPolicyHandler
    : public SchemaValidatingPolicyHandler {
 public:
  explicit ScreenBrightnessPercentPolicyHandler(const Schema& chrome_schema);

  ScreenBrightnessPercentPolicyHandler(
      const ScreenBrightnessPercentPolicyHandler&) = delete;
  ScreenBrightnessPercentPolicyHandler& operator=(
      const ScreenBrightnessPercentPolicyHandler&) = delete;

  ~ScreenBrightnessPercentPolicyHandler() override;

  // SchemaValidatingPolicyHandler:
  void ApplyPolicySettings(const PolicyMap& policies,
                           PrefValueMap* prefs) override;
};

// Supported values for the |ArcBackupRestoreServiceEnabled| and
// |ArcGoogleLocationServicesEnabled| policies.
enum class ArcServicePolicyValue {
  kDisabled = 0,
  kUnderUserControl = 1,
  kEnabled = 2
};

// Instantiated once each for the |ArcBackupRestoreServiceEnabled| and
// |ArcGoogleLocationServicesEnabled| policies to handle their special logic:
// If the policy is set to |kUnderUserControl|, the pref is unmanaged, as if no
// policy was set.
class ArcServicePolicyHandler : public IntRangePolicyHandlerBase {
 public:
  ArcServicePolicyHandler(const char* policy, const char* pref);

  ArcServicePolicyHandler(const ArcServicePolicyHandler&) = delete;
  ArcServicePolicyHandler& operator=(const ArcServicePolicyHandler&) = delete;

  // IntRangePolicyHandlerBase:
  void ApplyPolicySettings(const PolicyMap& policies,
                           PrefValueMap* prefs) override;

 private:
  const std::string pref_;
};

// Instantiated for the `ArcGoogleLocationServicesEnabled` policy. This
// overrides the old handling of the `ArcGoogleLocationServicesEnabled` policy
// when the Privacy Hub location is rolled out.
class ArcLocationServicePolicyHandler : public ArcServicePolicyHandler {
 public:
  explicit ArcLocationServicePolicyHandler(const char* policy,
                                           const char* pref);

  ArcLocationServicePolicyHandler(const ArcLocationServicePolicyHandler&) =
      delete;
  ArcLocationServicePolicyHandler& operator=(
      const ArcLocationServicePolicyHandler&) = delete;

  // IntRangePolicyHandlerBase:
  void ApplyPolicySettings(const PolicyMap& policies,
                           PrefValueMap* prefs) override;
};

// Maps Chrome Compose policy into ChromeOS Orca settings
class HelpMeWritePolicyHandler : public IntRangePolicyHandlerBase {
 public:
  enum class HelpMeWritePolicyValue {
    kEnabledWithModelImprovement = 0,
    kEnabledWithoutModelImprovement = 1,
    kDisabled = 2,
  };

  HelpMeWritePolicyHandler();

  HelpMeWritePolicyHandler(const HelpMeWritePolicyHandler&) = delete;
  HelpMeWritePolicyHandler& operator=(const HelpMeWritePolicyHandler&) = delete;

  ~HelpMeWritePolicyHandler() override = default;

  // IntRangePolicyHandlerBase:
  void ApplyPolicySettings(const PolicyMap& policies,
                           PrefValueMap* prefs) override;
};

}  // namespace policy

#endif  // CHROME_BROWSER_ASH_POLICY_HANDLERS_CONFIGURATION_POLICY_HANDLER_ASH_H_