26 #include "absl/memory/memory.h"
27 #include "absl/status/status.h"
28 #include "absl/status/statusor.h"
29 #include "absl/strings/str_format.h"
43 std::vector<grpc_error_handle>* error_list) {
51 std::vector<grpc_error_handle>* error_list) {
59 bool present_match =
false;
60 bool invert_match =
false;
67 &inner_json, error_list,
70 std::vector<grpc_error_handle> safe_regex_matcher_error_list;
71 match = ParseRegexMatcher(*inner_json, &safe_regex_matcher_error_list);
72 if (!safe_regex_matcher_error_list.empty()) {
74 "safeRegexMatch", &safe_regex_matcher_error_list));
77 &inner_json, error_list,
80 std::vector<grpc_error_handle> range_error_list;
83 if (!range_error_list.empty()) {
84 error_list->push_back(
88 &present_match, error_list,
109 std::vector<grpc_error_handle>* error_list) {
113 bool ignore_case =
false;
120 error_list,
false)) {
123 error_list,
false)) {
126 error_list,
false)) {
128 std::vector<grpc_error_handle> safe_regex_matcher_error_list;
129 match = ParseRegexMatcher(*inner_json, &safe_regex_matcher_error_list);
130 if (!safe_regex_matcher_error_list.empty()) {
132 "safeRegex", &safe_regex_matcher_error_list));
135 error_list,
false)) {
145 std::vector<grpc_error_handle>* error_list) {
149 std::vector<grpc_error_handle> sub_error_list;
150 auto matcher = ParseStringMatcher(*string_matcher_json, &sub_error_list);
151 if (!sub_error_list.empty()) {
152 error_list->push_back(
160 Rbac::CidrRange ParseCidrRange(
const Json::Object& cidr_range_json,
161 std::vector<grpc_error_handle>* error_list) {
168 error_list,
false)) {
169 std::vector<grpc_error_handle> sub_error_list;
171 if (!sub_error_list.empty()) {
172 error_list->push_back(
176 return Rbac::CidrRange(
std::move(address_prefix), prefix_len);
179 Rbac::Permission ParsePermission(
const Json::Object& permission_json,
180 std::vector<grpc_error_handle>* error_list) {
181 auto parse_permission_set = [](
const Json::Object& permission_set_json,
182 std::vector<grpc_error_handle>* error_list) {
184 std::vector<std::unique_ptr<Rbac::Permission>> permissions;
187 for (
size_t i = 0;
i < rules_json->size(); ++
i) {
191 &permission_json, error_list)) {
194 std::vector<grpc_error_handle> permission_error_list;
195 permissions.emplace_back(absl::make_unique<Rbac::Permission>(
196 ParsePermission(*permission_json, &permission_error_list)));
197 if (!permission_error_list.empty()) {
205 Rbac::Permission permission;
211 std::vector<grpc_error_handle> and_rules_error_list;
213 parse_permission_set(*inner_json, &and_rules_error_list));
214 if (!and_rules_error_list.empty()) {
215 error_list->push_back(
219 error_list,
false)) {
220 std::vector<grpc_error_handle> or_rules_error_list;
222 parse_permission_set(*inner_json, &or_rules_error_list));
223 if (!or_rules_error_list.empty()) {
224 error_list->push_back(
234 std::vector<grpc_error_handle> header_error_list;
235 auto matcher = ParseHeaderMatcher(*inner_json, &header_error_list);
241 if (!header_error_list.empty()) {
242 error_list->push_back(
248 std::vector<grpc_error_handle> url_path_error_list;
249 auto matcher = ParsePathMatcher(*inner_json, &url_path_error_list);
253 url_path_error_list.push_back(
256 if (!url_path_error_list.empty()) {
257 error_list->push_back(
261 error_list,
false)) {
262 std::vector<grpc_error_handle> destination_ip_error_list;
264 ParseCidrRange(*inner_json, &destination_ip_error_list));
265 if (!destination_ip_error_list.empty()) {
267 "destinationIp", &destination_ip_error_list));
270 error_list,
false)) {
273 error_list,
false)) {
274 std::vector<grpc_error_handle> metadata_error_list;
278 if (metadata_error_list.empty()) {
281 error_list->push_back(
285 error_list,
false)) {
286 std::vector<grpc_error_handle> not_rule_error_list;
288 ParsePermission(*inner_json, ¬_rule_error_list));
289 if (!not_rule_error_list.empty()) {
290 error_list->push_back(
294 &inner_json, error_list,
296 std::vector<grpc_error_handle> req_server_name_error_list;
297 auto matcher = ParseStringMatcher(*inner_json, &req_server_name_error_list);
301 req_server_name_error_list.push_back(
304 if (!req_server_name_error_list.empty()) {
306 "requestedServerName", &req_server_name_error_list));
309 error_list->push_back(
315 Rbac::Principal ParsePrincipal(
const Json::Object& principal_json,
316 std::vector<grpc_error_handle>* error_list) {
317 auto parse_principal_set = [](
const Json::Object& principal_set_json,
318 std::vector<grpc_error_handle>* error_list) {
320 std::vector<std::unique_ptr<Rbac::Principal>> principals;
323 for (
size_t i = 0;
i < rules_json->size(); ++
i) {
327 &principal_json, error_list)) {
330 std::vector<grpc_error_handle> principal_error_list;
331 principals.emplace_back(absl::make_unique<Rbac::Principal>(
332 ParsePrincipal(*principal_json, &principal_error_list)));
333 if (!principal_error_list.empty()) {
341 Rbac::Principal principal;
346 std::vector<grpc_error_handle> and_rules_error_list;
348 parse_principal_set(*inner_json, &and_rules_error_list));
349 if (!and_rules_error_list.empty()) {
350 error_list->push_back(
354 error_list,
false)) {
355 std::vector<grpc_error_handle> or_rules_error_list;
357 parse_principal_set(*inner_json, &or_rules_error_list));
358 if (!or_rules_error_list.empty()) {
359 error_list->push_back(
367 error_list,
false)) {
368 std::vector<grpc_error_handle> authenticated_error_list;
371 &authenticated_error_list,
false)) {
372 std::vector<grpc_error_handle> principal_name_error_list;
374 ParseStringMatcher(*principal_name_json, &principal_name_error_list);
378 principal_name_error_list.push_back(
381 if (!principal_name_error_list.empty()) {
383 "principalName", &principal_name_error_list));
385 }
else if (authenticated_error_list.empty()) {
390 "authenticated", &authenticated_error_list));
393 error_list,
false)) {
394 std::vector<grpc_error_handle> source_ip_error_list;
396 ParseCidrRange(*inner_json, &source_ip_error_list));
397 if (!source_ip_error_list.empty()) {
398 error_list->push_back(
402 error_list,
false)) {
403 std::vector<grpc_error_handle> direct_remote_ip_error_list;
405 ParseCidrRange(*inner_json, &direct_remote_ip_error_list));
406 if (!direct_remote_ip_error_list.empty()) {
408 "directRemoteIp", &direct_remote_ip_error_list));
411 error_list,
false)) {
412 std::vector<grpc_error_handle> remote_ip_error_list;
414 ParseCidrRange(*inner_json, &remote_ip_error_list));
415 if (!remote_ip_error_list.empty()) {
416 error_list->push_back(
422 std::vector<grpc_error_handle> header_error_list;
423 auto matcher = ParseHeaderMatcher(*inner_json, &header_error_list);
429 if (!header_error_list.empty()) {
430 error_list->push_back(
436 std::vector<grpc_error_handle> url_path_error_list;
437 auto matcher = ParsePathMatcher(*inner_json, &url_path_error_list);
441 url_path_error_list.push_back(
444 if (!url_path_error_list.empty()) {
445 error_list->push_back(
449 error_list,
false)) {
450 std::vector<grpc_error_handle> metadata_error_list;
454 if (metadata_error_list.empty()) {
457 error_list->push_back(
461 error_list,
false)) {
462 std::vector<grpc_error_handle> not_rule_error_list;
464 ParsePrincipal(*inner_json, ¬_rule_error_list));
465 if (!not_rule_error_list.empty()) {
466 error_list->push_back(
470 error_list->push_back(
476 Rbac::Policy ParsePolicy(
const Json::Object& policy_json,
477 std::vector<grpc_error_handle>* error_list) {
480 std::vector<std::unique_ptr<Rbac::Permission>> permissions;
483 for (
size_t i = 0;
i < permissions_json_array->size(); ++
i) {
487 &permission_json, error_list)) {
490 std::vector<grpc_error_handle> permission_error_list;
491 permissions.emplace_back(absl::make_unique<Rbac::Permission>(
492 ParsePermission(*permission_json, &permission_error_list)));
493 if (!permission_error_list.empty()) {
500 std::vector<std::unique_ptr<Rbac::Principal>> principals;
503 for (
size_t i = 0;
i < principals_json_array->size(); ++
i) {
507 &principal_json, error_list)) {
510 std::vector<grpc_error_handle> principal_error_list;
511 principals.emplace_back(absl::make_unique<Rbac::Principal>(
512 ParsePrincipal(*principal_json, &principal_error_list)));
513 if (!principal_error_list.empty()) {
526 std::vector<grpc_error_handle>* error_list) {
538 error_list->push_back(
546 for (
const auto& entry : *policies_json) {
547 std::vector<grpc_error_handle> policy_error_list;
548 rbac.policies.emplace(
550 ParsePolicy(entry.second.object_value(), &policy_error_list));
551 if (!policy_error_list.empty()) {
554 &policy_error_list));
561 std::vector<Rbac> ParseRbacArray(
const Json::Array& policies_json_array,
562 std::vector<grpc_error_handle>* error_list) {
563 std::vector<Rbac> policies;
564 for (
size_t i = 0;
i < policies_json_array.size(); ++
i) {
571 std::vector<grpc_error_handle> rbac_policy_error_list;
572 policies.emplace_back(ParseRbac(*rbac_json, &rbac_policy_error_list));
573 if (!rbac_policy_error_list.empty()) {
583 std::unique_ptr<ServiceConfigParser::ParsedConfig>
593 std::vector<Rbac> rbac_policies;
594 std::vector<grpc_error_handle> error_list;
597 &policies_json_array, &error_list)) {
598 rbac_policies = ParseRbacArray(*policies_json_array, &error_list);
604 return absl::make_unique<RbacMethodParsedConfig>(
std::move(rbac_policies));
608 builder->service_config_parser()->RegisterParser(
609 absl::make_unique<RbacServiceConfigParser>());