Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Side by Side Diff: chrome/browser/plugins/chrome_plugin_service_filter.cc

Issue 12086077: Only permit plug-in loads in the browser if the plug-in isn't blocked or the (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/plugins/chrome_plugin_service_filter.h" 5 #include "chrome/browser/plugins/chrome_plugin_service_filter.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/utf_string_conversions.h" 8 #include "base/utf_string_conversions.h"
9 #include "chrome/browser/plugins/plugin_metadata.h" 9 #include "chrome/browser/plugins/plugin_metadata.h"
10 #include "chrome/browser/plugins/plugin_prefs.h" 10 #include "chrome/browser/plugins/plugin_prefs.h"
(...skipping 26 matching lines...) Expand all
37 const void* context) { 37 const void* context) {
38 base::AutoLock lock(lock_); 38 base::AutoLock lock(lock_);
39 resource_context_map_.erase(context); 39 resource_context_map_.erase(context);
40 } 40 }
41 41
42 void ChromePluginServiceFilter::OverridePluginForTab( 42 void ChromePluginServiceFilter::OverridePluginForTab(
43 int render_process_id, 43 int render_process_id,
44 int render_view_id, 44 int render_view_id,
45 const GURL& url, 45 const GURL& url,
46 const webkit::WebPluginInfo& plugin) { 46 const webkit::WebPluginInfo& plugin) {
47 base::AutoLock auto_lock(lock_);
48 ProcessDetails* details = GetOrRegisterProcess(render_process_id);
47 OverriddenPlugin overridden_plugin; 49 OverriddenPlugin overridden_plugin;
48 overridden_plugin.render_process_id = render_process_id;
49 overridden_plugin.render_view_id = render_view_id; 50 overridden_plugin.render_view_id = render_view_id;
50 overridden_plugin.url = url; 51 overridden_plugin.url = url;
51 overridden_plugin.plugin = plugin; 52 overridden_plugin.plugin = plugin;
52 base::AutoLock auto_lock(lock_); 53 details->overridden_plugins.push_back(overridden_plugin);
53 overridden_plugins_.push_back(overridden_plugin);
54 } 54 }
55 55
56 void ChromePluginServiceFilter::RestrictPluginToProfileAndOrigin( 56 void ChromePluginServiceFilter::RestrictPluginToProfileAndOrigin(
57 const FilePath& plugin_path, 57 const FilePath& plugin_path,
58 Profile* profile, 58 Profile* profile,
59 const GURL& origin) { 59 const GURL& origin) {
60 base::AutoLock auto_lock(lock_); 60 base::AutoLock auto_lock(lock_);
61 restricted_plugins_[plugin_path] = 61 restricted_plugins_[plugin_path] =
62 std::make_pair(PluginPrefs::GetForProfile(profile), 62 std::make_pair(PluginPrefs::GetForProfile(profile),
63 origin); 63 origin);
64 } 64 }
65 65
66 void ChromePluginServiceFilter::UnrestrictPlugin( 66 void ChromePluginServiceFilter::UnrestrictPlugin(
67 const FilePath& plugin_path) { 67 const FilePath& plugin_path) {
68 base::AutoLock auto_lock(lock_); 68 base::AutoLock auto_lock(lock_);
69 restricted_plugins_.erase(plugin_path); 69 restricted_plugins_.erase(plugin_path);
70 } 70 }
71 71
72 bool ChromePluginServiceFilter::ShouldUsePlugin( 72 bool ChromePluginServiceFilter::IsPluginEnabled(
73 int render_process_id, 73 int render_process_id,
74 int render_view_id, 74 int render_view_id,
75 const void* context, 75 const void* context,
76 const GURL& url, 76 const GURL& url,
77 const GURL& policy_url, 77 const GURL& policy_url,
78 webkit::WebPluginInfo* plugin) { 78 webkit::WebPluginInfo* plugin) {
79 base::AutoLock auto_lock(lock_); 79 base::AutoLock auto_lock(lock_);
80 const ProcessDetails* details = GetProcess(render_process_id);
81
80 // Check whether the plugin is overridden. 82 // Check whether the plugin is overridden.
81 for (size_t i = 0; i < overridden_plugins_.size(); ++i) { 83 if (details) {
82 if (overridden_plugins_[i].render_process_id == render_process_id && 84 for (size_t i = 0; i < details->overridden_plugins.size(); ++i) {
83 overridden_plugins_[i].render_view_id == render_view_id && 85 if (details->overridden_plugins[i].render_view_id == render_view_id &&
84 (overridden_plugins_[i].url == url || 86 (details->overridden_plugins[i].url == url ||
85 overridden_plugins_[i].url.is_empty())) { 87 details->overridden_plugins[i].url.is_empty())) {
86 88
87 bool use = overridden_plugins_[i].plugin.path == plugin->path; 89 bool use = details->overridden_plugins[i].plugin.path == plugin->path;
88 if (use) 90 if (!use)
89 *plugin = overridden_plugins_[i].plugin; 91 return false;
90 return use; 92 *plugin = details->overridden_plugins[i].plugin;
93 break;
Bernhard Bauer 2013/02/04 13:58:53 Wait, this might not be quite right. If |use| is t
94 }
91 } 95 }
92 } 96 }
93 97
94 // Check whether the plugin is disabled. 98 // Check whether the plugin is disabled.
95 ResourceContextMap::iterator prefs_it = 99 ResourceContextMap::iterator prefs_it =
96 resource_context_map_.find(context); 100 resource_context_map_.find(context);
97 if (prefs_it == resource_context_map_.end()) 101 if (prefs_it == resource_context_map_.end())
98 return false; 102 return false;
99 103
100 PluginPrefs* plugin_prefs = prefs_it->second.get(); 104 PluginPrefs* plugin_prefs = prefs_it->second.get();
(...skipping 11 matching lines...) Expand all
112 (policy_url.scheme() != origin.scheme() || 116 (policy_url.scheme() != origin.scheme() ||
113 policy_url.host() != origin.host() || 117 policy_url.host() != origin.host() ||
114 policy_url.port() != origin.port())) { 118 policy_url.port() != origin.port())) {
115 return false; 119 return false;
116 } 120 }
117 } 121 }
118 122
119 return true; 123 return true;
120 } 124 }
121 125
126 bool ChromePluginServiceFilter::CanLoadPlugin(int render_process_id,
127 const FilePath& path) {
128 // The browser itself sometimes loads plug-ins to e.g. clear plug-in data.
129 // We always grant the browser permission.
130 if (!render_process_id)
131 return true;
132
133 base::AutoLock auto_lock(lock_);
134 const ProcessDetails* details = GetProcess(render_process_id);
135 if (!details)
136 return false;
137
138 if (details->authorized_plugins.find(path) ==
139 details->authorized_plugins.end() &&
140 details->authorized_plugins.find(FilePath()) ==
141 details->authorized_plugins.end()) {
142 return false;
143 }
144
145 return true;
146 }
147
148 void ChromePluginServiceFilter::AuthorizePlugin(int render_process_id,
149 const FilePath& plugin_path) {
150 base::AutoLock auto_lock(lock_);
151 ProcessDetails* details = GetOrRegisterProcess(render_process_id);
152 details->authorized_plugins.insert(plugin_path);
153 }
154
155 void ChromePluginServiceFilter::AuthorizeAllPlugins(int render_process_id) {
156 AuthorizePlugin(render_process_id, FilePath());
157 }
158
122 ChromePluginServiceFilter::ChromePluginServiceFilter() { 159 ChromePluginServiceFilter::ChromePluginServiceFilter() {
123 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
124 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, 161 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
125 content::NotificationService::AllSources()); 162 content::NotificationService::AllSources());
126 registrar_.Add(this, chrome::NOTIFICATION_PLUGIN_ENABLE_STATUS_CHANGED, 163 registrar_.Add(this, chrome::NOTIFICATION_PLUGIN_ENABLE_STATUS_CHANGED,
127 content::NotificationService::AllSources()); 164 content::NotificationService::AllSources());
128 } 165 }
129 166
130 ChromePluginServiceFilter::~ChromePluginServiceFilter() { 167 ChromePluginServiceFilter::~ChromePluginServiceFilter() {
131 } 168 }
132 169
133 void ChromePluginServiceFilter::Observe( 170 void ChromePluginServiceFilter::Observe(
134 int type, 171 int type,
135 const content::NotificationSource& source, 172 const content::NotificationSource& source,
136 const content::NotificationDetails& details) { 173 const content::NotificationDetails& details) {
137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 174 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
138 switch (type) { 175 switch (type) {
139 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: { 176 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: {
140 int render_process_id = 177 int render_process_id =
141 content::Source<content::RenderProcessHost>(source).ptr()->GetID(); 178 content::Source<content::RenderProcessHost>(source).ptr()->GetID();
142 179
143 base::AutoLock auto_lock(lock_); 180 base::AutoLock auto_lock(lock_);
144 for (size_t i = 0; i < overridden_plugins_.size(); ++i) { 181 plugin_details_.erase(render_process_id);
145 if (overridden_plugins_[i].render_process_id == render_process_id) {
146 overridden_plugins_.erase(overridden_plugins_.begin() + i);
147 break;
148 }
149 }
150 break; 182 break;
151 } 183 }
152 case chrome::NOTIFICATION_PLUGIN_ENABLE_STATUS_CHANGED: { 184 case chrome::NOTIFICATION_PLUGIN_ENABLE_STATUS_CHANGED: {
153 Profile* profile = content::Source<Profile>(source).ptr(); 185 Profile* profile = content::Source<Profile>(source).ptr();
154 PluginService::GetInstance()->PurgePluginListCache(profile, false); 186 PluginService::GetInstance()->PurgePluginListCache(profile, false);
155 if (profile && profile->HasOffTheRecordProfile()) { 187 if (profile && profile->HasOffTheRecordProfile()) {
156 PluginService::GetInstance()->PurgePluginListCache( 188 PluginService::GetInstance()->PurgePluginListCache(
157 profile->GetOffTheRecordProfile(), false); 189 profile->GetOffTheRecordProfile(), false);
158 } 190 }
159 break; 191 break;
160 } 192 }
161 default: { 193 default: {
162 NOTREACHED(); 194 NOTREACHED();
163 } 195 }
164 } 196 }
165 } 197 }
198
199 ChromePluginServiceFilter::ProcessDetails*
200 ChromePluginServiceFilter::GetOrRegisterProcess(
201 int render_process_id) {
202 return &plugin_details_[render_process_id];
203 }
204
205 const ChromePluginServiceFilter::ProcessDetails*
206 ChromePluginServiceFilter::GetProcess(
207 int render_process_id) const {
208 std::map<int, ProcessDetails>::const_iterator it =
209 plugin_details_.find(render_process_id);
210 if (it == plugin_details_.end())
211 return NULL;
212 return &it->second;
213 }
214
215 ChromePluginServiceFilter::OverriddenPlugin::OverriddenPlugin()
216 : render_view_id(MSG_ROUTING_NONE) {
217 }
218
219 ChromePluginServiceFilter::OverriddenPlugin::~OverriddenPlugin() {
220 }
221
222 ChromePluginServiceFilter::ProcessDetails::ProcessDetails() {
223 }
224
225 ChromePluginServiceFilter::ProcessDetails::~ProcessDetails() {
226 }
227
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698