123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795 |
- // 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 "src/core/lib/security/authorization/rbac_translator.h"
- #include <gmock/gmock.h>
- #include <gtest/gtest.h>
- namespace grpc_core {
- namespace {
- MATCHER_P3(EqualsPrincipalName, expected_matcher_type, expected_matcher_value,
- is_regex, "") {
- return arg->type == Rbac::Principal::RuleType::kPrincipalName &&
- arg->string_matcher.value().type() == expected_matcher_type &&
- is_regex
- ? arg->string_matcher.value().regex_matcher()->pattern() ==
- expected_matcher_value
- : arg->string_matcher.value().string_matcher() ==
- expected_matcher_value;
- }
- MATCHER_P3(EqualsPath, expected_matcher_type, expected_matcher_value, is_regex,
- "") {
- return arg->type == Rbac::Permission::RuleType::kPath &&
- arg->string_matcher.type() == expected_matcher_type && is_regex
- ? arg->string_matcher.regex_matcher()->pattern() ==
- expected_matcher_value
- : arg->string_matcher.string_matcher() == expected_matcher_value;
- }
- MATCHER_P4(EqualsHeader, expected_name, expected_matcher_type,
- expected_matcher_value, is_regex, "") {
- return arg->type == Rbac::Permission::RuleType::kHeader &&
- arg->header_matcher.name() == expected_name &&
- arg->header_matcher.type() == expected_matcher_type && is_regex
- ? arg->header_matcher.regex_matcher()->pattern() ==
- expected_matcher_value
- : arg->header_matcher.string_matcher() == expected_matcher_value;
- }
- } // namespace
- TEST(GenerateRbacPoliciesTest, InvalidPolicy) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz-policy\",,"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_THAT(
- std::string(rbac_policies.status().message()),
- ::testing::StartsWith("Failed to parse gRPC authorization policy."));
- }
- TEST(GenerateRbacPoliciesTest, MissingAuthorizationPolicyName) {
- const char* authz_policy = "{}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(), "\"name\" field is not present.");
- }
- TEST(GenerateRbacPoliciesTest, IncorrectAuthorizationPolicyNameType) {
- const char* authz_policy =
- "{"
- " \"name\": [\"authz_policy\"]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(), "\"name\" is not a string.");
- }
- TEST(GenerateRbacPoliciesTest, MissingAllowRules) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz_policy\""
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "\"allow_rules\" is not present.");
- }
- TEST(GenerateRbacPoliciesTest, MissingDenyRules) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": \"allow_policy\""
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- ASSERT_TRUE(rbac_policies.ok());
- EXPECT_EQ(rbac_policies.value().deny_policy.action, Rbac::Action::kDeny);
- EXPECT_TRUE(rbac_policies.value().deny_policy.policies.empty());
- }
- TEST(GenerateRbacPoliciesTest, IncorrectAllowRulesType) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": {}"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "\"allow_rules\" is not an array.");
- }
- TEST(GenerateRbacPoliciesTest, IncorrectDenyRulesType) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"deny_rules\": 123"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "\"deny_rules\" is not an array.");
- }
- TEST(GenerateRbacPoliciesTest, IncorrectRuleType) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": [\"rule-a\"]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "allow_rules 0: is not an object.");
- }
- TEST(GenerateRbacPoliciesTest, MissingRuleNameField) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": [{}]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "allow_rules 0: \"name\" is not present.");
- }
- TEST(GenerateRbacPoliciesTest, IncorrectRuleNameType) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": 123"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "allow_rules 0: \"name\" is not a string.");
- }
- TEST(GenerateRbacPoliciesTest, MissingSourceAndRequest) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": \"allow_policy\""
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- ASSERT_TRUE(rbac_policies.ok());
- EXPECT_EQ(rbac_policies.value().allow_policy.action, Rbac::Action::kAllow);
- EXPECT_THAT(
- rbac_policies.value().allow_policy.policies,
- ::testing::ElementsAre(::testing::Pair(
- "authz_allow_policy",
- ::testing::AllOf(
- ::testing::Field(
- &Rbac::Policy::permissions,
- ::testing::Field(&Rbac::Permission::type,
- Rbac::Permission::RuleType::kAny)),
- ::testing::Field(
- &Rbac::Policy::principals,
- ::testing::Field(&Rbac::Principal::type,
- Rbac::Principal::RuleType::kAny))))));
- }
- TEST(GenerateRbacPoliciesTest, EmptySourceAndRequest) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": \"allow_policy\","
- " \"source\": {},"
- " \"request\": {}"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- ASSERT_TRUE(rbac_policies.ok());
- EXPECT_EQ(rbac_policies.value().allow_policy.action, Rbac::Action::kAllow);
- EXPECT_THAT(
- rbac_policies.value().allow_policy.policies,
- ::testing::ElementsAre(::testing::Pair(
- "authz_allow_policy",
- ::testing::AllOf(
- ::testing::Field(
- &Rbac::Policy::permissions,
- ::testing::Field(&Rbac::Permission::type,
- Rbac::Permission::RuleType::kAny)),
- ::testing::Field(
- &Rbac::Policy::principals,
- ::testing::Field(&Rbac::Principal::type,
- Rbac::Principal::RuleType::kAny))))));
- }
- TEST(GenerateRbacPoliciesTest, IncorrectSourceType) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": \"allow_policy\","
- " \"source\": 111"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "allow_rules 0: \"source\" is not an object.");
- }
- TEST(GenerateRbacPoliciesTest, IncorrectPrincipalsType) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": \"allow_policy\","
- " \"source\": {"
- " \"principals\": ["
- " \"*\","
- " 123"
- " ]"
- " }"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "allow_rules 0: \"principals\" 1: is not a string.");
- }
- TEST(GenerateRbacPoliciesTest, ParseSourceSuccess) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": \"allow_policy\","
- " \"source\": {"
- " \"principals\": ["
- " \"spiffe://foo.abc\","
- " \"spiffe://bar*\","
- " \"*baz\","
- " \"spiffe://abc.*.com\""
- " ]"
- " }"
- " }"
- " ],"
- " \"deny_rules\": ["
- " {"
- " \"name\": \"deny_policy\","
- " \"source\": {"
- " \"principals\": ["
- " \"*\""
- " ]"
- " }"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- ASSERT_TRUE(rbac_policies.ok());
- EXPECT_EQ(rbac_policies.value().allow_policy.action, Rbac::Action::kAllow);
- EXPECT_THAT(rbac_policies.value().allow_policy.policies,
- ::testing::ElementsAre(::testing::Pair(
- "authz_allow_policy",
- ::testing::AllOf(
- ::testing::Field(
- &Rbac::Policy::permissions,
- ::testing::Field(&Rbac::Permission::type,
- Rbac::Permission::RuleType::kAny)),
- ::testing::Field(
- &Rbac::Policy::principals,
- ::testing::AllOf(
- ::testing::Field(&Rbac::Principal::type,
- Rbac::Principal::RuleType::kAnd),
- ::testing::Field(
- &Rbac::Principal::principals,
- ::testing::ElementsAre(::testing::AllOf(
- ::testing::Pointee(::testing::Field(
- &Rbac::Principal::type,
- Rbac::Principal::RuleType::kOr)),
- ::testing::Pointee(::testing::Field(
- &Rbac::Principal::principals,
- ::testing::ElementsAre(
- EqualsPrincipalName(
- StringMatcher::Type::kExact,
- "spiffe://foo.abc", false),
- EqualsPrincipalName(
- StringMatcher::Type::kPrefix,
- "spiffe://bar", false),
- EqualsPrincipalName(
- StringMatcher::Type::kSuffix,
- "baz", false),
- EqualsPrincipalName(
- StringMatcher::Type::kExact,
- "spiffe://abc.*.com",
- false)))))))))))));
- EXPECT_EQ(rbac_policies.value().deny_policy.action, Rbac::Action::kDeny);
- EXPECT_THAT(
- rbac_policies.value().deny_policy.policies,
- ::testing::ElementsAre(::testing::Pair(
- "authz_deny_policy",
- ::testing::AllOf(
- ::testing::Field(
- &Rbac::Policy::permissions,
- ::testing::Field(&Rbac::Permission::type,
- Rbac::Permission::RuleType::kAny)),
- ::testing::Field(
- &Rbac::Policy::principals,
- ::testing::AllOf(
- ::testing::Field(&Rbac::Principal::type,
- Rbac::Principal::RuleType::kAnd),
- ::testing::Field(
- &Rbac::Principal::principals,
- ::testing::ElementsAre(::testing::AllOf(
- ::testing::Pointee(::testing::Field(
- &Rbac::Principal::type,
- Rbac::Principal::RuleType::kOr)),
- ::testing::Pointee(::testing::Field(
- &Rbac::Principal::principals,
- ::testing::ElementsAre(EqualsPrincipalName(
- StringMatcher::Type::kSafeRegex, ".+",
- true)))))))))))));
- }
- TEST(GenerateRbacPoliciesTest, IncorrectRequestType) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"deny_rules\": ["
- " {"
- " \"name\": \"deny_policy\","
- " \"request\": 111"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "deny_rules 0: \"request\" is not an object.");
- }
- TEST(GenerateRbacPoliciesTest, IncorrectPathType) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"deny_rules\": ["
- " {"
- " \"name\": \"allow_policy\","
- " \"request\": {"
- " \"paths\": ["
- " \"path-a\","
- " 123"
- " ]"
- " }"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "deny_rules 0: \"paths\" 1: is not a string.");
- }
- TEST(GenerateRbacPoliciesTest, ParseRequestPathsSuccess) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": \"allow_policy\","
- " \"request\": {"
- " \"paths\": ["
- " \"*\""
- " ]"
- " }"
- " }"
- " ],"
- " \"deny_rules\": ["
- " {"
- " \"name\": \"deny_policy\","
- " \"request\": {"
- " \"paths\": ["
- " \"path-foo\","
- " \"path-bar*\","
- " \"*baz\""
- " ]"
- " }"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- ASSERT_TRUE(rbac_policies.ok());
- EXPECT_EQ(rbac_policies.value().deny_policy.action, Rbac::Action::kDeny);
- EXPECT_THAT(
- rbac_policies.value().deny_policy.policies,
- ::testing::ElementsAre(::testing::Pair(
- "authz_deny_policy",
- ::testing::AllOf(
- ::testing::Field(
- &Rbac::Policy::principals,
- ::testing::Field(&Rbac::Principal::type,
- Rbac::Principal::RuleType::kAny)),
- ::testing::Field(
- &Rbac::Policy::permissions,
- ::testing::AllOf(
- ::testing::Field(&Rbac::Permission::type,
- Rbac::Permission::RuleType::kAnd),
- ::testing::Field(
- &Rbac::Permission::permissions,
- ::testing::ElementsAre(::testing::AllOf(
- ::testing::Pointee(::testing::Field(
- &Rbac::Permission::type,
- Rbac::Permission::RuleType::kOr)),
- ::testing::Pointee(::testing::Field(
- &Rbac::Permission::permissions,
- ::testing::ElementsAre(
- EqualsPath(StringMatcher::Type::kExact,
- "path-foo", false),
- EqualsPath(StringMatcher::Type::kPrefix,
- "path-bar", false),
- EqualsPath(StringMatcher::Type::kSuffix,
- "baz", false)))))))))))));
- EXPECT_EQ(rbac_policies.value().allow_policy.action, Rbac::Action::kAllow);
- EXPECT_THAT(
- rbac_policies.value().allow_policy.policies,
- ::testing::ElementsAre(::testing::Pair(
- "authz_allow_policy",
- ::testing::AllOf(
- ::testing::Field(
- &Rbac::Policy::principals,
- ::testing::Field(&Rbac::Principal::type,
- Rbac::Principal::RuleType::kAny)),
- ::testing::Field(
- &Rbac::Policy::permissions,
- ::testing::AllOf(
- ::testing::Field(&Rbac::Permission::type,
- Rbac::Permission::RuleType::kAnd),
- ::testing::Field(
- &Rbac::Permission::permissions,
- ::testing::ElementsAre(::testing::AllOf(
- ::testing::Pointee(::testing::Field(
- &Rbac::Permission::type,
- Rbac::Permission::RuleType::kOr)),
- ::testing::Pointee(::testing::Field(
- &Rbac::Permission::permissions,
- ::testing::ElementsAre(EqualsPath(
- StringMatcher::Type::kSafeRegex, ".+",
- true)))))))))))));
- }
- TEST(GenerateRbacPoliciesTest, IncorrectHeaderType) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"deny_rules\": ["
- " {"
- " \"name\": \"allow_policy\","
- " \"request\": {"
- " \"headers\": ["
- " \"header-a\""
- " ]"
- " }"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "deny_rules 0: \"headers\" 0: is not an object.");
- }
- TEST(GenerateRbacPoliciesTest, UnsupportedGrpcHeaders) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"deny_rules\": ["
- " {"
- " \"name\": \"policy\","
- " \"request\": {"
- " \"headers\": ["
- " {"
- " \"key\": \"grpc-xxx\","
- " \"values\": ["
- " \"*\""
- " ]"
- " }"
- " ]"
- " }"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "deny_rules 0: \"headers\" 0: Unsupported \"key\" grpc-xxx.");
- }
- TEST(GenerateRbacPoliciesTest, UnsupportedPseudoHeaders) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": \"policy\","
- " \"request\": {"
- " \"headers\": ["
- " {"
- " \"key\": \":method\","
- " \"values\": ["
- " \"*\""
- " ]"
- " }"
- " ]"
- " }"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "allow_rules 0: \"headers\" 0: Unsupported \"key\" :method.");
- }
- TEST(GenerateRbacPoliciesTest, UnsupportedHostHeader) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": \"policy\","
- " \"request\": {"
- " \"headers\": ["
- " {"
- " \"key\": \"Host\","
- " \"values\": ["
- " \"*\""
- " ]"
- " }"
- " ]"
- " }"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "allow_rules 0: \"headers\" 0: Unsupported \"key\" Host.");
- }
- TEST(GenerateRbacPoliciesTest, EmptyHeaderValuesList) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": \"allow_policy_1\","
- " \"request\": {"
- " \"headers\": ["
- " {"
- " \"key\": \"key-a\","
- " \"values\": ["
- " ]"
- " }"
- " ]"
- " }"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
- EXPECT_EQ(rbac_policies.status().message(),
- "allow_rules 0: \"headers\" 0: \"values\" list is empty.");
- }
- TEST(GenerateRbacPoliciesTest, ParseRequestHeadersSuccess) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": \"allow_policy\","
- " \"request\": {"
- " \"headers\": ["
- " {"
- " \"key\": \"key-1\","
- " \"values\": ["
- " \"*\""
- " ]"
- " },"
- " {"
- " \"key\": \"key-2\","
- " \"values\": ["
- " \"foo\","
- " \"bar*\","
- " \"*baz\""
- " ]"
- " }"
- " ]"
- " }"
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- ASSERT_TRUE(rbac_policies.ok());
- EXPECT_EQ(rbac_policies.value().deny_policy.action, Rbac::Action::kDeny);
- EXPECT_TRUE(rbac_policies.value().deny_policy.policies.empty());
- EXPECT_EQ(rbac_policies.value().allow_policy.action, Rbac::Action::kAllow);
- EXPECT_THAT(
- rbac_policies.value().allow_policy.policies,
- ::testing::ElementsAre(::testing::Pair(
- "authz_allow_policy",
- ::testing::AllOf(
- ::testing::Field(
- &Rbac::Policy::principals,
- ::testing::Field(&Rbac::Principal::type,
- Rbac::Principal::RuleType::kAny)),
- ::testing::Field(
- &Rbac::Policy::permissions,
- ::testing::AllOf(
- ::testing::Field(&Rbac::Permission::type,
- Rbac::Permission::RuleType::kAnd),
- ::testing::Field(
- &Rbac::Permission::permissions,
- ::testing::ElementsAre(::testing::AllOf(
- ::testing::Pointee(::testing::Field(
- &Rbac::Permission::type,
- Rbac::Permission::RuleType::kAnd)),
- ::testing::Pointee(::testing::Field(
- &Rbac::Permission::permissions,
- ::testing::ElementsAre(
- ::testing::AllOf(
- ::testing::Pointee(::testing::Field(
- &Rbac::Permission::type,
- Rbac::Permission::RuleType::kOr)),
- ::testing::Pointee(::testing::Field(
- &Rbac::Permission::permissions,
- ::testing::ElementsAre(
- EqualsHeader(
- "key-1",
- HeaderMatcher::Type::
- kSafeRegex,
- ".+", true))))),
- ::testing::AllOf(
- ::testing::Pointee(::testing::Field(
- &Rbac::Permission::type,
- Rbac::Permission::RuleType::kOr)),
- ::testing::Pointee(::testing::Field(
- &Rbac::Permission::permissions,
- ::testing::ElementsAre(
- EqualsHeader("key-2",
- HeaderMatcher::
- Type::kExact,
- "foo", false),
- EqualsHeader(
- "key-2",
- HeaderMatcher::Type::
- kPrefix,
- "bar", false),
- EqualsHeader(
- "key-2",
- HeaderMatcher::Type::
- kSuffix,
- "baz",
- false)))))))))))))))));
- }
- TEST(GenerateRbacPoliciesTest, ParseRulesArraySuccess) {
- const char* authz_policy =
- "{"
- " \"name\": \"authz\","
- " \"allow_rules\": ["
- " {"
- " \"name\": \"allow_policy_1\","
- " \"source\": {"
- " \"principals\": ["
- " \"spiffe://foo.abc\""
- " ]"
- " },"
- " \"request\": {"
- " \"paths\": ["
- " \"foo\""
- " ]"
- " }"
- " },"
- " {"
- " \"name\": \"allow_policy_2\""
- " }"
- " ]"
- "}";
- auto rbac_policies = GenerateRbacPolicies(authz_policy);
- ASSERT_TRUE(rbac_policies.ok());
- EXPECT_EQ(rbac_policies.value().deny_policy.action, Rbac::Action::kDeny);
- EXPECT_TRUE(rbac_policies.value().deny_policy.policies.empty());
- EXPECT_EQ(rbac_policies.value().allow_policy.action, Rbac::Action::kAllow);
- EXPECT_THAT(
- rbac_policies.value().allow_policy.policies,
- ::testing::ElementsAre(
- ::testing::Pair(
- "authz_allow_policy_1",
- ::testing::AllOf(
- ::testing::Field(
- &Rbac::Policy::permissions,
- ::testing::AllOf(
- ::testing::Field(&Rbac::Permission::type,
- Rbac::Permission::RuleType::kAnd),
- ::testing::Field(
- &Rbac::Permission::permissions,
- ::testing::ElementsAre(::testing::AllOf(
- ::testing::Pointee(::testing::Field(
- &Rbac::Permission::type,
- Rbac::Permission::RuleType::kOr)),
- ::testing::Pointee(::testing::Field(
- &Rbac::Permission::permissions,
- ::testing::ElementsAre(EqualsPath(
- StringMatcher::Type::kExact, "foo",
- false))))))))),
- ::testing::Field(
- &Rbac::Policy::principals,
- ::testing::AllOf(
- ::testing::Field(&Rbac::Principal::type,
- Rbac::Principal::RuleType::kAnd),
- ::testing::Field(
- &Rbac::Principal::principals,
- ::testing::ElementsAre(::testing::AllOf(
- ::testing::Pointee(::testing::Field(
- &Rbac::Principal::type,
- Rbac::Principal::RuleType::kOr)),
- ::testing::Pointee(::testing::Field(
- &Rbac::Principal::principals,
- ::testing::ElementsAre(
- EqualsPrincipalName(
- StringMatcher::Type::kExact,
- "spiffe://foo.abc",
- false))))))))))),
- ::testing::Pair(
- "authz_allow_policy_2",
- ::testing::AllOf(
- ::testing::Field(
- &Rbac::Policy::permissions,
- ::testing::Field(&Rbac::Permission::type,
- Rbac::Permission::RuleType::kAny)),
- ::testing::Field(
- &Rbac::Policy::principals,
- ::testing::Field(&Rbac::Principal::type,
- Rbac::Principal::RuleType::kAny))))));
- }
- } // namespace grpc_core
- int main(int argc, char** argv) {
- ::testing::InitGoogleTest(&argc, argv);
- return RUN_ALL_TESTS();
- }
|