Commit 70974524 authored by ben's avatar ben Committed by Commit bot

Add explicit capability class enforcement.

Extracted from https://codereview.chromium.org/1910043002/ to help reduce an issue.

TBR=sky@chromium.org
BUG=

Review URL: https://codereview.chromium.org/1918333002

Cr-Commit-Position: refs/heads/master@{#389842}
parent 9e0b9dc2
...@@ -38,6 +38,7 @@ const char kCapabilityClass_UserID[] = "shell:user_id"; ...@@ -38,6 +38,7 @@ const char kCapabilityClass_UserID[] = "shell:user_id";
const char kCapabilityClass_ClientProcess[] = "shell:client_process"; const char kCapabilityClass_ClientProcess[] = "shell:client_process";
const char kCapabilityClass_InstanceName[] = "shell:instance_name"; const char kCapabilityClass_InstanceName[] = "shell:instance_name";
const char kCapabilityClass_AllUsers[] = "shell:all_users"; const char kCapabilityClass_AllUsers[] = "shell:all_users";
const char kCapabilityClass_ExplicitClass[] = "shell:explicit_class";
void EmptyResolverCallback(mojom::ResolveResultPtr result) {} void EmptyResolverCallback(mojom::ResolveResultPtr result) {}
...@@ -158,6 +159,14 @@ class Shell::Instance : public mojom::Connector, ...@@ -158,6 +159,14 @@ class Shell::Instance : public mojom::Connector,
source->capability_spec_, identity_, capability_spec_); source->capability_spec_, identity_, capability_spec_);
source_id = source->id(); source_id = source->id();
} }
// The target has specified that sources must request one of its provided
// classes instead of specifying a wild-card for interfaces.
if (HasClass(capability_spec_, kCapabilityClass_ExplicitClass) &&
(request.interfaces.count("*") != 0)) {
request.interfaces = Interfaces();
}
shell_client_->AcceptConnection( shell_client_->AcceptConnection(
mojom::Identity::From(params->source()), source_id, mojom::Identity::From(params->source()), source_id,
params->TakeRemoteInterfaces(), params->TakeLocalInterfaces(), params->TakeRemoteInterfaces(), params->TakeLocalInterfaces(),
......
...@@ -2,5 +2,9 @@ ...@@ -2,5 +2,9 @@
"manifest_version": 1, "manifest_version": 1,
"name": "mojo:connect_test_a", "name": "mojo:connect_test_a",
"display_name": "Connect Test A", "display_name": "Connect Test A",
"capabilities": { } "capabilities": {
"required": {
"mojo:connect_test_class_app": { "classes": [ "class" ] }
}
}
} }
...@@ -37,7 +37,6 @@ class ConnectTestClassApp ...@@ -37,7 +37,6 @@ class ConnectTestClassApp
identity_ = identity; identity_ = identity;
} }
bool AcceptConnection(Connection* connection) override { bool AcceptConnection(Connection* connection) override {
CHECK(connection->HasCapabilityClass("class"));
connection->AddInterface<test::mojom::ConnectTestService>(this); connection->AddInterface<test::mojom::ConnectTestService>(this);
connection->AddInterface<test::mojom::ClassInterface>(this); connection->AddInterface<test::mojom::ClassInterface>(this);
inbound_connections_.insert(connection); inbound_connections_.insert(connection);
......
...@@ -4,7 +4,10 @@ ...@@ -4,7 +4,10 @@
"display_name": "Connect Test Class App", "display_name": "Connect Test Class App",
"capabilities": { "capabilities": {
"provided": { "provided": {
"class": ["shell::test::mojom::ClassInterface"] "class": [ "shell::test::mojom::ClassInterface" ]
},
"required": {
"mojo:shell": { "classes": [ "shell:explicit_class" ] }
} }
} }
} }
...@@ -307,6 +307,19 @@ TEST_F(ConnectTest, CapabilityClasses) { ...@@ -307,6 +307,19 @@ TEST_F(ConnectTest, CapabilityClasses) {
EXPECT_EQ("CLASS APP", string2); EXPECT_EQ("CLASS APP", string2);
} }
TEST_F(ConnectTest, ConnectWithoutExplicitClassBlocked) {
// We not be able to bind a ClassInterfacePtr since the connect_unittest app
// does not explicitly request the "class" capability from
// connect_test_class_app. This test will hang if it is bound.
std::unique_ptr<Connection> connection =
connector()->Connect(kTestClassAppName);
test::mojom::ClassInterfacePtr class_interface;
connection->GetInterface(&class_interface);
base::RunLoop loop;
class_interface.set_connection_error_handler(base::Bind(&QuitLoop, &loop));
loop.Run();
}
TEST_F(ConnectTest, ConnectAsDifferentUser_Allowed) { TEST_F(ConnectTest, ConnectAsDifferentUser_Allowed) {
std::unique_ptr<Connection> connection = connector()->Connect(kTestAppName); std::unique_ptr<Connection> connection = connector()->Connect(kTestAppName);
test::mojom::UserIdTestPtr user_id_test; test::mojom::UserIdTestPtr user_id_test;
......
...@@ -5,6 +5,9 @@ ...@@ -5,6 +5,9 @@
"capabilities": { "capabilities": {
"required": { "required": {
"mojo:connect_test_package": { "interfaces": [ "*" ] }, "mojo:connect_test_package": { "interfaces": [ "*" ] },
"mojo:connect_test_class_app": {
"interfaces": [ "*" ]
},
"mojo:connect_test_app": { "mojo:connect_test_app": {
"interfaces": [ "interfaces": [
"shell::test::mojom::ConnectTestService", "shell::test::mojom::ConnectTestService",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment