blob: 9998f57ed0399d4a5c77a927da73da4f6de38ace [file] [log] [blame]
// Copyright 2016 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef AUTHPOLICY_POLICY_USER_POLICY_ENCODER_H_
#define AUTHPOLICY_POLICY_USER_POLICY_ENCODER_H_
#include <vector>
#include <base/bind.h>
#include <components/policy/core/common/policy_types.h>
namespace enterprise_management {
class PolicyOptions;
class BooleanPolicyProto;
class IntegerPolicyProto;
class StringPolicyProto;
class StringListPolicyProto;
class CloudPolicySettings;
} // namespace enterprise_management
namespace policy {
class RegistryDict;
struct BooleanPolicyAccess;
struct IntegerPolicyAccess;
struct StringPolicyAccess;
struct StringListPolicyAccess;
// Private helper class used to convert a RegistryDict into a user policy
// protobuf. Don't include directly, use |preg_policy_encoder.h| instead.
class UserPolicyEncoder {
public:
UserPolicyEncoder(const RegistryDict* dict, PolicyLevel level);
// Toggles logging of policy values.
void LogPolicyValues(bool enabled) { log_policy_values_ = enabled; }
// Extracts all user policies from |dict_| and puts them into |policy|.
void EncodePolicy(enterprise_management::CloudPolicySettings* policy) const;
private:
// Marks a policy recommended or mandatory.
void SetPolicyOptions(enterprise_management::PolicyOptions* options) const;
// Gets a PolicyLevel as string.
const char* GetLevelStr() const;
// Boolean policies.
void EncodeBoolean(enterprise_management::CloudPolicySettings* policy,
const BooleanPolicyAccess* access) const;
// Integer policies.
void EncodeInteger(enterprise_management::CloudPolicySettings* policy,
const IntegerPolicyAccess* access) const;
// String policies.
void EncodeString(enterprise_management::CloudPolicySettings* policy,
const StringPolicyAccess* access) const;
// String list policies are a little different. Unlike the basic types they
// are not stored as registry value, but as registry key with values 1, 2, ...
// for the entries.
void EncodeStringList(enterprise_management::CloudPolicySettings* policy,
const StringListPolicyAccess* access) const;
private:
// Template for the Encode*() methods above, to be passed into EncodeList().
template <typename T_Access>
using Encoder = void (UserPolicyEncoder::*)(
enterprise_management::CloudPolicySettings* policy,
const T_Access* access) const;
// Encodes all policies of one of the types above. |access| is a pointer to a
// NULL-terminated list of policies of a certain type from policy_constants.h.
// |encode| is a pointer to one of the encoders above, e.g.
// &UserPolicyEncoder::EncodeBoolean.
template <typename T_Access>
void EncodeList(enterprise_management::CloudPolicySettings* policy,
const T_Access* access,
Encoder<T_Access> encode) const;
const RegistryDict* dict_ = nullptr;
PolicyLevel level_ = POLICY_LEVEL_MANDATORY;
bool log_policy_values_ = false;
};
} // namespace policy
#endif // AUTHPOLICY_POLICY_USER_POLICY_ENCODER_H_