Index: mojo/application/public/cpp/lib/application_impl.cc |
diff --git a/mojo/application/public/cpp/lib/application_impl.cc b/mojo/application/public/cpp/lib/application_impl.cc |
index 200bce4083a13c223f4f06e5d1314f7bf2d3bb44..dca66d6eddb3a13dc7ee3ada8bfa7996362ec30b 100644 |
--- a/mojo/application/public/cpp/lib/application_impl.cc |
+++ b/mojo/application/public/cpp/lib/application_impl.cc |
@@ -25,6 +25,19 @@ void DefaultTerminationClosure() { |
} // namespace |
+// TODO(beng): upstream this into mojo repo, array.h |
+template <typename E, typename T> |
+struct TypeConverter<std::set<E>, Array<T>> { |
+ static std::set<E> Convert(const Array<T>& input) { |
+ std::set<E> result; |
+ if (!input.is_null()) { |
+ for (size_t i = 0; i < input.size(); ++i) |
+ result.insert(TypeConverter<E, T>::Convert(input[i])); |
+ } |
+ return result; |
+ } |
+}; |
+ |
ApplicationImpl::ApplicationImpl(ApplicationDelegate* delegate, |
InterfaceRequest<Application> request) |
: ApplicationImpl(delegate, request.Pass(), |
@@ -65,7 +78,8 @@ ApplicationImpl::~ApplicationImpl() { |
} |
ApplicationConnection* ApplicationImpl::ConnectToApplication( |
- mojo::URLRequestPtr request) { |
+ mojo::URLRequestPtr request, |
+ CapabilityFilterPtr filter) { |
if (!shell_) |
return nullptr; |
ServiceProviderPtr local_services; |
@@ -73,10 +87,16 @@ ApplicationConnection* ApplicationImpl::ConnectToApplication( |
ServiceProviderPtr remote_services; |
std::string application_url = request->url.To<std::string>(); |
shell_->ConnectToApplication(request.Pass(), GetProxy(&remote_services), |
- local_services.Pass()); |
+ local_services.Pass(), filter.Pass()); |
+ // We allow all interfaces on outgoing connections since we are presumably in |
+ // a position to know who we're talking to. |
+ // TODO(beng): is this a valid assumption or do we need to figure some way to |
+ // filter here too? |
+ std::set<std::string> allowed; |
+ allowed.insert("*"); |
internal::ServiceRegistry* registry = new internal::ServiceRegistry( |
this, application_url, application_url, remote_services.Pass(), |
- local_request.Pass()); |
+ local_request.Pass(), allowed); |
if (!delegate_->ConfigureOutgoingConnection(registry)) { |
registry->CloseConnection(); |
return nullptr; |
@@ -141,9 +161,11 @@ void ApplicationImpl::AcceptConnection( |
const String& requestor_url, |
InterfaceRequest<ServiceProvider> services, |
ServiceProviderPtr exposed_services, |
+ Array<String> allowed_interfaces, |
const String& url) { |
internal::ServiceRegistry* registry = new internal::ServiceRegistry( |
- this, url, requestor_url, exposed_services.Pass(), services.Pass()); |
+ this, url, requestor_url, exposed_services.Pass(), services.Pass(), |
+ allowed_interfaces.To<std::set<std::string>>()); |
if (!delegate_->ConfigureIncomingConnection(registry)) { |
registry->CloseConnection(); |
return; |