in xds/utils/rbac/matchers.go [147:214]
func matchersFromPrincipals(principals []*v3rbacpb.Principal) ([]matcher, error) {
var matchers []matcher
for _, principal := range principals {
switch principal.GetIdentifier().(type) {
case *v3rbacpb.Principal_AndIds:
mList, err := matchersFromPrincipals(principal.GetAndIds().Ids)
if err != nil {
return nil, err
}
matchers = append(matchers, &andMatcher{matchers: mList})
case *v3rbacpb.Principal_OrIds:
mList, err := matchersFromPrincipals(principal.GetOrIds().Ids)
if err != nil {
return nil, err
}
matchers = append(matchers, &orMatcher{matchers: mList})
case *v3rbacpb.Principal_Any:
matchers = append(matchers, &alwaysMatcher{})
case *v3rbacpb.Principal_Authenticated_:
authenticatedMatcher, err := newAuthenticatedMatcher(principal.GetAuthenticated())
if err != nil {
return nil, err
}
matchers = append(matchers, authenticatedMatcher)
case *v3rbacpb.Principal_DirectRemoteIp:
m, err := newRemoteIPMatcher(principal.GetDirectRemoteIp())
if err != nil {
return nil, err
}
matchers = append(matchers, m)
case *v3rbacpb.Principal_Header:
// Do we need an error here?
m, err := newHeaderMatcher(principal.GetHeader())
if err != nil {
return nil, err
}
matchers = append(matchers, m)
case *v3rbacpb.Principal_UrlPath:
m, err := newURLPathMatcher(principal.GetUrlPath())
if err != nil {
return nil, err
}
matchers = append(matchers, m)
case *v3rbacpb.Principal_NotId:
mList, err := matchersFromPrincipals([]*v3rbacpb.Principal{{Identifier: principal.GetNotId().Identifier}})
if err != nil {
return nil, err
}
matchers = append(matchers, ¬Matcher{matcherToNot: mList[0]})
case *v3rbacpb.Principal_SourceIp:
// The source ip principal identifier is deprecated. Thus, a
// principal typed as a source ip in the identifier will be a no-op.
// The config should use DirectRemoteIp instead.
case *v3rbacpb.Principal_RemoteIp:
// RBAC in gRPC treats direct_remote_ip and remote_ip as logically
// equivalent, as per A41.
m, err := newRemoteIPMatcher(principal.GetRemoteIp())
if err != nil {
return nil, err
}
matchers = append(matchers, m)
case *v3rbacpb.Principal_Metadata:
// Not supported in gRPC RBAC currently - a principal typed as
// Metadata in the initial config will be a no-op.
}
}
return matchers, nil
}