| Index: chrome/browser/extensions/api/messaging/native_messaging_policy_handler.cc
|
| diff --git a/chrome/browser/extensions/api/messaging/native_messaging_policy_handler.cc b/chrome/browser/extensions/api/messaging/native_messaging_policy_handler.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5c382d3a45010f1909b7232ee484d05ce1e6790b
|
| --- /dev/null
|
| +++ b/chrome/browser/extensions/api/messaging/native_messaging_policy_handler.cc
|
| @@ -0,0 +1,93 @@
|
| +// Copyright 2013 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 "chrome/browser/extensions/api/messaging/native_messaging_policy_handler.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/prefs/pref_value_map.h"
|
| +#include "chrome/browser/extensions/api/messaging/native_messaging_host_manifest.h"
|
| +#include "chrome/browser/extensions/external_policy_loader.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 "grit/component_strings.h"
|
| +#include "policy/policy_constants.h"
|
| +
|
| +namespace extensions {
|
| +
|
| +NativeMessagingHostListPolicyHandler::NativeMessagingHostListPolicyHandler(
|
| + const char* policy_name,
|
| + const char* pref_path,
|
| + bool allow_wildcards)
|
| + : policy::TypeCheckingPolicyHandler(policy_name, base::Value::TYPE_LIST),
|
| + pref_path_(pref_path),
|
| + allow_wildcards_(allow_wildcards) {}
|
| +
|
| +NativeMessagingHostListPolicyHandler::~NativeMessagingHostListPolicyHandler() {}
|
| +
|
| +bool NativeMessagingHostListPolicyHandler::CheckPolicySettings(
|
| + const policy::PolicyMap& policies,
|
| + policy::PolicyErrorMap* errors) {
|
| + return CheckAndGetList(policies, errors, NULL);
|
| +}
|
| +
|
| +void NativeMessagingHostListPolicyHandler::ApplyPolicySettings(
|
| + const policy::PolicyMap& policies,
|
| + PrefValueMap* prefs) {
|
| + scoped_ptr<base::ListValue> list;
|
| + policy::PolicyErrorMap errors;
|
| + if (CheckAndGetList(policies, &errors, &list) && list)
|
| + prefs->SetValue(pref_path(), list.release());
|
| +}
|
| +
|
| +const char* NativeMessagingHostListPolicyHandler::pref_path() const {
|
| + return pref_path_;
|
| +}
|
| +
|
| +bool NativeMessagingHostListPolicyHandler::CheckAndGetList(
|
| + const policy::PolicyMap& policies,
|
| + policy::PolicyErrorMap* errors,
|
| + scoped_ptr<base::ListValue>* names) {
|
| + const base::Value* value = NULL;
|
| + if (!CheckAndGetValue(policies, errors, &value))
|
| + return false;
|
| +
|
| + if (!value)
|
| + return true;
|
| +
|
| + const base::ListValue* list_value = NULL;
|
| + if (!value->GetAsList(&list_value)) {
|
| + NOTREACHED();
|
| + return false;
|
| + }
|
| +
|
| + // Filter the list, rejecting any invalid native messaging host names.
|
| + scoped_ptr<base::ListValue> filtered_list(new base::ListValue());
|
| + for (base::ListValue::const_iterator entry(list_value->begin());
|
| + entry != list_value->end(); ++entry) {
|
| + std::string name;
|
| + if (!(*entry)->GetAsString(&name)) {
|
| + errors->AddError(policy_name(),
|
| + entry - list_value->begin(),
|
| + IDS_POLICY_TYPE_ERROR,
|
| + ValueTypeToString(base::Value::TYPE_STRING));
|
| + continue;
|
| + }
|
| + if (!(allow_wildcards_ && name == "*") &&
|
| + !NativeMessagingHostManifest::IsValidName(name)) {
|
| + errors->AddError(policy_name(),
|
| + entry - list_value->begin(),
|
| + IDS_POLICY_VALUE_FORMAT_ERROR);
|
| + continue;
|
| + }
|
| + filtered_list->Append(new base::StringValue(name));
|
| + }
|
| +
|
| + if (names)
|
| + *names = filtered_list.Pass();
|
| +
|
| + return true;
|
| +}
|
| +
|
| +} // namespace extensions
|
|
|