From 62b654ea1805b752010182f740f56fb0ad1f51be Mon Sep 17 00:00:00 2001 From: Fabi <38692350+fgerschwiler@users.noreply.github.com> Date: Thu, 25 Jun 2020 08:12:29 +0200 Subject: [PATCH] feat: iam members in admin api (#272) * feat: iam members in admin api * feat: add error id in translate error * fix: resolve merge conflicts --- cmd/zitadel/authz.yaml | 9 +- .../eventsourcing/eventstore/iam.go | 67 + .../eventsourcing/handler/handler.go | 7 +- .../eventsourcing/handler/iam_member.go | 127 ++ .../repository/eventsourcing/repository.go | 13 +- .../eventsourcing/spooler/spooler.go | 4 +- .../eventsourcing/view/iam_member.go | 56 + internal/admin/repository/iam.go | 15 + internal/admin/repository/repository.go | 1 + internal/api/grpc/caos_errors.go | 29 +- internal/iam/model/iam_member.go | 4 +- internal/iam/model/iam_member_view.go | 58 + .../iam/repository/view/iam_member_view.go | 59 + .../iam/repository/view/model/iam_member.go | 100 + .../repository/view/model/iam_member_query.go | 69 + .../repository/view/model/org_member_query.go | 24 +- internal/tracing/span.go | 2 +- .../cockroach/V1.23__admin_iam_members.sql | 20 + pkg/admin/admin.go | 7 +- pkg/admin/api/grpc/admin.pb.authoptions.go | 25 + pkg/admin/api/grpc/admin.pb.go | 1823 ++++++++++++++--- pkg/admin/api/grpc/admin.pb.gw.go | 225 ++ pkg/admin/api/grpc/admin.swagger.json | 309 +++ pkg/admin/api/grpc/iam_member.go | 41 + pkg/admin/api/grpc/iam_member_converter.go | 138 ++ pkg/admin/api/grpc/server.go | 22 +- pkg/admin/api/proto/admin.proto | 132 ++ 27 files changed, 3023 insertions(+), 363 deletions(-) create mode 100644 internal/admin/repository/eventsourcing/eventstore/iam.go create mode 100644 internal/admin/repository/eventsourcing/handler/iam_member.go create mode 100644 internal/admin/repository/eventsourcing/view/iam_member.go create mode 100644 internal/admin/repository/iam.go create mode 100644 internal/iam/model/iam_member_view.go create mode 100644 internal/iam/repository/view/iam_member_view.go create mode 100644 internal/iam/repository/view/model/iam_member.go create mode 100644 internal/iam/repository/view/model/iam_member_query.go create mode 100644 migrations/cockroach/V1.23__admin_iam_members.sql create mode 100644 pkg/admin/api/grpc/iam_member.go create mode 100644 pkg/admin/api/grpc/iam_member_converter.go diff --git a/cmd/zitadel/authz.yaml b/cmd/zitadel/authz.yaml index df0e1e0c3..8879e417a 100644 --- a/cmd/zitadel/authz.yaml +++ b/cmd/zitadel/authz.yaml @@ -4,6 +4,12 @@ InternalAuthZ: Permissions: - "iam.read" - "iam.write" + - "iam.policy.read" + - "iam.policy.write" + - "iam.policy.delete" + - "iam.member.read" + - "iam.member.write" + - "iam.member.delete" - "org.read" - "org.write" - "org.member.read" @@ -36,9 +42,6 @@ InternalAuthZ: - "project.grant.member.read" - "project.grant.member.write" - "project.grant.member.delete" - - "iam.policy.read" - - "iam.policy.write" - - "iam.policy.delete" - Role: 'ORG_OWNER' Permissions: - "org.read" diff --git a/internal/admin/repository/eventsourcing/eventstore/iam.go b/internal/admin/repository/eventsourcing/eventstore/iam.go new file mode 100644 index 000000000..8097647f3 --- /dev/null +++ b/internal/admin/repository/eventsourcing/eventstore/iam.go @@ -0,0 +1,67 @@ +package eventstore + +import ( + "context" + admin_view "github.com/caos/zitadel/internal/admin/repository/eventsourcing/view" + "github.com/caos/zitadel/internal/config/systemdefaults" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "strings" + + iam_model "github.com/caos/zitadel/internal/iam/model" + iam_es "github.com/caos/zitadel/internal/iam/repository/eventsourcing" +) + +type IamRepository struct { + SearchLimit uint64 + *iam_es.IamEventstore + View *admin_view.View + SystemDefaults systemdefaults.SystemDefaults + Roles []string +} + +func (repo *IamRepository) IamMemberByID(ctx context.Context, orgID, userID string) (*iam_model.IamMemberView, error) { + member, err := repo.View.IamMemberByIDs(orgID, userID) + if err != nil { + return nil, err + } + return iam_es_model.IamMemberToModel(member), nil +} + +func (repo *IamRepository) AddIamMember(ctx context.Context, member *iam_model.IamMember) (*iam_model.IamMember, error) { + member.AggregateID = repo.SystemDefaults.IamID + return repo.IamEventstore.AddIamMember(ctx, member) +} + +func (repo *IamRepository) ChangeIamMember(ctx context.Context, member *iam_model.IamMember) (*iam_model.IamMember, error) { + member.AggregateID = repo.SystemDefaults.IamID + return repo.IamEventstore.ChangeIamMember(ctx, member) +} + +func (repo *IamRepository) RemoveIamMember(ctx context.Context, userID string) error { + member := iam_model.NewIamMember(repo.SystemDefaults.IamID, userID) + return repo.IamEventstore.RemoveIamMember(ctx, member) +} + +func (repo *IamRepository) SearchIamMembers(ctx context.Context, request *iam_model.IamMemberSearchRequest) (*iam_model.IamMemberSearchResponse, error) { + request.EnsureLimit(repo.SearchLimit) + members, count, err := repo.View.SearchIamMembers(request) + if err != nil { + return nil, err + } + return &iam_model.IamMemberSearchResponse{ + Offset: request.Offset, + Limit: request.Limit, + TotalResult: uint64(count), + Result: iam_es_model.IamMembersToModel(members), + }, nil +} + +func (repo *IamRepository) GetIamMemberRoles() []string { + roles := make([]string, 0) + for _, roleMap := range repo.Roles { + if strings.HasPrefix(roleMap, "IAM") { + roles = append(roles, roleMap) + } + } + return roles +} diff --git a/internal/admin/repository/eventsourcing/handler/handler.go b/internal/admin/repository/eventsourcing/handler/handler.go index b12ef95bc..138d0bf93 100644 --- a/internal/admin/repository/eventsourcing/handler/handler.go +++ b/internal/admin/repository/eventsourcing/handler/handler.go @@ -6,7 +6,6 @@ import ( "github.com/caos/zitadel/internal/admin/repository/eventsourcing/view" "github.com/caos/zitadel/internal/config/types" "github.com/caos/zitadel/internal/eventstore/spooler" - proj_event "github.com/caos/zitadel/internal/project/repository/eventsourcing" usr_event "github.com/caos/zitadel/internal/user/repository/eventsourcing" ) @@ -24,13 +23,13 @@ type handler struct { } type EventstoreRepos struct { - ProjectEvents *proj_event.ProjectEventstore - UserEvents *usr_event.UserEventstore + UserEvents *usr_event.UserEventstore } -func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View) []spooler.Handler { +func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, repos EventstoreRepos) []spooler.Handler { return []spooler.Handler{ &Org{handler: handler{view, bulkLimit, configs.cycleDuration("Org"), errorCount}}, + &IamMember{handler: handler{view, bulkLimit, configs.cycleDuration("IamMember"), errorCount}, userEvents: repos.UserEvents}, } } diff --git a/internal/admin/repository/eventsourcing/handler/iam_member.go b/internal/admin/repository/eventsourcing/handler/iam_member.go new file mode 100644 index 000000000..f311b3e1e --- /dev/null +++ b/internal/admin/repository/eventsourcing/handler/iam_member.go @@ -0,0 +1,127 @@ +package handler + +import ( + "context" + "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "time" + + "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + usr_model "github.com/caos/zitadel/internal/user/model" + usr_event "github.com/caos/zitadel/internal/user/repository/eventsourcing" + usr_es_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" +) + +type IamMember struct { + handler + userEvents *usr_event.UserEventstore +} + +const ( + iamMemberTable = "admin_api.iam_members" +) + +func (m *IamMember) MinimumCycleDuration() time.Duration { return m.cycleDuration } + +func (m *IamMember) ViewModel() string { + return iamMemberTable +} + +func (m *IamMember) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestIamMemberSequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.IamAggregate, usr_es_model.UserAggregate). + LatestSequenceFilter(sequence), nil +} + +func (m *IamMember) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.IamAggregate: + err = m.processIamMember(event) + case usr_es_model.UserAggregate: + err = m.processUser(event) + } + return err +} + +func (m *IamMember) processIamMember(event *models.Event) (err error) { + member := new(iam_model.IamMemberView) + switch event.Type { + case model.IamMemberAdded: + member.AppendEvent(event) + m.fillData(member) + case model.IamMemberChanged: + err := member.SetData(event) + if err != nil { + return err + } + member, err = m.view.IamMemberByIDs(event.AggregateID, member.UserID) + if err != nil { + return err + } + member.AppendEvent(event) + case model.IamMemberRemoved: + err := member.SetData(event) + if err != nil { + return err + } + return m.view.DeleteIamMember(event.AggregateID, member.UserID, event.Sequence) + default: + return m.view.ProcessedIamMemberSequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutIamMember(member, member.Sequence) +} + +func (m *IamMember) processUser(event *models.Event) (err error) { + switch event.Type { + case usr_es_model.UserProfileChanged, + usr_es_model.UserEmailChanged: + members, err := m.view.IamMembersByUserID(event.AggregateID) + if err != nil { + return err + } + user, err := m.userEvents.UserByID(context.Background(), event.AggregateID) + if err != nil { + return err + } + for _, member := range members { + m.fillUserData(member, user) + err = m.view.PutIamMember(member, event.Sequence) + if err != nil { + return err + } + } + default: + return m.view.ProcessedIamMemberSequence(event.Sequence) + } + return nil +} + +func (m *IamMember) fillData(member *iam_model.IamMemberView) (err error) { + user, err := m.userEvents.UserByID(context.Background(), member.UserID) + if err != nil { + return err + } + m.fillUserData(member, user) + return nil +} + +func (m *IamMember) fillUserData(member *iam_model.IamMemberView, user *usr_model.User) { + member.UserName = user.UserName + member.FirstName = user.FirstName + member.LastName = user.LastName + member.Email = user.EmailAddress +} +func (m *IamMember) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-Ld9ow", "id", event.AggregateID).WithError(err).Warn("something went wrong in iammember handler") + return spooler.HandleError(event, err, m.view.GetLatestIamMemberFailedEvent, m.view.ProcessedIamMemberFailedEvent, m.view.ProcessedIamMemberSequence, m.errorCountUntilSkip) +} diff --git a/internal/admin/repository/eventsourcing/repository.go b/internal/admin/repository/eventsourcing/repository.go index 8b77e5fe8..66b27010a 100644 --- a/internal/admin/repository/eventsourcing/repository.go +++ b/internal/admin/repository/eventsourcing/repository.go @@ -2,6 +2,7 @@ package eventsourcing import ( "context" + "github.com/caos/zitadel/internal/admin/repository/eventsourcing/handler" es_policy "github.com/caos/zitadel/internal/policy/repository/eventsourcing" "github.com/caos/logging" @@ -30,10 +31,11 @@ type Config struct { type EsRepository struct { spooler *es_spol.Spooler eventstore.OrgRepo + eventstore.IamRepository eventstore.AdministratorRepo } -func Start(ctx context.Context, conf Config, systemDefaults sd.SystemDefaults) (*EsRepository, error) { +func Start(ctx context.Context, conf Config, systemDefaults sd.SystemDefaults, roles []string) (*EsRepository, error) { es, err := es_int.Start(conf.Eventstore) if err != nil { return nil, err @@ -84,7 +86,7 @@ func Start(ctx context.Context, conf Config, systemDefaults sd.SystemDefaults) ( err = setup.StartSetup(systemDefaults, eventstoreRepos).Execute(ctx) logging.Log("SERVE-djs3R").OnError(err).Panic("failed to execute setup") - spool := spooler.StartSpooler(conf.Spooler, es, view, sqlClient) + spool := spooler.StartSpooler(conf.Spooler, es, view, sqlClient, handler.EventstoreRepos{UserEvents: user}) return &EsRepository{ spooler: spool, @@ -96,6 +98,13 @@ func Start(ctx context.Context, conf Config, systemDefaults sd.SystemDefaults) ( View: view, SearchLimit: conf.SearchLimit, }, + IamRepository: eventstore.IamRepository{ + IamEventstore: iam, + View: view, + SystemDefaults: systemDefaults, + SearchLimit: conf.SearchLimit, + Roles: roles, + }, AdministratorRepo: eventstore.AdministratorRepo{ View: view, }, diff --git a/internal/admin/repository/eventsourcing/spooler/spooler.go b/internal/admin/repository/eventsourcing/spooler/spooler.go index 0929070b0..8b04542d1 100644 --- a/internal/admin/repository/eventsourcing/spooler/spooler.go +++ b/internal/admin/repository/eventsourcing/spooler/spooler.go @@ -16,12 +16,12 @@ type SpoolerConfig struct { Handlers handler.Configs } -func StartSpooler(c SpoolerConfig, es eventstore.Eventstore, view *view.View, sql *sql.DB) *spooler.Spooler { +func StartSpooler(c SpoolerConfig, es eventstore.Eventstore, view *view.View, sql *sql.DB, repos handler.EventstoreRepos) *spooler.Spooler { spoolerConfig := spooler.Config{ Eventstore: es, Locker: &locker{dbClient: sql}, ConcurrentTasks: c.ConcurrentTasks, - ViewHandlers: handler.Register(c.Handlers, c.BulkLimit, c.FailureCountUntilSkip, view), + ViewHandlers: handler.Register(c.Handlers, c.BulkLimit, c.FailureCountUntilSkip, view, repos), } spool := spoolerConfig.New() spool.Start() diff --git a/internal/admin/repository/eventsourcing/view/iam_member.go b/internal/admin/repository/eventsourcing/view/iam_member.go new file mode 100644 index 000000000..82bed5c2d --- /dev/null +++ b/internal/admin/repository/eventsourcing/view/iam_member.go @@ -0,0 +1,56 @@ +package view + +import ( + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + iamMemberTable = "admin_api.iam_members" +) + +func (v *View) IamMemberByIDs(orgID, userID string) (*model.IamMemberView, error) { + return view.IamMemberByIDs(v.Db, iamMemberTable, orgID, userID) +} + +func (v *View) SearchIamMembers(request *iam_model.IamMemberSearchRequest) ([]*model.IamMemberView, int, error) { + return view.SearchIamMembers(v.Db, iamMemberTable, request) +} + +func (v *View) IamMembersByUserID(userID string) ([]*model.IamMemberView, error) { + return view.IamMembersByUserID(v.Db, iamMemberTable, userID) +} + +func (v *View) PutIamMember(org *model.IamMemberView, sequence uint64) error { + err := view.PutIamMember(v.Db, iamMemberTable, org) + if err != nil { + return err + } + return v.ProcessedIamMemberSequence(sequence) +} + +func (v *View) DeleteIamMember(orgID, userID string, eventSequence uint64) error { + err := view.DeleteIamMember(v.Db, iamMemberTable, orgID, userID) + if err != nil { + return nil + } + return v.ProcessedIamMemberSequence(eventSequence) +} + +func (v *View) GetLatestIamMemberSequence() (uint64, error) { + return v.latestSequence(iamMemberTable) +} + +func (v *View) ProcessedIamMemberSequence(eventSequence uint64) error { + return v.saveCurrentSequence(iamMemberTable, eventSequence) +} + +func (v *View) GetLatestIamMemberFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(iamMemberTable, sequence) +} + +func (v *View) ProcessedIamMemberFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/admin/repository/iam.go b/internal/admin/repository/iam.go new file mode 100644 index 000000000..85e588c61 --- /dev/null +++ b/internal/admin/repository/iam.go @@ -0,0 +1,15 @@ +package repository + +import ( + "context" + iam_model "github.com/caos/zitadel/internal/iam/model" +) + +type IamRepository interface { + SearchIamMembers(ctx context.Context, request *iam_model.IamMemberSearchRequest) (*iam_model.IamMemberSearchResponse, error) + AddIamMember(ctx context.Context, member *iam_model.IamMember) (*iam_model.IamMember, error) + ChangeIamMember(ctx context.Context, member *iam_model.IamMember) (*iam_model.IamMember, error) + RemoveIamMember(ctx context.Context, userID string) error + + GetIamMemberRoles() []string +} diff --git a/internal/admin/repository/repository.go b/internal/admin/repository/repository.go index 5eb3296d0..b646459e2 100644 --- a/internal/admin/repository/repository.go +++ b/internal/admin/repository/repository.go @@ -5,5 +5,6 @@ import "context" type Repository interface { Health(ctx context.Context) error OrgRepository + IamRepository AdministratorRepository } diff --git a/internal/api/grpc/caos_errors.go b/internal/api/grpc/caos_errors.go index 2ae63c1ee..98428da0f 100644 --- a/internal/api/grpc/caos_errors.go +++ b/internal/api/grpc/caos_errors.go @@ -12,40 +12,41 @@ func CaosToGRPCError(err error, ctx context.Context, translator *i18n.Translator if err == nil { return nil } - code, msg, ok := Extract(err) + code, msg, id, ok := Extract(err) if !ok { return status.Convert(err).Err() } if translator != nil { msg = translator.LocalizeFromCtx(ctx, msg, nil) - + msg = msg + "(" + id + ")" } return status.Error(code, msg) } -func Extract(err error) (c codes.Code, msg string, ok bool) { +func Extract(err error) (c codes.Code, msg, id string, ok bool) { switch caosErr := err.(type) { case *caos_errs.AlreadyExistsError: - return codes.AlreadyExists, caosErr.GetMessage(), true + + return codes.AlreadyExists, caosErr.GetMessage(), caosErr.GetID(), true case *caos_errs.DeadlineExceededError: - return codes.DeadlineExceeded, caosErr.GetMessage(), true + return codes.DeadlineExceeded, caosErr.GetMessage(), caosErr.GetID(), true case caos_errs.InternalError: - return codes.Internal, caosErr.GetMessage(), true + return codes.Internal, caosErr.GetMessage(), caosErr.GetID(), true case *caos_errs.InvalidArgumentError: - return codes.InvalidArgument, caosErr.GetMessage(), true + return codes.InvalidArgument, caosErr.GetMessage(), caosErr.GetID(), true case *caos_errs.NotFoundError: - return codes.NotFound, caosErr.GetMessage(), true + return codes.NotFound, caosErr.GetMessage(), caosErr.GetID(), true case *caos_errs.PermissionDeniedError: - return codes.PermissionDenied, caosErr.GetMessage(), true + return codes.PermissionDenied, caosErr.GetMessage(), caosErr.GetID(), true case *caos_errs.PreconditionFailedError: - return codes.FailedPrecondition, caosErr.GetMessage(), true + return codes.FailedPrecondition, caosErr.GetMessage(), caosErr.GetID(), true case *caos_errs.UnauthenticatedError: - return codes.Unauthenticated, caosErr.GetMessage(), true + return codes.Unauthenticated, caosErr.GetMessage(), caosErr.GetID(), true case *caos_errs.UnavailableError: - return codes.Unavailable, caosErr.GetMessage(), true + return codes.Unavailable, caosErr.GetMessage(), caosErr.GetID(), true case *caos_errs.UnimplementedError: - return codes.Unimplemented, caosErr.GetMessage(), true + return codes.Unimplemented, caosErr.GetMessage(), caosErr.GetID(), true default: - return codes.Unknown, err.Error(), false + return codes.Unknown, err.Error(), "", false } } diff --git a/internal/iam/model/iam_member.go b/internal/iam/model/iam_member.go index d4374b9ee..2fe0b08b6 100644 --- a/internal/iam/model/iam_member.go +++ b/internal/iam/model/iam_member.go @@ -9,8 +9,8 @@ type IamMember struct { Roles []string } -func NewIamMember(projectID, userID string) *IamMember { - return &IamMember{ObjectRoot: es_models.ObjectRoot{AggregateID: projectID}, UserID: userID} +func NewIamMember(iamID, userID string) *IamMember { + return &IamMember{ObjectRoot: es_models.ObjectRoot{AggregateID: iamID}, UserID: userID} } func (i *IamMember) IsValid() bool { diff --git a/internal/iam/model/iam_member_view.go b/internal/iam/model/iam_member_view.go new file mode 100644 index 000000000..f5471d968 --- /dev/null +++ b/internal/iam/model/iam_member_view.go @@ -0,0 +1,58 @@ +package model + +import ( + "github.com/caos/zitadel/internal/model" + "time" +) + +type IamMemberView struct { + UserID string + IamID string + UserName string + Email string + FirstName string + LastName string + Roles []string + CreationDate time.Time + ChangeDate time.Time + Sequence uint64 +} + +type IamMemberSearchRequest struct { + Offset uint64 + Limit uint64 + SortingColumn IamMemberSearchKey + Asc bool + Queries []*IamMemberSearchQuery +} + +type IamMemberSearchKey int32 + +const ( + IamMemberSearchKeyUnspecified IamMemberSearchKey = iota + IamMemberSearchKeyUserName + IamMemberSearchKeyEmail + IamMemberSearchKeyFirstName + IamMemberSearchKeyLastName + IamMemberSearchKeyIamID + IamMemberSearchKeyUserID +) + +type IamMemberSearchQuery struct { + Key IamMemberSearchKey + Method model.SearchMethod + Value interface{} +} + +type IamMemberSearchResponse struct { + Offset uint64 + Limit uint64 + TotalResult uint64 + Result []*IamMemberView +} + +func (r *IamMemberSearchRequest) EnsureLimit(limit uint64) { + if r.Limit == 0 || r.Limit > limit { + r.Limit = limit + } +} diff --git a/internal/iam/repository/view/iam_member_view.go b/internal/iam/repository/view/iam_member_view.go new file mode 100644 index 000000000..d0cd05f06 --- /dev/null +++ b/internal/iam/repository/view/iam_member_view.go @@ -0,0 +1,59 @@ +package view + +import ( + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" + "github.com/jinzhu/gorm" +) + +func IamMemberByIDs(db *gorm.DB, table, orgID, userID string) (*model.IamMemberView, error) { + member := new(model.IamMemberView) + + orgIDQuery := &model.IamMemberSearchQuery{Key: iam_model.IamMemberSearchKeyIamID, Value: orgID, Method: global_model.SearchMethodEquals} + userIDQuery := &model.IamMemberSearchQuery{Key: iam_model.IamMemberSearchKeyUserID, Value: userID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, orgIDQuery, userIDQuery) + err := query(db, member) + return member, err +} + +func SearchIamMembers(db *gorm.DB, table string, req *iam_model.IamMemberSearchRequest) ([]*model.IamMemberView, int, error) { + members := make([]*model.IamMemberView, 0) + query := repository.PrepareSearchQuery(table, model.IamMemberSearchRequest{Limit: req.Limit, Offset: req.Offset, Queries: req.Queries}) + count, err := query(db, &members) + if err != nil { + return nil, 0, err + } + return members, count, nil +} +func IamMembersByUserID(db *gorm.DB, table string, userID string) ([]*model.IamMemberView, error) { + members := make([]*model.IamMemberView, 0) + queries := []*iam_model.IamMemberSearchQuery{ + { + Key: iam_model.IamMemberSearchKeyUserID, + Value: userID, + Method: global_model.SearchMethodEquals, + }, + } + query := repository.PrepareSearchQuery(table, model.IamMemberSearchRequest{Queries: queries}) + _, err := query(db, &members) + if err != nil { + return nil, err + } + return members, nil +} + +func PutIamMember(db *gorm.DB, table string, role *model.IamMemberView) error { + save := repository.PrepareSave(table) + return save(db, role) +} + +func DeleteIamMember(db *gorm.DB, table, orgID, userID string) error { + member, err := IamMemberByIDs(db, table, orgID, userID) + if err != nil { + return err + } + delete := repository.PrepareDeleteByObject(table, member) + return delete(db) +} diff --git a/internal/iam/repository/view/model/iam_member.go b/internal/iam/repository/view/model/iam_member.go new file mode 100644 index 000000000..66e9f6f1e --- /dev/null +++ b/internal/iam/repository/view/model/iam_member.go @@ -0,0 +1,100 @@ +package model + +import ( + "encoding/json" + es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "time" + + "github.com/caos/logging" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/iam/model" + "github.com/lib/pq" +) + +const ( + IamMemberKeyUserID = "user_id" + IamMemberKeyIamID = "org_id" + IamMemberKeyUserName = "user_name" + IamMemberKeyEmail = "email" + IamMemberKeyFirstName = "first_name" + IamMemberKeyLastName = "last_name" +) + +type IamMemberView struct { + UserID string `json:"userId" gorm:"column:user_id;primary_key"` + IamID string `json:"-" gorm:"column:iam_id"` + UserName string `json:"-" gorm:"column:user_name"` + Email string `json:"-" gorm:"column:email_address"` + FirstName string `json:"-" gorm:"column:first_name"` + LastName string `json:"-" gorm:"column:last_name"` + Roles pq.StringArray `json:"roles" gorm:"column:roles"` + Sequence uint64 `json:"-" gorm:"column:sequence"` + + CreationDate time.Time `json:"-" gorm:"column:creation_date"` + ChangeDate time.Time `json:"-" gorm:"column:change_date"` +} + +func IamMemberViewFromModel(member *model.IamMemberView) *IamMemberView { + return &IamMemberView{ + UserID: member.UserID, + IamID: member.IamID, + UserName: member.UserName, + Email: member.Email, + FirstName: member.FirstName, + LastName: member.LastName, + Roles: member.Roles, + Sequence: member.Sequence, + CreationDate: member.CreationDate, + ChangeDate: member.ChangeDate, + } +} + +func IamMemberToModel(member *IamMemberView) *model.IamMemberView { + return &model.IamMemberView{ + UserID: member.UserID, + IamID: member.IamID, + UserName: member.UserName, + Email: member.Email, + FirstName: member.FirstName, + LastName: member.LastName, + Roles: member.Roles, + Sequence: member.Sequence, + CreationDate: member.CreationDate, + ChangeDate: member.ChangeDate, + } +} + +func IamMembersToModel(roles []*IamMemberView) []*model.IamMemberView { + result := make([]*model.IamMemberView, len(roles)) + for i, r := range roles { + result[i] = IamMemberToModel(r) + } + return result +} + +func (r *IamMemberView) AppendEvent(event *models.Event) (err error) { + r.Sequence = event.Sequence + r.ChangeDate = event.CreationDate + switch event.Type { + case es_model.IamMemberAdded: + r.setRootData(event) + r.CreationDate = event.CreationDate + err = r.SetData(event) + case es_model.IamMemberChanged: + err = r.SetData(event) + } + return err +} + +func (r *IamMemberView) setRootData(event *models.Event) { + r.IamID = event.AggregateID +} + +func (r *IamMemberView) SetData(event *models.Event) error { + if err := json.Unmarshal(event.Data, r); err != nil { + logging.Log("EVEN-Psl89").WithError(err).Error("could not unmarshal event data") + return caos_errs.ThrowInternal(err, "MODEL-lub6s", "Could not unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/view/model/iam_member_query.go b/internal/iam/repository/view/model/iam_member_query.go new file mode 100644 index 000000000..30d0fc15b --- /dev/null +++ b/internal/iam/repository/view/model/iam_member_query.go @@ -0,0 +1,69 @@ +package model + +import ( + iam_model "github.com/caos/zitadel/internal/iam/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" +) + +type IamMemberSearchRequest iam_model.IamMemberSearchRequest +type IamMemberSearchQuery iam_model.IamMemberSearchQuery +type IamMemberSearchKey iam_model.IamMemberSearchKey + +func (req IamMemberSearchRequest) GetLimit() uint64 { + return req.Limit +} + +func (req IamMemberSearchRequest) GetOffset() uint64 { + return req.Offset +} + +func (req IamMemberSearchRequest) GetSortingColumn() repository.ColumnKey { + if req.SortingColumn == iam_model.IamMemberSearchKeyUnspecified { + return nil + } + return IamMemberSearchKey(req.SortingColumn) +} + +func (req IamMemberSearchRequest) GetAsc() bool { + return req.Asc +} + +func (req IamMemberSearchRequest) GetQueries() []repository.SearchQuery { + result := make([]repository.SearchQuery, len(req.Queries)) + for i, q := range req.Queries { + result[i] = IamMemberSearchQuery{Key: q.Key, Value: q.Value, Method: q.Method} + } + return result +} + +func (req IamMemberSearchQuery) GetKey() repository.ColumnKey { + return IamMemberSearchKey(req.Key) +} + +func (req IamMemberSearchQuery) GetMethod() global_model.SearchMethod { + return req.Method +} + +func (req IamMemberSearchQuery) GetValue() interface{} { + return req.Value +} + +func (key IamMemberSearchKey) ToColumnName() string { + switch iam_model.IamMemberSearchKey(key) { + case iam_model.IamMemberSearchKeyEmail: + return IamMemberKeyEmail + case iam_model.IamMemberSearchKeyFirstName: + return IamMemberKeyFirstName + case iam_model.IamMemberSearchKeyLastName: + return IamMemberKeyLastName + case iam_model.IamMemberSearchKeyUserName: + return IamMemberKeyUserName + case iam_model.IamMemberSearchKeyUserID: + return IamMemberKeyUserID + case iam_model.IamMemberSearchKeyIamID: + return IamMemberKeyIamID + default: + return "" + } +} diff --git a/internal/org/repository/view/model/org_member_query.go b/internal/org/repository/view/model/org_member_query.go index a094d5a0f..a4ac8cf3b 100644 --- a/internal/org/repository/view/model/org_member_query.go +++ b/internal/org/repository/view/model/org_member_query.go @@ -2,13 +2,13 @@ package model import ( global_model "github.com/caos/zitadel/internal/model" - proj_model "github.com/caos/zitadel/internal/org/model" + org_model "github.com/caos/zitadel/internal/org/model" "github.com/caos/zitadel/internal/view/repository" ) -type OrgMemberSearchRequest proj_model.OrgMemberSearchRequest -type OrgMemberSearchQuery proj_model.OrgMemberSearchQuery -type OrgMemberSearchKey proj_model.OrgMemberSearchKey +type OrgMemberSearchRequest org_model.OrgMemberSearchRequest +type OrgMemberSearchQuery org_model.OrgMemberSearchQuery +type OrgMemberSearchKey org_model.OrgMemberSearchKey func (req OrgMemberSearchRequest) GetLimit() uint64 { return req.Limit @@ -19,7 +19,7 @@ func (req OrgMemberSearchRequest) GetOffset() uint64 { } func (req OrgMemberSearchRequest) GetSortingColumn() repository.ColumnKey { - if req.SortingColumn == proj_model.OrgMemberSearchKeyUnspecified { + if req.SortingColumn == org_model.OrgMemberSearchKeyUnspecified { return nil } return OrgMemberSearchKey(req.SortingColumn) @@ -50,18 +50,18 @@ func (req OrgMemberSearchQuery) GetValue() interface{} { } func (key OrgMemberSearchKey) ToColumnName() string { - switch proj_model.OrgMemberSearchKey(key) { - case proj_model.OrgMemberSearchKeyEmail: + switch org_model.OrgMemberSearchKey(key) { + case org_model.OrgMemberSearchKeyEmail: return OrgMemberKeyEmail - case proj_model.OrgMemberSearchKeyFirstName: + case org_model.OrgMemberSearchKeyFirstName: return OrgMemberKeyFirstName - case proj_model.OrgMemberSearchKeyLastName: + case org_model.OrgMemberSearchKeyLastName: return OrgMemberKeyLastName - case proj_model.OrgMemberSearchKeyUserName: + case org_model.OrgMemberSearchKeyUserName: return OrgMemberKeyUserName - case proj_model.OrgMemberSearchKeyUserID: + case org_model.OrgMemberSearchKeyUserID: return OrgMemberKeyUserID - case proj_model.OrgMemberSearchKeyOrgID: + case org_model.OrgMemberSearchKeyOrgID: return OrgMemberKeyOrgID default: return "" diff --git a/internal/tracing/span.go b/internal/tracing/span.go index aff92822c..9ef3b7de0 100644 --- a/internal/tracing/span.go +++ b/internal/tracing/span.go @@ -40,7 +40,7 @@ func (s *Span) SetStatusByError(err error) { } func statusFromError(err error) trace.Status { - code, msg, _ := grpc.Extract(err) + code, msg, _, _ := grpc.Extract(err) return trace.Status{Code: int32(code), Message: msg} } diff --git a/migrations/cockroach/V1.23__admin_iam_members.sql b/migrations/cockroach/V1.23__admin_iam_members.sql new file mode 100644 index 000000000..1b7e77b22 --- /dev/null +++ b/migrations/cockroach/V1.23__admin_iam_members.sql @@ -0,0 +1,20 @@ +BEGIN; + +CREATE TABLE admin_api.iam_members ( + user_id TEXT, + + iam_id TEXT, + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + + user_name TEXT, + email_address TEXT, + first_name TEXT, + last_name TEXT, + roles TEXT ARRAY, + sequence BIGINT, + + PRIMARY KEY (user_id) +); + +COMMIT; diff --git a/pkg/admin/admin.go b/pkg/admin/admin.go index ccfd86f98..e87bed0df 100644 --- a/pkg/admin/admin.go +++ b/pkg/admin/admin.go @@ -17,7 +17,12 @@ type Config struct { } func Start(ctx context.Context, config Config, authZRepo *authz_repo.EsRepository, authZ auth.Config, systemDefaults sd.SystemDefaults) { - repo, err := eventsourcing.Start(ctx, config.Repository, systemDefaults) + roles := make([]string, len(authZ.RolePermissionMappings)) + for i, role := range authZ.RolePermissionMappings { + roles[i] = role.Role + } + + repo, err := eventsourcing.Start(ctx, config.Repository, systemDefaults, roles) logging.Log("MAIN-9uBxp").OnError(err).Panic("unable to start app") api.Start(ctx, config.API, authZRepo, authZ, systemDefaults, repo) diff --git a/pkg/admin/api/grpc/admin.pb.authoptions.go b/pkg/admin/api/grpc/admin.pb.authoptions.go index 07f02a886..9999e9054 100644 --- a/pkg/admin/api/grpc/admin.pb.authoptions.go +++ b/pkg/admin/api/grpc/admin.pb.authoptions.go @@ -55,6 +55,31 @@ var AdminService_AuthMethods = utils_auth.MethodMapping{ CheckParam: "", }, + "/caos.zitadel.admin.api.v1.AdminService/GetIamMemberRoles": utils_auth.Option{ + Permission: "iam.member.read", + CheckParam: "", + }, + + "/caos.zitadel.admin.api.v1.AdminService/AddIamMember": utils_auth.Option{ + Permission: "iam.member.write", + CheckParam: "", + }, + + "/caos.zitadel.admin.api.v1.AdminService/ChangeIamMember": utils_auth.Option{ + Permission: "iam.member.write", + CheckParam: "", + }, + + "/caos.zitadel.admin.api.v1.AdminService/RemoveIamMember": utils_auth.Option{ + Permission: "iam.member.delete", + CheckParam: "", + }, + + "/caos.zitadel.admin.api.v1.AdminService/SearchIamMembers": utils_auth.Option{ + Permission: "iam.member.read", + CheckParam: "", + }, + "/caos.zitadel.admin.api.v1.AdminService/GetViews": utils_auth.Option{ Permission: "iam.read", CheckParam: "", diff --git a/pkg/admin/api/grpc/admin.pb.go b/pkg/admin/api/grpc/admin.pb.go index 7523f8fe6..343a567d6 100644 --- a/pkg/admin/api/grpc/admin.pb.go +++ b/pkg/admin/api/grpc/admin.pb.go @@ -299,6 +299,134 @@ func (Gender) EnumDescriptor() ([]byte, []int) { return file_admin_proto_rawDescGZIP(), []int{4} } +type IamMemberSearchKey int32 + +const ( + IamMemberSearchKey_IAMMEMBERSEARCHKEY_UNSPECIFIED IamMemberSearchKey = 0 + IamMemberSearchKey_IAMMEMBERSEARCHKEY_FIRST_NAME IamMemberSearchKey = 1 + IamMemberSearchKey_IAMMEMBERSEARCHKEY_LAST_NAME IamMemberSearchKey = 2 + IamMemberSearchKey_IAMMEMBERSEARCHKEY_EMAIL IamMemberSearchKey = 3 + IamMemberSearchKey_IAMMEMBERSEARCHKEY_USER_ID IamMemberSearchKey = 4 +) + +// Enum value maps for IamMemberSearchKey. +var ( + IamMemberSearchKey_name = map[int32]string{ + 0: "IAMMEMBERSEARCHKEY_UNSPECIFIED", + 1: "IAMMEMBERSEARCHKEY_FIRST_NAME", + 2: "IAMMEMBERSEARCHKEY_LAST_NAME", + 3: "IAMMEMBERSEARCHKEY_EMAIL", + 4: "IAMMEMBERSEARCHKEY_USER_ID", + } + IamMemberSearchKey_value = map[string]int32{ + "IAMMEMBERSEARCHKEY_UNSPECIFIED": 0, + "IAMMEMBERSEARCHKEY_FIRST_NAME": 1, + "IAMMEMBERSEARCHKEY_LAST_NAME": 2, + "IAMMEMBERSEARCHKEY_EMAIL": 3, + "IAMMEMBERSEARCHKEY_USER_ID": 4, + } +) + +func (x IamMemberSearchKey) Enum() *IamMemberSearchKey { + p := new(IamMemberSearchKey) + *p = x + return p +} + +func (x IamMemberSearchKey) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IamMemberSearchKey) Descriptor() protoreflect.EnumDescriptor { + return file_admin_proto_enumTypes[5].Descriptor() +} + +func (IamMemberSearchKey) Type() protoreflect.EnumType { + return &file_admin_proto_enumTypes[5] +} + +func (x IamMemberSearchKey) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use IamMemberSearchKey.Descriptor instead. +func (IamMemberSearchKey) EnumDescriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{5} +} + +type SearchMethod int32 + +const ( + SearchMethod_SEARCHMETHOD_EQUALS SearchMethod = 0 + SearchMethod_SEARCHMETHOD_STARTS_WITH SearchMethod = 1 + SearchMethod_SEARCHMETHOD_CONTAINS SearchMethod = 2 + SearchMethod_SEARCHMETHOD_EQUALS_IGNORE_CASE SearchMethod = 3 + SearchMethod_SEARCHMETHOD_STARTS_WITH_IGNORE_CASE SearchMethod = 4 + SearchMethod_SEARCHMETHOD_CONTAINS_IGNORE_CASE SearchMethod = 5 + SearchMethod_SEARCHMETHOD_NOT_EQUALS SearchMethod = 6 + SearchMethod_SEARCHMETHOD_GREATER_THAN SearchMethod = 7 + SearchMethod_SEARCHMETHOD_LESS_THAN SearchMethod = 8 + SearchMethod_SEARCHMETHOD_IS_ONE_OF SearchMethod = 9 + SearchMethod_SEARCHMETHOD_LIST_CONTAINS SearchMethod = 10 +) + +// Enum value maps for SearchMethod. +var ( + SearchMethod_name = map[int32]string{ + 0: "SEARCHMETHOD_EQUALS", + 1: "SEARCHMETHOD_STARTS_WITH", + 2: "SEARCHMETHOD_CONTAINS", + 3: "SEARCHMETHOD_EQUALS_IGNORE_CASE", + 4: "SEARCHMETHOD_STARTS_WITH_IGNORE_CASE", + 5: "SEARCHMETHOD_CONTAINS_IGNORE_CASE", + 6: "SEARCHMETHOD_NOT_EQUALS", + 7: "SEARCHMETHOD_GREATER_THAN", + 8: "SEARCHMETHOD_LESS_THAN", + 9: "SEARCHMETHOD_IS_ONE_OF", + 10: "SEARCHMETHOD_LIST_CONTAINS", + } + SearchMethod_value = map[string]int32{ + "SEARCHMETHOD_EQUALS": 0, + "SEARCHMETHOD_STARTS_WITH": 1, + "SEARCHMETHOD_CONTAINS": 2, + "SEARCHMETHOD_EQUALS_IGNORE_CASE": 3, + "SEARCHMETHOD_STARTS_WITH_IGNORE_CASE": 4, + "SEARCHMETHOD_CONTAINS_IGNORE_CASE": 5, + "SEARCHMETHOD_NOT_EQUALS": 6, + "SEARCHMETHOD_GREATER_THAN": 7, + "SEARCHMETHOD_LESS_THAN": 8, + "SEARCHMETHOD_IS_ONE_OF": 9, + "SEARCHMETHOD_LIST_CONTAINS": 10, + } +) + +func (x SearchMethod) Enum() *SearchMethod { + p := new(SearchMethod) + *p = x + return p +} + +func (x SearchMethod) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SearchMethod) Descriptor() protoreflect.EnumDescriptor { + return file_admin_proto_enumTypes[6].Descriptor() +} + +func (SearchMethod) Type() protoreflect.EnumType { + return &file_admin_proto_enumTypes[6] +} + +func (x SearchMethod) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SearchMethod.Descriptor instead. +func (SearchMethod) EnumDescriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{6} +} + type OrgID struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1492,6 +1620,597 @@ func (x *OrgIamPolicyID) GetOrgId() string { return "" } +type IamMemberRoles struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Roles []string `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` +} + +func (x *IamMemberRoles) Reset() { + *x = IamMemberRoles{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IamMemberRoles) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IamMemberRoles) ProtoMessage() {} + +func (x *IamMemberRoles) ProtoReflect() protoreflect.Message { + mi := &file_admin_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 IamMemberRoles.ProtoReflect.Descriptor instead. +func (*IamMemberRoles) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{15} +} + +func (x *IamMemberRoles) GetRoles() []string { + if x != nil { + return x.Roles + } + return nil +} + +type IamMember struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + Roles []string `protobuf:"bytes,2,rep,name=roles,proto3" json:"roles,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + Sequence uint64 `protobuf:"varint,5,opt,name=sequence,proto3" json:"sequence,omitempty"` +} + +func (x *IamMember) Reset() { + *x = IamMember{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IamMember) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IamMember) ProtoMessage() {} + +func (x *IamMember) ProtoReflect() protoreflect.Message { + mi := &file_admin_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 IamMember.ProtoReflect.Descriptor instead. +func (*IamMember) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{16} +} + +func (x *IamMember) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *IamMember) GetRoles() []string { + if x != nil { + return x.Roles + } + return nil +} + +func (x *IamMember) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +func (x *IamMember) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *IamMember) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +type AddIamMemberRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + Roles []string `protobuf:"bytes,2,rep,name=roles,proto3" json:"roles,omitempty"` +} + +func (x *AddIamMemberRequest) Reset() { + *x = AddIamMemberRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddIamMemberRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddIamMemberRequest) ProtoMessage() {} + +func (x *AddIamMemberRequest) ProtoReflect() protoreflect.Message { + mi := &file_admin_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 AddIamMemberRequest.ProtoReflect.Descriptor instead. +func (*AddIamMemberRequest) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{17} +} + +func (x *AddIamMemberRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *AddIamMemberRequest) GetRoles() []string { + if x != nil { + return x.Roles + } + return nil +} + +type ChangeIamMemberRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + Roles []string `protobuf:"bytes,2,rep,name=roles,proto3" json:"roles,omitempty"` +} + +func (x *ChangeIamMemberRequest) Reset() { + *x = ChangeIamMemberRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangeIamMemberRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeIamMemberRequest) ProtoMessage() {} + +func (x *ChangeIamMemberRequest) ProtoReflect() protoreflect.Message { + mi := &file_admin_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 ChangeIamMemberRequest.ProtoReflect.Descriptor instead. +func (*ChangeIamMemberRequest) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{18} +} + +func (x *ChangeIamMemberRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *ChangeIamMemberRequest) GetRoles() []string { + if x != nil { + return x.Roles + } + return nil +} + +type RemoveIamMemberRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` +} + +func (x *RemoveIamMemberRequest) Reset() { + *x = RemoveIamMemberRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoveIamMemberRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveIamMemberRequest) ProtoMessage() {} + +func (x *RemoveIamMemberRequest) ProtoReflect() protoreflect.Message { + mi := &file_admin_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 RemoveIamMemberRequest.ProtoReflect.Descriptor instead. +func (*RemoveIamMemberRequest) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{19} +} + +func (x *RemoveIamMemberRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +type IamMemberSearchResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Offset uint64 `protobuf:"varint,1,opt,name=offset,proto3" json:"offset,omitempty"` + Limit uint64 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + TotalResult uint64 `protobuf:"varint,3,opt,name=total_result,json=totalResult,proto3" json:"total_result,omitempty"` + Result []*IamMemberView `protobuf:"bytes,4,rep,name=result,proto3" json:"result,omitempty"` +} + +func (x *IamMemberSearchResponse) Reset() { + *x = IamMemberSearchResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IamMemberSearchResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IamMemberSearchResponse) ProtoMessage() {} + +func (x *IamMemberSearchResponse) ProtoReflect() protoreflect.Message { + mi := &file_admin_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 IamMemberSearchResponse.ProtoReflect.Descriptor instead. +func (*IamMemberSearchResponse) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{20} +} + +func (x *IamMemberSearchResponse) GetOffset() uint64 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *IamMemberSearchResponse) GetLimit() uint64 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *IamMemberSearchResponse) GetTotalResult() uint64 { + if x != nil { + return x.TotalResult + } + return 0 +} + +func (x *IamMemberSearchResponse) GetResult() []*IamMemberView { + if x != nil { + return x.Result + } + return nil +} + +type IamMemberView struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + Roles []string `protobuf:"bytes,2,rep,name=roles,proto3" json:"roles,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + Sequence uint64 `protobuf:"varint,5,opt,name=sequence,proto3" json:"sequence,omitempty"` + UserName string `protobuf:"bytes,6,opt,name=user_name,json=userName,proto3" json:"user_name,omitempty"` + Email string `protobuf:"bytes,7,opt,name=email,proto3" json:"email,omitempty"` + FirstName string `protobuf:"bytes,8,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` + LastName string `protobuf:"bytes,9,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` +} + +func (x *IamMemberView) Reset() { + *x = IamMemberView{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IamMemberView) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IamMemberView) ProtoMessage() {} + +func (x *IamMemberView) ProtoReflect() protoreflect.Message { + mi := &file_admin_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 IamMemberView.ProtoReflect.Descriptor instead. +func (*IamMemberView) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{21} +} + +func (x *IamMemberView) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *IamMemberView) GetRoles() []string { + if x != nil { + return x.Roles + } + return nil +} + +func (x *IamMemberView) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +func (x *IamMemberView) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *IamMemberView) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *IamMemberView) GetUserName() string { + if x != nil { + return x.UserName + } + return "" +} + +func (x *IamMemberView) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *IamMemberView) GetFirstName() string { + if x != nil { + return x.FirstName + } + return "" +} + +func (x *IamMemberView) GetLastName() string { + if x != nil { + return x.LastName + } + return "" +} + +type IamMemberSearchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Offset uint64 `protobuf:"varint,1,opt,name=offset,proto3" json:"offset,omitempty"` + Limit uint64 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + Queries []*IamMemberSearchQuery `protobuf:"bytes,3,rep,name=queries,proto3" json:"queries,omitempty"` +} + +func (x *IamMemberSearchRequest) Reset() { + *x = IamMemberSearchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IamMemberSearchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IamMemberSearchRequest) ProtoMessage() {} + +func (x *IamMemberSearchRequest) ProtoReflect() protoreflect.Message { + mi := &file_admin_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 IamMemberSearchRequest.ProtoReflect.Descriptor instead. +func (*IamMemberSearchRequest) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{22} +} + +func (x *IamMemberSearchRequest) GetOffset() uint64 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *IamMemberSearchRequest) GetLimit() uint64 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *IamMemberSearchRequest) GetQueries() []*IamMemberSearchQuery { + if x != nil { + return x.Queries + } + return nil +} + +type IamMemberSearchQuery struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key IamMemberSearchKey `protobuf:"varint,1,opt,name=key,proto3,enum=caos.zitadel.admin.api.v1.IamMemberSearchKey" json:"key,omitempty"` + Method SearchMethod `protobuf:"varint,2,opt,name=method,proto3,enum=caos.zitadel.admin.api.v1.SearchMethod" json:"method,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *IamMemberSearchQuery) Reset() { + *x = IamMemberSearchQuery{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IamMemberSearchQuery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IamMemberSearchQuery) ProtoMessage() {} + +func (x *IamMemberSearchQuery) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[23] + 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 IamMemberSearchQuery.ProtoReflect.Descriptor instead. +func (*IamMemberSearchQuery) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{23} +} + +func (x *IamMemberSearchQuery) GetKey() IamMemberSearchKey { + if x != nil { + return x.Key + } + return IamMemberSearchKey_IAMMEMBERSEARCHKEY_UNSPECIFIED +} + +func (x *IamMemberSearchQuery) GetMethod() SearchMethod { + if x != nil { + return x.Method + } + return SearchMethod_SEARCHMETHOD_EQUALS +} + +func (x *IamMemberSearchQuery) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + type FailedEventID struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1505,7 +2224,7 @@ type FailedEventID struct { func (x *FailedEventID) Reset() { *x = FailedEventID{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[15] + mi := &file_admin_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1518,7 +2237,7 @@ func (x *FailedEventID) String() string { func (*FailedEventID) ProtoMessage() {} func (x *FailedEventID) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[15] + mi := &file_admin_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1531,7 +2250,7 @@ func (x *FailedEventID) ProtoReflect() protoreflect.Message { // Deprecated: Use FailedEventID.ProtoReflect.Descriptor instead. func (*FailedEventID) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{15} + return file_admin_proto_rawDescGZIP(), []int{24} } func (x *FailedEventID) GetDatabase() string { @@ -1566,7 +2285,7 @@ type FailedEvents struct { func (x *FailedEvents) Reset() { *x = FailedEvents{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[16] + mi := &file_admin_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1579,7 +2298,7 @@ func (x *FailedEvents) String() string { func (*FailedEvents) ProtoMessage() {} func (x *FailedEvents) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[16] + mi := &file_admin_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1592,7 +2311,7 @@ func (x *FailedEvents) ProtoReflect() protoreflect.Message { // Deprecated: Use FailedEvents.ProtoReflect.Descriptor instead. func (*FailedEvents) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{16} + return file_admin_proto_rawDescGZIP(), []int{25} } func (x *FailedEvents) GetFailedEvents() []*FailedEvent { @@ -1617,7 +2336,7 @@ type FailedEvent struct { func (x *FailedEvent) Reset() { *x = FailedEvent{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[17] + mi := &file_admin_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1630,7 +2349,7 @@ func (x *FailedEvent) String() string { func (*FailedEvent) ProtoMessage() {} func (x *FailedEvent) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[17] + mi := &file_admin_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1643,7 +2362,7 @@ func (x *FailedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use FailedEvent.ProtoReflect.Descriptor instead. func (*FailedEvent) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{17} + return file_admin_proto_rawDescGZIP(), []int{26} } func (x *FailedEvent) GetDatabase() string { @@ -1693,7 +2412,7 @@ type ViewID struct { func (x *ViewID) Reset() { *x = ViewID{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[18] + mi := &file_admin_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1706,7 +2425,7 @@ func (x *ViewID) String() string { func (*ViewID) ProtoMessage() {} func (x *ViewID) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[18] + mi := &file_admin_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1719,7 +2438,7 @@ func (x *ViewID) ProtoReflect() protoreflect.Message { // Deprecated: Use ViewID.ProtoReflect.Descriptor instead. func (*ViewID) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{18} + return file_admin_proto_rawDescGZIP(), []int{27} } func (x *ViewID) GetDatabase() string { @@ -1747,7 +2466,7 @@ type Views struct { func (x *Views) Reset() { *x = Views{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[19] + mi := &file_admin_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1760,7 +2479,7 @@ func (x *Views) String() string { func (*Views) ProtoMessage() {} func (x *Views) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[19] + mi := &file_admin_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1773,7 +2492,7 @@ func (x *Views) ProtoReflect() protoreflect.Message { // Deprecated: Use Views.ProtoReflect.Descriptor instead. func (*Views) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{19} + return file_admin_proto_rawDescGZIP(), []int{28} } func (x *Views) GetViews() []*View { @@ -1796,7 +2515,7 @@ type View struct { func (x *View) Reset() { *x = View{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[20] + mi := &file_admin_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1809,7 +2528,7 @@ func (x *View) String() string { func (*View) ProtoMessage() {} func (x *View) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[20] + mi := &file_admin_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1822,7 +2541,7 @@ func (x *View) ProtoReflect() protoreflect.Message { // Deprecated: Use View.ProtoReflect.Descriptor instead. func (*View) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{20} + return file_admin_proto_rawDescGZIP(), []int{29} } func (x *View) GetDatabase() string { @@ -2071,217 +2790,380 @@ var file_admin_proto_rawDesc = []byte{ 0x4d, 0x75, 0x73, 0x74, 0x42, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x27, 0x0a, 0x0e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x44, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6f, 0x72, 0x67, 0x49, 0x64, 0x22, 0x71, 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x27, 0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x5b, 0x0a, 0x0c, 0x46, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xb9, 0x01, 0x0a, 0x0b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x6f, 0x72, 0x67, 0x49, 0x64, 0x22, 0x26, 0x0a, 0x0e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xd4, 0x01, + 0x0a, 0x09, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 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, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 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, 0x0c, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x22, 0x44, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x49, 0x61, 0x6d, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x47, 0x0a, 0x16, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x61, 0x6d, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xac, 0x01, 0x0a, 0x17, 0x49, 0x61, 0x6d, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xc7, 0x02, 0x0a, 0x0d, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x5f, 0x64, 0x61, 0x74, 0x65, 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, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, + 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 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, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x91, 0x01, 0x0a, 0x16, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x49, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x14, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x49, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, + 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x71, + 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, + 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x76, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x22, 0x5b, 0x0a, 0x0c, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x4b, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xb9, + 0x01, 0x0a, 0x0b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x69, + 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, + 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x41, 0x0a, 0x06, 0x56, 0x69, + 0x65, 0x77, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, + 0x05, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x05, 0x76, 0x69, 0x65, 0x77, 0x73, 0x22, 0x5b, 0x0a, + 0x04, 0x56, 0x69, 0x65, 0x77, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, - 0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, - 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, - 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x41, 0x0a, 0x06, 0x56, 0x69, 0x65, 0x77, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x69, 0x65, 0x77, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x69, 0x65, 0x77, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x05, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x35, 0x0a, - 0x05, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x05, 0x76, - 0x69, 0x65, 0x77, 0x73, 0x22, 0x5b, 0x0a, 0x04, 0x56, 0x69, 0x65, 0x77, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x69, 0x65, 0x77, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x69, 0x65, - 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x2a, 0x50, 0x0a, 0x08, 0x4f, 0x72, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, - 0x14, 0x4f, 0x52, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x52, 0x47, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, - 0x4f, 0x52, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, - 0x45, 0x10, 0x02, 0x2a, 0x78, 0x0a, 0x0c, 0x4f, 0x72, 0x67, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, - 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, - 0x59, 0x5f, 0x4f, 0x52, 0x47, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, - 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x44, 0x4f, 0x4d, - 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, - 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x03, 0x2a, 0x6c, 0x0a, - 0x0f, 0x4f, 0x72, 0x67, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, - 0x48, 0x4f, 0x44, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, - 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, - 0x53, 0x54, 0x41, 0x52, 0x54, 0x53, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x10, 0x01, 0x12, 0x1c, 0x0a, - 0x18, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, - 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x10, 0x02, 0x2a, 0xaf, 0x01, 0x0a, 0x09, - 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x55, 0x53, 0x45, - 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x53, - 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, - 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x53, 0x45, - 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x04, 0x12, - 0x15, 0x0a, 0x11, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x55, 0x53, - 0x50, 0x45, 0x4e, 0x44, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x06, 0x2a, 0x58, 0x0a, - 0x06, 0x47, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x12, 0x47, 0x45, 0x4e, 0x44, 0x45, - 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x11, 0x0a, 0x0d, 0x47, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x4d, 0x41, 0x4c, 0x45, - 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x47, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x4c, - 0x45, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x47, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x49, - 0x56, 0x45, 0x52, 0x53, 0x45, 0x10, 0x03, 0x32, 0xa2, 0x0f, 0x0a, 0x0c, 0x41, 0x64, 0x6d, 0x69, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x7a, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 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, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x68, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x7a, 0x12, 0x47, 0x0a, 0x05, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 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, 0x0e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x4e, - 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x8f, - 0x01, 0x0a, 0x0b, 0x49, 0x73, 0x4f, 0x72, 0x67, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x12, 0x2b, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, - 0x65, 0x4f, 0x72, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4f, 0x72, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x11, 0x12, 0x0f, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x5f, 0x69, 0x73, 0x75, 0x6e, 0x69, 0x71, - 0x75, 0x65, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, - 0x12, 0x70, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x42, 0x79, 0x49, 0x44, 0x12, 0x20, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x44, - 0x1a, 0x1e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, - 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, - 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, 0x72, 0x65, - 0x61, 0x64, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, 0x72, 0x67, - 0x73, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, - 0x67, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, - 0x72, 0x65, 0x61, 0x64, 0x12, 0x8b, 0x01, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x55, 0x70, 0x4f, 0x72, - 0x67, 0x12, 0x2a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, - 0x67, 0x53, 0x65, 0x74, 0x55, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x53, 0x65, 0x74, - 0x55, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, - 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x69, 0x61, 0x6d, 0x2e, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x12, 0x9c, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, - 0x44, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, - 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x82, 0xb5, 0x18, 0x11, - 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, - 0x64, 0x12, 0xa8, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x49, - 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x18, 0x2f, 0x6f, 0x72, 0x67, 0x73, - 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xa8, 0x01, 0x0a, - 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x39, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1d, 0x1a, 0x18, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x01, - 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x90, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x29, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, - 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x44, 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, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, 0x6f, 0x72, 0x67, 0x73, - 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x11, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x62, 0x0a, 0x08, 0x47, 0x65, - 0x74, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, - 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x73, - 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x76, 0x69, 0x65, 0x77, 0x73, - 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x7c, - 0x0a, 0x09, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x21, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x49, 0x44, 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, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1d, - 0x2f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x7d, 0x2f, 0x7b, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x82, 0xb5, 0x18, - 0x0b, 0x0a, 0x09, 0x69, 0x61, 0x6d, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x77, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x2a, 0x50, 0x0a, 0x08, 0x4f, 0x72, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x4f, 0x52, 0x47, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x52, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x52, 0x47, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x2a, 0x78, 0x0a, 0x0c, + 0x4f, 0x72, 0x67, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x18, + 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x52, + 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4f, 0x52, 0x47, 0x5f, 0x4e, + 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, + 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x16, + 0x0a, 0x12, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x10, 0x03, 0x2a, 0x6c, 0x0a, 0x0f, 0x4f, 0x72, 0x67, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x52, 0x47, + 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x45, 0x51, 0x55, + 0x41, 0x4c, 0x53, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, + 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x53, 0x5f, + 0x57, 0x49, 0x54, 0x48, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, + 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, + 0x4e, 0x53, 0x10, 0x02, 0x2a, 0xaf, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, + 0x10, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x55, + 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, + 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x55, 0x53, 0x45, 0x52, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x10, 0x05, 0x12, + 0x15, 0x0a, 0x11, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x49, + 0x54, 0x49, 0x41, 0x4c, 0x10, 0x06, 0x2a, 0x58, 0x0a, 0x06, 0x47, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x12, 0x16, 0x0a, 0x12, 0x47, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x47, 0x45, 0x4e, 0x44, + 0x45, 0x52, 0x5f, 0x46, 0x45, 0x4d, 0x41, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x47, + 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, + 0x47, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x56, 0x45, 0x52, 0x53, 0x45, 0x10, 0x03, + 0x2a, 0xbb, 0x01, 0x0a, 0x12, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x1e, 0x49, 0x41, 0x4d, 0x4d, 0x45, + 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x49, + 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, + 0x59, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x20, + 0x0a, 0x1c, 0x49, 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, + 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x02, + 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, + 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x03, 0x12, 0x1e, + 0x0a, 0x1a, 0x49, 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, + 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x10, 0x04, 0x2a, 0xea, + 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, + 0x17, 0x0a, 0x13, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, + 0x45, 0x51, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x45, 0x41, 0x52, + 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x53, 0x5f, + 0x57, 0x49, 0x54, 0x48, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, + 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x10, + 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, + 0x44, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x53, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x5f, + 0x43, 0x41, 0x53, 0x45, 0x10, 0x03, 0x12, 0x28, 0x0a, 0x24, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, + 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x53, 0x5f, 0x57, 0x49, + 0x54, 0x48, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x5f, 0x43, 0x41, 0x53, 0x45, 0x10, 0x04, + 0x12, 0x25, 0x0a, 0x21, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, + 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, + 0x5f, 0x43, 0x41, 0x53, 0x45, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x41, 0x52, 0x43, + 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x45, 0x51, 0x55, 0x41, + 0x4c, 0x53, 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, + 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x41, + 0x4e, 0x10, 0x07, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, + 0x48, 0x4f, 0x44, 0x5f, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x48, 0x41, 0x4e, 0x10, 0x08, 0x12, + 0x1a, 0x0a, 0x16, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, + 0x49, 0x53, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x4f, 0x46, 0x10, 0x09, 0x12, 0x1e, 0x0a, 0x1a, 0x53, + 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4c, 0x49, 0x53, 0x54, + 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x10, 0x0a, 0x32, 0x9c, 0x15, 0x0a, 0x0c, + 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x07, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x7a, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, + 0x08, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x7a, 0x12, 0x47, 0x0a, 0x05, 0x52, 0x65, 0x61, + 0x64, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 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, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x12, 0x4e, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, + 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x49, 0x73, 0x4f, 0x72, 0x67, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4f, 0x72, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x4f, 0x72, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x5f, 0x69, 0x73, + 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x12, 0x70, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x42, 0x79, + 0x49, 0x44, 0x12, 0x20, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x72, 0x67, 0x49, 0x44, 0x1a, 0x1e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x72, 0x67, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x6f, + 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, + 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x4f, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x72, 0x67, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, + 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, + 0x69, 0x61, 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x8b, 0x01, 0x0a, 0x08, 0x53, 0x65, 0x74, + 0x55, 0x70, 0x4f, 0x72, 0x67, 0x12, 0x2a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x53, 0x65, 0x74, 0x55, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, + 0x67, 0x53, 0x65, 0x74, 0x55, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x5f, 0x73, + 0x65, 0x74, 0x75, 0x70, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x69, 0x61, 0x6d, + 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9c, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x72, + 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x49, 0x44, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x35, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x6f, + 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa8, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x18, 0x2f, + 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x61, + 0x6d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, + 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x12, 0xa8, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x49, 0x61, + 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x66, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, - 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa4, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x49, 0x44, 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, 0x4d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x2a, 0x36, 0x2f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x7d, 0x2f, - 0x7b, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x7b, 0x66, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x7d, 0x82, 0xb5, 0x18, - 0x0b, 0x0a, 0x09, 0x69, 0x61, 0x6d, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0xbe, 0x01, 0x5a, - 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x6f, 0x73, - 0x2f, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x92, 0x41, 0x8e, 0x01, 0x12, - 0x41, 0x0a, 0x0d, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x22, 0x2b, 0x12, 0x29, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x6f, 0x73, 0x2f, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x32, 0x03, 0x30, - 0x2e, 0x31, 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x1a, 0x18, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, + 0x7b, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x90, 0x01, 0x0a, 0x12, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x44, 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, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, + 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x61, + 0x6d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x11, 0x69, 0x61, 0x6d, + 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x83, + 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, + 0x0e, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x82, + 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x12, 0x8f, 0x01, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x49, 0x61, 0x6d, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, + 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x61, 0x6d, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x3a, + 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, + 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 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, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, + 0x12, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x11, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xab, 0x01, 0x0a, 0x10, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, + 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, + 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x62, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x56, + 0x69, 0x65, 0x77, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x73, 0x22, 0x1c, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x82, 0xb5, + 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x7c, 0x0a, 0x09, + 0x43, 0x6c, 0x65, 0x61, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x21, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x49, 0x44, 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, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1d, 0x2f, 0x76, + 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x7d, 0x2f, + 0x7b, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x82, 0xb5, 0x18, 0x0b, 0x0a, + 0x09, 0x69, 0x61, 0x6d, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x77, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x23, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, 0x72, + 0x65, 0x61, 0x64, 0x12, 0xa4, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x49, 0x44, 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, 0x4d, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x38, 0x2a, 0x36, 0x2f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x7d, 0x2f, 0x7b, 0x76, + 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x7b, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x7d, 0x82, 0xb5, 0x18, 0x0b, 0x0a, + 0x09, 0x69, 0x61, 0x6d, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0xbe, 0x01, 0x5a, 0x2a, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x6f, 0x73, 0x2f, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x92, 0x41, 0x8e, 0x01, 0x12, 0x41, 0x0a, + 0x0d, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2b, + 0x12, 0x29, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x6f, 0x73, 0x2f, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x32, 0x03, 0x30, 0x2e, 0x31, + 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -2296,96 +3178,125 @@ func file_admin_proto_rawDescGZIP() []byte { return file_admin_proto_rawDescData } -var file_admin_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_admin_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_admin_proto_enumTypes = make([]protoimpl.EnumInfo, 7) +var file_admin_proto_msgTypes = make([]protoimpl.MessageInfo, 30) var file_admin_proto_goTypes = []interface{}{ - (OrgState)(0), // 0: caos.zitadel.admin.api.v1.OrgState - (OrgSearchKey)(0), // 1: caos.zitadel.admin.api.v1.OrgSearchKey - (OrgSearchMethod)(0), // 2: caos.zitadel.admin.api.v1.OrgSearchMethod - (UserState)(0), // 3: caos.zitadel.admin.api.v1.UserState - (Gender)(0), // 4: caos.zitadel.admin.api.v1.Gender - (*OrgID)(nil), // 5: caos.zitadel.admin.api.v1.OrgID - (*UniqueOrgRequest)(nil), // 6: caos.zitadel.admin.api.v1.UniqueOrgRequest - (*UniqueOrgResponse)(nil), // 7: caos.zitadel.admin.api.v1.UniqueOrgResponse - (*Org)(nil), // 8: caos.zitadel.admin.api.v1.Org - (*OrgSearchRequest)(nil), // 9: caos.zitadel.admin.api.v1.OrgSearchRequest - (*OrgSearchQuery)(nil), // 10: caos.zitadel.admin.api.v1.OrgSearchQuery - (*OrgSearchResponse)(nil), // 11: caos.zitadel.admin.api.v1.OrgSearchResponse - (*OrgSetUpRequest)(nil), // 12: caos.zitadel.admin.api.v1.OrgSetUpRequest - (*OrgSetUpResponse)(nil), // 13: caos.zitadel.admin.api.v1.OrgSetUpResponse - (*CreateUserRequest)(nil), // 14: caos.zitadel.admin.api.v1.CreateUserRequest - (*User)(nil), // 15: caos.zitadel.admin.api.v1.User - (*CreateOrgRequest)(nil), // 16: caos.zitadel.admin.api.v1.CreateOrgRequest - (*OrgIamPolicy)(nil), // 17: caos.zitadel.admin.api.v1.OrgIamPolicy - (*OrgIamPolicyRequest)(nil), // 18: caos.zitadel.admin.api.v1.OrgIamPolicyRequest - (*OrgIamPolicyID)(nil), // 19: caos.zitadel.admin.api.v1.OrgIamPolicyID - (*FailedEventID)(nil), // 20: caos.zitadel.admin.api.v1.FailedEventID - (*FailedEvents)(nil), // 21: caos.zitadel.admin.api.v1.FailedEvents - (*FailedEvent)(nil), // 22: caos.zitadel.admin.api.v1.FailedEvent - (*ViewID)(nil), // 23: caos.zitadel.admin.api.v1.ViewID - (*Views)(nil), // 24: caos.zitadel.admin.api.v1.Views - (*View)(nil), // 25: caos.zitadel.admin.api.v1.View - (*timestamp.Timestamp)(nil), // 26: google.protobuf.Timestamp - (*empty.Empty)(nil), // 27: google.protobuf.Empty - (*_struct.Struct)(nil), // 28: google.protobuf.Struct + (OrgState)(0), // 0: caos.zitadel.admin.api.v1.OrgState + (OrgSearchKey)(0), // 1: caos.zitadel.admin.api.v1.OrgSearchKey + (OrgSearchMethod)(0), // 2: caos.zitadel.admin.api.v1.OrgSearchMethod + (UserState)(0), // 3: caos.zitadel.admin.api.v1.UserState + (Gender)(0), // 4: caos.zitadel.admin.api.v1.Gender + (IamMemberSearchKey)(0), // 5: caos.zitadel.admin.api.v1.IamMemberSearchKey + (SearchMethod)(0), // 6: caos.zitadel.admin.api.v1.SearchMethod + (*OrgID)(nil), // 7: caos.zitadel.admin.api.v1.OrgID + (*UniqueOrgRequest)(nil), // 8: caos.zitadel.admin.api.v1.UniqueOrgRequest + (*UniqueOrgResponse)(nil), // 9: caos.zitadel.admin.api.v1.UniqueOrgResponse + (*Org)(nil), // 10: caos.zitadel.admin.api.v1.Org + (*OrgSearchRequest)(nil), // 11: caos.zitadel.admin.api.v1.OrgSearchRequest + (*OrgSearchQuery)(nil), // 12: caos.zitadel.admin.api.v1.OrgSearchQuery + (*OrgSearchResponse)(nil), // 13: caos.zitadel.admin.api.v1.OrgSearchResponse + (*OrgSetUpRequest)(nil), // 14: caos.zitadel.admin.api.v1.OrgSetUpRequest + (*OrgSetUpResponse)(nil), // 15: caos.zitadel.admin.api.v1.OrgSetUpResponse + (*CreateUserRequest)(nil), // 16: caos.zitadel.admin.api.v1.CreateUserRequest + (*User)(nil), // 17: caos.zitadel.admin.api.v1.User + (*CreateOrgRequest)(nil), // 18: caos.zitadel.admin.api.v1.CreateOrgRequest + (*OrgIamPolicy)(nil), // 19: caos.zitadel.admin.api.v1.OrgIamPolicy + (*OrgIamPolicyRequest)(nil), // 20: caos.zitadel.admin.api.v1.OrgIamPolicyRequest + (*OrgIamPolicyID)(nil), // 21: caos.zitadel.admin.api.v1.OrgIamPolicyID + (*IamMemberRoles)(nil), // 22: caos.zitadel.admin.api.v1.IamMemberRoles + (*IamMember)(nil), // 23: caos.zitadel.admin.api.v1.IamMember + (*AddIamMemberRequest)(nil), // 24: caos.zitadel.admin.api.v1.AddIamMemberRequest + (*ChangeIamMemberRequest)(nil), // 25: caos.zitadel.admin.api.v1.ChangeIamMemberRequest + (*RemoveIamMemberRequest)(nil), // 26: caos.zitadel.admin.api.v1.RemoveIamMemberRequest + (*IamMemberSearchResponse)(nil), // 27: caos.zitadel.admin.api.v1.IamMemberSearchResponse + (*IamMemberView)(nil), // 28: caos.zitadel.admin.api.v1.IamMemberView + (*IamMemberSearchRequest)(nil), // 29: caos.zitadel.admin.api.v1.IamMemberSearchRequest + (*IamMemberSearchQuery)(nil), // 30: caos.zitadel.admin.api.v1.IamMemberSearchQuery + (*FailedEventID)(nil), // 31: caos.zitadel.admin.api.v1.FailedEventID + (*FailedEvents)(nil), // 32: caos.zitadel.admin.api.v1.FailedEvents + (*FailedEvent)(nil), // 33: caos.zitadel.admin.api.v1.FailedEvent + (*ViewID)(nil), // 34: caos.zitadel.admin.api.v1.ViewID + (*Views)(nil), // 35: caos.zitadel.admin.api.v1.Views + (*View)(nil), // 36: caos.zitadel.admin.api.v1.View + (*timestamp.Timestamp)(nil), // 37: google.protobuf.Timestamp + (*empty.Empty)(nil), // 38: google.protobuf.Empty + (*_struct.Struct)(nil), // 39: google.protobuf.Struct } var file_admin_proto_depIdxs = []int32{ 0, // 0: caos.zitadel.admin.api.v1.Org.state:type_name -> caos.zitadel.admin.api.v1.OrgState - 26, // 1: caos.zitadel.admin.api.v1.Org.creation_date:type_name -> google.protobuf.Timestamp - 26, // 2: caos.zitadel.admin.api.v1.Org.change_date:type_name -> google.protobuf.Timestamp + 37, // 1: caos.zitadel.admin.api.v1.Org.creation_date:type_name -> google.protobuf.Timestamp + 37, // 2: caos.zitadel.admin.api.v1.Org.change_date:type_name -> google.protobuf.Timestamp 1, // 3: caos.zitadel.admin.api.v1.OrgSearchRequest.sorting_column:type_name -> caos.zitadel.admin.api.v1.OrgSearchKey - 10, // 4: caos.zitadel.admin.api.v1.OrgSearchRequest.queries:type_name -> caos.zitadel.admin.api.v1.OrgSearchQuery + 12, // 4: caos.zitadel.admin.api.v1.OrgSearchRequest.queries:type_name -> caos.zitadel.admin.api.v1.OrgSearchQuery 1, // 5: caos.zitadel.admin.api.v1.OrgSearchQuery.key:type_name -> caos.zitadel.admin.api.v1.OrgSearchKey 2, // 6: caos.zitadel.admin.api.v1.OrgSearchQuery.method:type_name -> caos.zitadel.admin.api.v1.OrgSearchMethod - 8, // 7: caos.zitadel.admin.api.v1.OrgSearchResponse.result:type_name -> caos.zitadel.admin.api.v1.Org - 16, // 8: caos.zitadel.admin.api.v1.OrgSetUpRequest.org:type_name -> caos.zitadel.admin.api.v1.CreateOrgRequest - 14, // 9: caos.zitadel.admin.api.v1.OrgSetUpRequest.user:type_name -> caos.zitadel.admin.api.v1.CreateUserRequest - 8, // 10: caos.zitadel.admin.api.v1.OrgSetUpResponse.org:type_name -> caos.zitadel.admin.api.v1.Org - 15, // 11: caos.zitadel.admin.api.v1.OrgSetUpResponse.user:type_name -> caos.zitadel.admin.api.v1.User + 10, // 7: caos.zitadel.admin.api.v1.OrgSearchResponse.result:type_name -> caos.zitadel.admin.api.v1.Org + 18, // 8: caos.zitadel.admin.api.v1.OrgSetUpRequest.org:type_name -> caos.zitadel.admin.api.v1.CreateOrgRequest + 16, // 9: caos.zitadel.admin.api.v1.OrgSetUpRequest.user:type_name -> caos.zitadel.admin.api.v1.CreateUserRequest + 10, // 10: caos.zitadel.admin.api.v1.OrgSetUpResponse.org:type_name -> caos.zitadel.admin.api.v1.Org + 17, // 11: caos.zitadel.admin.api.v1.OrgSetUpResponse.user:type_name -> caos.zitadel.admin.api.v1.User 4, // 12: caos.zitadel.admin.api.v1.CreateUserRequest.gender:type_name -> caos.zitadel.admin.api.v1.Gender 3, // 13: caos.zitadel.admin.api.v1.User.state:type_name -> caos.zitadel.admin.api.v1.UserState - 26, // 14: caos.zitadel.admin.api.v1.User.creation_date:type_name -> google.protobuf.Timestamp - 26, // 15: caos.zitadel.admin.api.v1.User.change_date:type_name -> google.protobuf.Timestamp + 37, // 14: caos.zitadel.admin.api.v1.User.creation_date:type_name -> google.protobuf.Timestamp + 37, // 15: caos.zitadel.admin.api.v1.User.change_date:type_name -> google.protobuf.Timestamp 4, // 16: caos.zitadel.admin.api.v1.User.gender:type_name -> caos.zitadel.admin.api.v1.Gender - 26, // 17: caos.zitadel.admin.api.v1.OrgIamPolicy.creation_date:type_name -> google.protobuf.Timestamp - 26, // 18: caos.zitadel.admin.api.v1.OrgIamPolicy.change_date:type_name -> google.protobuf.Timestamp - 22, // 19: caos.zitadel.admin.api.v1.FailedEvents.failed_events:type_name -> caos.zitadel.admin.api.v1.FailedEvent - 25, // 20: caos.zitadel.admin.api.v1.Views.views:type_name -> caos.zitadel.admin.api.v1.View - 27, // 21: caos.zitadel.admin.api.v1.AdminService.Healthz:input_type -> google.protobuf.Empty - 27, // 22: caos.zitadel.admin.api.v1.AdminService.Ready:input_type -> google.protobuf.Empty - 27, // 23: caos.zitadel.admin.api.v1.AdminService.Validate:input_type -> google.protobuf.Empty - 6, // 24: caos.zitadel.admin.api.v1.AdminService.IsOrgUnique:input_type -> caos.zitadel.admin.api.v1.UniqueOrgRequest - 5, // 25: caos.zitadel.admin.api.v1.AdminService.GetOrgByID:input_type -> caos.zitadel.admin.api.v1.OrgID - 9, // 26: caos.zitadel.admin.api.v1.AdminService.SearchOrgs:input_type -> caos.zitadel.admin.api.v1.OrgSearchRequest - 12, // 27: caos.zitadel.admin.api.v1.AdminService.SetUpOrg:input_type -> caos.zitadel.admin.api.v1.OrgSetUpRequest - 19, // 28: caos.zitadel.admin.api.v1.AdminService.GetOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyID - 18, // 29: caos.zitadel.admin.api.v1.AdminService.CreateOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyRequest - 18, // 30: caos.zitadel.admin.api.v1.AdminService.UpdateOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyRequest - 19, // 31: caos.zitadel.admin.api.v1.AdminService.DeleteOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyID - 27, // 32: caos.zitadel.admin.api.v1.AdminService.GetViews:input_type -> google.protobuf.Empty - 23, // 33: caos.zitadel.admin.api.v1.AdminService.ClearView:input_type -> caos.zitadel.admin.api.v1.ViewID - 27, // 34: caos.zitadel.admin.api.v1.AdminService.GetFailedEvents:input_type -> google.protobuf.Empty - 20, // 35: caos.zitadel.admin.api.v1.AdminService.RemoveFailedEvent:input_type -> caos.zitadel.admin.api.v1.FailedEventID - 27, // 36: caos.zitadel.admin.api.v1.AdminService.Healthz:output_type -> google.protobuf.Empty - 27, // 37: caos.zitadel.admin.api.v1.AdminService.Ready:output_type -> google.protobuf.Empty - 28, // 38: caos.zitadel.admin.api.v1.AdminService.Validate:output_type -> google.protobuf.Struct - 7, // 39: caos.zitadel.admin.api.v1.AdminService.IsOrgUnique:output_type -> caos.zitadel.admin.api.v1.UniqueOrgResponse - 8, // 40: caos.zitadel.admin.api.v1.AdminService.GetOrgByID:output_type -> caos.zitadel.admin.api.v1.Org - 11, // 41: caos.zitadel.admin.api.v1.AdminService.SearchOrgs:output_type -> caos.zitadel.admin.api.v1.OrgSearchResponse - 13, // 42: caos.zitadel.admin.api.v1.AdminService.SetUpOrg:output_type -> caos.zitadel.admin.api.v1.OrgSetUpResponse - 17, // 43: caos.zitadel.admin.api.v1.AdminService.GetOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicy - 17, // 44: caos.zitadel.admin.api.v1.AdminService.CreateOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicy - 17, // 45: caos.zitadel.admin.api.v1.AdminService.UpdateOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicy - 27, // 46: caos.zitadel.admin.api.v1.AdminService.DeleteOrgIamPolicy:output_type -> google.protobuf.Empty - 24, // 47: caos.zitadel.admin.api.v1.AdminService.GetViews:output_type -> caos.zitadel.admin.api.v1.Views - 27, // 48: caos.zitadel.admin.api.v1.AdminService.ClearView:output_type -> google.protobuf.Empty - 21, // 49: caos.zitadel.admin.api.v1.AdminService.GetFailedEvents:output_type -> caos.zitadel.admin.api.v1.FailedEvents - 27, // 50: caos.zitadel.admin.api.v1.AdminService.RemoveFailedEvent:output_type -> google.protobuf.Empty - 36, // [36:51] is the sub-list for method output_type - 21, // [21:36] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name + 37, // 17: caos.zitadel.admin.api.v1.OrgIamPolicy.creation_date:type_name -> google.protobuf.Timestamp + 37, // 18: caos.zitadel.admin.api.v1.OrgIamPolicy.change_date:type_name -> google.protobuf.Timestamp + 37, // 19: caos.zitadel.admin.api.v1.IamMember.change_date:type_name -> google.protobuf.Timestamp + 37, // 20: caos.zitadel.admin.api.v1.IamMember.creation_date:type_name -> google.protobuf.Timestamp + 28, // 21: caos.zitadel.admin.api.v1.IamMemberSearchResponse.result:type_name -> caos.zitadel.admin.api.v1.IamMemberView + 37, // 22: caos.zitadel.admin.api.v1.IamMemberView.change_date:type_name -> google.protobuf.Timestamp + 37, // 23: caos.zitadel.admin.api.v1.IamMemberView.creation_date:type_name -> google.protobuf.Timestamp + 30, // 24: caos.zitadel.admin.api.v1.IamMemberSearchRequest.queries:type_name -> caos.zitadel.admin.api.v1.IamMemberSearchQuery + 5, // 25: caos.zitadel.admin.api.v1.IamMemberSearchQuery.key:type_name -> caos.zitadel.admin.api.v1.IamMemberSearchKey + 6, // 26: caos.zitadel.admin.api.v1.IamMemberSearchQuery.method:type_name -> caos.zitadel.admin.api.v1.SearchMethod + 33, // 27: caos.zitadel.admin.api.v1.FailedEvents.failed_events:type_name -> caos.zitadel.admin.api.v1.FailedEvent + 36, // 28: caos.zitadel.admin.api.v1.Views.views:type_name -> caos.zitadel.admin.api.v1.View + 38, // 29: caos.zitadel.admin.api.v1.AdminService.Healthz:input_type -> google.protobuf.Empty + 38, // 30: caos.zitadel.admin.api.v1.AdminService.Ready:input_type -> google.protobuf.Empty + 38, // 31: caos.zitadel.admin.api.v1.AdminService.Validate:input_type -> google.protobuf.Empty + 8, // 32: caos.zitadel.admin.api.v1.AdminService.IsOrgUnique:input_type -> caos.zitadel.admin.api.v1.UniqueOrgRequest + 7, // 33: caos.zitadel.admin.api.v1.AdminService.GetOrgByID:input_type -> caos.zitadel.admin.api.v1.OrgID + 11, // 34: caos.zitadel.admin.api.v1.AdminService.SearchOrgs:input_type -> caos.zitadel.admin.api.v1.OrgSearchRequest + 14, // 35: caos.zitadel.admin.api.v1.AdminService.SetUpOrg:input_type -> caos.zitadel.admin.api.v1.OrgSetUpRequest + 21, // 36: caos.zitadel.admin.api.v1.AdminService.GetOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyID + 20, // 37: caos.zitadel.admin.api.v1.AdminService.CreateOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyRequest + 20, // 38: caos.zitadel.admin.api.v1.AdminService.UpdateOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyRequest + 21, // 39: caos.zitadel.admin.api.v1.AdminService.DeleteOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyID + 38, // 40: caos.zitadel.admin.api.v1.AdminService.GetIamMemberRoles:input_type -> google.protobuf.Empty + 24, // 41: caos.zitadel.admin.api.v1.AdminService.AddIamMember:input_type -> caos.zitadel.admin.api.v1.AddIamMemberRequest + 25, // 42: caos.zitadel.admin.api.v1.AdminService.ChangeIamMember:input_type -> caos.zitadel.admin.api.v1.ChangeIamMemberRequest + 26, // 43: caos.zitadel.admin.api.v1.AdminService.RemoveIamMember:input_type -> caos.zitadel.admin.api.v1.RemoveIamMemberRequest + 29, // 44: caos.zitadel.admin.api.v1.AdminService.SearchIamMembers:input_type -> caos.zitadel.admin.api.v1.IamMemberSearchRequest + 38, // 45: caos.zitadel.admin.api.v1.AdminService.GetViews:input_type -> google.protobuf.Empty + 34, // 46: caos.zitadel.admin.api.v1.AdminService.ClearView:input_type -> caos.zitadel.admin.api.v1.ViewID + 38, // 47: caos.zitadel.admin.api.v1.AdminService.GetFailedEvents:input_type -> google.protobuf.Empty + 31, // 48: caos.zitadel.admin.api.v1.AdminService.RemoveFailedEvent:input_type -> caos.zitadel.admin.api.v1.FailedEventID + 38, // 49: caos.zitadel.admin.api.v1.AdminService.Healthz:output_type -> google.protobuf.Empty + 38, // 50: caos.zitadel.admin.api.v1.AdminService.Ready:output_type -> google.protobuf.Empty + 39, // 51: caos.zitadel.admin.api.v1.AdminService.Validate:output_type -> google.protobuf.Struct + 9, // 52: caos.zitadel.admin.api.v1.AdminService.IsOrgUnique:output_type -> caos.zitadel.admin.api.v1.UniqueOrgResponse + 10, // 53: caos.zitadel.admin.api.v1.AdminService.GetOrgByID:output_type -> caos.zitadel.admin.api.v1.Org + 13, // 54: caos.zitadel.admin.api.v1.AdminService.SearchOrgs:output_type -> caos.zitadel.admin.api.v1.OrgSearchResponse + 15, // 55: caos.zitadel.admin.api.v1.AdminService.SetUpOrg:output_type -> caos.zitadel.admin.api.v1.OrgSetUpResponse + 19, // 56: caos.zitadel.admin.api.v1.AdminService.GetOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicy + 19, // 57: caos.zitadel.admin.api.v1.AdminService.CreateOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicy + 19, // 58: caos.zitadel.admin.api.v1.AdminService.UpdateOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicy + 38, // 59: caos.zitadel.admin.api.v1.AdminService.DeleteOrgIamPolicy:output_type -> google.protobuf.Empty + 22, // 60: caos.zitadel.admin.api.v1.AdminService.GetIamMemberRoles:output_type -> caos.zitadel.admin.api.v1.IamMemberRoles + 23, // 61: caos.zitadel.admin.api.v1.AdminService.AddIamMember:output_type -> caos.zitadel.admin.api.v1.IamMember + 23, // 62: caos.zitadel.admin.api.v1.AdminService.ChangeIamMember:output_type -> caos.zitadel.admin.api.v1.IamMember + 38, // 63: caos.zitadel.admin.api.v1.AdminService.RemoveIamMember:output_type -> google.protobuf.Empty + 27, // 64: caos.zitadel.admin.api.v1.AdminService.SearchIamMembers:output_type -> caos.zitadel.admin.api.v1.IamMemberSearchResponse + 35, // 65: caos.zitadel.admin.api.v1.AdminService.GetViews:output_type -> caos.zitadel.admin.api.v1.Views + 38, // 66: caos.zitadel.admin.api.v1.AdminService.ClearView:output_type -> google.protobuf.Empty + 32, // 67: caos.zitadel.admin.api.v1.AdminService.GetFailedEvents:output_type -> caos.zitadel.admin.api.v1.FailedEvents + 38, // 68: caos.zitadel.admin.api.v1.AdminService.RemoveFailedEvent:output_type -> google.protobuf.Empty + 49, // [49:69] is the sub-list for method output_type + 29, // [29:49] is the sub-list for method input_type + 29, // [29:29] is the sub-list for extension type_name + 29, // [29:29] is the sub-list for extension extendee + 0, // [0:29] is the sub-list for field type_name } func init() { file_admin_proto_init() } @@ -2575,7 +3486,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FailedEventID); i { + switch v := v.(*IamMemberRoles); i { case 0: return &v.state case 1: @@ -2587,7 +3498,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FailedEvents); i { + switch v := v.(*IamMember); i { case 0: return &v.state case 1: @@ -2599,7 +3510,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FailedEvent); i { + switch v := v.(*AddIamMemberRequest); i { case 0: return &v.state case 1: @@ -2611,7 +3522,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ViewID); i { + switch v := v.(*ChangeIamMemberRequest); i { case 0: return &v.state case 1: @@ -2623,7 +3534,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Views); i { + switch v := v.(*RemoveIamMemberRequest); i { case 0: return &v.state case 1: @@ -2635,6 +3546,114 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IamMemberSearchResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IamMemberView); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IamMemberSearchRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IamMemberSearchQuery); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FailedEventID); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FailedEvents); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FailedEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ViewID); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Views); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*View); i { case 0: return &v.state @@ -2652,8 +3671,8 @@ func file_admin_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_admin_proto_rawDesc, - NumEnums: 5, - NumMessages: 21, + NumEnums: 7, + NumMessages: 30, NumExtensions: 0, NumServices: 1, }, @@ -2695,6 +3714,11 @@ type AdminServiceClient interface { CreateOrgIamPolicy(ctx context.Context, in *OrgIamPolicyRequest, opts ...grpc.CallOption) (*OrgIamPolicy, error) UpdateOrgIamPolicy(ctx context.Context, in *OrgIamPolicyRequest, opts ...grpc.CallOption) (*OrgIamPolicy, error) DeleteOrgIamPolicy(ctx context.Context, in *OrgIamPolicyID, opts ...grpc.CallOption) (*empty.Empty, error) + GetIamMemberRoles(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*IamMemberRoles, error) + AddIamMember(ctx context.Context, in *AddIamMemberRequest, opts ...grpc.CallOption) (*IamMember, error) + ChangeIamMember(ctx context.Context, in *ChangeIamMemberRequest, opts ...grpc.CallOption) (*IamMember, error) + RemoveIamMember(ctx context.Context, in *RemoveIamMemberRequest, opts ...grpc.CallOption) (*empty.Empty, error) + SearchIamMembers(ctx context.Context, in *IamMemberSearchRequest, opts ...grpc.CallOption) (*IamMemberSearchResponse, error) GetViews(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*Views, error) ClearView(ctx context.Context, in *ViewID, opts ...grpc.CallOption) (*empty.Empty, error) GetFailedEvents(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*FailedEvents, error) @@ -2808,6 +3832,51 @@ func (c *adminServiceClient) DeleteOrgIamPolicy(ctx context.Context, in *OrgIamP return out, nil } +func (c *adminServiceClient) GetIamMemberRoles(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*IamMemberRoles, error) { + out := new(IamMemberRoles) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/GetIamMemberRoles", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *adminServiceClient) AddIamMember(ctx context.Context, in *AddIamMemberRequest, opts ...grpc.CallOption) (*IamMember, error) { + out := new(IamMember) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/AddIamMember", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *adminServiceClient) ChangeIamMember(ctx context.Context, in *ChangeIamMemberRequest, opts ...grpc.CallOption) (*IamMember, error) { + out := new(IamMember) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/ChangeIamMember", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *adminServiceClient) RemoveIamMember(ctx context.Context, in *RemoveIamMemberRequest, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/RemoveIamMember", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *adminServiceClient) SearchIamMembers(ctx context.Context, in *IamMemberSearchRequest, opts ...grpc.CallOption) (*IamMemberSearchResponse, error) { + out := new(IamMemberSearchResponse) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/SearchIamMembers", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *adminServiceClient) GetViews(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*Views, error) { out := new(Views) err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/GetViews", in, out, opts...) @@ -2861,6 +3930,11 @@ type AdminServiceServer interface { CreateOrgIamPolicy(context.Context, *OrgIamPolicyRequest) (*OrgIamPolicy, error) UpdateOrgIamPolicy(context.Context, *OrgIamPolicyRequest) (*OrgIamPolicy, error) DeleteOrgIamPolicy(context.Context, *OrgIamPolicyID) (*empty.Empty, error) + GetIamMemberRoles(context.Context, *empty.Empty) (*IamMemberRoles, error) + AddIamMember(context.Context, *AddIamMemberRequest) (*IamMember, error) + ChangeIamMember(context.Context, *ChangeIamMemberRequest) (*IamMember, error) + RemoveIamMember(context.Context, *RemoveIamMemberRequest) (*empty.Empty, error) + SearchIamMembers(context.Context, *IamMemberSearchRequest) (*IamMemberSearchResponse, error) GetViews(context.Context, *empty.Empty) (*Views, error) ClearView(context.Context, *ViewID) (*empty.Empty, error) GetFailedEvents(context.Context, *empty.Empty) (*FailedEvents, error) @@ -2904,6 +3978,21 @@ func (*UnimplementedAdminServiceServer) UpdateOrgIamPolicy(context.Context, *Org func (*UnimplementedAdminServiceServer) DeleteOrgIamPolicy(context.Context, *OrgIamPolicyID) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteOrgIamPolicy not implemented") } +func (*UnimplementedAdminServiceServer) GetIamMemberRoles(context.Context, *empty.Empty) (*IamMemberRoles, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetIamMemberRoles not implemented") +} +func (*UnimplementedAdminServiceServer) AddIamMember(context.Context, *AddIamMemberRequest) (*IamMember, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddIamMember not implemented") +} +func (*UnimplementedAdminServiceServer) ChangeIamMember(context.Context, *ChangeIamMemberRequest) (*IamMember, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChangeIamMember not implemented") +} +func (*UnimplementedAdminServiceServer) RemoveIamMember(context.Context, *RemoveIamMemberRequest) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveIamMember not implemented") +} +func (*UnimplementedAdminServiceServer) SearchIamMembers(context.Context, *IamMemberSearchRequest) (*IamMemberSearchResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SearchIamMembers not implemented") +} func (*UnimplementedAdminServiceServer) GetViews(context.Context, *empty.Empty) (*Views, error) { return nil, status.Errorf(codes.Unimplemented, "method GetViews not implemented") } @@ -3119,6 +4208,96 @@ func _AdminService_DeleteOrgIamPolicy_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } +func _AdminService_GetIamMemberRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).GetIamMemberRoles(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/GetIamMemberRoles", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).GetIamMemberRoles(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _AdminService_AddIamMember_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddIamMemberRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).AddIamMember(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/AddIamMember", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).AddIamMember(ctx, req.(*AddIamMemberRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AdminService_ChangeIamMember_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ChangeIamMemberRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).ChangeIamMember(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/ChangeIamMember", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).ChangeIamMember(ctx, req.(*ChangeIamMemberRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AdminService_RemoveIamMember_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RemoveIamMemberRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).RemoveIamMember(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/RemoveIamMember", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).RemoveIamMember(ctx, req.(*RemoveIamMemberRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AdminService_SearchIamMembers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(IamMemberSearchRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).SearchIamMembers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/SearchIamMembers", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).SearchIamMembers(ctx, req.(*IamMemberSearchRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _AdminService_GetViews_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(empty.Empty) if err := dec(in); err != nil { @@ -3239,6 +4418,26 @@ var _AdminService_serviceDesc = grpc.ServiceDesc{ MethodName: "DeleteOrgIamPolicy", Handler: _AdminService_DeleteOrgIamPolicy_Handler, }, + { + MethodName: "GetIamMemberRoles", + Handler: _AdminService_GetIamMemberRoles_Handler, + }, + { + MethodName: "AddIamMember", + Handler: _AdminService_AddIamMember_Handler, + }, + { + MethodName: "ChangeIamMember", + Handler: _AdminService_ChangeIamMember_Handler, + }, + { + MethodName: "RemoveIamMember", + Handler: _AdminService_RemoveIamMember_Handler, + }, + { + MethodName: "SearchIamMembers", + Handler: _AdminService_SearchIamMembers_Handler, + }, { MethodName: "GetViews", Handler: _AdminService_GetViews_Handler, diff --git a/pkg/admin/api/grpc/admin.pb.gw.go b/pkg/admin/api/grpc/admin.pb.gw.go index 5f73b8f4a..fdb469e32 100644 --- a/pkg/admin/api/grpc/admin.pb.gw.go +++ b/pkg/admin/api/grpc/admin.pb.gw.go @@ -258,6 +258,111 @@ func request_AdminService_DeleteOrgIamPolicy_0(ctx context.Context, marshaler ru } +func request_AdminService_GetIamMemberRoles_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetIamMemberRoles(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_AdminService_AddIamMember_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddIamMemberRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.AddIamMember(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_AdminService_ChangeIamMember_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChangeIamMemberRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["user_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") + } + + protoReq.UserId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) + } + + msg, err := client.ChangeIamMember(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_AdminService_RemoveIamMember_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RemoveIamMemberRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["user_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") + } + + protoReq.UserId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) + } + + msg, err := client.RemoveIamMember(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_AdminService_SearchIamMembers_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IamMemberSearchRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SearchIamMembers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + func request_AdminService_GetViews_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq empty.Empty var metadata runtime.ServerMetadata @@ -621,6 +726,106 @@ func RegisterAdminServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu }) + mux.Handle("GET", pattern_AdminService_GetIamMemberRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_GetIamMemberRoles_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetIamMemberRoles_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AdminService_AddIamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_AddIamMember_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_AddIamMember_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_ChangeIamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_ChangeIamMember_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_ChangeIamMember_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_AdminService_RemoveIamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_RemoveIamMember_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_RemoveIamMember_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AdminService_SearchIamMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_SearchIamMembers_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_SearchIamMembers_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_AdminService_GetViews_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -727,6 +932,16 @@ var ( pattern_AdminService_DeleteOrgIamPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"orgs", "org_id", "iampolicy"}, "")) + pattern_AdminService_GetIamMemberRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"members", "roles"}, "")) + + pattern_AdminService_AddIamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"members"}, "")) + + pattern_AdminService_ChangeIamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"members", "user_id"}, "")) + + pattern_AdminService_RemoveIamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"members", "user_id"}, "")) + + pattern_AdminService_SearchIamMembers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"members", "_search"}, "")) + pattern_AdminService_GetViews_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"views"}, "")) pattern_AdminService_ClearView_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 1, 0, 4, 1, 5, 2}, []string{"views", "database", "view_name"}, "")) @@ -759,6 +974,16 @@ var ( forward_AdminService_DeleteOrgIamPolicy_0 = runtime.ForwardResponseMessage + forward_AdminService_GetIamMemberRoles_0 = runtime.ForwardResponseMessage + + forward_AdminService_AddIamMember_0 = runtime.ForwardResponseMessage + + forward_AdminService_ChangeIamMember_0 = runtime.ForwardResponseMessage + + forward_AdminService_RemoveIamMember_0 = runtime.ForwardResponseMessage + + forward_AdminService_SearchIamMembers_0 = runtime.ForwardResponseMessage + forward_AdminService_GetViews_0 = runtime.ForwardResponseMessage forward_AdminService_ClearView_0 = runtime.ForwardResponseMessage diff --git a/pkg/admin/api/grpc/admin.swagger.json b/pkg/admin/api/grpc/admin.swagger.json index 373756a52..44259e106 100644 --- a/pkg/admin/api/grpc/admin.swagger.json +++ b/pkg/admin/api/grpc/admin.swagger.json @@ -89,6 +89,128 @@ ] } }, + "/members": { + "post": { + "operationId": "AddIamMember", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1IamMember" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1AddIamMemberRequest" + } + } + ], + "tags": [ + "AdminService" + ] + } + }, + "/members/_search": { + "post": { + "operationId": "SearchIamMembers", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1IamMemberSearchResponse" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1IamMemberSearchRequest" + } + } + ], + "tags": [ + "AdminService" + ] + } + }, + "/members/roles": { + "get": { + "operationId": "GetIamMemberRoles", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1IamMemberRoles" + } + } + }, + "tags": [ + "AdminService" + ] + } + }, + "/members/{user_id}": { + "delete": { + "operationId": "RemoveIamMember", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + } + }, + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "AdminService" + ] + }, + "put": { + "operationId": "ChangeIamMember", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1IamMember" + } + } + }, + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1ChangeIamMemberRequest" + } + } + ], + "tags": [ + "AdminService" + ] + } + }, "/orgs/_isunique": { "get": { "summary": "ORG", @@ -450,6 +572,34 @@ }, "description": "`Value` represents a dynamically typed value which can be either\nnull, a number, a string, a boolean, a recursive struct value, or a\nlist of values. A producer of value is expected to set one of that\nvariants, absence of any variant indicates an error.\n\nThe JSON representation for `Value` is JSON value." }, + "v1AddIamMemberRequest": { + "type": "object", + "properties": { + "user_id": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "v1ChangeIamMemberRequest": { + "type": "object", + "properties": { + "user_id": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, "v1CreateOrgRequest": { "type": "object", "properties": { @@ -559,6 +709,148 @@ ], "default": "GENDER_UNSPECIFIED" }, + "v1IamMember": { + "type": "object", + "properties": { + "user_id": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + }, + "change_date": { + "type": "string", + "format": "date-time" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "sequence": { + "type": "string", + "format": "uint64" + } + } + }, + "v1IamMemberRoles": { + "type": "object", + "properties": { + "roles": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "v1IamMemberSearchKey": { + "type": "string", + "enum": [ + "IAMMEMBERSEARCHKEY_UNSPECIFIED", + "IAMMEMBERSEARCHKEY_FIRST_NAME", + "IAMMEMBERSEARCHKEY_LAST_NAME", + "IAMMEMBERSEARCHKEY_EMAIL", + "IAMMEMBERSEARCHKEY_USER_ID" + ], + "default": "IAMMEMBERSEARCHKEY_UNSPECIFIED" + }, + "v1IamMemberSearchQuery": { + "type": "object", + "properties": { + "key": { + "$ref": "#/definitions/v1IamMemberSearchKey" + }, + "method": { + "$ref": "#/definitions/v1SearchMethod" + }, + "value": { + "type": "string" + } + } + }, + "v1IamMemberSearchRequest": { + "type": "object", + "properties": { + "offset": { + "type": "string", + "format": "uint64" + }, + "limit": { + "type": "string", + "format": "uint64" + }, + "queries": { + "type": "array", + "items": { + "$ref": "#/definitions/v1IamMemberSearchQuery" + } + } + } + }, + "v1IamMemberSearchResponse": { + "type": "object", + "properties": { + "offset": { + "type": "string", + "format": "uint64" + }, + "limit": { + "type": "string", + "format": "uint64" + }, + "total_result": { + "type": "string", + "format": "uint64" + }, + "result": { + "type": "array", + "items": { + "$ref": "#/definitions/v1IamMemberView" + } + } + } + }, + "v1IamMemberView": { + "type": "object", + "properties": { + "user_id": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + }, + "change_date": { + "type": "string", + "format": "date-time" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "sequence": { + "type": "string", + "format": "uint64" + }, + "user_name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "first_name": { + "type": "string" + }, + "last_name": { + "type": "string" + } + } + }, "v1Org": { "type": "object", "properties": { @@ -743,6 +1035,23 @@ ], "default": "ORGSTATE_UNSPECIFIED" }, + "v1SearchMethod": { + "type": "string", + "enum": [ + "SEARCHMETHOD_EQUALS", + "SEARCHMETHOD_STARTS_WITH", + "SEARCHMETHOD_CONTAINS", + "SEARCHMETHOD_EQUALS_IGNORE_CASE", + "SEARCHMETHOD_STARTS_WITH_IGNORE_CASE", + "SEARCHMETHOD_CONTAINS_IGNORE_CASE", + "SEARCHMETHOD_NOT_EQUALS", + "SEARCHMETHOD_GREATER_THAN", + "SEARCHMETHOD_LESS_THAN", + "SEARCHMETHOD_IS_ONE_OF", + "SEARCHMETHOD_LIST_CONTAINS" + ], + "default": "SEARCHMETHOD_EQUALS" + }, "v1UniqueOrgResponse": { "type": "object", "properties": { diff --git a/pkg/admin/api/grpc/iam_member.go b/pkg/admin/api/grpc/iam_member.go new file mode 100644 index 000000000..296cb1e48 --- /dev/null +++ b/pkg/admin/api/grpc/iam_member.go @@ -0,0 +1,41 @@ +package grpc + +import ( + "context" + + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *Server) GetIamMemberRoles(ctx context.Context, _ *empty.Empty) (*IamMemberRoles, error) { + return &IamMemberRoles{Roles: s.iam.GetIamMemberRoles()}, nil +} + +func (s *Server) SearchIamMembers(ctx context.Context, in *IamMemberSearchRequest) (*IamMemberSearchResponse, error) { + members, err := s.iam.SearchIamMembers(ctx, iamMemberSearchRequestToModel(in)) + if err != nil { + return nil, err + } + return iamMemberSearchResponseFromModel(members), nil +} + +func (s *Server) AddIamMember(ctx context.Context, member *AddIamMemberRequest) (*IamMember, error) { + addedMember, err := s.iam.AddIamMember(ctx, addIamMemberToModel(member)) + if err != nil { + return nil, err + } + + return iamMemberFromModel(addedMember), nil +} + +func (s *Server) ChangeIamMember(ctx context.Context, member *ChangeIamMemberRequest) (*IamMember, error) { + changedMember, err := s.iam.ChangeIamMember(ctx, changeIamMemberToModel(member)) + if err != nil { + return nil, err + } + return iamMemberFromModel(changedMember), nil +} + +func (s *Server) RemoveIamMember(ctx context.Context, member *RemoveIamMemberRequest) (*empty.Empty, error) { + err := s.iam.RemoveIamMember(ctx, member.UserId) + return &empty.Empty{}, err +} diff --git a/pkg/admin/api/grpc/iam_member_converter.go b/pkg/admin/api/grpc/iam_member_converter.go new file mode 100644 index 000000000..205af49cf --- /dev/null +++ b/pkg/admin/api/grpc/iam_member_converter.go @@ -0,0 +1,138 @@ +package grpc + +import ( + "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/internal/model" + "github.com/golang/protobuf/ptypes" +) + +func addIamMemberToModel(member *AddIamMemberRequest) *iam_model.IamMember { + memberModel := &iam_model.IamMember{ + UserID: member.UserId, + } + memberModel.Roles = member.Roles + + return memberModel +} + +func changeIamMemberToModel(member *ChangeIamMemberRequest) *iam_model.IamMember { + memberModel := &iam_model.IamMember{ + UserID: member.UserId, + } + memberModel.Roles = member.Roles + + return memberModel +} + +func iamMemberFromModel(member *iam_model.IamMember) *IamMember { + creationDate, err := ptypes.TimestampProto(member.CreationDate) + logging.Log("GRPC-Lsp76").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(member.ChangeDate) + logging.Log("GRPC-3fG5s").OnError(err).Debug("date parse failed") + + return &IamMember{ + UserId: member.UserID, + CreationDate: creationDate, + ChangeDate: changeDate, + Roles: member.Roles, + Sequence: member.Sequence, + } +} + +func iamMemberSearchRequestToModel(request *IamMemberSearchRequest) *iam_model.IamMemberSearchRequest { + return &iam_model.IamMemberSearchRequest{ + Limit: request.Limit, + Offset: request.Offset, + Queries: iamMemberSearchQueriesToModel(request.Queries), + } +} + +func iamMemberSearchQueriesToModel(queries []*IamMemberSearchQuery) []*iam_model.IamMemberSearchQuery { + modelQueries := make([]*iam_model.IamMemberSearchQuery, len(queries)) + for i, query := range queries { + modelQueries[i] = iamMemberSearchQueryToModel(query) + } + + return modelQueries +} + +func iamMemberSearchQueryToModel(query *IamMemberSearchQuery) *iam_model.IamMemberSearchQuery { + return &iam_model.IamMemberSearchQuery{ + Key: iamMemberSearchKeyToModel(query.Key), + Method: iamMemberSearchMethodToModel(query.Method), + Value: query.Value, + } +} + +func iamMemberSearchKeyToModel(key IamMemberSearchKey) iam_model.IamMemberSearchKey { + switch key { + case IamMemberSearchKey_IAMMEMBERSEARCHKEY_EMAIL: + return iam_model.IamMemberSearchKeyEmail + case IamMemberSearchKey_IAMMEMBERSEARCHKEY_FIRST_NAME: + return iam_model.IamMemberSearchKeyFirstName + case IamMemberSearchKey_IAMMEMBERSEARCHKEY_LAST_NAME: + return iam_model.IamMemberSearchKeyLastName + case IamMemberSearchKey_IAMMEMBERSEARCHKEY_USER_ID: + return iam_model.IamMemberSearchKeyUserID + default: + return iam_model.IamMemberSearchKeyUnspecified + } +} + +func iamMemberSearchMethodToModel(key SearchMethod) model.SearchMethod { + switch key { + case SearchMethod_SEARCHMETHOD_CONTAINS: + return model.SearchMethodContains + case SearchMethod_SEARCHMETHOD_CONTAINS_IGNORE_CASE: + return model.SearchMethodContainsIgnoreCase + case SearchMethod_SEARCHMETHOD_EQUALS: + return model.SearchMethodEquals + case SearchMethod_SEARCHMETHOD_EQUALS_IGNORE_CASE: + return model.SearchMethodEqualsIgnoreCase + case SearchMethod_SEARCHMETHOD_STARTS_WITH: + return model.SearchMethodStartsWith + case SearchMethod_SEARCHMETHOD_STARTS_WITH_IGNORE_CASE: + return model.SearchMethodStartsWithIgnoreCase + default: + return -1 + } +} + +func iamMemberSearchResponseFromModel(resp *iam_model.IamMemberSearchResponse) *IamMemberSearchResponse { + return &IamMemberSearchResponse{ + Limit: resp.Limit, + Offset: resp.Offset, + TotalResult: resp.TotalResult, + Result: iamMembersFromView(resp.Result), + } +} +func iamMembersFromView(viewMembers []*iam_model.IamMemberView) []*IamMemberView { + members := make([]*IamMemberView, len(viewMembers)) + + for i, member := range viewMembers { + members[i] = iamMemberFromView(member) + } + + return members +} + +func iamMemberFromView(member *iam_model.IamMemberView) *IamMemberView { + changeDate, err := ptypes.TimestampProto(member.ChangeDate) + logging.Log("GRPC-Lso9c").OnError(err).Debug("unable to parse changedate") + creationDate, err := ptypes.TimestampProto(member.CreationDate) + logging.Log("GRPC-6szE").OnError(err).Debug("unable to parse creation date") + + return &IamMemberView{ + ChangeDate: changeDate, + CreationDate: creationDate, + Roles: member.Roles, + Sequence: member.Sequence, + UserId: member.UserID, + UserName: member.UserName, + Email: member.Email, + FirstName: member.FirstName, + LastName: member.LastName, + } +} diff --git a/pkg/admin/api/grpc/server.go b/pkg/admin/api/grpc/server.go index 702d10ee3..26873a52b 100644 --- a/pkg/admin/api/grpc/server.go +++ b/pkg/admin/api/grpc/server.go @@ -15,22 +15,24 @@ import ( var _ AdminServiceServer = (*Server)(nil) type Server struct { - port string - org repository.OrgRepository + port string + org repository.OrgRepository + iam repository.IamRepository administrator repository.AdministratorRepository - verifier auth.TokenVerifier - authZ auth.Config - repo repository.Repository + verifier auth.TokenVerifier + authZ auth.Config + repo repository.Repository } func StartServer(conf grpc_util.ServerConfig, authZRepo *authz_repo.EsRepository, authZ auth.Config, repo repository.Repository) *Server { return &Server{ - port: conf.Port, - org: repo, + port: conf.Port, + org: repo, + iam: repo, administrator: repo, - repo: repo, - authZ: authZ, - verifier: admin_auth.Start(authZRepo), + repo: repo, + authZ: authZ, + verifier: admin_auth.Start(authZRepo), } } diff --git a/pkg/admin/api/proto/admin.proto b/pkg/admin/api/proto/admin.proto index a3b128e1a..35f6c3c1c 100644 --- a/pkg/admin/api/proto/admin.proto +++ b/pkg/admin/api/proto/admin.proto @@ -142,6 +142,59 @@ service AdminService { }; } + rpc GetIamMemberRoles(google.protobuf.Empty) returns (IamMemberRoles) { + option (google.api.http) = { + get: "/members/roles" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.member.read" + }; + } + + rpc AddIamMember(AddIamMemberRequest) returns (IamMember) { + option (google.api.http) = { + post: "/members" + body: "*" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.member.write" + }; + } + + rpc ChangeIamMember(ChangeIamMemberRequest) returns (IamMember) { + option (google.api.http) = { + put: "/members/{user_id}" + body: "*" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.member.write" + }; + } + + rpc RemoveIamMember(RemoveIamMemberRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete: "/members/{user_id}" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.member.delete" + }; + } + + rpc SearchIamMembers(IamMemberSearchRequest) returns (IamMemberSearchResponse) { + option (google.api.http) = { + post: "/members/_search" + body: "*" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.member.read" + }; + } + rpc GetViews(google.protobuf.Empty) returns (Views) { option (google.api.http) = { get: "/views" @@ -340,6 +393,85 @@ message OrgIamPolicyID { string org_id = 1; } +message IamMemberRoles { + repeated string roles = 1; +} + +message IamMember { + string user_id = 1; + repeated string roles = 2; + google.protobuf.Timestamp change_date = 3; + google.protobuf.Timestamp creation_date = 4; + uint64 sequence = 5; +} + +message AddIamMemberRequest { + string user_id = 1; + repeated string roles = 2; +} + +message ChangeIamMemberRequest { + string user_id = 1; + repeated string roles = 2; +} + +message RemoveIamMemberRequest { + string user_id = 1; +} + +message IamMemberSearchResponse { + uint64 offset = 1; + uint64 limit = 2; + uint64 total_result = 3; + repeated IamMemberView result = 4; +} + +message IamMemberView { + string user_id = 1; + repeated string roles = 2; + google.protobuf.Timestamp change_date = 3; + google.protobuf.Timestamp creation_date = 4; + uint64 sequence = 5; + string user_name = 6; + string email = 7; + string first_name = 8; + string last_name = 9; +} + +message IamMemberSearchRequest { + uint64 offset = 1; + uint64 limit = 2; + repeated IamMemberSearchQuery queries = 3; +} + +message IamMemberSearchQuery { + IamMemberSearchKey key = 1 [(validate.rules).enum = {not_in: [0]}]; + SearchMethod method = 2; + string value = 3; +} + +enum IamMemberSearchKey { + IAMMEMBERSEARCHKEY_UNSPECIFIED = 0; + IAMMEMBERSEARCHKEY_FIRST_NAME = 1; + IAMMEMBERSEARCHKEY_LAST_NAME = 2; + IAMMEMBERSEARCHKEY_EMAIL = 3; + IAMMEMBERSEARCHKEY_USER_ID = 4; +} + +enum SearchMethod { + SEARCHMETHOD_EQUALS = 0; + SEARCHMETHOD_STARTS_WITH = 1; + SEARCHMETHOD_CONTAINS = 2; + SEARCHMETHOD_EQUALS_IGNORE_CASE = 3; + SEARCHMETHOD_STARTS_WITH_IGNORE_CASE = 4; + SEARCHMETHOD_CONTAINS_IGNORE_CASE = 5; + SEARCHMETHOD_NOT_EQUALS = 6; + SEARCHMETHOD_GREATER_THAN = 7; + SEARCHMETHOD_LESS_THAN = 8; + SEARCHMETHOD_IS_ONE_OF = 9; + SEARCHMETHOD_LIST_CONTAINS = 10; +} + message FailedEventID { string database = 1; string view_name = 2;