diff --git a/accounts/pkg/command/rebuild_index.go b/accounts/pkg/command/rebuild_index.go new file mode 100644 index 0000000000..d789f0a860 --- /dev/null +++ b/accounts/pkg/command/rebuild_index.go @@ -0,0 +1,34 @@ +package command + +import ( + "context" + "fmt" + + "github.com/micro/cli/v2" + "github.com/micro/go-micro/v2/client/grpc" + merrors "github.com/micro/go-micro/v2/errors" + "github.com/owncloud/ocis/accounts/pkg/config" + index "github.com/owncloud/ocis/accounts/pkg/proto/v0" +) + +// RebuildIndex rebuilds the entire configured index. +func RebuildIndex(cdf *config.Config) *cli.Command { + return &cli.Command{ + Name: "rebuildIndex", + Usage: "Rebuilds the service's index, i.e. deleting and then re-adding all existing documents", + Aliases: []string{"rebuild", "ri"}, + Action: func(ctx *cli.Context) error { + idxSvcID := "com.owncloud.api.accounts" + idxSvc := index.NewIndexService(idxSvcID, grpc.NewClient()) + + _, err := idxSvc.RebuildIndex(context.Background(), &index.RebuildIndexRequest{}) + if err != nil { + fmt.Println(merrors.FromError(err).Detail) + return err + } + + fmt.Println("index rebuilt successfully") + return nil + }, + } +} diff --git a/accounts/pkg/command/root.go b/accounts/pkg/command/root.go index ad7776bcaa..63f9803889 100644 --- a/accounts/pkg/command/root.go +++ b/accounts/pkg/command/root.go @@ -49,6 +49,7 @@ func Execute() error { InspectAccount(cfg), RemoveAccount(cfg), PrintVersion(cfg), + RebuildIndex(cfg), }, } diff --git a/accounts/pkg/indexer/index/cs3/autoincrement.go b/accounts/pkg/indexer/index/cs3/autoincrement.go index 010499a4f8..feb787357a 100644 --- a/accounts/pkg/indexer/index/cs3/autoincrement.go +++ b/accounts/pkg/indexer/index/cs3/autoincrement.go @@ -99,12 +99,10 @@ func (idx *Autoincrement) Init() error { idx.storageProvider = client - ctx := context.Background() - tk, err := idx.authenticate(ctx) + ctx, err := idx.getAuthenticatedContext(context.Background()) if err != nil { return err } - ctx = metadata.AppendToOutgoingContext(ctx, token.TokenHeader, tk) if err := idx.makeDirIfNotExists(ctx, idx.indexBaseDir); err != nil { return err @@ -170,14 +168,12 @@ func (idx *Autoincrement) Remove(id string, v string) error { return err } - ctx := context.Background() - t, err := idx.authenticate(ctx) + ctx, err := idx.getAuthenticatedContext(context.Background()) if err != nil { return err } deletePath := path.Join("/meta", idx.indexRootDir, v) - ctx = metadata.AppendToOutgoingContext(ctx, token.TokenHeader, t) resp, err := idx.storageProvider.Delete(ctx, &provider.DeleteRequest{ Ref: &provider.Reference{ Spec: &provider.Reference_Path{Path: deletePath}, @@ -211,13 +207,11 @@ func (idx *Autoincrement) Update(id, oldV, newV string) error { // Search allows for glob search on the index. func (idx *Autoincrement) Search(pattern string) ([]string, error) { - ctx := context.Background() - t, err := idx.authenticate(ctx) + ctx, err := idx.getAuthenticatedContext(context.Background()) if err != nil { return nil, err } - ctx = metadata.AppendToOutgoingContext(ctx, token.TokenHeader, t) res, err := idx.storageProvider.ListContainer(ctx, &provider.ListContainerRequest{ Ref: &provider.Reference{ Spec: &provider.Reference_Path{Path: path.Join("/meta", idx.indexRootDir)}, @@ -326,13 +320,11 @@ func (idx *Autoincrement) authenticate(ctx context.Context) (token string, err e } func (idx *Autoincrement) next() (int, error) { - ctx := context.Background() - t, err := idx.authenticate(ctx) + ctx, err := idx.getAuthenticatedContext(context.Background()) if err != nil { return -1, err } - ctx = metadata.AppendToOutgoingContext(ctx, token.TokenHeader, t) res, err := idx.storageProvider.ListContainer(ctx, &provider.ListContainerRequest{ Ref: &provider.Reference{ Spec: &provider.Reference_Path{Path: path.Join("/meta", idx.indexRootDir)}, @@ -365,3 +357,22 @@ func (idx *Autoincrement) next() (int, error) { return latest + 1, nil } + +func (idx *Autoincrement) getAuthenticatedContext(ctx context.Context) (context.Context, error) { + t, err := idx.authenticate(ctx) + if err != nil { + return nil, err + } + ctx = metadata.AppendToOutgoingContext(ctx, token.TokenHeader, t) + return ctx, nil +} + +// Delete deletes the index folder from its storage. +func (idx *Autoincrement) Delete() error { + ctx, err := idx.getAuthenticatedContext(context.Background()) + if err != nil { + return err + } + + return deleteIndexRoot(ctx, idx.storageProvider, idx.indexRootDir) +} diff --git a/accounts/pkg/indexer/index/cs3/helper.go b/accounts/pkg/indexer/index/cs3/helper.go new file mode 100644 index 0000000000..186e570347 --- /dev/null +++ b/accounts/pkg/indexer/index/cs3/helper.go @@ -0,0 +1,26 @@ +package cs3 + +import ( + "context" + "fmt" + "path" + + rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" +) + +func deleteIndexRoot(ctx context.Context, storageProvider provider.ProviderAPIClient, indexRootDir string) error { + res, err := storageProvider.Delete(ctx, &provider.DeleteRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Path{Path: path.Join("/meta", indexRootDir)}, + }, + }) + if err != nil { + return err + } + if res.Status.Code != rpc.Code_CODE_OK { + return fmt.Errorf("error deleting index root dir: %v", indexRootDir) + } + + return nil +} diff --git a/accounts/pkg/indexer/index/cs3/non_unique.go b/accounts/pkg/indexer/index/cs3/non_unique.go index bb6ed03769..8c573cdde5 100644 --- a/accounts/pkg/indexer/index/cs3/non_unique.go +++ b/accounts/pkg/indexer/index/cs3/non_unique.go @@ -378,6 +378,16 @@ func (idx *NonUnique) getAuthenticatedContext(ctx context.Context) (context.Cont return ctx, nil } +// Delete deletes the index folder from its storage. +func (idx *NonUnique) Delete() error { + ctx, err := idx.getAuthenticatedContext(context.Background()) + if err != nil { + return err + } + + return deleteIndexRoot(ctx, idx.storageProvider, idx.indexRootDir) +} + func (idx *NonUnique) authenticate(ctx context.Context) (token string, err error) { return storage.AuthenticateCS3(ctx, idx.cs3conf.ServiceUser, idx.tokenManager) } diff --git a/accounts/pkg/indexer/index/cs3/unique.go b/accounts/pkg/indexer/index/cs3/unique.go index 488a030408..684b0e860a 100644 --- a/accounts/pkg/indexer/index/cs3/unique.go +++ b/accounts/pkg/indexer/index/cs3/unique.go @@ -344,3 +344,22 @@ func (idx *Unique) makeDirIfNotExists(ctx context.Context, folder string) error func (idx *Unique) authenticate(ctx context.Context) (token string, err error) { return storage.AuthenticateCS3(ctx, idx.cs3conf.ServiceUser, idx.tokenManager) } + +func (idx *Unique) getAuthenticatedContext(ctx context.Context) (context.Context, error) { + t, err := idx.authenticate(ctx) + if err != nil { + return nil, err + } + ctx = metadata.AppendToOutgoingContext(ctx, token.TokenHeader, t) + return ctx, nil +} + +// Delete deletes the index folder from its storage. +func (idx *Unique) Delete() error { + ctx, err := idx.getAuthenticatedContext(context.Background()) + if err != nil { + return err + } + + return deleteIndexRoot(ctx, idx.storageProvider, idx.indexRootDir) +} diff --git a/accounts/pkg/indexer/index/disk/autoincrement.go b/accounts/pkg/indexer/index/disk/autoincrement.go index 170e274b92..c036461dc9 100644 --- a/accounts/pkg/indexer/index/disk/autoincrement.go +++ b/accounts/pkg/indexer/index/disk/autoincrement.go @@ -5,8 +5,6 @@ import ( "os" "path" "path/filepath" - "reflect" - "sort" "strconv" "strings" @@ -19,31 +17,26 @@ import ( // Autoincrement are fields for an index of type autoincrement. type Autoincrement struct { - indexBy string - typeName string - filesDir string - indexBaseDir string - indexRootDir string + indexBy string + typeName string + filesDir string + indexBaseDir string + indexRootDir string bound *option.Bound } -// - Creating an autoincrement index has to be thread safe. -// - Validation: autoincrement indexes should only work on integers. - func init() { registry.IndexConstructorRegistry["disk"]["autoincrement"] = NewAutoincrementIndex } -// NewAutoincrementIndex instantiates a new AutoincrementIndex instance. Init() should be -// called afterward to ensure correct on-disk structure. +// NewAutoincrementIndex instantiates a new AutoincrementIndex instance. Init() MUST be called upon instantiation. func NewAutoincrementIndex(o ...option.Option) index.Index { opts := &option.Options{} for _, opt := range o { opt(opts) } - // validate the field if opts.Entity == nil { panic("invalid autoincrement index: configured without entity") } @@ -54,25 +47,15 @@ func NewAutoincrementIndex(o ...option.Option) index.Index { } return &Autoincrement{ - indexBy: opts.IndexBy, - typeName: opts.TypeName, - filesDir: opts.FilesDir, - bound: opts.Bound, - indexBaseDir: path.Join(opts.DataDir, "index.disk"), - indexRootDir: path.Join(path.Join(opts.DataDir, "index.disk"), strings.Join([]string{"autoincrement", opts.TypeName, opts.IndexBy}, ".")), + indexBy: opts.IndexBy, + typeName: opts.TypeName, + filesDir: opts.FilesDir, + bound: opts.Bound, + indexBaseDir: path.Join(opts.DataDir, "index.disk"), + indexRootDir: path.Join(path.Join(opts.DataDir, "index.disk"), strings.Join([]string{"autoincrement", opts.TypeName, opts.IndexBy}, ".")), } } -var ( - validKinds = []reflect.Kind{ - reflect.Int, - reflect.Int8, - reflect.Int16, - reflect.Int32, - reflect.Int64, - } -) - // Init initializes an autoincrement index. func (idx *Autoincrement) Init() error { if _, err := os.Stat(idx.filesDir); err != nil { @@ -207,38 +190,6 @@ func (idx *Autoincrement) FilesDir() string { return idx.filesDir } -func isValidKind(k reflect.Kind) bool { - for _, v := range validKinds { - if k == v { - return true - } - } - return false -} - -func getKind(i interface{}, field string) (reflect.Kind, error) { - r := reflect.ValueOf(i) - return reflect.Indirect(r).FieldByName(field).Kind(), nil -} - -func readDir(dirname string) ([]os.FileInfo, error) { - f, err := os.Open(dirname) - if err != nil { - return nil, err - } - list, err := f.Readdir(-1) - f.Close() - if err != nil { - return nil, err - } - sort.Slice(list, func(i, j int) bool { - a, _ := strconv.Atoi(list[i].Name()) - b, _ := strconv.Atoi(list[j].Name()) - return a < b - }) - return list, nil -} - func (idx *Autoincrement) next() (int, error) { files, err := readDir(idx.indexRootDir) if err != nil { @@ -249,7 +200,7 @@ func (idx *Autoincrement) next() (int, error) { return int(idx.bound.Lower), nil } - latest, err := strconv.Atoi(path.Base(files[len(files)-1].Name())) + latest, err := lastValueFromTree(files) if err != nil { return -1, err } @@ -260,3 +211,16 @@ func (idx *Autoincrement) next() (int, error) { return latest + 1, nil } + +// Delete deletes the index root folder from the configured storage. +func (idx *Autoincrement) Delete() error { + return os.RemoveAll(idx.indexRootDir) +} + +func lastValueFromTree(files []os.FileInfo) (int, error) { + latest, err := strconv.Atoi(path.Base(files[len(files)-1].Name())) + if err != nil { + return -1, err + } + return latest, nil +} diff --git a/accounts/pkg/indexer/index/disk/helper.go b/accounts/pkg/indexer/index/disk/helper.go new file mode 100644 index 0000000000..50eafd4139 --- /dev/null +++ b/accounts/pkg/indexer/index/disk/helper.go @@ -0,0 +1,52 @@ +package disk + +import ( + "os" + "reflect" + "sort" + "strconv" +) + +var ( + validKinds = []reflect.Kind{ + reflect.Int, + reflect.Int8, + reflect.Int16, + reflect.Int32, + reflect.Int64, + } +) + +// verifies an autoincrement field kind on the target struct. +func isValidKind(k reflect.Kind) bool { + for _, v := range validKinds { + if k == v { + return true + } + } + return false +} + +func getKind(i interface{}, field string) (reflect.Kind, error) { + r := reflect.ValueOf(i) + return reflect.Indirect(r).FieldByName(field).Kind(), nil +} + +// readDir is an implementation of os.ReadDir but with different sorting. +func readDir(dirname string) ([]os.FileInfo, error) { + f, err := os.Open(dirname) + if err != nil { + return nil, err + } + list, err := f.Readdir(-1) + f.Close() + if err != nil { + return nil, err + } + sort.Slice(list, func(i, j int) bool { + a, _ := strconv.Atoi(list[i].Name()) + b, _ := strconv.Atoi(list[j].Name()) + return a < b + }) + return list, nil +} diff --git a/accounts/pkg/indexer/index/disk/non_unique.go b/accounts/pkg/indexer/index/disk/non_unique.go index 8f0c7d6948..d9fcf7508d 100644 --- a/accounts/pkg/indexer/index/disk/non_unique.go +++ b/accounts/pkg/indexer/index/disk/non_unique.go @@ -233,3 +233,8 @@ func (idx *NonUnique) TypeName() string { func (idx *NonUnique) FilesDir() string { return idx.filesDir } + +// Delete deletes the index folder from its storage. +func (idx *NonUnique) Delete() error { + return os.RemoveAll(idx.indexRootDir) +} diff --git a/accounts/pkg/indexer/index/disk/unique.go b/accounts/pkg/indexer/index/disk/unique.go index 7b94362236..a9252a334c 100644 --- a/accounts/pkg/indexer/index/disk/unique.go +++ b/accounts/pkg/indexer/index/disk/unique.go @@ -220,3 +220,8 @@ func isValidSymlink(path string) (err error) { return } + +// Delete deletes the index folder from its storage. +func (idx *Unique) Delete() error { + return os.RemoveAll(idx.indexRootDir) +} diff --git a/accounts/pkg/indexer/index/index.go b/accounts/pkg/indexer/index/index.go index e6f62862e0..9ad7aee7bd 100644 --- a/accounts/pkg/indexer/index/index.go +++ b/accounts/pkg/indexer/index/index.go @@ -13,4 +13,5 @@ type Index interface { IndexBy() string TypeName() string FilesDir() string + Delete() error // Delete deletes the index folder from its storage. } diff --git a/accounts/pkg/indexer/indexer.go b/accounts/pkg/indexer/indexer.go index b4c4119520..2c23ffe20e 100644 --- a/accounts/pkg/indexer/indexer.go +++ b/accounts/pkg/indexer/indexer.go @@ -42,6 +42,23 @@ func getRegistryStrategy(cfg *config.Config) string { return "cs3" } +// Reset takes care of deleting all indices from storage and from the internal map of indices +func (i Indexer) Reset() error { + for j := range i.indices { + for _, indices := range i.indices[j].IndicesByField { + for _, idx := range indices { + err := idx.Delete() + if err != nil { + return err + } + } + } + delete(i.indices, j) + } + + return nil +} + // AddIndex adds a new index to the indexer receiver. func (i Indexer) AddIndex(t interface{}, indexBy, pkName, entityDirName, indexType string, bound *option.Bound, caseInsensitive bool) error { strategy := getRegistryStrategy(i.config) diff --git a/accounts/pkg/indexer/indexer_test.go b/accounts/pkg/indexer/indexer_test.go index 276aec14ca..942adddf23 100644 --- a/accounts/pkg/indexer/indexer_test.go +++ b/accounts/pkg/indexer/indexer_test.go @@ -14,37 +14,37 @@ import ( "github.com/stretchr/testify/assert" ) -const cs3RootFolder = "/var/tmp/ocis/storage/users/data" - -func TestIndexer_CS3_AddWithUniqueIndex(t *testing.T) { - dataDir, err := WriteIndexTestData(Data, "ID", cs3RootFolder) - assert.NoError(t, err) - indexer := createCs3Indexer() - - err = indexer.AddIndex(&User{}, "UserName", "ID", "users", "unique", nil, false) - assert.NoError(t, err) - - u := &User{ID: "abcdefg-123", UserName: "mikey", Email: "mikey@example.com"} - _, err = indexer.Add(u) - assert.NoError(t, err) - - _ = os.RemoveAll(dataDir) -} - -func TestIndexer_CS3_AddWithNonUniqueIndex(t *testing.T) { - dataDir, err := WriteIndexTestData(Data, "ID", cs3RootFolder) - assert.NoError(t, err) - indexer := createCs3Indexer() - - err = indexer.AddIndex(&User{}, "UserName", "ID", "users", "non_unique", nil, false) - assert.NoError(t, err) - - u := &User{ID: "abcdefg-123", UserName: "mikey", Email: "mikey@example.com"} - _, err = indexer.Add(u) - assert.NoError(t, err) - - _ = os.RemoveAll(dataDir) -} +//const cs3RootFolder = "/var/tmp/ocis/storage/users/data" +// +//func TestIndexer_CS3_AddWithUniqueIndex(t *testing.T) { +// dataDir, err := WriteIndexTestData(Data, "ID", cs3RootFolder) +// assert.NoError(t, err) +// indexer := createCs3Indexer() +// +// err = indexer.AddIndex(&User{}, "UserName", "ID", "users", "unique", nil, false) +// assert.NoError(t, err) +// +// u := &User{ID: "abcdefg-123", UserName: "mikey", Email: "mikey@example.com"} +// _, err = indexer.Add(u) +// assert.NoError(t, err) +// +// _ = os.RemoveAll(dataDir) +//} +// +//func TestIndexer_CS3_AddWithNonUniqueIndex(t *testing.T) { +// dataDir, err := WriteIndexTestData(Data, "ID", cs3RootFolder) +// assert.NoError(t, err) +// indexer := createCs3Indexer() +// +// err = indexer.AddIndex(&User{}, "UserName", "ID", "users", "non_unique", nil, false) +// assert.NoError(t, err) +// +// u := &User{ID: "abcdefg-123", UserName: "mikey", Email: "mikey@example.com"} +// _, err = indexer.Add(u) +// assert.NoError(t, err) +// +// _ = os.RemoveAll(dataDir) +//} func TestIndexer_Disk_FindByWithUniqueIndex(t *testing.T) { dataDir, err := WriteIndexTestData(Data, "ID", "") @@ -251,18 +251,18 @@ func TestIndexer_Disk_UpdateWithNonUniqueIndex(t *testing.T) { _ = os.RemoveAll(dataDir) } -func createCs3Indexer() *Indexer { - return CreateIndexer(&config.Config{ - Repo: config.Repo{ - CS3: config.CS3{ - ProviderAddr: "0.0.0.0:9215", - DataURL: "http://localhost:9216", - DataPrefix: "data", - JWTSecret: "Pive-Fumkiu4", - }, - }, - }) -} +//func createCs3Indexer() *Indexer { +// return CreateIndexer(&config.Config{ +// Repo: config.Repo{ +// CS3: config.CS3{ +// ProviderAddr: "0.0.0.0:9215", +// DataURL: "http://localhost:9216", +// DataPrefix: "data", +// JWTSecret: "Pive-Fumkiu4", +// }, +// }, +// }) +//} func createDiskIndexer(dataDir string) *Indexer { return CreateIndexer(&config.Config{ diff --git a/accounts/pkg/proto/v0/accounts.pb.go b/accounts/pkg/proto/v0/accounts.pb.go index a7991a4b7d..d265ca3131 100644 --- a/accounts/pkg/proto/v0/accounts.pb.go +++ b/accounts/pkg/proto/v0/accounts.pb.go @@ -1,30 +1,115 @@ // Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.21.0-devel +// protoc v3.13.0 // source: accounts.proto package proto import ( - fmt "fmt" proto "github.com/golang/protobuf/proto" - _ "github.com/golang/protobuf/ptypes/empty" + empty "github.com/golang/protobuf/ptypes/empty" timestamp "github.com/golang/protobuf/ptypes/timestamp" _ "google.golang.org/genproto/googleapis/api/annotations" field_mask "google.golang.org/genproto/protobuf/field_mask" - math "math" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type RebuildIndexRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *RebuildIndexRequest) Reset() { + *x = RebuildIndexRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RebuildIndexRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RebuildIndexRequest) ProtoMessage() {} + +func (x *RebuildIndexRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RebuildIndexRequest.ProtoReflect.Descriptor instead. +func (*RebuildIndexRequest) Descriptor() ([]byte, []int) { + return file_accounts_proto_rawDescGZIP(), []int{0} +} + +type RebuildIndexResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *RebuildIndexResponse) Reset() { + *x = RebuildIndexResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RebuildIndexResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RebuildIndexResponse) ProtoMessage() {} + +func (x *RebuildIndexResponse) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RebuildIndexResponse.ProtoReflect.Descriptor instead. +func (*RebuildIndexResponse) Descriptor() ([]byte, []int) { + return file_accounts_proto_rawDescGZIP(), []int{1} +} type ListAccountsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Optional. The maximum number of accounts to return in the response PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // Optional. A pagination token returned from a previous call to `Get` @@ -53,281 +138,325 @@ type ListAccountsRequest struct { // `email` set to `foo@example.com` // * Query `display_name=\\"Test String\\"` returns accounts with // display names that include both "Test" and "String" - Query string `protobuf:"bytes,4,opt,name=query,proto3" json:"query,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Query string `protobuf:"bytes,4,opt,name=query,proto3" json:"query,omitempty"` } -func (m *ListAccountsRequest) Reset() { *m = ListAccountsRequest{} } -func (m *ListAccountsRequest) String() string { return proto.CompactTextString(m) } -func (*ListAccountsRequest) ProtoMessage() {} +func (x *ListAccountsRequest) Reset() { + *x = ListAccountsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListAccountsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAccountsRequest) ProtoMessage() {} + +func (x *ListAccountsRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListAccountsRequest.ProtoReflect.Descriptor instead. func (*ListAccountsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{0} + return file_accounts_proto_rawDescGZIP(), []int{2} } -func (m *ListAccountsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListAccountsRequest.Unmarshal(m, b) -} -func (m *ListAccountsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListAccountsRequest.Marshal(b, m, deterministic) -} -func (m *ListAccountsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListAccountsRequest.Merge(m, src) -} -func (m *ListAccountsRequest) XXX_Size() int { - return xxx_messageInfo_ListAccountsRequest.Size(m) -} -func (m *ListAccountsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListAccountsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListAccountsRequest proto.InternalMessageInfo - -func (m *ListAccountsRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize +func (x *ListAccountsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize } return 0 } -func (m *ListAccountsRequest) GetPageToken() string { - if m != nil { - return m.PageToken +func (x *ListAccountsRequest) GetPageToken() string { + if x != nil { + return x.PageToken } return "" } -func (m *ListAccountsRequest) GetFieldMask() *field_mask.FieldMask { - if m != nil { - return m.FieldMask +func (x *ListAccountsRequest) GetFieldMask() *field_mask.FieldMask { + if x != nil { + return x.FieldMask } return nil } -func (m *ListAccountsRequest) GetQuery() string { - if m != nil { - return m.Query +func (x *ListAccountsRequest) GetQuery() string { + if x != nil { + return x.Query } return "" } type ListAccountsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The field name should match the noun "accounts" in the method name. There // will be a maximum number of items returned based on the page_size field // in the request Accounts []*Account `protobuf:"bytes,1,rep,name=accounts,proto3" json:"accounts,omitempty"` // Token to retrieve the next page of results, or empty if there are no // more results in the list - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } -func (m *ListAccountsResponse) Reset() { *m = ListAccountsResponse{} } -func (m *ListAccountsResponse) String() string { return proto.CompactTextString(m) } -func (*ListAccountsResponse) ProtoMessage() {} +func (x *ListAccountsResponse) Reset() { + *x = ListAccountsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListAccountsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAccountsResponse) ProtoMessage() {} + +func (x *ListAccountsResponse) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListAccountsResponse.ProtoReflect.Descriptor instead. func (*ListAccountsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{1} + return file_accounts_proto_rawDescGZIP(), []int{3} } -func (m *ListAccountsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListAccountsResponse.Unmarshal(m, b) -} -func (m *ListAccountsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListAccountsResponse.Marshal(b, m, deterministic) -} -func (m *ListAccountsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListAccountsResponse.Merge(m, src) -} -func (m *ListAccountsResponse) XXX_Size() int { - return xxx_messageInfo_ListAccountsResponse.Size(m) -} -func (m *ListAccountsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListAccountsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListAccountsResponse proto.InternalMessageInfo - -func (m *ListAccountsResponse) GetAccounts() []*Account { - if m != nil { - return m.Accounts +func (x *ListAccountsResponse) GetAccounts() []*Account { + if x != nil { + return x.Accounts } return nil } -func (m *ListAccountsResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken +func (x *ListAccountsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken } return "" } type GetAccountRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (m *GetAccountRequest) Reset() { *m = GetAccountRequest{} } -func (m *GetAccountRequest) String() string { return proto.CompactTextString(m) } -func (*GetAccountRequest) ProtoMessage() {} +func (x *GetAccountRequest) Reset() { + *x = GetAccountRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAccountRequest) ProtoMessage() {} + +func (x *GetAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAccountRequest.ProtoReflect.Descriptor instead. func (*GetAccountRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{2} + return file_accounts_proto_rawDescGZIP(), []int{4} } -func (m *GetAccountRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetAccountRequest.Unmarshal(m, b) -} -func (m *GetAccountRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetAccountRequest.Marshal(b, m, deterministic) -} -func (m *GetAccountRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetAccountRequest.Merge(m, src) -} -func (m *GetAccountRequest) XXX_Size() int { - return xxx_messageInfo_GetAccountRequest.Size(m) -} -func (m *GetAccountRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetAccountRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetAccountRequest proto.InternalMessageInfo - -func (m *GetAccountRequest) GetId() string { - if m != nil { - return m.Id +func (x *GetAccountRequest) GetId() string { + if x != nil { + return x.Id } return "" } type CreateAccountRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The account resource to create - Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` } -func (m *CreateAccountRequest) Reset() { *m = CreateAccountRequest{} } -func (m *CreateAccountRequest) String() string { return proto.CompactTextString(m) } -func (*CreateAccountRequest) ProtoMessage() {} +func (x *CreateAccountRequest) Reset() { + *x = CreateAccountRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateAccountRequest) ProtoMessage() {} + +func (x *CreateAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateAccountRequest.ProtoReflect.Descriptor instead. func (*CreateAccountRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{3} + return file_accounts_proto_rawDescGZIP(), []int{5} } -func (m *CreateAccountRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateAccountRequest.Unmarshal(m, b) -} -func (m *CreateAccountRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateAccountRequest.Marshal(b, m, deterministic) -} -func (m *CreateAccountRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateAccountRequest.Merge(m, src) -} -func (m *CreateAccountRequest) XXX_Size() int { - return xxx_messageInfo_CreateAccountRequest.Size(m) -} -func (m *CreateAccountRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateAccountRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateAccountRequest proto.InternalMessageInfo - -func (m *CreateAccountRequest) GetAccount() *Account { - if m != nil { - return m.Account +func (x *CreateAccountRequest) GetAccount() *Account { + if x != nil { + return x.Account } return nil } type UpdateAccountRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The account resource which replaces the resource on the server Account *Account `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` // The update mask applies to the resource. For the `FieldMask` definition, // see https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask - UpdateMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + UpdateMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` } -func (m *UpdateAccountRequest) Reset() { *m = UpdateAccountRequest{} } -func (m *UpdateAccountRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateAccountRequest) ProtoMessage() {} +func (x *UpdateAccountRequest) Reset() { + *x = UpdateAccountRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateAccountRequest) ProtoMessage() {} + +func (x *UpdateAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateAccountRequest.ProtoReflect.Descriptor instead. func (*UpdateAccountRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{4} + return file_accounts_proto_rawDescGZIP(), []int{6} } -func (m *UpdateAccountRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UpdateAccountRequest.Unmarshal(m, b) -} -func (m *UpdateAccountRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UpdateAccountRequest.Marshal(b, m, deterministic) -} -func (m *UpdateAccountRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateAccountRequest.Merge(m, src) -} -func (m *UpdateAccountRequest) XXX_Size() int { - return xxx_messageInfo_UpdateAccountRequest.Size(m) -} -func (m *UpdateAccountRequest) XXX_DiscardUnknown() { - xxx_messageInfo_UpdateAccountRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_UpdateAccountRequest proto.InternalMessageInfo - -func (m *UpdateAccountRequest) GetAccount() *Account { - if m != nil { - return m.Account +func (x *UpdateAccountRequest) GetAccount() *Account { + if x != nil { + return x.Account } return nil } -func (m *UpdateAccountRequest) GetUpdateMask() *field_mask.FieldMask { - if m != nil { - return m.UpdateMask +func (x *UpdateAccountRequest) GetUpdateMask() *field_mask.FieldMask { + if x != nil { + return x.UpdateMask } return nil } type DeleteAccountRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (m *DeleteAccountRequest) Reset() { *m = DeleteAccountRequest{} } -func (m *DeleteAccountRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteAccountRequest) ProtoMessage() {} +func (x *DeleteAccountRequest) Reset() { + *x = DeleteAccountRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAccountRequest) ProtoMessage() {} + +func (x *DeleteAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteAccountRequest.ProtoReflect.Descriptor instead. func (*DeleteAccountRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{5} + return file_accounts_proto_rawDescGZIP(), []int{7} } -func (m *DeleteAccountRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteAccountRequest.Unmarshal(m, b) -} -func (m *DeleteAccountRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteAccountRequest.Marshal(b, m, deterministic) -} -func (m *DeleteAccountRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteAccountRequest.Merge(m, src) -} -func (m *DeleteAccountRequest) XXX_Size() int { - return xxx_messageInfo_DeleteAccountRequest.Size(m) -} -func (m *DeleteAccountRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteAccountRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteAccountRequest proto.InternalMessageInfo - -func (m *DeleteAccountRequest) GetId() string { - if m != nil { - return m.Id +func (x *DeleteAccountRequest) GetId() string { + if x != nil { + return x.Id } return "" } @@ -335,6 +464,10 @@ func (m *DeleteAccountRequest) GetId() string { // Account follows the properties of the ms graph api user resuorce. // See https://docs.microsoft.com/en-us/graph/api/resources/user?view=graph-rest-1.0#properties type Account struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The unique identifier for the user. Key. Not nullable. Non reassignable. Read-only. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // *true* if the account is enabled; otherwise, *false*. This property is required when a user is created. Supports $filter. @@ -432,228 +565,232 @@ type Account struct { // If this happens, the application will need to acquire a new refresh token by making a request to the authorize endpoint. // Read-only. Use revokeSignInSessions to reset. SignInSessionsValidFromDateTime *timestamp.Timestamp `protobuf:"bytes,61,opt,name=sign_in_sessions_valid_from_date_time,json=signInSessionsValidFromDateTime,proto3" json:"sign_in_sessions_valid_from_date_time,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` } -func (m *Account) Reset() { *m = Account{} } -func (m *Account) String() string { return proto.CompactTextString(m) } -func (*Account) ProtoMessage() {} +func (x *Account) Reset() { + *x = Account{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Account) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Account) ProtoMessage() {} + +func (x *Account) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Account.ProtoReflect.Descriptor instead. func (*Account) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{6} + return file_accounts_proto_rawDescGZIP(), []int{8} } -func (m *Account) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Account.Unmarshal(m, b) -} -func (m *Account) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Account.Marshal(b, m, deterministic) -} -func (m *Account) XXX_Merge(src proto.Message) { - xxx_messageInfo_Account.Merge(m, src) -} -func (m *Account) XXX_Size() int { - return xxx_messageInfo_Account.Size(m) -} -func (m *Account) XXX_DiscardUnknown() { - xxx_messageInfo_Account.DiscardUnknown(m) -} - -var xxx_messageInfo_Account proto.InternalMessageInfo - -func (m *Account) GetId() string { - if m != nil { - return m.Id +func (x *Account) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *Account) GetAccountEnabled() bool { - if m != nil { - return m.AccountEnabled +func (x *Account) GetAccountEnabled() bool { + if x != nil { + return x.AccountEnabled } return false } -func (m *Account) GetIsResourceAccount() bool { - if m != nil { - return m.IsResourceAccount +func (x *Account) GetIsResourceAccount() bool { + if x != nil { + return x.IsResourceAccount } return false } -func (m *Account) GetCreationType() string { - if m != nil { - return m.CreationType +func (x *Account) GetCreationType() string { + if x != nil { + return x.CreationType } return "" } -func (m *Account) GetIdentities() []*Identities { - if m != nil { - return m.Identities +func (x *Account) GetIdentities() []*Identities { + if x != nil { + return x.Identities } return nil } -func (m *Account) GetDisplayName() string { - if m != nil { - return m.DisplayName +func (x *Account) GetDisplayName() string { + if x != nil { + return x.DisplayName } return "" } -func (m *Account) GetPreferredName() string { - if m != nil { - return m.PreferredName +func (x *Account) GetPreferredName() string { + if x != nil { + return x.PreferredName } return "" } -func (m *Account) GetUidNumber() int64 { - if m != nil { - return m.UidNumber +func (x *Account) GetUidNumber() int64 { + if x != nil { + return x.UidNumber } return 0 } -func (m *Account) GetGidNumber() int64 { - if m != nil { - return m.GidNumber +func (x *Account) GetGidNumber() int64 { + if x != nil { + return x.GidNumber } return 0 } -func (m *Account) GetMail() string { - if m != nil { - return m.Mail +func (x *Account) GetMail() string { + if x != nil { + return x.Mail } return "" } -func (m *Account) GetDescription() string { - if m != nil { - return m.Description +func (x *Account) GetDescription() string { + if x != nil { + return x.Description } return "" } -func (m *Account) GetPasswordProfile() *PasswordProfile { - if m != nil { - return m.PasswordProfile +func (x *Account) GetPasswordProfile() *PasswordProfile { + if x != nil { + return x.PasswordProfile } return nil } -func (m *Account) GetMemberOf() []*Group { - if m != nil { - return m.MemberOf +func (x *Account) GetMemberOf() []*Group { + if x != nil { + return x.MemberOf } return nil } -func (m *Account) GetCreatedDateTime() *timestamp.Timestamp { - if m != nil { - return m.CreatedDateTime +func (x *Account) GetCreatedDateTime() *timestamp.Timestamp { + if x != nil { + return x.CreatedDateTime } return nil } -func (m *Account) GetDeletedDateTime() *timestamp.Timestamp { - if m != nil { - return m.DeletedDateTime +func (x *Account) GetDeletedDateTime() *timestamp.Timestamp { + if x != nil { + return x.DeletedDateTime } return nil } -func (m *Account) GetOnPremisesSyncEnabled() bool { - if m != nil { - return m.OnPremisesSyncEnabled +func (x *Account) GetOnPremisesSyncEnabled() bool { + if x != nil { + return x.OnPremisesSyncEnabled } return false } -func (m *Account) GetOnPremisesImmutableId() string { - if m != nil { - return m.OnPremisesImmutableId +func (x *Account) GetOnPremisesImmutableId() string { + if x != nil { + return x.OnPremisesImmutableId } return "" } -func (m *Account) GetOnPremisesSecurityIdentifier() string { - if m != nil { - return m.OnPremisesSecurityIdentifier +func (x *Account) GetOnPremisesSecurityIdentifier() string { + if x != nil { + return x.OnPremisesSecurityIdentifier } return "" } -func (m *Account) GetOnPremisesDistinguishedName() string { - if m != nil { - return m.OnPremisesDistinguishedName +func (x *Account) GetOnPremisesDistinguishedName() string { + if x != nil { + return x.OnPremisesDistinguishedName } return "" } -func (m *Account) GetOnPremisesSamAccountName() string { - if m != nil { - return m.OnPremisesSamAccountName +func (x *Account) GetOnPremisesSamAccountName() string { + if x != nil { + return x.OnPremisesSamAccountName } return "" } -func (m *Account) GetOnPremisesDomainName() string { - if m != nil { - return m.OnPremisesDomainName +func (x *Account) GetOnPremisesDomainName() string { + if x != nil { + return x.OnPremisesDomainName } return "" } -func (m *Account) GetOnPremisesUserPrincipalName() string { - if m != nil { - return m.OnPremisesUserPrincipalName +func (x *Account) GetOnPremisesUserPrincipalName() string { + if x != nil { + return x.OnPremisesUserPrincipalName } return "" } -func (m *Account) GetOnPremisesLastSyncDateTime() *timestamp.Timestamp { - if m != nil { - return m.OnPremisesLastSyncDateTime +func (x *Account) GetOnPremisesLastSyncDateTime() *timestamp.Timestamp { + if x != nil { + return x.OnPremisesLastSyncDateTime } return nil } -func (m *Account) GetOnPremisesProvisioningErrors() []*OnPremisesProvisioningError { - if m != nil { - return m.OnPremisesProvisioningErrors +func (x *Account) GetOnPremisesProvisioningErrors() []*OnPremisesProvisioningError { + if x != nil { + return x.OnPremisesProvisioningErrors } return nil } -func (m *Account) GetExternalUserState() string { - if m != nil { - return m.ExternalUserState +func (x *Account) GetExternalUserState() string { + if x != nil { + return x.ExternalUserState } return "" } -func (m *Account) GetExternalUserStateChangeDateTime() *timestamp.Timestamp { - if m != nil { - return m.ExternalUserStateChangeDateTime +func (x *Account) GetExternalUserStateChangeDateTime() *timestamp.Timestamp { + if x != nil { + return x.ExternalUserStateChangeDateTime } return nil } -func (m *Account) GetRefreshTokensValidFromDateTime() *timestamp.Timestamp { - if m != nil { - return m.RefreshTokensValidFromDateTime +func (x *Account) GetRefreshTokensValidFromDateTime() *timestamp.Timestamp { + if x != nil { + return x.RefreshTokensValidFromDateTime } return nil } -func (m *Account) GetSignInSessionsValidFromDateTime() *timestamp.Timestamp { - if m != nil { - return m.SignInSessionsValidFromDateTime +func (x *Account) GetSignInSessionsValidFromDateTime() *timestamp.Timestamp { + if x != nil { + return x.SignInSessionsValidFromDateTime } return nil } @@ -663,6 +800,10 @@ func (m *Account) GetSignInSessionsValidFromDateTime() *timestamp.Timestamp { // This enables the user to sign in to the user account with any of those associated identities. // They are also used to keep a history of old usernames. type Identities struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Specifies the user sign-in types in your directory, such as `emailAddress`, `userName` or `federated`. // Here, federated represents a unique identifier for a user from an issuer, that can be in any format chosen by the issuer. // Additional validation is enforced on *issuer_assigned_id* when the sign-in type is set to `emailAddress` or `userName`. @@ -680,59 +821,67 @@ type Identities struct { // * `emailAddress`, (or starts with `emailAddress` like `emailAddress1`) *issuerAssignedId* must be a valid email address // * `userName`, issuer_assigned_id must be a valid local part of an email address // Supports $filter. 512 character limit. - IssuerAssignedId string `protobuf:"bytes,3,opt,name=issuer_assigned_id,json=issuerAssignedId,proto3" json:"issuer_assigned_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + IssuerAssignedId string `protobuf:"bytes,3,opt,name=issuer_assigned_id,json=issuerAssignedId,proto3" json:"issuer_assigned_id,omitempty"` } -func (m *Identities) Reset() { *m = Identities{} } -func (m *Identities) String() string { return proto.CompactTextString(m) } -func (*Identities) ProtoMessage() {} +func (x *Identities) Reset() { + *x = Identities{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Identities) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Identities) ProtoMessage() {} + +func (x *Identities) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Identities.ProtoReflect.Descriptor instead. func (*Identities) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{7} + return file_accounts_proto_rawDescGZIP(), []int{9} } -func (m *Identities) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Identities.Unmarshal(m, b) -} -func (m *Identities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Identities.Marshal(b, m, deterministic) -} -func (m *Identities) XXX_Merge(src proto.Message) { - xxx_messageInfo_Identities.Merge(m, src) -} -func (m *Identities) XXX_Size() int { - return xxx_messageInfo_Identities.Size(m) -} -func (m *Identities) XXX_DiscardUnknown() { - xxx_messageInfo_Identities.DiscardUnknown(m) -} - -var xxx_messageInfo_Identities proto.InternalMessageInfo - -func (m *Identities) GetSignInType() string { - if m != nil { - return m.SignInType +func (x *Identities) GetSignInType() string { + if x != nil { + return x.SignInType } return "" } -func (m *Identities) GetIssuer() string { - if m != nil { - return m.Issuer +func (x *Identities) GetIssuer() string { + if x != nil { + return x.Issuer } return "" } -func (m *Identities) GetIssuerAssignedId() string { - if m != nil { - return m.IssuerAssignedId +func (x *Identities) GetIssuerAssignedId() string { + if x != nil { + return x.IssuerAssignedId } return "" } type PasswordProfile struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The password for the user. This property is required when a user is created. // It can be updated, but the user will be required to change the password on the next login. // The password must satisfy minimum requirements as specified by the user’s passwordPolicies property. By default, a strong password is required. @@ -746,73 +895,81 @@ type PasswordProfile struct { // *true* if the user must change her password on the next login; otherwise false. ForceChangePasswordNextSignIn bool `protobuf:"varint,4,opt,name=force_change_password_next_sign_in,json=forceChangePasswordNextSignIn,proto3" json:"force_change_password_next_sign_in,omitempty"` // If *true*, at next sign-in, the user must perform a multi-factor authentication (MFA) before being forced to change their password. The behavior is identical to forceChangePasswordNextSignIn except that the user is required to first perform a multi-factor authentication before password change. After a password change, this property will be automatically reset to false. If not set, default is false. - ForceChangePasswordNextSignInWithMfa bool `protobuf:"varint,5,opt,name=force_change_password_next_sign_in_with_mfa,json=forceChangePasswordNextSignInWithMfa,proto3" json:"force_change_password_next_sign_in_with_mfa,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ForceChangePasswordNextSignInWithMfa bool `protobuf:"varint,5,opt,name=force_change_password_next_sign_in_with_mfa,json=forceChangePasswordNextSignInWithMfa,proto3" json:"force_change_password_next_sign_in_with_mfa,omitempty"` } -func (m *PasswordProfile) Reset() { *m = PasswordProfile{} } -func (m *PasswordProfile) String() string { return proto.CompactTextString(m) } -func (*PasswordProfile) ProtoMessage() {} +func (x *PasswordProfile) Reset() { + *x = PasswordProfile{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PasswordProfile) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PasswordProfile) ProtoMessage() {} + +func (x *PasswordProfile) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PasswordProfile.ProtoReflect.Descriptor instead. func (*PasswordProfile) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{8} + return file_accounts_proto_rawDescGZIP(), []int{10} } -func (m *PasswordProfile) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PasswordProfile.Unmarshal(m, b) -} -func (m *PasswordProfile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PasswordProfile.Marshal(b, m, deterministic) -} -func (m *PasswordProfile) XXX_Merge(src proto.Message) { - xxx_messageInfo_PasswordProfile.Merge(m, src) -} -func (m *PasswordProfile) XXX_Size() int { - return xxx_messageInfo_PasswordProfile.Size(m) -} -func (m *PasswordProfile) XXX_DiscardUnknown() { - xxx_messageInfo_PasswordProfile.DiscardUnknown(m) -} - -var xxx_messageInfo_PasswordProfile proto.InternalMessageInfo - -func (m *PasswordProfile) GetPassword() string { - if m != nil { - return m.Password +func (x *PasswordProfile) GetPassword() string { + if x != nil { + return x.Password } return "" } -func (m *PasswordProfile) GetLastPasswordChangeDateTime() *timestamp.Timestamp { - if m != nil { - return m.LastPasswordChangeDateTime +func (x *PasswordProfile) GetLastPasswordChangeDateTime() *timestamp.Timestamp { + if x != nil { + return x.LastPasswordChangeDateTime } return nil } -func (m *PasswordProfile) GetPasswordPolicies() []string { - if m != nil { - return m.PasswordPolicies +func (x *PasswordProfile) GetPasswordPolicies() []string { + if x != nil { + return x.PasswordPolicies } return nil } -func (m *PasswordProfile) GetForceChangePasswordNextSignIn() bool { - if m != nil { - return m.ForceChangePasswordNextSignIn +func (x *PasswordProfile) GetForceChangePasswordNextSignIn() bool { + if x != nil { + return x.ForceChangePasswordNextSignIn } return false } -func (m *PasswordProfile) GetForceChangePasswordNextSignInWithMfa() bool { - if m != nil { - return m.ForceChangePasswordNextSignInWithMfa +func (x *PasswordProfile) GetForceChangePasswordNextSignInWithMfa() bool { + if x != nil { + return x.ForceChangePasswordNextSignInWithMfa } return false } type ListGroupsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Optional. The maximum number of groups to return in the response PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // Optional. A pagination token returned from a previous call to `Get` @@ -839,384 +996,448 @@ type ListGroupsRequest struct { // starts with "Th" // * Query `display_name=\\"Test String\\"` returns groups with // display names that include both "Test" and "String" - Query string `protobuf:"bytes,4,opt,name=query,proto3" json:"query,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Query string `protobuf:"bytes,4,opt,name=query,proto3" json:"query,omitempty"` } -func (m *ListGroupsRequest) Reset() { *m = ListGroupsRequest{} } -func (m *ListGroupsRequest) String() string { return proto.CompactTextString(m) } -func (*ListGroupsRequest) ProtoMessage() {} +func (x *ListGroupsRequest) Reset() { + *x = ListGroupsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListGroupsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGroupsRequest) ProtoMessage() {} + +func (x *ListGroupsRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListGroupsRequest.ProtoReflect.Descriptor instead. func (*ListGroupsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{9} + return file_accounts_proto_rawDescGZIP(), []int{11} } -func (m *ListGroupsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListGroupsRequest.Unmarshal(m, b) -} -func (m *ListGroupsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListGroupsRequest.Marshal(b, m, deterministic) -} -func (m *ListGroupsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListGroupsRequest.Merge(m, src) -} -func (m *ListGroupsRequest) XXX_Size() int { - return xxx_messageInfo_ListGroupsRequest.Size(m) -} -func (m *ListGroupsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListGroupsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListGroupsRequest proto.InternalMessageInfo - -func (m *ListGroupsRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize +func (x *ListGroupsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize } return 0 } -func (m *ListGroupsRequest) GetPageToken() string { - if m != nil { - return m.PageToken +func (x *ListGroupsRequest) GetPageToken() string { + if x != nil { + return x.PageToken } return "" } -func (m *ListGroupsRequest) GetFieldMask() *field_mask.FieldMask { - if m != nil { - return m.FieldMask +func (x *ListGroupsRequest) GetFieldMask() *field_mask.FieldMask { + if x != nil { + return x.FieldMask } return nil } -func (m *ListGroupsRequest) GetQuery() string { - if m != nil { - return m.Query +func (x *ListGroupsRequest) GetQuery() string { + if x != nil { + return x.Query } return "" } type ListGroupsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The field name should match the noun "group" in the method name. There // will be a maximum number of items returned based on the page_size field // in the request Groups []*Group `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` // Token to retrieve the next page of results, or empty if there are no // more results in the list - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } -func (m *ListGroupsResponse) Reset() { *m = ListGroupsResponse{} } -func (m *ListGroupsResponse) String() string { return proto.CompactTextString(m) } -func (*ListGroupsResponse) ProtoMessage() {} +func (x *ListGroupsResponse) Reset() { + *x = ListGroupsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListGroupsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGroupsResponse) ProtoMessage() {} + +func (x *ListGroupsResponse) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListGroupsResponse.ProtoReflect.Descriptor instead. func (*ListGroupsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{10} + return file_accounts_proto_rawDescGZIP(), []int{12} } -func (m *ListGroupsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListGroupsResponse.Unmarshal(m, b) -} -func (m *ListGroupsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListGroupsResponse.Marshal(b, m, deterministic) -} -func (m *ListGroupsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListGroupsResponse.Merge(m, src) -} -func (m *ListGroupsResponse) XXX_Size() int { - return xxx_messageInfo_ListGroupsResponse.Size(m) -} -func (m *ListGroupsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListGroupsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListGroupsResponse proto.InternalMessageInfo - -func (m *ListGroupsResponse) GetGroups() []*Group { - if m != nil { - return m.Groups +func (x *ListGroupsResponse) GetGroups() []*Group { + if x != nil { + return x.Groups } return nil } -func (m *ListGroupsResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken +func (x *ListGroupsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken } return "" } type GetGroupRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (m *GetGroupRequest) Reset() { *m = GetGroupRequest{} } -func (m *GetGroupRequest) String() string { return proto.CompactTextString(m) } -func (*GetGroupRequest) ProtoMessage() {} +func (x *GetGroupRequest) Reset() { + *x = GetGroupRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetGroupRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGroupRequest) ProtoMessage() {} + +func (x *GetGroupRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetGroupRequest.ProtoReflect.Descriptor instead. func (*GetGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{11} + return file_accounts_proto_rawDescGZIP(), []int{13} } -func (m *GetGroupRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetGroupRequest.Unmarshal(m, b) -} -func (m *GetGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetGroupRequest.Marshal(b, m, deterministic) -} -func (m *GetGroupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetGroupRequest.Merge(m, src) -} -func (m *GetGroupRequest) XXX_Size() int { - return xxx_messageInfo_GetGroupRequest.Size(m) -} -func (m *GetGroupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetGroupRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetGroupRequest proto.InternalMessageInfo - -func (m *GetGroupRequest) GetId() string { - if m != nil { - return m.Id +func (x *GetGroupRequest) GetId() string { + if x != nil { + return x.Id } return "" } type CreateGroupRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The account resource to create - Group *Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Group *Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` } -func (m *CreateGroupRequest) Reset() { *m = CreateGroupRequest{} } -func (m *CreateGroupRequest) String() string { return proto.CompactTextString(m) } -func (*CreateGroupRequest) ProtoMessage() {} +func (x *CreateGroupRequest) Reset() { + *x = CreateGroupRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateGroupRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGroupRequest) ProtoMessage() {} + +func (x *CreateGroupRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateGroupRequest.ProtoReflect.Descriptor instead. func (*CreateGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{12} + return file_accounts_proto_rawDescGZIP(), []int{14} } -func (m *CreateGroupRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateGroupRequest.Unmarshal(m, b) -} -func (m *CreateGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateGroupRequest.Marshal(b, m, deterministic) -} -func (m *CreateGroupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateGroupRequest.Merge(m, src) -} -func (m *CreateGroupRequest) XXX_Size() int { - return xxx_messageInfo_CreateGroupRequest.Size(m) -} -func (m *CreateGroupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateGroupRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateGroupRequest proto.InternalMessageInfo - -func (m *CreateGroupRequest) GetGroup() *Group { - if m != nil { - return m.Group +func (x *CreateGroupRequest) GetGroup() *Group { + if x != nil { + return x.Group } return nil } type UpdateGroupRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The group resource which replaces the resource on the server Group *Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` // The update mask applies to the resource. For the `FieldMask` definition, // see https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask - UpdateMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + UpdateMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` } -func (m *UpdateGroupRequest) Reset() { *m = UpdateGroupRequest{} } -func (m *UpdateGroupRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateGroupRequest) ProtoMessage() {} +func (x *UpdateGroupRequest) Reset() { + *x = UpdateGroupRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateGroupRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGroupRequest) ProtoMessage() {} + +func (x *UpdateGroupRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateGroupRequest.ProtoReflect.Descriptor instead. func (*UpdateGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{13} + return file_accounts_proto_rawDescGZIP(), []int{15} } -func (m *UpdateGroupRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UpdateGroupRequest.Unmarshal(m, b) -} -func (m *UpdateGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UpdateGroupRequest.Marshal(b, m, deterministic) -} -func (m *UpdateGroupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateGroupRequest.Merge(m, src) -} -func (m *UpdateGroupRequest) XXX_Size() int { - return xxx_messageInfo_UpdateGroupRequest.Size(m) -} -func (m *UpdateGroupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_UpdateGroupRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_UpdateGroupRequest proto.InternalMessageInfo - -func (m *UpdateGroupRequest) GetGroup() *Group { - if m != nil { - return m.Group +func (x *UpdateGroupRequest) GetGroup() *Group { + if x != nil { + return x.Group } return nil } -func (m *UpdateGroupRequest) GetUpdateMask() *field_mask.FieldMask { - if m != nil { - return m.UpdateMask +func (x *UpdateGroupRequest) GetUpdateMask() *field_mask.FieldMask { + if x != nil { + return x.UpdateMask } return nil } type DeleteGroupRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (m *DeleteGroupRequest) Reset() { *m = DeleteGroupRequest{} } -func (m *DeleteGroupRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteGroupRequest) ProtoMessage() {} +func (x *DeleteGroupRequest) Reset() { + *x = DeleteGroupRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteGroupRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGroupRequest) ProtoMessage() {} + +func (x *DeleteGroupRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteGroupRequest.ProtoReflect.Descriptor instead. func (*DeleteGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{14} + return file_accounts_proto_rawDescGZIP(), []int{16} } -func (m *DeleteGroupRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteGroupRequest.Unmarshal(m, b) -} -func (m *DeleteGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteGroupRequest.Marshal(b, m, deterministic) -} -func (m *DeleteGroupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteGroupRequest.Merge(m, src) -} -func (m *DeleteGroupRequest) XXX_Size() int { - return xxx_messageInfo_DeleteGroupRequest.Size(m) -} -func (m *DeleteGroupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteGroupRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteGroupRequest proto.InternalMessageInfo - -func (m *DeleteGroupRequest) GetId() string { - if m != nil { - return m.Id +func (x *DeleteGroupRequest) GetId() string { + if x != nil { + return x.Id } return "" } type AddMemberRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The id of the group to add a member to GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The account id to add - AccountId string `protobuf:"bytes,2,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + AccountId string `protobuf:"bytes,2,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` } -func (m *AddMemberRequest) Reset() { *m = AddMemberRequest{} } -func (m *AddMemberRequest) String() string { return proto.CompactTextString(m) } -func (*AddMemberRequest) ProtoMessage() {} +func (x *AddMemberRequest) Reset() { + *x = AddMemberRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddMemberRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddMemberRequest) ProtoMessage() {} + +func (x *AddMemberRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddMemberRequest.ProtoReflect.Descriptor instead. func (*AddMemberRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{15} + return file_accounts_proto_rawDescGZIP(), []int{17} } -func (m *AddMemberRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AddMemberRequest.Unmarshal(m, b) -} -func (m *AddMemberRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AddMemberRequest.Marshal(b, m, deterministic) -} -func (m *AddMemberRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddMemberRequest.Merge(m, src) -} -func (m *AddMemberRequest) XXX_Size() int { - return xxx_messageInfo_AddMemberRequest.Size(m) -} -func (m *AddMemberRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AddMemberRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_AddMemberRequest proto.InternalMessageInfo - -func (m *AddMemberRequest) GetGroupId() string { - if m != nil { - return m.GroupId +func (x *AddMemberRequest) GetGroupId() string { + if x != nil { + return x.GroupId } return "" } -func (m *AddMemberRequest) GetAccountId() string { - if m != nil { - return m.AccountId +func (x *AddMemberRequest) GetAccountId() string { + if x != nil { + return x.AccountId } return "" } type RemoveMemberRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The id of the group to remove a member from GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // The account id to remove - AccountId string `protobuf:"bytes,2,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + AccountId string `protobuf:"bytes,2,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` } -func (m *RemoveMemberRequest) Reset() { *m = RemoveMemberRequest{} } -func (m *RemoveMemberRequest) String() string { return proto.CompactTextString(m) } -func (*RemoveMemberRequest) ProtoMessage() {} +func (x *RemoveMemberRequest) Reset() { + *x = RemoveMemberRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoveMemberRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveMemberRequest) ProtoMessage() {} + +func (x *RemoveMemberRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveMemberRequest.ProtoReflect.Descriptor instead. func (*RemoveMemberRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{16} + return file_accounts_proto_rawDescGZIP(), []int{18} } -func (m *RemoveMemberRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RemoveMemberRequest.Unmarshal(m, b) -} -func (m *RemoveMemberRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RemoveMemberRequest.Marshal(b, m, deterministic) -} -func (m *RemoveMemberRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveMemberRequest.Merge(m, src) -} -func (m *RemoveMemberRequest) XXX_Size() int { - return xxx_messageInfo_RemoveMemberRequest.Size(m) -} -func (m *RemoveMemberRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveMemberRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_RemoveMemberRequest proto.InternalMessageInfo - -func (m *RemoveMemberRequest) GetGroupId() string { - if m != nil { - return m.GroupId +func (x *RemoveMemberRequest) GetGroupId() string { + if x != nil { + return x.GroupId } return "" } -func (m *RemoveMemberRequest) GetAccountId() string { - if m != nil { - return m.AccountId +func (x *RemoveMemberRequest) GetAccountId() string { + if x != nil { + return x.AccountId } return "" } type ListMembersRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // Optional. A pagination token returned from a previous call to `Get` // that indicates from where search should continue @@ -1244,132 +1465,148 @@ type ListMembersRequest struct { // display names that include both "Test" and "String" Query string `protobuf:"bytes,4,opt,name=query,proto3" json:"query,omitempty"` // The id of the group to list members from - Id string `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Id string `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"` } -func (m *ListMembersRequest) Reset() { *m = ListMembersRequest{} } -func (m *ListMembersRequest) String() string { return proto.CompactTextString(m) } -func (*ListMembersRequest) ProtoMessage() {} +func (x *ListMembersRequest) Reset() { + *x = ListMembersRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListMembersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListMembersRequest) ProtoMessage() {} + +func (x *ListMembersRequest) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListMembersRequest.ProtoReflect.Descriptor instead. func (*ListMembersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{17} + return file_accounts_proto_rawDescGZIP(), []int{19} } -func (m *ListMembersRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListMembersRequest.Unmarshal(m, b) -} -func (m *ListMembersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListMembersRequest.Marshal(b, m, deterministic) -} -func (m *ListMembersRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListMembersRequest.Merge(m, src) -} -func (m *ListMembersRequest) XXX_Size() int { - return xxx_messageInfo_ListMembersRequest.Size(m) -} -func (m *ListMembersRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListMembersRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListMembersRequest proto.InternalMessageInfo - -func (m *ListMembersRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize +func (x *ListMembersRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize } return 0 } -func (m *ListMembersRequest) GetPageToken() string { - if m != nil { - return m.PageToken +func (x *ListMembersRequest) GetPageToken() string { + if x != nil { + return x.PageToken } return "" } -func (m *ListMembersRequest) GetFieldMask() *field_mask.FieldMask { - if m != nil { - return m.FieldMask +func (x *ListMembersRequest) GetFieldMask() *field_mask.FieldMask { + if x != nil { + return x.FieldMask } return nil } -func (m *ListMembersRequest) GetQuery() string { - if m != nil { - return m.Query +func (x *ListMembersRequest) GetQuery() string { + if x != nil { + return x.Query } return "" } -func (m *ListMembersRequest) GetId() string { - if m != nil { - return m.Id +func (x *ListMembersRequest) GetId() string { + if x != nil { + return x.Id } return "" } type ListMembersResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The field name should match the noun "members" in the method name. There // will be a maximum number of items returned based on the page_size field // in the request Members []*Account `protobuf:"bytes,1,rep,name=members,proto3" json:"members,omitempty"` // Token to retrieve the next page of results, or empty if there are no // more results in the list - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` } -func (m *ListMembersResponse) Reset() { *m = ListMembersResponse{} } -func (m *ListMembersResponse) String() string { return proto.CompactTextString(m) } -func (*ListMembersResponse) ProtoMessage() {} +func (x *ListMembersResponse) Reset() { + *x = ListMembersResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListMembersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListMembersResponse) ProtoMessage() {} + +func (x *ListMembersResponse) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListMembersResponse.ProtoReflect.Descriptor instead. func (*ListMembersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{18} + return file_accounts_proto_rawDescGZIP(), []int{20} } -func (m *ListMembersResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListMembersResponse.Unmarshal(m, b) -} -func (m *ListMembersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListMembersResponse.Marshal(b, m, deterministic) -} -func (m *ListMembersResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListMembersResponse.Merge(m, src) -} -func (m *ListMembersResponse) XXX_Size() int { - return xxx_messageInfo_ListMembersResponse.Size(m) -} -func (m *ListMembersResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListMembersResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListMembersResponse proto.InternalMessageInfo - -func (m *ListMembersResponse) GetMembers() []*Account { - if m != nil { - return m.Members +func (x *ListMembersResponse) GetMembers() []*Account { + if x != nil { + return x.Members } return nil } -func (m *ListMembersResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken +func (x *ListMembersResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken } return "" } type Group struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // The unique identifier for the group. // Returned by default. Inherited from directoryObject. Key. Not nullable. Read-only. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The display name for the group. This property is required when a group is created and cannot be cleared during updates. // Returned by default. Supports $filter and $orderby. // groupofnames MUST cn - DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` // groupofnames MUST/MAY member // Users, contacts, and groups that are members of this group. HTTP Methods: GET (supported for all groups), POST (supported for security groups and mail-enabled security groups), DELETE (supported only for security groups) Read-only. Nullable. // TODO accounts (users) only for now, we can add groups with the dedicated message using oneof construct later Members []*Account `protobuf:"bytes,3,rep,name=members,proto3" json:"members,omitempty"` @@ -1429,177 +1666,185 @@ type Group struct { OnPremisesLastSyncDateTime string `protobuf:"bytes,27,opt,name=on_premises_last_sync_date_time,json=onPremisesLastSyncDateTime,proto3" json:"on_premises_last_sync_date_time,omitempty"` // Errors when using synchronization during provisioning. OnPremisesProvisioningErrors []*OnPremisesProvisioningError `protobuf:"bytes,28,rep,name=on_premises_provisioning_errors,json=onPremisesProvisioningErrors,proto3" json:"on_premises_provisioning_errors,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 (x *Group) Reset() { + *x = Group{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Group) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Group) ProtoMessage() {} + +func (x *Group) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Group.ProtoReflect.Descriptor instead. func (*Group) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{19} + return file_accounts_proto_rawDescGZIP(), []int{21} } -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 +func (x *Group) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *Group) GetDisplayName() string { - if m != nil { - return m.DisplayName +func (x *Group) GetDisplayName() string { + if x != nil { + return x.DisplayName } return "" } -func (m *Group) GetMembers() []*Account { - if m != nil { - return m.Members +func (x *Group) GetMembers() []*Account { + if x != nil { + return x.Members } return nil } -func (m *Group) GetOwners() []*Account { - if m != nil { - return m.Owners +func (x *Group) GetOwners() []*Account { + if x != nil { + return x.Owners } return nil } -func (m *Group) GetDescription() string { - if m != nil { - return m.Description +func (x *Group) GetDescription() string { + if x != nil { + return x.Description } return "" } -func (m *Group) GetGidNumber() int64 { - if m != nil { - return m.GidNumber +func (x *Group) GetGidNumber() int64 { + if x != nil { + return x.GidNumber } return 0 } -func (m *Group) GetCreatedDateTime() *timestamp.Timestamp { - if m != nil { - return m.CreatedDateTime +func (x *Group) GetCreatedDateTime() *timestamp.Timestamp { + if x != nil { + return x.CreatedDateTime } return nil } -func (m *Group) GetDeletedDateTime() *timestamp.Timestamp { - if m != nil { - return m.DeletedDateTime +func (x *Group) GetDeletedDateTime() *timestamp.Timestamp { + if x != nil { + return x.DeletedDateTime } return nil } -func (m *Group) GetExpirationDateTime() *timestamp.Timestamp { - if m != nil { - return m.ExpirationDateTime +func (x *Group) GetExpirationDateTime() *timestamp.Timestamp { + if x != nil { + return x.ExpirationDateTime } return nil } -func (m *Group) GetHideFromAddressLists() bool { - if m != nil { - return m.HideFromAddressLists +func (x *Group) GetHideFromAddressLists() bool { + if x != nil { + return x.HideFromAddressLists } return false } -func (m *Group) GetVisibility() string { - if m != nil { - return m.Visibility +func (x *Group) GetVisibility() string { + if x != nil { + return x.Visibility } return "" } -func (m *Group) GetOnPremisesSyncEnabled() bool { - if m != nil { - return m.OnPremisesSyncEnabled +func (x *Group) GetOnPremisesSyncEnabled() bool { + if x != nil { + return x.OnPremisesSyncEnabled } return false } -func (m *Group) GetOnPremisesImmutableId() string { - if m != nil { - return m.OnPremisesImmutableId +func (x *Group) GetOnPremisesImmutableId() string { + if x != nil { + return x.OnPremisesImmutableId } return "" } -func (m *Group) GetOnPremisesSecurityIdentifier() string { - if m != nil { - return m.OnPremisesSecurityIdentifier +func (x *Group) GetOnPremisesSecurityIdentifier() string { + if x != nil { + return x.OnPremisesSecurityIdentifier } return "" } -func (m *Group) GetOnPremisesDistinguishedName() string { - if m != nil { - return m.OnPremisesDistinguishedName +func (x *Group) GetOnPremisesDistinguishedName() string { + if x != nil { + return x.OnPremisesDistinguishedName } return "" } -func (m *Group) GetOnPremisesSamAccountName() string { - if m != nil { - return m.OnPremisesSamAccountName +func (x *Group) GetOnPremisesSamAccountName() string { + if x != nil { + return x.OnPremisesSamAccountName } return "" } -func (m *Group) GetOnPremisesDomainName() string { - if m != nil { - return m.OnPremisesDomainName +func (x *Group) GetOnPremisesDomainName() string { + if x != nil { + return x.OnPremisesDomainName } return "" } -func (m *Group) GetOnPremisesNetBiosName() string { - if m != nil { - return m.OnPremisesNetBiosName +func (x *Group) GetOnPremisesNetBiosName() string { + if x != nil { + return x.OnPremisesNetBiosName } return "" } -func (m *Group) GetOnPremisesLastSyncDateTime() string { - if m != nil { - return m.OnPremisesLastSyncDateTime +func (x *Group) GetOnPremisesLastSyncDateTime() string { + if x != nil { + return x.OnPremisesLastSyncDateTime } return "" } -func (m *Group) GetOnPremisesProvisioningErrors() []*OnPremisesProvisioningError { - if m != nil { - return m.OnPremisesProvisioningErrors +func (x *Group) GetOnPremisesProvisioningErrors() []*OnPremisesProvisioningError { + if x != nil { + return x.OnPremisesProvisioningErrors } return nil } type OnPremisesProvisioningError struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + // Category of the provisioning error. Note: Currently, there is only one possible value. Possible value: PropertyConflict - indicates a property value is not unique. Other objects contain the same value for the property. Category string `protobuf:"bytes,1,opt,name=category,proto3" json:"category,omitempty"` // The date and time at which the error occurred. @@ -1607,215 +1852,915 @@ type OnPremisesProvisioningError struct { // Name of the directory property causing the error. Current possible values: UserPrincipalName or ProxyAddress PropertyCausingError string `protobuf:"bytes,3,opt,name=property_causing_error,json=propertyCausingError,proto3" json:"property_causing_error,omitempty"` // Value of the property causing the error. - Value string `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Value string `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"` } -func (m *OnPremisesProvisioningError) Reset() { *m = OnPremisesProvisioningError{} } -func (m *OnPremisesProvisioningError) String() string { return proto.CompactTextString(m) } -func (*OnPremisesProvisioningError) ProtoMessage() {} +func (x *OnPremisesProvisioningError) Reset() { + *x = OnPremisesProvisioningError{} + if protoimpl.UnsafeEnabled { + mi := &file_accounts_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnPremisesProvisioningError) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnPremisesProvisioningError) ProtoMessage() {} + +func (x *OnPremisesProvisioningError) ProtoReflect() protoreflect.Message { + mi := &file_accounts_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnPremisesProvisioningError.ProtoReflect.Descriptor instead. func (*OnPremisesProvisioningError) Descriptor() ([]byte, []int) { - return fileDescriptor_e1e7723af4c007b7, []int{20} + return file_accounts_proto_rawDescGZIP(), []int{22} } -func (m *OnPremisesProvisioningError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_OnPremisesProvisioningError.Unmarshal(m, b) -} -func (m *OnPremisesProvisioningError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_OnPremisesProvisioningError.Marshal(b, m, deterministic) -} -func (m *OnPremisesProvisioningError) XXX_Merge(src proto.Message) { - xxx_messageInfo_OnPremisesProvisioningError.Merge(m, src) -} -func (m *OnPremisesProvisioningError) XXX_Size() int { - return xxx_messageInfo_OnPremisesProvisioningError.Size(m) -} -func (m *OnPremisesProvisioningError) XXX_DiscardUnknown() { - xxx_messageInfo_OnPremisesProvisioningError.DiscardUnknown(m) -} - -var xxx_messageInfo_OnPremisesProvisioningError proto.InternalMessageInfo - -func (m *OnPremisesProvisioningError) GetCategory() string { - if m != nil { - return m.Category +func (x *OnPremisesProvisioningError) GetCategory() string { + if x != nil { + return x.Category } return "" } -func (m *OnPremisesProvisioningError) GetOccurredDateTime() *timestamp.Timestamp { - if m != nil { - return m.OccurredDateTime +func (x *OnPremisesProvisioningError) GetOccurredDateTime() *timestamp.Timestamp { + if x != nil { + return x.OccurredDateTime } return nil } -func (m *OnPremisesProvisioningError) GetPropertyCausingError() string { - if m != nil { - return m.PropertyCausingError +func (x *OnPremisesProvisioningError) GetPropertyCausingError() string { + if x != nil { + return x.PropertyCausingError } return "" } -func (m *OnPremisesProvisioningError) GetValue() string { - if m != nil { - return m.Value +func (x *OnPremisesProvisioningError) GetValue() string { + if x != nil { + return x.Value } return "" } -func init() { - proto.RegisterType((*ListAccountsRequest)(nil), "settings.ListAccountsRequest") - proto.RegisterType((*ListAccountsResponse)(nil), "settings.ListAccountsResponse") - proto.RegisterType((*GetAccountRequest)(nil), "settings.GetAccountRequest") - proto.RegisterType((*CreateAccountRequest)(nil), "settings.CreateAccountRequest") - proto.RegisterType((*UpdateAccountRequest)(nil), "settings.UpdateAccountRequest") - proto.RegisterType((*DeleteAccountRequest)(nil), "settings.DeleteAccountRequest") - proto.RegisterType((*Account)(nil), "settings.Account") - proto.RegisterType((*Identities)(nil), "settings.Identities") - proto.RegisterType((*PasswordProfile)(nil), "settings.PasswordProfile") - proto.RegisterType((*ListGroupsRequest)(nil), "settings.ListGroupsRequest") - proto.RegisterType((*ListGroupsResponse)(nil), "settings.ListGroupsResponse") - proto.RegisterType((*GetGroupRequest)(nil), "settings.GetGroupRequest") - proto.RegisterType((*CreateGroupRequest)(nil), "settings.CreateGroupRequest") - proto.RegisterType((*UpdateGroupRequest)(nil), "settings.UpdateGroupRequest") - proto.RegisterType((*DeleteGroupRequest)(nil), "settings.DeleteGroupRequest") - proto.RegisterType((*AddMemberRequest)(nil), "settings.AddMemberRequest") - proto.RegisterType((*RemoveMemberRequest)(nil), "settings.RemoveMemberRequest") - proto.RegisterType((*ListMembersRequest)(nil), "settings.ListMembersRequest") - proto.RegisterType((*ListMembersResponse)(nil), "settings.ListMembersResponse") - proto.RegisterType((*Group)(nil), "settings.Group") - proto.RegisterType((*OnPremisesProvisioningError)(nil), "settings.OnPremisesProvisioningError") +var File_accounts_proto protoreflect.FileDescriptor + +var file_accounts_proto_rawDesc = []byte{ + 0x0a, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, + 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, + 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb1, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, + 0x6b, 0x12, 0x19, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x6d, 0x0a, 0x14, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, + 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x23, 0x0a, 0x11, 0x47, + 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x22, 0x43, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x80, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, + 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x26, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x22, 0x88, 0x0d, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x69, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x69, + 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x75, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x69, 0x64, + 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x67, + 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x61, 0x69, 0x6c, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x20, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, + 0x0a, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, + 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4f, + 0x66, 0x12, 0x46, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x11, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x37, 0x0a, 0x18, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, + 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x14, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x15, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x53, + 0x79, 0x6e, 0x63, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x18, 0x6f, 0x6e, + 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x69, 0x6d, 0x6d, 0x75, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6f, 0x6e, + 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x1f, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x73, + 0x65, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x6f, 0x6e, + 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x1e, 0x6f, 0x6e, + 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x75, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x1b, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x44, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x3e, 0x0a, 0x1c, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x73, + 0x61, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, + 0x73, 0x53, 0x61, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x35, 0x0a, 0x17, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x14, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x1f, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, + 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x63, + 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x1b, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x55, 0x73, 0x65, 0x72, 0x50, + 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x1f, + 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x1a, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x4c, 0x61, 0x73, + 0x74, 0x53, 0x79, 0x6e, 0x63, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x6c, 0x0a, + 0x1f, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x2e, 0x4f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x1c, 0x6f, + 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x69, 0x0a, 0x24, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x1f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x55, + 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x67, 0x0a, 0x23, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x66, + 0x72, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x1e, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x6a, 0x0a, 0x25, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x1f, 0x73, 0x69, 0x67, 0x6e, + 0x49, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x46, + 0x72, 0x6f, 0x6d, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x73, 0x69, 0x67, + 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x49, + 0x64, 0x22, 0xe0, 0x02, 0x0a, 0x0f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x12, 0x5e, 0x0a, 0x1e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x49, + 0x0a, 0x22, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x69, 0x67, + 0x6e, 0x5f, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4e, + 0x65, 0x78, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x12, 0x59, 0x0a, 0x2b, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x66, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x24, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x57, 0x69, 0x74, + 0x68, 0x4d, 0x66, 0x61, 0x22, 0xaf, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, + 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, + 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x0a, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x65, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x06, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x21, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x22, 0x3b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x78, 0x0a, + 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x24, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4c, 0x0a, + 0x10, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x4f, 0x0a, 0x13, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xc0, 0x01, 0x0a, + 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, + 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, + 0x6a, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, + 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xea, 0x08, 0x0a, 0x05, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x69, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x67, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x46, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x11, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x4c, 0x0a, 0x14, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x35, 0x0a, 0x17, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x14, 0x68, 0x69, 0x64, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x18, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, + 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, + 0x69, 0x73, 0x65, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x37, 0x0a, 0x18, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x69, + 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x49, 0x6d, 0x6d, + 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x1f, 0x6f, 0x6e, 0x5f, 0x70, + 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x16, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x1c, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x53, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, + 0x43, 0x0a, 0x1e, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x64, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, + 0x73, 0x65, 0x73, 0x44, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, 0x65, 0x64, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x1c, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, + 0x73, 0x65, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x6f, 0x6e, 0x50, 0x72, + 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x53, 0x61, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x17, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, + 0x73, 0x65, 0x73, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, + 0x73, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x19, 0x6f, + 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x62, + 0x69, 0x6f, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x4e, 0x65, 0x74, 0x42, 0x69, 0x6f, + 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x1f, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x6d, + 0x69, 0x73, 0x65, 0x73, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, + 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x79, + 0x6e, 0x63, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x6c, 0x0a, 0x1f, 0x6f, 0x6e, + 0x5f, 0x70, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x1c, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x4f, + 0x6e, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x1c, 0x6f, 0x6e, 0x50, 0x72, + 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x6e, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x1b, 0x4f, 0x6e, 0x50, + 0x72, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x6e, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x64, + 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x6f, 0x63, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x34, + 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x5f, 0x63, 0x61, 0x75, 0x73, 0x69, + 0x6e, 0x67, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x43, 0x61, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x32, 0xcb, 0x04, 0x0a, 0x0f, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x78, + 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x1d, + 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x1e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x66, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x22, 0x1d, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2d, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, + 0x12, 0x6f, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1e, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x12, 0x6f, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x12, 0x74, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2d, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x32, 0x90, 0x07, 0x0a, 0x0d, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x70, 0x0a, 0x0a, 0x4c, 0x69, + 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x5e, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2d, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1c, 0x2e, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x23, 0x22, 0x1e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2d, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x67, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1c, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x1e, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x2d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6e, + 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1c, 0x2e, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x1e, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x2d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6d, + 0x0a, 0x09, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1a, 0x2e, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, + 0x22, 0x28, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, + 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x3d, 0x2a, 0x7d, 0x2f, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x01, 0x2a, 0x12, 0x80, 0x01, + 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, + 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x40, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x22, 0x35, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, + 0x3d, 0x2a, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x01, 0x2a, + 0x12, 0x79, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, + 0x1c, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x3d, 0x2a, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x2f, 0x24, 0x72, 0x65, 0x66, 0x3a, 0x01, 0x2a, 0x32, 0x7f, 0x0a, 0x0c, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6f, 0x0a, 0x0c, 0x52, + 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1d, 0x2e, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x3a, 0x01, 0x2a, 0x42, 0x14, 0x5a, 0x12, + 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x30, 0x3b, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } -func init() { proto.RegisterFile("accounts.proto", fileDescriptor_e1e7723af4c007b7) } +var ( + file_accounts_proto_rawDescOnce sync.Once + file_accounts_proto_rawDescData = file_accounts_proto_rawDesc +) -var fileDescriptor_e1e7723af4c007b7 = []byte{ - // 1980 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xdd, 0x6e, 0x1b, 0xc7, - 0x15, 0x06, 0x45, 0x53, 0x22, 0x0f, 0x25, 0x4b, 0x1a, 0x33, 0xf6, 0x8a, 0xfa, 0x31, 0xbd, 0xb6, - 0x6c, 0xd9, 0xaa, 0xa5, 0xc0, 0x89, 0xd1, 0xd6, 0x6e, 0x8a, 0xca, 0x92, 0xed, 0x12, 0xf0, 0x8f, - 0x40, 0x39, 0x2d, 0xda, 0x8b, 0x2c, 0x56, 0xdc, 0x21, 0x35, 0x31, 0xf7, 0x27, 0x33, 0xb3, 0xb2, - 0x98, 0x20, 0x40, 0xd0, 0xab, 0x5e, 0x16, 0xe8, 0x83, 0x14, 0x7d, 0x83, 0xde, 0xf7, 0xa2, 0x17, - 0x7d, 0x81, 0x5c, 0xf4, 0xaa, 0x4f, 0x51, 0xcc, 0xdf, 0xee, 0x72, 0x97, 0x14, 0x1d, 0xdb, 0x40, - 0x11, 0x20, 0x57, 0xe2, 0xce, 0xf9, 0xce, 0xf9, 0xce, 0x9c, 0x39, 0x3b, 0xf3, 0xed, 0x08, 0x2e, - 0xba, 0xdd, 0x6e, 0x18, 0x07, 0x9c, 0xed, 0x44, 0x34, 0xe4, 0x21, 0xaa, 0x32, 0xcc, 0x39, 0x09, - 0xfa, 0xac, 0x79, 0xb5, 0x1f, 0x86, 0xfd, 0x01, 0xde, 0x75, 0x23, 0xb2, 0xdb, 0x23, 0x78, 0xe0, - 0x39, 0xc7, 0xf8, 0xc4, 0x3d, 0x25, 0x21, 0x55, 0xd0, 0xe6, 0x5a, 0x06, 0xe0, 0x06, 0x41, 0xc8, - 0x5d, 0x4e, 0xc2, 0x40, 0x07, 0x6a, 0xae, 0x6a, 0xab, 0x7c, 0x3a, 0x8e, 0x7b, 0xbb, 0xd8, 0x8f, - 0xf8, 0x50, 0x1b, 0x5b, 0x79, 0xa3, 0x22, 0xf0, 0x5d, 0xf6, 0x5a, 0x23, 0xae, 0xe6, 0x11, 0x9c, - 0xf8, 0x98, 0x71, 0xd7, 0x8f, 0x14, 0xc0, 0xfe, 0x7b, 0x09, 0x2e, 0x3d, 0x23, 0x8c, 0xef, 0xe9, - 0xfc, 0x3b, 0xf8, 0xab, 0x18, 0x33, 0x8e, 0x5a, 0x50, 0x8b, 0xdc, 0x3e, 0x76, 0x18, 0xf9, 0x1a, - 0x5b, 0xa5, 0x56, 0x69, 0xab, 0xf2, 0xa8, 0xfc, 0xfd, 0x5e, 0xa9, 0x53, 0x15, 0xa3, 0x47, 0xe4, - 0x6b, 0x8c, 0x6c, 0x00, 0x89, 0xe0, 0xe1, 0x6b, 0x1c, 0x58, 0x33, 0xad, 0xd2, 0x56, 0x4d, 0x41, - 0xa4, 0xe3, 0x2b, 0x31, 0x8a, 0x7e, 0x09, 0x90, 0xa6, 0x64, 0x95, 0x5b, 0xa5, 0xad, 0xfa, 0xbd, - 0xe6, 0x8e, 0xca, 0x69, 0xc7, 0xe4, 0xb4, 0xf3, 0x44, 0x40, 0x9e, 0xbb, 0xec, 0x75, 0xa7, 0xd6, - 0x33, 0x3f, 0xd1, 0x0a, 0x54, 0xbe, 0x8a, 0x31, 0x1d, 0x5a, 0x17, 0xd2, 0xc8, 0x6a, 0xc4, 0xf6, - 0xa1, 0x31, 0x9a, 0x32, 0x8b, 0xc2, 0x80, 0x61, 0x74, 0x17, 0xaa, 0x66, 0x19, 0xac, 0x52, 0xab, - 0xbc, 0x55, 0xbf, 0xb7, 0xbc, 0x63, 0xd6, 0x61, 0x47, 0xa3, 0x3b, 0x09, 0x04, 0xdd, 0x84, 0xc5, - 0x00, 0x9f, 0x71, 0x27, 0x3f, 0x8b, 0xce, 0x82, 0x18, 0x3e, 0x34, 0x93, 0xb0, 0xaf, 0xc3, 0xf2, - 0x53, 0x6c, 0xd8, 0x4c, 0x7d, 0x2e, 0xc2, 0x0c, 0xf1, 0x64, 0x61, 0x6a, 0x9d, 0x19, 0xe2, 0xd9, - 0xfb, 0xd0, 0xd8, 0xa7, 0xd8, 0xe5, 0x38, 0x87, 0xdb, 0x86, 0x39, 0x4d, 0x28, 0xc1, 0x63, 0x53, - 0x32, 0x08, 0xfb, 0xbb, 0x12, 0x34, 0x3e, 0x8f, 0xbc, 0xf7, 0x8b, 0x82, 0x1e, 0x42, 0x3d, 0x96, - 0x41, 0x54, 0xd5, 0x67, 0xa6, 0x56, 0x1d, 0x14, 0x5c, 0xfc, 0xb6, 0x6f, 0x42, 0xe3, 0x00, 0x0f, - 0x70, 0x21, 0x83, 0xfc, 0x7c, 0xff, 0xbc, 0x00, 0x73, 0x1a, 0x92, 0xb7, 0xa1, 0x5b, 0xb0, 0xa8, - 0x73, 0x71, 0x70, 0xe0, 0x1e, 0x0f, 0xb0, 0x27, 0x93, 0xa8, 0x76, 0xcc, 0x5b, 0xf2, 0x58, 0x8d, - 0xa2, 0x1d, 0xb8, 0x44, 0x98, 0x43, 0x31, 0x0b, 0x63, 0xda, 0xc5, 0x8e, 0x99, 0x62, 0x59, 0x82, - 0x97, 0x89, 0x58, 0x59, 0x69, 0x31, 0x44, 0xd7, 0x61, 0xa1, 0x2b, 0x8a, 0x4c, 0xc2, 0xc0, 0xe1, - 0xc3, 0x08, 0xab, 0xde, 0xe8, 0xcc, 0x9b, 0xc1, 0x57, 0xc3, 0x08, 0xa3, 0x4f, 0x01, 0x88, 0x87, - 0x03, 0x4e, 0x38, 0xc1, 0xcc, 0xaa, 0xc8, 0x3e, 0x68, 0xa4, 0xe5, 0x6a, 0x27, 0xb6, 0x4e, 0x06, - 0x87, 0xae, 0xc1, 0xbc, 0x47, 0x58, 0x34, 0x70, 0x87, 0x4e, 0xe0, 0xfa, 0xd8, 0x9a, 0x95, 0x91, - 0xeb, 0x7a, 0xec, 0x85, 0xeb, 0x63, 0xb4, 0x09, 0x17, 0x23, 0x8a, 0x7b, 0x98, 0x52, 0xec, 0x29, - 0xd0, 0x9c, 0x6a, 0x97, 0x64, 0x54, 0xc2, 0xd6, 0x01, 0x62, 0xe2, 0x39, 0x41, 0xec, 0x1f, 0x63, - 0x6a, 0x55, 0x5b, 0xa5, 0xad, 0x72, 0xa7, 0x16, 0x13, 0xef, 0x85, 0x1c, 0x10, 0xe6, 0x7e, 0x6a, - 0xae, 0x29, 0x73, 0x3f, 0x31, 0x23, 0xb8, 0xe0, 0xbb, 0x64, 0x60, 0x81, 0x0c, 0x2d, 0x7f, 0xa3, - 0x16, 0xd4, 0x3d, 0xcc, 0xba, 0x94, 0x44, 0x62, 0x92, 0x56, 0x5d, 0xa7, 0x96, 0x0e, 0xa1, 0x03, - 0x58, 0x8a, 0x5c, 0xc6, 0xde, 0x84, 0xd4, 0x73, 0x22, 0x1a, 0xf6, 0xc8, 0x00, 0x5b, 0xf3, 0x72, - 0xdd, 0x57, 0xd2, 0x99, 0x1f, 0x6a, 0xc4, 0xa1, 0x02, 0x74, 0x16, 0xa3, 0xd1, 0x01, 0xb4, 0x0d, - 0x55, 0x1f, 0x8b, 0x2c, 0x5e, 0xf6, 0xac, 0x05, 0x59, 0xb7, 0xc5, 0xd4, 0xfb, 0x29, 0x0d, 0xe3, - 0xa8, 0x93, 0x00, 0xd0, 0x13, 0x58, 0x96, 0x65, 0xc7, 0x9e, 0x23, 0x7b, 0x4d, 0x6c, 0x2c, 0xd6, - 0xd2, 0x84, 0x5e, 0x7b, 0x65, 0x76, 0x9d, 0xce, 0xa2, 0x76, 0x3a, 0x70, 0x39, 0x16, 0xa3, 0x22, - 0x8e, 0x27, 0x1b, 0x2e, 0x1b, 0x67, 0x79, 0x7a, 0x1c, 0xed, 0x94, 0xc4, 0xf9, 0x39, 0x58, 0x61, - 0xe0, 0x44, 0x14, 0xfb, 0x84, 0x61, 0xe6, 0xb0, 0x61, 0xd0, 0x4d, 0xba, 0xaf, 0x21, 0x1b, 0xea, - 0xa3, 0x30, 0x38, 0xd4, 0xe6, 0xa3, 0x61, 0xd0, 0x35, 0x4d, 0x98, 0x73, 0x24, 0xbe, 0x1f, 0x73, - 0x61, 0x71, 0x88, 0x67, 0x7d, 0x24, 0x4b, 0x9d, 0x71, 0x6c, 0x1b, 0x6b, 0xdb, 0x43, 0x8f, 0xe1, - 0xea, 0x08, 0x23, 0xee, 0xc6, 0x94, 0xf0, 0xa1, 0xa3, 0xba, 0xaa, 0x47, 0x30, 0xb5, 0x2e, 0x4b, - 0xff, 0xb5, 0x0c, 0xb1, 0x06, 0xb5, 0x13, 0x0c, 0xda, 0x87, 0x8d, 0x6c, 0x18, 0x8f, 0x30, 0x51, - 0xf0, 0x98, 0xb0, 0x13, 0xd3, 0x66, 0x57, 0x64, 0x94, 0xd5, 0x34, 0xca, 0x41, 0x16, 0x23, 0x9b, - 0xee, 0xd7, 0xb0, 0x36, 0x92, 0x8b, 0xeb, 0x9b, 0xb7, 0x49, 0x85, 0xb0, 0x64, 0x08, 0x2b, 0x93, - 0x88, 0xeb, 0xeb, 0xb7, 0x4a, 0xfa, 0xdf, 0x87, 0x2b, 0x23, 0x49, 0x84, 0xbe, 0x4b, 0x02, 0xe5, - 0xba, 0x22, 0x5d, 0x1b, 0x19, 0x76, 0x69, 0x94, 0x6e, 0x07, 0xa3, 0x25, 0x88, 0x19, 0xa6, 0x4e, - 0x44, 0x49, 0xd0, 0x25, 0x91, 0x3b, 0x50, 0xee, 0xcd, 0x7c, 0xf2, 0x9f, 0x33, 0x4c, 0x0f, 0x0d, - 0x46, 0x46, 0x71, 0x46, 0xa3, 0x0c, 0x5c, 0xc6, 0xd5, 0xfa, 0xa5, 0x0d, 0xb1, 0x36, 0xb5, 0x21, - 0x9a, 0x29, 0xc3, 0x33, 0x97, 0x71, 0xb1, 0xc2, 0x49, 0x6f, 0x0c, 0x46, 0x09, 0x22, 0x1a, 0x9e, - 0x12, 0x46, 0xc2, 0x80, 0x04, 0x7d, 0x07, 0x53, 0x1a, 0x52, 0x66, 0xad, 0xcb, 0x7e, 0xdf, 0x4c, - 0xfb, 0xfd, 0x65, 0x12, 0xee, 0x30, 0x03, 0x7f, 0x2c, 0xd0, 0xd9, 0x05, 0x2d, 0x18, 0x99, 0xd8, - 0xd5, 0xf0, 0x19, 0xc7, 0x34, 0x70, 0x07, 0xaa, 0x22, 0x8c, 0xbb, 0x1c, 0x5b, 0x5b, 0xb2, 0x10, - 0xcb, 0xc6, 0x24, 0xca, 0x70, 0x24, 0x0c, 0x88, 0xc0, 0x8d, 0x31, 0x78, 0xa7, 0x7b, 0xe2, 0x06, - 0x7d, 0x9c, 0xa9, 0xc1, 0xed, 0xa9, 0x35, 0xb8, 0x5a, 0x08, 0xbe, 0x2f, 0x83, 0x24, 0x85, 0xe8, - 0xc3, 0x75, 0x8a, 0x7b, 0x14, 0xb3, 0x13, 0x75, 0xe0, 0x31, 0xe7, 0xd4, 0x1d, 0x10, 0xcf, 0xe9, - 0xd1, 0xd0, 0xcf, 0x30, 0xfd, 0x6a, 0x2a, 0xd3, 0x86, 0x0e, 0x23, 0x4f, 0x48, 0xf6, 0x3b, 0x11, - 0xe4, 0x09, 0x0d, 0xfd, 0x84, 0xe8, 0x4b, 0xd8, 0x64, 0xa4, 0x1f, 0x38, 0x24, 0x70, 0x18, 0x66, - 0xa2, 0x3e, 0x13, 0xa8, 0x3e, 0x9b, 0x3e, 0x29, 0x11, 0xa8, 0x1d, 0x1c, 0xe9, 0x30, 0x05, 0x2e, - 0x9b, 0x03, 0xa4, 0x9b, 0x3a, 0x6a, 0xc1, 0xbc, 0x61, 0x96, 0x47, 0x84, 0x3a, 0x96, 0x40, 0x05, - 0x91, 0x07, 0xc4, 0x65, 0x98, 0x25, 0x8c, 0xc5, 0x98, 0xea, 0xe3, 0x5e, 0x3f, 0xa1, 0x9f, 0x01, - 0x52, 0xbf, 0x1c, 0x97, 0x09, 0x38, 0xf6, 0xc4, 0x16, 0x50, 0x96, 0x98, 0x25, 0x65, 0xd9, 0xd3, - 0x86, 0xb6, 0x67, 0x7f, 0x3f, 0x03, 0x8b, 0xb9, 0x1d, 0x15, 0x35, 0xa1, 0x6a, 0xf6, 0x54, 0xcd, - 0x9b, 0x3c, 0xa3, 0x2f, 0x60, 0x43, 0x36, 0x76, 0xb2, 0x4f, 0x17, 0xd6, 0x77, 0x66, 0x7a, 0x8f, - 0x8b, 0x08, 0x86, 0x34, 0xb7, 0xb4, 0xdb, 0xb0, 0x9c, 0x1e, 0x01, 0xe1, 0x80, 0x74, 0xc5, 0xe9, - 0x57, 0x6e, 0x95, 0x45, 0xf2, 0xc9, 0x46, 0xaf, 0xc7, 0x51, 0x1b, 0xec, 0x5e, 0x28, 0x8e, 0x5c, - 0x9d, 0x44, 0xe2, 0x29, 0x05, 0x91, 0xae, 0x9f, 0x3c, 0x5d, 0xab, 0x9d, 0x75, 0x89, 0x54, 0x6c, - 0x86, 0xfb, 0x05, 0x3e, 0xe3, 0x47, 0xb2, 0xa2, 0xe8, 0x0f, 0xb0, 0x3d, 0x3d, 0x94, 0xf3, 0x86, - 0xf0, 0x13, 0xc7, 0xef, 0xb9, 0x56, 0x45, 0xc6, 0xbc, 0x71, 0x6e, 0xcc, 0xdf, 0x13, 0x7e, 0xf2, - 0xbc, 0xe7, 0xda, 0x7f, 0x2b, 0xc1, 0xb2, 0x10, 0x7a, 0xf2, 0xe8, 0xf9, 0x51, 0x28, 0x53, 0x0c, - 0x28, 0x9b, 0xb0, 0xd6, 0xa5, 0xb7, 0x60, 0xb6, 0x2f, 0x47, 0xb4, 0x2a, 0x2d, 0x9c, 0xaa, 0xda, - 0xfc, 0xd6, 0x8a, 0xf4, 0x1a, 0x2c, 0x3e, 0xc5, 0x8a, 0x65, 0x92, 0x3e, 0x7b, 0x08, 0x48, 0xe9, - 0xd1, 0x11, 0xd4, 0x26, 0x54, 0x24, 0x95, 0x56, 0x91, 0x85, 0x44, 0x94, 0xd5, 0x3e, 0x03, 0xa4, - 0x64, 0xe8, 0x3b, 0x38, 0xbf, 0x9f, 0xfc, 0xbc, 0x01, 0x48, 0xc9, 0xcf, 0x73, 0x27, 0xf7, 0x0c, - 0x96, 0xf6, 0x3c, 0xef, 0xb9, 0x94, 0x22, 0x06, 0xb3, 0x02, 0x55, 0xc9, 0xef, 0x24, 0xc8, 0x39, - 0xf9, 0xdc, 0xf6, 0x84, 0xe4, 0x32, 0x87, 0x21, 0xf1, 0x74, 0x45, 0x6b, 0x7a, 0xa4, 0xed, 0xd9, - 0x2f, 0xe1, 0x52, 0x07, 0xfb, 0xe1, 0x29, 0xfe, 0x50, 0x01, 0xff, 0x51, 0x52, 0x6d, 0xa0, 0xe2, - 0xfd, 0x18, 0x1a, 0x57, 0x57, 0xb8, 0x92, 0x54, 0xf8, 0x4b, 0xf5, 0x55, 0x98, 0xcc, 0x40, 0x77, - 0xf2, 0x36, 0xcc, 0x29, 0x01, 0x78, 0xce, 0x07, 0x96, 0x41, 0xbc, 0x75, 0x37, 0xff, 0xb7, 0x0a, - 0x15, 0xb9, 0xdc, 0x85, 0x0f, 0x89, 0xbc, 0x28, 0x9f, 0x29, 0x8a, 0xf2, 0x4c, 0x46, 0xe5, 0xa9, - 0x19, 0xdd, 0x86, 0xd9, 0xf0, 0x4d, 0x20, 0xb0, 0x17, 0x26, 0x61, 0x35, 0x20, 0xaf, 0xb9, 0x2b, - 0x45, 0xcd, 0x3d, 0x2a, 0xe4, 0x67, 0xf3, 0x42, 0x7e, 0xac, 0x3e, 0x9e, 0xfb, 0x40, 0xfa, 0xb8, - 0xfa, 0xc3, 0xf5, 0xf1, 0x33, 0x68, 0xe0, 0xb3, 0x88, 0x50, 0xf5, 0xf5, 0x94, 0x86, 0xaa, 0x4d, - 0x0d, 0x85, 0x52, 0xbf, 0x24, 0xda, 0x7d, 0xb8, 0x72, 0x42, 0x3c, 0xac, 0x4e, 0x73, 0xd7, 0xf3, - 0x28, 0x66, 0xcc, 0x19, 0x10, 0xc6, 0x99, 0xfc, 0x72, 0xa9, 0x76, 0x1a, 0xc2, 0x2c, 0x8e, 0xe9, - 0x3d, 0x65, 0x14, 0xdd, 0xc4, 0xd0, 0x06, 0x80, 0x50, 0x4b, 0xc7, 0x64, 0x40, 0xf8, 0x50, 0x7f, - 0xc8, 0x64, 0x46, 0x7e, 0x12, 0xf1, 0xff, 0x0f, 0x11, 0xff, 0x0b, 0x58, 0xc9, 0xba, 0x05, 0x98, - 0x3b, 0xc7, 0x24, 0x64, 0x59, 0xf9, 0x9e, 0x29, 0xde, 0x0b, 0xcc, 0x1f, 0x91, 0x90, 0x49, 0xcf, - 0xfd, 0xe9, 0xc2, 0x7d, 0x55, 0xfa, 0xbf, 0xa7, 0x38, 0x5f, 0xfb, 0x60, 0xe2, 0xdc, 0xfe, 0x57, - 0x09, 0x56, 0xcf, 0xf1, 0x16, 0x12, 0xae, 0xeb, 0x72, 0xdc, 0x0f, 0xe9, 0xd0, 0x48, 0x38, 0xf3, - 0x8c, 0x7e, 0x0b, 0x28, 0xec, 0x76, 0x63, 0xf9, 0xfd, 0xff, 0x43, 0x64, 0xdb, 0x92, 0xf1, 0x4a, - 0xe6, 0xfc, 0x29, 0x5c, 0x8e, 0x68, 0x18, 0x61, 0xca, 0x87, 0x4e, 0xd7, 0x8d, 0x59, 0x32, 0x57, - 0x2d, 0x37, 0x1b, 0xc6, 0xba, 0xaf, 0x8c, 0x2a, 0xb7, 0x06, 0x54, 0x4e, 0xdd, 0x41, 0x6c, 0xae, - 0x3d, 0xd4, 0xc3, 0xbd, 0x7f, 0x5e, 0x80, 0x45, 0x73, 0x15, 0x76, 0x84, 0xe9, 0x29, 0xe9, 0x62, - 0x74, 0x06, 0xf3, 0xd9, 0x1b, 0x32, 0xb4, 0x9e, 0x96, 0x6e, 0xcc, 0x65, 0x5f, 0x73, 0x63, 0x92, - 0x59, 0x6d, 0xfb, 0xf6, 0xed, 0x3f, 0xfd, 0xfb, 0x3f, 0x7f, 0x9d, 0xb9, 0x6e, 0x6f, 0xc8, 0x4b, - 0xca, 0xd3, 0x8f, 0x77, 0xcd, 0x1d, 0x5a, 0xf2, 0xe3, 0xae, 0x78, 0xf7, 0x1f, 0x94, 0xee, 0xa0, - 0x1e, 0x40, 0x7a, 0x59, 0x86, 0x56, 0x33, 0x1a, 0x21, 0x7f, 0x85, 0xd6, 0x2c, 0xee, 0xbe, 0xf6, - 0x96, 0x24, 0xb2, 0xed, 0xf5, 0xc9, 0x44, 0x7d, 0x2c, 0x79, 0x42, 0x58, 0x18, 0xb9, 0x6f, 0x43, - 0x99, 0x39, 0x8c, 0xbb, 0x88, 0x1b, 0xc7, 0xb6, 0x2d, 0xd9, 0x36, 0xed, 0xd6, 0x64, 0x36, 0xb5, - 0x1b, 0x6b, 0xc2, 0x91, 0xab, 0xb9, 0x2c, 0xe1, 0xb8, 0x3b, 0xbb, 0x77, 0x24, 0x54, 0x5a, 0x48, - 0x10, 0x72, 0x58, 0x18, 0xb9, 0x89, 0xcb, 0x12, 0x8e, 0xbb, 0xa2, 0x6b, 0x5e, 0x2e, 0xb4, 0xe0, - 0x63, 0x3f, 0xe2, 0xc3, 0xb7, 0x61, 0x55, 0x87, 0xc5, 0x83, 0xd2, 0x9d, 0x7b, 0x7f, 0x99, 0x83, - 0x05, 0x25, 0x5f, 0x4d, 0x2f, 0x45, 0x00, 0xa9, 0xa6, 0xcd, 0xae, 0x68, 0x41, 0x9a, 0x37, 0xd7, - 0xc6, 0x1b, 0x75, 0x17, 0xdd, 0x92, 0x79, 0x5c, 0xb3, 0xd7, 0x0a, 0x79, 0x28, 0xf9, 0x9b, 0xf4, - 0xd0, 0x17, 0x50, 0x35, 0xf2, 0x16, 0xad, 0x8c, 0x74, 0x50, 0x56, 0x15, 0x36, 0xf3, 0x02, 0xd4, - 0xbe, 0x29, 0x09, 0x5a, 0xf6, 0xea, 0x24, 0x02, 0xdd, 0x3b, 0x7d, 0xa8, 0x67, 0xb4, 0x31, 0x5a, - 0xcb, 0x77, 0xce, 0xf9, 0x2c, 0x93, 0x5f, 0x06, 0xcd, 0x92, 0xf6, 0x4c, 0x1f, 0xea, 0x19, 0x1d, - 0x9d, 0x25, 0x2a, 0xca, 0xeb, 0x77, 0x20, 0x4a, 0x7b, 0x25, 0x80, 0x7a, 0x46, 0x36, 0x67, 0x89, - 0x8a, 0x6a, 0x7a, 0x62, 0x9f, 0x4c, 0xe5, 0x4b, 0xba, 0x04, 0xf9, 0x50, 0x4b, 0x04, 0x38, 0x6a, - 0x66, 0x1a, 0x3d, 0xa7, 0xca, 0x8b, 0x93, 0xfa, 0x44, 0x92, 0xdc, 0xb5, 0xb7, 0x0c, 0x89, 0x8a, - 0xbd, 0xfb, 0x8d, 0xd1, 0xda, 0x9f, 0xdd, 0xf9, 0x76, 0x57, 0xeb, 0xb5, 0xdd, 0x1b, 0x14, 0xf7, - 0x04, 0xdd, 0x77, 0x25, 0x98, 0xcf, 0x4a, 0xf4, 0xec, 0x7e, 0x36, 0x46, 0xba, 0x17, 0x59, 0x7f, - 0x23, 0x59, 0x1f, 0xd8, 0xf7, 0xdf, 0x86, 0xf5, 0x9b, 0x54, 0xdb, 0x7f, 0x9b, 0xa4, 0x30, 0x84, - 0x7a, 0x46, 0x10, 0xa3, 0x5c, 0xa7, 0x8f, 0x2a, 0xfd, 0xe6, 0xfa, 0x04, 0xab, 0x7e, 0x11, 0xee, - 0xca, 0x6c, 0x6e, 0xd9, 0x76, 0x3e, 0x9b, 0xb1, 0xb3, 0x7f, 0xd4, 0xf8, 0x23, 0x8a, 0x5e, 0xf7, - 0xd5, 0xbf, 0x70, 0x76, 0x4f, 0x3f, 0x7e, 0xa8, 0x96, 0x6d, 0x56, 0xfe, 0xf9, 0xe4, 0x7f, 0x01, - 0x00, 0x00, 0xff, 0xff, 0x52, 0x6c, 0xdb, 0xd1, 0x7a, 0x1a, 0x00, 0x00, +func file_accounts_proto_rawDescGZIP() []byte { + file_accounts_proto_rawDescOnce.Do(func() { + file_accounts_proto_rawDescData = protoimpl.X.CompressGZIP(file_accounts_proto_rawDescData) + }) + return file_accounts_proto_rawDescData +} + +var file_accounts_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_accounts_proto_goTypes = []interface{}{ + (*RebuildIndexRequest)(nil), // 0: settings.RebuildIndexRequest + (*RebuildIndexResponse)(nil), // 1: settings.RebuildIndexResponse + (*ListAccountsRequest)(nil), // 2: settings.ListAccountsRequest + (*ListAccountsResponse)(nil), // 3: settings.ListAccountsResponse + (*GetAccountRequest)(nil), // 4: settings.GetAccountRequest + (*CreateAccountRequest)(nil), // 5: settings.CreateAccountRequest + (*UpdateAccountRequest)(nil), // 6: settings.UpdateAccountRequest + (*DeleteAccountRequest)(nil), // 7: settings.DeleteAccountRequest + (*Account)(nil), // 8: settings.Account + (*Identities)(nil), // 9: settings.Identities + (*PasswordProfile)(nil), // 10: settings.PasswordProfile + (*ListGroupsRequest)(nil), // 11: settings.ListGroupsRequest + (*ListGroupsResponse)(nil), // 12: settings.ListGroupsResponse + (*GetGroupRequest)(nil), // 13: settings.GetGroupRequest + (*CreateGroupRequest)(nil), // 14: settings.CreateGroupRequest + (*UpdateGroupRequest)(nil), // 15: settings.UpdateGroupRequest + (*DeleteGroupRequest)(nil), // 16: settings.DeleteGroupRequest + (*AddMemberRequest)(nil), // 17: settings.AddMemberRequest + (*RemoveMemberRequest)(nil), // 18: settings.RemoveMemberRequest + (*ListMembersRequest)(nil), // 19: settings.ListMembersRequest + (*ListMembersResponse)(nil), // 20: settings.ListMembersResponse + (*Group)(nil), // 21: settings.Group + (*OnPremisesProvisioningError)(nil), // 22: settings.OnPremisesProvisioningError + (*field_mask.FieldMask)(nil), // 23: google.protobuf.FieldMask + (*timestamp.Timestamp)(nil), // 24: google.protobuf.Timestamp + (*empty.Empty)(nil), // 25: google.protobuf.Empty +} +var file_accounts_proto_depIdxs = []int32{ + 23, // 0: settings.ListAccountsRequest.field_mask:type_name -> google.protobuf.FieldMask + 8, // 1: settings.ListAccountsResponse.accounts:type_name -> settings.Account + 8, // 2: settings.CreateAccountRequest.account:type_name -> settings.Account + 8, // 3: settings.UpdateAccountRequest.account:type_name -> settings.Account + 23, // 4: settings.UpdateAccountRequest.update_mask:type_name -> google.protobuf.FieldMask + 9, // 5: settings.Account.identities:type_name -> settings.Identities + 10, // 6: settings.Account.password_profile:type_name -> settings.PasswordProfile + 21, // 7: settings.Account.memberOf:type_name -> settings.Group + 24, // 8: settings.Account.created_date_time:type_name -> google.protobuf.Timestamp + 24, // 9: settings.Account.deleted_date_time:type_name -> google.protobuf.Timestamp + 24, // 10: settings.Account.on_premises_last_sync_date_time:type_name -> google.protobuf.Timestamp + 22, // 11: settings.Account.on_premises_provisioning_errors:type_name -> settings.OnPremisesProvisioningError + 24, // 12: settings.Account.external_user_state_change_date_time:type_name -> google.protobuf.Timestamp + 24, // 13: settings.Account.refresh_tokens_valid_from_date_time:type_name -> google.protobuf.Timestamp + 24, // 14: settings.Account.sign_in_sessions_valid_from_date_time:type_name -> google.protobuf.Timestamp + 24, // 15: settings.PasswordProfile.last_password_change_date_time:type_name -> google.protobuf.Timestamp + 23, // 16: settings.ListGroupsRequest.field_mask:type_name -> google.protobuf.FieldMask + 21, // 17: settings.ListGroupsResponse.groups:type_name -> settings.Group + 21, // 18: settings.CreateGroupRequest.group:type_name -> settings.Group + 21, // 19: settings.UpdateGroupRequest.group:type_name -> settings.Group + 23, // 20: settings.UpdateGroupRequest.update_mask:type_name -> google.protobuf.FieldMask + 23, // 21: settings.ListMembersRequest.field_mask:type_name -> google.protobuf.FieldMask + 8, // 22: settings.ListMembersResponse.members:type_name -> settings.Account + 8, // 23: settings.Group.members:type_name -> settings.Account + 8, // 24: settings.Group.owners:type_name -> settings.Account + 24, // 25: settings.Group.created_date_time:type_name -> google.protobuf.Timestamp + 24, // 26: settings.Group.deleted_date_time:type_name -> google.protobuf.Timestamp + 24, // 27: settings.Group.expiration_date_time:type_name -> google.protobuf.Timestamp + 22, // 28: settings.Group.on_premises_provisioning_errors:type_name -> settings.OnPremisesProvisioningError + 24, // 29: settings.OnPremisesProvisioningError.occurred_date_time:type_name -> google.protobuf.Timestamp + 2, // 30: settings.AccountsService.ListAccounts:input_type -> settings.ListAccountsRequest + 4, // 31: settings.AccountsService.GetAccount:input_type -> settings.GetAccountRequest + 5, // 32: settings.AccountsService.CreateAccount:input_type -> settings.CreateAccountRequest + 6, // 33: settings.AccountsService.UpdateAccount:input_type -> settings.UpdateAccountRequest + 7, // 34: settings.AccountsService.DeleteAccount:input_type -> settings.DeleteAccountRequest + 11, // 35: settings.GroupsService.ListGroups:input_type -> settings.ListGroupsRequest + 13, // 36: settings.GroupsService.GetGroup:input_type -> settings.GetGroupRequest + 14, // 37: settings.GroupsService.CreateGroup:input_type -> settings.CreateGroupRequest + 15, // 38: settings.GroupsService.UpdateGroup:input_type -> settings.UpdateGroupRequest + 16, // 39: settings.GroupsService.DeleteGroup:input_type -> settings.DeleteGroupRequest + 17, // 40: settings.GroupsService.AddMember:input_type -> settings.AddMemberRequest + 18, // 41: settings.GroupsService.RemoveMember:input_type -> settings.RemoveMemberRequest + 19, // 42: settings.GroupsService.ListMembers:input_type -> settings.ListMembersRequest + 0, // 43: settings.IndexService.RebuildIndex:input_type -> settings.RebuildIndexRequest + 3, // 44: settings.AccountsService.ListAccounts:output_type -> settings.ListAccountsResponse + 8, // 45: settings.AccountsService.GetAccount:output_type -> settings.Account + 8, // 46: settings.AccountsService.CreateAccount:output_type -> settings.Account + 8, // 47: settings.AccountsService.UpdateAccount:output_type -> settings.Account + 25, // 48: settings.AccountsService.DeleteAccount:output_type -> google.protobuf.Empty + 12, // 49: settings.GroupsService.ListGroups:output_type -> settings.ListGroupsResponse + 21, // 50: settings.GroupsService.GetGroup:output_type -> settings.Group + 21, // 51: settings.GroupsService.CreateGroup:output_type -> settings.Group + 21, // 52: settings.GroupsService.UpdateGroup:output_type -> settings.Group + 25, // 53: settings.GroupsService.DeleteGroup:output_type -> google.protobuf.Empty + 21, // 54: settings.GroupsService.AddMember:output_type -> settings.Group + 21, // 55: settings.GroupsService.RemoveMember:output_type -> settings.Group + 20, // 56: settings.GroupsService.ListMembers:output_type -> settings.ListMembersResponse + 1, // 57: settings.IndexService.RebuildIndex:output_type -> settings.RebuildIndexResponse + 44, // [44:58] is the sub-list for method output_type + 30, // [30:44] is the sub-list for method input_type + 30, // [30:30] is the sub-list for extension type_name + 30, // [30:30] is the sub-list for extension extendee + 0, // [0:30] is the sub-list for field type_name +} + +func init() { file_accounts_proto_init() } +func file_accounts_proto_init() { + if File_accounts_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_accounts_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RebuildIndexRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RebuildIndexResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAccountsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAccountsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAccountRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateAccountRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateAccountRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteAccountRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Account); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Identities); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PasswordProfile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListGroupsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListGroupsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetGroupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateGroupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateGroupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteGroupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddMemberRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveMemberRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListMembersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListMembersResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Group); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_accounts_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnPremisesProvisioningError); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_accounts_proto_rawDesc, + NumEnums: 0, + NumMessages: 23, + NumExtensions: 0, + NumServices: 3, + }, + GoTypes: file_accounts_proto_goTypes, + DependencyIndexes: file_accounts_proto_depIdxs, + MessageInfos: file_accounts_proto_msgTypes, + }.Build() + File_accounts_proto = out.File + file_accounts_proto_rawDesc = nil + file_accounts_proto_goTypes = nil + file_accounts_proto_depIdxs = nil } diff --git a/accounts/pkg/proto/v0/accounts.pb.micro.go b/accounts/pkg/proto/v0/accounts.pb.micro.go index 2fd6dfd27f..b26141b639 100644 --- a/accounts/pkg/proto/v0/accounts.pb.micro.go +++ b/accounts/pkg/proto/v0/accounts.pb.micro.go @@ -551,3 +551,77 @@ func (h *groupsServiceHandler) RemoveMember(ctx context.Context, in *RemoveMembe func (h *groupsServiceHandler) ListMembers(ctx context.Context, in *ListMembersRequest, out *ListMembersResponse) error { return h.GroupsServiceHandler.ListMembers(ctx, in, out) } + +// Api Endpoints for IndexService service + +func NewIndexServiceEndpoints() []*api.Endpoint { + return []*api.Endpoint{ + &api.Endpoint{ + Name: "IndexService.RebuildIndex", + Path: []string{"/api/v0/index/rebuild"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + }, + } +} + +// Client API for IndexService service + +type IndexService interface { + RebuildIndex(ctx context.Context, in *RebuildIndexRequest, opts ...client.CallOption) (*RebuildIndexResponse, error) +} + +type indexService struct { + c client.Client + name string +} + +func NewIndexService(name string, c client.Client) IndexService { + return &indexService{ + c: c, + name: name, + } +} + +func (c *indexService) RebuildIndex(ctx context.Context, in *RebuildIndexRequest, opts ...client.CallOption) (*RebuildIndexResponse, error) { + req := c.c.NewRequest(c.name, "IndexService.RebuildIndex", in) + out := new(RebuildIndexResponse) + err := c.c.Call(ctx, req, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for IndexService service + +type IndexServiceHandler interface { + RebuildIndex(context.Context, *RebuildIndexRequest, *RebuildIndexResponse) error +} + +func RegisterIndexServiceHandler(s server.Server, hdlr IndexServiceHandler, opts ...server.HandlerOption) error { + type indexService interface { + RebuildIndex(ctx context.Context, in *RebuildIndexRequest, out *RebuildIndexResponse) error + } + type IndexService struct { + indexService + } + h := &indexServiceHandler{hdlr} + opts = append(opts, api.WithEndpoint(&api.Endpoint{ + Name: "IndexService.RebuildIndex", + Path: []string{"/api/v0/index/rebuild"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + })) + return s.Handle(s.NewHandler(&IndexService{h}, opts...)) +} + +type indexServiceHandler struct { + IndexServiceHandler +} + +func (h *indexServiceHandler) RebuildIndex(ctx context.Context, in *RebuildIndexRequest, out *RebuildIndexResponse) error { + return h.IndexServiceHandler.RebuildIndex(ctx, in, out) +} diff --git a/accounts/pkg/proto/v0/accounts.pb.micro_test.go b/accounts/pkg/proto/v0/accounts.pb.micro_test.go index f3e09a515e..6ecbd25d3e 100644 --- a/accounts/pkg/proto/v0/accounts.pb.micro_test.go +++ b/accounts/pkg/proto/v0/accounts.pb.micro_test.go @@ -1208,19 +1208,23 @@ func TestListMembers(t *testing.T) { } func TestListMembersEmptyGroup(t *testing.T) { - group := &proto.Group{Id: "5d58e5ec-842e-498b-8800-61f2ec6f911c", GidNumber: 30002, OnPremisesSamAccountName: "quantum-group", DisplayName: "Quantum Group", Members: []*proto.Account{}} - - createGroup(t, group) + group := &proto.Group{Id: "5d58e5ec-842e-498b-8800-61f2ec6f911c", GidNumber: 60000, OnPremisesSamAccountName: "quantum-group", DisplayName: "Quantum Group", Members: []*proto.Account{}} client := service.Client() cl := proto.NewGroupsService("com.owncloud.api.accounts", client) + request := &proto.CreateGroupRequest{Group: group} + _, err := cl.CreateGroup(context.Background(), request) + if err == nil { + newCreatedGroups = append(newCreatedGroups, group.Id) + } + req := &proto.ListMembersRequest{Id: group.Id} - res, err := cl.ListMembers(context.Background(), req) + listRes, err := cl.ListMembers(context.Background(), req) assert.NoError(t, err) - assert.Empty(t, res.Members) + assert.Empty(t, listRes.Members) cleanUp(t) } diff --git a/accounts/pkg/proto/v0/accounts.pb.web.go b/accounts/pkg/proto/v0/accounts.pb.web.go index 5caafddfef..16379fce7c 100644 --- a/accounts/pkg/proto/v0/accounts.pb.web.go +++ b/accounts/pkg/proto/v0/accounts.pb.web.go @@ -372,6 +372,120 @@ func RegisterGroupsServiceWeb(r chi.Router, i GroupsServiceHandler, middlewares r.MethodFunc("POST", "/api/v0/groups/{id=*}/members/$ref", handler.ListMembers) } +type webIndexServiceHandler struct { + r chi.Router + h IndexServiceHandler +} + +func (h *webIndexServiceHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + h.r.ServeHTTP(w, r) +} + +func (h *webIndexServiceHandler) RebuildIndex(w http.ResponseWriter, r *http.Request) { + + req := &RebuildIndexRequest{} + + resp := &RebuildIndexResponse{} + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, err.Error(), http.StatusPreconditionFailed) + return + } + + if err := h.h.RebuildIndex( + r.Context(), + req, + resp, + ); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + render.Status(r, http.StatusCreated) + render.JSON(w, r, resp) +} + +func RegisterIndexServiceWeb(r chi.Router, i IndexServiceHandler, middlewares ...func(http.Handler) http.Handler) { + handler := &webIndexServiceHandler{ + r: r, + h: i, + } + + r.MethodFunc("POST", "/api/v0/index/rebuild", handler.RebuildIndex) +} + +// RebuildIndexRequestJSONMarshaler describes the default jsonpb.Marshaler used by all +// instances of RebuildIndexRequest. This struct is safe to replace or modify but +// should not be done so concurrently. +var RebuildIndexRequestJSONMarshaler = new(jsonpb.Marshaler) + +// MarshalJSON satisfies the encoding/json Marshaler interface. This method +// uses the more correct jsonpb package to correctly marshal the message. +func (m *RebuildIndexRequest) MarshalJSON() ([]byte, error) { + if m == nil { + return json.Marshal(nil) + } + + buf := &bytes.Buffer{} + + if err := RebuildIndexRequestJSONMarshaler.Marshal(buf, m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +var _ json.Marshaler = (*RebuildIndexRequest)(nil) + +// RebuildIndexRequestJSONUnmarshaler describes the default jsonpb.Unmarshaler used by all +// instances of RebuildIndexRequest. This struct is safe to replace or modify but +// should not be done so concurrently. +var RebuildIndexRequestJSONUnmarshaler = new(jsonpb.Unmarshaler) + +// UnmarshalJSON satisfies the encoding/json Unmarshaler interface. This method +// uses the more correct jsonpb package to correctly unmarshal the message. +func (m *RebuildIndexRequest) UnmarshalJSON(b []byte) error { + return RebuildIndexRequestJSONUnmarshaler.Unmarshal(bytes.NewReader(b), m) +} + +var _ json.Unmarshaler = (*RebuildIndexRequest)(nil) + +// RebuildIndexResponseJSONMarshaler describes the default jsonpb.Marshaler used by all +// instances of RebuildIndexResponse. This struct is safe to replace or modify but +// should not be done so concurrently. +var RebuildIndexResponseJSONMarshaler = new(jsonpb.Marshaler) + +// MarshalJSON satisfies the encoding/json Marshaler interface. This method +// uses the more correct jsonpb package to correctly marshal the message. +func (m *RebuildIndexResponse) MarshalJSON() ([]byte, error) { + if m == nil { + return json.Marshal(nil) + } + + buf := &bytes.Buffer{} + + if err := RebuildIndexResponseJSONMarshaler.Marshal(buf, m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +var _ json.Marshaler = (*RebuildIndexResponse)(nil) + +// RebuildIndexResponseJSONUnmarshaler describes the default jsonpb.Unmarshaler used by all +// instances of RebuildIndexResponse. This struct is safe to replace or modify but +// should not be done so concurrently. +var RebuildIndexResponseJSONUnmarshaler = new(jsonpb.Unmarshaler) + +// UnmarshalJSON satisfies the encoding/json Unmarshaler interface. This method +// uses the more correct jsonpb package to correctly unmarshal the message. +func (m *RebuildIndexResponse) UnmarshalJSON(b []byte) error { + return RebuildIndexResponseJSONUnmarshaler.Unmarshal(bytes.NewReader(b), m) +} + +var _ json.Unmarshaler = (*RebuildIndexResponse)(nil) + // ListAccountsRequestJSONMarshaler describes the default jsonpb.Marshaler used by all // instances of ListAccountsRequest. This struct is safe to replace or modify but // should not be done so concurrently. diff --git a/accounts/pkg/proto/v0/accounts.proto b/accounts/pkg/proto/v0/accounts.proto index cb26c1afde..9410491d29 100644 --- a/accounts/pkg/proto/v0/accounts.proto +++ b/accounts/pkg/proto/v0/accounts.proto @@ -136,6 +136,23 @@ service GroupsService { } +service IndexService { + rpc RebuildIndex(RebuildIndexRequest) returns (RebuildIndexResponse) { + // All request parameters go into body. + option (google.api.http) = { + // URLs are broken + post: "/api/v0/index/rebuild" + body: "*" + }; + } +} + +message RebuildIndexRequest { +} + +message RebuildIndexResponse { +} + message ListAccountsRequest { // Optional. The maximum number of accounts to return in the response int32 page_size = 1 [(google.api.field_behavior) = OPTIONAL]; diff --git a/accounts/pkg/proto/v0/accounts.swagger.json b/accounts/pkg/proto/v0/accounts.swagger.json index 721e27f718..37f50807d9 100644 --- a/accounts/pkg/proto/v0/accounts.swagger.json +++ b/accounts/pkg/proto/v0/accounts.swagger.json @@ -14,13 +14,19 @@ "/api/v0/accounts/accounts-create": { "post": { "summary": "Creates an account", - "operationId": "CreateAccount", + "operationId": "AccountsService_CreateAccount", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/settingsAccount" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -41,13 +47,19 @@ "/api/v0/accounts/accounts-delete": { "post": { "summary": "Deletes an account", - "operationId": "DeleteAccount", + "operationId": "AccountsService_DeleteAccount", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -68,13 +80,19 @@ "/api/v0/accounts/accounts-get": { "post": { "summary": "Gets an account", - "operationId": "GetAccount", + "operationId": "AccountsService_GetAccount", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/settingsAccount" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -95,13 +113,19 @@ "/api/v0/accounts/accounts-list": { "post": { "summary": "Lists accounts", - "operationId": "ListAccounts", + "operationId": "AccountsService_ListAccounts", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/settingsListAccountsResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -122,13 +146,19 @@ "/api/v0/accounts/accounts-update": { "post": { "summary": "Updates an account", - "operationId": "UpdateAccount", + "operationId": "AccountsService_UpdateAccount", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/settingsAccount" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -148,14 +178,20 @@ }, "/api/v0/accounts/groups-create": { "post": { - "summary": "Creates an account", - "operationId": "CreateGroup", + "summary": "Creates a group", + "operationId": "GroupsService_CreateGroup", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/settingsGroup" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -175,14 +211,20 @@ }, "/api/v0/accounts/groups-delete": { "post": { - "summary": "Deletes an account", - "operationId": "DeleteGroup", + "summary": "Deletes a group", + "operationId": "GroupsService_DeleteGroup", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -202,14 +244,20 @@ }, "/api/v0/accounts/groups-get": { "post": { - "summary": "Gets an account", - "operationId": "GetGroup", + "summary": "Gets an groups", + "operationId": "GroupsService_GetGroup", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/settingsGroup" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -229,14 +277,20 @@ }, "/api/v0/accounts/groups-list": { "post": { - "summary": "Lists accounts", - "operationId": "ListGroups", + "summary": "Lists groups", + "operationId": "GroupsService_ListGroups", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/settingsListGroupsResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -256,14 +310,20 @@ }, "/api/v0/accounts/groups-update": { "post": { - "summary": "Updates an account", - "operationId": "UpdateGroup", + "summary": "Updates a group", + "operationId": "GroupsService_UpdateGroup", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/settingsGroup" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -284,13 +344,19 @@ "/api/v0/groups/{group_id}/members/$ref": { "post": { "summary": "group:addmember https://docs.microsoft.com/en-us/graph/api/group-post-members?view=graph-rest-1.0\u0026tabs=http", - "operationId": "AddMember", + "operationId": "GroupsService_AddMember", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/settingsGroup" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -318,13 +384,19 @@ "/api/v0/groups/{group_id}/members/{account_id}/$ref": { "post": { "summary": "group:removemember https://docs.microsoft.com/en-us/graph/api/group-delete-members?view=graph-rest-1.0", - "operationId": "RemoveMember", + "operationId": "GroupsService_RemoveMember", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/settingsGroup" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -359,13 +431,19 @@ "/api/v0/groups/{id}/members/$ref": { "post": { "summary": "group:listmembers https://docs.microsoft.com/en-us/graph/api/group-list-members?view=graph-rest-1.0", - "operationId": "ListMembers", + "operationId": "GroupsService_ListMembers", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/settingsListMembersResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -389,9 +467,53 @@ "GroupsService" ] } + }, + "/api/v0/index/rebuild": { + "post": { + "operationId": "IndexService_RebuildIndex", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/settingsRebuildIndexResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/settingsRebuildIndexRequest" + } + } + ], + "tags": [ + "IndexService" + ] + } } }, "definitions": { + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + }, "protobufFieldMask": { "type": "object", "properties": { @@ -406,6 +528,27 @@ "description": "paths: \"f.a\"\n paths: \"f.b.d\"\n\nHere `f` represents a field in some root message, `a` and `b`\nfields in the message found in `f`, and `d` a field found in the\nmessage in `f.b`.\n\nField masks are used to specify a subset of fields that should be\nreturned by a get operation or modified by an update operation.\nField masks also have a custom JSON encoding (see below).\n\n# Field Masks in Projections\n\nWhen used in the context of a projection, a response message or\nsub-message is filtered by the API to only contain those fields as\nspecified in the mask. For example, if the mask in the previous\nexample is applied to a response message as follows:\n\n f {\n a : 22\n b {\n d : 1\n x : 2\n }\n y : 13\n }\n z: 8\n\nThe result will not contain specific values for fields x,y and z\n(their value will be set to the default, and omitted in proto text\noutput):\n\n\n f {\n a : 22\n b {\n d : 1\n }\n }\n\nA repeated field is not allowed except at the last position of a\npaths string.\n\nIf a FieldMask object is not present in a get operation, the\noperation applies to all fields (as if a FieldMask of all fields\nhad been specified).\n\nNote that a field mask does not necessarily apply to the\ntop-level response message. In case of a REST get operation, the\nfield mask applies directly to the response, but in case of a REST\nlist operation, the mask instead applies to each individual message\nin the returned resource list. In case of a REST custom method,\nother definitions may be used. Where the mask applies will be\nclearly documented together with its declaration in the API. In\nany case, the effect on the returned resource/resources is required\nbehavior for APIs.\n\n# Field Masks in Update Operations\n\nA field mask in update operations specifies which fields of the\ntargeted resource are going to be updated. The API is required\nto only change the values of the fields as specified in the mask\nand leave the others untouched. If a resource is passed in to\ndescribe the updated values, the API ignores the values of all\nfields not covered by the mask.\n\nIf a repeated field is specified for an update operation, new values will\nbe appended to the existing repeated field in the target resource. Note that\na repeated field is only allowed in the last position of a `paths` string.\n\nIf a sub-message is specified in the last position of the field mask for an\nupdate operation, then new value will be merged into the existing sub-message\nin the target resource.\n\nFor example, given the target message:\n\n f {\n b {\n d: 1\n x: 2\n }\n c: [1]\n }\n\nAnd an update message:\n\n f {\n b {\n d: 10\n }\n c: [2]\n }\n\nthen if the field mask is:\n\n paths: [\"f.b\", \"f.c\"]\n\nthen the result will be:\n\n f {\n b {\n d: 10\n x: 2\n }\n c: [1, 2]\n }\n\nAn implementation may provide options to override this default behavior for\nrepeated and message fields.\n\nIn order to reset a field's value to the default, the field must\nbe in the mask and set to the default value in the provided resource.\nHence, in order to reset all fields of a resource, provide a default\ninstance of the resource and set all fields in the mask, or do\nnot provide a mask as described below.\n\nIf a field mask is not present on update, the operation applies to\nall fields (as if a field mask of all fields has been specified).\nNote that in the presence of schema evolution, this may mean that\nfields the client does not know and has therefore not filled into\nthe request will be reset to their default. If this is unwanted\nbehavior, a specific service may require a client to always specify\na field mask, producing an error if not.\n\nAs with get operations, the location of the resource which\ndescribes the updated values in the request message depends on the\noperation kind. In any case, the effect of the field mask is\nrequired to be honored by the API.\n\n## Considerations for HTTP REST\n\nThe HTTP kind of an update operation which uses a field mask must\nbe set to PATCH instead of PUT in order to satisfy HTTP semantics\n(PUT must only be used for full updates).\n\n# JSON Encoding of Field Masks\n\nIn JSON, a field mask is encoded as a single string where paths are\nseparated by a comma. Fields name in each path are converted\nto/from lower-camel naming conventions.\n\nAs an example, consider the following message declarations:\n\n message Profile {\n User user = 1;\n Photo photo = 2;\n }\n message User {\n string display_name = 1;\n string address = 2;\n }\n\nIn proto a field mask for `Profile` may look as such:\n\n mask {\n paths: \"user.display_name\"\n paths: \"photo\"\n }\n\nIn JSON, the same mask is represented as below:\n\n {\n mask: \"user.displayName,photo\"\n }\n\n# Field Masks and Oneof Fields\n\nField masks treat fields in oneofs just as regular fields. Consider the\nfollowing message:\n\n message SampleMessage {\n oneof test_oneof {\n string name = 4;\n SubMessage sub_message = 9;\n }\n }\n\nThe field mask can be:\n\n mask {\n paths: \"name\"\n }\n\nOr:\n\n mask {\n paths: \"sub_message\"\n }\n\nNote that oneof type names (\"test_oneof\" in this case) cannot be used in\npaths.\n\n## Field Mask Verification\n\nThe implementation of any API method which has a FieldMask type field in the\nrequest should verify the included field paths, and return an\n`INVALID_ARGUMENT` error if any path is unmappable.", "title": "`FieldMask` represents a set of symbolic field paths, for example:" }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, "settingsAccount": { "type": "object", "properties": { @@ -898,6 +1041,12 @@ } } }, + "settingsRebuildIndexRequest": { + "type": "object" + }, + "settingsRebuildIndexResponse": { + "type": "object" + }, "settingsRemoveMemberRequest": { "type": "object", "properties": { diff --git a/accounts/pkg/server/grpc/server.go b/accounts/pkg/server/grpc/server.go index 80fd1c3ccd..c4c267770f 100644 --- a/accounts/pkg/server/grpc/server.go +++ b/accounts/pkg/server/grpc/server.go @@ -26,6 +26,9 @@ func Server(opts ...Option) grpc.Service { if err := proto.RegisterGroupsServiceHandler(service.Server(), handler); err != nil { options.Logger.Fatal().Err(err).Msg("could not register groups handler") } + if err := proto.RegisterIndexServiceHandler(service.Server(), handler); err != nil { + options.Logger.Fatal().Err(err).Msg("could not register index handler") + } service.Init() return service diff --git a/accounts/pkg/service/v0/accounts.go b/accounts/pkg/service/v0/accounts.go index bb3dfb4f14..45021bbe8e 100644 --- a/accounts/pkg/service/v0/accounts.go +++ b/accounts/pkg/service/v0/accounts.go @@ -146,6 +146,26 @@ func (s Service) ListAccounts(ctx context.Context, in *proto.ListAccountsRequest return nil } + if in.Query == "" { + err = s.repo.LoadAccounts(ctx, &out.Accounts) + if err != nil { + s.log.Err(err).Msg("failed to load all accounts from storage") + return merrors.InternalServerError(s.id, "failed to load all accounts") + } + for i := range out.Accounts { + a := out.Accounts[i] + + // TODO add groups only if requested + // if in.FieldMask ... + s.expandMemberOf(a) + + if a.PasswordProfile != nil { + a.PasswordProfile.Password = "" + } + } + return nil + } + searchResults, err := s.findAccountsByQuery(ctx, in.Query) out.Accounts = make([]*proto.Account, 0, len(searchResults)) @@ -180,10 +200,6 @@ func (s Service) findAccountsByQuery(ctx context.Context, query string) ([]strin var searchResults []string var err error - if query == "" { - return s.index.FindByPartial(&proto.Account{}, "Mail", "*") - } - // TODO: more explicit queries have to be on top var onPremOrMailQuery = regexp.MustCompile(`^on_premises_sam_account_name eq '(.*)' or mail eq '(.*)'$`) match := onPremOrMailQuery.FindStringSubmatch(query) diff --git a/accounts/pkg/service/v0/index.go b/accounts/pkg/service/v0/index.go new file mode 100644 index 0000000000..3bb75e4399 --- /dev/null +++ b/accounts/pkg/service/v0/index.go @@ -0,0 +1,100 @@ +package service + +import ( + "context" + "fmt" + + "github.com/owncloud/ocis/accounts/pkg/storage" + + "github.com/owncloud/ocis/accounts/pkg/config" + "github.com/owncloud/ocis/accounts/pkg/indexer" + "github.com/owncloud/ocis/accounts/pkg/indexer/option" + "github.com/owncloud/ocis/accounts/pkg/proto/v0" +) + +// RebuildIndex deletes all indices (in memory and on storage) and rebuilds them from scratch. +func (s Service) RebuildIndex(ctx context.Context, request *proto.RebuildIndexRequest, response *proto.RebuildIndexResponse) error { + if err := s.index.Reset(); err != nil { + return fmt.Errorf("failed to delete index containers: %w", err) + } + + if err := recreateContainers(s.index, s.Config); err != nil { + return fmt.Errorf("failed to recreate index containers: %w", err) + } + + if err := reindexDocuments(ctx, s.repo, s.index); err != nil { + return fmt.Errorf("failed to reindex documents: %w", err) + } + + return nil +} + +// recreateContainers adds all indices to the indexer that we have for this service. +func recreateContainers(idx *indexer.Indexer, cfg *config.Config) error { + // Accounts + if err := idx.AddIndex(&proto.Account{}, "DisplayName", "Id", "accounts", "non_unique", nil, true); err != nil { + return err + } + if err := idx.AddIndex(&proto.Account{}, "Mail", "Id", "accounts", "unique", nil, true); err != nil { + return err + } + + if err := idx.AddIndex(&proto.Account{}, "OnPremisesSamAccountName", "Id", "accounts", "unique", nil, true); err != nil { + return err + } + + if err := idx.AddIndex(&proto.Account{}, "PreferredName", "Id", "accounts", "unique", nil, true); err != nil { + return err + } + + if err := idx.AddIndex(&proto.Account{}, "UidNumber", "Id", "accounts", "autoincrement", &option.Bound{ + Lower: cfg.Index.UID.Lower, + Upper: cfg.Index.UID.Upper, + }, false); err != nil { + return err + } + + // Groups + if err := idx.AddIndex(&proto.Group{}, "OnPremisesSamAccountName", "Id", "groups", "unique", nil, true); err != nil { + return err + } + + if err := idx.AddIndex(&proto.Group{}, "DisplayName", "Id", "groups", "non_unique", nil, true); err != nil { + return err + } + + if err := idx.AddIndex(&proto.Group{}, "GidNumber", "Id", "groups", "autoincrement", &option.Bound{ + Lower: cfg.Index.GID.Lower, + Upper: cfg.Index.GID.Upper, + }, false); err != nil { + return err + } + + return nil +} + +// reindexDocuments loads all existing documents and adds them to the index. +func reindexDocuments(ctx context.Context, repo storage.Repo, index *indexer.Indexer) error { + accounts := make([]*proto.Account, 0) + if err := repo.LoadAccounts(ctx, &accounts); err != nil { + return err + } + for i := range accounts { + _, err := index.Add(accounts[i]) + if err != nil { + return err + } + } + + groups := make([]*proto.Group, 0) + if err := repo.LoadGroups(ctx, &groups); err != nil { + return err + } + for i := range groups { + _, err := index.Add(groups[i]) + if err != nil { + return err + } + } + return nil +} diff --git a/accounts/pkg/service/v0/service.go b/accounts/pkg/service/v0/service.go index 99152690e4..f1b3b22f14 100644 --- a/accounts/pkg/service/v0/service.go +++ b/accounts/pkg/service/v0/service.go @@ -9,8 +9,6 @@ import ( "strings" "time" - "github.com/owncloud/ocis/accounts/pkg/indexer/option" - "github.com/owncloud/ocis/accounts/pkg/indexer" "github.com/owncloud/ocis/accounts/pkg/storage" @@ -77,45 +75,9 @@ func New(opts ...Option) (s *Service, err error) { func (s Service) buildIndex() (*indexer.Indexer, error) { idx := indexer.CreateIndexer(s.Config) - // Accounts - if err := idx.AddIndex(&proto.Account{}, "DisplayName", "Id", "accounts", "non_unique", nil, true); err != nil { + if err := recreateContainers(idx, s.Config); err != nil { return nil, err } - if err := idx.AddIndex(&proto.Account{}, "Mail", "Id", "accounts", "unique", nil, true); err != nil { - return nil, err - } - - if err := idx.AddIndex(&proto.Account{}, "OnPremisesSamAccountName", "Id", "accounts", "unique", nil, true); err != nil { - return nil, err - } - - if err := idx.AddIndex(&proto.Account{}, "PreferredName", "Id", "accounts", "unique", nil, true); err != nil { - return nil, err - } - - if err := idx.AddIndex(&proto.Account{}, "UidNumber", "Id", "accounts", "autoincrement", &option.Bound{ - Lower: s.Config.Index.UID.Lower, - Upper: s.Config.Index.UID.Upper, - }, false); err != nil { - return nil, err - } - - // Groups - if err := idx.AddIndex(&proto.Group{}, "OnPremisesSamAccountName", "Id", "groups", "unique", nil, true); err != nil { - return nil, err - } - - if err := idx.AddIndex(&proto.Group{}, "DisplayName", "Id", "groups", "non_unique", nil, true); err != nil { - return nil, err - } - - if err := idx.AddIndex(&proto.Group{}, "GidNumber", "Id", "groups", "autoincrement", &option.Bound{ - Lower: s.Config.Index.GID.Lower, - Upper: s.Config.Index.GID.Upper, - }, false); err != nil { - return nil, err - } - return idx, nil } diff --git a/accounts/pkg/storage/cs3.go b/accounts/pkg/storage/cs3.go index aa2e8d6fd6..e43d246558 100644 --- a/accounts/pkg/storage/cs3.go +++ b/accounts/pkg/storage/cs3.go @@ -8,6 +8,7 @@ import ( "io/ioutil" "net/http" "path" + "path/filepath" "strconv" "strings" @@ -20,6 +21,7 @@ import ( "github.com/cs3org/reva/pkg/token/manager/jwt" "github.com/owncloud/ocis/accounts/pkg/config" "github.com/owncloud/ocis/accounts/pkg/proto/v0" + olog "github.com/owncloud/ocis/ocis-pkg/log" "google.golang.org/grpc/metadata" ) @@ -92,6 +94,40 @@ func (r CS3Repo) LoadAccount(ctx context.Context, id string, a *proto.Account) ( return err } + return r.loadAccount(id, t, a) +} + +// LoadAccounts loads all the accounts from the cs3 api +func (r CS3Repo) LoadAccounts(ctx context.Context, a *[]*proto.Account) (err error) { + t, err := r.authenticate(ctx) + if err != nil { + return err + } + + ctx = metadata.AppendToOutgoingContext(ctx, token.TokenHeader, t) + res, err := r.storageProvider.ListContainer(ctx, &provider.ListContainerRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Path{Path: path.Join("/meta", accountsFolder)}, + }, + }) + if err != nil { + return err + } + + log := olog.NewLogger(olog.Pretty(r.cfg.Log.Pretty), olog.Color(r.cfg.Log.Color), olog.Level(r.cfg.Log.Level)) + for i := range res.Infos { + acc := &proto.Account{} + err := r.loadAccount(filepath.Base(res.Infos[i].Path), t, acc) + if err != nil { + log.Err(err).Msg("could not load account") + continue + } + *a = append(*a, acc) + } + return nil +} + +func (r CS3Repo) loadAccount(id string, t string, a *proto.Account) error { resp, err := r.dataProvider.get(r.accountURL(id), t) if err != nil { return err @@ -172,6 +208,40 @@ func (r CS3Repo) LoadGroup(ctx context.Context, id string, g *proto.Group) (err return err } + return r.loadGroup(id, t, g) +} + +// LoadGroups loads all the groups from the cs3 api +func (r CS3Repo) LoadGroups(ctx context.Context, g *[]*proto.Group) (err error) { + t, err := r.authenticate(ctx) + if err != nil { + return err + } + + ctx = metadata.AppendToOutgoingContext(ctx, token.TokenHeader, t) + res, err := r.storageProvider.ListContainer(ctx, &provider.ListContainerRequest{ + Ref: &provider.Reference{ + Spec: &provider.Reference_Path{Path: path.Join("/meta", groupsFolder)}, + }, + }) + if err != nil { + return err + } + + log := olog.NewLogger(olog.Pretty(r.cfg.Log.Pretty), olog.Color(r.cfg.Log.Color), olog.Level(r.cfg.Log.Level)) + for i := range res.Infos { + grp := &proto.Group{} + err := r.loadGroup(filepath.Base(res.Infos[i].Path), t, grp) + if err != nil { + log.Err(err).Msg("could not load account") + continue + } + *g = append(*g, grp) + } + return nil +} + +func (r CS3Repo) loadGroup(id string, t string, g *proto.Group) error { resp, err := r.dataProvider.get(r.groupURL(id), t) if err != nil { return err diff --git a/accounts/pkg/storage/disk.go b/accounts/pkg/storage/disk.go index fddfb6a0ef..6041e88562 100644 --- a/accounts/pkg/storage/disk.go +++ b/accounts/pkg/storage/disk.go @@ -17,8 +17,8 @@ var groupLock sync.Mutex // DiskRepo provides a local filesystem implementation of the Repo interface type DiskRepo struct { - cfg *config.Config - log olog.Logger + cfg *config.Config + log olog.Logger } // NewDiskRepo creates a new disk repo @@ -37,8 +37,8 @@ func NewDiskRepo(cfg *config.Config, log olog.Logger) DiskRepo { } } return DiskRepo{ - cfg: cfg, - log: log, + cfg: cfg, + log: log, } } @@ -70,6 +70,20 @@ func (r DiskRepo) LoadAccount(ctx context.Context, id string, a *proto.Account) return json.Unmarshal(data, a) } +// LoadAccounts loads all the accounts from the local filesystem +func (r DiskRepo) LoadAccounts(ctx context.Context, a *[]*proto.Account) (err error) { + root := filepath.Join(r.cfg.Repo.Disk.Path, accountsFolder) + return filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + acc := &proto.Account{} + if e := r.LoadAccount(ctx, filepath.Base(path), acc); e != nil { + r.log.Err(e).Msg("could not load account") + return nil + } + *a = append(*a, acc) + return nil + }) +} + // DeleteAccount from the local filesystem func (r DiskRepo) DeleteAccount(ctx context.Context, id string) (err error) { path := filepath.Join(r.cfg.Repo.Disk.Path, accountsFolder, id) @@ -118,6 +132,20 @@ func (r DiskRepo) LoadGroup(ctx context.Context, id string, g *proto.Group) (err return json.Unmarshal(data, g) } +// LoadGroups loads all the groups from the local filesystem +func (r DiskRepo) LoadGroups(ctx context.Context, g *[]*proto.Group) (err error) { + root := filepath.Join(r.cfg.Repo.Disk.Path, groupsFolder) + return filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + grp := &proto.Group{} + if e := r.LoadGroup(ctx, filepath.Base(path), grp); e != nil { + r.log.Err(e).Msg("could not load group") + return nil + } + *g = append(*g, grp) + return nil + }) +} + // DeleteGroup from the local filesystem func (r DiskRepo) DeleteGroup(ctx context.Context, id string) (err error) { path := filepath.Join(r.cfg.Repo.Disk.Path, groupsFolder, id) @@ -128,9 +156,6 @@ func (r DiskRepo) DeleteGroup(ctx context.Context, id string) (err error) { } return - - //r.log.Error().Err(err).Str("id", id).Str("path", path).Msg("could not remove group") - //return merrors.InternalServerError(r.serviceID, "could not remove group: %v", err.Error()) } // deflateMemberOf replaces the groups of a user with an instance that only contains the id diff --git a/accounts/pkg/storage/repo.go b/accounts/pkg/storage/repo.go index 27f278876a..739dff43a8 100644 --- a/accounts/pkg/storage/repo.go +++ b/accounts/pkg/storage/repo.go @@ -2,20 +2,23 @@ package storage import ( "context" + "github.com/owncloud/ocis/accounts/pkg/proto/v0" ) const ( accountsFolder = "accounts" - groupsFolder = "groups" + groupsFolder = "groups" ) // Repo defines the storage operations type Repo interface { WriteAccount(ctx context.Context, a *proto.Account) (err error) LoadAccount(ctx context.Context, id string, a *proto.Account) (err error) + LoadAccounts(ctx context.Context, a *[]*proto.Account) (err error) DeleteAccount(ctx context.Context, id string) (err error) WriteGroup(ctx context.Context, g *proto.Group) (err error) LoadGroup(ctx context.Context, id string, g *proto.Group) (err error) + LoadGroups(ctx context.Context, g *[]*proto.Group) (err error) DeleteGroup(ctx context.Context, id string) (err error) } diff --git a/changelog/unreleased/accounts-index-rebuild.md b/changelog/unreleased/accounts-index-rebuild.md new file mode 100644 index 0000000000..bce22a26e0 --- /dev/null +++ b/changelog/unreleased/accounts-index-rebuild.md @@ -0,0 +1,9 @@ +Change: Rebuild index command for accounts + +Tags: accounts + +The index for the accounts service can now be rebuilt by running the cli command `./bin/ocis accounts rebuild`. +It deletes all configured indices and rebuilds them from the documents found on storage. For this we also introduced +a `LoadAccounts` and `LoadGroups` function on storage for loading all existing documents. + +https://github.com/owncloud/ocis/pull/748