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

Side by Side Diff: chrome/renderer/chrome_content_renderer_client.cc

Issue 8301006: Packaged (CRX) extensions shouldn't be able to get 'dev' interfaces in NaCl. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 2 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/renderer/chrome_content_renderer_client.h" 5 #include "chrome/renderer/chrome_content_renderer_client.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 if (plugin_setting == CONTENT_SETTING_ALLOW || 410 if (plugin_setting == CONTENT_SETTING_ALLOW ||
411 host_setting == CONTENT_SETTING_ALLOW || 411 host_setting == CONTENT_SETTING_ALLOW ||
412 plugin.path.value() == webkit::npapi::kDefaultPluginLibraryName) { 412 plugin.path.value() == webkit::npapi::kDefaultPluginLibraryName) {
413 // Delay loading plugins if prerendering. 413 // Delay loading plugins if prerendering.
414 if (prerender::PrerenderHelper::IsPrerendering(render_view)) { 414 if (prerender::PrerenderHelper::IsPrerendering(render_view)) {
415 return CreatePluginPlaceholder( 415 return CreatePluginPlaceholder(
416 render_view, frame, plugin, params, group.get(), 416 render_view, frame, plugin, params, group.get(),
417 IDR_CLICK_TO_PLAY_PLUGIN_HTML, IDS_PLUGIN_LOAD, true, true); 417 IDR_CLICK_TO_PLAY_PLUGIN_HTML, IDS_PLUGIN_LOAD, true, true);
418 } 418 }
419 419
420 // Enforce the Chrome WebStore restriction on the Native Client plugin. 420 if (is_nacl_plugin &&
421 if (is_nacl_plugin) { 421 !IsNaClAllowed(plugin,
422 bool allow_nacl = cmd->HasSwitch(switches::kEnableNaCl); 422 url,
423 if (!allow_nacl) { 423 actual_mime_type,
424 const char* kNaClPluginMimeType = "application/x-nacl"; 424 cmd->HasSwitch(switches::kEnableNaCl),
425 const char* kNaClPluginManifestAttribute = "nacl"; 425 params)) {
426
427 GURL nexe_url;
428 if (actual_mime_type == kNaClPluginMimeType) {
429 nexe_url = url; // Normal embedded NaCl plugin.
430 } else {
431 // Content type handling NaCl plugin; the "nacl" param on the
432 // MIME type holds the nexe URL.
433 string16 nacl_attr = ASCIIToUTF16(kNaClPluginManifestAttribute);
434 for (size_t i = 0; i < plugin.mime_types.size(); ++i) {
435 if (plugin.mime_types[i].mime_type == actual_mime_type) {
436 const webkit::WebPluginMimeType& content_type =
437 plugin.mime_types[i];
438 for (size_t i = 0;
439 i < content_type.additional_param_names.size(); ++i) {
440 if (content_type.additional_param_names[i] == nacl_attr) {
441 nexe_url = GURL(content_type.additional_param_values[i]);
442 break;
443 }
444 }
445 break;
446 }
447 }
448 }
449
450 // Create the NaCl plugin only if the .nexe is part of an extension
451 // that was installed from the Chrome Web Store, or part of a component
452 // extension, or part of an unpacked extension.
453 const Extension* extension =
454 extension_dispatcher_->extensions()->GetByURL(nexe_url);
455 allow_nacl = extension &&
456 (extension->from_webstore() ||
457 extension->location() == Extension::COMPONENT ||
458 extension->location() == Extension::LOAD);
459 }
460
461 if (!allow_nacl) {
462 // TODO(bbudge) Webkit will crash if this is a full-frame plug-in and
463 // we return NULL. Prepare a patch to fix that, and return NULL here.
464 return CreatePluginPlaceholder( 426 return CreatePluginPlaceholder(
465 render_view, frame, plugin, params, group.get(), 427 render_view, frame, plugin, params, group.get(),
466 IDR_BLOCKED_PLUGIN_HTML, IDS_PLUGIN_BLOCKED, false, false); 428 IDR_BLOCKED_PLUGIN_HTML, IDS_PLUGIN_BLOCKED, false, false);
467 }
468 } 429 }
469 430
470 return render_view->CreatePlugin(frame, plugin, params); 431 return render_view->CreatePlugin(frame, plugin, params);
471 } 432 }
472 433
473 observer->DidBlockContentType(content_type, resource); 434 observer->DidBlockContentType(content_type, resource);
474 if (plugin_setting == CONTENT_SETTING_ASK) { 435 if (plugin_setting == CONTENT_SETTING_ASK) {
475 RenderThread::Get()->RecordUserMetrics("Plugin_ClickToPlay"); 436 RenderThread::Get()->RecordUserMetrics("Plugin_ClickToPlay");
476 return CreatePluginPlaceholder( 437 return CreatePluginPlaceholder(
477 render_view, frame, plugin, params, group.get(), 438 render_view, frame, plugin, params, group.get(),
478 IDR_CLICK_TO_PLAY_PLUGIN_HTML, IDS_PLUGIN_LOAD, false, true); 439 IDR_CLICK_TO_PLAY_PLUGIN_HTML, IDS_PLUGIN_LOAD, false, true);
479 } else { 440 } else {
480 RenderThread::Get()->RecordUserMetrics("Plugin_Blocked"); 441 RenderThread::Get()->RecordUserMetrics("Plugin_Blocked");
481 return CreatePluginPlaceholder( 442 return CreatePluginPlaceholder(
482 render_view, frame, plugin, params, group.get(), 443 render_view, frame, plugin, params, group.get(),
483 IDR_BLOCKED_PLUGIN_HTML, IDS_PLUGIN_BLOCKED, false, true); 444 IDR_BLOCKED_PLUGIN_HTML, IDS_PLUGIN_BLOCKED, false, true);
484 } 445 }
485 } 446 }
486 447
448 bool ChromeContentRendererClient::IsNaClAllowed(
449 const webkit::WebPluginInfo& plugin,
450 const GURL& url,
451 const std::string& actual_mime_type,
452 bool enable_nacl,
453 WebKit::WebPluginParams& params) {
454 const char* kNaClPluginMimeType = "application/x-nacl";
455 const char* kNaClPluginManifestAttribute = "nacl";
456
457 GURL manifest_url;
458 if (actual_mime_type == kNaClPluginMimeType) {
459 manifest_url = url; // Normal embedded NaCl plugin.
460 } else {
461 // Content type handling NaCl plugin; the "nacl" param on the
sehr 2011/10/17 22:45:52 nacl param is on the plugin, not the MIME type.
bbudge 2011/10/17 22:56:05 Fixed the comment. It's a bit confusing. This isn'
462 // MIME type holds the nexe URL.
463 string16 nacl_attr = ASCIIToUTF16(kNaClPluginManifestAttribute);
464 for (size_t i = 0; i < plugin.mime_types.size(); ++i) {
465 if (plugin.mime_types[i].mime_type == actual_mime_type) {
466 const webkit::WebPluginMimeType& content_type =
467 plugin.mime_types[i];
468 for (size_t i = 0;
469 i < content_type.additional_param_names.size(); ++i) {
470 if (content_type.additional_param_names[i] == nacl_attr) {
471 manifest_url = GURL(content_type.additional_param_values[i]);
472 break;
473 }
474 }
475 break;
476 }
477 }
478 }
479
480 // Determine if the manifest URL is part of an extension.
481 const Extension* extension =
482 extension_dispatcher_->extensions()->GetByURL(manifest_url);
483 // Only component, unpacked, and Chrome Web Store extensions are allowed.
484 bool allowed_extension = extension &&
485 (extension->from_webstore() ||
486 extension->location() == Extension::COMPONENT ||
487 extension->location() == Extension::LOAD);
488
489 // Block any other use of NaCl plugin, unless --enable-nacl is set.
490 if (!allowed_extension && !enable_nacl)
491 return false;
492
493 // Allow dev interfaces for non-extension apps.
494 bool allow_dev_interfaces = true;
495 if (allowed_extension) {
496 // Allow dev interfaces for component and unpacked extensions.
497 if (extension->location() != Extension::COMPONENT &&
498 extension->location() != Extension::LOAD) {
499 // Whitelist all other allowed extensions.
500 allow_dev_interfaces =
501 // PDF Viewer plugin
502 (manifest_url.scheme() == "chrome-extension" &&
503 manifest_url.host() == "acadkphlmlegjaadjagenfimbpphcgnh");
504 }
505 }
506
507 WebString dev_attribute = WebString::fromUTF8("@dev");
508 if (allow_dev_interfaces) {
509 std::vector<string16> param_names;
510 std::vector<string16> param_values;
511 param_names.push_back(dev_attribute);
512 param_values.push_back(WebString());
513 AppendParams(
514 param_names,
515 param_values,
516 &params.attributeNames,
517 &params.attributeValues);
518 } else {
519 // If the params somehow contain this special attribute, remove it.
520 size_t attribute_count = params.attributeNames.size();
521 for (size_t i = 0; i < attribute_count; ++i) {
522 if (params.attributeNames[i].equals(dev_attribute))
523 params.attributeNames[i] = WebString();
524 }
525 }
526
527 return true;
528 }
529
487 WebPlugin* ChromeContentRendererClient::CreatePluginPlaceholder( 530 WebPlugin* ChromeContentRendererClient::CreatePluginPlaceholder(
488 content::RenderView* render_view, 531 content::RenderView* render_view,
489 WebFrame* frame, 532 WebFrame* frame,
490 const webkit::WebPluginInfo& plugin, 533 const webkit::WebPluginInfo& plugin,
491 const WebPluginParams& params, 534 const WebPluginParams& params,
492 const webkit::npapi::PluginGroup* group, 535 const webkit::npapi::PluginGroup* group,
493 int resource_id, 536 int resource_id,
494 int message_id, 537 int message_id,
495 bool is_blocked_for_prerendering, 538 bool is_blocked_for_prerendering,
496 bool allow_loading) { 539 bool allow_loading) {
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
779 if (spellcheck_.get()) 822 if (spellcheck_.get())
780 thread->RemoveObserver(spellcheck_.get()); 823 thread->RemoveObserver(spellcheck_.get());
781 SpellCheck* new_spellcheck = new SpellCheck(); 824 SpellCheck* new_spellcheck = new SpellCheck();
782 if (spellcheck_provider_) 825 if (spellcheck_provider_)
783 spellcheck_provider_->SetSpellCheck(new_spellcheck); 826 spellcheck_provider_->SetSpellCheck(new_spellcheck);
784 spellcheck_.reset(new_spellcheck); 827 spellcheck_.reset(new_spellcheck);
785 thread->AddObserver(new_spellcheck); 828 thread->AddObserver(new_spellcheck);
786 } 829 }
787 830
788 } // namespace chrome 831 } // namespace chrome
OLDNEW
« no previous file with comments | « chrome/renderer/chrome_content_renderer_client.h ('k') | ppapi/native_client/src/shared/ppapi_proxy/browser_globals.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698