blob: e8f8d02156cc25f9afa0b7a3dda77d599211b82c [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/download/download_auto_open_policy_handler.h"
#include "build/build_config.h"
#include "chrome/common/pref_names.h"
#include "components/policy/core/browser/policy_error_map.h"
#include "components/policy/core/common/policy_map.h"
#include "components/policy/policy_constants.h"
#include "components/prefs/pref_value_map.h"
#include "components/strings/grit/components_strings.h"
DownloadAutoOpenPolicyHandler::DownloadAutoOpenPolicyHandler(
const policy::Schema& chrome_schema)
: SchemaValidatingPolicyHandler(
policy::key::kAutoOpenFileTypes,
chrome_schema.GetKnownProperty(policy::key::kAutoOpenFileTypes),
policy::SCHEMA_ALLOW_UNKNOWN) {}
DownloadAutoOpenPolicyHandler::~DownloadAutoOpenPolicyHandler() = default;
bool DownloadAutoOpenPolicyHandler::CheckPolicySettings(
const policy::PolicyMap& policies,
policy::PolicyErrorMap* errors) {
std::unique_ptr<base::Value> policy_value;
if (!CheckAndGetValue(policies, nullptr, &policy_value) || !policy_value ||
!policy_value->is_list())
return false;
const base::Value::List& policy_list = policy_value->GetList();
for (size_t i = 0; i < policy_list.size(); ++i) {
const std::string extension = policy_list[i].GetString();
// If it's empty or malformed, then mark it as an error.
if (extension.empty() ||
*extension.begin() == base::FilePath::kExtensionSeparator) {
errors->AddError(policy::key::kAutoOpenFileTypes,
IDS_POLICY_INVALID_FILE_EXTENSION_ERROR,
policy::PolicyErrorPath{i});
}
}
// Always continue to ApplyPolicySettings which can remove invalid values and
// apply the valid ones.
return true;
}
void DownloadAutoOpenPolicyHandler::ApplyPolicySettings(
const policy::PolicyMap& policies,
PrefValueMap* prefs_value_map) {
std::unique_ptr<base::Value> policy_value;
if (!CheckAndGetValue(policies, nullptr, &policy_value) || !policy_value)
return;
DCHECK(policy_value->is_list());
base::Value::List pref_values;
for (const auto& entry : policy_value->GetList()) {
const std::string extension = entry.GetString();
// If it's empty or malformed, then skip the entry.
if (extension.empty() ||
*extension.begin() == base::FilePath::kExtensionSeparator) {
continue;
}
pref_values.Append(extension);
}
prefs_value_map->SetValue(prefs::kDownloadExtensionsToOpenByPolicy,
base::Value(std::move(pref_values)));
}