rbac_translator_test.cc 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. // Copyright 2021 gRPC authors.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "src/core/lib/security/authorization/rbac_translator.h"
  15. #include <gmock/gmock.h>
  16. #include <gtest/gtest.h>
  17. namespace grpc_core {
  18. namespace {
  19. MATCHER_P3(EqualsPrincipalName, expected_matcher_type, expected_matcher_value,
  20. is_regex, "") {
  21. return arg->type == Rbac::Principal::RuleType::kPrincipalName &&
  22. arg->string_matcher.value().type() == expected_matcher_type &&
  23. is_regex
  24. ? arg->string_matcher.value().regex_matcher()->pattern() ==
  25. expected_matcher_value
  26. : arg->string_matcher.value().string_matcher() ==
  27. expected_matcher_value;
  28. }
  29. MATCHER_P3(EqualsPath, expected_matcher_type, expected_matcher_value, is_regex,
  30. "") {
  31. return arg->type == Rbac::Permission::RuleType::kPath &&
  32. arg->string_matcher.type() == expected_matcher_type && is_regex
  33. ? arg->string_matcher.regex_matcher()->pattern() ==
  34. expected_matcher_value
  35. : arg->string_matcher.string_matcher() == expected_matcher_value;
  36. }
  37. MATCHER_P4(EqualsHeader, expected_name, expected_matcher_type,
  38. expected_matcher_value, is_regex, "") {
  39. return arg->type == Rbac::Permission::RuleType::kHeader &&
  40. arg->header_matcher.name() == expected_name &&
  41. arg->header_matcher.type() == expected_matcher_type && is_regex
  42. ? arg->header_matcher.regex_matcher()->pattern() ==
  43. expected_matcher_value
  44. : arg->header_matcher.string_matcher() == expected_matcher_value;
  45. }
  46. } // namespace
  47. TEST(GenerateRbacPoliciesTest, InvalidPolicy) {
  48. const char* authz_policy =
  49. "{"
  50. " \"name\": \"authz-policy\",,"
  51. "}";
  52. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  53. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  54. EXPECT_THAT(
  55. std::string(rbac_policies.status().message()),
  56. ::testing::StartsWith("Failed to parse gRPC authorization policy."));
  57. }
  58. TEST(GenerateRbacPoliciesTest, MissingAuthorizationPolicyName) {
  59. const char* authz_policy = "{}";
  60. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  61. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  62. EXPECT_EQ(rbac_policies.status().message(), "\"name\" field is not present.");
  63. }
  64. TEST(GenerateRbacPoliciesTest, IncorrectAuthorizationPolicyNameType) {
  65. const char* authz_policy =
  66. "{"
  67. " \"name\": [\"authz_policy\"]"
  68. "}";
  69. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  70. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  71. EXPECT_EQ(rbac_policies.status().message(), "\"name\" is not a string.");
  72. }
  73. TEST(GenerateRbacPoliciesTest, MissingAllowRules) {
  74. const char* authz_policy =
  75. "{"
  76. " \"name\": \"authz_policy\""
  77. "}";
  78. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  79. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  80. EXPECT_EQ(rbac_policies.status().message(),
  81. "\"allow_rules\" is not present.");
  82. }
  83. TEST(GenerateRbacPoliciesTest, MissingDenyRules) {
  84. const char* authz_policy =
  85. "{"
  86. " \"name\": \"authz\","
  87. " \"allow_rules\": ["
  88. " {"
  89. " \"name\": \"allow_policy\""
  90. " }"
  91. " ]"
  92. "}";
  93. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  94. ASSERT_TRUE(rbac_policies.ok());
  95. EXPECT_EQ(rbac_policies.value().deny_policy.action, Rbac::Action::kDeny);
  96. EXPECT_TRUE(rbac_policies.value().deny_policy.policies.empty());
  97. }
  98. TEST(GenerateRbacPoliciesTest, IncorrectAllowRulesType) {
  99. const char* authz_policy =
  100. "{"
  101. " \"name\": \"authz\","
  102. " \"allow_rules\": {}"
  103. "}";
  104. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  105. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  106. EXPECT_EQ(rbac_policies.status().message(),
  107. "\"allow_rules\" is not an array.");
  108. }
  109. TEST(GenerateRbacPoliciesTest, IncorrectDenyRulesType) {
  110. const char* authz_policy =
  111. "{"
  112. " \"name\": \"authz\","
  113. " \"deny_rules\": 123"
  114. "}";
  115. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  116. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  117. EXPECT_EQ(rbac_policies.status().message(),
  118. "\"deny_rules\" is not an array.");
  119. }
  120. TEST(GenerateRbacPoliciesTest, IncorrectRuleType) {
  121. const char* authz_policy =
  122. "{"
  123. " \"name\": \"authz\","
  124. " \"allow_rules\": [\"rule-a\"]"
  125. "}";
  126. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  127. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  128. EXPECT_EQ(rbac_policies.status().message(),
  129. "allow_rules 0: is not an object.");
  130. }
  131. TEST(GenerateRbacPoliciesTest, MissingRuleNameField) {
  132. const char* authz_policy =
  133. "{"
  134. " \"name\": \"authz\","
  135. " \"allow_rules\": [{}]"
  136. "}";
  137. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  138. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  139. EXPECT_EQ(rbac_policies.status().message(),
  140. "allow_rules 0: \"name\" is not present.");
  141. }
  142. TEST(GenerateRbacPoliciesTest, IncorrectRuleNameType) {
  143. const char* authz_policy =
  144. "{"
  145. " \"name\": \"authz\","
  146. " \"allow_rules\": ["
  147. " {"
  148. " \"name\": 123"
  149. " }"
  150. " ]"
  151. "}";
  152. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  153. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  154. EXPECT_EQ(rbac_policies.status().message(),
  155. "allow_rules 0: \"name\" is not a string.");
  156. }
  157. TEST(GenerateRbacPoliciesTest, MissingSourceAndRequest) {
  158. const char* authz_policy =
  159. "{"
  160. " \"name\": \"authz\","
  161. " \"allow_rules\": ["
  162. " {"
  163. " \"name\": \"allow_policy\""
  164. " }"
  165. " ]"
  166. "}";
  167. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  168. ASSERT_TRUE(rbac_policies.ok());
  169. EXPECT_EQ(rbac_policies.value().allow_policy.action, Rbac::Action::kAllow);
  170. EXPECT_THAT(
  171. rbac_policies.value().allow_policy.policies,
  172. ::testing::ElementsAre(::testing::Pair(
  173. "authz_allow_policy",
  174. ::testing::AllOf(
  175. ::testing::Field(
  176. &Rbac::Policy::permissions,
  177. ::testing::Field(&Rbac::Permission::type,
  178. Rbac::Permission::RuleType::kAny)),
  179. ::testing::Field(
  180. &Rbac::Policy::principals,
  181. ::testing::Field(&Rbac::Principal::type,
  182. Rbac::Principal::RuleType::kAny))))));
  183. }
  184. TEST(GenerateRbacPoliciesTest, EmptySourceAndRequest) {
  185. const char* authz_policy =
  186. "{"
  187. " \"name\": \"authz\","
  188. " \"allow_rules\": ["
  189. " {"
  190. " \"name\": \"allow_policy\","
  191. " \"source\": {},"
  192. " \"request\": {}"
  193. " }"
  194. " ]"
  195. "}";
  196. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  197. ASSERT_TRUE(rbac_policies.ok());
  198. EXPECT_EQ(rbac_policies.value().allow_policy.action, Rbac::Action::kAllow);
  199. EXPECT_THAT(
  200. rbac_policies.value().allow_policy.policies,
  201. ::testing::ElementsAre(::testing::Pair(
  202. "authz_allow_policy",
  203. ::testing::AllOf(
  204. ::testing::Field(
  205. &Rbac::Policy::permissions,
  206. ::testing::Field(&Rbac::Permission::type,
  207. Rbac::Permission::RuleType::kAny)),
  208. ::testing::Field(
  209. &Rbac::Policy::principals,
  210. ::testing::Field(&Rbac::Principal::type,
  211. Rbac::Principal::RuleType::kAny))))));
  212. }
  213. TEST(GenerateRbacPoliciesTest, IncorrectSourceType) {
  214. const char* authz_policy =
  215. "{"
  216. " \"name\": \"authz\","
  217. " \"allow_rules\": ["
  218. " {"
  219. " \"name\": \"allow_policy\","
  220. " \"source\": 111"
  221. " }"
  222. " ]"
  223. "}";
  224. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  225. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  226. EXPECT_EQ(rbac_policies.status().message(),
  227. "allow_rules 0: \"source\" is not an object.");
  228. }
  229. TEST(GenerateRbacPoliciesTest, IncorrectPrincipalsType) {
  230. const char* authz_policy =
  231. "{"
  232. " \"name\": \"authz\","
  233. " \"allow_rules\": ["
  234. " {"
  235. " \"name\": \"allow_policy\","
  236. " \"source\": {"
  237. " \"principals\": ["
  238. " \"*\","
  239. " 123"
  240. " ]"
  241. " }"
  242. " }"
  243. " ]"
  244. "}";
  245. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  246. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  247. EXPECT_EQ(rbac_policies.status().message(),
  248. "allow_rules 0: \"principals\" 1: is not a string.");
  249. }
  250. TEST(GenerateRbacPoliciesTest, ParseSourceSuccess) {
  251. const char* authz_policy =
  252. "{"
  253. " \"name\": \"authz\","
  254. " \"allow_rules\": ["
  255. " {"
  256. " \"name\": \"allow_policy\","
  257. " \"source\": {"
  258. " \"principals\": ["
  259. " \"spiffe://foo.abc\","
  260. " \"spiffe://bar*\","
  261. " \"*baz\","
  262. " \"spiffe://abc.*.com\""
  263. " ]"
  264. " }"
  265. " }"
  266. " ],"
  267. " \"deny_rules\": ["
  268. " {"
  269. " \"name\": \"deny_policy\","
  270. " \"source\": {"
  271. " \"principals\": ["
  272. " \"*\""
  273. " ]"
  274. " }"
  275. " }"
  276. " ]"
  277. "}";
  278. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  279. ASSERT_TRUE(rbac_policies.ok());
  280. EXPECT_EQ(rbac_policies.value().allow_policy.action, Rbac::Action::kAllow);
  281. EXPECT_THAT(rbac_policies.value().allow_policy.policies,
  282. ::testing::ElementsAre(::testing::Pair(
  283. "authz_allow_policy",
  284. ::testing::AllOf(
  285. ::testing::Field(
  286. &Rbac::Policy::permissions,
  287. ::testing::Field(&Rbac::Permission::type,
  288. Rbac::Permission::RuleType::kAny)),
  289. ::testing::Field(
  290. &Rbac::Policy::principals,
  291. ::testing::AllOf(
  292. ::testing::Field(&Rbac::Principal::type,
  293. Rbac::Principal::RuleType::kAnd),
  294. ::testing::Field(
  295. &Rbac::Principal::principals,
  296. ::testing::ElementsAre(::testing::AllOf(
  297. ::testing::Pointee(::testing::Field(
  298. &Rbac::Principal::type,
  299. Rbac::Principal::RuleType::kOr)),
  300. ::testing::Pointee(::testing::Field(
  301. &Rbac::Principal::principals,
  302. ::testing::ElementsAre(
  303. EqualsPrincipalName(
  304. StringMatcher::Type::kExact,
  305. "spiffe://foo.abc", false),
  306. EqualsPrincipalName(
  307. StringMatcher::Type::kPrefix,
  308. "spiffe://bar", false),
  309. EqualsPrincipalName(
  310. StringMatcher::Type::kSuffix,
  311. "baz", false),
  312. EqualsPrincipalName(
  313. StringMatcher::Type::kExact,
  314. "spiffe://abc.*.com",
  315. false)))))))))))));
  316. EXPECT_EQ(rbac_policies.value().deny_policy.action, Rbac::Action::kDeny);
  317. EXPECT_THAT(
  318. rbac_policies.value().deny_policy.policies,
  319. ::testing::ElementsAre(::testing::Pair(
  320. "authz_deny_policy",
  321. ::testing::AllOf(
  322. ::testing::Field(
  323. &Rbac::Policy::permissions,
  324. ::testing::Field(&Rbac::Permission::type,
  325. Rbac::Permission::RuleType::kAny)),
  326. ::testing::Field(
  327. &Rbac::Policy::principals,
  328. ::testing::AllOf(
  329. ::testing::Field(&Rbac::Principal::type,
  330. Rbac::Principal::RuleType::kAnd),
  331. ::testing::Field(
  332. &Rbac::Principal::principals,
  333. ::testing::ElementsAre(::testing::AllOf(
  334. ::testing::Pointee(::testing::Field(
  335. &Rbac::Principal::type,
  336. Rbac::Principal::RuleType::kOr)),
  337. ::testing::Pointee(::testing::Field(
  338. &Rbac::Principal::principals,
  339. ::testing::ElementsAre(EqualsPrincipalName(
  340. StringMatcher::Type::kSafeRegex, ".+",
  341. true)))))))))))));
  342. }
  343. TEST(GenerateRbacPoliciesTest, IncorrectRequestType) {
  344. const char* authz_policy =
  345. "{"
  346. " \"name\": \"authz\","
  347. " \"deny_rules\": ["
  348. " {"
  349. " \"name\": \"deny_policy\","
  350. " \"request\": 111"
  351. " }"
  352. " ]"
  353. "}";
  354. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  355. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  356. EXPECT_EQ(rbac_policies.status().message(),
  357. "deny_rules 0: \"request\" is not an object.");
  358. }
  359. TEST(GenerateRbacPoliciesTest, IncorrectPathType) {
  360. const char* authz_policy =
  361. "{"
  362. " \"name\": \"authz\","
  363. " \"deny_rules\": ["
  364. " {"
  365. " \"name\": \"allow_policy\","
  366. " \"request\": {"
  367. " \"paths\": ["
  368. " \"path-a\","
  369. " 123"
  370. " ]"
  371. " }"
  372. " }"
  373. " ]"
  374. "}";
  375. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  376. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  377. EXPECT_EQ(rbac_policies.status().message(),
  378. "deny_rules 0: \"paths\" 1: is not a string.");
  379. }
  380. TEST(GenerateRbacPoliciesTest, ParseRequestPathsSuccess) {
  381. const char* authz_policy =
  382. "{"
  383. " \"name\": \"authz\","
  384. " \"allow_rules\": ["
  385. " {"
  386. " \"name\": \"allow_policy\","
  387. " \"request\": {"
  388. " \"paths\": ["
  389. " \"*\""
  390. " ]"
  391. " }"
  392. " }"
  393. " ],"
  394. " \"deny_rules\": ["
  395. " {"
  396. " \"name\": \"deny_policy\","
  397. " \"request\": {"
  398. " \"paths\": ["
  399. " \"path-foo\","
  400. " \"path-bar*\","
  401. " \"*baz\""
  402. " ]"
  403. " }"
  404. " }"
  405. " ]"
  406. "}";
  407. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  408. ASSERT_TRUE(rbac_policies.ok());
  409. EXPECT_EQ(rbac_policies.value().deny_policy.action, Rbac::Action::kDeny);
  410. EXPECT_THAT(
  411. rbac_policies.value().deny_policy.policies,
  412. ::testing::ElementsAre(::testing::Pair(
  413. "authz_deny_policy",
  414. ::testing::AllOf(
  415. ::testing::Field(
  416. &Rbac::Policy::principals,
  417. ::testing::Field(&Rbac::Principal::type,
  418. Rbac::Principal::RuleType::kAny)),
  419. ::testing::Field(
  420. &Rbac::Policy::permissions,
  421. ::testing::AllOf(
  422. ::testing::Field(&Rbac::Permission::type,
  423. Rbac::Permission::RuleType::kAnd),
  424. ::testing::Field(
  425. &Rbac::Permission::permissions,
  426. ::testing::ElementsAre(::testing::AllOf(
  427. ::testing::Pointee(::testing::Field(
  428. &Rbac::Permission::type,
  429. Rbac::Permission::RuleType::kOr)),
  430. ::testing::Pointee(::testing::Field(
  431. &Rbac::Permission::permissions,
  432. ::testing::ElementsAre(
  433. EqualsPath(StringMatcher::Type::kExact,
  434. "path-foo", false),
  435. EqualsPath(StringMatcher::Type::kPrefix,
  436. "path-bar", false),
  437. EqualsPath(StringMatcher::Type::kSuffix,
  438. "baz", false)))))))))))));
  439. EXPECT_EQ(rbac_policies.value().allow_policy.action, Rbac::Action::kAllow);
  440. EXPECT_THAT(
  441. rbac_policies.value().allow_policy.policies,
  442. ::testing::ElementsAre(::testing::Pair(
  443. "authz_allow_policy",
  444. ::testing::AllOf(
  445. ::testing::Field(
  446. &Rbac::Policy::principals,
  447. ::testing::Field(&Rbac::Principal::type,
  448. Rbac::Principal::RuleType::kAny)),
  449. ::testing::Field(
  450. &Rbac::Policy::permissions,
  451. ::testing::AllOf(
  452. ::testing::Field(&Rbac::Permission::type,
  453. Rbac::Permission::RuleType::kAnd),
  454. ::testing::Field(
  455. &Rbac::Permission::permissions,
  456. ::testing::ElementsAre(::testing::AllOf(
  457. ::testing::Pointee(::testing::Field(
  458. &Rbac::Permission::type,
  459. Rbac::Permission::RuleType::kOr)),
  460. ::testing::Pointee(::testing::Field(
  461. &Rbac::Permission::permissions,
  462. ::testing::ElementsAre(EqualsPath(
  463. StringMatcher::Type::kSafeRegex, ".+",
  464. true)))))))))))));
  465. }
  466. TEST(GenerateRbacPoliciesTest, IncorrectHeaderType) {
  467. const char* authz_policy =
  468. "{"
  469. " \"name\": \"authz\","
  470. " \"deny_rules\": ["
  471. " {"
  472. " \"name\": \"allow_policy\","
  473. " \"request\": {"
  474. " \"headers\": ["
  475. " \"header-a\""
  476. " ]"
  477. " }"
  478. " }"
  479. " ]"
  480. "}";
  481. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  482. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  483. EXPECT_EQ(rbac_policies.status().message(),
  484. "deny_rules 0: \"headers\" 0: is not an object.");
  485. }
  486. TEST(GenerateRbacPoliciesTest, UnsupportedGrpcHeaders) {
  487. const char* authz_policy =
  488. "{"
  489. " \"name\": \"authz\","
  490. " \"deny_rules\": ["
  491. " {"
  492. " \"name\": \"policy\","
  493. " \"request\": {"
  494. " \"headers\": ["
  495. " {"
  496. " \"key\": \"grpc-xxx\","
  497. " \"values\": ["
  498. " \"*\""
  499. " ]"
  500. " }"
  501. " ]"
  502. " }"
  503. " }"
  504. " ]"
  505. "}";
  506. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  507. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  508. EXPECT_EQ(rbac_policies.status().message(),
  509. "deny_rules 0: \"headers\" 0: Unsupported \"key\" grpc-xxx.");
  510. }
  511. TEST(GenerateRbacPoliciesTest, UnsupportedPseudoHeaders) {
  512. const char* authz_policy =
  513. "{"
  514. " \"name\": \"authz\","
  515. " \"allow_rules\": ["
  516. " {"
  517. " \"name\": \"policy\","
  518. " \"request\": {"
  519. " \"headers\": ["
  520. " {"
  521. " \"key\": \":method\","
  522. " \"values\": ["
  523. " \"*\""
  524. " ]"
  525. " }"
  526. " ]"
  527. " }"
  528. " }"
  529. " ]"
  530. "}";
  531. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  532. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  533. EXPECT_EQ(rbac_policies.status().message(),
  534. "allow_rules 0: \"headers\" 0: Unsupported \"key\" :method.");
  535. }
  536. TEST(GenerateRbacPoliciesTest, UnsupportedHostHeader) {
  537. const char* authz_policy =
  538. "{"
  539. " \"name\": \"authz\","
  540. " \"allow_rules\": ["
  541. " {"
  542. " \"name\": \"policy\","
  543. " \"request\": {"
  544. " \"headers\": ["
  545. " {"
  546. " \"key\": \"Host\","
  547. " \"values\": ["
  548. " \"*\""
  549. " ]"
  550. " }"
  551. " ]"
  552. " }"
  553. " }"
  554. " ]"
  555. "}";
  556. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  557. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  558. EXPECT_EQ(rbac_policies.status().message(),
  559. "allow_rules 0: \"headers\" 0: Unsupported \"key\" Host.");
  560. }
  561. TEST(GenerateRbacPoliciesTest, EmptyHeaderValuesList) {
  562. const char* authz_policy =
  563. "{"
  564. " \"name\": \"authz\","
  565. " \"allow_rules\": ["
  566. " {"
  567. " \"name\": \"allow_policy_1\","
  568. " \"request\": {"
  569. " \"headers\": ["
  570. " {"
  571. " \"key\": \"key-a\","
  572. " \"values\": ["
  573. " ]"
  574. " }"
  575. " ]"
  576. " }"
  577. " }"
  578. " ]"
  579. "}";
  580. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  581. EXPECT_EQ(rbac_policies.status().code(), absl::StatusCode::kInvalidArgument);
  582. EXPECT_EQ(rbac_policies.status().message(),
  583. "allow_rules 0: \"headers\" 0: \"values\" list is empty.");
  584. }
  585. TEST(GenerateRbacPoliciesTest, ParseRequestHeadersSuccess) {
  586. const char* authz_policy =
  587. "{"
  588. " \"name\": \"authz\","
  589. " \"allow_rules\": ["
  590. " {"
  591. " \"name\": \"allow_policy\","
  592. " \"request\": {"
  593. " \"headers\": ["
  594. " {"
  595. " \"key\": \"key-1\","
  596. " \"values\": ["
  597. " \"*\""
  598. " ]"
  599. " },"
  600. " {"
  601. " \"key\": \"key-2\","
  602. " \"values\": ["
  603. " \"foo\","
  604. " \"bar*\","
  605. " \"*baz\""
  606. " ]"
  607. " }"
  608. " ]"
  609. " }"
  610. " }"
  611. " ]"
  612. "}";
  613. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  614. ASSERT_TRUE(rbac_policies.ok());
  615. EXPECT_EQ(rbac_policies.value().deny_policy.action, Rbac::Action::kDeny);
  616. EXPECT_TRUE(rbac_policies.value().deny_policy.policies.empty());
  617. EXPECT_EQ(rbac_policies.value().allow_policy.action, Rbac::Action::kAllow);
  618. EXPECT_THAT(
  619. rbac_policies.value().allow_policy.policies,
  620. ::testing::ElementsAre(::testing::Pair(
  621. "authz_allow_policy",
  622. ::testing::AllOf(
  623. ::testing::Field(
  624. &Rbac::Policy::principals,
  625. ::testing::Field(&Rbac::Principal::type,
  626. Rbac::Principal::RuleType::kAny)),
  627. ::testing::Field(
  628. &Rbac::Policy::permissions,
  629. ::testing::AllOf(
  630. ::testing::Field(&Rbac::Permission::type,
  631. Rbac::Permission::RuleType::kAnd),
  632. ::testing::Field(
  633. &Rbac::Permission::permissions,
  634. ::testing::ElementsAre(::testing::AllOf(
  635. ::testing::Pointee(::testing::Field(
  636. &Rbac::Permission::type,
  637. Rbac::Permission::RuleType::kAnd)),
  638. ::testing::Pointee(::testing::Field(
  639. &Rbac::Permission::permissions,
  640. ::testing::ElementsAre(
  641. ::testing::AllOf(
  642. ::testing::Pointee(::testing::Field(
  643. &Rbac::Permission::type,
  644. Rbac::Permission::RuleType::kOr)),
  645. ::testing::Pointee(::testing::Field(
  646. &Rbac::Permission::permissions,
  647. ::testing::ElementsAre(
  648. EqualsHeader(
  649. "key-1",
  650. HeaderMatcher::Type::
  651. kSafeRegex,
  652. ".+", true))))),
  653. ::testing::AllOf(
  654. ::testing::Pointee(::testing::Field(
  655. &Rbac::Permission::type,
  656. Rbac::Permission::RuleType::kOr)),
  657. ::testing::Pointee(::testing::Field(
  658. &Rbac::Permission::permissions,
  659. ::testing::ElementsAre(
  660. EqualsHeader("key-2",
  661. HeaderMatcher::
  662. Type::kExact,
  663. "foo", false),
  664. EqualsHeader(
  665. "key-2",
  666. HeaderMatcher::Type::
  667. kPrefix,
  668. "bar", false),
  669. EqualsHeader(
  670. "key-2",
  671. HeaderMatcher::Type::
  672. kSuffix,
  673. "baz",
  674. false)))))))))))))))));
  675. }
  676. TEST(GenerateRbacPoliciesTest, ParseRulesArraySuccess) {
  677. const char* authz_policy =
  678. "{"
  679. " \"name\": \"authz\","
  680. " \"allow_rules\": ["
  681. " {"
  682. " \"name\": \"allow_policy_1\","
  683. " \"source\": {"
  684. " \"principals\": ["
  685. " \"spiffe://foo.abc\""
  686. " ]"
  687. " },"
  688. " \"request\": {"
  689. " \"paths\": ["
  690. " \"foo\""
  691. " ]"
  692. " }"
  693. " },"
  694. " {"
  695. " \"name\": \"allow_policy_2\""
  696. " }"
  697. " ]"
  698. "}";
  699. auto rbac_policies = GenerateRbacPolicies(authz_policy);
  700. ASSERT_TRUE(rbac_policies.ok());
  701. EXPECT_EQ(rbac_policies.value().deny_policy.action, Rbac::Action::kDeny);
  702. EXPECT_TRUE(rbac_policies.value().deny_policy.policies.empty());
  703. EXPECT_EQ(rbac_policies.value().allow_policy.action, Rbac::Action::kAllow);
  704. EXPECT_THAT(
  705. rbac_policies.value().allow_policy.policies,
  706. ::testing::ElementsAre(
  707. ::testing::Pair(
  708. "authz_allow_policy_1",
  709. ::testing::AllOf(
  710. ::testing::Field(
  711. &Rbac::Policy::permissions,
  712. ::testing::AllOf(
  713. ::testing::Field(&Rbac::Permission::type,
  714. Rbac::Permission::RuleType::kAnd),
  715. ::testing::Field(
  716. &Rbac::Permission::permissions,
  717. ::testing::ElementsAre(::testing::AllOf(
  718. ::testing::Pointee(::testing::Field(
  719. &Rbac::Permission::type,
  720. Rbac::Permission::RuleType::kOr)),
  721. ::testing::Pointee(::testing::Field(
  722. &Rbac::Permission::permissions,
  723. ::testing::ElementsAre(EqualsPath(
  724. StringMatcher::Type::kExact, "foo",
  725. false))))))))),
  726. ::testing::Field(
  727. &Rbac::Policy::principals,
  728. ::testing::AllOf(
  729. ::testing::Field(&Rbac::Principal::type,
  730. Rbac::Principal::RuleType::kAnd),
  731. ::testing::Field(
  732. &Rbac::Principal::principals,
  733. ::testing::ElementsAre(::testing::AllOf(
  734. ::testing::Pointee(::testing::Field(
  735. &Rbac::Principal::type,
  736. Rbac::Principal::RuleType::kOr)),
  737. ::testing::Pointee(::testing::Field(
  738. &Rbac::Principal::principals,
  739. ::testing::ElementsAre(
  740. EqualsPrincipalName(
  741. StringMatcher::Type::kExact,
  742. "spiffe://foo.abc",
  743. false))))))))))),
  744. ::testing::Pair(
  745. "authz_allow_policy_2",
  746. ::testing::AllOf(
  747. ::testing::Field(
  748. &Rbac::Policy::permissions,
  749. ::testing::Field(&Rbac::Permission::type,
  750. Rbac::Permission::RuleType::kAny)),
  751. ::testing::Field(
  752. &Rbac::Policy::principals,
  753. ::testing::Field(&Rbac::Principal::type,
  754. Rbac::Principal::RuleType::kAny))))));
  755. }
  756. } // namespace grpc_core
  757. int main(int argc, char** argv) {
  758. ::testing::InitGoogleTest(&argc, argv);
  759. return RUN_ALL_TESTS();
  760. }