123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619 |
- // Copyright 2021 gRPC authors.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- #include <grpc/support/port_platform.h>
- #include <list>
- #include <gmock/gmock.h>
- #include <gtest/gtest.h>
- #include <grpc/grpc_security_constants.h>
- #include "src/core/lib/security/authorization/evaluate_args.h"
- #include "src/core/lib/security/authorization/matchers.h"
- #include "test/core/util/evaluate_args_test_util.h"
- namespace grpc_core {
- class AuthorizationMatchersTest : public ::testing::Test {
- protected:
- EvaluateArgsTestUtil args_;
- };
- TEST_F(AuthorizationMatchersTest, AlwaysAuthorizationMatcher) {
- EvaluateArgs args = args_.MakeEvaluateArgs();
- AlwaysAuthorizationMatcher matcher;
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, AndAuthorizationMatcherSuccessfulMatch) {
- args_.AddPairToMetadata("foo", "bar");
- args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- std::vector<std::unique_ptr<Rbac::Permission>> rules;
- rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeHeaderPermission(
- HeaderMatcher::Create(/*name=*/"foo", HeaderMatcher::Type::kExact,
- /*matcher=*/"bar")
- .value())));
- rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeDestPortPermission(/*port=*/123)));
- auto matcher = AuthorizationMatcher::Create(
- Rbac::Permission::MakeAndPermission(std::move(rules)));
- EXPECT_TRUE(matcher->Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, AndAuthorizationMatcherFailedMatch) {
- args_.AddPairToMetadata("foo", "not_bar");
- args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- std::vector<std::unique_ptr<Rbac::Permission>> rules;
- rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeHeaderPermission(
- HeaderMatcher::Create(/*name=*/"foo", HeaderMatcher::Type::kExact,
- /*matcher=*/"bar")
- .value())));
- rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeDestPortPermission(/*port=*/123)));
- auto matcher = AuthorizationMatcher::Create(
- Rbac::Permission(Rbac::Permission::MakeAndPermission(std::move(rules))));
- // Header rule fails. Expected value "bar", got "not_bar" for key "foo".
- EXPECT_FALSE(matcher->Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, OrAuthorizationMatcherSuccessfulMatch) {
- args_.AddPairToMetadata("foo", "bar");
- args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- std::vector<std::unique_ptr<Rbac::Permission>> rules;
- rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeHeaderPermission(
- HeaderMatcher::Create(/*name=*/"foo", HeaderMatcher::Type::kExact,
- /*matcher=*/"bar")
- .value())));
- rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeDestPortPermission(/*port=*/456)));
- auto matcher = AuthorizationMatcher::Create(
- Rbac::Permission(Rbac::Permission::MakeOrPermission(std::move(rules))));
- // Matches as header rule matches even though port rule fails.
- EXPECT_TRUE(matcher->Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, OrAuthorizationMatcherFailedMatch) {
- args_.AddPairToMetadata("foo", "not_bar");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- std::vector<std::unique_ptr<Rbac::Permission>> rules;
- rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeHeaderPermission(
- HeaderMatcher::Create(/*name=*/"foo", HeaderMatcher::Type::kExact,
- /*matcher=*/"bar")
- .value())));
- auto matcher = AuthorizationMatcher::Create(
- Rbac::Permission(Rbac::Permission::MakeOrPermission(std::move(rules))));
- // Header rule fails. Expected value "bar", got "not_bar" for key "foo".
- EXPECT_FALSE(matcher->Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, NotAuthorizationMatcherSuccessfulMatch) {
- args_.AddPairToMetadata(":path", "/different/foo");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- auto matcher = AuthorizationMatcher::Create(Rbac::Principal(
- Rbac::Principal::MakeNotPrincipal(Rbac::Principal::MakePathPrincipal(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"/expected/foo",
- /*case_sensitive=*/false)
- .value()))));
- EXPECT_TRUE(matcher->Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, NotAuthorizationMatcherFailedMatch) {
- args_.AddPairToMetadata(":path", "/expected/foo");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- auto matcher = AuthorizationMatcher::Create(Rbac::Principal(
- Rbac::Principal::MakeNotPrincipal(Rbac::Principal::MakePathPrincipal(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"/expected/foo",
- /*case_sensitive=*/false)
- .value()))));
- EXPECT_FALSE(matcher->Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, HybridAuthorizationMatcherSuccessfulMatch) {
- args_.AddPairToMetadata("foo", "bar");
- args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- std::vector<std::unique_ptr<Rbac::Permission>> sub_and_rules;
- sub_and_rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeHeaderPermission(
- HeaderMatcher::Create(/*name=*/"foo", HeaderMatcher::Type::kExact,
- /*matcher=*/"bar")
- .value())));
- std::vector<std::unique_ptr<Rbac::Permission>> sub_or_rules;
- sub_or_rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeDestPortPermission(/*port=*/123)));
- std::vector<std::unique_ptr<Rbac::Permission>> and_rules;
- and_rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeAndPermission(std::move(sub_and_rules))));
- and_rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeOrPermission(std::move(std::move(sub_or_rules)))));
- auto matcher = AuthorizationMatcher::Create(Rbac::Permission(
- Rbac::Permission::MakeAndPermission(std::move(and_rules))));
- EXPECT_TRUE(matcher->Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, HybridAuthorizationMatcherFailedMatch) {
- args_.AddPairToMetadata("foo", "bar");
- args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- std::vector<std::unique_ptr<Rbac::Permission>> sub_and_rules;
- sub_and_rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeHeaderPermission(
- HeaderMatcher::Create(/*name=*/"foo", HeaderMatcher::Type::kExact,
- /*matcher=*/"bar")
- .value())));
- sub_and_rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeHeaderPermission(
- HeaderMatcher::Create(/*name=*/"absent_key",
- HeaderMatcher::Type::kExact,
- /*matcher=*/"some_value")
- .value())));
- std::vector<std::unique_ptr<Rbac::Permission>> sub_or_rules;
- sub_or_rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeDestPortPermission(/*port=*/123)));
- std::vector<std::unique_ptr<Rbac::Permission>> and_rules;
- and_rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeAndPermission(std::move(sub_and_rules))));
- and_rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeOrPermission(std::move(std::move(sub_or_rules)))));
- auto matcher = AuthorizationMatcher::Create(Rbac::Permission(
- Rbac::Permission::MakeAndPermission(std::move(and_rules))));
- // Fails as "absent_key" header was not present.
- EXPECT_FALSE(matcher->Matches(args));
- }
- TEST_F(AuthorizationMatchersTest,
- ReqServerNameAuthorizationMatcherSuccessfulMatch) {
- EvaluateArgs args = args_.MakeEvaluateArgs();
- ReqServerNameAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"")
- .value());
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest,
- ReqServerNameAuthorizationMatcherFailedMatch) {
- EvaluateArgs args = args_.MakeEvaluateArgs();
- ReqServerNameAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"server1")
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, PathAuthorizationMatcherSuccessfulMatch) {
- args_.AddPairToMetadata(":path", "expected/path");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- PathAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"expected/path",
- /*case_sensitive=*/false)
- .value());
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, PathAuthorizationMatcherFailedMatch) {
- args_.AddPairToMetadata(":path", "different/path");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- PathAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"expected/path",
- /*case_sensitive=*/false)
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest,
- PathAuthorizationMatcherFailedMatchMissingPath) {
- EvaluateArgs args = args_.MakeEvaluateArgs();
- PathAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"expected/path",
- /*case_sensitive=*/false)
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, MetadataAuthorizationMatcherSuccessfulMatch) {
- EvaluateArgs args = args_.MakeEvaluateArgs();
- MetadataAuthorizationMatcher matcher(/*invert=*/true);
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, MetadataAuthorizationMatcherFailedMatch) {
- EvaluateArgs args = args_.MakeEvaluateArgs();
- MetadataAuthorizationMatcher matcher(/*invert=*/false);
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherSuccessfulMatch) {
- args_.AddPairToMetadata("key123", "foo_xxx");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- HeaderAuthorizationMatcher matcher(
- HeaderMatcher::Create(/*name=*/"key123", HeaderMatcher::Type::kPrefix,
- /*matcher=*/"foo")
- .value());
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherFailedMatch) {
- args_.AddPairToMetadata("key123", "foo");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- HeaderAuthorizationMatcher matcher(
- HeaderMatcher::Create(/*name=*/"key123", HeaderMatcher::Type::kExact,
- /*matcher=*/"bar")
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherMethodSuccess) {
- args_.AddPairToMetadata(":method", "GET");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- HeaderAuthorizationMatcher matcher(
- HeaderMatcher::Create(/*name=*/":method", HeaderMatcher::Type::kExact,
- /*matcher=*/"GET")
- .value());
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherMethodFail) {
- args_.AddPairToMetadata(":method", "GET");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- HeaderAuthorizationMatcher matcher(
- HeaderMatcher::Create(/*name=*/":method", HeaderMatcher::Type::kExact,
- /*matcher=*/"PUT")
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherAuthoritySuccess) {
- args_.AddPairToMetadata(":authority", "localhost");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- HeaderAuthorizationMatcher matcher(
- HeaderMatcher::Create(/*name=*/":authority", HeaderMatcher::Type::kExact,
- /*matcher=*/"localhost")
- .value());
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherAuthorityFail) {
- args_.AddPairToMetadata(":authority", "localhost");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- HeaderAuthorizationMatcher matcher(
- HeaderMatcher::Create(/*name=*/":authority", HeaderMatcher::Type::kExact,
- /*matcher=*/"bad_authority")
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherPathSuccess) {
- args_.AddPairToMetadata(":path", "/expected/path");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- HeaderAuthorizationMatcher matcher(
- HeaderMatcher::Create(/*name=*/":path", HeaderMatcher::Type::kExact,
- /*matcher=*/"/expected/path")
- .value());
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, HeaderAuthorizationMatcherPathFail) {
- args_.AddPairToMetadata(":path", "/expected/path");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- HeaderAuthorizationMatcher matcher(
- HeaderMatcher::Create(/*name=*/":path", HeaderMatcher::Type::kExact,
- /*matcher=*/"/unexpected/path")
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest,
- HeaderAuthorizationMatcherFailedMatchMultivaluedHeader) {
- args_.AddPairToMetadata("key123", "foo");
- args_.AddPairToMetadata("key123", "bar");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- HeaderAuthorizationMatcher matcher(
- HeaderMatcher::Create(/*name=*/"key123", HeaderMatcher::Type::kExact,
- /*matcher=*/"foo")
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest,
- HeaderAuthorizationMatcherFailedMatchMissingHeader) {
- EvaluateArgs args = args_.MakeEvaluateArgs();
- HeaderAuthorizationMatcher matcher(
- HeaderMatcher::Create(/*name=*/"key123", HeaderMatcher::Type::kSuffix,
- /*matcher=*/"foo")
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, IpAuthorizationMatcherDestIpSuccessfulMatch) {
- args_.SetLocalEndpoint("ipv4:1.2.3.4:123");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- IpAuthorizationMatcher matcher(
- IpAuthorizationMatcher::Type::kDestIp,
- Rbac::CidrRange(/*address_prefix=*/"1.7.8.9", /*prefix_len=*/8));
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, IpAuthorizationMatcherDestIpFailedMatch) {
- args_.SetLocalEndpoint("ipv4:1.2.3.4:123");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- IpAuthorizationMatcher matcher(
- IpAuthorizationMatcher::Type::kDestIp,
- Rbac::CidrRange(/*address_prefix=*/"1.2.3.9", /*prefix_len=*/32));
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest,
- IpAuthorizationMatcherSourceIpSuccessfulMatch) {
- args_.SetPeerEndpoint("ipv6:[1:2:3::]:456");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- IpAuthorizationMatcher matcher(
- IpAuthorizationMatcher::Type::kSourceIp,
- Rbac::CidrRange(/*address_prefix=*/"1:3:4::", /*prefix_len=*/16));
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, IpAuthorizationMatcherSourceIpFailedMatch) {
- args_.SetPeerEndpoint("ipv6:[1:2::3::]:456");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- IpAuthorizationMatcher matcher(
- IpAuthorizationMatcher::Type::kSourceIp,
- Rbac::CidrRange(/*address_prefix=*/"1:3::", /*prefix_len=*/48));
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest,
- IpAuthorizationMatcherRemoteIpSuccessfulMatch) {
- args_.SetPeerEndpoint("ipv6:[1:2:3::]:456");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- IpAuthorizationMatcher matcher(
- IpAuthorizationMatcher::Type::kRemoteIp,
- Rbac::CidrRange(/*address_prefix=*/"1:2:4::", /*prefix_len=*/32));
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, IpAuthorizationMatcherRemoteIpFailedMatch) {
- args_.SetPeerEndpoint("ipv6:[1:2::]:456");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- IpAuthorizationMatcher matcher(
- IpAuthorizationMatcher::Type::kRemoteIp,
- Rbac::CidrRange(/*address_prefix=*/"1:3::", /*prefix_len=*/32));
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest,
- IpAuthorizationMatcherDirectRemoteIpSuccessfulMatch) {
- args_.SetPeerEndpoint("ipv4:1.2.3.4:123");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- IpAuthorizationMatcher matcher(
- IpAuthorizationMatcher::Type::kDirectRemoteIp,
- Rbac::CidrRange(/*address_prefix=*/"1.7.8.9", /*prefix_len=*/8));
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest,
- IpAuthorizationMatcherDirectRemoteIpFailedMatch) {
- args_.SetPeerEndpoint("ipv4:1.2.3.4:123");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- IpAuthorizationMatcher matcher(
- IpAuthorizationMatcher::Type::kDirectRemoteIp,
- Rbac::CidrRange(/*address_prefix=*/"1.7.8.9", /*prefix_len=*/16));
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, PortAuthorizationMatcherSuccessfulMatch) {
- args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- PortAuthorizationMatcher matcher(/*port=*/123);
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, PortAuthorizationMatcherFailedMatch) {
- args_.SetLocalEndpoint("ipv4:255.255.255.255:123");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- PortAuthorizationMatcher matcher(/*port=*/456);
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest,
- AuthenticatedMatcherUnAuthenticatedConnection) {
- EvaluateArgs args = args_.MakeEvaluateArgs();
- AuthenticatedAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"foo.com",
- /*case_sensitive=*/false)
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest,
- AuthenticatedMatcherAuthenticatedConnectionMatcherUnset) {
- args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
- GRPC_SSL_TRANSPORT_SECURITY_TYPE);
- EvaluateArgs args = args_.MakeEvaluateArgs();
- AuthenticatedAuthorizationMatcher matcher(/*auth=*/absl::nullopt);
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, AuthenticatedMatcherSuccessfulUriSanMatches) {
- args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
- GRPC_TLS_TRANSPORT_SECURITY_TYPE);
- args_.AddPropertyToAuthContext(GRPC_PEER_URI_PROPERTY_NAME,
- "spiffe://foo.abc");
- args_.AddPropertyToAuthContext(GRPC_PEER_URI_PROPERTY_NAME,
- "https://foo.domain.com");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- AuthenticatedAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"spiffe://foo.abc",
- /*case_sensitive=*/false)
- .value());
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, AuthenticatedMatcherFailedUriSanMatches) {
- args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
- GRPC_TLS_TRANSPORT_SECURITY_TYPE);
- args_.AddPropertyToAuthContext(GRPC_PEER_URI_PROPERTY_NAME,
- "spiffe://bar.abc");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- AuthenticatedAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"spiffe://foo.abc",
- /*case_sensitive=*/false)
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, AuthenticatedMatcherSuccessfulDnsSanMatches) {
- args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
- GRPC_SSL_TRANSPORT_SECURITY_TYPE);
- args_.AddPropertyToAuthContext(GRPC_PEER_URI_PROPERTY_NAME,
- "spiffe://bar.abc");
- args_.AddPropertyToAuthContext(GRPC_PEER_DNS_PROPERTY_NAME,
- "foo.test.domain.com");
- args_.AddPropertyToAuthContext(GRPC_PEER_DNS_PROPERTY_NAME,
- "bar.test.domain.com");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- // No match found in URI SANs, finds match in DNS SANs.
- AuthenticatedAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"bar.test.domain.com",
- /*case_sensitive=*/false)
- .value());
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, AuthenticatedMatcherFailedDnsSanMatches) {
- args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
- GRPC_SSL_TRANSPORT_SECURITY_TYPE);
- args_.AddPropertyToAuthContext(GRPC_PEER_DNS_PROPERTY_NAME,
- "foo.test.domain.com");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- AuthenticatedAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"bar.test.domain.com",
- /*case_sensitive=*/false)
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest,
- AuthenticatedMatcherSuccessfulSubjectMatches) {
- args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
- GRPC_TLS_TRANSPORT_SECURITY_TYPE);
- args_.AddPropertyToAuthContext(GRPC_X509_SUBJECT_PROPERTY_NAME,
- "CN=abc,OU=Google");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- // No match found in URI SANs and DNS SANs, finds match in Subject.
- AuthenticatedAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"CN=abc,OU=Google",
- /*case_sensitive=*/false)
- .value());
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, AuthenticatedMatcherFailedSubjectMatches) {
- args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
- GRPC_SSL_TRANSPORT_SECURITY_TYPE);
- args_.AddPropertyToAuthContext(GRPC_X509_SUBJECT_PROPERTY_NAME,
- "CN=abc,OU=Google");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- AuthenticatedAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"CN=def,OU=Google",
- /*case_sensitive=*/false)
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(
- AuthorizationMatchersTest,
- AuthenticatedMatcherWithoutClientCertMatchesSuccessfullyOnEmptyPrincipal) {
- args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
- GRPC_TLS_TRANSPORT_SECURITY_TYPE);
- EvaluateArgs args = args_.MakeEvaluateArgs();
- AuthenticatedAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"")
- .value());
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, AuthenticatedMatcherFailedNothingMatches) {
- args_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
- GRPC_SSL_TRANSPORT_SECURITY_TYPE);
- EvaluateArgs args = args_.MakeEvaluateArgs();
- AuthenticatedAuthorizationMatcher matcher(
- StringMatcher::Create(StringMatcher::Type::kExact,
- /*matcher=*/"foo",
- /*case_sensitive=*/false)
- .value());
- EXPECT_FALSE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, PolicyAuthorizationMatcherSuccessfulMatch) {
- args_.AddPairToMetadata("key123", "foo");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- std::vector<std::unique_ptr<Rbac::Permission>> rules;
- rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeHeaderPermission(
- HeaderMatcher::Create(/*name=*/"key123", HeaderMatcher::Type::kExact,
- /*matcher=*/"foo")
- .value())));
- PolicyAuthorizationMatcher matcher(Rbac::Policy(
- Rbac::Permission(Rbac::Permission::MakeOrPermission(std::move(rules))),
- Rbac::Principal::MakeAnyPrincipal()));
- EXPECT_TRUE(matcher.Matches(args));
- }
- TEST_F(AuthorizationMatchersTest, PolicyAuthorizationMatcherFailedMatch) {
- args_.AddPairToMetadata("key123", "foo");
- EvaluateArgs args = args_.MakeEvaluateArgs();
- std::vector<std::unique_ptr<Rbac::Permission>> rules;
- rules.push_back(absl::make_unique<Rbac::Permission>(
- Rbac::Permission::MakeHeaderPermission(
- HeaderMatcher::Create(/*name=*/"key123", HeaderMatcher::Type::kExact,
- /*matcher=*/"bar")
- .value())));
- PolicyAuthorizationMatcher matcher(Rbac::Policy(
- Rbac::Permission(Rbac::Permission::MakeOrPermission(std::move(rules))),
- Rbac::Principal::MakeAnyPrincipal()));
- EXPECT_FALSE(matcher.Matches(args));
- }
- } // namespace grpc_core
- int main(int argc, char** argv) {
- ::testing::InitGoogleTest(&argc, argv);
- grpc_init();
- int ret = RUN_ALL_TESTS();
- grpc_shutdown();
- return ret;
- }
|