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

Side by Side Diff: mojo/shell/application_instance.cc

Issue 1244233002: Allow trusted brokers to restrict connections for spawned applications to whitelisted applications … (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 5 years, 4 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "mojo/shell/application_instance.h" 5 #include "mojo/shell/application_instance.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "mojo/application/public/interfaces/content_handler.mojom.h" 9 #include "mojo/application/public/interfaces/content_handler.mojom.h"
10 #include "mojo/common/common_type_converters.h" 10 #include "mojo/common/common_type_converters.h"
11 #include "mojo/common/url_type_converters.h" 11 #include "mojo/common/url_type_converters.h"
12 #include "mojo/shell/application_manager.h" 12 #include "mojo/shell/application_manager.h"
13 13
14 namespace mojo { 14 namespace mojo {
15 namespace shell { 15 namespace shell {
16 16
17 ApplicationInstance::QueuedClientRequest::QueuedClientRequest() { 17 ApplicationInstance::QueuedClientRequest::QueuedClientRequest() {
18 } 18 }
19 19
20 ApplicationInstance::QueuedClientRequest::~QueuedClientRequest() { 20 ApplicationInstance::QueuedClientRequest::~QueuedClientRequest() {
21 } 21 }
22 22
23 ApplicationInstance::ApplicationInstance( 23 ApplicationInstance::ApplicationInstance(
24 ApplicationPtr application, 24 ApplicationPtr application,
25 ApplicationManager* manager, 25 ApplicationManager* manager,
26 const Identity& identity, 26 const Identity& identity,
27 const CapabilityFilter& filter,
27 const base::Closure& on_application_end) 28 const base::Closure& on_application_end)
28 : manager_(manager), 29 : manager_(manager),
29 identity_(identity), 30 identity_(identity),
31 filter_(filter),
32 allow_any_application_(filter.size() == 1 && filter.count("*") == 1),
30 on_application_end_(on_application_end), 33 on_application_end_(on_application_end),
31 application_(application.Pass()), 34 application_(application.Pass()),
32 binding_(this), 35 binding_(this),
33 queue_requests_(false) { 36 queue_requests_(false) {
34 binding_.set_connection_error_handler([this]() { OnConnectionError(); }); 37 binding_.set_connection_error_handler([this]() { OnConnectionError(); });
35 } 38 }
36 39
37 ApplicationInstance::~ApplicationInstance() { 40 ApplicationInstance::~ApplicationInstance() {
38 STLDeleteElements(&queued_client_requests_); 41 STLDeleteElements(&queued_client_requests_);
39 } 42 }
40 43
41 void ApplicationInstance::InitializeApplication() { 44 void ApplicationInstance::InitializeApplication() {
42 ShellPtr shell; 45 ShellPtr shell;
43 binding_.Bind(GetProxy(&shell)); 46 binding_.Bind(GetProxy(&shell));
44 application_->Initialize(shell.Pass(), identity_.url.spec()); 47 application_->Initialize(shell.Pass(), identity_.url.spec());
45 } 48 }
46 49
47 void ApplicationInstance::ConnectToClient( 50 void ApplicationInstance::ConnectToClient(
51 ApplicationInstance* originator,
48 const GURL& requested_url, 52 const GURL& requested_url,
49 const GURL& requestor_url, 53 const GURL& requestor_url,
50 InterfaceRequest<ServiceProvider> services, 54 InterfaceRequest<ServiceProvider> services,
51 ServiceProviderPtr exposed_services) { 55 ServiceProviderPtr exposed_services,
56 CapabilityFilterPtr filter) {
yzshen1 2015/07/24 08:02:09 (I probably have missed something obvious...) Thi
Ben Goodger (Google) 2015/07/24 17:29:29 I use it on line 151 below if the connection is br
52 if (queue_requests_) { 57 if (queue_requests_) {
53 QueuedClientRequest* queued_request = new QueuedClientRequest; 58 QueuedClientRequest* queued_request = new QueuedClientRequest;
59 queued_request->originator = originator;
54 queued_request->requested_url = requested_url; 60 queued_request->requested_url = requested_url;
55 queued_request->requestor_url = requestor_url; 61 queued_request->requestor_url = requestor_url;
56 queued_request->services = services.Pass(); 62 queued_request->services = services.Pass();
57 queued_request->exposed_services = exposed_services.Pass(); 63 queued_request->exposed_services = exposed_services.Pass();
64 queued_request->filter = filter.Pass(),
58 queued_client_requests_.push_back(queued_request); 65 queued_client_requests_.push_back(queued_request);
59 return; 66 return;
60 } 67 }
61 68
62 application_->AcceptConnection(requestor_url.spec(), services.Pass(), 69 CallAcceptConnection(originator, requestor_url, services.Pass(),
63 exposed_services.Pass(), requested_url.spec()); 70 exposed_services.Pass(), requested_url);
71 }
72
73 ApplicationInstance::AllowedInterfaces
74 ApplicationInstance::GetAllowedInterfaces(
75 const Identity& identity) const {
76 // Start by looking for interfaces specific to the supplied identity.
77 auto it = filter_.find(identity.url.spec());
78 if (it != filter_.end())
79 return it->second;
80
81 // Fall back to looking for a wildcard rule.
82 it = filter_.find("*");
83 if (filter_.size() == 1 && it != filter_.end())
84 return it->second;
85
86 // Finally, nothing is allowed.
87 return AllowedInterfaces();
64 } 88 }
65 89
66 // Shell implementation: 90 // Shell implementation:
67 void ApplicationInstance::ConnectToApplication( 91 void ApplicationInstance::ConnectToApplication(
68 mojo::URLRequestPtr app_request, 92 URLRequestPtr app_request,
69 InterfaceRequest<ServiceProvider> services, 93 InterfaceRequest<ServiceProvider> services,
70 ServiceProviderPtr exposed_services) { 94 ServiceProviderPtr exposed_services,
71 GURL app_gurl(app_request->url.To<std::string>()); 95 CapabilityFilterPtr filter) {
72 if (!app_gurl.is_valid()) { 96 std::string url_string = app_request->url.To<std::string>();
73 LOG(ERROR) << "Error: invalid URL: " << app_request; 97 if (!GURL(url_string).is_valid()) {
98 LOG(ERROR) << "Error: invalid URL: " << url_string;
74 return; 99 return;
75 } 100 }
76 manager_->ConnectToApplication(app_request.Pass(), std::string(), 101 if (allow_any_application_ || filter_.find(url_string) != filter_.end()) {
77 identity_.url, services.Pass(), 102 manager_->ConnectToApplication(this, app_request.Pass(), std::string(),
78 exposed_services.Pass(), base::Closure()); 103 identity_.url, services.Pass(),
104 exposed_services.Pass(), filter.Pass(),
105 base::Closure());
106 } else {
107 DVLOG(2) << "CapabilityFilter prevented connection to: " << url_string;
108 }
79 } 109 }
80 110
81 void ApplicationInstance::QuitApplication() { 111 void ApplicationInstance::QuitApplication() {
82 queue_requests_ = true; 112 queue_requests_ = true;
83 application_->OnQuitRequested( 113 application_->OnQuitRequested(
84 base::Bind(&ApplicationInstance::OnQuitRequestedResult, 114 base::Bind(&ApplicationInstance::OnQuitRequestedResult,
85 base::Unretained(this))); 115 base::Unretained(this)));
86 } 116 }
87 117
118 void ApplicationInstance::CallAcceptConnection(
119 ApplicationInstance* originator,
120 const GURL& requestor_url,
121 InterfaceRequest<ServiceProvider> services,
122 ServiceProviderPtr exposed_services,
123 const GURL& requested_url) {
124 AllowedInterfaces interfaces;
125 interfaces.insert("*");
126 if (originator)
127 interfaces = originator->GetAllowedInterfaces(identity_);
128 application_->AcceptConnection(requestor_url.spec(),
129 services.Pass(),
130 exposed_services.Pass(),
131 Array<String>::From(interfaces).Pass(),
132 requested_url.spec());
133 }
134
88 void ApplicationInstance::OnConnectionError() { 135 void ApplicationInstance::OnConnectionError() {
89 std::vector<QueuedClientRequest*> queued_client_requests; 136 std::vector<QueuedClientRequest*> queued_client_requests;
90 queued_client_requests_.swap(queued_client_requests); 137 queued_client_requests_.swap(queued_client_requests);
91 auto manager = manager_; 138 auto manager = manager_;
92 manager_->OnApplicationInstanceError(this); 139 manager_->OnApplicationInstanceError(this);
93 //|this| is deleted. 140 //|this| is deleted.
94 141
95 // If any queued requests came to shell during time it was shutting down, 142 // If any queued requests came to shell during time it was shutting down,
96 // start them now. 143 // start them now.
97 for (auto request : queued_client_requests) { 144 for (auto request : queued_client_requests) {
98 mojo::URLRequestPtr url(mojo::URLRequest::New()); 145 mojo::URLRequestPtr url(mojo::URLRequest::New());
99 url->url = mojo::String::From(request->requested_url.spec()); 146 url->url = mojo::String::From(request->requested_url.spec());
100 manager->ConnectToApplication(url.Pass(), std::string(), 147 manager->ConnectToApplication(this, url.Pass(), std::string(),
101 request->requestor_url, 148 request->requestor_url,
102 request->services.Pass(), 149 request->services.Pass(),
103 request->exposed_services.Pass(), 150 request->exposed_services.Pass(),
151 request->filter.Pass(),
104 base::Closure()); 152 base::Closure());
105 } 153 }
106 STLDeleteElements(&queued_client_requests); 154 STLDeleteElements(&queued_client_requests);
107 } 155 }
108 156
109 void ApplicationInstance::OnQuitRequestedResult(bool can_quit) { 157 void ApplicationInstance::OnQuitRequestedResult(bool can_quit) {
110 if (can_quit) 158 if (can_quit)
111 return; 159 return;
112 160
113 queue_requests_ = false; 161 queue_requests_ = false;
114 for (auto request : queued_client_requests_) { 162 for (auto request : queued_client_requests_) {
115 application_->AcceptConnection(request->requestor_url.spec(), 163 CallAcceptConnection(request->originator,
116 request->services.Pass(), 164 request->requestor_url,
117 request->exposed_services.Pass(), 165 request->services.Pass(),
118 request->requested_url.spec()); 166 request->exposed_services.Pass(),
167 request->requested_url);
119 } 168 }
120 STLDeleteElements(&queued_client_requests_); 169 STLDeleteElements(&queued_client_requests_);
121 } 170 }
122 171
123 } // namespace shell 172 } // namespace shell
124 } // namespace mojo 173 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698