25 #include <type_traits>
29 #include "absl/memory/memory.h"
30 #include "absl/status/status.h"
31 #include "absl/strings/match.h"
32 #include "absl/strings/str_cat.h"
33 #include "absl/strings/str_format.h"
34 #include "absl/strings/strip.h"
77 static const char*
const kUnsupportedHeaders[] = {
"host",
81 "proxy-authorization",
95 std::vector<std::unique_ptr<Rbac::Principal>> principal_names;
96 for (
size_t i = 0;
i < json.array_value().
size(); ++
i) {
97 const Json&
child = json.array_value().at(i);
100 absl::StrCat(
"\"principals\" ", i,
": is not a string."));
102 auto matcher_or = GetStringMatcher(
child.string_value());
103 if (!matcher_or.ok()) {
106 matcher_or.status().message()));
108 principal_names.push_back(absl::make_unique<Rbac::Principal>(
116 std::vector<std::unique_ptr<Rbac::Principal>> peer;
117 auto it = json.object_value().find(
"principals");
118 if (
it != json.object_value().end()) {
122 auto principal_names_or = ParsePrincipalsArray(
it->second);
123 if (!principal_names_or.ok())
return principal_names_or.status();
124 if (!principal_names_or.value().principals.empty()) {
125 peer.push_back(absl::make_unique<Rbac::Principal>(
137 if (json.array_value().empty()) {
140 std::vector<std::unique_ptr<Rbac::Permission>>
values;
141 for (
size_t i = 0;
i < json.array_value().
size(); ++
i) {
142 const Json&
child = json.array_value().at(i);
147 auto matcher_or = GetHeaderMatcher(header_name,
child.string_value());
148 if (!matcher_or.ok()) {
150 matcher_or.status().code(),
151 absl::StrCat(
"\"values\" ", i,
": ", matcher_or.status().message()));
153 values.push_back(absl::make_unique<Rbac::Permission>(
160 auto it = json.object_value().find(
"key");
161 if (
it == json.object_value().end()) {
170 IsUnsupportedHeader(header_name)) {
174 it = json.object_value().find(
"values");
175 if (
it == json.object_value().end()) {
181 return ParseHeaderValues(
it->second, header_name);
185 std::vector<std::unique_ptr<Rbac::Permission>> headers;
186 for (
size_t i = 0;
i < json.array_value().
size(); ++
i) {
187 const Json&
child = json.array_value().at(i);
190 absl::StrCat(
"\"headers\" ", i,
": is not an object."));
192 auto headers_or = ParseHeaders(
child);
193 if (!headers_or.ok()) {
195 headers_or.status().code(),
196 absl::StrCat(
"\"headers\" ", i,
": ", headers_or.status().message()));
199 absl::make_unique<Rbac::Permission>(
std::move(headers_or.value())));
205 std::vector<std::unique_ptr<Rbac::Permission>> paths;
206 for (
size_t i = 0;
i < json.array_value().
size(); ++
i) {
207 const Json&
child = json.array_value().at(i);
212 auto matcher_or = GetStringMatcher(
child.string_value());
213 if (!matcher_or.ok()) {
215 matcher_or.status().code(),
216 absl::StrCat(
"\"paths\" ", i,
": ", matcher_or.status().message()));
218 paths.push_back(absl::make_unique<Rbac::Permission>(
225 std::vector<std::unique_ptr<Rbac::Permission>>
request;
226 auto it = json.object_value().find(
"paths");
227 if (
it != json.object_value().end()) {
231 auto paths_or = ParsePathsArray(
it->second);
232 if (!paths_or.ok())
return paths_or.status();
233 if (!paths_or.value().permissions.empty()) {
235 absl::make_unique<Rbac::Permission>(
std::move(paths_or.value())));
238 it = json.object_value().find(
"headers");
239 if (
it != json.object_value().end()) {
243 auto headers_or = ParseHeadersArray(
it->second);
244 if (!headers_or.ok())
return headers_or.status();
245 if (!headers_or.value().permissions.empty()) {
247 absl::make_unique<Rbac::Permission>(
std::move(headers_or.value())));
257 Rbac::Principal principals;
258 auto it = json.object_value().find(
"source");
259 if (
it != json.object_value().end()) {
263 auto peer_or = ParsePeer(
it->second);
264 if (!peer_or.ok())
return peer_or.status();
269 Rbac::Permission permissions;
270 it = json.object_value().find(
"request");
271 if (
it != json.object_value().end()) {
275 auto request_or = ParseRequest(
it->second);
276 if (!request_or.ok())
return request_or.status();
277 permissions =
std::move(request_or.value());
286 std::map<std::string, Rbac::Policy> policies;
287 for (
size_t i = 0;
i < json.array_value().
size(); ++
i) {
288 const Json&
child = json.array_value().at(i);
293 auto it =
child.object_value().find(
"name");
294 if (
it ==
child.object_value().end()) {
296 absl::StrCat(
"rules ", i,
": \"name\" is not present."));
300 absl::StrCat(
"rules ", i,
": \"name\" is not a string."));
304 auto policy_or = ParseRules(
child);
305 if (!policy_or.ok()) {
307 policy_or.status().code(),
308 absl::StrCat(
"rules ", i,
": ", policy_or.status().message()));
310 policies[policy_name] =
std::move(policy_or.value());
317 auto policies_or = ParseRulesArray(json,
name);
318 if (!policies_or.ok())
return policies_or.status();
324 auto policies_or = ParseRulesArray(json,
name);
325 if (!policies_or.ok())
return policies_or.status();
337 absl::StrCat(
"Failed to parse gRPC authorization policy. Error: ",
344 "SDK authorization policy is not an object.");
360 auto deny_policy_or = ParseDenyRulesArray(
it->second,
name);
361 if (!deny_policy_or.ok()) {
363 deny_policy_or.status().code(),
364 absl::StrCat(
"deny_", deny_policy_or.status().message()));
377 auto allow_policy_or = ParseAllowRulesArray(
it->second,
name);
378 if (!allow_policy_or.ok()) {
380 allow_policy_or.status().code(),
381 absl::StrCat(
"allow_", allow_policy_or.status().message()));