blob: ffd2e822a8ad1d3e7d96e38a8a42530b6c6e922c [file] [log] [blame]
pastarmovjc6c75ce2016-10-17 19:21:101// Copyright (c) 2012 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 "chrome/browser/plugins/plugin_policy_handler.h"
6
7#include <string>
8
Avi Drissman5f0fb8c2018-12-25 23:20:499#include "base/stl_util.h"
pastarmovjc6c75ce2016-10-17 19:21:1010#include "base/strings/pattern.h"
11#include "base/strings/string_util.h"
12#include "base/values.h"
pastarmovj9823e58a2016-11-16 14:18:1313#include "chrome/browser/plugins/plugin_metadata.h"
pastarmovjc6c75ce2016-10-17 19:21:1014#include "chrome/browser/plugins/plugin_prefs.h"
15#include "chrome/common/chrome_content_client.h"
16#include "chrome/common/pref_names.h"
17#include "components/content_settings/core/common/pref_names.h"
18#include "components/policy/core/browser/policy_error_map.h"
19#include "components/strings/grit/components_strings.h"
20#include "content/public/common/content_constants.h"
21
22namespace {
23
pastarmovjc6c75ce2016-10-17 19:21:1024// Retrieves a list typed policy or nullptr if not present or not a list.
25const base::ListValue* GetListPolicy(const policy::PolicyMap& policies,
26 const std::string& policy) {
27 const base::Value* value = policies.GetValue(policy);
28 if (!value)
29 return nullptr;
30
31 const base::ListValue* policy_value = nullptr;
32 value->GetAsList(&policy_value);
33 return policy_value;
34}
35
36} // namespace
37
38PluginPolicyHandler::PluginPolicyHandler() {}
39
40PluginPolicyHandler::~PluginPolicyHandler() {}
41
42void PluginPolicyHandler::ProcessPolicy(const policy::PolicyMap& policies,
43 PrefValueMap* prefs,
44 const std::string& policy,
45 bool disable_pdf_plugin,
46 ContentSetting flash_content_setting) {
47 const base::ListValue* plugins = GetListPolicy(policies, policy);
48 if (!plugins)
49 return;
50
51 const int size = plugins->GetSize();
52 for (int i = 0; i < size; ++i) {
53 std::string plugin;
54 if (!plugins->GetString(i, &plugin))
55 continue;
Lucas Furukawa Gadanie67d6032017-06-02 20:32:5256 if ((base::MatchPattern(ChromeContentClient::kPDFExtensionPluginName,
57 plugin) ||
58 base::MatchPattern(ChromeContentClient::kPDFInternalPluginName,
59 plugin)) &&
pastarmovjc6c75ce2016-10-17 19:21:1060 !policies.GetValue(policy::key::kAlwaysOpenPdfExternally)) {
jdoerrie239723572017-03-02 12:09:1961 prefs->SetValue(prefs::kPluginsAlwaysOpenPdfExternally,
Sylvain Defresne47ea2732019-01-30 18:21:3762 base::Value(disable_pdf_plugin));
pastarmovjc6c75ce2016-10-17 19:21:1063 }
pastarmovj9823e58a2016-11-16 14:18:1364 if ((base::MatchPattern(
65 PluginMetadata::kAdobeFlashPlayerGroupName, plugin) ||
pastarmovjc6c75ce2016-10-17 19:21:1066 base::MatchPattern(content::kFlashPluginName, plugin)) &&
67 !policies.GetValue(policy::key::kDefaultPluginsSetting)) {
jdoerrie239723572017-03-02 12:09:1968 prefs->SetValue(prefs::kManagedDefaultPluginsSetting,
Sylvain Defresne47ea2732019-01-30 18:21:3769 base::Value(flash_content_setting));
pastarmovjc6c75ce2016-10-17 19:21:1070 }
71 }
72}
73
74bool PluginPolicyHandler::CheckPolicySettings(const policy::PolicyMap& policies,
75 policy::PolicyErrorMap* errors) {
76 const std::string checked_policies[] = {
77 policy::key::kEnabledPlugins, policy::key::kDisabledPlugins,
78 policy::key::kDisabledPluginsExceptions};
79 bool ok = true;
Avi Drissman5f0fb8c2018-12-25 23:20:4980 for (size_t i = 0; i < base::size(checked_policies); ++i) {
pastarmovjc6c75ce2016-10-17 19:21:1081 const base::Value* value = policies.GetValue(checked_policies[i]);
jdoerrie1f536b22017-10-23 17:15:1182 if (value && !value->is_list()) {
pastarmovjc6c75ce2016-10-17 19:21:1083 errors->AddError(checked_policies[i], IDS_POLICY_TYPE_ERROR,
jdoerriedc72ee942016-12-07 15:43:2884 base::Value::GetTypeName(base::Value::Type::LIST));
pastarmovjc6c75ce2016-10-17 19:21:1085 ok = false;
86 }
87 }
88 return ok;
89}
90
91void PluginPolicyHandler::ApplyPolicySettings(const policy::PolicyMap& policies,
92 PrefValueMap* prefs) {
93 // This order makes enabled plugins take precedence as is now.
94 ProcessPolicy(policies, prefs, policy::key::kDisabledPlugins, true,
95 CONTENT_SETTING_BLOCK);
96 ProcessPolicy(policies, prefs, policy::key::kEnabledPlugins, false,
97 CONTENT_SETTING_ALLOW);
98
99 // Finally check if any of the two is in the exceptions list and remove the
100 // policy changes.
101 const base::ListValue* plugins =
102 GetListPolicy(policies, policy::key::kDisabledPluginsExceptions);
103 if (!plugins)
104 return;
105 const int size = plugins->GetSize();
106 for (int i = 0; i < size; ++i) {
107 std::string plugin;
108 if (!plugins->GetString(i, &plugin))
109 continue;
Lucas Furukawa Gadanie67d6032017-06-02 20:32:52110 if ((base::MatchPattern(ChromeContentClient::kPDFExtensionPluginName,
111 plugin) ||
112 base::MatchPattern(ChromeContentClient::kPDFInternalPluginName,
113 plugin)) &&
pastarmovjc6c75ce2016-10-17 19:21:10114 !policies.GetValue(policy::key::kAlwaysOpenPdfExternally)) {
115 prefs->RemoveValue(prefs::kPluginsAlwaysOpenPdfExternally);
116 }
pastarmovj9823e58a2016-11-16 14:18:13117 if ((base::MatchPattern(
118 PluginMetadata::kAdobeFlashPlayerGroupName, plugin) ||
pastarmovjc6c75ce2016-10-17 19:21:10119 base::MatchPattern(content::kFlashPluginName, plugin)) &&
120 !policies.GetValue(policy::key::kDefaultPluginsSetting)) {
121 prefs->RemoveValue(prefs::kManagedDefaultPluginsSetting);
122 }
123 }
124}