Add identity templating helper to sdk/framework (#8088)

* Add identity templating helper to sdk/framework

* Cleanup a bit

* Fix length issue when groups/aliases are filtered due to ns

* review feedback
This commit is contained in:
Brian Kassouf
2020-01-06 10:16:52 -08:00
committed by GitHub
parent e8c1ef5a0a
commit 5fc424d3f5
26 changed files with 1827 additions and 432 deletions

View File

@@ -5,6 +5,7 @@ import (
proto "github.com/golang/protobuf/proto"
"github.com/hashicorp/errwrap"
"github.com/hashicorp/vault/sdk/logical"
)
func (g *Group) Clone() (*Group, error) {
@@ -63,3 +64,83 @@ func (p *Alias) Clone() (*Alias, error) {
return &clonedAlias, nil
}
// ToSDKAlias converts the provided alias to an SDK compatible alias.
func ToSDKAlias(a *Alias) *logical.Alias {
if a == nil {
return nil
}
metadata := make(map[string]string, len(a.Metadata))
for k, v := range a.Metadata {
metadata[k] = v
}
return &logical.Alias{
Name: a.Name,
ID: a.ID,
MountAccessor: a.MountAccessor,
MountType: a.MountType,
Metadata: metadata,
NamespaceID: a.NamespaceID,
}
}
// ToSDKEntity converts the provided entity to an SDK compatible entity.
func ToSDKEntity(e *Entity) *logical.Entity {
if e == nil {
return nil
}
aliases := make([]*logical.Alias, len(e.Aliases))
for i, a := range e.Aliases {
aliases[i] = ToSDKAlias(a)
}
metadata := make(map[string]string, len(e.Metadata))
for k, v := range e.Metadata {
metadata[k] = v
}
return &logical.Entity{
ID: e.ID,
Name: e.Name,
Disabled: e.Disabled,
Aliases: aliases,
Metadata: metadata,
NamespaceID: e.NamespaceID,
}
}
// ToSDKGroup converts the provided group to an SDK compatible group.
func ToSDKGroup(g *Group) *logical.Group {
if g == nil {
return nil
}
metadata := make(map[string]string, len(g.Metadata))
for k, v := range g.Metadata {
metadata[k] = v
}
return &logical.Group{
ID: g.ID,
Name: g.Name,
Metadata: metadata,
NamespaceID: g.NamespaceID,
}
}
// ToSDKGroups converts the provided group list to an SDK compatible group list.
func ToSDKGroups(groups []*Group) []*logical.Group {
if groups == nil {
return nil
}
ret := make([]*logical.Group, len(groups))
for i, g := range groups {
ret[i] = ToSDKGroup(g)
}
return ret
}

57
sdk/framework/identity.go Normal file
View File

@@ -0,0 +1,57 @@
package framework
import (
"errors"
"github.com/hashicorp/errwrap"
"github.com/hashicorp/vault/sdk/helper/identitytpl"
"github.com/hashicorp/vault/sdk/logical"
)
// PopulateIdentityTemplate takes a template string, an entity ID, and an
// instance of system view. It will query system view for information about the
// entity and use the resulting identity information to populate the template
// string.
func PopulateIdentityTemplate(tpl string, entityID string, sysView logical.SystemView) (string, error) {
entity, err := sysView.EntityInfo(entityID)
if err != nil {
return "", err
}
if entity == nil {
return "", errors.New("no entity found")
}
groups, err := sysView.GroupsForEntity(entityID)
if err != nil {
return "", err
}
input := identitytpl.PopulateStringInput{
String: tpl,
Entity: entity,
Groups: groups,
Mode: identitytpl.ACLTemplating,
}
_, out, err := identitytpl.PopulateString(input)
if err != nil {
return "", err
}
return out, nil
}
// ValidateIdentityTemplate takes a template string and returns if the string is
// a valid identity template.
func ValidateIdentityTemplate(tpl string) (bool, error) {
hasTemplating, _, err := identitytpl.PopulateString(identitytpl.PopulateStringInput{
Mode: identitytpl.ACLTemplating,
ValidityCheckOnly: true,
String: tpl,
})
if err != nil {
return false, errwrap.Wrapf("failed to validate policy templating: {{err}}", err)
}
return hasTemplating, nil
}

View File

@@ -0,0 +1,100 @@
package framework
import (
"testing"
"github.com/hashicorp/vault/sdk/logical"
)
func TestIdentityTemplating(t *testing.T) {
sysView := &logical.StaticSystemView{
EntityVal: &logical.Entity{
ID: "test-id",
Name: "test",
Aliases: []*logical.Alias{
{
ID: "alias-id",
Name: "test alias",
MountAccessor: "test_mount",
MountType: "secret",
Metadata: map[string]string{
"alias-metadata": "alias-metadata-value",
},
},
},
Metadata: map[string]string{
"entity-metadata": "entity-metadata-value",
},
},
GroupsVal: []*logical.Group{
{
ID: "group1-id",
Name: "group1",
Metadata: map[string]string{
"group-metadata": "group-metadata-value",
},
},
},
}
tCases := []struct {
tpl string
expected string
}{
{
tpl: "{{identity.entity.id}}",
expected: "test-id",
},
{
tpl: "{{identity.entity.name}}",
expected: "test",
},
{
tpl: "{{identity.entity.metadata.entity-metadata}}",
expected: "entity-metadata-value",
},
{
tpl: "{{identity.entity.aliases.test_mount.id}}",
expected: "alias-id",
},
{
tpl: "{{identity.entity.aliases.test_mount.id}}",
expected: "alias-id",
},
{
tpl: "{{identity.entity.aliases.test_mount.name}}",
expected: "test alias",
},
{
tpl: "{{identity.entity.aliases.test_mount.metadata.alias-metadata}}",
expected: "alias-metadata-value",
},
{
tpl: "{{identity.groups.ids.group1-id.name}}",
expected: "group1",
},
{
tpl: "{{identity.groups.names.group1.id}}",
expected: "group1-id",
},
{
tpl: "{{identity.groups.names.group1.metadata.group-metadata}}",
expected: "group-metadata-value",
},
{
tpl: "{{identity.groups.ids.group1-id.metadata.group-metadata}}",
expected: "group-metadata-value",
},
}
for _, tCase := range tCases {
out, err := PopulateIdentityTemplate(tCase.tpl, "test", sysView)
if err != nil {
t.Fatal(err)
}
if out != tCase.expected {
t.Fatalf("got %q, expected %q", out, tCase.expected)
}
}
}

View File

@@ -1,4 +1,4 @@
package identity
package identitytpl
import (
"encoding/json"
@@ -9,7 +9,7 @@ import (
"time"
"github.com/hashicorp/errwrap"
"github.com/hashicorp/vault/helper/namespace"
"github.com/hashicorp/vault/sdk/logical"
)
var (
@@ -27,9 +27,9 @@ const (
type PopulateStringInput struct {
String string
ValidityCheckOnly bool
Entity *Entity
Groups []*Group
Namespace *namespace.Namespace
Entity *logical.Entity
Groups []*logical.Group
NamespaceID string
Mode int // processing mode, ACLTemplate or JSONTemplating
Now time.Time // optional, defaults to current time
@@ -165,7 +165,7 @@ func PopulateString(p PopulateStringInput) (bool, string, error) {
func performTemplating(input string, p *PopulateStringInput) (string, error) {
performAliasTemplating := func(trimmed string, alias *Alias) (string, error) {
performAliasTemplating := func(trimmed string, alias *logical.Alias) (string, error) {
switch {
case trimmed == "id":
return p.templateHandler(alias.ID)
@@ -210,7 +210,7 @@ func performTemplating(input string, p *PopulateStringInput) (string, error) {
if len(split) != 2 {
return "", errors.New("invalid alias selector")
}
var alias *Alias
var alias *logical.Alias
for _, a := range p.Entity.Aliases {
if split[0] == a.MountAccessor {
alias = a
@@ -223,7 +223,7 @@ func performTemplating(input string, p *PopulateStringInput) (string, error) {
}
// An empty alias is sufficient for generating defaults
alias = &Alias{Metadata: make(map[string]string)}
alias = &logical.Alias{Metadata: make(map[string]string)}
}
return performAliasTemplating(split[1], alias)
}
@@ -254,17 +254,16 @@ func performTemplating(input string, p *PopulateStringInput) (string, error) {
if len(accessorSplit) != 2 {
return "", errors.New("invalid groups accessor")
}
var found *Group
var found *logical.Group
for _, group := range p.Groups {
var compare string
if ids {
compare = group.ID
} else {
if p.Namespace != nil && group.NamespaceID == p.Namespace.ID {
compare = group.Name
} else {
if p.NamespaceID != "" && group.NamespaceID != p.NamespaceID {
continue
}
compare = group.Name
}
if compare == accessorSplit[0] {

View File

@@ -1,4 +1,4 @@
package identity
package identitytpl
import (
"errors"
@@ -8,7 +8,7 @@ import (
"testing"
"time"
"github.com/hashicorp/vault/helper/namespace"
"github.com/hashicorp/vault/sdk/logical"
)
// intentionally != time.Now() to catch latent used of time.Now instead of
@@ -332,16 +332,16 @@ func TestPopulate_Basic(t *testing.T) {
}
for _, test := range tests {
var entity *Entity
var entity *logical.Entity
if !test.nilEntity {
entity = &Entity{
entity = &logical.Entity{
ID: "entityID",
Name: test.entityName,
Metadata: test.metadata,
}
}
if test.aliasAccessor != "" {
entity.Aliases = []*Alias{
entity.Aliases = []*logical.Alias{
{
MountAccessor: test.aliasAccessor,
ID: test.aliasID,
@@ -350,19 +350,19 @@ func TestPopulate_Basic(t *testing.T) {
},
}
}
var groups []*Group
var groups []*logical.Group
if test.groupName != "" {
groups = append(groups, &Group{
groups = append(groups, &logical.Group{
ID: "groupID",
Name: test.groupName,
Metadata: test.groupMetadata,
NamespaceID: namespace.RootNamespace.ID,
NamespaceID: "root",
})
}
if test.groupMemberships != nil {
for i, groupName := range test.groupMemberships {
groups = append(groups, &Group{
groups = append(groups, &logical.Group{
ID: fmt.Sprintf("%s_%d", groupName, i),
Name: groupName,
})
@@ -375,7 +375,7 @@ func TestPopulate_Basic(t *testing.T) {
String: test.input,
Entity: entity,
Groups: groups,
Namespace: namespace.RootNamespace,
NamespaceID: "root",
Now: test.now,
})
if err != nil {
@@ -421,7 +421,7 @@ func TestPopulate_CurrentTime(t *testing.T) {
}
func TestPopulate_FullObject(t *testing.T) {
var testEntity = &Entity{
var testEntity = &logical.Entity{
ID: "abc-123",
Name: "Entity Name",
Metadata: map[string]string{
@@ -429,7 +429,7 @@ func TestPopulate_FullObject(t *testing.T) {
"size": "small",
"non-printable": "\"\n\t",
},
Aliases: []*Alias{
Aliases: []*logical.Alias{
{
MountAccessor: "aws_123",
Metadata: map[string]string{
@@ -440,7 +440,7 @@ func TestPopulate_FullObject(t *testing.T) {
},
}
var testGroups = []*Group{
var testGroups = []*logical.Group{
{ID: "a08b0c02", Name: "g1"},
{ID: "239bef91", Name: "g2"},
}

View File

@@ -31,6 +31,9 @@ type Entity struct {
Metadata map[string]string `sentinel:"" protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Disabled is true if the entity is disabled.
Disabled bool `sentinel:"" protobuf:"varint,5,opt,name=disabled,proto3" json:"disabled,omitempty"`
// NamespaceID is the identifier of the namespace to which this entity
// belongs to.
NamespaceID string `sentinel:"" protobuf:"bytes,6,opt,name=namespace_id,json=namespaceID,proto3" json:"namespace_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -96,6 +99,13 @@ func (m *Entity) GetDisabled() bool {
return false
}
func (m *Entity) GetNamespaceID() string {
if m != nil {
return m.NamespaceID
}
return ""
}
type Alias struct {
// MountType is the backend mount's type to which this identity belongs
MountType string `sentinel:"" protobuf:"bytes,1,opt,name=mount_type,json=mountType,proto3" json:"mount_type,omitempty"`
@@ -106,6 +116,11 @@ type Alias struct {
Name string `sentinel:"" protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
// Metadata represents the custom data tied to this alias
Metadata map[string]string `sentinel:"" protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// ID is the unique identifier for the alias
ID string `sentinel:"" protobuf:"bytes,5,opt,name=ID,proto3" json:"ID,omitempty"`
// NamespaceID is the identifier of the namespace to which this alias
// belongs.
NamespaceID string `sentinel:"" protobuf:"bytes,6,opt,name=namespace_id,json=namespaceID,proto3" json:"namespace_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -164,35 +179,122 @@ func (m *Alias) GetMetadata() map[string]string {
return nil
}
func (m *Alias) GetID() string {
if m != nil {
return m.ID
}
return ""
}
func (m *Alias) GetNamespaceID() string {
if m != nil {
return m.NamespaceID
}
return ""
}
type Group struct {
// ID is the unique identifier for the group
ID string `sentinel:"" protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"`
// Name is the human-friendly unique identifier for the group
Name string `sentinel:"" protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
// Metadata represents the custom data tied to this group
Metadata map[string]string `sentinel:"" protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// NamespaceID is the identifier of the namespace to which this group
// belongs to.
NamespaceID string `sentinel:"" protobuf:"bytes,4,opt,name=namespace_id,json=namespaceID,proto3" json:"namespace_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Group) Reset() { *m = Group{} }
func (m *Group) String() string { return proto.CompactTextString(m) }
func (*Group) ProtoMessage() {}
func (*Group) Descriptor() ([]byte, []int) {
return fileDescriptor_4a34d35719c603a1, []int{2}
}
func (m *Group) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Group.Unmarshal(m, b)
}
func (m *Group) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Group.Marshal(b, m, deterministic)
}
func (m *Group) XXX_Merge(src proto.Message) {
xxx_messageInfo_Group.Merge(m, src)
}
func (m *Group) XXX_Size() int {
return xxx_messageInfo_Group.Size(m)
}
func (m *Group) XXX_DiscardUnknown() {
xxx_messageInfo_Group.DiscardUnknown(m)
}
var xxx_messageInfo_Group proto.InternalMessageInfo
func (m *Group) GetID() string {
if m != nil {
return m.ID
}
return ""
}
func (m *Group) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *Group) GetMetadata() map[string]string {
if m != nil {
return m.Metadata
}
return nil
}
func (m *Group) GetNamespaceID() string {
if m != nil {
return m.NamespaceID
}
return ""
}
func init() {
proto.RegisterType((*Entity)(nil), "logical.Entity")
proto.RegisterMapType((map[string]string)(nil), "logical.Entity.MetadataEntry")
proto.RegisterType((*Alias)(nil), "logical.Alias")
proto.RegisterMapType((map[string]string)(nil), "logical.Alias.MetadataEntry")
proto.RegisterType((*Group)(nil), "logical.Group")
proto.RegisterMapType((map[string]string)(nil), "logical.Group.MetadataEntry")
}
func init() { proto.RegisterFile("sdk/logical/identity.proto", fileDescriptor_4a34d35719c603a1) }
var fileDescriptor_4a34d35719c603a1 = []byte{
// 310 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x92, 0xbf, 0x6a, 0xc3, 0x30,
0x10, 0xc6, 0x91, 0x9d, 0xbf, 0x57, 0x12, 0x8a, 0xe8, 0x60, 0x42, 0x03, 0x21, 0xd0, 0xe2, 0xc9,
0x86, 0x76, 0x49, 0xdb, 0x29, 0x25, 0x19, 0x32, 0x74, 0x31, 0x9d, 0xba, 0x94, 0x8b, 0x2d, 0x62,
0x11, 0xd9, 0x32, 0x96, 0x1c, 0xf0, 0x9b, 0xf6, 0x19, 0xfa, 0x14, 0x25, 0xb2, 0x62, 0x12, 0x4a,
0xa7, 0x6e, 0xba, 0xdf, 0x77, 0x77, 0xba, 0xfb, 0x38, 0x98, 0xa8, 0x64, 0x1f, 0x0a, 0xb9, 0xe3,
0x31, 0x8a, 0x90, 0x27, 0x2c, 0xd7, 0x5c, 0xd7, 0x41, 0x51, 0x4a, 0x2d, 0x69, 0xdf, 0xf2, 0xf9,
0x37, 0x81, 0xde, 0xda, 0x28, 0x74, 0x0c, 0xce, 0x66, 0xe5, 0x91, 0x19, 0xf1, 0x87, 0x91, 0xb3,
0x59, 0x51, 0x0a, 0x9d, 0x1c, 0x33, 0xe6, 0x39, 0x86, 0x98, 0x37, 0xf5, 0xa1, 0x8f, 0x82, 0xa3,
0x62, 0xca, 0x73, 0x67, 0xae, 0x7f, 0xf5, 0x30, 0x0e, 0x6c, 0xa7, 0x60, 0x79, 0xe4, 0xd1, 0x49,
0xa6, 0x4f, 0x30, 0xc8, 0x98, 0xc6, 0x04, 0x35, 0x7a, 0x1d, 0x93, 0x3a, 0x6d, 0x53, 0x9b, 0x0f,
0x83, 0x37, 0xab, 0xaf, 0x73, 0x5d, 0xd6, 0x51, 0x9b, 0x4e, 0x27, 0x30, 0x48, 0xb8, 0xc2, 0xad,
0x60, 0x89, 0xd7, 0x9d, 0x11, 0x7f, 0x10, 0xb5, 0xf1, 0xe4, 0x05, 0x46, 0x17, 0x65, 0xf4, 0x1a,
0xdc, 0x3d, 0xab, 0xed, 0xd8, 0xc7, 0x27, 0xbd, 0x81, 0xee, 0x01, 0x45, 0x75, 0x1a, 0xbc, 0x09,
0x9e, 0x9d, 0x05, 0x99, 0x7f, 0x11, 0xe8, 0x9a, 0x31, 0xe9, 0x14, 0x20, 0x93, 0x55, 0xae, 0x3f,
0x75, 0x5d, 0x30, 0x5b, 0x3c, 0x34, 0xe4, 0xbd, 0x2e, 0x18, 0xbd, 0x83, 0x71, 0x23, 0x63, 0x1c,
0x33, 0xa5, 0x64, 0x69, 0x7b, 0x8d, 0x0c, 0x5d, 0x5a, 0xd8, 0x3a, 0xe4, 0x9e, 0x39, 0xb4, 0xf8,
0xb5, 0xf7, 0xed, 0xa5, 0x45, 0x7f, 0xad, 0xfd, 0xaf, 0xd5, 0x5e, 0xfd, 0x8f, 0xfb, 0x1d, 0xd7,
0x69, 0xb5, 0x0d, 0x62, 0x99, 0x85, 0x29, 0xaa, 0x94, 0xc7, 0xb2, 0x2c, 0xc2, 0x03, 0x56, 0x42,
0x87, 0x67, 0x97, 0xb0, 0xed, 0x99, 0x0b, 0x78, 0xfc, 0x09, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xa9,
0x8a, 0x39, 0x1f, 0x02, 0x00, 0x00,
// 365 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x93, 0x4f, 0x6b, 0xfa, 0x30,
0x18, 0xc7, 0x69, 0x6b, 0xfd, 0xf3, 0xf8, 0x53, 0x7e, 0x84, 0x1d, 0x8a, 0x4c, 0x70, 0xc2, 0x46,
0x4f, 0x2d, 0x6c, 0x17, 0xb7, 0x9d, 0x1c, 0xca, 0xf0, 0xb0, 0x4b, 0xd9, 0x69, 0x17, 0x89, 0x4d,
0xd0, 0x60, 0xdb, 0x94, 0x26, 0x15, 0xfa, 0x1a, 0xc6, 0x5e, 0xd6, 0xde, 0xd7, 0x30, 0x8d, 0xa5,
0x3a, 0x84, 0x1d, 0xb6, 0x5b, 0xf2, 0x7d, 0x9e, 0x7e, 0x9b, 0xcf, 0x37, 0x79, 0x60, 0x20, 0xc8,
0xd6, 0x8f, 0xf8, 0x9a, 0x85, 0x38, 0xf2, 0x19, 0xa1, 0x89, 0x64, 0xb2, 0xf0, 0xd2, 0x8c, 0x4b,
0x8e, 0x5a, 0x5a, 0x1f, 0x7f, 0x98, 0xd0, 0x9c, 0xab, 0x0a, 0xea, 0x83, 0xb9, 0x98, 0x39, 0xc6,
0xc8, 0x70, 0x3b, 0x81, 0xb9, 0x98, 0x21, 0x04, 0x8d, 0x04, 0xc7, 0xd4, 0x31, 0x95, 0xa2, 0xd6,
0xc8, 0x85, 0x16, 0x8e, 0x18, 0x16, 0x54, 0x38, 0xd6, 0xc8, 0x72, 0xbb, 0xb7, 0x7d, 0x4f, 0x3b,
0x79, 0xd3, 0xbd, 0x1e, 0x1c, 0xca, 0xe8, 0x1e, 0xda, 0x31, 0x95, 0x98, 0x60, 0x89, 0x9d, 0x86,
0x6a, 0x1d, 0x56, 0xad, 0xe5, 0x0f, 0xbd, 0x17, 0x5d, 0x9f, 0x27, 0x32, 0x2b, 0x82, 0xaa, 0x1d,
0x0d, 0xa0, 0x4d, 0x98, 0xc0, 0xab, 0x88, 0x12, 0xc7, 0x1e, 0x19, 0x6e, 0x3b, 0xa8, 0xf6, 0xe8,
0x0a, 0xfe, 0xed, 0x0f, 0x22, 0x52, 0x1c, 0xd2, 0x25, 0x23, 0x4e, 0x53, 0x1d, 0xae, 0x5b, 0x69,
0x0b, 0x32, 0x78, 0x84, 0xde, 0x91, 0x33, 0xfa, 0x0f, 0xd6, 0x96, 0x16, 0x9a, 0x6c, 0xbf, 0x44,
0x17, 0x60, 0xef, 0x70, 0x94, 0x1f, 0xd8, 0xca, 0xcd, 0x83, 0x39, 0x31, 0xc6, 0xef, 0x26, 0xd8,
0x8a, 0x04, 0x0d, 0x01, 0x62, 0x9e, 0x27, 0x72, 0x29, 0x8b, 0x94, 0xea, 0x8f, 0x3b, 0x4a, 0x79,
0x2d, 0x52, 0x8a, 0xae, 0xa1, 0x5f, 0x96, 0x71, 0x18, 0x52, 0x21, 0x78, 0xa6, 0xbd, 0x7a, 0x4a,
0x9d, 0x6a, 0xb1, 0x0a, 0xd1, 0xaa, 0x85, 0x38, 0xf9, 0x16, 0xcd, 0xe5, 0x71, 0x8a, 0x67, 0x93,
0x29, 0xaf, 0xc8, 0xae, 0xae, 0xe8, 0xaf, 0xd3, 0xf8, 0x34, 0xc0, 0x7e, 0xce, 0x78, 0x9e, 0xfe,
0xe8, 0x71, 0xd4, 0xb9, 0xac, 0x13, 0x2e, 0xe5, 0x72, 0x96, 0xeb, 0x94, 0xa3, 0xf1, 0xbb, 0x1c,
0x4f, 0xee, 0xdb, 0xcd, 0x9a, 0xc9, 0x4d, 0xbe, 0xf2, 0x42, 0x1e, 0xfb, 0x1b, 0x2c, 0x36, 0x2c,
0xe4, 0x59, 0xea, 0xef, 0x70, 0x1e, 0x49, 0xbf, 0x36, 0x27, 0xab, 0xa6, 0x9a, 0x8f, 0xbb, 0xaf,
0x00, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xe2, 0x28, 0xc0, 0x3d, 0x03, 0x00, 0x00,
}

View File

@@ -19,6 +19,10 @@ message Entity {
// Disabled is true if the entity is disabled.
bool disabled = 5;
// NamespaceID is the identifier of the namespace to which this entity
// belongs to.
string namespace_id = 6;
}
message Alias {
@@ -34,4 +38,26 @@ message Alias {
// Metadata represents the custom data tied to this alias
map<string, string> metadata = 4;
// ID is the unique identifier for the alias
string ID = 5;
// NamespaceID is the identifier of the namespace to which this alias
// belongs.
string namespace_id = 6;
}
message Group {
// ID is the unique identifier for the group
string ID = 1;
// Name is the human-friendly unique identifier for the group
string name = 2;
// Metadata represents the custom data tied to this group
map<string, string> metadata = 3;
// NamespaceID is the identifier of the namespace to which this group
// belongs to.
string namespace_id = 4;
}

View File

@@ -62,6 +62,10 @@ type SystemView interface {
// for the given entity id
EntityInfo(entityID string) (*Entity, error)
// GroupsForEntity returns the group membership information for the provided
// entity id
GroupsForEntity(entityID string) ([]*Group, error)
// PluginEnv returns Vault environment information used by plugins
PluginEnv(context.Context) (*PluginEnvironment, error)
}
@@ -82,6 +86,7 @@ type StaticSystemView struct {
LocalMountVal bool
ReplicationStateVal consts.ReplicationState
EntityVal *Entity
GroupsVal []*Group
Features license.Features
VaultVersion string
PluginEnvironment *PluginEnvironment
@@ -149,6 +154,10 @@ func (d StaticSystemView) EntityInfo(entityID string) (*Entity, error) {
return d.EntityVal, nil
}
func (d StaticSystemView) GroupsForEntity(entityID string) ([]*Group, error) {
return d.GroupsVal, nil
}
func (d StaticSystemView) HasFeature(feature license.Features) bool {
return d.Features.HasFeature(feature)
}

View File

@@ -138,6 +138,20 @@ func (s *gRPCSystemViewClient) EntityInfo(entityID string) (*logical.Entity, err
return reply.Entity, nil
}
func (s *gRPCSystemViewClient) GroupsForEntity(entityID string) ([]*logical.Group, error) {
reply, err := s.client.GroupsForEntity(context.Background(), &pb.EntityInfoArgs{
EntityID: entityID,
})
if err != nil {
return nil, err
}
if reply.Err != "" {
return nil, errors.New(reply.Err)
}
return reply.Groups, nil
}
func (s *gRPCSystemViewClient) PluginEnv(ctx context.Context) (*logical.PluginEnvironment, error) {
reply, err := s.client.PluginEnv(ctx, &pb.Empty{})
if err != nil {
@@ -237,6 +251,18 @@ func (s *gRPCSystemViewServer) EntityInfo(ctx context.Context, args *pb.EntityIn
}, nil
}
func (s *gRPCSystemViewServer) GroupsForEntity(ctx context.Context, args *pb.EntityInfoArgs) (*pb.GroupsForEntityReply, error) {
groups, err := s.impl.GroupsForEntity(args.EntityID)
if err != nil {
return &pb.GroupsForEntityReply{
Err: pb.ErrToString(err),
}, nil
}
return &pb.GroupsForEntityReply{
Groups: groups,
}, nil
}
func (s *gRPCSystemViewServer) PluginEnv(ctx context.Context, _ *pb.Empty) (*pb.PluginEnvReply, error) {
pluginEnv, err := s.impl.PluginEnv(ctx)
if err != nil {

View File

@@ -183,6 +183,34 @@ func TestSystem_GRPC_entityInfo(t *testing.T) {
}
}
func TestSystem_GRPC_groupsForEntity(t *testing.T) {
sys := logical.TestSystemView()
sys.GroupsVal = []*logical.Group{
{
ID: "group1-id",
Name: "group1",
Metadata: map[string]string{
"group-metadata": "metadata-value",
},
},
}
client, _ := plugin.TestGRPCConn(t, func(s *grpc.Server) {
pb.RegisterSystemViewServer(s, &gRPCSystemViewServer{
impl: sys,
})
})
defer client.Close()
testSystemView := newGRPCSystemView(client)
actual, err := testSystemView.GroupsForEntity("")
if err != nil {
t.Fatal(err)
}
if !proto.Equal(sys.GroupsVal[0], actual[0]) {
t.Fatalf("expected: %v, got: %v", sys.GroupsVal, actual)
}
}
func TestSystem_GRPC_pluginEnv(t *testing.T) {
sys := logical.TestSystemView()
sys.PluginEnvironment = &logical.PluginEnvironment{

View File

@@ -2568,6 +2568,53 @@ func (m *EntityInfoReply) GetErr() string {
return ""
}
type GroupsForEntityReply struct {
Groups []*logical.Group `sentinel:"" protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"`
Err string `sentinel:"" protobuf:"bytes,2,opt,name=err,proto3" json:"err,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GroupsForEntityReply) Reset() { *m = GroupsForEntityReply{} }
func (m *GroupsForEntityReply) String() string { return proto.CompactTextString(m) }
func (*GroupsForEntityReply) ProtoMessage() {}
func (*GroupsForEntityReply) Descriptor() ([]byte, []int) {
return fileDescriptor_4dbf1dfe0c11846b, []int{42}
}
func (m *GroupsForEntityReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupsForEntityReply.Unmarshal(m, b)
}
func (m *GroupsForEntityReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GroupsForEntityReply.Marshal(b, m, deterministic)
}
func (m *GroupsForEntityReply) XXX_Merge(src proto.Message) {
xxx_messageInfo_GroupsForEntityReply.Merge(m, src)
}
func (m *GroupsForEntityReply) XXX_Size() int {
return xxx_messageInfo_GroupsForEntityReply.Size(m)
}
func (m *GroupsForEntityReply) XXX_DiscardUnknown() {
xxx_messageInfo_GroupsForEntityReply.DiscardUnknown(m)
}
var xxx_messageInfo_GroupsForEntityReply proto.InternalMessageInfo
func (m *GroupsForEntityReply) GetGroups() []*logical.Group {
if m != nil {
return m.Groups
}
return nil
}
func (m *GroupsForEntityReply) GetErr() string {
if m != nil {
return m.Err
}
return ""
}
type PluginEnvReply struct {
PluginEnvironment *logical.PluginEnvironment `sentinel:"" protobuf:"bytes,1,opt,name=plugin_environment,json=pluginEnvironment,proto3" json:"plugin_environment,omitempty"`
Err string `sentinel:"" protobuf:"bytes,2,opt,name=err,proto3" json:"err,omitempty"`
@@ -2580,7 +2627,7 @@ func (m *PluginEnvReply) Reset() { *m = PluginEnvReply{} }
func (m *PluginEnvReply) String() string { return proto.CompactTextString(m) }
func (*PluginEnvReply) ProtoMessage() {}
func (*PluginEnvReply) Descriptor() ([]byte, []int) {
return fileDescriptor_4dbf1dfe0c11846b, []int{42}
return fileDescriptor_4dbf1dfe0c11846b, []int{43}
}
func (m *PluginEnvReply) XXX_Unmarshal(b []byte) error {
@@ -2627,7 +2674,7 @@ func (m *Connection) Reset() { *m = Connection{} }
func (m *Connection) String() string { return proto.CompactTextString(m) }
func (*Connection) ProtoMessage() {}
func (*Connection) Descriptor() ([]byte, []int) {
return fileDescriptor_4dbf1dfe0c11846b, []int{43}
return fileDescriptor_4dbf1dfe0c11846b, []int{44}
}
func (m *Connection) XXX_Unmarshal(b []byte) error {
@@ -2703,6 +2750,7 @@ func init() {
proto.RegisterType((*LocalMountReply)(nil), "pb.LocalMountReply")
proto.RegisterType((*EntityInfoArgs)(nil), "pb.EntityInfoArgs")
proto.RegisterType((*EntityInfoReply)(nil), "pb.EntityInfoReply")
proto.RegisterType((*GroupsForEntityReply)(nil), "pb.GroupsForEntityReply")
proto.RegisterType((*PluginEnvReply)(nil), "pb.PluginEnvReply")
proto.RegisterType((*Connection)(nil), "pb.Connection")
}
@@ -2710,164 +2758,167 @@ func init() {
func init() { proto.RegisterFile("sdk/plugin/pb/backend.proto", fileDescriptor_4dbf1dfe0c11846b) }
var fileDescriptor_4dbf1dfe0c11846b = []byte{
// 2504 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x59, 0xcd, 0x72, 0x1b, 0xc7,
0x11, 0x2e, 0x00, 0xc4, 0x5f, 0xe3, 0x7f, 0x48, 0x2b, 0x2b, 0x48, 0x8e, 0xe8, 0x75, 0x24, 0xd3,
0x8c, 0x0d, 0x5a, 0x54, 0x14, 0xcb, 0x49, 0x25, 0x29, 0x9a, 0xa2, 0x65, 0xc6, 0xa4, 0xcd, 0x5a,
0x42, 0x71, 0xfe, 0xaa, 0xe0, 0xc1, 0xee, 0x10, 0xdc, 0xe2, 0x62, 0x77, 0x33, 0x3b, 0x4b, 0x11,
0xb9, 0xe4, 0x96, 0x47, 0xc8, 0x1b, 0xe4, 0x9c, 0x6b, 0x6e, 0xb9, 0xba, 0x72, 0xcf, 0x2b, 0xe4,
0x39, 0x52, 0xd3, 0x33, 0xfb, 0x07, 0x80, 0xb6, 0x5c, 0xe5, 0xdc, 0x76, 0xba, 0x7b, 0x7a, 0x66,
0x7a, 0xbe, 0xfe, 0xba, 0x07, 0x80, 0x7b, 0x91, 0x73, 0xb5, 0x17, 0x7a, 0xf1, 0xcc, 0xf5, 0xf7,
0xc2, 0xe9, 0xde, 0x94, 0xda, 0x57, 0xcc, 0x77, 0x46, 0x21, 0x0f, 0x44, 0x40, 0xca, 0xe1, 0x74,
0xf8, 0x60, 0x16, 0x04, 0x33, 0x8f, 0xed, 0xa1, 0x64, 0x1a, 0x5f, 0xec, 0x09, 0x77, 0xce, 0x22,
0x41, 0xe7, 0xa1, 0x32, 0x1a, 0x0e, 0xa5, 0x07, 0x2f, 0x98, 0xb9, 0x36, 0xf5, 0xf6, 0x5c, 0x87,
0xf9, 0xc2, 0x15, 0x0b, 0xad, 0x33, 0xf2, 0x3a, 0xb5, 0x8a, 0xd2, 0x98, 0x75, 0xa8, 0x1e, 0xcd,
0x43, 0xb1, 0x30, 0xb7, 0xa1, 0xf6, 0x29, 0xa3, 0x0e, 0xe3, 0xe4, 0x0e, 0xd4, 0x2e, 0xf1, 0xcb,
0x28, 0x6d, 0x57, 0x76, 0x9a, 0x96, 0x1e, 0x99, 0x7f, 0x00, 0x38, 0x93, 0x73, 0x8e, 0x38, 0x0f,
0x38, 0xb9, 0x0b, 0x0d, 0xc6, 0xf9, 0x44, 0x2c, 0x42, 0x66, 0x94, 0xb6, 0x4b, 0x3b, 0x1d, 0xab,
0xce, 0x38, 0x1f, 0x2f, 0x42, 0x46, 0x7e, 0x00, 0xf2, 0x73, 0x32, 0x8f, 0x66, 0x46, 0x79, 0xbb,
0x24, 0x3d, 0x30, 0xce, 0x4f, 0xa3, 0x59, 0x32, 0xc7, 0x0e, 0x1c, 0x66, 0x54, 0xb6, 0x4b, 0x3b,
0x15, 0x9c, 0x73, 0x18, 0x38, 0xcc, 0xfc, 0x5b, 0x09, 0xaa, 0x67, 0x54, 0x5c, 0x46, 0x84, 0xc0,
0x06, 0x0f, 0x02, 0xa1, 0x17, 0xc7, 0x6f, 0xb2, 0x03, 0xbd, 0xd8, 0xa7, 0xb1, 0xb8, 0x94, 0xa7,
0xb2, 0xa9, 0x60, 0x8e, 0x51, 0x46, 0xf5, 0xb2, 0x98, 0xbc, 0x0d, 0x1d, 0x2f, 0xb0, 0xa9, 0x37,
0x89, 0x44, 0xc0, 0xe9, 0x4c, 0xae, 0x23, 0xed, 0xda, 0x28, 0x3c, 0x57, 0x32, 0xb2, 0x0b, 0x83,
0x88, 0x51, 0x6f, 0xf2, 0x8a, 0xd3, 0x30, 0x35, 0xdc, 0x50, 0x0e, 0xa5, 0xe2, 0x4b, 0x4e, 0x43,
0x6d, 0x6b, 0xfe, 0xab, 0x06, 0x75, 0x8b, 0xfd, 0x29, 0x66, 0x91, 0x20, 0x5d, 0x28, 0xbb, 0x0e,
0x9e, 0xb6, 0x69, 0x95, 0x5d, 0x87, 0x8c, 0x80, 0x58, 0x2c, 0xf4, 0xe4, 0xd2, 0x6e, 0xe0, 0x1f,
0x7a, 0x71, 0x24, 0x18, 0xd7, 0x67, 0x5e, 0xa3, 0x21, 0xf7, 0xa1, 0x19, 0x84, 0x8c, 0xa3, 0x0c,
0x03, 0xd0, 0xb4, 0x32, 0x81, 0x3c, 0x78, 0x48, 0xc5, 0xa5, 0xb1, 0x81, 0x0a, 0xfc, 0x96, 0x32,
0x87, 0x0a, 0x6a, 0x54, 0x95, 0x4c, 0x7e, 0x13, 0x13, 0x6a, 0x11, 0xb3, 0x39, 0x13, 0x46, 0x6d,
0xbb, 0xb4, 0xd3, 0xda, 0x87, 0x51, 0x38, 0x1d, 0x9d, 0xa3, 0xc4, 0xd2, 0x1a, 0x72, 0x1f, 0x36,
0x64, 0x5c, 0x8c, 0x3a, 0x5a, 0x34, 0xa4, 0xc5, 0x41, 0x2c, 0x2e, 0x2d, 0x94, 0x92, 0x7d, 0xa8,
0xab, 0x3b, 0x8d, 0x8c, 0xc6, 0x76, 0x65, 0xa7, 0xb5, 0x6f, 0x48, 0x03, 0x7d, 0xca, 0x91, 0x82,
0x41, 0x74, 0xe4, 0x0b, 0xbe, 0xb0, 0x12, 0x43, 0xf2, 0x16, 0xb4, 0x6d, 0xcf, 0x65, 0xbe, 0x98,
0x88, 0xe0, 0x8a, 0xf9, 0x46, 0x13, 0x77, 0xd4, 0x52, 0xb2, 0xb1, 0x14, 0x91, 0x7d, 0x78, 0x23,
0x6f, 0x32, 0xa1, 0xb6, 0xcd, 0xa2, 0x28, 0xe0, 0x06, 0xa0, 0xed, 0x66, 0xce, 0xf6, 0x40, 0xab,
0xa4, 0x5b, 0xc7, 0x8d, 0x42, 0x8f, 0x2e, 0x26, 0x3e, 0x9d, 0x33, 0xa3, 0xa5, 0xdc, 0x6a, 0xd9,
0xe7, 0x74, 0xce, 0xc8, 0x03, 0x68, 0xcd, 0x83, 0xd8, 0x17, 0x93, 0x30, 0x70, 0x7d, 0x61, 0xb4,
0xd1, 0x02, 0x50, 0x74, 0x26, 0x25, 0xe4, 0x4d, 0x50, 0x23, 0x05, 0xc6, 0x8e, 0x8a, 0x2b, 0x4a,
0x10, 0x8e, 0x0f, 0xa1, 0xab, 0xd4, 0xe9, 0x7e, 0xba, 0x68, 0xd2, 0x41, 0x69, 0xba, 0x93, 0x0f,
0xa0, 0x89, 0x78, 0x70, 0xfd, 0x8b, 0xc0, 0xe8, 0x61, 0xdc, 0x36, 0x73, 0x61, 0x91, 0x98, 0x38,
0xf6, 0x2f, 0x02, 0xab, 0xf1, 0x4a, 0x7f, 0x91, 0x5f, 0xc0, 0xbd, 0xc2, 0x79, 0x39, 0x9b, 0x53,
0xd7, 0x77, 0xfd, 0xd9, 0x24, 0x8e, 0x58, 0x64, 0xf4, 0x11, 0xe1, 0x46, 0xee, 0xd4, 0x56, 0x62,
0xf0, 0x32, 0x62, 0x11, 0xb9, 0x07, 0x4d, 0x95, 0xa4, 0x13, 0xd7, 0x31, 0x06, 0xb8, 0xa5, 0x86,
0x12, 0x1c, 0x3b, 0xe4, 0x1d, 0xe8, 0x85, 0x81, 0xe7, 0xda, 0x8b, 0x49, 0x70, 0xcd, 0x38, 0x77,
0x1d, 0x66, 0x90, 0xed, 0xd2, 0x4e, 0xc3, 0xea, 0x2a, 0xf1, 0x17, 0x5a, 0xba, 0x2e, 0x35, 0x36,
0xd1, 0x70, 0x25, 0x35, 0x46, 0x00, 0x76, 0xe0, 0xfb, 0xcc, 0x46, 0xf8, 0x6d, 0xe1, 0x09, 0xbb,
0xf2, 0x84, 0x87, 0xa9, 0xd4, 0xca, 0x59, 0x0c, 0x3f, 0x81, 0x76, 0x1e, 0x0a, 0xa4, 0x0f, 0x95,
0x2b, 0xb6, 0xd0, 0xf0, 0x97, 0x9f, 0x64, 0x1b, 0xaa, 0xd7, 0xd4, 0x8b, 0x19, 0x42, 0x5e, 0x03,
0x51, 0x4d, 0xb1, 0x94, 0xe2, 0x67, 0xe5, 0x67, 0x25, 0xf3, 0xbf, 0x55, 0xd8, 0x90, 0xe0, 0x23,
0x4f, 0xa1, 0xe3, 0x31, 0x1a, 0xb1, 0x49, 0x10, 0xca, 0x05, 0x22, 0x74, 0xd5, 0xda, 0xef, 0xcb,
0x69, 0x27, 0x52, 0xf1, 0x85, 0x92, 0x5b, 0x6d, 0x2f, 0x37, 0x92, 0x29, 0xed, 0xfa, 0x82, 0x71,
0x9f, 0x7a, 0x13, 0x4c, 0x06, 0x95, 0x60, 0xed, 0x44, 0xf8, 0x5c, 0x26, 0xc5, 0x32, 0x8e, 0x2a,
0xab, 0x38, 0x1a, 0x42, 0x03, 0x63, 0xe7, 0xb2, 0x48, 0x27, 0x7b, 0x3a, 0x26, 0xfb, 0xd0, 0x98,
0x33, 0x41, 0x75, 0xae, 0xc9, 0x94, 0xb8, 0x93, 0xe4, 0xcc, 0xe8, 0x54, 0x2b, 0x54, 0x42, 0xa4,
0x76, 0x2b, 0x19, 0x51, 0x5b, 0xcd, 0x88, 0x21, 0x34, 0x52, 0xd0, 0xd5, 0xd5, 0x0d, 0x27, 0x63,
0x49, 0xb3, 0x21, 0xe3, 0x6e, 0xe0, 0x18, 0x0d, 0x04, 0x8a, 0x1e, 0x49, 0x92, 0xf4, 0xe3, 0xb9,
0x82, 0x50, 0x53, 0x91, 0xa4, 0x1f, 0xcf, 0x57, 0x11, 0x03, 0x4b, 0x88, 0xf9, 0x11, 0x54, 0xa9,
0xe7, 0xd2, 0x08, 0x53, 0x48, 0xde, 0xac, 0xe6, 0xfb, 0xd1, 0x81, 0x94, 0x5a, 0x4a, 0x49, 0x9e,
0x40, 0x67, 0xc6, 0x83, 0x38, 0x9c, 0xe0, 0x90, 0x45, 0x46, 0x1b, 0x4f, 0xbb, 0x6c, 0xdd, 0x46,
0xa3, 0x03, 0x65, 0x23, 0x33, 0x70, 0x1a, 0xc4, 0xbe, 0x33, 0xb1, 0x5d, 0x87, 0x47, 0x46, 0x07,
0x83, 0x07, 0x28, 0x3a, 0x94, 0x12, 0x99, 0x62, 0x2a, 0x05, 0xd2, 0x00, 0x77, 0xd1, 0xa6, 0x83,
0xd2, 0xb3, 0x24, 0xca, 0x3f, 0x86, 0x41, 0x52, 0x98, 0x32, 0xcb, 0x1e, 0x5a, 0xf6, 0x13, 0x45,
0x6a, 0xbc, 0x03, 0x7d, 0x76, 0x23, 0x29, 0xd4, 0x15, 0x93, 0x39, 0xbd, 0x99, 0x08, 0xe1, 0xe9,
0x94, 0xea, 0x26, 0xf2, 0x53, 0x7a, 0x33, 0x16, 0x9e, 0xcc, 0x7f, 0xb5, 0x3a, 0xe6, 0xff, 0x00,
0x8b, 0x51, 0x13, 0x25, 0x98, 0xff, 0xbb, 0x30, 0xf0, 0x83, 0x89, 0xc3, 0x2e, 0x68, 0xec, 0x09,
0xb5, 0xee, 0x42, 0x27, 0x53, 0xcf, 0x0f, 0x9e, 0x2b, 0x39, 0x2e, 0xbb, 0x18, 0xfe, 0x1c, 0x3a,
0x85, 0xeb, 0x5e, 0x03, 0xfa, 0xad, 0x3c, 0xe8, 0x9b, 0x79, 0xa0, 0xff, 0x7b, 0x03, 0x00, 0xef,
0x5d, 0x4d, 0x5d, 0xae, 0x16, 0x79, 0x30, 0x94, 0xd7, 0x80, 0x81, 0x72, 0xe6, 0x0b, 0x0d, 0x5c,
0x3d, 0xfa, 0x46, 0xcc, 0x26, 0xf5, 0xa2, 0x9a, 0xab, 0x17, 0xef, 0xc1, 0x86, 0xc4, 0xa7, 0x51,
0xcb, 0x68, 0x3d, 0xdb, 0x11, 0x22, 0x59, 0xa1, 0x18, 0xad, 0x56, 0x92, 0xa6, 0xbe, 0x9a, 0x34,
0x79, 0x34, 0x36, 0x8a, 0x68, 0x7c, 0x1b, 0x3a, 0x36, 0x67, 0x58, 0xbb, 0x26, 0xb2, 0x19, 0xd1,
0x68, 0x6d, 0x27, 0xc2, 0xb1, 0x3b, 0x67, 0x32, 0x7e, 0xf2, 0xe2, 0x00, 0x55, 0xf2, 0x73, 0xed,
0xbd, 0xb6, 0xd6, 0xde, 0x2b, 0x76, 0x02, 0x1e, 0xd3, 0x8c, 0x8f, 0xdf, 0xb9, 0xac, 0xe9, 0x14,
0xb2, 0xa6, 0x90, 0x1a, 0xdd, 0xa5, 0xd4, 0x58, 0xc2, 0x6f, 0x6f, 0x05, 0xbf, 0x6f, 0x41, 0x5b,
0x06, 0x20, 0x0a, 0xa9, 0xcd, 0xa4, 0x83, 0xbe, 0x0a, 0x44, 0x2a, 0x3b, 0x76, 0x30, 0xdb, 0xe3,
0xe9, 0x74, 0x71, 0x19, 0x78, 0x2c, 0x23, 0xec, 0x56, 0x2a, 0x3b, 0x76, 0xe4, 0x7e, 0x11, 0x81,
0x04, 0x11, 0x88, 0xdf, 0xc3, 0x0f, 0xa1, 0x99, 0x46, 0xfd, 0x3b, 0x81, 0xe9, 0x1f, 0x25, 0x68,
0xe7, 0x49, 0x51, 0x4e, 0x1e, 0x8f, 0x4f, 0x70, 0x72, 0xc5, 0x92, 0x9f, 0xb2, 0x9d, 0xe0, 0xcc,
0x67, 0xaf, 0xe8, 0xd4, 0x53, 0x0e, 0x1a, 0x56, 0x26, 0x90, 0x5a, 0xd7, 0xb7, 0x39, 0x9b, 0x27,
0xa8, 0xaa, 0x58, 0x99, 0x80, 0x7c, 0x04, 0xe0, 0x46, 0x51, 0xcc, 0xd4, 0xcd, 0x6d, 0x20, 0x65,
0x0c, 0x47, 0xaa, 0xc7, 0x1c, 0x25, 0x3d, 0xe6, 0x68, 0x9c, 0xf4, 0x98, 0x56, 0x13, 0xad, 0xf1,
0x4a, 0xef, 0x40, 0x4d, 0x5e, 0xd0, 0xf8, 0x04, 0x91, 0x57, 0xb1, 0xf4, 0xc8, 0xfc, 0x0b, 0xd4,
0x54, 0x17, 0xf2, 0x7f, 0x25, 0xfa, 0xbb, 0xd0, 0x50, 0xbe, 0x5d, 0x47, 0xe7, 0x4a, 0x1d, 0xc7,
0xc7, 0x8e, 0xf9, 0x75, 0x19, 0x1a, 0x16, 0x8b, 0xc2, 0xc0, 0x8f, 0x58, 0xae, 0x4b, 0x2a, 0x7d,
0x6b, 0x97, 0x54, 0x5e, 0xdb, 0x25, 0x25, 0xbd, 0x57, 0x25, 0xd7, 0x7b, 0x0d, 0xa1, 0xc1, 0x99,
0xe3, 0x72, 0x66, 0x0b, 0xdd, 0xa7, 0xa5, 0x63, 0xa9, 0x7b, 0x45, 0xb9, 0x2c, 0xef, 0x11, 0xd6,
0x90, 0xa6, 0x95, 0x8e, 0xc9, 0xe3, 0x7c, 0x73, 0xa1, 0xda, 0xb6, 0x2d, 0xd5, 0x5c, 0xa8, 0xed,
0xae, 0xe9, 0x2e, 0x9e, 0x64, 0x4d, 0x5a, 0x1d, 0xb3, 0xf9, 0x6e, 0x7e, 0xc2, 0xfa, 0x2e, 0xed,
0x7b, 0xab, 0xd9, 0x5f, 0x97, 0xa1, 0xbf, 0xbc, 0xb7, 0x35, 0x08, 0xdc, 0x82, 0xaa, 0xaa, 0x7d,
0x1a, 0xbe, 0x62, 0xa5, 0xea, 0x55, 0x96, 0x88, 0xee, 0x57, 0xcb, 0xa4, 0xf1, 0xed, 0xd0, 0x2b,
0x12, 0xca, 0xbb, 0xd0, 0x97, 0x21, 0x0a, 0x99, 0x93, 0xf5, 0x73, 0x8a, 0x01, 0x7b, 0x5a, 0x9e,
0x76, 0x74, 0xbb, 0x30, 0x48, 0x4c, 0x33, 0x6e, 0xa8, 0x15, 0x6c, 0x8f, 0x12, 0x8a, 0xb8, 0x03,
0xb5, 0x8b, 0x80, 0xcf, 0xa9, 0xd0, 0x24, 0xa8, 0x47, 0x05, 0x92, 0x43, 0xb6, 0x6d, 0x28, 0x4c,
0x26, 0x42, 0xf9, 0x66, 0x91, 0xe4, 0x93, 0xbe, 0x27, 0x90, 0x05, 0x1b, 0x56, 0x23, 0x79, 0x47,
0x98, 0xbf, 0x85, 0xde, 0x52, 0x0b, 0xb9, 0x26, 0x90, 0xd9, 0xf2, 0xe5, 0xc2, 0xf2, 0x05, 0xcf,
0x95, 0x25, 0xcf, 0xbf, 0x83, 0xc1, 0xa7, 0xd4, 0x77, 0x3c, 0xa6, 0xfd, 0x1f, 0xf0, 0x59, 0x24,
0x8b, 0xa1, 0x7e, 0xd1, 0x4c, 0x74, 0xf5, 0xe9, 0x58, 0x4d, 0x2d, 0x39, 0x76, 0xc8, 0x43, 0xa8,
0x73, 0x65, 0xad, 0x01, 0xd0, 0xca, 0xf5, 0xb8, 0x56, 0xa2, 0x33, 0xbf, 0x02, 0x52, 0x70, 0x2d,
0x1f, 0x33, 0x0b, 0xb2, 0x23, 0xd1, 0xaf, 0x40, 0xa1, 0xb3, 0xaa, 0x9d, 0xc7, 0xa4, 0x95, 0x6a,
0xc9, 0x36, 0x54, 0x18, 0xe7, 0x7a, 0x09, 0x6c, 0x32, 0xb3, 0xa7, 0xa3, 0x25, 0x55, 0x66, 0x1f,
0xba, 0xc7, 0xbe, 0x2b, 0x5c, 0xea, 0xb9, 0x7f, 0x66, 0x72, 0xe7, 0xe6, 0x13, 0xe8, 0x65, 0x12,
0xb5, 0xa0, 0x76, 0x53, 0xba, 0xdd, 0xcd, 0x4f, 0x60, 0x70, 0x1e, 0x32, 0xdb, 0xa5, 0x1e, 0xbe,
0x1e, 0xd5, 0xb4, 0x07, 0x50, 0x95, 0x77, 0x95, 0xf0, 0x4e, 0x13, 0x27, 0xa2, 0x5a, 0xc9, 0xcd,
0xaf, 0xc0, 0x50, 0xc7, 0x3b, 0xba, 0x71, 0x23, 0xc1, 0x7c, 0x9b, 0x1d, 0x5e, 0x32, 0xfb, 0xea,
0x7b, 0x0c, 0xe0, 0x35, 0xdc, 0x5d, 0xb7, 0x42, 0xb2, 0xbf, 0x96, 0x2d, 0x47, 0x93, 0x0b, 0x59,
0x82, 0x70, 0x8d, 0x86, 0x05, 0x28, 0xfa, 0x44, 0x4a, 0x24, 0x1c, 0x98, 0x9c, 0x17, 0x69, 0x5a,
0xd7, 0xa3, 0x24, 0x1e, 0x95, 0xdb, 0xe3, 0xf1, 0xcf, 0x12, 0x34, 0xcf, 0x99, 0x88, 0x43, 0x3c,
0xcb, 0x3d, 0x68, 0x4e, 0x79, 0x70, 0xc5, 0x78, 0x76, 0x94, 0x86, 0x12, 0x1c, 0x3b, 0xe4, 0x31,
0xd4, 0x0e, 0x03, 0xff, 0xc2, 0x9d, 0xe1, 0x5b, 0x5a, 0xf3, 0x4b, 0x3a, 0x77, 0xa4, 0x74, 0x8a,
0x5f, 0xb4, 0x21, 0xd9, 0x86, 0x96, 0xfe, 0x65, 0xe2, 0xe5, 0xcb, 0xe3, 0xe7, 0x49, 0x93, 0x9d,
0x13, 0x0d, 0x3f, 0x82, 0x56, 0x6e, 0xe2, 0x77, 0xaa, 0x78, 0x3f, 0x04, 0xc0, 0xd5, 0x55, 0x8c,
0xfa, 0xd9, 0xd5, 0x37, 0xd5, 0xd1, 0x1e, 0x40, 0x53, 0xf6, 0x73, 0x4a, 0x9d, 0xd4, 0xda, 0x52,
0x56, 0x6b, 0xcd, 0x87, 0x30, 0x38, 0xf6, 0xaf, 0xa9, 0xe7, 0x3a, 0x54, 0xb0, 0xcf, 0xd8, 0x02,
0x43, 0xb0, 0xb2, 0x03, 0xf3, 0x1c, 0xda, 0xfa, 0x71, 0xff, 0x5a, 0x7b, 0x6c, 0xeb, 0x3d, 0x7e,
0x73, 0x2e, 0xbe, 0x0b, 0x3d, 0xed, 0xf4, 0xc4, 0xd5, 0x99, 0x28, 0x5b, 0x15, 0xce, 0x2e, 0xdc,
0x1b, 0xed, 0x5a, 0x8f, 0xcc, 0x67, 0xd0, 0xcf, 0x99, 0xa6, 0xc7, 0xb9, 0x62, 0x8b, 0x28, 0xf9,
0xd1, 0x43, 0x7e, 0x27, 0x11, 0x28, 0x67, 0x11, 0x30, 0xa1, 0xab, 0x67, 0xbe, 0x60, 0xe2, 0x96,
0xd3, 0x7d, 0x96, 0x6e, 0xe4, 0x05, 0xd3, 0xce, 0x1f, 0x41, 0x95, 0xc9, 0x93, 0xe6, 0xcb, 0x70,
0x3e, 0x02, 0x96, 0x52, 0xaf, 0x59, 0xf0, 0x59, 0xba, 0xe0, 0x59, 0xac, 0x16, 0x7c, 0x4d, 0x5f,
0xe6, 0xdb, 0xe9, 0x36, 0xce, 0x62, 0x71, 0xdb, 0x8d, 0x3e, 0x84, 0x81, 0x36, 0x7a, 0xce, 0x3c,
0x26, 0xd8, 0x2d, 0x47, 0x7a, 0x04, 0xa4, 0x60, 0x76, 0x9b, 0xbb, 0xfb, 0xd0, 0x18, 0x8f, 0x4f,
0x52, 0x6d, 0x91, 0x62, 0xcd, 0x1d, 0x68, 0x8f, 0xa9, 0x6c, 0x25, 0x1c, 0x65, 0x61, 0x40, 0x5d,
0xa8, 0xb1, 0x4e, 0xc0, 0x64, 0x68, 0xee, 0xc3, 0xd6, 0x21, 0xb5, 0x2f, 0x5d, 0x7f, 0xf6, 0xdc,
0x8d, 0x64, 0x2f, 0xa5, 0x67, 0x0c, 0xa1, 0xe1, 0x68, 0x81, 0x9e, 0x92, 0x8e, 0xcd, 0xf7, 0xe1,
0x8d, 0xdc, 0x0f, 0x3e, 0xe7, 0x82, 0x26, 0xdb, 0xdc, 0x82, 0x6a, 0x24, 0x47, 0x38, 0xa3, 0x6a,
0xa9, 0x81, 0xf9, 0x39, 0x6c, 0xe5, 0xcb, 0xab, 0xec, 0x6c, 0xf0, 0xf0, 0x49, 0xcf, 0x51, 0xca,
0xf5, 0x1c, 0xfa, 0x28, 0xe5, 0xac, 0x5a, 0xf4, 0xa1, 0xf2, 0xeb, 0x2f, 0xc7, 0x1a, 0x83, 0xf2,
0xd3, 0xfc, 0xa3, 0x5c, 0xbe, 0xe8, 0x4f, 0x2d, 0x5f, 0x68, 0x3c, 0x4a, 0xaf, 0xd5, 0x78, 0xac,
0xc2, 0xe0, 0x7d, 0x18, 0x9c, 0x7a, 0x81, 0x7d, 0x75, 0xe4, 0xe7, 0xa2, 0x61, 0x40, 0x9d, 0xf9,
0xf9, 0x60, 0x24, 0x43, 0xf3, 0x1d, 0xe8, 0x9d, 0x04, 0x36, 0xf5, 0x4e, 0x83, 0xd8, 0x17, 0x69,
0x14, 0xf0, 0x17, 0x38, 0x6d, 0xaa, 0x06, 0xe6, 0xfb, 0xd0, 0xd5, 0x05, 0xd8, 0xbf, 0x08, 0x12,
0xc2, 0xca, 0x4a, 0x75, 0xa9, 0xd8, 0xc6, 0x9b, 0x27, 0xd0, 0xcb, 0xcc, 0x95, 0xdf, 0x77, 0xa0,
0xa6, 0xd4, 0xfa, 0x6c, 0xbd, 0xf4, 0x1d, 0xab, 0x2c, 0x2d, 0xad, 0x5e, 0x73, 0xa8, 0x39, 0x74,
0xcf, 0xf0, 0x97, 0xd0, 0x23, 0xff, 0x5a, 0x39, 0x3b, 0x06, 0xa2, 0x7e, 0x1b, 0x9d, 0x30, 0xff,
0xda, 0xe5, 0x81, 0x8f, 0xad, 0x73, 0x49, 0x37, 0x28, 0x89, 0xe3, 0x74, 0x52, 0x62, 0x61, 0x0d,
0xc2, 0x65, 0xd1, 0xda, 0x18, 0x42, 0xf6, 0x3b, 0x8b, 0xac, 0x00, 0x9c, 0xcd, 0x03, 0xc1, 0x26,
0xd4, 0x71, 0x12, 0x10, 0x83, 0x12, 0x1d, 0x38, 0x0e, 0xdf, 0xff, 0x7b, 0x05, 0xea, 0x1f, 0x2b,
0x5e, 0x25, 0xbf, 0x84, 0x4e, 0xa1, 0x18, 0x93, 0x37, 0xb0, 0x69, 0x5b, 0x2e, 0xfd, 0xc3, 0x3b,
0x2b, 0x62, 0x75, 0xae, 0x0f, 0xa0, 0x9d, 0xaf, 0x91, 0x04, 0xeb, 0x21, 0xfe, 0xea, 0x3b, 0x44,
0x4f, 0xab, 0x05, 0xf4, 0x1c, 0xb6, 0xd6, 0x55, 0x2f, 0x72, 0x3f, 0x5b, 0x61, 0xb5, 0x72, 0x0e,
0xdf, 0xbc, 0x4d, 0x9b, 0x54, 0xbd, 0xfa, 0xa1, 0xc7, 0xa8, 0x1f, 0x87, 0xf9, 0x1d, 0x64, 0x9f,
0xe4, 0x31, 0x74, 0x0a, 0xfc, 0xad, 0xce, 0xb9, 0x42, 0xe9, 0xf9, 0x29, 0x8f, 0xa0, 0x8a, 0x35,
0x83, 0x74, 0x0a, 0xc5, 0x6b, 0xd8, 0x4d, 0x87, 0x6a, 0xed, 0xa7, 0x00, 0x59, 0x6f, 0x41, 0x88,
0xf2, 0x9b, 0xef, 0x3e, 0x86, 0x9b, 0x45, 0x59, 0xd2, 0x7f, 0x6c, 0xe0, 0x4f, 0x08, 0xb9, 0xfd,
0xe2, 0x42, 0x69, 0x1d, 0xda, 0xff, 0x4f, 0x09, 0xea, 0xc9, 0xcf, 0xca, 0x8f, 0x61, 0x43, 0x32,
0x3a, 0xd9, 0xcc, 0x91, 0x62, 0x52, 0x0d, 0x86, 0x5b, 0x4b, 0x42, 0xb5, 0xc0, 0x08, 0x2a, 0x2f,
0x98, 0x50, 0x1b, 0x2a, 0x52, 0xfb, 0x70, 0xb3, 0x28, 0x4b, 0xed, 0xcf, 0xe2, 0xa2, 0xbd, 0x66,
0xe6, 0x82, 0x7d, 0xca, 0xb9, 0x1f, 0x42, 0x4d, 0x71, 0xa6, 0x8a, 0xe5, 0x0a, 0xdb, 0x2a, 0xcc,
0xac, 0xb2, 0xeb, 0xfe, 0x5f, 0x37, 0x00, 0xce, 0x17, 0x91, 0x60, 0xf3, 0xdf, 0xb8, 0xec, 0x15,
0xd9, 0x85, 0x9e, 0xfe, 0xa1, 0x04, 0xdf, 0x6f, 0x92, 0x84, 0x72, 0x31, 0xc1, 0x2e, 0x30, 0xa5,
0xde, 0x47, 0xd0, 0x3a, 0xa5, 0x37, 0xaf, 0x63, 0x57, 0xd7, 0x84, 0x9c, 0xb7, 0xc1, 0x8a, 0x52,
0x20, 0xea, 0x9f, 0x42, 0x6f, 0x89, 0x8e, 0xf3, 0xf6, 0xf8, 0x1b, 0xc7, 0x5a, 0xba, 0x7e, 0x26,
0x9f, 0x30, 0x45, 0x4a, 0xce, 0x4f, 0xd4, 0xcf, 0xa9, 0x75, 0x9c, 0xfd, 0xa2, 0xf8, 0xf8, 0xc1,
0x77, 0xa7, 0xb1, 0xcc, 0x9a, 0x09, 0x67, 0x0f, 0xef, 0xae, 0xd3, 0xa4, 0x99, 0x97, 0x27, 0xce,
0x95, 0xcc, 0x5b, 0x65, 0xd5, 0xf7, 0x00, 0x32, 0xee, 0xcc, 0xdb, 0xe3, 0xf5, 0x2e, 0xd3, 0xea,
0x53, 0x80, 0x8c, 0x11, 0x15, 0x2a, 0x8a, 0x84, 0xaa, 0xa6, 0x2d, 0xb3, 0xe6, 0x2e, 0x34, 0x53,
0x16, 0xcb, 0xaf, 0x81, 0x0e, 0x8a, 0xa4, 0xf8, 0xf1, 0xee, 0xef, 0x77, 0x66, 0xae, 0xb8, 0x8c,
0xa7, 0x23, 0x3b, 0x98, 0xef, 0x5d, 0xd2, 0xe8, 0xd2, 0xb5, 0x03, 0x1e, 0xee, 0x5d, 0x4b, 0x30,
0xec, 0x15, 0xfe, 0xb5, 0x9a, 0xd6, 0xf0, 0xf5, 0xf6, 0xe4, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff,
0x66, 0x13, 0x8f, 0x1a, 0xcd, 0x1a, 0x00, 0x00,
// 2545 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x59, 0xdb, 0x72, 0x1b, 0xc7,
0xd1, 0x2e, 0x00, 0xc4, 0xa9, 0x71, 0x1e, 0xd2, 0xfa, 0x57, 0x90, 0xfc, 0x8b, 0x5e, 0x47, 0x32,
0xcd, 0xd8, 0xa0, 0x45, 0xc5, 0xb1, 0x9c, 0x54, 0xe2, 0xa2, 0x29, 0x4a, 0x66, 0x4c, 0xda, 0xac,
0x25, 0x14, 0xe7, 0x54, 0x05, 0x0f, 0x76, 0x87, 0xe0, 0x16, 0x17, 0xbb, 0x9b, 0xd9, 0x59, 0x8a,
0xc8, 0x4d, 0xde, 0x22, 0x6f, 0x90, 0xeb, 0xdc, 0xe6, 0x2e, 0x97, 0x71, 0xe5, 0x3e, 0xaf, 0x90,
0xe7, 0x48, 0x4d, 0xcf, 0xec, 0x09, 0x00, 0x6d, 0xb9, 0xca, 0xb9, 0xdb, 0xe9, 0xee, 0xe9, 0x99,
0xe9, 0xf9, 0xfa, 0xeb, 0x1e, 0x00, 0xee, 0x45, 0xce, 0xd5, 0x5e, 0xe8, 0xc5, 0x33, 0xd7, 0xdf,
0x0b, 0xa7, 0x7b, 0x53, 0x6a, 0x5f, 0x31, 0xdf, 0x19, 0x85, 0x3c, 0x10, 0x01, 0x29, 0x87, 0xd3,
0xe1, 0x83, 0x59, 0x10, 0xcc, 0x3c, 0xb6, 0x87, 0x92, 0x69, 0x7c, 0xb1, 0x27, 0xdc, 0x39, 0x8b,
0x04, 0x9d, 0x87, 0xca, 0x68, 0x38, 0x94, 0x1e, 0xbc, 0x60, 0xe6, 0xda, 0xd4, 0xdb, 0x73, 0x1d,
0xe6, 0x0b, 0x57, 0x2c, 0xb4, 0xce, 0xc8, 0xeb, 0xd4, 0x2a, 0x4a, 0x63, 0xd6, 0xa1, 0x7a, 0x34,
0x0f, 0xc5, 0xc2, 0xdc, 0x86, 0xda, 0x67, 0x8c, 0x3a, 0x8c, 0x93, 0x3b, 0x50, 0xbb, 0xc4, 0x2f,
0xa3, 0xb4, 0x5d, 0xd9, 0x69, 0x5a, 0x7a, 0x64, 0xfe, 0x1e, 0xe0, 0x4c, 0xce, 0x39, 0xe2, 0x3c,
0xe0, 0xe4, 0x2e, 0x34, 0x18, 0xe7, 0x13, 0xb1, 0x08, 0x99, 0x51, 0xda, 0x2e, 0xed, 0x74, 0xac,
0x3a, 0xe3, 0x7c, 0xbc, 0x08, 0x19, 0xf9, 0x3f, 0x90, 0x9f, 0x93, 0x79, 0x34, 0x33, 0xca, 0xdb,
0x25, 0xe9, 0x81, 0x71, 0x7e, 0x1a, 0xcd, 0x92, 0x39, 0x76, 0xe0, 0x30, 0xa3, 0xb2, 0x5d, 0xda,
0xa9, 0xe0, 0x9c, 0xc3, 0xc0, 0x61, 0xe6, 0x5f, 0x4a, 0x50, 0x3d, 0xa3, 0xe2, 0x32, 0x22, 0x04,
0x36, 0x78, 0x10, 0x08, 0xbd, 0x38, 0x7e, 0x93, 0x1d, 0xe8, 0xc5, 0x3e, 0x8d, 0xc5, 0xa5, 0x3c,
0x95, 0x4d, 0x05, 0x73, 0x8c, 0x32, 0xaa, 0x97, 0xc5, 0xe4, 0x6d, 0xe8, 0x78, 0x81, 0x4d, 0xbd,
0x49, 0x24, 0x02, 0x4e, 0x67, 0x72, 0x1d, 0x69, 0xd7, 0x46, 0xe1, 0xb9, 0x92, 0x91, 0x5d, 0x18,
0x44, 0x8c, 0x7a, 0x93, 0x57, 0x9c, 0x86, 0xa9, 0xe1, 0x86, 0x72, 0x28, 0x15, 0x5f, 0x71, 0x1a,
0x6a, 0x5b, 0xf3, 0x1f, 0x35, 0xa8, 0x5b, 0xec, 0x8f, 0x31, 0x8b, 0x04, 0xe9, 0x42, 0xd9, 0x75,
0xf0, 0xb4, 0x4d, 0xab, 0xec, 0x3a, 0x64, 0x04, 0xc4, 0x62, 0xa1, 0x27, 0x97, 0x76, 0x03, 0xff,
0xd0, 0x8b, 0x23, 0xc1, 0xb8, 0x3e, 0xf3, 0x1a, 0x0d, 0xb9, 0x0f, 0xcd, 0x20, 0x64, 0x1c, 0x65,
0x18, 0x80, 0xa6, 0x95, 0x09, 0xe4, 0xc1, 0x43, 0x2a, 0x2e, 0x8d, 0x0d, 0x54, 0xe0, 0xb7, 0x94,
0x39, 0x54, 0x50, 0xa3, 0xaa, 0x64, 0xf2, 0x9b, 0x98, 0x50, 0x8b, 0x98, 0xcd, 0x99, 0x30, 0x6a,
0xdb, 0xa5, 0x9d, 0xd6, 0x3e, 0x8c, 0xc2, 0xe9, 0xe8, 0x1c, 0x25, 0x96, 0xd6, 0x90, 0xfb, 0xb0,
0x21, 0xe3, 0x62, 0xd4, 0xd1, 0xa2, 0x21, 0x2d, 0x0e, 0x62, 0x71, 0x69, 0xa1, 0x94, 0xec, 0x43,
0x5d, 0xdd, 0x69, 0x64, 0x34, 0xb6, 0x2b, 0x3b, 0xad, 0x7d, 0x43, 0x1a, 0xe8, 0x53, 0x8e, 0x14,
0x0c, 0xa2, 0x23, 0x5f, 0xf0, 0x85, 0x95, 0x18, 0x92, 0xb7, 0xa0, 0x6d, 0x7b, 0x2e, 0xf3, 0xc5,
0x44, 0x04, 0x57, 0xcc, 0x37, 0x9a, 0xb8, 0xa3, 0x96, 0x92, 0x8d, 0xa5, 0x88, 0xec, 0xc3, 0x1b,
0x79, 0x93, 0x09, 0xb5, 0x6d, 0x16, 0x45, 0x01, 0x37, 0x00, 0x6d, 0x37, 0x73, 0xb6, 0x07, 0x5a,
0x25, 0xdd, 0x3a, 0x6e, 0x14, 0x7a, 0x74, 0x31, 0xf1, 0xe9, 0x9c, 0x19, 0x2d, 0xe5, 0x56, 0xcb,
0xbe, 0xa0, 0x73, 0x46, 0x1e, 0x40, 0x6b, 0x1e, 0xc4, 0xbe, 0x98, 0x84, 0x81, 0xeb, 0x0b, 0xa3,
0x8d, 0x16, 0x80, 0xa2, 0x33, 0x29, 0x21, 0x6f, 0x82, 0x1a, 0x29, 0x30, 0x76, 0x54, 0x5c, 0x51,
0x82, 0x70, 0x7c, 0x08, 0x5d, 0xa5, 0x4e, 0xf7, 0xd3, 0x45, 0x93, 0x0e, 0x4a, 0xd3, 0x9d, 0x7c,
0x00, 0x4d, 0xc4, 0x83, 0xeb, 0x5f, 0x04, 0x46, 0x0f, 0xe3, 0xb6, 0x99, 0x0b, 0x8b, 0xc4, 0xc4,
0xb1, 0x7f, 0x11, 0x58, 0x8d, 0x57, 0xfa, 0x8b, 0xfc, 0x02, 0xee, 0x15, 0xce, 0xcb, 0xd9, 0x9c,
0xba, 0xbe, 0xeb, 0xcf, 0x26, 0x71, 0xc4, 0x22, 0xa3, 0x8f, 0x08, 0x37, 0x72, 0xa7, 0xb6, 0x12,
0x83, 0x97, 0x11, 0x8b, 0xc8, 0x3d, 0x68, 0xaa, 0x24, 0x9d, 0xb8, 0x8e, 0x31, 0xc0, 0x2d, 0x35,
0x94, 0xe0, 0xd8, 0x21, 0xef, 0x40, 0x2f, 0x0c, 0x3c, 0xd7, 0x5e, 0x4c, 0x82, 0x6b, 0xc6, 0xb9,
0xeb, 0x30, 0x83, 0x6c, 0x97, 0x76, 0x1a, 0x56, 0x57, 0x89, 0xbf, 0xd4, 0xd2, 0x75, 0xa9, 0xb1,
0x89, 0x86, 0x2b, 0xa9, 0x31, 0x02, 0xb0, 0x03, 0xdf, 0x67, 0x36, 0xc2, 0x6f, 0x0b, 0x4f, 0xd8,
0x95, 0x27, 0x3c, 0x4c, 0xa5, 0x56, 0xce, 0x62, 0xf8, 0x1c, 0xda, 0x79, 0x28, 0x90, 0x3e, 0x54,
0xae, 0xd8, 0x42, 0xc3, 0x5f, 0x7e, 0x92, 0x6d, 0xa8, 0x5e, 0x53, 0x2f, 0x66, 0x08, 0x79, 0x0d,
0x44, 0x35, 0xc5, 0x52, 0x8a, 0x9f, 0x95, 0x9f, 0x96, 0xcc, 0xff, 0x54, 0x61, 0x43, 0x82, 0x8f,
0x7c, 0x08, 0x1d, 0x8f, 0xd1, 0x88, 0x4d, 0x82, 0x50, 0x2e, 0x10, 0xa1, 0xab, 0xd6, 0x7e, 0x5f,
0x4e, 0x3b, 0x91, 0x8a, 0x2f, 0x95, 0xdc, 0x6a, 0x7b, 0xb9, 0x91, 0x4c, 0x69, 0xd7, 0x17, 0x8c,
0xfb, 0xd4, 0x9b, 0x60, 0x32, 0xa8, 0x04, 0x6b, 0x27, 0xc2, 0x67, 0x32, 0x29, 0x96, 0x71, 0x54,
0x59, 0xc5, 0xd1, 0x10, 0x1a, 0x18, 0x3b, 0x97, 0x45, 0x3a, 0xd9, 0xd3, 0x31, 0xd9, 0x87, 0xc6,
0x9c, 0x09, 0xaa, 0x73, 0x4d, 0xa6, 0xc4, 0x9d, 0x24, 0x67, 0x46, 0xa7, 0x5a, 0xa1, 0x12, 0x22,
0xb5, 0x5b, 0xc9, 0x88, 0xda, 0x6a, 0x46, 0x0c, 0xa1, 0x91, 0x82, 0xae, 0xae, 0x6e, 0x38, 0x19,
0x4b, 0x9a, 0x0d, 0x19, 0x77, 0x03, 0xc7, 0x68, 0x20, 0x50, 0xf4, 0x48, 0x92, 0xa4, 0x1f, 0xcf,
0x15, 0x84, 0x9a, 0x8a, 0x24, 0xfd, 0x78, 0xbe, 0x8a, 0x18, 0x58, 0x42, 0xcc, 0x8f, 0xa0, 0x4a,
0x3d, 0x97, 0x46, 0x98, 0x42, 0xf2, 0x66, 0x35, 0xdf, 0x8f, 0x0e, 0xa4, 0xd4, 0x52, 0x4a, 0xf2,
0x04, 0x3a, 0x33, 0x1e, 0xc4, 0xe1, 0x04, 0x87, 0x2c, 0x32, 0xda, 0x78, 0xda, 0x65, 0xeb, 0x36,
0x1a, 0x1d, 0x28, 0x1b, 0x99, 0x81, 0xd3, 0x20, 0xf6, 0x9d, 0x89, 0xed, 0x3a, 0x3c, 0x32, 0x3a,
0x18, 0x3c, 0x40, 0xd1, 0xa1, 0x94, 0xc8, 0x14, 0x53, 0x29, 0x90, 0x06, 0xb8, 0x8b, 0x36, 0x1d,
0x94, 0x9e, 0x25, 0x51, 0xfe, 0x31, 0x0c, 0x92, 0xc2, 0x94, 0x59, 0xf6, 0xd0, 0xb2, 0x9f, 0x28,
0x52, 0xe3, 0x1d, 0xe8, 0xb3, 0x1b, 0x49, 0xa1, 0xae, 0x98, 0xcc, 0xe9, 0xcd, 0x44, 0x08, 0x4f,
0xa7, 0x54, 0x37, 0x91, 0x9f, 0xd2, 0x9b, 0xb1, 0xf0, 0x64, 0xfe, 0xab, 0xd5, 0x31, 0xff, 0x07,
0x58, 0x8c, 0x9a, 0x28, 0xc1, 0xfc, 0xdf, 0x85, 0x81, 0x1f, 0x4c, 0x1c, 0x76, 0x41, 0x63, 0x4f,
0xa8, 0x75, 0x17, 0x3a, 0x99, 0x7a, 0x7e, 0xf0, 0x4c, 0xc9, 0x71, 0xd9, 0xc5, 0xf0, 0xe7, 0xd0,
0x29, 0x5c, 0xf7, 0x1a, 0xd0, 0x6f, 0xe5, 0x41, 0xdf, 0xcc, 0x03, 0xfd, 0x5f, 0x1b, 0x00, 0x78,
0xef, 0x6a, 0xea, 0x72, 0xb5, 0xc8, 0x83, 0xa1, 0xbc, 0x06, 0x0c, 0x94, 0x33, 0x5f, 0x68, 0xe0,
0xea, 0xd1, 0xb7, 0x62, 0x36, 0xa9, 0x17, 0xd5, 0x5c, 0xbd, 0x78, 0x0f, 0x36, 0x24, 0x3e, 0x8d,
0x5a, 0x46, 0xeb, 0xd9, 0x8e, 0x10, 0xc9, 0x0a, 0xc5, 0x68, 0xb5, 0x92, 0x34, 0xf5, 0xd5, 0xa4,
0xc9, 0xa3, 0xb1, 0x51, 0x44, 0xe3, 0xdb, 0xd0, 0xb1, 0x39, 0xc3, 0xda, 0x35, 0x91, 0xcd, 0x88,
0x46, 0x6b, 0x3b, 0x11, 0x8e, 0xdd, 0x39, 0x93, 0xf1, 0x93, 0x17, 0x07, 0xa8, 0x92, 0x9f, 0x6b,
0xef, 0xb5, 0xb5, 0xf6, 0x5e, 0xb1, 0x13, 0xf0, 0x98, 0x66, 0x7c, 0xfc, 0xce, 0x65, 0x4d, 0xa7,
0x90, 0x35, 0x85, 0xd4, 0xe8, 0x2e, 0xa5, 0xc6, 0x12, 0x7e, 0x7b, 0x2b, 0xf8, 0x7d, 0x0b, 0xda,
0x32, 0x00, 0x51, 0x48, 0x6d, 0x26, 0x1d, 0xf4, 0x55, 0x20, 0x52, 0xd9, 0xb1, 0x83, 0xd9, 0x1e,
0x4f, 0xa7, 0x8b, 0xcb, 0xc0, 0x63, 0x19, 0x61, 0xb7, 0x52, 0xd9, 0xb1, 0x23, 0xf7, 0x8b, 0x08,
0x24, 0x88, 0x40, 0xfc, 0x1e, 0x7e, 0x04, 0xcd, 0x34, 0xea, 0xdf, 0x0b, 0x4c, 0x7f, 0x2b, 0x41,
0x3b, 0x4f, 0x8a, 0x72, 0xf2, 0x78, 0x7c, 0x82, 0x93, 0x2b, 0x96, 0xfc, 0x94, 0xed, 0x04, 0x67,
0x3e, 0x7b, 0x45, 0xa7, 0x9e, 0x72, 0xd0, 0xb0, 0x32, 0x81, 0xd4, 0xba, 0xbe, 0xcd, 0xd9, 0x3c,
0x41, 0x55, 0xc5, 0xca, 0x04, 0xe4, 0x63, 0x00, 0x37, 0x8a, 0x62, 0xa6, 0x6e, 0x6e, 0x03, 0x29,
0x63, 0x38, 0x52, 0x3d, 0xe6, 0x28, 0xe9, 0x31, 0x47, 0xe3, 0xa4, 0xc7, 0xb4, 0x9a, 0x68, 0x8d,
0x57, 0x7a, 0x07, 0x6a, 0xf2, 0x82, 0xc6, 0x27, 0x88, 0xbc, 0x8a, 0xa5, 0x47, 0xe6, 0x9f, 0xa1,
0xa6, 0xba, 0x90, 0xff, 0x29, 0xd1, 0xdf, 0x85, 0x86, 0xf2, 0xed, 0x3a, 0x3a, 0x57, 0xea, 0x38,
0x3e, 0x76, 0xcc, 0x6f, 0xca, 0xd0, 0xb0, 0x58, 0x14, 0x06, 0x7e, 0xc4, 0x72, 0x5d, 0x52, 0xe9,
0x3b, 0xbb, 0xa4, 0xf2, 0xda, 0x2e, 0x29, 0xe9, 0xbd, 0x2a, 0xb9, 0xde, 0x6b, 0x08, 0x0d, 0xce,
0x1c, 0x97, 0x33, 0x5b, 0xe8, 0x3e, 0x2d, 0x1d, 0x4b, 0xdd, 0x2b, 0xca, 0x65, 0x79, 0x8f, 0xb0,
0x86, 0x34, 0xad, 0x74, 0x4c, 0x1e, 0xe7, 0x9b, 0x0b, 0xd5, 0xb6, 0x6d, 0xa9, 0xe6, 0x42, 0x6d,
0x77, 0x4d, 0x77, 0xf1, 0x24, 0x6b, 0xd2, 0xea, 0x98, 0xcd, 0x77, 0xf3, 0x13, 0xd6, 0x77, 0x69,
0x3f, 0x58, 0xcd, 0xfe, 0xa6, 0x0c, 0xfd, 0xe5, 0xbd, 0xad, 0x41, 0xe0, 0x16, 0x54, 0x55, 0xed,
0xd3, 0xf0, 0x15, 0x2b, 0x55, 0xaf, 0xb2, 0x44, 0x74, 0x9f, 0x2c, 0x93, 0xc6, 0x77, 0x43, 0xaf,
0x48, 0x28, 0xef, 0x42, 0x5f, 0x86, 0x28, 0x64, 0x4e, 0xd6, 0xcf, 0x29, 0x06, 0xec, 0x69, 0x79,
0xda, 0xd1, 0xed, 0xc2, 0x20, 0x31, 0xcd, 0xb8, 0xa1, 0x56, 0xb0, 0x3d, 0x4a, 0x28, 0xe2, 0x0e,
0xd4, 0x2e, 0x02, 0x3e, 0xa7, 0x42, 0x93, 0xa0, 0x1e, 0x15, 0x48, 0x0e, 0xd9, 0xb6, 0xa1, 0x30,
0x99, 0x08, 0xe5, 0x9b, 0x45, 0x92, 0x4f, 0xfa, 0x9e, 0x40, 0x16, 0x6c, 0x58, 0x8d, 0xe4, 0x1d,
0x61, 0xfe, 0x06, 0x7a, 0x4b, 0x2d, 0xe4, 0x9a, 0x40, 0x66, 0xcb, 0x97, 0x0b, 0xcb, 0x17, 0x3c,
0x57, 0x96, 0x3c, 0xff, 0x16, 0x06, 0x9f, 0x51, 0xdf, 0xf1, 0x98, 0xf6, 0x7f, 0xc0, 0x67, 0x91,
0x2c, 0x86, 0xfa, 0x45, 0x33, 0xd1, 0xd5, 0xa7, 0x63, 0x35, 0xb5, 0xe4, 0xd8, 0x21, 0x0f, 0xa1,
0xce, 0x95, 0xb5, 0x06, 0x40, 0x2b, 0xd7, 0xe3, 0x5a, 0x89, 0xce, 0xfc, 0x1a, 0x48, 0xc1, 0xb5,
0x7c, 0xcc, 0x2c, 0xc8, 0x8e, 0x44, 0xbf, 0x02, 0x85, 0xce, 0xaa, 0x76, 0x1e, 0x93, 0x56, 0xaa,
0x25, 0xdb, 0x50, 0x61, 0x9c, 0xeb, 0x25, 0xb0, 0xc9, 0xcc, 0x9e, 0x8e, 0x96, 0x54, 0x99, 0x7d,
0xe8, 0x1e, 0xfb, 0xae, 0x70, 0xa9, 0xe7, 0xfe, 0x89, 0xc9, 0x9d, 0x9b, 0x4f, 0xa0, 0x97, 0x49,
0xd4, 0x82, 0xda, 0x4d, 0xe9, 0x76, 0x37, 0x3f, 0x81, 0xc1, 0x79, 0xc8, 0x6c, 0x97, 0x7a, 0xf8,
0x7a, 0x54, 0xd3, 0x1e, 0x40, 0x55, 0xde, 0x55, 0xc2, 0x3b, 0x4d, 0x9c, 0x88, 0x6a, 0x25, 0x37,
0xbf, 0x06, 0x43, 0x1d, 0xef, 0xe8, 0xc6, 0x8d, 0x04, 0xf3, 0x6d, 0x76, 0x78, 0xc9, 0xec, 0xab,
0x1f, 0x30, 0x80, 0xd7, 0x70, 0x77, 0xdd, 0x0a, 0xc9, 0xfe, 0x5a, 0xb6, 0x1c, 0x4d, 0x2e, 0x64,
0x09, 0xc2, 0x35, 0x1a, 0x16, 0xa0, 0xe8, 0xb9, 0x94, 0x48, 0x38, 0x30, 0x39, 0x2f, 0xd2, 0xb4,
0xae, 0x47, 0x49, 0x3c, 0x2a, 0xb7, 0xc7, 0xe3, 0xef, 0x25, 0x68, 0x9e, 0x33, 0x11, 0x87, 0x78,
0x96, 0x7b, 0xd0, 0x9c, 0xf2, 0xe0, 0x8a, 0xf1, 0xec, 0x28, 0x0d, 0x25, 0x38, 0x76, 0xc8, 0x63,
0xa8, 0x1d, 0x06, 0xfe, 0x85, 0x3b, 0xc3, 0xb7, 0xb4, 0xe6, 0x97, 0x74, 0xee, 0x48, 0xe9, 0x14,
0xbf, 0x68, 0x43, 0xb2, 0x0d, 0x2d, 0xfd, 0xcb, 0xc4, 0xcb, 0x97, 0xc7, 0xcf, 0x92, 0x26, 0x3b,
0x27, 0x1a, 0x7e, 0x0c, 0xad, 0xdc, 0xc4, 0xef, 0x55, 0xf1, 0xfe, 0x1f, 0x00, 0x57, 0x57, 0x31,
0xea, 0x67, 0x57, 0xdf, 0x54, 0x47, 0x7b, 0x00, 0x4d, 0xd9, 0xcf, 0x29, 0x75, 0x52, 0x6b, 0x4b,
0x59, 0xad, 0x35, 0x1f, 0xc2, 0xe0, 0xd8, 0xbf, 0xa6, 0x9e, 0xeb, 0x50, 0xc1, 0x3e, 0x67, 0x0b,
0x0c, 0xc1, 0xca, 0x0e, 0xcc, 0x73, 0x68, 0xeb, 0xc7, 0xfd, 0x6b, 0xed, 0xb1, 0xad, 0xf7, 0xf8,
0xed, 0xb9, 0xf8, 0x2e, 0xf4, 0xb4, 0xd3, 0x13, 0x57, 0x67, 0xa2, 0x6c, 0x55, 0x38, 0xbb, 0x70,
0x6f, 0xb4, 0x6b, 0x3d, 0x32, 0x9f, 0x42, 0x3f, 0x67, 0x9a, 0x1e, 0xe7, 0x8a, 0x2d, 0xa2, 0xe4,
0x47, 0x0f, 0xf9, 0x9d, 0x44, 0xa0, 0x9c, 0x45, 0xc0, 0x84, 0xae, 0x9e, 0xf9, 0x82, 0x89, 0x5b,
0x4e, 0xf7, 0x79, 0xba, 0x91, 0x17, 0x4c, 0x3b, 0x7f, 0x04, 0x55, 0x26, 0x4f, 0x9a, 0x2f, 0xc3,
0xf9, 0x08, 0x58, 0x4a, 0xbd, 0x66, 0xc1, 0xa7, 0xe9, 0x82, 0x67, 0xb1, 0x5a, 0xf0, 0x35, 0x7d,
0x99, 0x6f, 0xa7, 0xdb, 0x38, 0x8b, 0xc5, 0x6d, 0x37, 0xfa, 0x10, 0x06, 0xda, 0xe8, 0x19, 0xf3,
0x98, 0x60, 0xb7, 0x1c, 0xe9, 0x11, 0x90, 0x82, 0xd9, 0x6d, 0xee, 0xee, 0x43, 0x63, 0x3c, 0x3e,
0x49, 0xb5, 0x45, 0x8a, 0x35, 0x77, 0xa0, 0x3d, 0xa6, 0xb2, 0x95, 0x70, 0x94, 0x85, 0x01, 0x75,
0xa1, 0xc6, 0x3a, 0x01, 0x93, 0xa1, 0xb9, 0x0f, 0x5b, 0x87, 0xd4, 0xbe, 0x74, 0xfd, 0xd9, 0x33,
0x37, 0x92, 0xbd, 0x94, 0x9e, 0x31, 0x84, 0x86, 0xa3, 0x05, 0x7a, 0x4a, 0x3a, 0x36, 0xdf, 0x87,
0x37, 0x72, 0x3f, 0xf8, 0x9c, 0x0b, 0x9a, 0x6c, 0x73, 0x0b, 0xaa, 0x91, 0x1c, 0xe1, 0x8c, 0xaa,
0xa5, 0x06, 0xe6, 0x17, 0xb0, 0x95, 0x2f, 0xaf, 0xb2, 0xb3, 0xc1, 0xc3, 0x27, 0x3d, 0x47, 0x29,
0xd7, 0x73, 0xe8, 0xa3, 0x94, 0xb3, 0x6a, 0xd1, 0x87, 0xca, 0xaf, 0xbe, 0x1a, 0x6b, 0x0c, 0xca,
0x4f, 0xf3, 0x0f, 0x72, 0xf9, 0xa2, 0x3f, 0xb5, 0x7c, 0xa1, 0xf1, 0x28, 0xbd, 0x56, 0xe3, 0xb1,
0x0a, 0x83, 0xf7, 0x61, 0x70, 0xea, 0x05, 0xf6, 0xd5, 0x91, 0x9f, 0x8b, 0x86, 0x01, 0x75, 0xe6,
0xe7, 0x83, 0x91, 0x0c, 0xcd, 0x77, 0xa0, 0x77, 0x12, 0xd8, 0xd4, 0x3b, 0x0d, 0x62, 0x5f, 0xa4,
0x51, 0xc0, 0x5f, 0xe0, 0xb4, 0xa9, 0x1a, 0x98, 0xef, 0x43, 0x57, 0x17, 0x60, 0xff, 0x22, 0x48,
0x08, 0x2b, 0x2b, 0xd5, 0xa5, 0x62, 0x1b, 0x6f, 0x9e, 0x40, 0x2f, 0x33, 0x57, 0x7e, 0xdf, 0x81,
0x9a, 0x52, 0xeb, 0xb3, 0xf5, 0xd2, 0x77, 0xac, 0xb2, 0xb4, 0xb4, 0x7a, 0xcd, 0xa1, 0xce, 0x60,
0xeb, 0x85, 0x7c, 0xe4, 0x46, 0xcf, 0x03, 0xae, 0x8d, 0x75, 0xb6, 0xd4, 0xf0, 0xf1, 0xab, 0x92,
0x31, 0xff, 0x34, 0x46, 0x73, 0x4b, 0x6b, 0xd7, 0x78, 0x9c, 0x43, 0xf7, 0x0c, 0x7f, 0x5b, 0x3d,
0xf2, 0xaf, 0x95, 0xaf, 0x63, 0x20, 0xea, 0xd7, 0xd6, 0x09, 0xf3, 0xaf, 0x5d, 0x1e, 0xf8, 0xd8,
0x8c, 0x97, 0x74, 0xcb, 0x93, 0xf8, 0x4d, 0x27, 0x25, 0x16, 0xd6, 0x20, 0x5c, 0x16, 0xad, 0xbd,
0x15, 0xc8, 0x7e, 0xb9, 0x91, 0x35, 0x85, 0xb3, 0x79, 0x20, 0xd8, 0x84, 0x3a, 0x4e, 0x92, 0x16,
0xa0, 0x44, 0x07, 0x8e, 0xc3, 0xf7, 0xff, 0x5a, 0x81, 0xfa, 0xa7, 0x8a, 0xa9, 0xc9, 0x2f, 0xa1,
0x53, 0x28, 0xef, 0xe4, 0x0d, 0x6c, 0x03, 0x97, 0x9b, 0x89, 0xe1, 0x9d, 0x15, 0xb1, 0x3a, 0xd7,
0x07, 0xd0, 0xce, 0x57, 0x5d, 0x82, 0x15, 0x16, 0x7f, 0x47, 0x1e, 0xa2, 0xa7, 0xd5, 0x92, 0x7c,
0x0e, 0x5b, 0xeb, 0xea, 0x21, 0xb9, 0x9f, 0xad, 0xb0, 0x5a, 0x8b, 0x87, 0x6f, 0xde, 0xa6, 0x4d,
0xea, 0x68, 0xfd, 0xd0, 0x63, 0xd4, 0x8f, 0xc3, 0xfc, 0x0e, 0xb2, 0x4f, 0xf2, 0x18, 0x3a, 0x85,
0x8a, 0xa0, 0xce, 0xb9, 0x52, 0x24, 0xf2, 0x53, 0x1e, 0x41, 0x15, 0xab, 0x10, 0xe9, 0x14, 0xca,
0xe1, 0xb0, 0x9b, 0x0e, 0xd5, 0xda, 0x1f, 0x02, 0x64, 0xdd, 0x0a, 0x21, 0xca, 0x6f, 0xbe, 0x9f,
0x19, 0x6e, 0x16, 0x65, 0x49, 0x47, 0xb3, 0x81, 0x3f, 0x4a, 0xe4, 0xf6, 0x8b, 0x0b, 0xa5, 0x95,
0x6d, 0xff, 0xdf, 0x25, 0xa8, 0x27, 0x3f, 0x54, 0x3f, 0x86, 0x0d, 0x59, 0x23, 0xc8, 0x66, 0x8e,
0x66, 0x93, 0xfa, 0x32, 0xdc, 0x5a, 0x12, 0xaa, 0x05, 0x46, 0x50, 0x79, 0xc1, 0x84, 0xda, 0x50,
0xb1, 0x58, 0x0c, 0x37, 0x8b, 0xb2, 0xd4, 0xfe, 0x2c, 0x2e, 0xda, 0x6b, 0xae, 0x2f, 0xd8, 0xa7,
0x2c, 0xfe, 0x11, 0xd4, 0x14, 0x0b, 0xab, 0x58, 0xae, 0xf0, 0xb7, 0xc2, 0xcc, 0x2a, 0x5f, 0xef,
0xff, 0x73, 0x03, 0xe0, 0x7c, 0x11, 0x09, 0x36, 0xff, 0xb5, 0xcb, 0x5e, 0x91, 0x5d, 0xe8, 0xe9,
0x9f, 0x5e, 0xf0, 0x45, 0x28, 0x69, 0x2d, 0x17, 0x13, 0xec, 0x2b, 0x53, 0x32, 0x7f, 0x04, 0xad,
0x53, 0x7a, 0xf3, 0x3a, 0x76, 0x75, 0x4d, 0xf1, 0x79, 0x1b, 0xac, 0x51, 0x05, 0xea, 0xff, 0x29,
0xf4, 0x96, 0x08, 0x3e, 0x6f, 0x8f, 0xbf, 0x9a, 0xac, 0x2d, 0x00, 0x4f, 0xe5, 0xa3, 0xa8, 0x48,
0xf2, 0xf9, 0x89, 0xfa, 0x81, 0xb6, 0xae, 0x0a, 0xbc, 0x28, 0x3e, 0xa7, 0xf0, 0x25, 0x6b, 0x2c,
0xf3, 0x70, 0x52, 0x05, 0x86, 0x77, 0xd7, 0x69, 0xd2, 0xcc, 0xcb, 0x53, 0xf1, 0x4a, 0xe6, 0xad,
0xf2, 0xf4, 0x7b, 0x00, 0x19, 0x1b, 0xe7, 0xed, 0xf1, 0x7a, 0x97, 0x89, 0xfa, 0x43, 0x80, 0x8c,
0x63, 0x15, 0x2a, 0x8a, 0x14, 0xad, 0xa6, 0x2d, 0xf3, 0xf0, 0x2e, 0x34, 0x53, 0x16, 0xcb, 0xaf,
0x81, 0x0e, 0x96, 0x48, 0xf1, 0x13, 0xe8, 0x2d, 0x11, 0xef, 0xda, 0x75, 0x30, 0x3c, 0xeb, 0x18,
0xfa, 0xd3, 0xdd, 0xdf, 0xed, 0xcc, 0x5c, 0x71, 0x19, 0x4f, 0x47, 0x76, 0x30, 0xdf, 0xbb, 0xa4,
0xd1, 0xa5, 0x6b, 0x07, 0x3c, 0xdc, 0xbb, 0x96, 0x68, 0xda, 0x2b, 0xfc, 0x91, 0x36, 0xad, 0xe1,
0x83, 0xf2, 0xc9, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x9a, 0xc2, 0x92, 0x60, 0x1b, 0x00,
0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -3473,6 +3524,9 @@ type SystemViewClient interface {
EntityInfo(ctx context.Context, in *EntityInfoArgs, opts ...grpc.CallOption) (*EntityInfoReply, error)
// PluginEnv returns Vault environment information used by plugins
PluginEnv(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*PluginEnvReply, error)
// GroupsForEntity returns the group membership information for the given
// entity id
GroupsForEntity(ctx context.Context, in *EntityInfoArgs, opts ...grpc.CallOption) (*GroupsForEntityReply, error)
}
type systemViewClient struct {
@@ -3573,6 +3627,15 @@ func (c *systemViewClient) PluginEnv(ctx context.Context, in *Empty, opts ...grp
return out, nil
}
func (c *systemViewClient) GroupsForEntity(ctx context.Context, in *EntityInfoArgs, opts ...grpc.CallOption) (*GroupsForEntityReply, error) {
out := new(GroupsForEntityReply)
err := c.cc.Invoke(ctx, "/pb.SystemView/GroupsForEntity", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// SystemViewServer is the server API for SystemView service.
type SystemViewServer interface {
// DefaultLeaseTTL returns the default lease TTL set in Vault configuration
@@ -3608,6 +3671,9 @@ type SystemViewServer interface {
EntityInfo(context.Context, *EntityInfoArgs) (*EntityInfoReply, error)
// PluginEnv returns Vault environment information used by plugins
PluginEnv(context.Context, *Empty) (*PluginEnvReply, error)
// GroupsForEntity returns the group membership information for the given
// entity id
GroupsForEntity(context.Context, *EntityInfoArgs) (*GroupsForEntityReply, error)
}
// UnimplementedSystemViewServer can be embedded to have forward compatible implementations.
@@ -3644,6 +3710,9 @@ func (*UnimplementedSystemViewServer) EntityInfo(ctx context.Context, req *Entit
func (*UnimplementedSystemViewServer) PluginEnv(ctx context.Context, req *Empty) (*PluginEnvReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method PluginEnv not implemented")
}
func (*UnimplementedSystemViewServer) GroupsForEntity(ctx context.Context, req *EntityInfoArgs) (*GroupsForEntityReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method GroupsForEntity not implemented")
}
func RegisterSystemViewServer(s *grpc.Server, srv SystemViewServer) {
s.RegisterService(&_SystemView_serviceDesc, srv)
@@ -3829,6 +3898,24 @@ func _SystemView_PluginEnv_Handler(srv interface{}, ctx context.Context, dec fun
return interceptor(ctx, in, info, handler)
}
func _SystemView_GroupsForEntity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(EntityInfoArgs)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(SystemViewServer).GroupsForEntity(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/pb.SystemView/GroupsForEntity",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(SystemViewServer).GroupsForEntity(ctx, req.(*EntityInfoArgs))
}
return interceptor(ctx, in, info, handler)
}
var _SystemView_serviceDesc = grpc.ServiceDesc{
ServiceName: "pb.SystemView",
HandlerType: (*SystemViewServer)(nil),
@@ -3873,6 +3960,10 @@ var _SystemView_serviceDesc = grpc.ServiceDesc{
MethodName: "PluginEnv",
Handler: _SystemView_PluginEnv_Handler,
},
{
MethodName: "GroupsForEntity",
Handler: _SystemView_GroupsForEntity_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "sdk/plugin/pb/backend.proto",

View File

@@ -544,6 +544,11 @@ message EntityInfoReply {
string err = 2;
}
message GroupsForEntityReply {
repeated logical.Group groups = 1;
string err = 2;
}
message PluginEnvReply {
logical.PluginEnvironment plugin_environment = 1;
string err = 2;
@@ -594,6 +599,10 @@ service SystemView {
// PluginEnv returns Vault environment information used by plugins
rpc PluginEnv(Empty) returns (PluginEnvReply);
// GroupsForEntity returns the group membership information for the given
// entity id
rpc GroupsForEntity(EntityInfoArgs) returns (GroupsForEntityReply);
}
message Connection {

View File

@@ -7,6 +7,7 @@ import (
"github.com/hashicorp/errwrap"
"github.com/hashicorp/vault/helper/identity"
"github.com/hashicorp/vault/helper/namespace"
"github.com/hashicorp/vault/sdk/helper/consts"
"github.com/hashicorp/vault/sdk/helper/license"
@@ -265,31 +266,62 @@ func (d dynamicSystemView) EntityInfo(entityID string) (*logical.Entity, error)
}
}
aliases := make([]*logical.Alias, len(entity.Aliases))
for i, a := range entity.Aliases {
alias := &logical.Alias{
MountAccessor: a.MountAccessor,
Name: a.Name,
aliases := make([]*logical.Alias, 0, len(entity.Aliases))
for _, a := range entity.Aliases {
// Don't return aliases from other namespaces
if a.NamespaceID != d.mountEntry.NamespaceID {
continue
}
alias := identity.ToSDKAlias(a)
// MountType is not stored with the entity and must be looked up
if mount := d.core.router.validateMountByAccessor(a.MountAccessor); mount != nil {
alias.MountType = mount.MountType
}
if a.Metadata != nil {
alias.Metadata = make(map[string]string, len(a.Metadata))
for k, v := range a.Metadata {
alias.Metadata[k] = v
}
}
aliases[i] = alias
aliases = append(aliases, alias)
}
ret.Aliases = aliases
return ret, nil
}
func (d dynamicSystemView) GroupsForEntity(entityID string) ([]*logical.Group, error) {
// Requests from token created from the token backend will not have entity information.
// Return missing entity instead of error when requesting from MemDB.
if entityID == "" {
return nil, nil
}
if d.core == nil {
return nil, fmt.Errorf("system view core is nil")
}
if d.core.identityStore == nil {
return nil, fmt.Errorf("system view identity store is nil")
}
groups, inheritedGroups, err := d.core.identityStore.groupsByEntityID(entityID)
if err != nil {
return nil, err
}
groups = append(groups, inheritedGroups...)
logicalGroups := make([]*logical.Group, 0, len(groups))
for _, g := range groups {
// Don't return groups from other namespaces
if g.NamespaceID != d.mountEntry.NamespaceID {
continue
}
logicalGroups = append(logicalGroups, identity.ToSDKGroup(g))
}
return logicalGroups, nil
}
func (d dynamicSystemView) PluginEnv(_ context.Context) (*logical.PluginEnvironment, error) {
return &logical.PluginEnvironment{
VaultVersion: version.GetVersion().Version,

View File

@@ -0,0 +1,151 @@
package vault
import (
"testing"
log "github.com/hashicorp/go-hclog"
ldapcred "github.com/hashicorp/vault/builtin/credential/ldap"
"github.com/hashicorp/vault/helper/namespace"
"github.com/hashicorp/vault/sdk/framework"
"github.com/hashicorp/vault/sdk/logical"
)
func TestIdentity_BackendTemplating(t *testing.T) {
var err error
coreConfig := &CoreConfig{
DisableMlock: true,
DisableCache: true,
Logger: log.NewNullLogger(),
CredentialBackends: map[string]logical.Factory{
"ldap": ldapcred.Factory,
},
}
cluster := NewTestCluster(t, coreConfig, &TestClusterOptions{})
cluster.Start()
defer cluster.Cleanup()
core := cluster.Cores[0].Core
TestWaitActive(t, core)
req := logical.TestRequest(t, logical.UpdateOperation, "sys/auth/ldap")
req.ClientToken = cluster.RootToken
req.Data["type"] = "ldap"
resp, err := core.HandleRequest(namespace.RootContext(nil), req)
if err != nil {
t.Fatalf("err: %v", err)
}
if resp != nil {
t.Fatalf("bad: %v", resp)
}
req = logical.TestRequest(t, logical.ReadOperation, "sys/auth")
req.ClientToken = cluster.RootToken
resp, err = core.HandleRequest(namespace.RootContext(nil), req)
if err != nil {
t.Fatalf("err: %v", err)
}
accessor := resp.Data["ldap/"].(map[string]interface{})["accessor"].(string)
// Create an entity
req = logical.TestRequest(t, logical.UpdateOperation, "identity/entity")
req.ClientToken = cluster.RootToken
req.Data["name"] = "entity1"
req.Data["metadata"] = map[string]string{
"organization": "hashicorp",
"team": "vault",
}
resp, err = core.HandleRequest(namespace.RootContext(nil), req)
if err != nil {
t.Fatal(err)
}
entityID := resp.Data["id"].(string)
// Create an alias
req = logical.TestRequest(t, logical.UpdateOperation, "identity/entity-alias")
req.ClientToken = cluster.RootToken
req.Data["name"] = "alias1"
req.Data["canonical_id"] = entityID
req.Data["mount_accessor"] = accessor
resp, err = core.HandleRequest(namespace.RootContext(nil), req)
if err != nil {
t.Fatal(err)
}
aliasID := resp.Data["id"].(string)
// Create a group
req = logical.TestRequest(t, logical.UpdateOperation, "identity/group")
req.ClientToken = cluster.RootToken
req.Data["name"] = "group1"
req.Data["member_entity_ids"] = []string{entityID}
req.Data["metadata"] = map[string]string{
"group": "vault",
}
resp, err = core.HandleRequest(namespace.RootContext(nil), req)
if err != nil {
t.Fatal(err)
}
groupID := resp.Data["id"].(string)
// Get the ldap mount
sysView := core.router.MatchingSystemView(namespace.RootContext(nil), "auth/ldap/")
tCases := []struct {
tpl string
expected string
}{
{
tpl: "{{identity.entity.id}}",
expected: entityID,
},
{
tpl: "{{identity.entity.name}}",
expected: "entity1",
},
{
tpl: "{{identity.entity.metadata.organization}}",
expected: "hashicorp",
},
{
tpl: "{{identity.entity.aliases." + accessor + ".id}}",
expected: aliasID,
},
{
tpl: "{{identity.entity.aliases." + accessor + ".name}}",
expected: "alias1",
},
{
tpl: "{{identity.groups.ids." + groupID + ".name}}",
expected: "group1",
},
{
tpl: "{{identity.groups.names.group1.id}}",
expected: groupID,
},
{
tpl: "{{identity.groups.names.group1.metadata.group}}",
expected: "vault",
},
{
tpl: "{{identity.groups.ids." + groupID + ".metadata.group}}",
expected: "vault",
},
}
for _, tCase := range tCases {
out, err := framework.PopulateIdentityTemplate(tCase.tpl, entityID, sysView)
if err != nil {
t.Fatal(err)
}
if out != tCase.expected {
t.Fatalf("got %q, expected %q", out, tCase.expected)
}
}
}

View File

@@ -21,6 +21,7 @@ import (
"github.com/hashicorp/vault/helper/namespace"
"github.com/hashicorp/vault/sdk/framework"
"github.com/hashicorp/vault/sdk/helper/base62"
"github.com/hashicorp/vault/sdk/helper/identitytpl"
"github.com/hashicorp/vault/sdk/helper/strutil"
"github.com/hashicorp/vault/sdk/logical"
"github.com/patrickmn/go-cache"
@@ -794,11 +795,11 @@ func (tok *idToken) generatePayload(logger hclog.Logger, template string, entity
// Parse and integrate the populated role template. Structural errors with the template _should_
// be caught during role configuration. Error found during runtime will be logged, but they will
// not block generation of the basic ID token. They should not be returned to the requester.
_, populatedTemplate, err := identity.PopulateString(identity.PopulateStringInput{
Mode: identity.JSONTemplating,
_, populatedTemplate, err := identitytpl.PopulateString(identitytpl.PopulateStringInput{
Mode: identitytpl.JSONTemplating,
String: template,
Entity: entity,
Groups: groups,
Entity: identity.ToSDKEntity(entity),
Groups: identity.ToSDKGroups(groups),
// namespace?
})
@@ -899,11 +900,11 @@ func (i *IdentityStore) pathOIDCCreateUpdateRole(ctx context.Context, req *logic
// Validate that template can be parsed and results in valid JSON
if role.Template != "" {
_, populatedTemplate, err := identity.PopulateString(identity.PopulateStringInput{
Mode: identity.JSONTemplating,
_, populatedTemplate, err := identitytpl.PopulateString(identitytpl.PopulateStringInput{
Mode: identitytpl.JSONTemplating,
String: role.Template,
Entity: new(identity.Entity),
Groups: make([]*identity.Group, 0),
Entity: new(logical.Entity),
Groups: make([]*logical.Group, 0),
// namespace?
})

View File

@@ -13,6 +13,7 @@ import (
"github.com/hashicorp/vault/helper/identity"
"github.com/hashicorp/vault/helper/namespace"
"github.com/hashicorp/vault/sdk/helper/hclutil"
"github.com/hashicorp/vault/sdk/helper/identitytpl"
"github.com/hashicorp/vault/sdk/helper/parseutil"
"github.com/mitchellh/copystructure"
)
@@ -281,20 +282,20 @@ func parsePaths(result *Policy, list *ast.ObjectList, performTemplating bool, en
// Check the path
if performTemplating {
_, templated, err := identity.PopulateString(identity.PopulateStringInput{
Mode: identity.ACLTemplating,
_, templated, err := identitytpl.PopulateString(identitytpl.PopulateStringInput{
Mode: identitytpl.ACLTemplating,
String: key,
Entity: entity,
Groups: groups,
Namespace: result.namespace,
Entity: identity.ToSDKEntity(entity),
Groups: identity.ToSDKGroups(groups),
NamespaceID: result.namespace.ID,
})
if err != nil {
continue
}
key = templated
} else {
hasTemplating, _, err := identity.PopulateString(identity.PopulateStringInput{
Mode: identity.ACLTemplating,
hasTemplating, _, err := identitytpl.PopulateString(identitytpl.PopulateStringInput{
Mode: identitytpl.ACLTemplating,
ValidityCheckOnly: true,
String: key,
})

View File

@@ -118,6 +118,9 @@ func VaultPluginTLSProvider(apiTLSConfig *TLSConfig) func() (*tls.Config, error)
return nil, errwrap.Wrapf("error during api client creation: {{err}}", err)
}
// Reset token value to make sure nothing has been set by default
client.ClearToken()
secret, err := client.Logical().Unwrap(unwrapToken)
if err != nil {
return nil, errwrap.Wrapf("error during token unwrap request: {{err}}", err)

View File

@@ -0,0 +1,57 @@
package framework
import (
"errors"
"github.com/hashicorp/errwrap"
"github.com/hashicorp/vault/sdk/helper/identitytpl"
"github.com/hashicorp/vault/sdk/logical"
)
// PopulateIdentityTemplate takes a template string, an entity ID, and an
// instance of system view. It will query system view for information about the
// entity and use the resulting identity information to populate the template
// string.
func PopulateIdentityTemplate(tpl string, entityID string, sysView logical.SystemView) (string, error) {
entity, err := sysView.EntityInfo(entityID)
if err != nil {
return "", err
}
if entity == nil {
return "", errors.New("no entity found")
}
groups, err := sysView.GroupsForEntity(entityID)
if err != nil {
return "", err
}
input := identitytpl.PopulateStringInput{
String: tpl,
Entity: entity,
Groups: groups,
Mode: identitytpl.ACLTemplating,
}
_, out, err := identitytpl.PopulateString(input)
if err != nil {
return "", err
}
return out, nil
}
// ValidateIdentityTemplate takes a template string and returns if the string is
// a valid identity template.
func ValidateIdentityTemplate(tpl string) (bool, error) {
hasTemplating, _, err := identitytpl.PopulateString(identitytpl.PopulateStringInput{
Mode: identitytpl.ACLTemplating,
ValidityCheckOnly: true,
String: tpl,
})
if err != nil {
return false, errwrap.Wrapf("failed to validate policy templating: {{err}}", err)
}
return hasTemplating, nil
}

View File

@@ -0,0 +1,358 @@
package identitytpl
import (
"encoding/json"
"errors"
"fmt"
"strconv"
"strings"
"time"
"github.com/hashicorp/errwrap"
"github.com/hashicorp/vault/sdk/logical"
)
var (
ErrUnbalancedTemplatingCharacter = errors.New("unbalanced templating characters")
ErrNoEntityAttachedToToken = errors.New("string contains entity template directives but no entity was provided")
ErrNoGroupsAttachedToToken = errors.New("string contains groups template directives but no groups were provided")
ErrTemplateValueNotFound = errors.New("no value could be found for one of the template directives")
)
const (
ACLTemplating = iota // must be the first value for backwards compatibility
JSONTemplating
)
type PopulateStringInput struct {
String string
ValidityCheckOnly bool
Entity *logical.Entity
Groups []*logical.Group
NamespaceID string
Mode int // processing mode, ACLTemplate or JSONTemplating
Now time.Time // optional, defaults to current time
templateHandler templateHandlerFunc
groupIDs []string
groupNames []string
}
// templateHandlerFunc allows generating string outputs based on data type, and
// different handlers can be used based on mode. For example in ACL mode, strings
// are emitted verbatim, but they're wrapped in double quotes for JSON mode. And
// some structures, like slices, might be rendered in one mode but prohibited in
// another.
type templateHandlerFunc func(interface{}, ...string) (string, error)
// aclTemplateHandler processes known parameter data types when operating
// in ACL mode.
func aclTemplateHandler(v interface{}, keys ...string) (string, error) {
switch t := v.(type) {
case string:
if t == "" {
return "", ErrTemplateValueNotFound
}
return t, nil
case []string:
return "", ErrTemplateValueNotFound
case map[string]string:
if len(keys) > 0 {
val, ok := t[keys[0]]
if ok {
return val, nil
}
}
return "", ErrTemplateValueNotFound
}
return "", fmt.Errorf("unknown type: %T", v)
}
// jsonTemplateHandler processes known parameter data types when operating
// in JSON mode.
func jsonTemplateHandler(v interface{}, keys ...string) (string, error) {
jsonMarshaller := func(v interface{}) (string, error) {
enc, err := json.Marshal(v)
if err != nil {
return "", err
}
return string(enc), nil
}
switch t := v.(type) {
case string:
return strconv.Quote(t), nil
case []string:
return jsonMarshaller(t)
case map[string]string:
if len(keys) > 0 {
return strconv.Quote(t[keys[0]]), nil
}
if t == nil {
return "{}", nil
}
return jsonMarshaller(t)
}
return "", fmt.Errorf("unknown type: %T", v)
}
func PopulateString(p PopulateStringInput) (bool, string, error) {
if p.String == "" {
return false, "", nil
}
// preprocess groups
for _, g := range p.Groups {
p.groupNames = append(p.groupNames, g.Name)
p.groupIDs = append(p.groupIDs, g.ID)
}
// set up mode-specific handler
switch p.Mode {
case ACLTemplating:
p.templateHandler = aclTemplateHandler
case JSONTemplating:
p.templateHandler = jsonTemplateHandler
default:
return false, "", fmt.Errorf("unknown mode %q", p.Mode)
}
var subst bool
splitStr := strings.Split(p.String, "{{")
if len(splitStr) >= 1 {
if strings.Contains(splitStr[0], "}}") {
return false, "", ErrUnbalancedTemplatingCharacter
}
if len(splitStr) == 1 {
return false, p.String, nil
}
}
var b strings.Builder
if !p.ValidityCheckOnly {
b.Grow(2 * len(p.String))
}
for i, str := range splitStr {
if i == 0 {
if !p.ValidityCheckOnly {
b.WriteString(str)
}
continue
}
splitPiece := strings.Split(str, "}}")
switch len(splitPiece) {
case 2:
subst = true
if !p.ValidityCheckOnly {
tmplStr, err := performTemplating(strings.TrimSpace(splitPiece[0]), &p)
if err != nil {
return false, "", err
}
b.WriteString(tmplStr)
b.WriteString(splitPiece[1])
}
default:
return false, "", ErrUnbalancedTemplatingCharacter
}
}
return subst, b.String(), nil
}
func performTemplating(input string, p *PopulateStringInput) (string, error) {
performAliasTemplating := func(trimmed string, alias *logical.Alias) (string, error) {
switch {
case trimmed == "id":
return p.templateHandler(alias.ID)
case trimmed == "name":
return p.templateHandler(alias.Name)
case trimmed == "metadata":
return p.templateHandler(alias.Metadata)
case strings.HasPrefix(trimmed, "metadata."):
split := strings.SplitN(trimmed, ".", 2)
return p.templateHandler(alias.Metadata, split[1])
}
return "", ErrTemplateValueNotFound
}
performEntityTemplating := func(trimmed string) (string, error) {
switch {
case trimmed == "id":
return p.templateHandler(p.Entity.ID)
case trimmed == "name":
return p.templateHandler(p.Entity.Name)
case trimmed == "metadata":
return p.templateHandler(p.Entity.Metadata)
case strings.HasPrefix(trimmed, "metadata."):
split := strings.SplitN(trimmed, ".", 2)
return p.templateHandler(p.Entity.Metadata, split[1])
case trimmed == "groups.names":
return p.templateHandler(p.groupNames)
case trimmed == "groups.ids":
return p.templateHandler(p.groupIDs)
case strings.HasPrefix(trimmed, "aliases."):
split := strings.SplitN(strings.TrimPrefix(trimmed, "aliases."), ".", 2)
if len(split) != 2 {
return "", errors.New("invalid alias selector")
}
var alias *logical.Alias
for _, a := range p.Entity.Aliases {
if split[0] == a.MountAccessor {
alias = a
break
}
}
if alias == nil {
if p.Mode == ACLTemplating {
return "", errors.New("alias not found")
}
// An empty alias is sufficient for generating defaults
alias = &logical.Alias{Metadata: make(map[string]string)}
}
return performAliasTemplating(split[1], alias)
}
return "", ErrTemplateValueNotFound
}
performGroupsTemplating := func(trimmed string) (string, error) {
var ids bool
selectorSplit := strings.SplitN(trimmed, ".", 2)
switch {
case len(selectorSplit) != 2:
return "", errors.New("invalid groups selector")
case selectorSplit[0] == "ids":
ids = true
case selectorSplit[0] == "names":
default:
return "", errors.New("invalid groups selector")
}
trimmed = selectorSplit[1]
accessorSplit := strings.SplitN(trimmed, ".", 2)
if len(accessorSplit) != 2 {
return "", errors.New("invalid groups accessor")
}
var found *logical.Group
for _, group := range p.Groups {
var compare string
if ids {
compare = group.ID
} else {
if p.NamespaceID != "" && group.NamespaceID != p.NamespaceID {
continue
}
compare = group.Name
}
if compare == accessorSplit[0] {
found = group
break
}
}
if found == nil {
return "", fmt.Errorf("entity is not a member of group %q", accessorSplit[0])
}
trimmed = accessorSplit[1]
switch {
case trimmed == "id":
return found.ID, nil
case trimmed == "name":
if found.Name == "" {
return "", ErrTemplateValueNotFound
}
return found.Name, nil
case strings.HasPrefix(trimmed, "metadata."):
val, ok := found.Metadata[strings.TrimPrefix(trimmed, "metadata.")]
if !ok {
return "", ErrTemplateValueNotFound
}
return val, nil
}
return "", ErrTemplateValueNotFound
}
performTimeTemplating := func(trimmed string) (string, error) {
now := p.Now
if now.IsZero() {
now = time.Now()
}
opsSplit := strings.SplitN(trimmed, ".", 3)
if opsSplit[0] != "now" {
return "", fmt.Errorf("invalid time selector %q", opsSplit[0])
}
result := now
switch len(opsSplit) {
case 1:
// return current time
case 2:
return "", errors.New("missing time operand")
case 3:
duration, err := time.ParseDuration(opsSplit[2])
if err != nil {
return "", errwrap.Wrapf("invalid duration: {{err}}", err)
}
switch opsSplit[1] {
case "plus":
result = result.Add(duration)
case "minus":
result = result.Add(-duration)
default:
return "", fmt.Errorf("invalid time operator %q", opsSplit[1])
}
}
return strconv.FormatInt(result.Unix(), 10), nil
}
switch {
case strings.HasPrefix(input, "identity.entity."):
if p.Entity == nil {
return "", ErrNoEntityAttachedToToken
}
return performEntityTemplating(strings.TrimPrefix(input, "identity.entity."))
case strings.HasPrefix(input, "identity.groups."):
if len(p.Groups) == 0 {
return "", ErrNoGroupsAttachedToToken
}
return performGroupsTemplating(strings.TrimPrefix(input, "identity.groups."))
case strings.HasPrefix(input, "time."):
return performTimeTemplating(strings.TrimPrefix(input, "time."))
}
return "", ErrTemplateValueNotFound
}

View File

@@ -31,6 +31,9 @@ type Entity struct {
Metadata map[string]string `sentinel:"" protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Disabled is true if the entity is disabled.
Disabled bool `sentinel:"" protobuf:"varint,5,opt,name=disabled,proto3" json:"disabled,omitempty"`
// NamespaceID is the identifier of the namespace to which this entity
// belongs to.
NamespaceID string `sentinel:"" protobuf:"bytes,6,opt,name=namespace_id,json=namespaceID,proto3" json:"namespace_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -96,6 +99,13 @@ func (m *Entity) GetDisabled() bool {
return false
}
func (m *Entity) GetNamespaceID() string {
if m != nil {
return m.NamespaceID
}
return ""
}
type Alias struct {
// MountType is the backend mount's type to which this identity belongs
MountType string `sentinel:"" protobuf:"bytes,1,opt,name=mount_type,json=mountType,proto3" json:"mount_type,omitempty"`
@@ -106,6 +116,11 @@ type Alias struct {
Name string `sentinel:"" protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
// Metadata represents the custom data tied to this alias
Metadata map[string]string `sentinel:"" protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// ID is the unique identifier for the alias
ID string `sentinel:"" protobuf:"bytes,5,opt,name=ID,proto3" json:"ID,omitempty"`
// NamespaceID is the identifier of the namespace to which this alias
// belongs.
NamespaceID string `sentinel:"" protobuf:"bytes,6,opt,name=namespace_id,json=namespaceID,proto3" json:"namespace_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -164,35 +179,122 @@ func (m *Alias) GetMetadata() map[string]string {
return nil
}
func (m *Alias) GetID() string {
if m != nil {
return m.ID
}
return ""
}
func (m *Alias) GetNamespaceID() string {
if m != nil {
return m.NamespaceID
}
return ""
}
type Group struct {
// ID is the unique identifier for the group
ID string `sentinel:"" protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"`
// Name is the human-friendly unique identifier for the group
Name string `sentinel:"" protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
// Metadata represents the custom data tied to this group
Metadata map[string]string `sentinel:"" protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// NamespaceID is the identifier of the namespace to which this group
// belongs to.
NamespaceID string `sentinel:"" protobuf:"bytes,4,opt,name=namespace_id,json=namespaceID,proto3" json:"namespace_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Group) Reset() { *m = Group{} }
func (m *Group) String() string { return proto.CompactTextString(m) }
func (*Group) ProtoMessage() {}
func (*Group) Descriptor() ([]byte, []int) {
return fileDescriptor_4a34d35719c603a1, []int{2}
}
func (m *Group) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Group.Unmarshal(m, b)
}
func (m *Group) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Group.Marshal(b, m, deterministic)
}
func (m *Group) XXX_Merge(src proto.Message) {
xxx_messageInfo_Group.Merge(m, src)
}
func (m *Group) XXX_Size() int {
return xxx_messageInfo_Group.Size(m)
}
func (m *Group) XXX_DiscardUnknown() {
xxx_messageInfo_Group.DiscardUnknown(m)
}
var xxx_messageInfo_Group proto.InternalMessageInfo
func (m *Group) GetID() string {
if m != nil {
return m.ID
}
return ""
}
func (m *Group) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *Group) GetMetadata() map[string]string {
if m != nil {
return m.Metadata
}
return nil
}
func (m *Group) GetNamespaceID() string {
if m != nil {
return m.NamespaceID
}
return ""
}
func init() {
proto.RegisterType((*Entity)(nil), "logical.Entity")
proto.RegisterMapType((map[string]string)(nil), "logical.Entity.MetadataEntry")
proto.RegisterType((*Alias)(nil), "logical.Alias")
proto.RegisterMapType((map[string]string)(nil), "logical.Alias.MetadataEntry")
proto.RegisterType((*Group)(nil), "logical.Group")
proto.RegisterMapType((map[string]string)(nil), "logical.Group.MetadataEntry")
}
func init() { proto.RegisterFile("sdk/logical/identity.proto", fileDescriptor_4a34d35719c603a1) }
var fileDescriptor_4a34d35719c603a1 = []byte{
// 310 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x92, 0xbf, 0x6a, 0xc3, 0x30,
0x10, 0xc6, 0x91, 0x9d, 0xbf, 0x57, 0x12, 0x8a, 0xe8, 0x60, 0x42, 0x03, 0x21, 0xd0, 0xe2, 0xc9,
0x86, 0x76, 0x49, 0xdb, 0x29, 0x25, 0x19, 0x32, 0x74, 0x31, 0x9d, 0xba, 0x94, 0x8b, 0x2d, 0x62,
0x11, 0xd9, 0x32, 0x96, 0x1c, 0xf0, 0x9b, 0xf6, 0x19, 0xfa, 0x14, 0x25, 0xb2, 0x62, 0x12, 0x4a,
0xa7, 0x6e, 0xba, 0xdf, 0x77, 0x77, 0xba, 0xfb, 0x38, 0x98, 0xa8, 0x64, 0x1f, 0x0a, 0xb9, 0xe3,
0x31, 0x8a, 0x90, 0x27, 0x2c, 0xd7, 0x5c, 0xd7, 0x41, 0x51, 0x4a, 0x2d, 0x69, 0xdf, 0xf2, 0xf9,
0x37, 0x81, 0xde, 0xda, 0x28, 0x74, 0x0c, 0xce, 0x66, 0xe5, 0x91, 0x19, 0xf1, 0x87, 0x91, 0xb3,
0x59, 0x51, 0x0a, 0x9d, 0x1c, 0x33, 0xe6, 0x39, 0x86, 0x98, 0x37, 0xf5, 0xa1, 0x8f, 0x82, 0xa3,
0x62, 0xca, 0x73, 0x67, 0xae, 0x7f, 0xf5, 0x30, 0x0e, 0x6c, 0xa7, 0x60, 0x79, 0xe4, 0xd1, 0x49,
0xa6, 0x4f, 0x30, 0xc8, 0x98, 0xc6, 0x04, 0x35, 0x7a, 0x1d, 0x93, 0x3a, 0x6d, 0x53, 0x9b, 0x0f,
0x83, 0x37, 0xab, 0xaf, 0x73, 0x5d, 0xd6, 0x51, 0x9b, 0x4e, 0x27, 0x30, 0x48, 0xb8, 0xc2, 0xad,
0x60, 0x89, 0xd7, 0x9d, 0x11, 0x7f, 0x10, 0xb5, 0xf1, 0xe4, 0x05, 0x46, 0x17, 0x65, 0xf4, 0x1a,
0xdc, 0x3d, 0xab, 0xed, 0xd8, 0xc7, 0x27, 0xbd, 0x81, 0xee, 0x01, 0x45, 0x75, 0x1a, 0xbc, 0x09,
0x9e, 0x9d, 0x05, 0x99, 0x7f, 0x11, 0xe8, 0x9a, 0x31, 0xe9, 0x14, 0x20, 0x93, 0x55, 0xae, 0x3f,
0x75, 0x5d, 0x30, 0x5b, 0x3c, 0x34, 0xe4, 0xbd, 0x2e, 0x18, 0xbd, 0x83, 0x71, 0x23, 0x63, 0x1c,
0x33, 0xa5, 0x64, 0x69, 0x7b, 0x8d, 0x0c, 0x5d, 0x5a, 0xd8, 0x3a, 0xe4, 0x9e, 0x39, 0xb4, 0xf8,
0xb5, 0xf7, 0xed, 0xa5, 0x45, 0x7f, 0xad, 0xfd, 0xaf, 0xd5, 0x5e, 0xfd, 0x8f, 0xfb, 0x1d, 0xd7,
0x69, 0xb5, 0x0d, 0x62, 0x99, 0x85, 0x29, 0xaa, 0x94, 0xc7, 0xb2, 0x2c, 0xc2, 0x03, 0x56, 0x42,
0x87, 0x67, 0x97, 0xb0, 0xed, 0x99, 0x0b, 0x78, 0xfc, 0x09, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xa9,
0x8a, 0x39, 0x1f, 0x02, 0x00, 0x00,
// 365 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x93, 0x4f, 0x6b, 0xfa, 0x30,
0x18, 0xc7, 0x69, 0x6b, 0xfd, 0xf3, 0xf8, 0x53, 0x7e, 0x84, 0x1d, 0x8a, 0x4c, 0x70, 0xc2, 0x46,
0x4f, 0x2d, 0x6c, 0x17, 0xb7, 0x9d, 0x1c, 0xca, 0xf0, 0xb0, 0x4b, 0xd9, 0x69, 0x17, 0x89, 0x4d,
0xd0, 0x60, 0xdb, 0x94, 0x26, 0x15, 0xfa, 0x1a, 0xc6, 0x5e, 0xd6, 0xde, 0xd7, 0x30, 0x8d, 0xa5,
0x3a, 0x84, 0x1d, 0xb6, 0x5b, 0xf2, 0x7d, 0x9e, 0x7e, 0x9b, 0xcf, 0x37, 0x79, 0x60, 0x20, 0xc8,
0xd6, 0x8f, 0xf8, 0x9a, 0x85, 0x38, 0xf2, 0x19, 0xa1, 0x89, 0x64, 0xb2, 0xf0, 0xd2, 0x8c, 0x4b,
0x8e, 0x5a, 0x5a, 0x1f, 0x7f, 0x98, 0xd0, 0x9c, 0xab, 0x0a, 0xea, 0x83, 0xb9, 0x98, 0x39, 0xc6,
0xc8, 0x70, 0x3b, 0x81, 0xb9, 0x98, 0x21, 0x04, 0x8d, 0x04, 0xc7, 0xd4, 0x31, 0x95, 0xa2, 0xd6,
0xc8, 0x85, 0x16, 0x8e, 0x18, 0x16, 0x54, 0x38, 0xd6, 0xc8, 0x72, 0xbb, 0xb7, 0x7d, 0x4f, 0x3b,
0x79, 0xd3, 0xbd, 0x1e, 0x1c, 0xca, 0xe8, 0x1e, 0xda, 0x31, 0x95, 0x98, 0x60, 0x89, 0x9d, 0x86,
0x6a, 0x1d, 0x56, 0xad, 0xe5, 0x0f, 0xbd, 0x17, 0x5d, 0x9f, 0x27, 0x32, 0x2b, 0x82, 0xaa, 0x1d,
0x0d, 0xa0, 0x4d, 0x98, 0xc0, 0xab, 0x88, 0x12, 0xc7, 0x1e, 0x19, 0x6e, 0x3b, 0xa8, 0xf6, 0xe8,
0x0a, 0xfe, 0xed, 0x0f, 0x22, 0x52, 0x1c, 0xd2, 0x25, 0x23, 0x4e, 0x53, 0x1d, 0xae, 0x5b, 0x69,
0x0b, 0x32, 0x78, 0x84, 0xde, 0x91, 0x33, 0xfa, 0x0f, 0xd6, 0x96, 0x16, 0x9a, 0x6c, 0xbf, 0x44,
0x17, 0x60, 0xef, 0x70, 0x94, 0x1f, 0xd8, 0xca, 0xcd, 0x83, 0x39, 0x31, 0xc6, 0xef, 0x26, 0xd8,
0x8a, 0x04, 0x0d, 0x01, 0x62, 0x9e, 0x27, 0x72, 0x29, 0x8b, 0x94, 0xea, 0x8f, 0x3b, 0x4a, 0x79,
0x2d, 0x52, 0x8a, 0xae, 0xa1, 0x5f, 0x96, 0x71, 0x18, 0x52, 0x21, 0x78, 0xa6, 0xbd, 0x7a, 0x4a,
0x9d, 0x6a, 0xb1, 0x0a, 0xd1, 0xaa, 0x85, 0x38, 0xf9, 0x16, 0xcd, 0xe5, 0x71, 0x8a, 0x67, 0x93,
0x29, 0xaf, 0xc8, 0xae, 0xae, 0xe8, 0xaf, 0xd3, 0xf8, 0x34, 0xc0, 0x7e, 0xce, 0x78, 0x9e, 0xfe,
0xe8, 0x71, 0xd4, 0xb9, 0xac, 0x13, 0x2e, 0xe5, 0x72, 0x96, 0xeb, 0x94, 0xa3, 0xf1, 0xbb, 0x1c,
0x4f, 0xee, 0xdb, 0xcd, 0x9a, 0xc9, 0x4d, 0xbe, 0xf2, 0x42, 0x1e, 0xfb, 0x1b, 0x2c, 0x36, 0x2c,
0xe4, 0x59, 0xea, 0xef, 0x70, 0x1e, 0x49, 0xbf, 0x36, 0x27, 0xab, 0xa6, 0x9a, 0x8f, 0xbb, 0xaf,
0x00, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xe2, 0x28, 0xc0, 0x3d, 0x03, 0x00, 0x00,
}

View File

@@ -19,6 +19,10 @@ message Entity {
// Disabled is true if the entity is disabled.
bool disabled = 5;
// NamespaceID is the identifier of the namespace to which this entity
// belongs to.
string namespace_id = 6;
}
message Alias {
@@ -34,4 +38,26 @@ message Alias {
// Metadata represents the custom data tied to this alias
map<string, string> metadata = 4;
// ID is the unique identifier for the alias
string ID = 5;
// NamespaceID is the identifier of the namespace to which this alias
// belongs.
string namespace_id = 6;
}
message Group {
// ID is the unique identifier for the group
string ID = 1;
// Name is the human-friendly unique identifier for the group
string name = 2;
// Metadata represents the custom data tied to this group
map<string, string> metadata = 3;
// NamespaceID is the identifier of the namespace to which this group
// belongs to.
string namespace_id = 4;
}

View File

@@ -62,6 +62,10 @@ type SystemView interface {
// for the given entity id
EntityInfo(entityID string) (*Entity, error)
// GroupsForEntity returns the group membership information for the provided
// entity id
GroupsForEntity(entityID string) ([]*Group, error)
// PluginEnv returns Vault environment information used by plugins
PluginEnv(context.Context) (*PluginEnvironment, error)
}
@@ -82,6 +86,7 @@ type StaticSystemView struct {
LocalMountVal bool
ReplicationStateVal consts.ReplicationState
EntityVal *Entity
GroupsVal []*Group
Features license.Features
VaultVersion string
PluginEnvironment *PluginEnvironment
@@ -149,6 +154,10 @@ func (d StaticSystemView) EntityInfo(entityID string) (*Entity, error) {
return d.EntityVal, nil
}
func (d StaticSystemView) GroupsForEntity(entityID string) ([]*Group, error) {
return d.GroupsVal, nil
}
func (d StaticSystemView) HasFeature(feature license.Features) bool {
return d.Features.HasFeature(feature)
}

View File

@@ -138,6 +138,20 @@ func (s *gRPCSystemViewClient) EntityInfo(entityID string) (*logical.Entity, err
return reply.Entity, nil
}
func (s *gRPCSystemViewClient) GroupsForEntity(entityID string) ([]*logical.Group, error) {
reply, err := s.client.GroupsForEntity(context.Background(), &pb.EntityInfoArgs{
EntityID: entityID,
})
if err != nil {
return nil, err
}
if reply.Err != "" {
return nil, errors.New(reply.Err)
}
return reply.Groups, nil
}
func (s *gRPCSystemViewClient) PluginEnv(ctx context.Context) (*logical.PluginEnvironment, error) {
reply, err := s.client.PluginEnv(ctx, &pb.Empty{})
if err != nil {
@@ -237,6 +251,18 @@ func (s *gRPCSystemViewServer) EntityInfo(ctx context.Context, args *pb.EntityIn
}, nil
}
func (s *gRPCSystemViewServer) GroupsForEntity(ctx context.Context, args *pb.EntityInfoArgs) (*pb.GroupsForEntityReply, error) {
groups, err := s.impl.GroupsForEntity(args.EntityID)
if err != nil {
return &pb.GroupsForEntityReply{
Err: pb.ErrToString(err),
}, nil
}
return &pb.GroupsForEntityReply{
Groups: groups,
}, nil
}
func (s *gRPCSystemViewServer) PluginEnv(ctx context.Context, _ *pb.Empty) (*pb.PluginEnvReply, error) {
pluginEnv, err := s.impl.PluginEnv(ctx)
if err != nil {

View File

@@ -2568,6 +2568,53 @@ func (m *EntityInfoReply) GetErr() string {
return ""
}
type GroupsForEntityReply struct {
Groups []*logical.Group `sentinel:"" protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"`
Err string `sentinel:"" protobuf:"bytes,2,opt,name=err,proto3" json:"err,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GroupsForEntityReply) Reset() { *m = GroupsForEntityReply{} }
func (m *GroupsForEntityReply) String() string { return proto.CompactTextString(m) }
func (*GroupsForEntityReply) ProtoMessage() {}
func (*GroupsForEntityReply) Descriptor() ([]byte, []int) {
return fileDescriptor_4dbf1dfe0c11846b, []int{42}
}
func (m *GroupsForEntityReply) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupsForEntityReply.Unmarshal(m, b)
}
func (m *GroupsForEntityReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GroupsForEntityReply.Marshal(b, m, deterministic)
}
func (m *GroupsForEntityReply) XXX_Merge(src proto.Message) {
xxx_messageInfo_GroupsForEntityReply.Merge(m, src)
}
func (m *GroupsForEntityReply) XXX_Size() int {
return xxx_messageInfo_GroupsForEntityReply.Size(m)
}
func (m *GroupsForEntityReply) XXX_DiscardUnknown() {
xxx_messageInfo_GroupsForEntityReply.DiscardUnknown(m)
}
var xxx_messageInfo_GroupsForEntityReply proto.InternalMessageInfo
func (m *GroupsForEntityReply) GetGroups() []*logical.Group {
if m != nil {
return m.Groups
}
return nil
}
func (m *GroupsForEntityReply) GetErr() string {
if m != nil {
return m.Err
}
return ""
}
type PluginEnvReply struct {
PluginEnvironment *logical.PluginEnvironment `sentinel:"" protobuf:"bytes,1,opt,name=plugin_environment,json=pluginEnvironment,proto3" json:"plugin_environment,omitempty"`
Err string `sentinel:"" protobuf:"bytes,2,opt,name=err,proto3" json:"err,omitempty"`
@@ -2580,7 +2627,7 @@ func (m *PluginEnvReply) Reset() { *m = PluginEnvReply{} }
func (m *PluginEnvReply) String() string { return proto.CompactTextString(m) }
func (*PluginEnvReply) ProtoMessage() {}
func (*PluginEnvReply) Descriptor() ([]byte, []int) {
return fileDescriptor_4dbf1dfe0c11846b, []int{42}
return fileDescriptor_4dbf1dfe0c11846b, []int{43}
}
func (m *PluginEnvReply) XXX_Unmarshal(b []byte) error {
@@ -2627,7 +2674,7 @@ func (m *Connection) Reset() { *m = Connection{} }
func (m *Connection) String() string { return proto.CompactTextString(m) }
func (*Connection) ProtoMessage() {}
func (*Connection) Descriptor() ([]byte, []int) {
return fileDescriptor_4dbf1dfe0c11846b, []int{43}
return fileDescriptor_4dbf1dfe0c11846b, []int{44}
}
func (m *Connection) XXX_Unmarshal(b []byte) error {
@@ -2703,6 +2750,7 @@ func init() {
proto.RegisterType((*LocalMountReply)(nil), "pb.LocalMountReply")
proto.RegisterType((*EntityInfoArgs)(nil), "pb.EntityInfoArgs")
proto.RegisterType((*EntityInfoReply)(nil), "pb.EntityInfoReply")
proto.RegisterType((*GroupsForEntityReply)(nil), "pb.GroupsForEntityReply")
proto.RegisterType((*PluginEnvReply)(nil), "pb.PluginEnvReply")
proto.RegisterType((*Connection)(nil), "pb.Connection")
}
@@ -2710,164 +2758,167 @@ func init() {
func init() { proto.RegisterFile("sdk/plugin/pb/backend.proto", fileDescriptor_4dbf1dfe0c11846b) }
var fileDescriptor_4dbf1dfe0c11846b = []byte{
// 2504 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x59, 0xcd, 0x72, 0x1b, 0xc7,
0x11, 0x2e, 0x00, 0xc4, 0x5f, 0xe3, 0x7f, 0x48, 0x2b, 0x2b, 0x48, 0x8e, 0xe8, 0x75, 0x24, 0xd3,
0x8c, 0x0d, 0x5a, 0x54, 0x14, 0xcb, 0x49, 0x25, 0x29, 0x9a, 0xa2, 0x65, 0xc6, 0xa4, 0xcd, 0x5a,
0x42, 0x71, 0xfe, 0xaa, 0xe0, 0xc1, 0xee, 0x10, 0xdc, 0xe2, 0x62, 0x77, 0x33, 0x3b, 0x4b, 0x11,
0xb9, 0xe4, 0x96, 0x47, 0xc8, 0x1b, 0xe4, 0x9c, 0x6b, 0x6e, 0xb9, 0xba, 0x72, 0xcf, 0x2b, 0xe4,
0x39, 0x52, 0xd3, 0x33, 0xfb, 0x07, 0x80, 0xb6, 0x5c, 0xe5, 0xdc, 0x76, 0xba, 0x7b, 0x7a, 0x66,
0x7a, 0xbe, 0xfe, 0xba, 0x07, 0x80, 0x7b, 0x91, 0x73, 0xb5, 0x17, 0x7a, 0xf1, 0xcc, 0xf5, 0xf7,
0xc2, 0xe9, 0xde, 0x94, 0xda, 0x57, 0xcc, 0x77, 0x46, 0x21, 0x0f, 0x44, 0x40, 0xca, 0xe1, 0x74,
0xf8, 0x60, 0x16, 0x04, 0x33, 0x8f, 0xed, 0xa1, 0x64, 0x1a, 0x5f, 0xec, 0x09, 0x77, 0xce, 0x22,
0x41, 0xe7, 0xa1, 0x32, 0x1a, 0x0e, 0xa5, 0x07, 0x2f, 0x98, 0xb9, 0x36, 0xf5, 0xf6, 0x5c, 0x87,
0xf9, 0xc2, 0x15, 0x0b, 0xad, 0x33, 0xf2, 0x3a, 0xb5, 0x8a, 0xd2, 0x98, 0x75, 0xa8, 0x1e, 0xcd,
0x43, 0xb1, 0x30, 0xb7, 0xa1, 0xf6, 0x29, 0xa3, 0x0e, 0xe3, 0xe4, 0x0e, 0xd4, 0x2e, 0xf1, 0xcb,
0x28, 0x6d, 0x57, 0x76, 0x9a, 0x96, 0x1e, 0x99, 0x7f, 0x00, 0x38, 0x93, 0x73, 0x8e, 0x38, 0x0f,
0x38, 0xb9, 0x0b, 0x0d, 0xc6, 0xf9, 0x44, 0x2c, 0x42, 0x66, 0x94, 0xb6, 0x4b, 0x3b, 0x1d, 0xab,
0xce, 0x38, 0x1f, 0x2f, 0x42, 0x46, 0x7e, 0x00, 0xf2, 0x73, 0x32, 0x8f, 0x66, 0x46, 0x79, 0xbb,
0x24, 0x3d, 0x30, 0xce, 0x4f, 0xa3, 0x59, 0x32, 0xc7, 0x0e, 0x1c, 0x66, 0x54, 0xb6, 0x4b, 0x3b,
0x15, 0x9c, 0x73, 0x18, 0x38, 0xcc, 0xfc, 0x5b, 0x09, 0xaa, 0x67, 0x54, 0x5c, 0x46, 0x84, 0xc0,
0x06, 0x0f, 0x02, 0xa1, 0x17, 0xc7, 0x6f, 0xb2, 0x03, 0xbd, 0xd8, 0xa7, 0xb1, 0xb8, 0x94, 0xa7,
0xb2, 0xa9, 0x60, 0x8e, 0x51, 0x46, 0xf5, 0xb2, 0x98, 0xbc, 0x0d, 0x1d, 0x2f, 0xb0, 0xa9, 0x37,
0x89, 0x44, 0xc0, 0xe9, 0x4c, 0xae, 0x23, 0xed, 0xda, 0x28, 0x3c, 0x57, 0x32, 0xb2, 0x0b, 0x83,
0x88, 0x51, 0x6f, 0xf2, 0x8a, 0xd3, 0x30, 0x35, 0xdc, 0x50, 0x0e, 0xa5, 0xe2, 0x4b, 0x4e, 0x43,
0x6d, 0x6b, 0xfe, 0xab, 0x06, 0x75, 0x8b, 0xfd, 0x29, 0x66, 0x91, 0x20, 0x5d, 0x28, 0xbb, 0x0e,
0x9e, 0xb6, 0x69, 0x95, 0x5d, 0x87, 0x8c, 0x80, 0x58, 0x2c, 0xf4, 0xe4, 0xd2, 0x6e, 0xe0, 0x1f,
0x7a, 0x71, 0x24, 0x18, 0xd7, 0x67, 0x5e, 0xa3, 0x21, 0xf7, 0xa1, 0x19, 0x84, 0x8c, 0xa3, 0x0c,
0x03, 0xd0, 0xb4, 0x32, 0x81, 0x3c, 0x78, 0x48, 0xc5, 0xa5, 0xb1, 0x81, 0x0a, 0xfc, 0x96, 0x32,
0x87, 0x0a, 0x6a, 0x54, 0x95, 0x4c, 0x7e, 0x13, 0x13, 0x6a, 0x11, 0xb3, 0x39, 0x13, 0x46, 0x6d,
0xbb, 0xb4, 0xd3, 0xda, 0x87, 0x51, 0x38, 0x1d, 0x9d, 0xa3, 0xc4, 0xd2, 0x1a, 0x72, 0x1f, 0x36,
0x64, 0x5c, 0x8c, 0x3a, 0x5a, 0x34, 0xa4, 0xc5, 0x41, 0x2c, 0x2e, 0x2d, 0x94, 0x92, 0x7d, 0xa8,
0xab, 0x3b, 0x8d, 0x8c, 0xc6, 0x76, 0x65, 0xa7, 0xb5, 0x6f, 0x48, 0x03, 0x7d, 0xca, 0x91, 0x82,
0x41, 0x74, 0xe4, 0x0b, 0xbe, 0xb0, 0x12, 0x43, 0xf2, 0x16, 0xb4, 0x6d, 0xcf, 0x65, 0xbe, 0x98,
0x88, 0xe0, 0x8a, 0xf9, 0x46, 0x13, 0x77, 0xd4, 0x52, 0xb2, 0xb1, 0x14, 0x91, 0x7d, 0x78, 0x23,
0x6f, 0x32, 0xa1, 0xb6, 0xcd, 0xa2, 0x28, 0xe0, 0x06, 0xa0, 0xed, 0x66, 0xce, 0xf6, 0x40, 0xab,
0xa4, 0x5b, 0xc7, 0x8d, 0x42, 0x8f, 0x2e, 0x26, 0x3e, 0x9d, 0x33, 0xa3, 0xa5, 0xdc, 0x6a, 0xd9,
0xe7, 0x74, 0xce, 0xc8, 0x03, 0x68, 0xcd, 0x83, 0xd8, 0x17, 0x93, 0x30, 0x70, 0x7d, 0x61, 0xb4,
0xd1, 0x02, 0x50, 0x74, 0x26, 0x25, 0xe4, 0x4d, 0x50, 0x23, 0x05, 0xc6, 0x8e, 0x8a, 0x2b, 0x4a,
0x10, 0x8e, 0x0f, 0xa1, 0xab, 0xd4, 0xe9, 0x7e, 0xba, 0x68, 0xd2, 0x41, 0x69, 0xba, 0x93, 0x0f,
0xa0, 0x89, 0x78, 0x70, 0xfd, 0x8b, 0xc0, 0xe8, 0x61, 0xdc, 0x36, 0x73, 0x61, 0x91, 0x98, 0x38,
0xf6, 0x2f, 0x02, 0xab, 0xf1, 0x4a, 0x7f, 0x91, 0x5f, 0xc0, 0xbd, 0xc2, 0x79, 0x39, 0x9b, 0x53,
0xd7, 0x77, 0xfd, 0xd9, 0x24, 0x8e, 0x58, 0x64, 0xf4, 0x11, 0xe1, 0x46, 0xee, 0xd4, 0x56, 0x62,
0xf0, 0x32, 0x62, 0x11, 0xb9, 0x07, 0x4d, 0x95, 0xa4, 0x13, 0xd7, 0x31, 0x06, 0xb8, 0xa5, 0x86,
0x12, 0x1c, 0x3b, 0xe4, 0x1d, 0xe8, 0x85, 0x81, 0xe7, 0xda, 0x8b, 0x49, 0x70, 0xcd, 0x38, 0x77,
0x1d, 0x66, 0x90, 0xed, 0xd2, 0x4e, 0xc3, 0xea, 0x2a, 0xf1, 0x17, 0x5a, 0xba, 0x2e, 0x35, 0x36,
0xd1, 0x70, 0x25, 0x35, 0x46, 0x00, 0x76, 0xe0, 0xfb, 0xcc, 0x46, 0xf8, 0x6d, 0xe1, 0x09, 0xbb,
0xf2, 0x84, 0x87, 0xa9, 0xd4, 0xca, 0x59, 0x0c, 0x3f, 0x81, 0x76, 0x1e, 0x0a, 0xa4, 0x0f, 0x95,
0x2b, 0xb6, 0xd0, 0xf0, 0x97, 0x9f, 0x64, 0x1b, 0xaa, 0xd7, 0xd4, 0x8b, 0x19, 0x42, 0x5e, 0x03,
0x51, 0x4d, 0xb1, 0x94, 0xe2, 0x67, 0xe5, 0x67, 0x25, 0xf3, 0xbf, 0x55, 0xd8, 0x90, 0xe0, 0x23,
0x4f, 0xa1, 0xe3, 0x31, 0x1a, 0xb1, 0x49, 0x10, 0xca, 0x05, 0x22, 0x74, 0xd5, 0xda, 0xef, 0xcb,
0x69, 0x27, 0x52, 0xf1, 0x85, 0x92, 0x5b, 0x6d, 0x2f, 0x37, 0x92, 0x29, 0xed, 0xfa, 0x82, 0x71,
0x9f, 0x7a, 0x13, 0x4c, 0x06, 0x95, 0x60, 0xed, 0x44, 0xf8, 0x5c, 0x26, 0xc5, 0x32, 0x8e, 0x2a,
0xab, 0x38, 0x1a, 0x42, 0x03, 0x63, 0xe7, 0xb2, 0x48, 0x27, 0x7b, 0x3a, 0x26, 0xfb, 0xd0, 0x98,
0x33, 0x41, 0x75, 0xae, 0xc9, 0x94, 0xb8, 0x93, 0xe4, 0xcc, 0xe8, 0x54, 0x2b, 0x54, 0x42, 0xa4,
0x76, 0x2b, 0x19, 0x51, 0x5b, 0xcd, 0x88, 0x21, 0x34, 0x52, 0xd0, 0xd5, 0xd5, 0x0d, 0x27, 0x63,
0x49, 0xb3, 0x21, 0xe3, 0x6e, 0xe0, 0x18, 0x0d, 0x04, 0x8a, 0x1e, 0x49, 0x92, 0xf4, 0xe3, 0xb9,
0x82, 0x50, 0x53, 0x91, 0xa4, 0x1f, 0xcf, 0x57, 0x11, 0x03, 0x4b, 0x88, 0xf9, 0x11, 0x54, 0xa9,
0xe7, 0xd2, 0x08, 0x53, 0x48, 0xde, 0xac, 0xe6, 0xfb, 0xd1, 0x81, 0x94, 0x5a, 0x4a, 0x49, 0x9e,
0x40, 0x67, 0xc6, 0x83, 0x38, 0x9c, 0xe0, 0x90, 0x45, 0x46, 0x1b, 0x4f, 0xbb, 0x6c, 0xdd, 0x46,
0xa3, 0x03, 0x65, 0x23, 0x33, 0x70, 0x1a, 0xc4, 0xbe, 0x33, 0xb1, 0x5d, 0x87, 0x47, 0x46, 0x07,
0x83, 0x07, 0x28, 0x3a, 0x94, 0x12, 0x99, 0x62, 0x2a, 0x05, 0xd2, 0x00, 0x77, 0xd1, 0xa6, 0x83,
0xd2, 0xb3, 0x24, 0xca, 0x3f, 0x86, 0x41, 0x52, 0x98, 0x32, 0xcb, 0x1e, 0x5a, 0xf6, 0x13, 0x45,
0x6a, 0xbc, 0x03, 0x7d, 0x76, 0x23, 0x29, 0xd4, 0x15, 0x93, 0x39, 0xbd, 0x99, 0x08, 0xe1, 0xe9,
0x94, 0xea, 0x26, 0xf2, 0x53, 0x7a, 0x33, 0x16, 0x9e, 0xcc, 0x7f, 0xb5, 0x3a, 0xe6, 0xff, 0x00,
0x8b, 0x51, 0x13, 0x25, 0x98, 0xff, 0xbb, 0x30, 0xf0, 0x83, 0x89, 0xc3, 0x2e, 0x68, 0xec, 0x09,
0xb5, 0xee, 0x42, 0x27, 0x53, 0xcf, 0x0f, 0x9e, 0x2b, 0x39, 0x2e, 0xbb, 0x18, 0xfe, 0x1c, 0x3a,
0x85, 0xeb, 0x5e, 0x03, 0xfa, 0xad, 0x3c, 0xe8, 0x9b, 0x79, 0xa0, 0xff, 0x7b, 0x03, 0x00, 0xef,
0x5d, 0x4d, 0x5d, 0xae, 0x16, 0x79, 0x30, 0x94, 0xd7, 0x80, 0x81, 0x72, 0xe6, 0x0b, 0x0d, 0x5c,
0x3d, 0xfa, 0x46, 0xcc, 0x26, 0xf5, 0xa2, 0x9a, 0xab, 0x17, 0xef, 0xc1, 0x86, 0xc4, 0xa7, 0x51,
0xcb, 0x68, 0x3d, 0xdb, 0x11, 0x22, 0x59, 0xa1, 0x18, 0xad, 0x56, 0x92, 0xa6, 0xbe, 0x9a, 0x34,
0x79, 0x34, 0x36, 0x8a, 0x68, 0x7c, 0x1b, 0x3a, 0x36, 0x67, 0x58, 0xbb, 0x26, 0xb2, 0x19, 0xd1,
0x68, 0x6d, 0x27, 0xc2, 0xb1, 0x3b, 0x67, 0x32, 0x7e, 0xf2, 0xe2, 0x00, 0x55, 0xf2, 0x73, 0xed,
0xbd, 0xb6, 0xd6, 0xde, 0x2b, 0x76, 0x02, 0x1e, 0xd3, 0x8c, 0x8f, 0xdf, 0xb9, 0xac, 0xe9, 0x14,
0xb2, 0xa6, 0x90, 0x1a, 0xdd, 0xa5, 0xd4, 0x58, 0xc2, 0x6f, 0x6f, 0x05, 0xbf, 0x6f, 0x41, 0x5b,
0x06, 0x20, 0x0a, 0xa9, 0xcd, 0xa4, 0x83, 0xbe, 0x0a, 0x44, 0x2a, 0x3b, 0x76, 0x30, 0xdb, 0xe3,
0xe9, 0x74, 0x71, 0x19, 0x78, 0x2c, 0x23, 0xec, 0x56, 0x2a, 0x3b, 0x76, 0xe4, 0x7e, 0x11, 0x81,
0x04, 0x11, 0x88, 0xdf, 0xc3, 0x0f, 0xa1, 0x99, 0x46, 0xfd, 0x3b, 0x81, 0xe9, 0x1f, 0x25, 0x68,
0xe7, 0x49, 0x51, 0x4e, 0x1e, 0x8f, 0x4f, 0x70, 0x72, 0xc5, 0x92, 0x9f, 0xb2, 0x9d, 0xe0, 0xcc,
0x67, 0xaf, 0xe8, 0xd4, 0x53, 0x0e, 0x1a, 0x56, 0x26, 0x90, 0x5a, 0xd7, 0xb7, 0x39, 0x9b, 0x27,
0xa8, 0xaa, 0x58, 0x99, 0x80, 0x7c, 0x04, 0xe0, 0x46, 0x51, 0xcc, 0xd4, 0xcd, 0x6d, 0x20, 0x65,
0x0c, 0x47, 0xaa, 0xc7, 0x1c, 0x25, 0x3d, 0xe6, 0x68, 0x9c, 0xf4, 0x98, 0x56, 0x13, 0xad, 0xf1,
0x4a, 0xef, 0x40, 0x4d, 0x5e, 0xd0, 0xf8, 0x04, 0x91, 0x57, 0xb1, 0xf4, 0xc8, 0xfc, 0x0b, 0xd4,
0x54, 0x17, 0xf2, 0x7f, 0x25, 0xfa, 0xbb, 0xd0, 0x50, 0xbe, 0x5d, 0x47, 0xe7, 0x4a, 0x1d, 0xc7,
0xc7, 0x8e, 0xf9, 0x75, 0x19, 0x1a, 0x16, 0x8b, 0xc2, 0xc0, 0x8f, 0x58, 0xae, 0x4b, 0x2a, 0x7d,
0x6b, 0x97, 0x54, 0x5e, 0xdb, 0x25, 0x25, 0xbd, 0x57, 0x25, 0xd7, 0x7b, 0x0d, 0xa1, 0xc1, 0x99,
0xe3, 0x72, 0x66, 0x0b, 0xdd, 0xa7, 0xa5, 0x63, 0xa9, 0x7b, 0x45, 0xb9, 0x2c, 0xef, 0x11, 0xd6,
0x90, 0xa6, 0x95, 0x8e, 0xc9, 0xe3, 0x7c, 0x73, 0xa1, 0xda, 0xb6, 0x2d, 0xd5, 0x5c, 0xa8, 0xed,
0xae, 0xe9, 0x2e, 0x9e, 0x64, 0x4d, 0x5a, 0x1d, 0xb3, 0xf9, 0x6e, 0x7e, 0xc2, 0xfa, 0x2e, 0xed,
0x7b, 0xab, 0xd9, 0x5f, 0x97, 0xa1, 0xbf, 0xbc, 0xb7, 0x35, 0x08, 0xdc, 0x82, 0xaa, 0xaa, 0x7d,
0x1a, 0xbe, 0x62, 0xa5, 0xea, 0x55, 0x96, 0x88, 0xee, 0x57, 0xcb, 0xa4, 0xf1, 0xed, 0xd0, 0x2b,
0x12, 0xca, 0xbb, 0xd0, 0x97, 0x21, 0x0a, 0x99, 0x93, 0xf5, 0x73, 0x8a, 0x01, 0x7b, 0x5a, 0x9e,
0x76, 0x74, 0xbb, 0x30, 0x48, 0x4c, 0x33, 0x6e, 0xa8, 0x15, 0x6c, 0x8f, 0x12, 0x8a, 0xb8, 0x03,
0xb5, 0x8b, 0x80, 0xcf, 0xa9, 0xd0, 0x24, 0xa8, 0x47, 0x05, 0x92, 0x43, 0xb6, 0x6d, 0x28, 0x4c,
0x26, 0x42, 0xf9, 0x66, 0x91, 0xe4, 0x93, 0xbe, 0x27, 0x90, 0x05, 0x1b, 0x56, 0x23, 0x79, 0x47,
0x98, 0xbf, 0x85, 0xde, 0x52, 0x0b, 0xb9, 0x26, 0x90, 0xd9, 0xf2, 0xe5, 0xc2, 0xf2, 0x05, 0xcf,
0x95, 0x25, 0xcf, 0xbf, 0x83, 0xc1, 0xa7, 0xd4, 0x77, 0x3c, 0xa6, 0xfd, 0x1f, 0xf0, 0x59, 0x24,
0x8b, 0xa1, 0x7e, 0xd1, 0x4c, 0x74, 0xf5, 0xe9, 0x58, 0x4d, 0x2d, 0x39, 0x76, 0xc8, 0x43, 0xa8,
0x73, 0x65, 0xad, 0x01, 0xd0, 0xca, 0xf5, 0xb8, 0x56, 0xa2, 0x33, 0xbf, 0x02, 0x52, 0x70, 0x2d,
0x1f, 0x33, 0x0b, 0xb2, 0x23, 0xd1, 0xaf, 0x40, 0xa1, 0xb3, 0xaa, 0x9d, 0xc7, 0xa4, 0x95, 0x6a,
0xc9, 0x36, 0x54, 0x18, 0xe7, 0x7a, 0x09, 0x6c, 0x32, 0xb3, 0xa7, 0xa3, 0x25, 0x55, 0x66, 0x1f,
0xba, 0xc7, 0xbe, 0x2b, 0x5c, 0xea, 0xb9, 0x7f, 0x66, 0x72, 0xe7, 0xe6, 0x13, 0xe8, 0x65, 0x12,
0xb5, 0xa0, 0x76, 0x53, 0xba, 0xdd, 0xcd, 0x4f, 0x60, 0x70, 0x1e, 0x32, 0xdb, 0xa5, 0x1e, 0xbe,
0x1e, 0xd5, 0xb4, 0x07, 0x50, 0x95, 0x77, 0x95, 0xf0, 0x4e, 0x13, 0x27, 0xa2, 0x5a, 0xc9, 0xcd,
0xaf, 0xc0, 0x50, 0xc7, 0x3b, 0xba, 0x71, 0x23, 0xc1, 0x7c, 0x9b, 0x1d, 0x5e, 0x32, 0xfb, 0xea,
0x7b, 0x0c, 0xe0, 0x35, 0xdc, 0x5d, 0xb7, 0x42, 0xb2, 0xbf, 0x96, 0x2d, 0x47, 0x93, 0x0b, 0x59,
0x82, 0x70, 0x8d, 0x86, 0x05, 0x28, 0xfa, 0x44, 0x4a, 0x24, 0x1c, 0x98, 0x9c, 0x17, 0x69, 0x5a,
0xd7, 0xa3, 0x24, 0x1e, 0x95, 0xdb, 0xe3, 0xf1, 0xcf, 0x12, 0x34, 0xcf, 0x99, 0x88, 0x43, 0x3c,
0xcb, 0x3d, 0x68, 0x4e, 0x79, 0x70, 0xc5, 0x78, 0x76, 0x94, 0x86, 0x12, 0x1c, 0x3b, 0xe4, 0x31,
0xd4, 0x0e, 0x03, 0xff, 0xc2, 0x9d, 0xe1, 0x5b, 0x5a, 0xf3, 0x4b, 0x3a, 0x77, 0xa4, 0x74, 0x8a,
0x5f, 0xb4, 0x21, 0xd9, 0x86, 0x96, 0xfe, 0x65, 0xe2, 0xe5, 0xcb, 0xe3, 0xe7, 0x49, 0x93, 0x9d,
0x13, 0x0d, 0x3f, 0x82, 0x56, 0x6e, 0xe2, 0x77, 0xaa, 0x78, 0x3f, 0x04, 0xc0, 0xd5, 0x55, 0x8c,
0xfa, 0xd9, 0xd5, 0x37, 0xd5, 0xd1, 0x1e, 0x40, 0x53, 0xf6, 0x73, 0x4a, 0x9d, 0xd4, 0xda, 0x52,
0x56, 0x6b, 0xcd, 0x87, 0x30, 0x38, 0xf6, 0xaf, 0xa9, 0xe7, 0x3a, 0x54, 0xb0, 0xcf, 0xd8, 0x02,
0x43, 0xb0, 0xb2, 0x03, 0xf3, 0x1c, 0xda, 0xfa, 0x71, 0xff, 0x5a, 0x7b, 0x6c, 0xeb, 0x3d, 0x7e,
0x73, 0x2e, 0xbe, 0x0b, 0x3d, 0xed, 0xf4, 0xc4, 0xd5, 0x99, 0x28, 0x5b, 0x15, 0xce, 0x2e, 0xdc,
0x1b, 0xed, 0x5a, 0x8f, 0xcc, 0x67, 0xd0, 0xcf, 0x99, 0xa6, 0xc7, 0xb9, 0x62, 0x8b, 0x28, 0xf9,
0xd1, 0x43, 0x7e, 0x27, 0x11, 0x28, 0x67, 0x11, 0x30, 0xa1, 0xab, 0x67, 0xbe, 0x60, 0xe2, 0x96,
0xd3, 0x7d, 0x96, 0x6e, 0xe4, 0x05, 0xd3, 0xce, 0x1f, 0x41, 0x95, 0xc9, 0x93, 0xe6, 0xcb, 0x70,
0x3e, 0x02, 0x96, 0x52, 0xaf, 0x59, 0xf0, 0x59, 0xba, 0xe0, 0x59, 0xac, 0x16, 0x7c, 0x4d, 0x5f,
0xe6, 0xdb, 0xe9, 0x36, 0xce, 0x62, 0x71, 0xdb, 0x8d, 0x3e, 0x84, 0x81, 0x36, 0x7a, 0xce, 0x3c,
0x26, 0xd8, 0x2d, 0x47, 0x7a, 0x04, 0xa4, 0x60, 0x76, 0x9b, 0xbb, 0xfb, 0xd0, 0x18, 0x8f, 0x4f,
0x52, 0x6d, 0x91, 0x62, 0xcd, 0x1d, 0x68, 0x8f, 0xa9, 0x6c, 0x25, 0x1c, 0x65, 0x61, 0x40, 0x5d,
0xa8, 0xb1, 0x4e, 0xc0, 0x64, 0x68, 0xee, 0xc3, 0xd6, 0x21, 0xb5, 0x2f, 0x5d, 0x7f, 0xf6, 0xdc,
0x8d, 0x64, 0x2f, 0xa5, 0x67, 0x0c, 0xa1, 0xe1, 0x68, 0x81, 0x9e, 0x92, 0x8e, 0xcd, 0xf7, 0xe1,
0x8d, 0xdc, 0x0f, 0x3e, 0xe7, 0x82, 0x26, 0xdb, 0xdc, 0x82, 0x6a, 0x24, 0x47, 0x38, 0xa3, 0x6a,
0xa9, 0x81, 0xf9, 0x39, 0x6c, 0xe5, 0xcb, 0xab, 0xec, 0x6c, 0xf0, 0xf0, 0x49, 0xcf, 0x51, 0xca,
0xf5, 0x1c, 0xfa, 0x28, 0xe5, 0xac, 0x5a, 0xf4, 0xa1, 0xf2, 0xeb, 0x2f, 0xc7, 0x1a, 0x83, 0xf2,
0xd3, 0xfc, 0xa3, 0x5c, 0xbe, 0xe8, 0x4f, 0x2d, 0x5f, 0x68, 0x3c, 0x4a, 0xaf, 0xd5, 0x78, 0xac,
0xc2, 0xe0, 0x7d, 0x18, 0x9c, 0x7a, 0x81, 0x7d, 0x75, 0xe4, 0xe7, 0xa2, 0x61, 0x40, 0x9d, 0xf9,
0xf9, 0x60, 0x24, 0x43, 0xf3, 0x1d, 0xe8, 0x9d, 0x04, 0x36, 0xf5, 0x4e, 0x83, 0xd8, 0x17, 0x69,
0x14, 0xf0, 0x17, 0x38, 0x6d, 0xaa, 0x06, 0xe6, 0xfb, 0xd0, 0xd5, 0x05, 0xd8, 0xbf, 0x08, 0x12,
0xc2, 0xca, 0x4a, 0x75, 0xa9, 0xd8, 0xc6, 0x9b, 0x27, 0xd0, 0xcb, 0xcc, 0x95, 0xdf, 0x77, 0xa0,
0xa6, 0xd4, 0xfa, 0x6c, 0xbd, 0xf4, 0x1d, 0xab, 0x2c, 0x2d, 0xad, 0x5e, 0x73, 0xa8, 0x39, 0x74,
0xcf, 0xf0, 0x97, 0xd0, 0x23, 0xff, 0x5a, 0x39, 0x3b, 0x06, 0xa2, 0x7e, 0x1b, 0x9d, 0x30, 0xff,
0xda, 0xe5, 0x81, 0x8f, 0xad, 0x73, 0x49, 0x37, 0x28, 0x89, 0xe3, 0x74, 0x52, 0x62, 0x61, 0x0d,
0xc2, 0x65, 0xd1, 0xda, 0x18, 0x42, 0xf6, 0x3b, 0x8b, 0xac, 0x00, 0x9c, 0xcd, 0x03, 0xc1, 0x26,
0xd4, 0x71, 0x12, 0x10, 0x83, 0x12, 0x1d, 0x38, 0x0e, 0xdf, 0xff, 0x7b, 0x05, 0xea, 0x1f, 0x2b,
0x5e, 0x25, 0xbf, 0x84, 0x4e, 0xa1, 0x18, 0x93, 0x37, 0xb0, 0x69, 0x5b, 0x2e, 0xfd, 0xc3, 0x3b,
0x2b, 0x62, 0x75, 0xae, 0x0f, 0xa0, 0x9d, 0xaf, 0x91, 0x04, 0xeb, 0x21, 0xfe, 0xea, 0x3b, 0x44,
0x4f, 0xab, 0x05, 0xf4, 0x1c, 0xb6, 0xd6, 0x55, 0x2f, 0x72, 0x3f, 0x5b, 0x61, 0xb5, 0x72, 0x0e,
0xdf, 0xbc, 0x4d, 0x9b, 0x54, 0xbd, 0xfa, 0xa1, 0xc7, 0xa8, 0x1f, 0x87, 0xf9, 0x1d, 0x64, 0x9f,
0xe4, 0x31, 0x74, 0x0a, 0xfc, 0xad, 0xce, 0xb9, 0x42, 0xe9, 0xf9, 0x29, 0x8f, 0xa0, 0x8a, 0x35,
0x83, 0x74, 0x0a, 0xc5, 0x6b, 0xd8, 0x4d, 0x87, 0x6a, 0xed, 0xa7, 0x00, 0x59, 0x6f, 0x41, 0x88,
0xf2, 0x9b, 0xef, 0x3e, 0x86, 0x9b, 0x45, 0x59, 0xd2, 0x7f, 0x6c, 0xe0, 0x4f, 0x08, 0xb9, 0xfd,
0xe2, 0x42, 0x69, 0x1d, 0xda, 0xff, 0x4f, 0x09, 0xea, 0xc9, 0xcf, 0xca, 0x8f, 0x61, 0x43, 0x32,
0x3a, 0xd9, 0xcc, 0x91, 0x62, 0x52, 0x0d, 0x86, 0x5b, 0x4b, 0x42, 0xb5, 0xc0, 0x08, 0x2a, 0x2f,
0x98, 0x50, 0x1b, 0x2a, 0x52, 0xfb, 0x70, 0xb3, 0x28, 0x4b, 0xed, 0xcf, 0xe2, 0xa2, 0xbd, 0x66,
0xe6, 0x82, 0x7d, 0xca, 0xb9, 0x1f, 0x42, 0x4d, 0x71, 0xa6, 0x8a, 0xe5, 0x0a, 0xdb, 0x2a, 0xcc,
0xac, 0xb2, 0xeb, 0xfe, 0x5f, 0x37, 0x00, 0xce, 0x17, 0x91, 0x60, 0xf3, 0xdf, 0xb8, 0xec, 0x15,
0xd9, 0x85, 0x9e, 0xfe, 0xa1, 0x04, 0xdf, 0x6f, 0x92, 0x84, 0x72, 0x31, 0xc1, 0x2e, 0x30, 0xa5,
0xde, 0x47, 0xd0, 0x3a, 0xa5, 0x37, 0xaf, 0x63, 0x57, 0xd7, 0x84, 0x9c, 0xb7, 0xc1, 0x8a, 0x52,
0x20, 0xea, 0x9f, 0x42, 0x6f, 0x89, 0x8e, 0xf3, 0xf6, 0xf8, 0x1b, 0xc7, 0x5a, 0xba, 0x7e, 0x26,
0x9f, 0x30, 0x45, 0x4a, 0xce, 0x4f, 0xd4, 0xcf, 0xa9, 0x75, 0x9c, 0xfd, 0xa2, 0xf8, 0xf8, 0xc1,
0x77, 0xa7, 0xb1, 0xcc, 0x9a, 0x09, 0x67, 0x0f, 0xef, 0xae, 0xd3, 0xa4, 0x99, 0x97, 0x27, 0xce,
0x95, 0xcc, 0x5b, 0x65, 0xd5, 0xf7, 0x00, 0x32, 0xee, 0xcc, 0xdb, 0xe3, 0xf5, 0x2e, 0xd3, 0xea,
0x53, 0x80, 0x8c, 0x11, 0x15, 0x2a, 0x8a, 0x84, 0xaa, 0xa6, 0x2d, 0xb3, 0xe6, 0x2e, 0x34, 0x53,
0x16, 0xcb, 0xaf, 0x81, 0x0e, 0x8a, 0xa4, 0xf8, 0xf1, 0xee, 0xef, 0x77, 0x66, 0xae, 0xb8, 0x8c,
0xa7, 0x23, 0x3b, 0x98, 0xef, 0x5d, 0xd2, 0xe8, 0xd2, 0xb5, 0x03, 0x1e, 0xee, 0x5d, 0x4b, 0x30,
0xec, 0x15, 0xfe, 0xb5, 0x9a, 0xd6, 0xf0, 0xf5, 0xf6, 0xe4, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff,
0x66, 0x13, 0x8f, 0x1a, 0xcd, 0x1a, 0x00, 0x00,
// 2545 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x59, 0xdb, 0x72, 0x1b, 0xc7,
0xd1, 0x2e, 0x00, 0xc4, 0xa9, 0x71, 0x1e, 0xd2, 0xfa, 0x57, 0x90, 0xfc, 0x8b, 0x5e, 0x47, 0x32,
0xcd, 0xd8, 0xa0, 0x45, 0xc5, 0xb1, 0x9c, 0x54, 0xe2, 0xa2, 0x29, 0x4a, 0x66, 0x4c, 0xda, 0xac,
0x25, 0x14, 0xe7, 0x54, 0x05, 0x0f, 0x76, 0x87, 0xe0, 0x16, 0x17, 0xbb, 0x9b, 0xd9, 0x59, 0x8a,
0xc8, 0x4d, 0xde, 0x22, 0x6f, 0x90, 0xeb, 0xdc, 0xe6, 0x2e, 0x97, 0x71, 0xe5, 0x3e, 0xaf, 0x90,
0xe7, 0x48, 0x4d, 0xcf, 0xec, 0x09, 0x00, 0x6d, 0xb9, 0xca, 0xb9, 0xdb, 0xe9, 0xee, 0xe9, 0x99,
0xe9, 0xf9, 0xfa, 0xeb, 0x1e, 0x00, 0xee, 0x45, 0xce, 0xd5, 0x5e, 0xe8, 0xc5, 0x33, 0xd7, 0xdf,
0x0b, 0xa7, 0x7b, 0x53, 0x6a, 0x5f, 0x31, 0xdf, 0x19, 0x85, 0x3c, 0x10, 0x01, 0x29, 0x87, 0xd3,
0xe1, 0x83, 0x59, 0x10, 0xcc, 0x3c, 0xb6, 0x87, 0x92, 0x69, 0x7c, 0xb1, 0x27, 0xdc, 0x39, 0x8b,
0x04, 0x9d, 0x87, 0xca, 0x68, 0x38, 0x94, 0x1e, 0xbc, 0x60, 0xe6, 0xda, 0xd4, 0xdb, 0x73, 0x1d,
0xe6, 0x0b, 0x57, 0x2c, 0xb4, 0xce, 0xc8, 0xeb, 0xd4, 0x2a, 0x4a, 0x63, 0xd6, 0xa1, 0x7a, 0x34,
0x0f, 0xc5, 0xc2, 0xdc, 0x86, 0xda, 0x67, 0x8c, 0x3a, 0x8c, 0x93, 0x3b, 0x50, 0xbb, 0xc4, 0x2f,
0xa3, 0xb4, 0x5d, 0xd9, 0x69, 0x5a, 0x7a, 0x64, 0xfe, 0x1e, 0xe0, 0x4c, 0xce, 0x39, 0xe2, 0x3c,
0xe0, 0xe4, 0x2e, 0x34, 0x18, 0xe7, 0x13, 0xb1, 0x08, 0x99, 0x51, 0xda, 0x2e, 0xed, 0x74, 0xac,
0x3a, 0xe3, 0x7c, 0xbc, 0x08, 0x19, 0xf9, 0x3f, 0x90, 0x9f, 0x93, 0x79, 0x34, 0x33, 0xca, 0xdb,
0x25, 0xe9, 0x81, 0x71, 0x7e, 0x1a, 0xcd, 0x92, 0x39, 0x76, 0xe0, 0x30, 0xa3, 0xb2, 0x5d, 0xda,
0xa9, 0xe0, 0x9c, 0xc3, 0xc0, 0x61, 0xe6, 0x5f, 0x4a, 0x50, 0x3d, 0xa3, 0xe2, 0x32, 0x22, 0x04,
0x36, 0x78, 0x10, 0x08, 0xbd, 0x38, 0x7e, 0x93, 0x1d, 0xe8, 0xc5, 0x3e, 0x8d, 0xc5, 0xa5, 0x3c,
0x95, 0x4d, 0x05, 0x73, 0x8c, 0x32, 0xaa, 0x97, 0xc5, 0xe4, 0x6d, 0xe8, 0x78, 0x81, 0x4d, 0xbd,
0x49, 0x24, 0x02, 0x4e, 0x67, 0x72, 0x1d, 0x69, 0xd7, 0x46, 0xe1, 0xb9, 0x92, 0x91, 0x5d, 0x18,
0x44, 0x8c, 0x7a, 0x93, 0x57, 0x9c, 0x86, 0xa9, 0xe1, 0x86, 0x72, 0x28, 0x15, 0x5f, 0x71, 0x1a,
0x6a, 0x5b, 0xf3, 0x1f, 0x35, 0xa8, 0x5b, 0xec, 0x8f, 0x31, 0x8b, 0x04, 0xe9, 0x42, 0xd9, 0x75,
0xf0, 0xb4, 0x4d, 0xab, 0xec, 0x3a, 0x64, 0x04, 0xc4, 0x62, 0xa1, 0x27, 0x97, 0x76, 0x03, 0xff,
0xd0, 0x8b, 0x23, 0xc1, 0xb8, 0x3e, 0xf3, 0x1a, 0x0d, 0xb9, 0x0f, 0xcd, 0x20, 0x64, 0x1c, 0x65,
0x18, 0x80, 0xa6, 0x95, 0x09, 0xe4, 0xc1, 0x43, 0x2a, 0x2e, 0x8d, 0x0d, 0x54, 0xe0, 0xb7, 0x94,
0x39, 0x54, 0x50, 0xa3, 0xaa, 0x64, 0xf2, 0x9b, 0x98, 0x50, 0x8b, 0x98, 0xcd, 0x99, 0x30, 0x6a,
0xdb, 0xa5, 0x9d, 0xd6, 0x3e, 0x8c, 0xc2, 0xe9, 0xe8, 0x1c, 0x25, 0x96, 0xd6, 0x90, 0xfb, 0xb0,
0x21, 0xe3, 0x62, 0xd4, 0xd1, 0xa2, 0x21, 0x2d, 0x0e, 0x62, 0x71, 0x69, 0xa1, 0x94, 0xec, 0x43,
0x5d, 0xdd, 0x69, 0x64, 0x34, 0xb6, 0x2b, 0x3b, 0xad, 0x7d, 0x43, 0x1a, 0xe8, 0x53, 0x8e, 0x14,
0x0c, 0xa2, 0x23, 0x5f, 0xf0, 0x85, 0x95, 0x18, 0x92, 0xb7, 0xa0, 0x6d, 0x7b, 0x2e, 0xf3, 0xc5,
0x44, 0x04, 0x57, 0xcc, 0x37, 0x9a, 0xb8, 0xa3, 0x96, 0x92, 0x8d, 0xa5, 0x88, 0xec, 0xc3, 0x1b,
0x79, 0x93, 0x09, 0xb5, 0x6d, 0x16, 0x45, 0x01, 0x37, 0x00, 0x6d, 0x37, 0x73, 0xb6, 0x07, 0x5a,
0x25, 0xdd, 0x3a, 0x6e, 0x14, 0x7a, 0x74, 0x31, 0xf1, 0xe9, 0x9c, 0x19, 0x2d, 0xe5, 0x56, 0xcb,
0xbe, 0xa0, 0x73, 0x46, 0x1e, 0x40, 0x6b, 0x1e, 0xc4, 0xbe, 0x98, 0x84, 0x81, 0xeb, 0x0b, 0xa3,
0x8d, 0x16, 0x80, 0xa2, 0x33, 0x29, 0x21, 0x6f, 0x82, 0x1a, 0x29, 0x30, 0x76, 0x54, 0x5c, 0x51,
0x82, 0x70, 0x7c, 0x08, 0x5d, 0xa5, 0x4e, 0xf7, 0xd3, 0x45, 0x93, 0x0e, 0x4a, 0xd3, 0x9d, 0x7c,
0x00, 0x4d, 0xc4, 0x83, 0xeb, 0x5f, 0x04, 0x46, 0x0f, 0xe3, 0xb6, 0x99, 0x0b, 0x8b, 0xc4, 0xc4,
0xb1, 0x7f, 0x11, 0x58, 0x8d, 0x57, 0xfa, 0x8b, 0xfc, 0x02, 0xee, 0x15, 0xce, 0xcb, 0xd9, 0x9c,
0xba, 0xbe, 0xeb, 0xcf, 0x26, 0x71, 0xc4, 0x22, 0xa3, 0x8f, 0x08, 0x37, 0x72, 0xa7, 0xb6, 0x12,
0x83, 0x97, 0x11, 0x8b, 0xc8, 0x3d, 0x68, 0xaa, 0x24, 0x9d, 0xb8, 0x8e, 0x31, 0xc0, 0x2d, 0x35,
0x94, 0xe0, 0xd8, 0x21, 0xef, 0x40, 0x2f, 0x0c, 0x3c, 0xd7, 0x5e, 0x4c, 0x82, 0x6b, 0xc6, 0xb9,
0xeb, 0x30, 0x83, 0x6c, 0x97, 0x76, 0x1a, 0x56, 0x57, 0x89, 0xbf, 0xd4, 0xd2, 0x75, 0xa9, 0xb1,
0x89, 0x86, 0x2b, 0xa9, 0x31, 0x02, 0xb0, 0x03, 0xdf, 0x67, 0x36, 0xc2, 0x6f, 0x0b, 0x4f, 0xd8,
0x95, 0x27, 0x3c, 0x4c, 0xa5, 0x56, 0xce, 0x62, 0xf8, 0x1c, 0xda, 0x79, 0x28, 0x90, 0x3e, 0x54,
0xae, 0xd8, 0x42, 0xc3, 0x5f, 0x7e, 0x92, 0x6d, 0xa8, 0x5e, 0x53, 0x2f, 0x66, 0x08, 0x79, 0x0d,
0x44, 0x35, 0xc5, 0x52, 0x8a, 0x9f, 0x95, 0x9f, 0x96, 0xcc, 0xff, 0x54, 0x61, 0x43, 0x82, 0x8f,
0x7c, 0x08, 0x1d, 0x8f, 0xd1, 0x88, 0x4d, 0x82, 0x50, 0x2e, 0x10, 0xa1, 0xab, 0xd6, 0x7e, 0x5f,
0x4e, 0x3b, 0x91, 0x8a, 0x2f, 0x95, 0xdc, 0x6a, 0x7b, 0xb9, 0x91, 0x4c, 0x69, 0xd7, 0x17, 0x8c,
0xfb, 0xd4, 0x9b, 0x60, 0x32, 0xa8, 0x04, 0x6b, 0x27, 0xc2, 0x67, 0x32, 0x29, 0x96, 0x71, 0x54,
0x59, 0xc5, 0xd1, 0x10, 0x1a, 0x18, 0x3b, 0x97, 0x45, 0x3a, 0xd9, 0xd3, 0x31, 0xd9, 0x87, 0xc6,
0x9c, 0x09, 0xaa, 0x73, 0x4d, 0xa6, 0xc4, 0x9d, 0x24, 0x67, 0x46, 0xa7, 0x5a, 0xa1, 0x12, 0x22,
0xb5, 0x5b, 0xc9, 0x88, 0xda, 0x6a, 0x46, 0x0c, 0xa1, 0x91, 0x82, 0xae, 0xae, 0x6e, 0x38, 0x19,
0x4b, 0x9a, 0x0d, 0x19, 0x77, 0x03, 0xc7, 0x68, 0x20, 0x50, 0xf4, 0x48, 0x92, 0xa4, 0x1f, 0xcf,
0x15, 0x84, 0x9a, 0x8a, 0x24, 0xfd, 0x78, 0xbe, 0x8a, 0x18, 0x58, 0x42, 0xcc, 0x8f, 0xa0, 0x4a,
0x3d, 0x97, 0x46, 0x98, 0x42, 0xf2, 0x66, 0x35, 0xdf, 0x8f, 0x0e, 0xa4, 0xd4, 0x52, 0x4a, 0xf2,
0x04, 0x3a, 0x33, 0x1e, 0xc4, 0xe1, 0x04, 0x87, 0x2c, 0x32, 0xda, 0x78, 0xda, 0x65, 0xeb, 0x36,
0x1a, 0x1d, 0x28, 0x1b, 0x99, 0x81, 0xd3, 0x20, 0xf6, 0x9d, 0x89, 0xed, 0x3a, 0x3c, 0x32, 0x3a,
0x18, 0x3c, 0x40, 0xd1, 0xa1, 0x94, 0xc8, 0x14, 0x53, 0x29, 0x90, 0x06, 0xb8, 0x8b, 0x36, 0x1d,
0x94, 0x9e, 0x25, 0x51, 0xfe, 0x31, 0x0c, 0x92, 0xc2, 0x94, 0x59, 0xf6, 0xd0, 0xb2, 0x9f, 0x28,
0x52, 0xe3, 0x1d, 0xe8, 0xb3, 0x1b, 0x49, 0xa1, 0xae, 0x98, 0xcc, 0xe9, 0xcd, 0x44, 0x08, 0x4f,
0xa7, 0x54, 0x37, 0x91, 0x9f, 0xd2, 0x9b, 0xb1, 0xf0, 0x64, 0xfe, 0xab, 0xd5, 0x31, 0xff, 0x07,
0x58, 0x8c, 0x9a, 0x28, 0xc1, 0xfc, 0xdf, 0x85, 0x81, 0x1f, 0x4c, 0x1c, 0x76, 0x41, 0x63, 0x4f,
0xa8, 0x75, 0x17, 0x3a, 0x99, 0x7a, 0x7e, 0xf0, 0x4c, 0xc9, 0x71, 0xd9, 0xc5, 0xf0, 0xe7, 0xd0,
0x29, 0x5c, 0xf7, 0x1a, 0xd0, 0x6f, 0xe5, 0x41, 0xdf, 0xcc, 0x03, 0xfd, 0x5f, 0x1b, 0x00, 0x78,
0xef, 0x6a, 0xea, 0x72, 0xb5, 0xc8, 0x83, 0xa1, 0xbc, 0x06, 0x0c, 0x94, 0x33, 0x5f, 0x68, 0xe0,
0xea, 0xd1, 0xb7, 0x62, 0x36, 0xa9, 0x17, 0xd5, 0x5c, 0xbd, 0x78, 0x0f, 0x36, 0x24, 0x3e, 0x8d,
0x5a, 0x46, 0xeb, 0xd9, 0x8e, 0x10, 0xc9, 0x0a, 0xc5, 0x68, 0xb5, 0x92, 0x34, 0xf5, 0xd5, 0xa4,
0xc9, 0xa3, 0xb1, 0x51, 0x44, 0xe3, 0xdb, 0xd0, 0xb1, 0x39, 0xc3, 0xda, 0x35, 0x91, 0xcd, 0x88,
0x46, 0x6b, 0x3b, 0x11, 0x8e, 0xdd, 0x39, 0x93, 0xf1, 0x93, 0x17, 0x07, 0xa8, 0x92, 0x9f, 0x6b,
0xef, 0xb5, 0xb5, 0xf6, 0x5e, 0xb1, 0x13, 0xf0, 0x98, 0x66, 0x7c, 0xfc, 0xce, 0x65, 0x4d, 0xa7,
0x90, 0x35, 0x85, 0xd4, 0xe8, 0x2e, 0xa5, 0xc6, 0x12, 0x7e, 0x7b, 0x2b, 0xf8, 0x7d, 0x0b, 0xda,
0x32, 0x00, 0x51, 0x48, 0x6d, 0x26, 0x1d, 0xf4, 0x55, 0x20, 0x52, 0xd9, 0xb1, 0x83, 0xd9, 0x1e,
0x4f, 0xa7, 0x8b, 0xcb, 0xc0, 0x63, 0x19, 0x61, 0xb7, 0x52, 0xd9, 0xb1, 0x23, 0xf7, 0x8b, 0x08,
0x24, 0x88, 0x40, 0xfc, 0x1e, 0x7e, 0x04, 0xcd, 0x34, 0xea, 0xdf, 0x0b, 0x4c, 0x7f, 0x2b, 0x41,
0x3b, 0x4f, 0x8a, 0x72, 0xf2, 0x78, 0x7c, 0x82, 0x93, 0x2b, 0x96, 0xfc, 0x94, 0xed, 0x04, 0x67,
0x3e, 0x7b, 0x45, 0xa7, 0x9e, 0x72, 0xd0, 0xb0, 0x32, 0x81, 0xd4, 0xba, 0xbe, 0xcd, 0xd9, 0x3c,
0x41, 0x55, 0xc5, 0xca, 0x04, 0xe4, 0x63, 0x00, 0x37, 0x8a, 0x62, 0xa6, 0x6e, 0x6e, 0x03, 0x29,
0x63, 0x38, 0x52, 0x3d, 0xe6, 0x28, 0xe9, 0x31, 0x47, 0xe3, 0xa4, 0xc7, 0xb4, 0x9a, 0x68, 0x8d,
0x57, 0x7a, 0x07, 0x6a, 0xf2, 0x82, 0xc6, 0x27, 0x88, 0xbc, 0x8a, 0xa5, 0x47, 0xe6, 0x9f, 0xa1,
0xa6, 0xba, 0x90, 0xff, 0x29, 0xd1, 0xdf, 0x85, 0x86, 0xf2, 0xed, 0x3a, 0x3a, 0x57, 0xea, 0x38,
0x3e, 0x76, 0xcc, 0x6f, 0xca, 0xd0, 0xb0, 0x58, 0x14, 0x06, 0x7e, 0xc4, 0x72, 0x5d, 0x52, 0xe9,
0x3b, 0xbb, 0xa4, 0xf2, 0xda, 0x2e, 0x29, 0xe9, 0xbd, 0x2a, 0xb9, 0xde, 0x6b, 0x08, 0x0d, 0xce,
0x1c, 0x97, 0x33, 0x5b, 0xe8, 0x3e, 0x2d, 0x1d, 0x4b, 0xdd, 0x2b, 0xca, 0x65, 0x79, 0x8f, 0xb0,
0x86, 0x34, 0xad, 0x74, 0x4c, 0x1e, 0xe7, 0x9b, 0x0b, 0xd5, 0xb6, 0x6d, 0xa9, 0xe6, 0x42, 0x6d,
0x77, 0x4d, 0x77, 0xf1, 0x24, 0x6b, 0xd2, 0xea, 0x98, 0xcd, 0x77, 0xf3, 0x13, 0xd6, 0x77, 0x69,
0x3f, 0x58, 0xcd, 0xfe, 0xa6, 0x0c, 0xfd, 0xe5, 0xbd, 0xad, 0x41, 0xe0, 0x16, 0x54, 0x55, 0xed,
0xd3, 0xf0, 0x15, 0x2b, 0x55, 0xaf, 0xb2, 0x44, 0x74, 0x9f, 0x2c, 0x93, 0xc6, 0x77, 0x43, 0xaf,
0x48, 0x28, 0xef, 0x42, 0x5f, 0x86, 0x28, 0x64, 0x4e, 0xd6, 0xcf, 0x29, 0x06, 0xec, 0x69, 0x79,
0xda, 0xd1, 0xed, 0xc2, 0x20, 0x31, 0xcd, 0xb8, 0xa1, 0x56, 0xb0, 0x3d, 0x4a, 0x28, 0xe2, 0x0e,
0xd4, 0x2e, 0x02, 0x3e, 0xa7, 0x42, 0x93, 0xa0, 0x1e, 0x15, 0x48, 0x0e, 0xd9, 0xb6, 0xa1, 0x30,
0x99, 0x08, 0xe5, 0x9b, 0x45, 0x92, 0x4f, 0xfa, 0x9e, 0x40, 0x16, 0x6c, 0x58, 0x8d, 0xe4, 0x1d,
0x61, 0xfe, 0x06, 0x7a, 0x4b, 0x2d, 0xe4, 0x9a, 0x40, 0x66, 0xcb, 0x97, 0x0b, 0xcb, 0x17, 0x3c,
0x57, 0x96, 0x3c, 0xff, 0x16, 0x06, 0x9f, 0x51, 0xdf, 0xf1, 0x98, 0xf6, 0x7f, 0xc0, 0x67, 0x91,
0x2c, 0x86, 0xfa, 0x45, 0x33, 0xd1, 0xd5, 0xa7, 0x63, 0x35, 0xb5, 0xe4, 0xd8, 0x21, 0x0f, 0xa1,
0xce, 0x95, 0xb5, 0x06, 0x40, 0x2b, 0xd7, 0xe3, 0x5a, 0x89, 0xce, 0xfc, 0x1a, 0x48, 0xc1, 0xb5,
0x7c, 0xcc, 0x2c, 0xc8, 0x8e, 0x44, 0xbf, 0x02, 0x85, 0xce, 0xaa, 0x76, 0x1e, 0x93, 0x56, 0xaa,
0x25, 0xdb, 0x50, 0x61, 0x9c, 0xeb, 0x25, 0xb0, 0xc9, 0xcc, 0x9e, 0x8e, 0x96, 0x54, 0x99, 0x7d,
0xe8, 0x1e, 0xfb, 0xae, 0x70, 0xa9, 0xe7, 0xfe, 0x89, 0xc9, 0x9d, 0x9b, 0x4f, 0xa0, 0x97, 0x49,
0xd4, 0x82, 0xda, 0x4d, 0xe9, 0x76, 0x37, 0x3f, 0x81, 0xc1, 0x79, 0xc8, 0x6c, 0x97, 0x7a, 0xf8,
0x7a, 0x54, 0xd3, 0x1e, 0x40, 0x55, 0xde, 0x55, 0xc2, 0x3b, 0x4d, 0x9c, 0x88, 0x6a, 0x25, 0x37,
0xbf, 0x06, 0x43, 0x1d, 0xef, 0xe8, 0xc6, 0x8d, 0x04, 0xf3, 0x6d, 0x76, 0x78, 0xc9, 0xec, 0xab,
0x1f, 0x30, 0x80, 0xd7, 0x70, 0x77, 0xdd, 0x0a, 0xc9, 0xfe, 0x5a, 0xb6, 0x1c, 0x4d, 0x2e, 0x64,
0x09, 0xc2, 0x35, 0x1a, 0x16, 0xa0, 0xe8, 0xb9, 0x94, 0x48, 0x38, 0x30, 0x39, 0x2f, 0xd2, 0xb4,
0xae, 0x47, 0x49, 0x3c, 0x2a, 0xb7, 0xc7, 0xe3, 0xef, 0x25, 0x68, 0x9e, 0x33, 0x11, 0x87, 0x78,
0x96, 0x7b, 0xd0, 0x9c, 0xf2, 0xe0, 0x8a, 0xf1, 0xec, 0x28, 0x0d, 0x25, 0x38, 0x76, 0xc8, 0x63,
0xa8, 0x1d, 0x06, 0xfe, 0x85, 0x3b, 0xc3, 0xb7, 0xb4, 0xe6, 0x97, 0x74, 0xee, 0x48, 0xe9, 0x14,
0xbf, 0x68, 0x43, 0xb2, 0x0d, 0x2d, 0xfd, 0xcb, 0xc4, 0xcb, 0x97, 0xc7, 0xcf, 0x92, 0x26, 0x3b,
0x27, 0x1a, 0x7e, 0x0c, 0xad, 0xdc, 0xc4, 0xef, 0x55, 0xf1, 0xfe, 0x1f, 0x00, 0x57, 0x57, 0x31,
0xea, 0x67, 0x57, 0xdf, 0x54, 0x47, 0x7b, 0x00, 0x4d, 0xd9, 0xcf, 0x29, 0x75, 0x52, 0x6b, 0x4b,
0x59, 0xad, 0x35, 0x1f, 0xc2, 0xe0, 0xd8, 0xbf, 0xa6, 0x9e, 0xeb, 0x50, 0xc1, 0x3e, 0x67, 0x0b,
0x0c, 0xc1, 0xca, 0x0e, 0xcc, 0x73, 0x68, 0xeb, 0xc7, 0xfd, 0x6b, 0xed, 0xb1, 0xad, 0xf7, 0xf8,
0xed, 0xb9, 0xf8, 0x2e, 0xf4, 0xb4, 0xd3, 0x13, 0x57, 0x67, 0xa2, 0x6c, 0x55, 0x38, 0xbb, 0x70,
0x6f, 0xb4, 0x6b, 0x3d, 0x32, 0x9f, 0x42, 0x3f, 0x67, 0x9a, 0x1e, 0xe7, 0x8a, 0x2d, 0xa2, 0xe4,
0x47, 0x0f, 0xf9, 0x9d, 0x44, 0xa0, 0x9c, 0x45, 0xc0, 0x84, 0xae, 0x9e, 0xf9, 0x82, 0x89, 0x5b,
0x4e, 0xf7, 0x79, 0xba, 0x91, 0x17, 0x4c, 0x3b, 0x7f, 0x04, 0x55, 0x26, 0x4f, 0x9a, 0x2f, 0xc3,
0xf9, 0x08, 0x58, 0x4a, 0xbd, 0x66, 0xc1, 0xa7, 0xe9, 0x82, 0x67, 0xb1, 0x5a, 0xf0, 0x35, 0x7d,
0x99, 0x6f, 0xa7, 0xdb, 0x38, 0x8b, 0xc5, 0x6d, 0x37, 0xfa, 0x10, 0x06, 0xda, 0xe8, 0x19, 0xf3,
0x98, 0x60, 0xb7, 0x1c, 0xe9, 0x11, 0x90, 0x82, 0xd9, 0x6d, 0xee, 0xee, 0x43, 0x63, 0x3c, 0x3e,
0x49, 0xb5, 0x45, 0x8a, 0x35, 0x77, 0xa0, 0x3d, 0xa6, 0xb2, 0x95, 0x70, 0x94, 0x85, 0x01, 0x75,
0xa1, 0xc6, 0x3a, 0x01, 0x93, 0xa1, 0xb9, 0x0f, 0x5b, 0x87, 0xd4, 0xbe, 0x74, 0xfd, 0xd9, 0x33,
0x37, 0x92, 0xbd, 0x94, 0x9e, 0x31, 0x84, 0x86, 0xa3, 0x05, 0x7a, 0x4a, 0x3a, 0x36, 0xdf, 0x87,
0x37, 0x72, 0x3f, 0xf8, 0x9c, 0x0b, 0x9a, 0x6c, 0x73, 0x0b, 0xaa, 0x91, 0x1c, 0xe1, 0x8c, 0xaa,
0xa5, 0x06, 0xe6, 0x17, 0xb0, 0x95, 0x2f, 0xaf, 0xb2, 0xb3, 0xc1, 0xc3, 0x27, 0x3d, 0x47, 0x29,
0xd7, 0x73, 0xe8, 0xa3, 0x94, 0xb3, 0x6a, 0xd1, 0x87, 0xca, 0xaf, 0xbe, 0x1a, 0x6b, 0x0c, 0xca,
0x4f, 0xf3, 0x0f, 0x72, 0xf9, 0xa2, 0x3f, 0xb5, 0x7c, 0xa1, 0xf1, 0x28, 0xbd, 0x56, 0xe3, 0xb1,
0x0a, 0x83, 0xf7, 0x61, 0x70, 0xea, 0x05, 0xf6, 0xd5, 0x91, 0x9f, 0x8b, 0x86, 0x01, 0x75, 0xe6,
0xe7, 0x83, 0x91, 0x0c, 0xcd, 0x77, 0xa0, 0x77, 0x12, 0xd8, 0xd4, 0x3b, 0x0d, 0x62, 0x5f, 0xa4,
0x51, 0xc0, 0x5f, 0xe0, 0xb4, 0xa9, 0x1a, 0x98, 0xef, 0x43, 0x57, 0x17, 0x60, 0xff, 0x22, 0x48,
0x08, 0x2b, 0x2b, 0xd5, 0xa5, 0x62, 0x1b, 0x6f, 0x9e, 0x40, 0x2f, 0x33, 0x57, 0x7e, 0xdf, 0x81,
0x9a, 0x52, 0xeb, 0xb3, 0xf5, 0xd2, 0x77, 0xac, 0xb2, 0xb4, 0xb4, 0x7a, 0xcd, 0xa1, 0xce, 0x60,
0xeb, 0x85, 0x7c, 0xe4, 0x46, 0xcf, 0x03, 0xae, 0x8d, 0x75, 0xb6, 0xd4, 0xf0, 0xf1, 0xab, 0x92,
0x31, 0xff, 0x34, 0x46, 0x73, 0x4b, 0x6b, 0xd7, 0x78, 0x9c, 0x43, 0xf7, 0x0c, 0x7f, 0x5b, 0x3d,
0xf2, 0xaf, 0x95, 0xaf, 0x63, 0x20, 0xea, 0xd7, 0xd6, 0x09, 0xf3, 0xaf, 0x5d, 0x1e, 0xf8, 0xd8,
0x8c, 0x97, 0x74, 0xcb, 0x93, 0xf8, 0x4d, 0x27, 0x25, 0x16, 0xd6, 0x20, 0x5c, 0x16, 0xad, 0xbd,
0x15, 0xc8, 0x7e, 0xb9, 0x91, 0x35, 0x85, 0xb3, 0x79, 0x20, 0xd8, 0x84, 0x3a, 0x4e, 0x92, 0x16,
0xa0, 0x44, 0x07, 0x8e, 0xc3, 0xf7, 0xff, 0x5a, 0x81, 0xfa, 0xa7, 0x8a, 0xa9, 0xc9, 0x2f, 0xa1,
0x53, 0x28, 0xef, 0xe4, 0x0d, 0x6c, 0x03, 0x97, 0x9b, 0x89, 0xe1, 0x9d, 0x15, 0xb1, 0x3a, 0xd7,
0x07, 0xd0, 0xce, 0x57, 0x5d, 0x82, 0x15, 0x16, 0x7f, 0x47, 0x1e, 0xa2, 0xa7, 0xd5, 0x92, 0x7c,
0x0e, 0x5b, 0xeb, 0xea, 0x21, 0xb9, 0x9f, 0xad, 0xb0, 0x5a, 0x8b, 0x87, 0x6f, 0xde, 0xa6, 0x4d,
0xea, 0x68, 0xfd, 0xd0, 0x63, 0xd4, 0x8f, 0xc3, 0xfc, 0x0e, 0xb2, 0x4f, 0xf2, 0x18, 0x3a, 0x85,
0x8a, 0xa0, 0xce, 0xb9, 0x52, 0x24, 0xf2, 0x53, 0x1e, 0x41, 0x15, 0xab, 0x10, 0xe9, 0x14, 0xca,
0xe1, 0xb0, 0x9b, 0x0e, 0xd5, 0xda, 0x1f, 0x02, 0x64, 0xdd, 0x0a, 0x21, 0xca, 0x6f, 0xbe, 0x9f,
0x19, 0x6e, 0x16, 0x65, 0x49, 0x47, 0xb3, 0x81, 0x3f, 0x4a, 0xe4, 0xf6, 0x8b, 0x0b, 0xa5, 0x95,
0x6d, 0xff, 0xdf, 0x25, 0xa8, 0x27, 0x3f, 0x54, 0x3f, 0x86, 0x0d, 0x59, 0x23, 0xc8, 0x66, 0x8e,
0x66, 0x93, 0xfa, 0x32, 0xdc, 0x5a, 0x12, 0xaa, 0x05, 0x46, 0x50, 0x79, 0xc1, 0x84, 0xda, 0x50,
0xb1, 0x58, 0x0c, 0x37, 0x8b, 0xb2, 0xd4, 0xfe, 0x2c, 0x2e, 0xda, 0x6b, 0xae, 0x2f, 0xd8, 0xa7,
0x2c, 0xfe, 0x11, 0xd4, 0x14, 0x0b, 0xab, 0x58, 0xae, 0xf0, 0xb7, 0xc2, 0xcc, 0x2a, 0x5f, 0xef,
0xff, 0x73, 0x03, 0xe0, 0x7c, 0x11, 0x09, 0x36, 0xff, 0xb5, 0xcb, 0x5e, 0x91, 0x5d, 0xe8, 0xe9,
0x9f, 0x5e, 0xf0, 0x45, 0x28, 0x69, 0x2d, 0x17, 0x13, 0xec, 0x2b, 0x53, 0x32, 0x7f, 0x04, 0xad,
0x53, 0x7a, 0xf3, 0x3a, 0x76, 0x75, 0x4d, 0xf1, 0x79, 0x1b, 0xac, 0x51, 0x05, 0xea, 0xff, 0x29,
0xf4, 0x96, 0x08, 0x3e, 0x6f, 0x8f, 0xbf, 0x9a, 0xac, 0x2d, 0x00, 0x4f, 0xe5, 0xa3, 0xa8, 0x48,
0xf2, 0xf9, 0x89, 0xfa, 0x81, 0xb6, 0xae, 0x0a, 0xbc, 0x28, 0x3e, 0xa7, 0xf0, 0x25, 0x6b, 0x2c,
0xf3, 0x70, 0x52, 0x05, 0x86, 0x77, 0xd7, 0x69, 0xd2, 0xcc, 0xcb, 0x53, 0xf1, 0x4a, 0xe6, 0xad,
0xf2, 0xf4, 0x7b, 0x00, 0x19, 0x1b, 0xe7, 0xed, 0xf1, 0x7a, 0x97, 0x89, 0xfa, 0x43, 0x80, 0x8c,
0x63, 0x15, 0x2a, 0x8a, 0x14, 0xad, 0xa6, 0x2d, 0xf3, 0xf0, 0x2e, 0x34, 0x53, 0x16, 0xcb, 0xaf,
0x81, 0x0e, 0x96, 0x48, 0xf1, 0x13, 0xe8, 0x2d, 0x11, 0xef, 0xda, 0x75, 0x30, 0x3c, 0xeb, 0x18,
0xfa, 0xd3, 0xdd, 0xdf, 0xed, 0xcc, 0x5c, 0x71, 0x19, 0x4f, 0x47, 0x76, 0x30, 0xdf, 0xbb, 0xa4,
0xd1, 0xa5, 0x6b, 0x07, 0x3c, 0xdc, 0xbb, 0x96, 0x68, 0xda, 0x2b, 0xfc, 0x91, 0x36, 0xad, 0xe1,
0x83, 0xf2, 0xc9, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x9a, 0xc2, 0x92, 0x60, 0x1b, 0x00,
0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -3473,6 +3524,9 @@ type SystemViewClient interface {
EntityInfo(ctx context.Context, in *EntityInfoArgs, opts ...grpc.CallOption) (*EntityInfoReply, error)
// PluginEnv returns Vault environment information used by plugins
PluginEnv(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*PluginEnvReply, error)
// GroupsForEntity returns the group membersship information for the given
// entity id
GroupsForEntity(ctx context.Context, in *EntityInfoArgs, opts ...grpc.CallOption) (*GroupsForEntityReply, error)
}
type systemViewClient struct {
@@ -3573,6 +3627,15 @@ func (c *systemViewClient) PluginEnv(ctx context.Context, in *Empty, opts ...grp
return out, nil
}
func (c *systemViewClient) GroupsForEntity(ctx context.Context, in *EntityInfoArgs, opts ...grpc.CallOption) (*GroupsForEntityReply, error) {
out := new(GroupsForEntityReply)
err := c.cc.Invoke(ctx, "/pb.SystemView/GroupsForEntity", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// SystemViewServer is the server API for SystemView service.
type SystemViewServer interface {
// DefaultLeaseTTL returns the default lease TTL set in Vault configuration
@@ -3608,6 +3671,9 @@ type SystemViewServer interface {
EntityInfo(context.Context, *EntityInfoArgs) (*EntityInfoReply, error)
// PluginEnv returns Vault environment information used by plugins
PluginEnv(context.Context, *Empty) (*PluginEnvReply, error)
// GroupsForEntity returns the group membersship information for the given
// entity id
GroupsForEntity(context.Context, *EntityInfoArgs) (*GroupsForEntityReply, error)
}
// UnimplementedSystemViewServer can be embedded to have forward compatible implementations.
@@ -3644,6 +3710,9 @@ func (*UnimplementedSystemViewServer) EntityInfo(ctx context.Context, req *Entit
func (*UnimplementedSystemViewServer) PluginEnv(ctx context.Context, req *Empty) (*PluginEnvReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method PluginEnv not implemented")
}
func (*UnimplementedSystemViewServer) GroupsForEntity(ctx context.Context, req *EntityInfoArgs) (*GroupsForEntityReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method GroupsForEntity not implemented")
}
func RegisterSystemViewServer(s *grpc.Server, srv SystemViewServer) {
s.RegisterService(&_SystemView_serviceDesc, srv)
@@ -3829,6 +3898,24 @@ func _SystemView_PluginEnv_Handler(srv interface{}, ctx context.Context, dec fun
return interceptor(ctx, in, info, handler)
}
func _SystemView_GroupsForEntity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(EntityInfoArgs)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(SystemViewServer).GroupsForEntity(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/pb.SystemView/GroupsForEntity",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(SystemViewServer).GroupsForEntity(ctx, req.(*EntityInfoArgs))
}
return interceptor(ctx, in, info, handler)
}
var _SystemView_serviceDesc = grpc.ServiceDesc{
ServiceName: "pb.SystemView",
HandlerType: (*SystemViewServer)(nil),
@@ -3873,6 +3960,10 @@ var _SystemView_serviceDesc = grpc.ServiceDesc{
MethodName: "PluginEnv",
Handler: _SystemView_PluginEnv_Handler,
},
{
MethodName: "GroupsForEntity",
Handler: _SystemView_GroupsForEntity_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "sdk/plugin/pb/backend.proto",

View File

@@ -544,6 +544,11 @@ message EntityInfoReply {
string err = 2;
}
message GroupsForEntityReply {
repeated logical.Group groups = 1;
string err = 2;
}
message PluginEnvReply {
logical.PluginEnvironment plugin_environment = 1;
string err = 2;
@@ -594,6 +599,10 @@ service SystemView {
// PluginEnv returns Vault environment information used by plugins
rpc PluginEnv(Empty) returns (PluginEnvReply);
// GroupsForEntity returns the group membersship information for the given
// entity id
rpc GroupsForEntity(EntityInfoArgs) returns (GroupsForEntityReply);
}
message Connection {

1
vendor/modules.txt vendored
View File

@@ -457,6 +457,7 @@ github.com/hashicorp/vault/sdk/helper/dbtxn
github.com/hashicorp/vault/sdk/helper/entropy
github.com/hashicorp/vault/sdk/helper/errutil
github.com/hashicorp/vault/sdk/helper/hclutil
github.com/hashicorp/vault/sdk/helper/identitytpl
github.com/hashicorp/vault/sdk/helper/jsonutil
github.com/hashicorp/vault/sdk/helper/kdf
github.com/hashicorp/vault/sdk/helper/keysutil