Index: mojo/shell/application_instance.cc |
diff --git a/mojo/shell/application_instance.cc b/mojo/shell/application_instance.cc |
index aa4583b28348d2e7b407b1f94d4394299c14f440..37235612780637a5db1b52de7ac422cc1b449467 100644 |
--- a/mojo/shell/application_instance.cc |
+++ b/mojo/shell/application_instance.cc |
@@ -24,9 +24,12 @@ ApplicationInstance::ApplicationInstance( |
ApplicationPtr application, |
ApplicationManager* manager, |
const Identity& identity, |
+ const CapabilityFilter& filter, |
const base::Closure& on_application_end) |
: manager_(manager), |
identity_(identity), |
+ filter_(filter), |
+ allow_any_application_(filter.size() == 1 && filter.count("*") == 1), |
on_application_end_(on_application_end), |
application_(application.Pass()), |
binding_(this), |
@@ -45,37 +48,59 @@ void ApplicationInstance::InitializeApplication() { |
} |
void ApplicationInstance::ConnectToClient( |
+ ApplicationInstance* originator, |
const GURL& requested_url, |
const GURL& requestor_url, |
InterfaceRequest<ServiceProvider> services, |
- ServiceProviderPtr exposed_services) { |
+ ServiceProviderPtr exposed_services, |
+ CapabilityFilterPtr filter) { |
yzshen1
2015/07/22 22:26:47
It seems this filter is ignored (either on line 69
|
if (queue_requests_) { |
QueuedClientRequest* queued_request = new QueuedClientRequest; |
+ queued_request->originator = originator; |
queued_request->requested_url = requested_url; |
queued_request->requestor_url = requestor_url; |
queued_request->services = services.Pass(); |
queued_request->exposed_services = exposed_services.Pass(); |
+ queued_request->filter = filter.Pass(), |
queued_client_requests_.push_back(queued_request); |
return; |
} |
- application_->AcceptConnection(requestor_url.spec(), services.Pass(), |
- exposed_services.Pass(), requested_url.spec()); |
+ CallAcceptConnection(originator, requestor_url, services.Pass(), |
+ exposed_services.Pass(), requested_url); |
+} |
+ |
+ApplicationInstance::AllowedInterfaces |
+ ApplicationInstance::GetAllowedInterfaces( |
+ const Identity& identity) const { |
+ if (allow_any_application_) { |
+ AllowedInterfaces allowed; |
+ allowed.insert("*"); |
+ return allowed; |
+ } |
+ auto it = filter_.find(identity.url.spec()); |
+ return it != filter_.end() ? it->second : AllowedInterfaces(); |
} |
// Shell implementation: |
void ApplicationInstance::ConnectToApplication( |
- mojo::URLRequestPtr app_request, |
+ URLRequestPtr app_request, |
InterfaceRequest<ServiceProvider> services, |
- ServiceProviderPtr exposed_services) { |
- GURL app_gurl(app_request->url.To<std::string>()); |
- if (!app_gurl.is_valid()) { |
- LOG(ERROR) << "Error: invalid URL: " << app_request; |
+ ServiceProviderPtr exposed_services, |
+ CapabilityFilterPtr filter) { |
+ std::string url_string = app_request->url.To<std::string>(); |
+ if (!GURL(url_string).is_valid()) { |
+ LOG(ERROR) << "Error: invalid URL: " << url_string; |
return; |
} |
- manager_->ConnectToApplication(app_request.Pass(), std::string(), |
- identity_.url, services.Pass(), |
- exposed_services.Pass(), base::Closure()); |
+ if (allow_any_application_ || filter_.find(url_string) != filter_.end()) { |
+ manager_->ConnectToApplication(this, app_request.Pass(), std::string(), |
+ identity_.url, services.Pass(), |
+ exposed_services.Pass(), filter.Pass(), |
+ base::Closure()); |
+ } else { |
+ DVLOG(2) << "CapabilityFilter prevented connection to: " << url_string; |
+ } |
} |
void ApplicationInstance::QuitApplication() { |
@@ -85,6 +110,23 @@ void ApplicationInstance::QuitApplication() { |
base::Unretained(this))); |
} |
+void ApplicationInstance::CallAcceptConnection( |
+ ApplicationInstance* originator, |
+ const GURL& requestor_url, |
+ InterfaceRequest<ServiceProvider> services, |
+ ServiceProviderPtr exposed_services, |
+ const GURL& requested_url) { |
+ AllowedInterfaces interfaces; |
+ interfaces.insert("*"); |
+ if (originator) |
+ interfaces = originator->GetAllowedInterfaces(identity_); |
+ application_->AcceptConnection(requestor_url.spec(), |
+ services.Pass(), |
+ exposed_services.Pass(), |
+ Array<String>::From(interfaces).Pass(), |
+ requested_url.spec()); |
+} |
+ |
void ApplicationInstance::OnConnectionError() { |
std::vector<QueuedClientRequest*> queued_client_requests; |
queued_client_requests_.swap(queued_client_requests); |
@@ -97,10 +139,11 @@ void ApplicationInstance::OnConnectionError() { |
for (auto request : queued_client_requests) { |
mojo::URLRequestPtr url(mojo::URLRequest::New()); |
url->url = mojo::String::From(request->requested_url.spec()); |
- manager->ConnectToApplication(url.Pass(), std::string(), |
+ manager->ConnectToApplication(this, url.Pass(), std::string(), |
request->requestor_url, |
request->services.Pass(), |
request->exposed_services.Pass(), |
+ request->filter.Pass(), |
base::Closure()); |
} |
STLDeleteElements(&queued_client_requests); |
@@ -112,10 +155,11 @@ void ApplicationInstance::OnQuitRequestedResult(bool can_quit) { |
queue_requests_ = false; |
for (auto request : queued_client_requests_) { |
- application_->AcceptConnection(request->requestor_url.spec(), |
- request->services.Pass(), |
- request->exposed_services.Pass(), |
- request->requested_url.spec()); |
+ CallAcceptConnection(request->originator, |
+ request->requestor_url, |
+ request->services.Pass(), |
+ request->exposed_services.Pass(), |
+ request->requested_url); |
} |
STLDeleteElements(&queued_client_requests_); |
} |