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

Unified Diff: content/browser/renderer_host/pepper/pepper_network_proxy_host.cc

Issue 17094022: PPAPI: Add permissions checking for PPB_NetworkProxy (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge, appease Clang Created 7 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/renderer_host/pepper/pepper_network_proxy_host.h ('k') | ppapi/tests/test_network_proxy.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/renderer_host/pepper/pepper_network_proxy_host.cc
diff --git a/content/browser/renderer_host/pepper/pepper_network_proxy_host.cc b/content/browser/renderer_host/pepper/pepper_network_proxy_host.cc
index 5c0af131a902c96996f49808d9b2d72d09a3a3bf..8ea42412395542bb7d1befb94f02fdcdac975228 100644
--- a/content/browser/renderer_host/pepper/pepper_network_proxy_host.cc
+++ b/content/browser/renderer_host/pepper/pepper_network_proxy_host.cc
@@ -5,10 +5,12 @@
#include "content/browser/renderer_host/pepper/pepper_network_proxy_host.h"
#include "base/bind.h"
+#include "content/browser/renderer_host/pepper/browser_ppapi_host_impl.h"
+#include "content/browser/renderer_host/pepper/pepper_socket_utils.h"
#include "content/public/browser/browser_context.h"
-#include "content/public/browser/browser_ppapi_host.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h"
+#include "content/public/common/socket_permission_request.h"
#include "net/base/net_errors.h"
#include "net/proxy/proxy_info.h"
#include "net/url_request/url_request_context.h"
@@ -20,39 +22,25 @@
namespace content {
-namespace {
-
-scoped_refptr<net::URLRequestContextGetter>
-GetURLRequestContextGetterOnUIThread(int render_process_id) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- scoped_refptr<net::URLRequestContextGetter> context_getter;
- RenderProcessHost* render_process_host =
- RenderProcessHost::FromID(render_process_id);
- if (render_process_host && render_process_host->GetBrowserContext()) {
- context_getter = render_process_host->GetBrowserContext()->
- GetRequestContextForRenderProcess(render_process_id);
- }
- return context_getter;
-}
-
-} // namespace
-
-PepperNetworkProxyHost::PepperNetworkProxyHost(BrowserPpapiHost* host,
+PepperNetworkProxyHost::PepperNetworkProxyHost(BrowserPpapiHostImpl* host,
PP_Instance instance,
PP_Resource resource)
: ResourceHost(host->GetPpapiHost(), instance, resource),
proxy_service_(NULL),
- waiting_for_proxy_service_(true),
+ is_allowed_(false),
+ waiting_for_ui_thread_data_(true),
weak_factory_(this) {
- int render_process_id(0), render_view_id_unused(0);
+ int render_process_id(0), render_view_id(0);
host->GetRenderViewIDsForInstance(instance,
&render_process_id,
- &render_view_id_unused);
+ &render_view_id);
BrowserThread::PostTaskAndReplyWithResult(
BrowserThread::UI, FROM_HERE,
- base::Bind(&GetURLRequestContextGetterOnUIThread, render_process_id),
- base::Bind(&PepperNetworkProxyHost::DidGetURLRequestContextGetter,
+ base::Bind(&GetUIThreadDataOnUIThread,
+ render_process_id,
+ render_view_id,
+ host->external_plugin()),
+ base::Bind(&PepperNetworkProxyHost::DidGetUIThreadData,
weak_factory_.GetWeakPtr()));
}
@@ -67,11 +55,50 @@ PepperNetworkProxyHost::~PepperNetworkProxyHost() {
}
}
-void PepperNetworkProxyHost::DidGetURLRequestContextGetter(
- scoped_refptr<net::URLRequestContextGetter> context_getter) {
- if (context_getter->GetURLRequestContext())
- proxy_service_ = context_getter->GetURLRequestContext()->proxy_service();
- waiting_for_proxy_service_ = false;
+PepperNetworkProxyHost::UIThreadData::UIThreadData()
+ : is_allowed(false) {
+}
+
+PepperNetworkProxyHost::UIThreadData::~UIThreadData() {
+}
+
+// static
+PepperNetworkProxyHost::UIThreadData
+PepperNetworkProxyHost::GetUIThreadDataOnUIThread(int render_process_id,
+ int render_view_id,
+ bool is_external_plugin) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ PepperNetworkProxyHost::UIThreadData result;
+ RenderProcessHost* render_process_host =
+ RenderProcessHost::FromID(render_process_id);
+ if (render_process_host && render_process_host->GetBrowserContext()) {
+ result.context_getter = render_process_host->GetBrowserContext()->
+ GetRequestContextForRenderProcess(render_process_id);
+ }
+
+ RenderViewHost* render_view_host =
+ RenderViewHost::FromID(render_process_id, render_view_id);
+ if (render_view_host) {
+ SocketPermissionRequest request(
+ content::SocketPermissionRequest::RESOLVE_PROXY, std::string(), 0);
+ result.is_allowed = pepper_socket_utils::CanUseSocketAPIs(
+ is_external_plugin,
+ false /* is_private_api */,
+ request,
+ render_view_host);
+ }
+ return result;
+}
+
+void PepperNetworkProxyHost::DidGetUIThreadData(
+ const UIThreadData& ui_thread_data) {
+ is_allowed_ = ui_thread_data.is_allowed;
+ if (ui_thread_data.context_getter &&
+ ui_thread_data.context_getter->GetURLRequestContext()) {
+ proxy_service_ =
+ ui_thread_data.context_getter->GetURLRequestContext()->proxy_service();
+ }
+ waiting_for_ui_thread_data_ = false;
if (!proxy_service_) {
DLOG_IF(WARNING, proxy_service_)
<< "Failed to find a ProxyService for Pepper plugin.";
@@ -98,19 +125,22 @@ int32_t PepperNetworkProxyHost::OnMsgGetProxyForURL(
unsent_requests_.push(request);
TryToSendUnsentRequests();
} else {
- SendFailureReply(PP_ERROR_BADARGUMENT, context->MakeReplyMessageContext());
+ SendFailureReply(PP_ERROR_BADARGUMENT,
+ context->MakeReplyMessageContext());
}
return PP_OK_COMPLETIONPENDING;
}
void PepperNetworkProxyHost::TryToSendUnsentRequests() {
- if (waiting_for_proxy_service_)
+ if (waiting_for_ui_thread_data_)
return;
while (!unsent_requests_.empty()) {
const UnsentRequest& request = unsent_requests_.front();
if (!proxy_service_) {
SendFailureReply(PP_ERROR_FAILED, request.reply_context);
+ } else if (!is_allowed_) {
+ SendFailureReply(PP_ERROR_NOACCESS, request.reply_context);
} else {
// Everything looks valid, so try to resolve the proxy.
net::ProxyInfo* proxy_info = new net::ProxyInfo;
@@ -142,8 +172,10 @@ void PepperNetworkProxyHost::OnResolveProxyCompleted(
pending_requests_.pop();
if (result != net::OK) {
- // TODO(dmichael): Add appropriate error codes to yzshen's conversion
- // function, and call that function here.
+ // Currently, the only proxy-specific error we could get is
+ // MANDATORY_PROXY_CONFIGURATION_FAILED. There's really no action a plugin
+ // can take in this case, so there's no need to distinguish it from other
+ // failures.
context.params.set_result(PP_ERROR_FAILED);
}
host()->SendReply(context,
« no previous file with comments | « content/browser/renderer_host/pepper/pepper_network_proxy_host.h ('k') | ppapi/tests/test_network_proxy.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698